sungroup преди 1 година
ревизия
24b46353e5
променени са 100 файла, в които са добавени 25023 реда и са изтрити 0 реда
  1. 146 0
      .gitignore
  2. 12 0
      LuckyCallWebCore/LuckyCallWebCore/.config/dotnet-tools.json
  3. 17 0
      LuckyCallWebCore/LuckyCallWebCore/Connected Services/ServiceAPI/ConnectedService.json
  4. 3485 0
      LuckyCallWebCore/LuckyCallWebCore/Connected Services/ServiceAPI/Reference.cs
  5. 743 0
      LuckyCallWebCore/LuckyCallWebCore/Controllers/BaseController.cs
  6. 685 0
      LuckyCallWebCore/LuckyCallWebCore/Controllers/HomeController.cs
  7. 24 0
      LuckyCallWebCore/LuckyCallWebCore/Controllers/LanguageController.cs
  8. 439 0
      LuckyCallWebCore/LuckyCallWebCore/Controllers/SubscriberController.cs
  9. 31 0
      LuckyCallWebCore/LuckyCallWebCore/Extensions/ConfigAction.cs
  10. 29 0
      LuckyCallWebCore/LuckyCallWebCore/Extensions/RewriteSubdomainRule.cs
  11. 28 0
      LuckyCallWebCore/LuckyCallWebCore/Extensions/SessionExtensions.cs
  12. 11 0
      LuckyCallWebCore/LuckyCallWebCore/Models/ErrorViewModel.cs
  13. 18 0
      LuckyCallWebCore/LuckyCallWebCore/Models/JwtData.cs
  14. 21 0
      LuckyCallWebCore/LuckyCallWebCore/Models/LuckyWheelModel.cs
  15. 65 0
      LuckyCallWebCore/LuckyCallWebCore/Models/MyIdData.cs
  16. 12 0
      LuckyCallWebCore/LuckyCallWebCore/Models/PrizeObj.cs
  17. 14 0
      LuckyCallWebCore/LuckyCallWebCore/Models/RequestOtp.cs
  18. 74 0
      LuckyCallWebCore/LuckyCallWebCore/Nat_LuckyCall.csproj
  19. 56 0
      LuckyCallWebCore/LuckyCallWebCore/Program.cs
  20. 21 0
      LuckyCallWebCore/LuckyCallWebCore/Properties/PublishProfiles/FolderProfile.pubxml
  21. 22 0
      LuckyCallWebCore/LuckyCallWebCore/Properties/PublishProfiles/FolderProfile1.pubxml
  22. 21 0
      LuckyCallWebCore/LuckyCallWebCore/Properties/PublishProfiles/FolderProfile2.pubxml
  23. 29 0
      LuckyCallWebCore/LuckyCallWebCore/Properties/launchSettings.json
  24. 756 0
      LuckyCallWebCore/LuckyCallWebCore/Resources/Lang.Designer.cs
  25. 351 0
      LuckyCallWebCore/LuckyCallWebCore/Resources/Lang.fr.resx
  26. 351 0
      LuckyCallWebCore/LuckyCallWebCore/Resources/Lang.resx
  27. 42 0
      LuckyCallWebCore/LuckyCallWebCore/Source/ChatWebSocketClient.cs
  28. 42 0
      LuckyCallWebCore/LuckyCallWebCore/Source/LuckyCallUtils.cs
  29. 23 0
      LuckyCallWebCore/LuckyCallWebCore/Source/MochaApi.cs
  30. 58 0
      LuckyCallWebCore/LuckyCallWebCore/Source/MyIdData.cs
  31. 29 0
      LuckyCallWebCore/LuckyCallWebCore/Source/SessionObj.cs
  32. 30 0
      LuckyCallWebCore/LuckyCallWebCore/Source/UserInfo.cs
  33. 44 0
      LuckyCallWebCore/LuckyCallWebCore/Source/WebSocketLogger.cs
  34. 62 0
      LuckyCallWebCore/LuckyCallWebCore/Source/productInfo.cs
  35. 261 0
      LuckyCallWebCore/LuckyCallWebCore/Startup.cs
  36. 17 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Home/Error.cshtml
  37. 105 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Home/Guide_1.cshtml
  38. 101 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Home/Guide_2.cshtml
  39. 841 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Home/Index.cshtml
  40. 153 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Home/Login.cshtml
  41. 14 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Home/NotSupport.cshtml
  42. 151 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Home/UserPrize.cshtml
  43. 107 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Home/WinnerList.cshtml
  44. 28 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_Footer.cshtml
  45. 89 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_Setting-Dell-Vostro.cshtml
  46. 89 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_Setting.cshtml
  47. 71 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_TopCoin.cshtml
  48. 75 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_Winner.cshtml
  49. 717 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Shared/_Layout.cshtml
  50. 2 0
      LuckyCallWebCore/LuckyCallWebCore/Views/Shared/_ValidationScriptsPartial.cshtml
  51. 11 0
      LuckyCallWebCore/LuckyCallWebCore/Views/_ViewImports.cshtml
  52. 3 0
      LuckyCallWebCore/LuckyCallWebCore/Views/_ViewStart.cshtml
  53. 1 0
      LuckyCallWebCore/LuckyCallWebCore/ads.txt
  54. 9 0
      LuckyCallWebCore/LuckyCallWebCore/appsettings.Development.json
  55. 44 0
      LuckyCallWebCore/LuckyCallWebCore/appsettings.json
  56. BIN
      LuckyCallWebCore/LuckyCallWebCore/lib/WebSockets.dll
  57. 22 0
      LuckyCallWebCore/LuckyCallWebCore/log4net.config
  58. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/audio/background.mpeg
  59. 9273 0
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/bootstrap.min.css
  60. 74 0
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/custom.css
  61. 3044 0
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/font-awesome.min.css
  62. 26 0
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/spin.css
  63. 1904 0
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/styles.css
  64. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/favicon.ico
  65. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat1.png
  66. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat2.png
  67. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat3.png
  68. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat4.png
  69. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat5.png
  70. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat6.png
  71. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/adv.jpeg
  72. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/background.png
  73. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg-footer-guide.png
  74. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg-footer-my-gift.png
  75. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg_cat.png
  76. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg_cat2.png
  77. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg_rank.png
  78. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin.png
  79. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_1.png
  80. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_2.png
  81. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_3.png
  82. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_4.png
  83. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_5.png
  84. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_6.png
  85. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_7.png
  86. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_8.png
  87. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_9.png
  88. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/coin_rank.png
  89. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/Cat_one.png
  90. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/Cat_two.png
  91. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/bg-cirAni.png
  92. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/bg_cir_2.png
  93. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/bg_event.png
  94. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/cat.png
  95. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/cat_1.png
  96. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/cirAni.png
  97. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/cirAni_2.png
  98. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/id.bk.png
  99. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/id.png
  100. BIN
      LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/iphone.bk1.png

+ 146 - 0
.gitignore

@@ -0,0 +1,146 @@
+*.swp
+*.*~
+project.lock.json
+.DS_Store
+*.pyc
+nupkg/
+
+# Visual Studio Code
+.vscode/
+
+# Rider
+.idea/
+
+# Visual Studio
+.vs/
+
+# Fleet
+.fleet/
+
+# Code Rush
+.cr/
+
+# User-specific files
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+build/
+bld/
+[Bb]in/
+[Oo]bj/
+[Oo]ut/
+msbuild.log
+msbuild.err
+msbuild.wrn
+
+
+##############################
+## Java
+##############################
+.mtj.tmp/
+*.class
+#*.jar
+*.war
+*.ear
+*.nar
+hs_err_pid*
+replay_pid*
+
+##############################
+## Maven
+##############################
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+pom.xml.bak
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+.mvn/wrapper/maven-wrapper.jar
+
+##############################
+## Gradle
+##############################
+bin/
+build/
+.gradle
+.gradletasknamecache
+gradle-app.setting
+!gradle-wrapper.jar
+
+##############################
+## IntelliJ
+##############################
+out/
+.idea/
+.idea_modules/
+*.iml
+*.ipr
+*.iws
+
+##############################
+## Eclipse
+##############################
+.settings/
+bin/
+tmp/
+.metadata
+.classpath
+.project
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.loadpath
+.factorypath
+
+##############################
+## NetBeans
+##############################
+nbproject/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+nb-configuration.xml
+build.xml
+manifest.mf
+
+##############################
+## Visual Studio Code
+##############################
+.vscode/
+.code-workspace
+
+##############################
+## OS X
+##############################
+.DS_Store
+
+##############################
+## Miscellaneous
+##############################
+*.log
+
+**/nbproject/private/
+**/nbproject/Makefile-*.mk
+**/nbproject/Package-*.bash
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/

+ 12 - 0
LuckyCallWebCore/LuckyCallWebCore/.config/dotnet-tools.json

@@ -0,0 +1,12 @@
+{
+  "version": 1,
+  "isRoot": true,
+  "tools": {
+    "dotnet-ef": {
+      "version": "5.0.10",
+      "commands": [
+        "dotnet-ef"
+      ]
+    }
+  }
+}

+ 17 - 0
LuckyCallWebCore/LuckyCallWebCore/Connected Services/ServiceAPI/ConnectedService.json

@@ -0,0 +1,17 @@
+{
+  "ExtendedData": {
+    "inputs": [
+      "http://127.0.0.1:8088/WsLuckyCall?wsdl"
+    ],
+    "collectionTypes": [
+      "System.Array",
+      "System.Collections.Generic.Dictionary`2"
+    ],
+    "namespaceMappings": [
+      "*, ServiceAPI"
+    ],
+    "sync": true,
+    "targetFramework": "net5.0",
+    "typeReuseMode": "All"
+  }
+}

+ 3485 - 0
LuckyCallWebCore/LuckyCallWebCore/Connected Services/ServiceAPI/Reference.cs

@@ -0,0 +1,3485 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace ServiceAPI
+{
+    
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://webservices.vas.com/", ConfigurationName="ServiceAPI.WsLuckyCall")]
+    public interface WsLuckyCall
+    {
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsLoadPackageResponse wsLoadPackage(ServiceAPI.wsLoadPackageRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsLoadPackageResponse> wsLoadPackageAsync(ServiceAPI.wsLoadPackageRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsLoginResponse wsLogin(ServiceAPI.wsLoginRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsLoginResponse> wsLoginAsync(ServiceAPI.wsLoginRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsGetSubInfoResponse wsGetSubInfo(ServiceAPI.wsGetSubInfoRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetSubInfoResponse> wsGetSubInfoAsync(ServiceAPI.wsGetSubInfoRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsRegisterSubOtpResponse wsRegisterSubOtp(ServiceAPI.wsRegisterSubOtpRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsRegisterSubOtpResponse> wsRegisterSubOtpAsync(ServiceAPI.wsRegisterSubOtpRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsResetPasswordResponse wsResetPassword(ServiceAPI.wsResetPasswordRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsResetPasswordResponse> wsResetPasswordAsync(ServiceAPI.wsResetPasswordRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsGetListWinnerResponse wsGetListWinner(ServiceAPI.wsGetListWinnerRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetListWinnerResponse> wsGetListWinnerAsync(ServiceAPI.wsGetListWinnerRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsGetIntroductionResponse wsGetIntroduction(ServiceAPI.wsGetIntroductionRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetIntroductionResponse> wsGetIntroductionAsync(ServiceAPI.wsGetIntroductionRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsRegisterSubConfirmResponse wsRegisterSubConfirm(ServiceAPI.wsRegisterSubConfirmRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsRegisterSubConfirmResponse> wsRegisterSubConfirmAsync(ServiceAPI.wsRegisterSubConfirmRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsCreateAccountResponse wsCreateAccount(ServiceAPI.wsCreateAccountRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsCreateAccountResponse> wsCreateAccountAsync(ServiceAPI.wsCreateAccountRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsLoadPrizeResponse wsLoadPrize(ServiceAPI.wsLoadPrizeRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsLoadPrizeResponse> wsLoadPrizeAsync(ServiceAPI.wsLoadPrizeRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsGetUserCoinResponse wsGetUserCoin(ServiceAPI.wsGetUserCoinRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetUserCoinResponse> wsGetUserCoinAsync(ServiceAPI.wsGetUserCoinRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsGetTopCoinResponse wsGetTopCoin(ServiceAPI.wsGetTopCoinRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetTopCoinResponse> wsGetTopCoinAsync(ServiceAPI.wsGetTopCoinRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsCancelSubResponse wsCancelSub(ServiceAPI.wsCancelSubRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsCancelSubResponse> wsCancelSubAsync(ServiceAPI.wsCancelSubRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsGetUserRankResponse wsGetUserRank(ServiceAPI.wsGetUserRankRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetUserRankResponse> wsGetUserRankAsync(ServiceAPI.wsGetUserRankRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.wsDoSpinResponse wsDoSpin(ServiceAPI.wsDoSpinRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.wsDoSpinResponse> wsDoSpinAsync(ServiceAPI.wsDoSpinRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.getIpClientResponse getIpClient(ServiceAPI.getIpClientRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.getIpClientResponse> getIpClientAsync(ServiceAPI.getIpClientRequest request);
+        
+        // CODEGEN: Parameter 'return' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'Microsoft.Xml.Serialization.XmlElementAttribute'.
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [return: System.ServiceModel.MessageParameterAttribute(Name="return")]
+        ServiceAPI.pairResponse pair(ServiceAPI.pairRequest request);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        System.Threading.Tasks.Task<ServiceAPI.pairResponse> pairAsync(ServiceAPI.pairRequest request);
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://webservices.vas.com/")]
+    public partial class response
+    {
+        
+        private string contentField;
+        
+        private string errorCodeField;
+        
+        private string expireTimeField;
+        
+        private string extendStatusField;
+        
+        private string lastExtendField;
+        
+        private string lastLoginField;
+        
+        private luckyCode[] listLuckyCodeField;
+        
+        private prizeObj[] listPrizeField;
+        
+        private productInfo[] listProductField;
+        
+        private regInfoWs[] listRegInfoField;
+        
+        private topPlayer[] listTopPlayerField;
+        
+        private userCoinObj[] listUserCoinField;
+        
+        private prizeWinner[] listWinnerField;
+        
+        private string lockUntilField;
+        
+        private string msisdnField;
+        
+        private string registerTimeField;
+        
+        private string resultCodeField;
+        
+        private spinResultObj spinResultField;
+        
+        private string statusField;
+        
+        private int totalPageField;
+        
+        private userCoinObj userCoinField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
+        public string content
+        {
+            get
+            {
+                return this.contentField;
+            }
+            set
+            {
+                this.contentField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
+        public string errorCode
+        {
+            get
+            {
+                return this.errorCodeField;
+            }
+            set
+            {
+                this.errorCodeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
+        public string expireTime
+        {
+            get
+            {
+                return this.expireTimeField;
+            }
+            set
+            {
+                this.expireTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
+        public string extendStatus
+        {
+            get
+            {
+                return this.extendStatusField;
+            }
+            set
+            {
+                this.extendStatusField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
+        public string lastExtend
+        {
+            get
+            {
+                return this.lastExtendField;
+            }
+            set
+            {
+                this.lastExtendField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
+        public string lastLogin
+        {
+            get
+            {
+                return this.lastLoginField;
+            }
+            set
+            {
+                this.lastLoginField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("listLuckyCode", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true, Order=6)]
+        public luckyCode[] listLuckyCode
+        {
+            get
+            {
+                return this.listLuckyCodeField;
+            }
+            set
+            {
+                this.listLuckyCodeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("listPrize", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true, Order=7)]
+        public prizeObj[] listPrize
+        {
+            get
+            {
+                return this.listPrizeField;
+            }
+            set
+            {
+                this.listPrizeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("listProduct", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true, Order=8)]
+        public productInfo[] listProduct
+        {
+            get
+            {
+                return this.listProductField;
+            }
+            set
+            {
+                this.listProductField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("listRegInfo", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true, Order=9)]
+        public regInfoWs[] listRegInfo
+        {
+            get
+            {
+                return this.listRegInfoField;
+            }
+            set
+            {
+                this.listRegInfoField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("listTopPlayer", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true, Order=10)]
+        public topPlayer[] listTopPlayer
+        {
+            get
+            {
+                return this.listTopPlayerField;
+            }
+            set
+            {
+                this.listTopPlayerField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("listUserCoin", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true, Order=11)]
+        public userCoinObj[] listUserCoin
+        {
+            get
+            {
+                return this.listUserCoinField;
+            }
+            set
+            {
+                this.listUserCoinField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("listWinner", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true, Order=12)]
+        public prizeWinner[] listWinner
+        {
+            get
+            {
+                return this.listWinnerField;
+            }
+            set
+            {
+                this.listWinnerField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=13)]
+        public string lockUntil
+        {
+            get
+            {
+                return this.lockUntilField;
+            }
+            set
+            {
+                this.lockUntilField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=14)]
+        public string msisdn
+        {
+            get
+            {
+                return this.msisdnField;
+            }
+            set
+            {
+                this.msisdnField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=15)]
+        public string registerTime
+        {
+            get
+            {
+                return this.registerTimeField;
+            }
+            set
+            {
+                this.registerTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=16)]
+        public string resultCode
+        {
+            get
+            {
+                return this.resultCodeField;
+            }
+            set
+            {
+                this.resultCodeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=17)]
+        public spinResultObj spinResult
+        {
+            get
+            {
+                return this.spinResultField;
+            }
+            set
+            {
+                this.spinResultField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=18)]
+        public string status
+        {
+            get
+            {
+                return this.statusField;
+            }
+            set
+            {
+                this.statusField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=19)]
+        public int totalPage
+        {
+            get
+            {
+                return this.totalPageField;
+            }
+            set
+            {
+                this.totalPageField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=20)]
+        public userCoinObj userCoin
+        {
+            get
+            {
+                return this.userCoinField;
+            }
+            set
+            {
+                this.userCoinField = value;
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://webservices.vas.com/")]
+    public partial class luckyCode
+    {
+        
+        private string codeField;
+        
+        private int codeTypeField;
+        
+        private int confirmChannelField;
+        
+        private string confirmTimeField;
+        
+        private int countTimesField;
+        
+        private string expireTimeField;
+        
+        private int feeField;
+        
+        private int idField;
+        
+        private string insertTimeField;
+        
+        private string msisdnField;
+        
+        private int periodField;
+        
+        private long remainTimeField;
+        
+        private int statusField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
+        public string code
+        {
+            get
+            {
+                return this.codeField;
+            }
+            set
+            {
+                this.codeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
+        public int codeType
+        {
+            get
+            {
+                return this.codeTypeField;
+            }
+            set
+            {
+                this.codeTypeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
+        public int confirmChannel
+        {
+            get
+            {
+                return this.confirmChannelField;
+            }
+            set
+            {
+                this.confirmChannelField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
+        public string confirmTime
+        {
+            get
+            {
+                return this.confirmTimeField;
+            }
+            set
+            {
+                this.confirmTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
+        public int countTimes
+        {
+            get
+            {
+                return this.countTimesField;
+            }
+            set
+            {
+                this.countTimesField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
+        public string expireTime
+        {
+            get
+            {
+                return this.expireTimeField;
+            }
+            set
+            {
+                this.expireTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=6)]
+        public int fee
+        {
+            get
+            {
+                return this.feeField;
+            }
+            set
+            {
+                this.feeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=7)]
+        public int id
+        {
+            get
+            {
+                return this.idField;
+            }
+            set
+            {
+                this.idField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=8)]
+        public string insertTime
+        {
+            get
+            {
+                return this.insertTimeField;
+            }
+            set
+            {
+                this.insertTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=9)]
+        public string msisdn
+        {
+            get
+            {
+                return this.msisdnField;
+            }
+            set
+            {
+                this.msisdnField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=10)]
+        public int period
+        {
+            get
+            {
+                return this.periodField;
+            }
+            set
+            {
+                this.periodField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=11)]
+        public long remainTime
+        {
+            get
+            {
+                return this.remainTimeField;
+            }
+            set
+            {
+                this.remainTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=12)]
+        public int status
+        {
+            get
+            {
+                return this.statusField;
+            }
+            set
+            {
+                this.statusField = value;
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://webservices.vas.com/")]
+    public partial class spinResultObj
+    {
+        
+        private long luckySpinIdField;
+        
+        private int prizeIdField;
+        
+        private int remainSpinField;
+        
+        private int totalCoinField;
+        
+        private int totalSpinField;
+        
+        private int usedSpinField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
+        public long luckySpinId
+        {
+            get
+            {
+                return this.luckySpinIdField;
+            }
+            set
+            {
+                this.luckySpinIdField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
+        public int prizeId
+        {
+            get
+            {
+                return this.prizeIdField;
+            }
+            set
+            {
+                this.prizeIdField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
+        public int remainSpin
+        {
+            get
+            {
+                return this.remainSpinField;
+            }
+            set
+            {
+                this.remainSpinField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
+        public int totalCoin
+        {
+            get
+            {
+                return this.totalCoinField;
+            }
+            set
+            {
+                this.totalCoinField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
+        public int totalSpin
+        {
+            get
+            {
+                return this.totalSpinField;
+            }
+            set
+            {
+                this.totalSpinField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
+        public int usedSpin
+        {
+            get
+            {
+                return this.usedSpinField;
+            }
+            set
+            {
+                this.usedSpinField = value;
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://webservices.vas.com/")]
+    public partial class prizeWinner
+    {
+        
+        private string channelField;
+        
+        private string codeField;
+        
+        private string codeTimeField;
+        
+        private string expireTimeField;
+        
+        private int idField;
+        
+        private string msisdnField;
+        
+        private int pageField;
+        
+        private int periodField;
+        
+        private string prizeDescriptionField;
+        
+        private string prizeDescription1Field;
+        
+        private string prizeDescription2Field;
+        
+        private int prizeIdField;
+        
+        private string prizeNameField;
+        
+        private string prizeName1Field;
+        
+        private string prizeName2Field;
+        
+        private string processTimeField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
+        public string channel
+        {
+            get
+            {
+                return this.channelField;
+            }
+            set
+            {
+                this.channelField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
+        public string code
+        {
+            get
+            {
+                return this.codeField;
+            }
+            set
+            {
+                this.codeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
+        public string codeTime
+        {
+            get
+            {
+                return this.codeTimeField;
+            }
+            set
+            {
+                this.codeTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
+        public string expireTime
+        {
+            get
+            {
+                return this.expireTimeField;
+            }
+            set
+            {
+                this.expireTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
+        public int id
+        {
+            get
+            {
+                return this.idField;
+            }
+            set
+            {
+                this.idField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
+        public string msisdn
+        {
+            get
+            {
+                return this.msisdnField;
+            }
+            set
+            {
+                this.msisdnField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=6)]
+        public int page
+        {
+            get
+            {
+                return this.pageField;
+            }
+            set
+            {
+                this.pageField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=7)]
+        public int period
+        {
+            get
+            {
+                return this.periodField;
+            }
+            set
+            {
+                this.periodField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=8)]
+        public string prizeDescription
+        {
+            get
+            {
+                return this.prizeDescriptionField;
+            }
+            set
+            {
+                this.prizeDescriptionField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=9)]
+        public string prizeDescription1
+        {
+            get
+            {
+                return this.prizeDescription1Field;
+            }
+            set
+            {
+                this.prizeDescription1Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=10)]
+        public string prizeDescription2
+        {
+            get
+            {
+                return this.prizeDescription2Field;
+            }
+            set
+            {
+                this.prizeDescription2Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=11)]
+        public int prizeId
+        {
+            get
+            {
+                return this.prizeIdField;
+            }
+            set
+            {
+                this.prizeIdField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=12)]
+        public string prizeName
+        {
+            get
+            {
+                return this.prizeNameField;
+            }
+            set
+            {
+                this.prizeNameField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=13)]
+        public string prizeName1
+        {
+            get
+            {
+                return this.prizeName1Field;
+            }
+            set
+            {
+                this.prizeName1Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=14)]
+        public string prizeName2
+        {
+            get
+            {
+                return this.prizeName2Field;
+            }
+            set
+            {
+                this.prizeName2Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=15)]
+        public string processTime
+        {
+            get
+            {
+                return this.processTimeField;
+            }
+            set
+            {
+                this.processTimeField = value;
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://webservices.vas.com/")]
+    public partial class userCoinObj
+    {
+        
+        private string endTimeField;
+        
+        private long idField;
+        
+        private string lastUpdateField;
+        
+        private string msisdnField;
+        
+        private int rownumField;
+        
+        private string startTimeField;
+        
+        private long totalCoinField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
+        public string endTime
+        {
+            get
+            {
+                return this.endTimeField;
+            }
+            set
+            {
+                this.endTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
+        public long id
+        {
+            get
+            {
+                return this.idField;
+            }
+            set
+            {
+                this.idField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
+        public string lastUpdate
+        {
+            get
+            {
+                return this.lastUpdateField;
+            }
+            set
+            {
+                this.lastUpdateField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
+        public string msisdn
+        {
+            get
+            {
+                return this.msisdnField;
+            }
+            set
+            {
+                this.msisdnField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
+        public int rownum
+        {
+            get
+            {
+                return this.rownumField;
+            }
+            set
+            {
+                this.rownumField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
+        public string startTime
+        {
+            get
+            {
+                return this.startTimeField;
+            }
+            set
+            {
+                this.startTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=6)]
+        public long totalCoin
+        {
+            get
+            {
+                return this.totalCoinField;
+            }
+            set
+            {
+                this.totalCoinField = value;
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://webservices.vas.com/")]
+    public partial class topPlayer
+    {
+        
+        private string accountIdField;
+        
+        private string moneyField;
+        
+        private string msisdnField;
+        
+        private int pointField;
+        
+        private int rankField;
+        
+        private string scoresField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
+        public string accountId
+        {
+            get
+            {
+                return this.accountIdField;
+            }
+            set
+            {
+                this.accountIdField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
+        public string money
+        {
+            get
+            {
+                return this.moneyField;
+            }
+            set
+            {
+                this.moneyField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
+        public string msisdn
+        {
+            get
+            {
+                return this.msisdnField;
+            }
+            set
+            {
+                this.msisdnField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
+        public int point
+        {
+            get
+            {
+                return this.pointField;
+            }
+            set
+            {
+                this.pointField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
+        public int rank
+        {
+            get
+            {
+                return this.rankField;
+            }
+            set
+            {
+                this.rankField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
+        public string scores
+        {
+            get
+            {
+                return this.scoresField;
+            }
+            set
+            {
+                this.scoresField = value;
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://webservices.vas.com/")]
+    public partial class regInfoWs
+    {
+        
+        private string expireTimeField;
+        
+        private string extendStatusField;
+        
+        private int freeQuestionField;
+        
+        private string lastExtendField;
+        
+        private int playedTimesField;
+        
+        private string productNameField;
+        
+        private string registerTimeField;
+        
+        private int remainQuestionField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
+        public string expireTime
+        {
+            get
+            {
+                return this.expireTimeField;
+            }
+            set
+            {
+                this.expireTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
+        public string extendStatus
+        {
+            get
+            {
+                return this.extendStatusField;
+            }
+            set
+            {
+                this.extendStatusField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
+        public int freeQuestion
+        {
+            get
+            {
+                return this.freeQuestionField;
+            }
+            set
+            {
+                this.freeQuestionField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
+        public string lastExtend
+        {
+            get
+            {
+                return this.lastExtendField;
+            }
+            set
+            {
+                this.lastExtendField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
+        public int playedTimes
+        {
+            get
+            {
+                return this.playedTimesField;
+            }
+            set
+            {
+                this.playedTimesField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
+        public string productName
+        {
+            get
+            {
+                return this.productNameField;
+            }
+            set
+            {
+                this.productNameField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=6)]
+        public string registerTime
+        {
+            get
+            {
+                return this.registerTimeField;
+            }
+            set
+            {
+                this.registerTimeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=7)]
+        public int remainQuestion
+        {
+            get
+            {
+                return this.remainQuestionField;
+            }
+            set
+            {
+                this.remainQuestionField = value;
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://webservices.vas.com/")]
+    public partial class productInfo
+    {
+        
+        private int bizIdField;
+        
+        private string descriptionField;
+        
+        private string displayNameField;
+        
+        private string displayName1Field;
+        
+        private string displayName2Field;
+        
+        private int expireDaysField;
+        
+        private double feeField;
+        
+        private string imageUrlField;
+        
+        private int numberSpinField;
+        
+        private int productIdField;
+        
+        private string productNameField;
+        
+        private string smsSyntaxField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
+        public int bizId
+        {
+            get
+            {
+                return this.bizIdField;
+            }
+            set
+            {
+                this.bizIdField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
+        public string description
+        {
+            get
+            {
+                return this.descriptionField;
+            }
+            set
+            {
+                this.descriptionField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
+        public string displayName
+        {
+            get
+            {
+                return this.displayNameField;
+            }
+            set
+            {
+                this.displayNameField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
+        public string displayName1
+        {
+            get
+            {
+                return this.displayName1Field;
+            }
+            set
+            {
+                this.displayName1Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
+        public string displayName2
+        {
+            get
+            {
+                return this.displayName2Field;
+            }
+            set
+            {
+                this.displayName2Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
+        public int expireDays
+        {
+            get
+            {
+                return this.expireDaysField;
+            }
+            set
+            {
+                this.expireDaysField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=6)]
+        public double fee
+        {
+            get
+            {
+                return this.feeField;
+            }
+            set
+            {
+                this.feeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=7)]
+        public string imageUrl
+        {
+            get
+            {
+                return this.imageUrlField;
+            }
+            set
+            {
+                this.imageUrlField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=8)]
+        public int numberSpin
+        {
+            get
+            {
+                return this.numberSpinField;
+            }
+            set
+            {
+                this.numberSpinField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=9)]
+        public int productId
+        {
+            get
+            {
+                return this.productIdField;
+            }
+            set
+            {
+                this.productIdField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=10)]
+        public string productName
+        {
+            get
+            {
+                return this.productNameField;
+            }
+            set
+            {
+                this.productNameField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=11)]
+        public string smsSyntax
+        {
+            get
+            {
+                return this.smsSyntaxField;
+            }
+            set
+            {
+                this.smsSyntaxField = value;
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://webservices.vas.com/")]
+    public partial class prizeObj
+    {
+        
+        private string actionCodeField;
+        
+        private string descriptionField;
+        
+        private string description1Field;
+        
+        private string description2Field;
+        
+        private long idField;
+        
+        private int isPadField;
+        
+        private int isTopField;
+        
+        private int periodField;
+        
+        private string prefixMsisdnField;
+        
+        private string prizeNameField;
+        
+        private string prizeName1Field;
+        
+        private string prizeName2Field;
+        
+        private int statusField;
+        
+        private int subGroupPrizeField;
+        
+        private long winEveryField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
+        public string actionCode
+        {
+            get
+            {
+                return this.actionCodeField;
+            }
+            set
+            {
+                this.actionCodeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
+        public string description
+        {
+            get
+            {
+                return this.descriptionField;
+            }
+            set
+            {
+                this.descriptionField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=2)]
+        public string description1
+        {
+            get
+            {
+                return this.description1Field;
+            }
+            set
+            {
+                this.description1Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=3)]
+        public string description2
+        {
+            get
+            {
+                return this.description2Field;
+            }
+            set
+            {
+                this.description2Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
+        public long id
+        {
+            get
+            {
+                return this.idField;
+            }
+            set
+            {
+                this.idField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
+        public int isPad
+        {
+            get
+            {
+                return this.isPadField;
+            }
+            set
+            {
+                this.isPadField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=6)]
+        public int isTop
+        {
+            get
+            {
+                return this.isTopField;
+            }
+            set
+            {
+                this.isTopField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=7)]
+        public int period
+        {
+            get
+            {
+                return this.periodField;
+            }
+            set
+            {
+                this.periodField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=8)]
+        public string prefixMsisdn
+        {
+            get
+            {
+                return this.prefixMsisdnField;
+            }
+            set
+            {
+                this.prefixMsisdnField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=9)]
+        public string prizeName
+        {
+            get
+            {
+                return this.prizeNameField;
+            }
+            set
+            {
+                this.prizeNameField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=10)]
+        public string prizeName1
+        {
+            get
+            {
+                return this.prizeName1Field;
+            }
+            set
+            {
+                this.prizeName1Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=11)]
+        public string prizeName2
+        {
+            get
+            {
+                return this.prizeName2Field;
+            }
+            set
+            {
+                this.prizeName2Field = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=12)]
+        public int status
+        {
+            get
+            {
+                return this.statusField;
+            }
+            set
+            {
+                this.statusField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=13)]
+        public int subGroupPrize
+        {
+            get
+            {
+                return this.subGroupPrizeField;
+            }
+            set
+            {
+                this.subGroupPrizeField = value;
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=14)]
+        public long winEvery
+        {
+            get
+            {
+                return this.winEveryField;
+            }
+            set
+            {
+                this.winEveryField = value;
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsLoadPackage", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsLoadPackageRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        public wsLoadPackageRequest()
+        {
+        }
+        
+        public wsLoadPackageRequest(string WsUser, string WsPass)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsLoadPackageResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsLoadPackageResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsLoadPackageResponse()
+        {
+        }
+        
+        public wsLoadPackageResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsLogin", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsLoginRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string password;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string msisdn;
+        
+        public wsLoginRequest()
+        {
+        }
+        
+        public wsLoginRequest(string WsUser, string WsPass, string password, string msisdn)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.password = password;
+            this.msisdn = msisdn;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsLoginResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsLoginResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsLoginResponse()
+        {
+        }
+        
+        public wsLoginResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetSubInfo", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetSubInfoRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string msisdn;
+        
+        public wsGetSubInfoRequest()
+        {
+        }
+        
+        public wsGetSubInfoRequest(string WsUser, string WsPass, string msisdn)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.msisdn = msisdn;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetSubInfoResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetSubInfoResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsGetSubInfoResponse()
+        {
+        }
+        
+        public wsGetSubInfoResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsRegisterSubOtp", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsRegisterSubOtpRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string Msisdn;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string PackageName;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string channel;
+        
+        public wsRegisterSubOtpRequest()
+        {
+        }
+        
+        public wsRegisterSubOtpRequest(string WsUser, string WsPass, string Msisdn, string PackageName, string channel)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.Msisdn = Msisdn;
+            this.PackageName = PackageName;
+            this.channel = channel;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsRegisterSubOtpResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsRegisterSubOtpResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsRegisterSubOtpResponse()
+        {
+        }
+        
+        public wsRegisterSubOtpResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsResetPassword", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsResetPasswordRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string msisdn;
+        
+        public wsResetPasswordRequest()
+        {
+        }
+        
+        public wsResetPasswordRequest(string WsUser, string WsPass, string msisdn)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.msisdn = msisdn;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsResetPasswordResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsResetPasswordResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsResetPasswordResponse()
+        {
+        }
+        
+        public wsResetPasswordResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetListWinner", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetListWinnerRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string msisdn;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string period;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string page;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string pageSize;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string isTop;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string codeType;
+        
+        public wsGetListWinnerRequest()
+        {
+        }
+        
+        public wsGetListWinnerRequest(string WsUser, string WsPass, string msisdn, string period, string page, string pageSize, string isTop, string codeType)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.msisdn = msisdn;
+            this.period = period;
+            this.page = page;
+            this.pageSize = pageSize;
+            this.isTop = isTop;
+            this.codeType = codeType;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetListWinnerResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetListWinnerResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsGetListWinnerResponse()
+        {
+        }
+        
+        public wsGetListWinnerResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetIntroduction", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetIntroductionRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string msisdn;
+        
+        public wsGetIntroductionRequest()
+        {
+        }
+        
+        public wsGetIntroductionRequest(string WsUser, string WsPass, string msisdn)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.msisdn = msisdn;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetIntroductionResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetIntroductionResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsGetIntroductionResponse()
+        {
+        }
+        
+        public wsGetIntroductionResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsRegisterSubConfirm", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsRegisterSubConfirmRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string Msisdn;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string PackageName;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string RequestId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string Otp;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string Channel;
+        
+        public wsRegisterSubConfirmRequest()
+        {
+        }
+        
+        public wsRegisterSubConfirmRequest(string WsUser, string WsPass, string Msisdn, string PackageName, string RequestId, string Otp, string Channel)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.Msisdn = Msisdn;
+            this.PackageName = PackageName;
+            this.RequestId = RequestId;
+            this.Otp = Otp;
+            this.Channel = Channel;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsRegisterSubConfirmResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsRegisterSubConfirmResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsRegisterSubConfirmResponse()
+        {
+        }
+        
+        public wsRegisterSubConfirmResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsCreateAccount", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsCreateAccountRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string password;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string msisdn;
+        
+        public wsCreateAccountRequest()
+        {
+        }
+        
+        public wsCreateAccountRequest(string WsUser, string WsPass, string password, string msisdn)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.password = password;
+            this.msisdn = msisdn;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsCreateAccountResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsCreateAccountResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsCreateAccountResponse()
+        {
+        }
+        
+        public wsCreateAccountResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsLoadPrize", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsLoadPrizeRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        public wsLoadPrizeRequest()
+        {
+        }
+        
+        public wsLoadPrizeRequest(string WsUser, string WsPass)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsLoadPrizeResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsLoadPrizeResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsLoadPrizeResponse()
+        {
+        }
+        
+        public wsLoadPrizeResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetUserCoin", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetUserCoinRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string msisdn;
+        
+        public wsGetUserCoinRequest()
+        {
+        }
+        
+        public wsGetUserCoinRequest(string WsUser, string WsPass, string msisdn)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.msisdn = msisdn;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetUserCoinResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetUserCoinResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsGetUserCoinResponse()
+        {
+        }
+        
+        public wsGetUserCoinResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetTopCoin", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetTopCoinRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string size;
+        
+        public wsGetTopCoinRequest()
+        {
+        }
+        
+        public wsGetTopCoinRequest(string WsUser, string WsPass, string size)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.size = size;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetTopCoinResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetTopCoinResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsGetTopCoinResponse()
+        {
+        }
+        
+        public wsGetTopCoinResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsCancelSub", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsCancelSubRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string Msisdn;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string PackageName;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string channel;
+        
+        public wsCancelSubRequest()
+        {
+        }
+        
+        public wsCancelSubRequest(string WsUser, string WsPass, string Msisdn, string PackageName, string channel)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.Msisdn = Msisdn;
+            this.PackageName = PackageName;
+            this.channel = channel;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsCancelSubResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsCancelSubResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsCancelSubResponse()
+        {
+        }
+        
+        public wsCancelSubResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetUserRank", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetUserRankRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string msisdn;
+        
+        public wsGetUserRankRequest()
+        {
+        }
+        
+        public wsGetUserRankRequest(string WsUser, string WsPass, string msisdn)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.msisdn = msisdn;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsGetUserRankResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsGetUserRankResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsGetUserRankResponse()
+        {
+        }
+        
+        public wsGetUserRankResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsDoSpin", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsDoSpinRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsUser;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string WsPass;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string Msisdn;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string Channel;
+        
+        public wsDoSpinRequest()
+        {
+        }
+        
+        public wsDoSpinRequest(string WsUser, string WsPass, string Msisdn, string Channel)
+        {
+            this.WsUser = WsUser;
+            this.WsPass = WsPass;
+            this.Msisdn = Msisdn;
+            this.Channel = Channel;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="wsDoSpinResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class wsDoSpinResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public ServiceAPI.response @return;
+        
+        public wsDoSpinResponse()
+        {
+        }
+        
+        public wsDoSpinResponse(ServiceAPI.response @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getIpClient", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class getIpClientRequest
+    {
+        
+        public getIpClientRequest()
+        {
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getIpClientResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class getIpClientResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string @return;
+        
+        public getIpClientResponse()
+        {
+        }
+        
+        public getIpClientResponse(string @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="pair", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class pairRequest
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string arg0;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public string arg1;
+        
+        public pairRequest()
+        {
+        }
+        
+        public pairRequest(string arg0, string arg1)
+        {
+            this.arg0 = arg0;
+            this.arg1 = arg1;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="pairResponse", WrapperNamespace="http://webservices.vas.com/", IsWrapped=true)]
+    public partial class pairResponse
+    {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://webservices.vas.com/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+        public bool @return;
+        
+        public pairResponse()
+        {
+        }
+        
+        public pairResponse(bool @return)
+        {
+            this.@return = @return;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    public interface WsLuckyCallChannel : ServiceAPI.WsLuckyCall, System.ServiceModel.IClientChannel
+    {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")]
+    public partial class WsLuckyCallClient : System.ServiceModel.ClientBase<ServiceAPI.WsLuckyCall>, ServiceAPI.WsLuckyCall
+    {
+        
+        /// <summary>
+        /// Implement this partial method to configure the service endpoint.
+        /// </summary>
+        /// <param name="serviceEndpoint">The endpoint to configure</param>
+        /// <param name="clientCredentials">The client credentials</param>
+        static partial void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials);
+        
+        public WsLuckyCallClient() : 
+                base(WsLuckyCallClient.GetDefaultBinding(), WsLuckyCallClient.GetDefaultEndpointAddress())
+        {
+            this.Endpoint.Name = EndpointConfiguration.WsLuckyCallPort.ToString();
+            ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
+        }
+        
+        public WsLuckyCallClient(EndpointConfiguration endpointConfiguration) : 
+                base(WsLuckyCallClient.GetBindingForEndpoint(endpointConfiguration), WsLuckyCallClient.GetEndpointAddress(endpointConfiguration))
+        {
+            this.Endpoint.Name = endpointConfiguration.ToString();
+            ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
+        }
+        
+        public WsLuckyCallClient(EndpointConfiguration endpointConfiguration, string remoteAddress) : 
+                base(WsLuckyCallClient.GetBindingForEndpoint(endpointConfiguration), new System.ServiceModel.EndpointAddress(remoteAddress))
+        {
+            this.Endpoint.Name = endpointConfiguration.ToString();
+            ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
+        }
+        
+        public WsLuckyCallClient(EndpointConfiguration endpointConfiguration, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(WsLuckyCallClient.GetBindingForEndpoint(endpointConfiguration), remoteAddress)
+        {
+            this.Endpoint.Name = endpointConfiguration.ToString();
+            ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
+        }
+        
+        public WsLuckyCallClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress)
+        {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsLoadPackageResponse ServiceAPI.WsLuckyCall.wsLoadPackage(ServiceAPI.wsLoadPackageRequest request)
+        {
+            return base.Channel.wsLoadPackage(request);
+        }
+        
+        public ServiceAPI.response wsLoadPackage(string WsUser, string WsPass)
+        {
+            ServiceAPI.wsLoadPackageRequest inValue = new ServiceAPI.wsLoadPackageRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            ServiceAPI.wsLoadPackageResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsLoadPackage(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsLoadPackageResponse> ServiceAPI.WsLuckyCall.wsLoadPackageAsync(ServiceAPI.wsLoadPackageRequest request)
+        {
+            return base.Channel.wsLoadPackageAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsLoadPackageResponse> wsLoadPackageAsync(string WsUser, string WsPass)
+        {
+            ServiceAPI.wsLoadPackageRequest inValue = new ServiceAPI.wsLoadPackageRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsLoadPackageAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsLoginResponse ServiceAPI.WsLuckyCall.wsLogin(ServiceAPI.wsLoginRequest request)
+        {
+            return base.Channel.wsLogin(request);
+        }
+        
+        public ServiceAPI.response wsLogin(string WsUser, string WsPass, string password, string msisdn)
+        {
+            ServiceAPI.wsLoginRequest inValue = new ServiceAPI.wsLoginRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.password = password;
+            inValue.msisdn = msisdn;
+            ServiceAPI.wsLoginResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsLogin(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsLoginResponse> ServiceAPI.WsLuckyCall.wsLoginAsync(ServiceAPI.wsLoginRequest request)
+        {
+            return base.Channel.wsLoginAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsLoginResponse> wsLoginAsync(string WsUser, string WsPass, string password, string msisdn)
+        {
+            ServiceAPI.wsLoginRequest inValue = new ServiceAPI.wsLoginRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.password = password;
+            inValue.msisdn = msisdn;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsLoginAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsGetSubInfoResponse ServiceAPI.WsLuckyCall.wsGetSubInfo(ServiceAPI.wsGetSubInfoRequest request)
+        {
+            return base.Channel.wsGetSubInfo(request);
+        }
+        
+        public ServiceAPI.response wsGetSubInfo(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsGetSubInfoRequest inValue = new ServiceAPI.wsGetSubInfoRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            ServiceAPI.wsGetSubInfoResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsGetSubInfo(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetSubInfoResponse> ServiceAPI.WsLuckyCall.wsGetSubInfoAsync(ServiceAPI.wsGetSubInfoRequest request)
+        {
+            return base.Channel.wsGetSubInfoAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsGetSubInfoResponse> wsGetSubInfoAsync(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsGetSubInfoRequest inValue = new ServiceAPI.wsGetSubInfoRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsGetSubInfoAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsRegisterSubOtpResponse ServiceAPI.WsLuckyCall.wsRegisterSubOtp(ServiceAPI.wsRegisterSubOtpRequest request)
+        {
+            return base.Channel.wsRegisterSubOtp(request);
+        }
+        
+        public ServiceAPI.response wsRegisterSubOtp(string WsUser, string WsPass, string Msisdn, string PackageName, string channel)
+        {
+            ServiceAPI.wsRegisterSubOtpRequest inValue = new ServiceAPI.wsRegisterSubOtpRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.Msisdn = Msisdn;
+            inValue.PackageName = PackageName;
+            inValue.channel = channel;
+            ServiceAPI.wsRegisterSubOtpResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsRegisterSubOtp(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsRegisterSubOtpResponse> ServiceAPI.WsLuckyCall.wsRegisterSubOtpAsync(ServiceAPI.wsRegisterSubOtpRequest request)
+        {
+            return base.Channel.wsRegisterSubOtpAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsRegisterSubOtpResponse> wsRegisterSubOtpAsync(string WsUser, string WsPass, string Msisdn, string PackageName, string channel)
+        {
+            ServiceAPI.wsRegisterSubOtpRequest inValue = new ServiceAPI.wsRegisterSubOtpRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.Msisdn = Msisdn;
+            inValue.PackageName = PackageName;
+            inValue.channel = channel;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsRegisterSubOtpAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsResetPasswordResponse ServiceAPI.WsLuckyCall.wsResetPassword(ServiceAPI.wsResetPasswordRequest request)
+        {
+            return base.Channel.wsResetPassword(request);
+        }
+        
+        public ServiceAPI.response wsResetPassword(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsResetPasswordRequest inValue = new ServiceAPI.wsResetPasswordRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            ServiceAPI.wsResetPasswordResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsResetPassword(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsResetPasswordResponse> ServiceAPI.WsLuckyCall.wsResetPasswordAsync(ServiceAPI.wsResetPasswordRequest request)
+        {
+            return base.Channel.wsResetPasswordAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsResetPasswordResponse> wsResetPasswordAsync(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsResetPasswordRequest inValue = new ServiceAPI.wsResetPasswordRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsResetPasswordAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsGetListWinnerResponse ServiceAPI.WsLuckyCall.wsGetListWinner(ServiceAPI.wsGetListWinnerRequest request)
+        {
+            return base.Channel.wsGetListWinner(request);
+        }
+        
+        public ServiceAPI.response wsGetListWinner(string WsUser, string WsPass, string msisdn, string period, string page, string pageSize, string isTop, string codeType)
+        {
+            ServiceAPI.wsGetListWinnerRequest inValue = new ServiceAPI.wsGetListWinnerRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            inValue.period = period;
+            inValue.page = page;
+            inValue.pageSize = pageSize;
+            inValue.isTop = isTop;
+            inValue.codeType = codeType;
+            ServiceAPI.wsGetListWinnerResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsGetListWinner(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetListWinnerResponse> ServiceAPI.WsLuckyCall.wsGetListWinnerAsync(ServiceAPI.wsGetListWinnerRequest request)
+        {
+            return base.Channel.wsGetListWinnerAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsGetListWinnerResponse> wsGetListWinnerAsync(string WsUser, string WsPass, string msisdn, string period, string page, string pageSize, string isTop, string codeType)
+        {
+            ServiceAPI.wsGetListWinnerRequest inValue = new ServiceAPI.wsGetListWinnerRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            inValue.period = period;
+            inValue.page = page;
+            inValue.pageSize = pageSize;
+            inValue.isTop = isTop;
+            inValue.codeType = codeType;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsGetListWinnerAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsGetIntroductionResponse ServiceAPI.WsLuckyCall.wsGetIntroduction(ServiceAPI.wsGetIntroductionRequest request)
+        {
+            return base.Channel.wsGetIntroduction(request);
+        }
+        
+        public ServiceAPI.response wsGetIntroduction(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsGetIntroductionRequest inValue = new ServiceAPI.wsGetIntroductionRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            ServiceAPI.wsGetIntroductionResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsGetIntroduction(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetIntroductionResponse> ServiceAPI.WsLuckyCall.wsGetIntroductionAsync(ServiceAPI.wsGetIntroductionRequest request)
+        {
+            return base.Channel.wsGetIntroductionAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsGetIntroductionResponse> wsGetIntroductionAsync(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsGetIntroductionRequest inValue = new ServiceAPI.wsGetIntroductionRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsGetIntroductionAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsRegisterSubConfirmResponse ServiceAPI.WsLuckyCall.wsRegisterSubConfirm(ServiceAPI.wsRegisterSubConfirmRequest request)
+        {
+            return base.Channel.wsRegisterSubConfirm(request);
+        }
+        
+        public ServiceAPI.response wsRegisterSubConfirm(string WsUser, string WsPass, string Msisdn, string PackageName, string RequestId, string Otp, string Channel)
+        {
+            ServiceAPI.wsRegisterSubConfirmRequest inValue = new ServiceAPI.wsRegisterSubConfirmRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.Msisdn = Msisdn;
+            inValue.PackageName = PackageName;
+            inValue.RequestId = RequestId;
+            inValue.Otp = Otp;
+            inValue.Channel = Channel;
+            ServiceAPI.wsRegisterSubConfirmResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsRegisterSubConfirm(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsRegisterSubConfirmResponse> ServiceAPI.WsLuckyCall.wsRegisterSubConfirmAsync(ServiceAPI.wsRegisterSubConfirmRequest request)
+        {
+            return base.Channel.wsRegisterSubConfirmAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsRegisterSubConfirmResponse> wsRegisterSubConfirmAsync(string WsUser, string WsPass, string Msisdn, string PackageName, string RequestId, string Otp, string Channel)
+        {
+            ServiceAPI.wsRegisterSubConfirmRequest inValue = new ServiceAPI.wsRegisterSubConfirmRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.Msisdn = Msisdn;
+            inValue.PackageName = PackageName;
+            inValue.RequestId = RequestId;
+            inValue.Otp = Otp;
+            inValue.Channel = Channel;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsRegisterSubConfirmAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsCreateAccountResponse ServiceAPI.WsLuckyCall.wsCreateAccount(ServiceAPI.wsCreateAccountRequest request)
+        {
+            return base.Channel.wsCreateAccount(request);
+        }
+        
+        public ServiceAPI.response wsCreateAccount(string WsUser, string WsPass, string password, string msisdn)
+        {
+            ServiceAPI.wsCreateAccountRequest inValue = new ServiceAPI.wsCreateAccountRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.password = password;
+            inValue.msisdn = msisdn;
+            ServiceAPI.wsCreateAccountResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsCreateAccount(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsCreateAccountResponse> ServiceAPI.WsLuckyCall.wsCreateAccountAsync(ServiceAPI.wsCreateAccountRequest request)
+        {
+            return base.Channel.wsCreateAccountAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsCreateAccountResponse> wsCreateAccountAsync(string WsUser, string WsPass, string password, string msisdn)
+        {
+            ServiceAPI.wsCreateAccountRequest inValue = new ServiceAPI.wsCreateAccountRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.password = password;
+            inValue.msisdn = msisdn;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsCreateAccountAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsLoadPrizeResponse ServiceAPI.WsLuckyCall.wsLoadPrize(ServiceAPI.wsLoadPrizeRequest request)
+        {
+            return base.Channel.wsLoadPrize(request);
+        }
+        
+        public ServiceAPI.response wsLoadPrize(string WsUser, string WsPass)
+        {
+            ServiceAPI.wsLoadPrizeRequest inValue = new ServiceAPI.wsLoadPrizeRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            ServiceAPI.wsLoadPrizeResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsLoadPrize(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsLoadPrizeResponse> ServiceAPI.WsLuckyCall.wsLoadPrizeAsync(ServiceAPI.wsLoadPrizeRequest request)
+        {
+            return base.Channel.wsLoadPrizeAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsLoadPrizeResponse> wsLoadPrizeAsync(string WsUser, string WsPass)
+        {
+            ServiceAPI.wsLoadPrizeRequest inValue = new ServiceAPI.wsLoadPrizeRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsLoadPrizeAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsGetUserCoinResponse ServiceAPI.WsLuckyCall.wsGetUserCoin(ServiceAPI.wsGetUserCoinRequest request)
+        {
+            return base.Channel.wsGetUserCoin(request);
+        }
+        
+        public ServiceAPI.response wsGetUserCoin(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsGetUserCoinRequest inValue = new ServiceAPI.wsGetUserCoinRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            ServiceAPI.wsGetUserCoinResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsGetUserCoin(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetUserCoinResponse> ServiceAPI.WsLuckyCall.wsGetUserCoinAsync(ServiceAPI.wsGetUserCoinRequest request)
+        {
+            return base.Channel.wsGetUserCoinAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsGetUserCoinResponse> wsGetUserCoinAsync(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsGetUserCoinRequest inValue = new ServiceAPI.wsGetUserCoinRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsGetUserCoinAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsGetTopCoinResponse ServiceAPI.WsLuckyCall.wsGetTopCoin(ServiceAPI.wsGetTopCoinRequest request)
+        {
+            return base.Channel.wsGetTopCoin(request);
+        }
+        
+        public ServiceAPI.response wsGetTopCoin(string WsUser, string WsPass, string size)
+        {
+            ServiceAPI.wsGetTopCoinRequest inValue = new ServiceAPI.wsGetTopCoinRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.size = size;
+            ServiceAPI.wsGetTopCoinResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsGetTopCoin(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetTopCoinResponse> ServiceAPI.WsLuckyCall.wsGetTopCoinAsync(ServiceAPI.wsGetTopCoinRequest request)
+        {
+            return base.Channel.wsGetTopCoinAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsGetTopCoinResponse> wsGetTopCoinAsync(string WsUser, string WsPass, string size)
+        {
+            ServiceAPI.wsGetTopCoinRequest inValue = new ServiceAPI.wsGetTopCoinRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.size = size;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsGetTopCoinAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsCancelSubResponse ServiceAPI.WsLuckyCall.wsCancelSub(ServiceAPI.wsCancelSubRequest request)
+        {
+            return base.Channel.wsCancelSub(request);
+        }
+        
+        public ServiceAPI.response wsCancelSub(string WsUser, string WsPass, string Msisdn, string PackageName, string channel)
+        {
+            ServiceAPI.wsCancelSubRequest inValue = new ServiceAPI.wsCancelSubRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.Msisdn = Msisdn;
+            inValue.PackageName = PackageName;
+            inValue.channel = channel;
+            ServiceAPI.wsCancelSubResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsCancelSub(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsCancelSubResponse> ServiceAPI.WsLuckyCall.wsCancelSubAsync(ServiceAPI.wsCancelSubRequest request)
+        {
+            return base.Channel.wsCancelSubAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsCancelSubResponse> wsCancelSubAsync(string WsUser, string WsPass, string Msisdn, string PackageName, string channel)
+        {
+            ServiceAPI.wsCancelSubRequest inValue = new ServiceAPI.wsCancelSubRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.Msisdn = Msisdn;
+            inValue.PackageName = PackageName;
+            inValue.channel = channel;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsCancelSubAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsGetUserRankResponse ServiceAPI.WsLuckyCall.wsGetUserRank(ServiceAPI.wsGetUserRankRequest request)
+        {
+            return base.Channel.wsGetUserRank(request);
+        }
+        
+        public ServiceAPI.response wsGetUserRank(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsGetUserRankRequest inValue = new ServiceAPI.wsGetUserRankRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            ServiceAPI.wsGetUserRankResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsGetUserRank(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsGetUserRankResponse> ServiceAPI.WsLuckyCall.wsGetUserRankAsync(ServiceAPI.wsGetUserRankRequest request)
+        {
+            return base.Channel.wsGetUserRankAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsGetUserRankResponse> wsGetUserRankAsync(string WsUser, string WsPass, string msisdn)
+        {
+            ServiceAPI.wsGetUserRankRequest inValue = new ServiceAPI.wsGetUserRankRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.msisdn = msisdn;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsGetUserRankAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.wsDoSpinResponse ServiceAPI.WsLuckyCall.wsDoSpin(ServiceAPI.wsDoSpinRequest request)
+        {
+            return base.Channel.wsDoSpin(request);
+        }
+        
+        public ServiceAPI.response wsDoSpin(string WsUser, string WsPass, string Msisdn, string Channel)
+        {
+            ServiceAPI.wsDoSpinRequest inValue = new ServiceAPI.wsDoSpinRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.Msisdn = Msisdn;
+            inValue.Channel = Channel;
+            ServiceAPI.wsDoSpinResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).wsDoSpin(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.wsDoSpinResponse> ServiceAPI.WsLuckyCall.wsDoSpinAsync(ServiceAPI.wsDoSpinRequest request)
+        {
+            return base.Channel.wsDoSpinAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.wsDoSpinResponse> wsDoSpinAsync(string WsUser, string WsPass, string Msisdn, string Channel)
+        {
+            ServiceAPI.wsDoSpinRequest inValue = new ServiceAPI.wsDoSpinRequest();
+            inValue.WsUser = WsUser;
+            inValue.WsPass = WsPass;
+            inValue.Msisdn = Msisdn;
+            inValue.Channel = Channel;
+            return ((ServiceAPI.WsLuckyCall)(this)).wsDoSpinAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.getIpClientResponse ServiceAPI.WsLuckyCall.getIpClient(ServiceAPI.getIpClientRequest request)
+        {
+            return base.Channel.getIpClient(request);
+        }
+        
+        public string getIpClient()
+        {
+            ServiceAPI.getIpClientRequest inValue = new ServiceAPI.getIpClientRequest();
+            ServiceAPI.getIpClientResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).getIpClient(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.getIpClientResponse> ServiceAPI.WsLuckyCall.getIpClientAsync(ServiceAPI.getIpClientRequest request)
+        {
+            return base.Channel.getIpClientAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.getIpClientResponse> getIpClientAsync()
+        {
+            ServiceAPI.getIpClientRequest inValue = new ServiceAPI.getIpClientRequest();
+            return ((ServiceAPI.WsLuckyCall)(this)).getIpClientAsync(inValue);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        ServiceAPI.pairResponse ServiceAPI.WsLuckyCall.pair(ServiceAPI.pairRequest request)
+        {
+            return base.Channel.pair(request);
+        }
+        
+        public bool pair(string arg0, string arg1)
+        {
+            ServiceAPI.pairRequest inValue = new ServiceAPI.pairRequest();
+            inValue.arg0 = arg0;
+            inValue.arg1 = arg1;
+            ServiceAPI.pairResponse retVal = ((ServiceAPI.WsLuckyCall)(this)).pair(inValue);
+            return retVal.@return;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        System.Threading.Tasks.Task<ServiceAPI.pairResponse> ServiceAPI.WsLuckyCall.pairAsync(ServiceAPI.pairRequest request)
+        {
+            return base.Channel.pairAsync(request);
+        }
+        
+        public System.Threading.Tasks.Task<ServiceAPI.pairResponse> pairAsync(string arg0, string arg1)
+        {
+            ServiceAPI.pairRequest inValue = new ServiceAPI.pairRequest();
+            inValue.arg0 = arg0;
+            inValue.arg1 = arg1;
+            return ((ServiceAPI.WsLuckyCall)(this)).pairAsync(inValue);
+        }
+        
+        public virtual System.Threading.Tasks.Task OpenAsync()
+        {
+            return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginOpen(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndOpen));
+        }
+        
+        public virtual System.Threading.Tasks.Task CloseAsync()
+        {
+            return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginClose(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndClose));
+        }
+        
+        private static System.ServiceModel.Channels.Binding GetBindingForEndpoint(EndpointConfiguration endpointConfiguration)
+        {
+            if ((endpointConfiguration == EndpointConfiguration.WsLuckyCallPort))
+            {
+                System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
+                result.MaxBufferSize = int.MaxValue;
+                result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
+                result.MaxReceivedMessageSize = int.MaxValue;
+                result.AllowCookies = true;
+                return result;
+            }
+            throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'{0}\'.", endpointConfiguration));
+        }
+        
+        private static System.ServiceModel.EndpointAddress GetEndpointAddress(EndpointConfiguration endpointConfiguration)
+        {
+            if ((endpointConfiguration == EndpointConfiguration.WsLuckyCallPort))
+            {
+                return new System.ServiceModel.EndpointAddress("http://127.0.0.1:8088/WsLuckyCall");
+            }
+            throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'{0}\'.", endpointConfiguration));
+        }
+        
+        private static System.ServiceModel.Channels.Binding GetDefaultBinding()
+        {
+            return WsLuckyCallClient.GetBindingForEndpoint(EndpointConfiguration.WsLuckyCallPort);
+        }
+        
+        private static System.ServiceModel.EndpointAddress GetDefaultEndpointAddress()
+        {
+            return WsLuckyCallClient.GetEndpointAddress(EndpointConfiguration.WsLuckyCallPort);
+        }
+        
+        public enum EndpointConfiguration
+        {
+            
+            WsLuckyCallPort,
+        }
+    }
+}

+ 743 - 0
LuckyCallWebCore/LuckyCallWebCore/Controllers/BaseController.cs

@@ -0,0 +1,743 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.Security.Cryptography;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.Text;
+using System.Threading.Tasks;
+using LuckyCallWebCore.Extensions;
+using LuckyCallWebCore.Models;
+using LuckyCallWebCore.Source;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Primitives;
+using Nat_LuckyCall.Resources;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using Org.BouncyCastle.Crypto;
+using Org.BouncyCastle.Crypto.Parameters;
+using Org.BouncyCastle.Security;
+using ServiceAPI;
+using static LuckyCallWebCore.Source.LuckyCallUtils;
+
+namespace LuckyCallWebCore.Controllers
+{
+    public class BaseController : Controller
+    {
+
+        private readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+        private readonly IWebHostEnvironment webHostEnvironment;
+
+        protected IConfiguration configuration;
+
+        public static String CountryCode = "";
+        public static int numWs = 0;
+        public static String FacebookAppId = "";
+        public static String FacebookShareHref = "";
+        public static String channel = "";
+        public static String serviceId = "";
+        public static String RootHref = "";
+        public static String wsUser = "";
+        public static String wsPassword = "";
+        public static String wsUrl1 = "";
+        public static int coin1Spin = 5;
+        public static int testMode = 0;
+        public static string[] listPrefixMsisdn;
+        private string df = "dd/MM/yyyy HH:mm:ss";
+
+        // list prize & package
+        public static List<prizeObj> listPrize;
+        public static List<productInfo> listPackg;
+
+        //public static String CountryCode = ConfigurationManager.AppSettings["countryCode"];
+        //public static int numWs = int.Parse(ConfigurationManager.AppSettings["numWs"]);
+        //public static String FacebookAppId = ConfigurationManager.AppSettings["FacebookAppId"];
+        //public static String channel = ConfigurationManager.AppSettings["channel"];
+        //public static String serviceId = ConfigurationManager.AppSettings["serviceId"];
+
+        public BaseController() { }
+        public BaseController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
+        {
+            configuration = _configuration;
+            webHostEnvironment = hostEnvironment;
+            // load config
+            CountryCode = configuration["countryCode"];
+            numWs = int.Parse(configuration["numWs"]);
+            FacebookAppId = configuration["FacebookAppId"];
+            FacebookShareHref = configuration["FacebookShareHref"];
+            channel = configuration["channel"];
+            serviceId = configuration["serviceId"];
+            wsUser = configuration["wsUser"];
+            wsPassword = configuration["wsPassword"];
+            wsUrl1 = configuration["wsUrl1"];
+            RootHref = configuration["RootHref"];
+            coin1Spin = int.Parse(configuration["coin1Spin"]);
+            testMode = int.Parse(configuration["testMode"]);
+            listPrefixMsisdn = configuration["listPrefixMsisdn"].Split(',');
+        }
+
+        public class ActionSession
+        {
+            public const int Login = 1;
+            public const int Resetpass = 2;
+            public const int SignUp = 3;
+        }
+
+        public String GetParameter(String key)
+        {
+            return configuration.GetSection(key).Value;
+        }
+
+        public String GetParameter(String parentKey, String key)
+        {
+            var configs = configuration.GetSection(parentKey).GetChildren();
+            foreach (IConfiguration config in configs)
+            {
+                if (config[key] != null)
+                {
+                    return config[key];
+                }
+            }
+            return "";
+        }
+
+        public string RandomString(int size, bool lowerCase)
+        {
+            StringBuilder builder = new StringBuilder();
+            Random random = new Random();
+            char ch;
+            for (int i = 0; i < size; i++)
+            {
+                ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
+                builder.Append(ch);
+            }
+            if (lowerCase)
+                return builder.ToString().ToLower();
+            return builder.ToString();
+        }
+
+        protected string convertToDateTimeServer(String date)
+        {
+            // date: 
+            DateTime oDateFrom = DateTime.Parse(date);
+            string hour = oDateFrom.Hour < 10 ? "0" + oDateFrom.Hour : oDateFrom.Hour.ToString();
+            string minute = oDateFrom.Minute < 10 ? "0" + oDateFrom.Minute : oDateFrom.Minute.ToString();
+            string second = oDateFrom.Second < 10 ? "0" + oDateFrom.Second : oDateFrom.Second.ToString();
+            string month = oDateFrom.Month < 10 ? "0" + oDateFrom.Month : oDateFrom.Month.ToString();
+            string day = oDateFrom.Day < 10 ? "0" + oDateFrom.Day : oDateFrom.Day.ToString();
+            string fromCheck = day + "/" + month + "/" + oDateFrom.Year + " " + hour + ":" + minute + ":" + second;
+            return fromCheck; //MM/dd/yyyy HH24:mm:ss
+        }
+
+        protected void CreateAuthToken(String account, Object userObj)
+        {
+            // create session authen
+            // Create the random value we will use to secure the session.
+            string authId = GenerateAuthId();
+
+            // Store the value in both our Session and a Cookie.
+            HttpContext.Session.SetString("AuthorizationCookieId", authId);
+            string sessionValue = HttpContext.Session.GetString("AuthorizationCookieId");
+            //CookieOptions option = new CookieOptions
+            //{
+            //    Expires = DateTime.Now.AddMinutes(1)
+            //};
+            //Response.Cookies.Append("Key Name", "Value", option);
+            CookieOptions options = new CookieOptions()
+            {
+                //Path = "/",
+                //HttpOnly = true,
+                Secure = true,
+                //SameSite = SameSiteMode.None
+                Expires = DateTime.Now.AddMinutes(60)
+            };
+            HttpContext.Response.Cookies.Append("AuthorizationCookie", authId, options);
+            string cookieValue = HttpContext.Request.Cookies["AuthorizationCookie"];
+
+
+            HttpContext.Session.SetString("account", account);
+            if (userObj != null)
+            {
+                HttpContext.Session.SetComplexData("userInfo", userObj); // SubInfoData
+            }
+        }
+
+
+        protected bool CheckAuthToken()
+        {
+            string cookieValue = HttpContext.Request.Cookies["AuthorizationCookie"];
+            string sessionValue = HttpContext.Session.GetString("AuthorizationCookieId");
+
+            if (cookieValue == null || sessionValue == null || cookieValue != sessionValue)
+            {
+                // Invalidate the session and log out the current user.
+                log.Warn("Cookie not match: cookieValue " + cookieValue + ", sessionValue: " + sessionValue);
+                return false;
+            }
+
+            // check vsaCheckRole
+            //if (useVsa == "1")
+            //{
+            //    var path = HttpContext.Request.Path.Value + HttpContext.Request.QueryString.Value;
+
+            //    return CheckRole(path);
+            //}
+            return true;
+        }
+
+        protected bool ClearCache()
+        {
+            HttpContext.Session.Clear();
+            foreach (var cookieKey in HttpContext.Request.Cookies.Keys)
+            {
+                if (cookieKey != "Language")
+                {
+                    HttpContext.Response.Cookies.Delete(cookieKey);
+                }
+            }
+            return true;
+        }
+
+        private string GenerateAuthId()
+        {
+            using (RandomNumberGenerator rng = new RNGCryptoServiceProvider())
+            {
+                byte[] tokenData = new byte[32];
+                rng.GetBytes(tokenData);
+                return Convert.ToBase64String(tokenData);
+            }
+        }
+
+        public void SetWsClient(ref WsLuckyCallClient wsClient, String sessionId)
+        {
+            int lastNum = sessionId[sessionId.Length - 1];
+            int wsId = lastNum % numWs + 1;
+            wsClient.Endpoint.Address = new EndpointAddress(configuration["wsUrl" + wsId]);
+            //using (new OperationContextScope(wsClient.InnerChannel))
+            //{
+            //    // Add a HTTP Header to an outgoing request
+            //    HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+            //    requestMessage.Headers["lang"] = getCurrentLang();
+            //    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+            //}
+        }
+
+        public static String DisplayMsisdn(String input)
+        {
+            if (input == null || input.Length == 0)
+            {
+                return "";
+            }
+            if (input.StartsWith("0"))
+            {
+                return input.Trim();
+            }
+            else if (input.StartsWith(CountryCode))
+            {
+                input = "0" + input.Substring(CountryCode.Length);
+            }
+            else
+            {
+                input = "0" + input;
+            }
+
+            return input.Trim();
+        }
+
+        public static String HiddenMsisdn(String input)
+        {
+            if (input == null || input.Length == 0)
+            {
+                return "";
+            }
+            if (input.StartsWith("0"))
+            {
+                input = input.Trim();
+            }
+            else if (input.StartsWith(CountryCode))
+            {
+                input = "0" + input.Substring(CountryCode.Length);
+            }
+            else
+            {
+                input = "0" + input;
+            }
+
+            return input.Substring(0, 4) + "***" + input.Substring(7);
+        }
+
+        public static String validateMsisdn(String input)
+        {
+            if (input == null || input.Length == 0)
+            {
+                return "";
+            }
+
+            if (input.StartsWith("+"))
+            {
+                input = input.Substring(1);
+            }
+            // check is number
+            try
+            {
+                input = long.Parse(input) + "";
+            }
+            catch
+            {
+                return "";
+            }
+            //
+            if (input.StartsWith("0"))
+            {
+                input = CountryCode + input.Substring(1);
+            }
+            else if (!input.StartsWith(CountryCode))
+            {
+                input = CountryCode + input;
+            }
+
+            return input.Trim();
+        }
+
+        public static bool IsInternalNumber(String input)
+        {
+            input = validateMsisdn(input);
+            if (input == null || input == "")
+            {
+                return false;
+            }
+            foreach (var prefix in listPrefixMsisdn)
+            {
+                if (input.StartsWith(prefix))
+                {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        // list prize
+        public static List<prizeObj> ListPrize()
+        {
+            if (listPrize != null)
+            {
+                return listPrize;
+            }
+            ServiceAPI.WsLuckyCallClient wsClient = new ServiceAPI.WsLuckyCallClient();
+            wsClient.Endpoint.Address = new EndpointAddress(wsUrl1);
+            response res = wsClient.wsLoadPrize(wsUser, wsPassword);
+            listPrize = res.listPrize.ToList();
+            return listPrize;
+        }
+
+
+        public static Dictionary<long, prizeObj> MapPrize()
+        {
+            if (listPrize == null)
+            {
+                listPrize = ListPrize();
+            }
+            Dictionary<long, prizeObj> mapPrize = new Dictionary<long, prizeObj>();
+            foreach (prizeObj prize in listPrize)
+            {
+                mapPrize.Add(prize.id, prize);
+            }
+            return mapPrize;
+        }
+
+        // list packg
+        public static List<productInfo> ListPackg()
+        {
+            if (listPackg != null)
+            {
+                return listPackg;
+            }
+            ServiceAPI.WsLuckyCallClient wsClient = new ServiceAPI.WsLuckyCallClient();
+            wsClient.Endpoint.Address = new EndpointAddress(wsUrl1);
+            response res = wsClient.wsLoadPackage(wsUser, wsPassword);
+            listPackg = res.listProduct.ToList();
+            return listPackg;
+        }
+
+        public String SendGet(String url, String token)
+        {
+            using (var client = new HttpClient())
+            {
+                // add header   
+                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
+                log.Debug("GET: " + url);
+
+                var response = client.GetAsync(url).Result;
+                if (response.IsSuccessStatusCode)
+                {
+                    var responseContent = response.Content;
+                    string responseString = responseContent.ReadAsStringAsync().Result;
+                    log.Debug("Response: " + responseString);
+                    return responseString;
+                }
+                else
+                {
+                    log.Error("Response: " + response.StatusCode.ToString());
+                    return response.StatusCode.ToString();
+                }
+            }
+        }
+
+        public async Task<String> SendPostAsync(String url, String token)
+        {
+            using (var client = new HttpClient())
+            {
+                var watch = System.Diagnostics.Stopwatch.StartNew();
+                // add header   
+                var parameters = new Dictionary<string, string>();
+                parameters.Add("token", token);
+                log.Debug("POST: " + url);
+
+                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
+                var response = await client.PostAsync(url, new FormUrlEncodedContent(parameters));
+
+                // the code that you want to measure comes here
+                watch.Stop();
+                log.Info("Time to POST " + url + ": " + watch.ElapsedMilliseconds + "ms");
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var responseContent = response.Content;
+                    string responseString = responseContent.ReadAsStringAsync().Result;
+                    log.Debug("Response: " + responseString);
+                    return responseString;
+                }
+                else
+                {
+                    log.Error("Response: " + response.StatusCode.ToString());
+                    return response.StatusCode.ToString();
+                }
+            }
+        }
+
+        public async Task<String> IdentifyMsisdn()
+        {
+            try
+            {
+                if (testMode == 1)
+                {
+                    string msisdn1 = "50935940980";
+                    HttpContext.Session.SetString("account", msisdn1);
+                    UserInfo userInfo = new UserInfo();
+                    userInfo.msisdn = msisdn1;
+                    userInfo.username = "test";
+                    CreateAuthToken(msisdn1, userInfo);
+                    return msisdn1;
+                }
+                String msisdn = HttpContext.Session.GetString("account");
+                //StringValues accessToken;
+                //StringValues msisdnHeader;
+
+                //log.Debug("Headers:");
+                //foreach (var header in Request.Headers)
+                //{
+                //    log.Debug(header.Key + "=" + header.Value);
+                //}
+
+                //HttpContext.Request.Headers.TryGetValue("access-token", out accessToken);
+                //HttpContext.Request.Headers.TryGetValue("phone-number", out msisdnHeader);
+                String token = HttpContext.Request.Query["token"].ToString();
+                log.Info("Token from request: " + token);
+                if (!StringValues.IsNullOrEmpty(token))
+                {
+                    String msisdnToCheck = "";// validateMsisdn(msisdnHeader[0]);
+
+                    if (msisdn == null || msisdn != msisdnToCheck || (token != null && token != "" && token != (HttpContext.Session.GetString("access-token"))))
+                    {
+                        string result = await SendPostAsync(configuration["urlMochaMsisdn"], token);
+
+                        GetSubInfoRes res = JsonConvert.DeserializeObject<GetSubInfoRes>(result);
+                        //
+                        if (res != null && res.data != null)
+                        {
+                            log.Info("validate msisdn: " + res.data.msisdn);
+                            msisdnToCheck = validateMsisdn(res.data.msisdn);
+                            log.Info("Detect success: " + msisdn);
+                            // channel = 1: auto detect via NatID
+                            HttpContext.Session.SetString("channel", "1");
+                            // set account session
+                            HttpContext.Session.SetString("account", msisdnToCheck);
+                            HttpContext.Session.SetString("access-token", token);
+                            UserInfo userInfo = new UserInfo();
+                            userInfo.msisdn = msisdnToCheck;
+                            userInfo.username = res.data.name;
+                            CreateAuthToken(msisdnToCheck, userInfo);
+                            return msisdnToCheck;
+
+                        }
+                        else
+                        {
+                            return null;
+                        }
+                    }
+                    // if already login
+                    return msisdn;
+                }
+                else
+                {
+                    if (msisdn == null || msisdn == "")
+                    {
+                        return "NOT_FOUND";
+                    }
+                }
+                // not found header
+                return msisdn;
+            }
+            catch (Exception ex)
+            {
+                log.Error("Error identify msisdn: " + ex.Message, ex);
+                return null;
+            }
+        }
+
+        public String SendPostParam(log4net.ILog log, GetMsisdnReq obj, String type)
+        {
+            StringBuilder sb = new StringBuilder();
+            sb.Append("Send post param " + type + ": ").Append("\n");
+            sb.Append("\tRequest:" + JsonConvert.SerializeObject(obj)).Append("\n");
+            String result = SendPostParam(obj, type);
+            sb.Append("\tResponse:" + result);
+            log.Info(sb);
+            return result;
+        }
+        public String SendPostParam(GetMsisdnReq obj, String type)
+        {
+            //var json = JsonConvert.SerializeObject(obj);
+            //var data = new StringContent(json, Encoding.UTF8, "application/json");
+
+            var url = configuration[type] + AppendUrlParam(obj);
+            using (var client = new HttpClient())
+            {
+                var response = client.PostAsync(url, null).Result;
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var responseContent = response.Content;
+
+                    // by calling .Result you are synchronously reading the result
+                    string responseString = responseContent.ReadAsStringAsync().Result;
+
+                    return responseString;
+                }
+                return response.StatusCode.ToString();
+            }
+        }
+
+        public String AppendUrlParam(Object obj)
+        {
+            Type type = obj.GetType();
+            String append = "?";
+
+            foreach (var f in type.GetProperties())
+            {
+                append += f.Name + "=" + f.GetValue(obj) + "&";
+            }
+            return append.Substring(0, append.Length - 1);
+        }
+
+
+        public string Decode(string token, bool verify = true)
+        {
+            string key = configuration["PublicKeyMocha"];
+            string[] parts = token.Split('.');
+            string header = parts[0];
+            string payload = parts[1];
+            byte[] crypto = Base64UrlDecode(parts[2]);
+
+            string headerJson = Encoding.UTF8.GetString(Base64UrlDecode(header));
+            JObject headerData = JObject.Parse(headerJson);
+
+            string payloadJson = Encoding.UTF8.GetString(Base64UrlDecode(payload));
+            JObject payloadData = JObject.Parse(payloadJson);
+
+            if (verify)
+            {
+                var keyBytes = Convert.FromBase64String(key); // your key here
+
+                AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(keyBytes);
+                RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)asymmetricKeyParameter;
+                RSAParameters rsaParameters = new RSAParameters();
+                rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned();
+                rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned();
+                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
+                rsa.ImportParameters(rsaParameters);
+
+                SHA256 sha256 = SHA256.Create();
+                byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(parts[0] + '.' + parts[1]));
+
+                RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
+                rsaDeformatter.SetHashAlgorithm("SHA256");
+                if (!rsaDeformatter.VerifySignature(hash, FromBase64Url(parts[2])))
+                    throw new ApplicationException(string.Format("Invalid signature"));
+            }
+
+            return payloadData.ToString();
+        }
+        private byte[] FromBase64Url(string base64Url)
+        {
+            string padded = base64Url.Length % 4 == 0
+                ? base64Url : base64Url + "====".Substring(base64Url.Length % 4);
+            string base64 = padded.Replace("_", "/")
+                                  .Replace("-", "+");
+            return Convert.FromBase64String(base64);
+        }
+
+        // from JWT spec
+        private string Base64UrlEncode(byte[] input)
+        {
+            var output = Convert.ToBase64String(input);
+            output = output.Split('=')[0]; // Remove any trailing '='s
+            output = output.Replace('+', '-'); // 62nd char of encoding
+            output = output.Replace('/', '_'); // 63rd char of encoding
+            return output;
+        }
+
+        // from JWT spec
+        private byte[] Base64UrlDecode(string input)
+        {
+            var output = input;
+            output = output.Replace('-', '+'); // 62nd char of encoding
+            output = output.Replace('_', '/'); // 63rd char of encoding
+            switch (output.Length % 4) // Pad with trailing '='s
+            {
+                case 0: break; // No pad chars in this case
+                case 2: output += "=="; break; // Two pad chars
+                case 3: output += "="; break; // One pad char
+                default: throw new System.Exception("Illegal base64url string!");
+            }
+            var converted = Convert.FromBase64String(output); // Standard base64 decoder
+            return converted;
+        }
+        public static String getCurrentLang()
+        {
+            if (CultureInfo.CurrentCulture.Name.ToUpper() == "EN")
+            {
+                return "2";
+            }
+            return "1";
+        }
+
+        public static String getCurrentLangText()
+        {
+            if (CultureInfo.CurrentCulture.Name.ToUpper() == "EN")
+            {
+                return "en";
+            }
+            return "fr";
+        }
+
+        // SESSION MANAGER
+        public void LoginFailAction()
+        {
+            SessionObj sessionObj = HttpContext.Session.GetComplexData<SessionObj>("sessionObj");
+            if (sessionObj == null)
+            {
+                sessionObj = new SessionObj();
+            }
+            sessionObj.lastLogin = DateTime.Now;
+            sessionObj.wrongTimes = sessionObj.wrongTimes + 1;
+            if (sessionObj.wrongTimes >= SessionObj.maxWrong)
+            {
+                sessionObj.lockUntil = DateTime.Now.AddMinutes(SessionObj.lockLogin);
+            }
+            HttpContext.Session.SetComplexData("sessionObj", sessionObj);
+        }
+        public void SetLastResetPass()
+        {
+            SessionObj sessionObj = HttpContext.Session.GetComplexData<SessionObj>("sessionObj");
+            if (sessionObj == null)
+            {
+                sessionObj = new SessionObj();
+            }
+            sessionObj.lastResetPassword = DateTime.Now;
+            HttpContext.Session.SetComplexData("sessionObj", sessionObj);
+        }
+
+        public void SetLastSignUp()
+        {
+            SessionObj sessionObj = HttpContext.Session.GetComplexData<SessionObj>("sessionObj");
+            if (sessionObj == null)
+            {
+                sessionObj = new SessionObj();
+            }
+            sessionObj.lastSignUp = DateTime.Now;
+            HttpContext.Session.SetComplexData("sessionObj", sessionObj);
+        }
+
+        public void LoginSuccessAction()
+        {
+            SessionObj sessionObj = HttpContext.Session.GetComplexData<SessionObj>("sessionObj");
+            if (sessionObj == null)
+            {
+                sessionObj = new SessionObj();
+            }
+            sessionObj.lastLogin = DateTime.Now;
+            sessionObj.wrongTimes = 0;
+            sessionObj.lockUntil = null;
+            HttpContext.Session.SetComplexData("sessionObj", sessionObj);
+        }
+        public CheckSessionRes CheckSessionValid(int action)
+        {
+            CheckSessionRes res = new CheckSessionRes();
+
+            SessionObj sessionObj = HttpContext.Session.GetComplexData<SessionObj>("sessionObj");
+            if (sessionObj == null)
+            {
+                sessionObj = new SessionObj();
+                HttpContext.Session.SetComplexData("sessionObj", sessionObj);
+                //Session["sessionObj"] = sessionObj;
+            }
+
+            // check
+            if (action == ActionSession.Login)
+            {
+                if (sessionObj.lockUntil != null && sessionObj.lockUntil.Value > DateTime.Now)
+                {
+                    res.errorCode = "1";
+                    res.content = Lang.AccountLocked;//"Too many times wrong. Please wait until " + sessionObj.lockUntil.Value.ToString(df);
+                    res.lockUntil = sessionObj.lockUntil;
+                    return res;
+                }
+            }
+
+            DateTime waitUntil;
+            if (action == ActionSession.Resetpass)
+            {
+                if (sessionObj.lastResetPassword != null && (waitUntil = sessionObj.lastResetPassword.Value.AddMinutes(SessionObj.waitTime)) > DateTime.Now)
+                {
+                    // wait next reset password
+                    res.errorCode = "2";
+                    res.content = Lang.WaitNextReset.Replace("%until%", waitUntil.ToString(df)); //"Wait for next reset password until " + waitUntil.ToString(df);
+                    return res;
+                }
+            }
+
+            if (action == ActionSession.SignUp)
+            {
+                if (sessionObj.lastSignUp != null && (waitUntil = sessionObj.lastSignUp.Value.AddMinutes(SessionObj.waitTime)) > DateTime.Now)
+                {
+                    // wait next reset password
+                    res.errorCode = "3";
+                    res.content = Lang.WaitNextSignup.Replace("%until%", waitUntil.ToString(df)); //"Wait for next sign up until " + waitUntil.ToString(df);
+                    return res;
+                }
+            }
+            res.errorCode = "0";
+            return res;
+        }
+    }
+}

+ 685 - 0
LuckyCallWebCore/LuckyCallWebCore/Controllers/HomeController.cs

@@ -0,0 +1,685 @@
+using log4net;
+using LuckyCallWebCore.Source;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using ServiceAPI;
+using System;
+using LuckyCallWebCore.Extensions;
+using LuckyCallWebCore.Models;
+using Microsoft.Extensions.Primitives;
+using Newtonsoft.Json;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.Threading.Tasks;
+using Nat_LuckyCall.Resources;
+
+namespace LuckyCallWebCore.Controllers
+{
+    public class HomeController : BaseController
+    {
+
+        private ILog log = LogManager.GetLogger("HomeController");
+
+        ServiceAPI.WsLuckyCallClient wsClient = new ServiceAPI.WsLuckyCallClient();
+
+        public HomeController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment) : base(_configuration, hostEnvironment)
+        {
+            // init 
+        }
+
+        public async Task<IActionResult> Index()
+        {
+            var account = await IdentifyMsisdn();
+
+            if (account == "NOT_FOUND")
+            {
+                //return Redirect("/Home/Guide");
+                return Redirect("/Home/Login");
+            }
+            if (account == null)
+            {
+                //return Redirect("/Home/NotSupport");
+                return Redirect("/Home/Login");
+            }
+            ReloadUserInfo(account);
+
+            SetWsClient(ref wsClient, account);
+            using (new OperationContextScope(wsClient.InnerChannel))
+            {
+                // Add a HTTP Header to an outgoing request
+                HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+                requestMessage.Headers["lang"] = getCurrentLang();
+                OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+                response res = wsClient.wsGetListWinner(wsUser, wsPassword, null, "3", "1", "1", "-1", "-1");
+                if (res.listWinner != null && res.listWinner.Length > 0)
+                {
+                    var lastMonthWinner = res.listWinner[0];
+                    lastMonthWinner.msisdn = HiddenMsisdn(lastMonthWinner.msisdn);
+                    HttpContext.Session.SetComplexData("lastMonthWinner", lastMonthWinner);
+                }
+            }
+            return await Task.Run(() => View());
+
+            // return View();
+        }
+
+        public IActionResult Login()
+        {
+            return View();
+        }
+
+        public IActionResult Logout()
+        {
+            try
+            {
+                ClearCache();
+                //return Redirect("mytel://home");
+                return Redirect("/Home/Login");
+            }
+            catch (Exception ex)
+            {
+                log.Error("Exception " + ex);
+                return Redirect("/Home/Error");
+            }
+        }
+
+
+        [HttpPost]
+        public IActionResult LogoutAction()
+        {
+            ClearCache();
+            return Json(new
+            {
+                error = "0"
+            });
+        }
+
+        public IActionResult NotSupport()
+        {
+            try
+            {
+                //ClearCache();
+                return View();
+            }
+            catch (Exception ex)
+            {
+                log.Error("Exception " + ex);
+                return Redirect("/Home/Error");
+            }
+        }
+
+        private void ReloadUserInfo(String username)
+        {
+            // store session
+            UserInfo userInfo = new UserInfo();
+            userInfo.msisdn = username;
+            userInfo.username = username;
+            //userInfo.remain_spin = 3;
+
+            SetWsClient(ref wsClient, username);
+
+            // get sub info
+            using (new OperationContextScope(wsClient.InnerChannel))
+            {
+                // Add a HTTP Header to an outgoing request
+                HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+                requestMessage.Headers["lang"] = getCurrentLang();
+                OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+
+
+                response resSub = wsClient.wsGetSubInfo(wsUser, wsPassword, username);
+                userInfo.spinInfo = resSub.spinResult;
+                userInfo.total_spin = userInfo.spinInfo.totalSpin;
+                //
+                if (resSub.listRegInfo != null && resSub.listRegInfo.Length > 0)
+                {
+                    userInfo.regInfo = resSub.listRegInfo[0];
+                    userInfo.total_spin = userInfo.total_spin + userInfo.regInfo.remainQuestion;
+                }
+                // coin
+                userInfo.userCoin = resSub.userCoin;
+
+                // store
+                HttpContext.Session.SetComplexData("userInfo", userInfo);
+            }
+        }
+
+        public IActionResult LuckyDraw()
+        {
+            UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
+            if (!CheckAuthToken() || userInfo == null)
+            {
+                return Redirect("mytel://home");
+            }
+
+            //if (userInfo.remain_spin == 0)
+            //{
+            //    return Redirect("/Home/Prize");
+            //}
+            return View();
+        }
+
+        public async Task<IActionResult> UserPrize(String page)
+        {
+            String account = HttpContext.Session.GetString("account");
+            UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
+            if (!CheckAuthToken() || userInfo == null)
+            {
+                return Redirect("mytel://home");
+            }
+
+            // get user prize
+            page = page ?? "1";
+            String rowOnPage = configuration["pageSize"];
+
+
+            SetWsClient(ref wsClient, account);
+            using (new OperationContextScope(wsClient.InnerChannel))
+            {
+                // Add a HTTP Header to an outgoing request
+                HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+                requestMessage.Headers["lang"] = getCurrentLang();
+                OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+                response res = wsClient.wsGetListWinner(wsUser, wsPassword, userInfo.msisdn, "-1", page, rowOnPage, "-1", "1");
+
+                // model
+                LuckyWheelModel model = new LuckyWheelModel();
+                model.page = page;
+                model.pageSize = rowOnPage;
+                model.totalPage = res.totalPage;
+                model.listWinner = res.listWinner;
+                return View(model);
+            }
+        }
+
+
+        public async Task<IActionResult> WinnerList()
+        {
+            String account = HttpContext.Session.GetString("account");
+            UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
+            if (!CheckAuthToken() || userInfo == null)
+            {
+                return Redirect("mytel://home");
+            }
+
+            return await Task.Run(() => View());
+        }
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public async Task<IActionResult> GetWinner(String page, String period)
+        {
+            String account = HttpContext.Session.GetString("account");
+            UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
+            if (!CheckAuthToken() || userInfo == null)
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = "Timeout",
+                    href = "mytel://home"
+                });
+            }
+
+            // get user prize
+            page = page ?? "1";
+            String rowOnPage = configuration["pageSize"];
+
+            SetWsClient(ref wsClient, account);
+            using (new OperationContextScope(wsClient.InnerChannel))
+            {
+                // Add a HTTP Header to an outgoing request
+                HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+                requestMessage.Headers["lang"] = getCurrentLang();
+                OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+                response res = wsClient.wsGetListWinner(wsUser, wsPassword, null, period, page, rowOnPage, "-1", "-1");
+                if (res.listWinner != null)
+                {
+                    for (int i = 0; i < res.listWinner.Length; i++)
+                    {
+                        res.listWinner[i].msisdn = HiddenMsisdn(res.listWinner[i].msisdn);
+                    }
+                }
+                // model
+                LuckyWheelModel model = new LuckyWheelModel();
+                model.page = page;
+                model.pageSize = rowOnPage;
+                model.totalPage = res.totalPage;
+                model.listWinner = res.listWinner;
+                return PartialView("../Partial/_Winner", model);
+            }
+        }
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public IActionResult GetTopCoin()
+        {
+            String account = HttpContext.Session.GetString("account");
+            UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
+            if (!CheckAuthToken() || userInfo == null)
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = "Timeout",
+                    href = "mytel://home"
+                });
+            }
+
+            // get user prize
+            String rowOnPage = configuration["pageSize"];
+            String size = "30";
+
+            SetWsClient(ref wsClient, account);
+            using (new OperationContextScope(wsClient.InnerChannel))
+            {
+                // Add a HTTP Header to an outgoing request
+                HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+                requestMessage.Headers["lang"] = getCurrentLang();
+                OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+                //
+                response res = wsClient.wsGetTopCoin(wsUser, wsPassword, size);
+
+                // model
+                LuckyWheelModel model = new LuckyWheelModel();
+                model.page = "1";
+                model.pageSize = rowOnPage;
+                if (res.listUserCoin != null)
+                {
+                    model.totalPage = Convert.ToInt32(Math.Ceiling(res.listUserCoin.Length / decimal.Parse(rowOnPage)));
+                    for (int i = 0; i < res.listUserCoin.Length; i++)
+                    {
+                        res.listUserCoin[i].msisdn = HiddenMsisdn(res.listUserCoin[i].msisdn);
+                    }
+                }
+                model.listUserCoin = res.listUserCoin;
+
+
+                response resRank = wsClient.wsGetUserRank(wsUser, wsPassword, userInfo.msisdn);
+                model.userCoin = resRank.userCoin;
+                return PartialView("../Partial/_TopCoin", model);
+            }
+        }
+
+        public IActionResult Guide()
+        {
+            string currentLang = getCurrentLang();
+            return View("Guide_" + currentLang);
+        }
+
+
+        public IActionResult Error()
+        {
+            return View();
+        }
+
+
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public async Task<JsonResult> SpinAction()
+        {
+
+            String account = HttpContext.Session.GetString("account");
+            UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
+            if (!CheckAuthToken() || userInfo == null)
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = "Timeout",
+                    href = "mytel://home"
+                });
+            }
+            if (userInfo.total_spin > 0)
+            {
+                SetWsClient(ref wsClient, account);
+                using (new OperationContextScope(wsClient.InnerChannel))
+                {
+                    // Add a HTTP Header to an outgoing request
+                    HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+                    requestMessage.Headers["lang"] = getCurrentLang();
+                    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+                    response res = wsClient.wsDoSpin(wsUser, wsPassword, userInfo.msisdn, BaseController.channel);
+
+                    if (res.errorCode == "0")
+                    {
+                        // check prize add spin
+                        spinResultObj spinResult = res.spinResult;
+                        userInfo.spinInfo = spinResult;
+                        prizeObj prizeObj = MapPrize()[spinResult.prizeId];
+                        HttpContext.Session.SetComplexData("userInfo", userInfo);
+
+                        return Json(new
+                        {
+                            error = "0",
+                            content = res.content,
+                            prize = prizeObj,
+                            remainSpin = userInfo.spinInfo.remainSpin,
+                            totalSpin = userInfo.spinInfo.totalSpin,
+                            usedSpin = userInfo.spinInfo.usedSpin,
+                            totalCoin = userInfo.spinInfo.totalCoin,
+                            lastAction = prizeObj.actionCode
+                        });
+                    }
+                    else
+                    {
+                        return Json(new
+                        {
+                            error = res.errorCode,
+                            content = res.content
+                        });
+                    }
+                }
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "1",
+                    content = "Out of spin"
+                });
+            }
+        }
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public async Task<JsonResult> RegisterOtp(String packageName)
+        {
+            String account = HttpContext.Session.GetString("account");
+            UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
+            if (!CheckAuthToken() || userInfo == null)
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = "Timeout",
+                    href = "mytel://home"
+                });
+            }
+
+            SetWsClient(ref wsClient, account);
+            using (new OperationContextScope(wsClient.InnerChannel))
+            {
+                // Add a HTTP Header to an outgoing request
+                HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+                requestMessage.Headers["lang"] = getCurrentLang();
+                OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+                response res = wsClient.wsRegisterSubOtp(wsUser, wsPassword, userInfo.msisdn, packageName, BaseController.channel);
+
+                if (res.errorCode == "0" || res.errorCode == "100")
+                {
+                    RequestOtp requestOtp = new RequestOtp();
+                    requestOtp.msisdn = userInfo.msisdn;
+                    requestOtp.packageName = packageName;
+                    requestOtp.requestId = res.resultCode;
+                    HttpContext.Session.SetComplexData("requestOtp", requestOtp);
+                    return Json(new
+                    {
+                        error = res.errorCode,
+                        content = res.content
+                    });
+                }
+                else
+                {
+                    return Json(new
+                    {
+                        error = res.errorCode,
+                        content = res.content
+                    });
+                }
+            }
+
+        }
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public async Task<JsonResult> RegisterConfirm(String otp)
+        {
+            String account = HttpContext.Session.GetString("account");
+            UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
+            RequestOtp requestOtp = HttpContext.Session.GetComplexData<RequestOtp>("requestOtp");
+            if (!CheckAuthToken() || userInfo == null)
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = "Timeout",
+                    href = "mytel://home"
+                });
+            }
+
+            SetWsClient(ref wsClient, account);
+            using (new OperationContextScope(wsClient.InnerChannel))
+            {
+                // Add a HTTP Header to an outgoing request
+                HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+                requestMessage.Headers["lang"] = getCurrentLang();
+                OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+                response res = wsClient.wsRegisterSubConfirm(wsUser, wsPassword, userInfo.msisdn, requestOtp.packageName, requestOtp.requestId, otp, BaseController.channel);
+
+                if (res.errorCode == "0")
+                {
+                    return Json(new
+                    {
+                        error = "0",
+                        content = res.content
+                    });
+                }
+                else
+                {
+                    return Json(new
+                    {
+                        error = res.errorCode,
+                        content = res.content
+                    });
+                }
+            }
+        }
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public async Task<JsonResult> CancelConfirm(String packageName)
+        {
+            String account = HttpContext.Session.GetString("account");
+            UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
+            if (!CheckAuthToken() || userInfo == null)
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = "Timeout",
+                    href = "mytel://home"
+                });
+            }
+
+            SetWsClient(ref wsClient, account);
+            using (new OperationContextScope(wsClient.InnerChannel))
+            {
+                // Add a HTTP Header to an outgoing request
+                HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
+                requestMessage.Headers["lang"] = getCurrentLang();
+                OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
+                response res = wsClient.wsCancelSub(wsUser, wsPassword, account, packageName, channel);
+
+                if (res.errorCode == "0")
+                {
+                    return Json(new
+                    {
+                        error = res.errorCode,
+                        content = res.content
+                    });
+                }
+                else
+                {
+                    return Json(new
+                    {
+                        error = res.errorCode,
+                        content = res.content
+                    });
+                }
+            }
+
+        }
+
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public JsonResult LoginAction(String phoneNumber, string password)
+        {
+
+            String msisdn = validateMsisdn(phoneNumber);
+
+            CheckSessionRes checkSession = CheckSessionValid(ActionSession.Login);
+            if (checkSession.errorCode != "0")
+            {
+                return Json(new
+                {
+                    error = checkSession.errorCode,
+                    content = checkSession.content,
+                    msisdn = msisdn.Substring(3)
+                });
+            }
+
+            if (msisdn != "")
+            {
+                ServiceAPI.response subInfo = null;
+                SetWsClient(ref wsClient, msisdn);
+                ServiceAPI.response res = wsClient.wsLogin(wsUser, wsPassword, password, msisdn);
+
+                if (res.errorCode == "0")
+                {
+                    // login success --> store session
+                    CreateAuthToken(msisdn, null);
+                    ReloadUserInfo(msisdn);
+                    LoginSuccessAction();
+                }
+                else
+                {
+                    LoginFailAction();
+                }
+
+                if (subInfo != null)
+                {
+                    return Json(new
+                    {
+                        error = res.errorCode,
+                        content = res.content,
+                        msisdn = msisdn.Substring(3)
+                    });
+                }
+                else
+                {
+                    return Json(new
+                    {
+                        error = res.errorCode,
+                        content = res.content,
+                        msisdn = msisdn.Substring(3)
+                    });
+                }
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = Lang.LoginFailed
+                });
+            }
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult SignupAction(String phoneNumber, string captcharesponse)
+        {
+            //if (Check(captcharesponse) == false)
+            //{
+            //    return Json(new
+            //    {
+            //        error = "16",
+            //        content = Lang.CaptchaInvalid
+            //    });
+            //}
+
+            CheckSessionRes checkSession = CheckSessionValid(ActionSession.SignUp);
+            if (checkSession.errorCode != "0")
+            {
+                return Json(new
+                {
+                    error = checkSession.errorCode,
+                    content = checkSession.content
+                });
+            }
+
+            String msisdn = validateMsisdn(phoneNumber);
+            if (msisdn != "")
+            {
+                SetWsClient(ref wsClient, msisdn);
+                ServiceAPI.response res = wsClient.wsCreateAccount(wsUser, wsPassword, "", msisdn);
+
+                if (res.errorCode == "0")
+                {
+                    // signup success --> store session
+                    SetLastSignUp();
+                    CreateAuthToken(msisdn, null);
+                    ReloadUserInfo(msisdn);
+                }
+
+                return Json(new
+                {
+                    error = res.errorCode,
+                    content = res.content,
+                    msisdn = msisdn.Substring(3)
+                });
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = Lang.InvalidMsisdn
+                });
+            }
+        }
+
+
+        [ValidateAntiForgeryToken]
+        public JsonResult ResetPassword(String phoneNumber, string captcharesponse)
+        {
+
+            CheckSessionRes checkSession = CheckSessionValid(ActionSession.Resetpass);
+            if (checkSession.errorCode != "0")
+            {
+                return Json(new
+                {
+                    error = checkSession.errorCode,
+                    content = checkSession.content
+                });
+            }
+
+            String msisdn = validateMsisdn(phoneNumber);
+            if (msisdn != "")
+            {
+                SetWsClient(ref wsClient, msisdn);
+                ServiceAPI.response res = wsClient.wsResetPassword(wsUser, wsPassword, msisdn);
+
+                SetLastResetPass();
+                return Json(new
+                {
+                    error = res.errorCode,
+                    content = res.content
+                });
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = Lang.InvalidMsisdn
+                });
+            }
+        }
+
+    }
+}

+ 24 - 0
LuckyCallWebCore/LuckyCallWebCore/Controllers/LanguageController.cs

@@ -0,0 +1,24 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Localization;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Globalization;
+using System.Threading;
+
+namespace WebPortal.Controllers
+{
+    public class LanguageController : Controller
+    {
+        [HttpPost]
+        public IActionResult ChangeLanguage(string LanguageAbbrevation, string returnUrl)
+        {
+            Response.Cookies.Append(
+               CookieRequestCultureProvider.DefaultCookieName,
+               CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(LanguageAbbrevation)),
+               new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
+            );
+            //return LocalRedirect(returnUrl);
+            return Json(new { error = "0" });
+        }
+    }
+}

+ 439 - 0
LuckyCallWebCore/LuckyCallWebCore/Controllers/SubscriberController.cs

@@ -0,0 +1,439 @@
+using log4net;
+using LuckyCallWebCore.Source;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using ServiceAPI;
+using System;
+using LuckyCallWebCore.Extensions;
+using LuckyCallWebCore.Models;
+using Microsoft.Extensions.Primitives;
+using Newtonsoft.Json;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.Threading.Tasks;
+
+namespace LuckyCallWebCore.Controllers
+{
+    public class SubscriberController : BaseController
+    {
+        private static ILog log = LogManager.GetLogger("SubscriberController");
+
+
+        ServiceAPI.WsLuckyCallClient wsClient = new ServiceAPI.WsLuckyCallClient();
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public JsonResult Subscribe(String msisdn, String packName)
+        {
+            if (msisdn == null || msisdn.Trim() == "")
+            {
+                msisdn = HttpContext.Session.GetString("msisdn");
+            }
+            if (msisdn != "" && msisdn != null)
+            {
+                msisdn = validateMsisdn(msisdn);
+                SetWsClient(ref wsClient, msisdn);
+
+                //ServiceAPI.response subInfo = wsClient.wsGetSubInfo(wsUser, wsPassword, msisdn);
+                ServiceAPI.response res = null;
+                res = wsClient.wsRegisterSubOtp(wsUser, wsPassword, msisdn, packName);
+
+                if (res.errorCode == "0")
+                {
+                    // success
+                }
+                else if (res.errorCode == "100")
+                {
+                    // need confirm
+                    RequestTemp reqTemp = new RequestTemp();
+                    reqTemp.packName = packName;
+                    reqTemp.requestId = res.resultCode;
+                    reqTemp.msisdn = msisdn;
+                    Session["reqTemp"] = reqTemp;
+                }
+                return Json(new
+                {
+                    error = res.errorCode,
+                    content = res.content,
+                    msisdn = msisdn.Substring(3)
+                });
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = Lang.InvalidMsisdn
+                });
+            }
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult SubscribeConfirm(String otp)
+        {
+            RequestTemp reqTemp = Session["reqTemp"] as RequestTemp;
+            if (reqTemp == null)
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = "Timeout",
+                    href = "/Home/Index"
+                });
+            }
+
+
+            String msisdn = reqTemp.msisdn;
+            if (msisdn != "" && msisdn != null)
+            {
+                CommonUtils.SetWsClient(ref wsClient, Session.SessionID);
+
+                //ServiceAPI.response subInfo = wsClient.wsGetSubInfo(wsUser, wsPassword, msisdn);
+                ServiceAPI.response res = null;
+
+                String channel = ConfigurationManager.AppSettings["reddemChannel"];
+                res = wsClient.wsRegisterSubConfirm(wsUser, wsPassword, msisdn, reqTemp.packName, otp);
+
+                if (res.errorCode == "0")
+                {
+                    // login success --> store session
+                    Session["msisdn"] = msisdn;
+                    Session["account"] = wsClient.wsGetSubInfo(wsUser, wsPassword, msisdn);
+                }
+
+                return Json(new
+                {
+                    error = res.errorCode,
+                    content = res.content,
+                    msisdn = msisdn.Substring(3)
+                });
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = "Timeout"
+                });
+            }
+        }
+
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public JsonResult LoginAction(String phoneNumber, string password, string captcharesponse)
+        {
+
+            String msisdn = CommonUtils.validateMsisdn(phoneNumber);
+
+            CheckSessionRes checkSession = CheckSessionValid(ActionSession.Login);
+            if (checkSession.errorCode != "0")
+            {
+                return Json(new
+                {
+                    error = checkSession.errorCode,
+                    content = checkSession.content,
+                    msisdn = msisdn.Substring(3)
+                });
+            }
+
+            if (msisdn != "")
+            {
+                ServiceAPI.response subInfo = null;
+                CommonUtils.SetWsClient(ref wsClient, Session.SessionID);
+                ServiceAPI.response res = wsClient.wsLogin(wsUser, wsPassword, password, msisdn);
+
+                if (res.errorCode == "0")
+                {
+                    // login success --> store session
+                    Session["msisdn"] = msisdn;
+                    subInfo = wsClient.wsGetSubInfo(wsUser, wsPassword, msisdn);
+                    Session["account"] = subInfo;
+                    LoginSuccessAction();
+                }
+                else
+                {
+                    LoginFailAction();
+                }
+
+                if (subInfo != null)
+                {
+                    return Json(new
+                    {
+                        error = res.errorCode,
+                        content = res.content,
+                        msisdn = msisdn.Substring(3)
+                    });
+                }
+                else
+                {
+                    return Json(new
+                    {
+                        error = res.errorCode,
+                        content = res.content,
+                        msisdn = msisdn.Substring(3)
+                    });
+                }
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = Lang.InvalidMsisdn
+                });
+            }
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult SignupAction(String phoneNumber, string captcharesponse)
+        {
+            //if (Check(captcharesponse) == false)
+            //{
+            //    return Json(new
+            //    {
+            //        error = "16",
+            //        content = Lang.CaptchaInvalid
+            //    });
+            //}
+
+            CheckSessionRes checkSession = CheckSessionValid(ActionSession.SignUp);
+            if (checkSession.errorCode != "0")
+            {
+                return Json(new
+                {
+                    error = checkSession.errorCode,
+                    content = checkSession.content
+                });
+            }
+
+            String msisdn = CommonUtils.validateMsisdn(phoneNumber);
+            if (msisdn != "")
+            {
+                CommonUtils.SetWsClient(ref wsClient, Session.SessionID);
+                ServiceAPI.response res = wsClient.wsCreateAccount(wsUser, wsPassword, "", msisdn, "1");
+
+                if (res.errorCode == "0")
+                {
+                    // signup success --> store session
+                    SetLastSignUp();
+
+                    Session["msisdn"] = msisdn;
+                    ViewBag.msisdn = msisdn;
+                    CommonUtils.SetWsClient(ref wsClient, Session.SessionID);
+                    ServiceAPI.response subInfo = wsClient.wsGetSubInfo(wsUser, wsPassword, msisdn);
+                    Session["account"] = subInfo;
+                }
+
+                return Json(new
+                {
+                    error = res.errorCode,
+                    content = res.content,
+                    msisdn = msisdn.Substring(3)
+                });
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = Lang.InvalidMsisdn
+                });
+            }
+        }
+
+
+        [ValidateAntiForgeryToken]
+        public JsonResult ResetPassword(String phoneNumber, string captcharesponse)
+        {
+            //if (Check(captcharesponse) == false)
+            //{
+            //    return Json(new
+            //    {
+            //        error = "16",
+            //        content = Lang.CaptchaInvalid
+            //    });
+            //}
+            CheckSessionRes checkSession = CheckSessionValid(ActionSession.Resetpass);
+            if (checkSession.errorCode != "0")
+            {
+                return Json(new
+                {
+                    error = checkSession.errorCode,
+                    content = checkSession.content
+                });
+            }
+
+            String wsUser = ConfigurationManager.AppSettings["wsUser"];
+            String wsPassword = ConfigurationManager.AppSettings["wsPassword"];
+
+            String msisdn = CommonUtils.validateMsisdn(phoneNumber);
+            if (msisdn != "")
+            {
+                ServiceAPI.WsMillionClient wsClient = new ServiceAPI.WsMillionClient();
+                CommonUtils.SetWsClient(ref wsClient, Session.SessionID);
+                ServiceAPI.response res = wsClient.wsResetPassword(wsUser, wsPassword, msisdn);
+
+                SetLastResetPass();
+                return Json(new
+                {
+                    error = res.errorCode,
+                    content = res.content
+                });
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1",
+                    content = Lang.InvalidMsisdn
+                });
+            }
+        }
+
+        [HttpPost]
+        public JsonResult CancelService()
+        {
+            String msisdn = Session["msisdn"] as String;
+            if (msisdn != "" && msisdn != null)
+            {
+                wsClient.Endpoint.Address = GetWsEndpoint();
+                var res = wsClient.wsCancelService(wsUser, wsPassword, msisdn);
+
+                if (res.errorCode == "0")
+                {
+                    Session["account"] = wsClient.wsGetSubInfo(wsUser, wsPassword, msisdn);
+                }
+                return Json(new
+                {
+                    error = res.errorCode,
+                    content = res.content,
+                    msisdn = msisdn.Substring(3)
+                });
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1"
+                });
+            }
+        }
+
+
+        [HttpPost]
+        public JsonResult BuyTurnOtp(String numTurn)
+        {
+            String msisdn = Session["msisdn"] as String;
+            if (msisdn != "" && msisdn != null)
+            {
+
+                log.Info("BuyTurn " + msisdn + ", numTurn: " + numTurn);
+
+                wsClient.Endpoint.Address = GetWsEndpoint();
+                response res = wsClient.wsBuyTurnOtp(wsUser, wsPassword, msisdn, numTurn);
+
+                return Json(new
+                {
+                    error = res.errorCode,
+                    content = res.content,
+                    msisdn = msisdn.Substring(3),
+                    numTurn = numTurn
+                });
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1"
+                });
+            }
+        }
+
+        [HttpPost]
+        public JsonResult BuyTurnConfirm(String otp, String numTurn)
+        {
+            String msisdn = Session["msisdn"] as String;
+            if (msisdn != "" && msisdn != null)
+            {
+                log.Info("BuyTurnConfirm " + msisdn + ", numTurn: " + numTurn);
+
+                wsClient.Endpoint.Address = GetWsEndpoint();
+
+                response res = wsClient.wsBuyTurn(wsUser, wsPassword, msisdn, numTurn, otp);
+                log.Info("BuyTurnConfirm " + msisdn + ": " + res.errorCode);
+
+                if (res.errorCode == "0")
+                {
+                    Session["account"] = wsClient.wsGetSubInfo(wsUser, wsPassword, msisdn);
+                }
+
+                return Json(new
+                {
+                    error = res.errorCode,
+                    content = res.content,
+                    msisdn = msisdn.Substring(3)
+                });
+            }
+            else
+            {
+                return Json(new
+                {
+                    error = "-1"
+                });
+            }
+        }
+
+
+
+        public ActionResult Login()
+        {
+            return View();
+        }
+
+        public RedirectResult Logout()
+        {
+            Session.Clear();
+            return Redirect("/Home?detecting=0");
+        }
+
+        private bool Check(string response)
+        {
+            //string Response = HttpContext.Current.Request.QueryString["g-recaptcha-response"];//Getting Response String Append to Post Method
+            bool Valid = false;
+            //Request to Google Server
+            HttpWebRequest req = (HttpWebRequest)WebRequest.Create
+            (" https://www.google.com/recaptcha/api/siteverify?secret=" + CommonUtils.CaptchaSecretKey + "&response=" + response);
+            try
+            {
+                //Google recaptcha Response
+                using (WebResponse wResponse = req.GetResponse())
+                {
+
+                    using (StreamReader readStream = new StreamReader(wResponse.GetResponseStream()))
+                    {
+                        string jsonResponse = readStream.ReadToEnd();
+
+                        JavaScriptSerializer js = new JavaScriptSerializer();
+                        MyObject data = js.Deserialize<MyObject>(jsonResponse);// Deserialize Json
+
+                        Valid = Convert.ToBoolean(data.success);
+                    }
+                }
+
+                return Valid;
+            }
+            catch (WebException ex)
+            {
+                throw ex;
+            }
+        }
+
+        public class MyObject
+        {
+            public string success { get; set; }
+        }
+    }
+}

+ 31 - 0
LuckyCallWebCore/LuckyCallWebCore/Extensions/ConfigAction.cs

@@ -0,0 +1,31 @@
+using Microsoft.AspNetCore.Mvc.Filters;
+using Microsoft.Extensions.Configuration;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LuckyCallWebCore.Extensions
+{
+    public class ConfigAction : IAsyncActionFilter
+    {
+        private MyConfig _options;
+        public ConfigAction(IConfiguration configuration)
+        {
+
+            _options = new MyConfig();
+            configuration.Bind(_options);
+        }
+
+        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+        {
+            ((Microsoft.AspNetCore.Mvc.Controller)context.Controller).ViewBag.MyConfig = _options;
+            await next();
+        }
+    }
+
+    public class MyConfig
+    {
+        public string MyValue { get; set; }
+    }
+}

+ 29 - 0
LuckyCallWebCore/LuckyCallWebCore/Extensions/RewriteSubdomainRule.cs

@@ -0,0 +1,29 @@
+using Microsoft.AspNetCore.Rewrite;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+
+namespace LuckyCallWebCore.Extensions
+{
+    public class RewriteSubdomainRule : IRule
+    {
+        public void ApplyRule(RewriteContext context)
+        {
+            var request = context.HttpContext.Request;
+            var host = request.Host.Host;
+            // Check if the host is subdomain.domain.com or subdomain.localhost for debugging
+            if (Regex.IsMatch(host, @"^[A-Za-z\d]+\.(?:[A-Za-z\d]+\.[A-Za-z\d]+|localhost)$"))
+            {
+                string subdomain = host.Split('.')[0];
+                //modifying the request path to let the routing catch the subdomain
+                context.HttpContext.Request.Path = "/subdomain/" + subdomain + context.HttpContext.Request.Path;
+                context.Result = RuleResult.ContinueRules;
+                return;
+            }
+            context.Result = RuleResult.ContinueRules;
+            return;
+        }
+    }
+}

+ 28 - 0
LuckyCallWebCore/LuckyCallWebCore/Extensions/SessionExtensions.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks; 
+using Microsoft.AspNetCore.Http;
+using Newtonsoft.Json;
+
+namespace LuckyCallWebCore.Extensions
+{
+
+    public static class SessionExtensions
+    {
+        public static T GetComplexData<T>(this ISession session, string key)
+        {
+            var data = session.GetString(key);
+            if (data == null)
+            {
+                return default(T);
+            }
+            return JsonConvert.DeserializeObject<T>(data);
+        }
+
+        public static void SetComplexData(this ISession session, string key, object value)
+        {
+            session.SetString(key, JsonConvert.SerializeObject(value));
+        }
+    }
+}

+ 11 - 0
LuckyCallWebCore/LuckyCallWebCore/Models/ErrorViewModel.cs

@@ -0,0 +1,11 @@
+using System;
+
+namespace LuckyCallWebCore.Models
+{
+    public class ErrorViewModel
+    {
+        public string RequestId { get; set; }
+
+        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
+    }
+}

+ 18 - 0
LuckyCallWebCore/LuckyCallWebCore/Models/JwtData.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+namespace LuckyCallWebCore.Models
+{
+    public class JwtData
+    {
+        public String iss { get; set; }
+        public String username { get; set; }
+        public String msisdn { get; set; }
+        public String language { get; set; }
+        public String avatarUrl { get; set; }
+        public bool unitel { get; set; }
+        public long exp { get; set; }
+    }
+}

+ 21 - 0
LuckyCallWebCore/LuckyCallWebCore/Models/LuckyWheelModel.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using ServiceAPI;
+
+namespace LuckyCallWebCore.Models
+{
+    public class LuckyWheelModel
+    {
+        public prizeWinner[] listWinner { get; set; }
+        public userCoinObj[] listUserCoin { get; set; }
+        public string page { get; set; } = "1";
+        public string pageSize { get; set; } = "10";
+        public int totalPage { get; set; }
+        public int totalRow { get; set; }
+        public string confirmed { get; set; }
+        public userCoinObj userCoin { get; set; }
+
+    }
+}

+ 65 - 0
LuckyCallWebCore/LuckyCallWebCore/Models/MyIdData.cs

@@ -0,0 +1,65 @@
+//using Newtonsoft.Json;
+//using System;
+//using System.Collections.Generic;
+//using System.Linq;
+//using System.Threading.Tasks;
+
+//namespace LuckyCallWebCore.Models
+//{
+//    public class SubInfoData
+//    {
+//        public string id { get; set; }
+//        public string individualId { get; set; }
+//        public string subType { get; set; }
+//        public string isdn { get; set; }
+//        public bool verify { get; set; }
+//        public DateTime createdDateTime { get; set; }
+//        public DateTime updatedDateTime { get; set; }
+//        public string payType { get; set; }
+//        public object ocsAccount { get; set; }
+//    }
+
+//    public class Pageable
+//    {
+//        public Sort sort { get; set; }
+//        public int pageSize { get; set; }
+//        public int pageNumber { get; set; }
+//        public int offset { get; set; }
+//        public bool paged { get; set; }
+//        public bool unpaged { get; set; }
+//    }
+
+//    public class SubInfoResult
+//    {
+//        public List<SubInfoData> content { get; set; }
+//        public Pageable pageable { get; set; }
+//        public bool last { get; set; }
+//        public int totalPages { get; set; }
+//        public int totalElements { get; set; }
+//        public Sort sort { get; set; }
+//        public bool first { get; set; }
+//        public int numberOfElements { get; set; }
+//        public int size { get; set; }
+//        public int number { get; set; }
+//        public bool empty { get; set; }
+//    }
+
+//    public class GetSubInfoRes
+//    {
+//        public int errorCode { get; set; }
+//        public SubInfoResult result { get; set; }
+//        public string message { get; set; }
+
+//        public static new GetSubInfoRes Parse(String json)
+//        {
+//            return JsonConvert.DeserializeObject<GetSubInfoRes>(json);
+//        }
+//    }
+
+//    public class Sort
+//    {
+//        public bool sorted { get; set; }
+//        public bool unsorted { get; set; }
+//        public bool empty { get; set; }
+//    }
+//}

+ 12 - 0
LuckyCallWebCore/LuckyCallWebCore/Models/PrizeObj.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LuckyCallWebCore.Models
+{
+    public class PrizeObj
+    {
+        public string prizeId { get; set; } 
+    }
+}

+ 14 - 0
LuckyCallWebCore/LuckyCallWebCore/Models/RequestOtp.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LuckyCallWebCore.Models
+{
+    public class RequestOtp
+    {
+        public string msisdn { get; set; }
+        public string requestId { get; set; }
+        public string packageName { get; set; }
+    }
+}

+ 74 - 0
LuckyCallWebCore/LuckyCallWebCore/Nat_LuckyCall.csproj

@@ -0,0 +1,74 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net5.0</TargetFramework>
+    <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Remove="wwwroot\demo\**" />
+    <Compile Remove="wwwroot\Texts\**" />
+    <Content Remove="wwwroot\demo\**" />
+    <Content Remove="wwwroot\Texts\**" />
+    <EmbeddedResource Remove="wwwroot\demo\**" />
+    <EmbeddedResource Remove="wwwroot\Texts\**" />
+    <None Remove="wwwroot\demo\**" />
+    <None Remove="wwwroot\Texts\**" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Remove="Controllers\SubscriberController.cs" />
+    <Compile Remove="Source\ChatWebSocketClient.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Remove="Views\Home\Index2.cshtml" />
+    <Content Remove="Views\Home\Privacy.cshtml" />
+    <Content Remove="Views\Home\Prize.cshtml" />
+    <Content Remove="Views\Home\PrizeConfirm.cshtml" />
+    <Content Remove="Views\Home\PrizeInfo.cshtml" />
+    <Content Remove="Views\Home\UserInfo.cshtml" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Remove="Resources\Resources.rar" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="log4net" Version="2.0.12" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.19" />
+    <PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="5.0.10" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" />
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
+    <PackageReference Include="Portable.BouncyCastle" Version="1.8.10" />
+    <PackageReference Include="System.ServiceModel.Duplex" Version="4.7.*" />
+    <PackageReference Include="System.ServiceModel.Http" Version="4.7.*" />
+    <PackageReference Include="System.ServiceModel.NetTcp" Version="4.7.*" />
+    <PackageReference Include="System.ServiceModel.Security" Version="4.7.*" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Reference Include="WebSockets">
+      <HintPath>lib\WebSockets.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Update="Resources\Lang.Designer.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Lang.resx</DependentUpon>
+    </Compile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Update="Resources\Lang.fr.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+    </EmbeddedResource>
+    <EmbeddedResource Update="Resources\Lang.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+      <LastGenOutput>Lang.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+
+</Project>

+ 56 - 0
LuckyCallWebCore/LuckyCallWebCore/Program.cs

@@ -0,0 +1,56 @@
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace LuckyCallWebCore
+{
+    public class Program
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+        public static void Main(string[] args)
+        {
+            XmlDocument log4netConfig = new XmlDocument();
+            log4netConfig.Load(File.OpenRead("log4net.config"));
+
+            var repo = log4net.LogManager.CreateRepository(
+                Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
+
+            log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);
+
+            log.Info("Application - Main is invoked");
+            CreateHostBuilder(args).Build().Run();
+        }
+
+        //public static IHostBuilder CreateHostBuilder(string[] args) =>
+        //    Host.CreateDefaultBuilder(args)
+        //        .ConfigureWebHostDefaults(webBuilder =>
+        //        {
+        //            webBuilder.UseStartup<Startup>();
+        //        });
+
+        public static IHostBuilder CreateHostBuilder(string[] args) =>
+           Host.CreateDefaultBuilder(args)
+               .ConfigureWebHostDefaults(webBuilder =>
+               {
+                   //webBuilder.UseStartup<Startup>();
+                   webBuilder.ConfigureKestrel(serverOptions =>
+                   {
+                       serverOptions.Limits.MaxConcurrentConnections = 1000;
+                       serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
+                       serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
+                       serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
+                       serverOptions.Limits.MaxRequestBodySize = 52428800;
+
+                   });
+                   webBuilder.UseStartup<Startup>();
+               });
+    }
+}

+ 21 - 0
LuckyCallWebCore/LuckyCallWebCore/Properties/PublishProfiles/FolderProfile.pubxml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121. 
+-->
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <DeleteExistingFiles>True</DeleteExistingFiles>
+    <ExcludeApp_Data>False</ExcludeApp_Data>
+    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
+    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
+    <LastUsedPlatform>Any CPU</LastUsedPlatform>
+    <PublishProvider>FileSystem</PublishProvider>
+    <PublishUrl>D:\Common\Publish</PublishUrl>
+    <WebPublishMethod>FileSystem</WebPublishMethod>
+    <SiteUrlToLaunchAfterPublish />
+    <TargetFramework>net5.0</TargetFramework>
+    <RuntimeIdentifier>linux-x64</RuntimeIdentifier>
+    <ProjectGuid>99141dc5-c989-4751-8328-c5128437a3dc</ProjectGuid>
+    <SelfContained>true</SelfContained>
+  </PropertyGroup>
+</Project>

+ 22 - 0
LuckyCallWebCore/LuckyCallWebCore/Properties/PublishProfiles/FolderProfile1.pubxml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121. 
+-->
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <DeleteExistingFiles>True</DeleteExistingFiles>
+    <ExcludeApp_Data>False</ExcludeApp_Data>
+    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
+    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
+    <LastUsedPlatform>Any CPU</LastUsedPlatform>
+    <PublishProvider>FileSystem</PublishProvider>
+    <PublishUrl>D:\Common\Publish</PublishUrl>
+    <WebPublishMethod>FileSystem</WebPublishMethod>
+    <SiteUrlToLaunchAfterPublish />
+    <TargetFramework>net5.0</TargetFramework>
+    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
+    <PublishTrimmed>False</PublishTrimmed>
+    <ProjectGuid>99141dc5-c989-4751-8328-c5128437a3dc</ProjectGuid>
+    <SelfContained>true</SelfContained>
+  </PropertyGroup>
+</Project>

+ 21 - 0
LuckyCallWebCore/LuckyCallWebCore/Properties/PublishProfiles/FolderProfile2.pubxml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121. 
+-->
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <DeleteExistingFiles>True</DeleteExistingFiles>
+    <ExcludeApp_Data>False</ExcludeApp_Data>
+    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
+    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
+    <LastUsedPlatform>Any CPU</LastUsedPlatform>
+    <PublishProvider>FileSystem</PublishProvider>
+    <PublishUrl>D:\Common\Publish</PublishUrl>
+    <WebPublishMethod>FileSystem</WebPublishMethod>
+    <SiteUrlToLaunchAfterPublish />
+    <TargetFramework>net5.0</TargetFramework>
+    <RuntimeIdentifier>linux-x64</RuntimeIdentifier>
+    <ProjectGuid>99141dc5-c989-4751-8328-c5128437a3dc</ProjectGuid>
+    <SelfContained>true</SelfContained>
+  </PropertyGroup>
+</Project>

+ 29 - 0
LuckyCallWebCore/LuckyCallWebCore/Properties/launchSettings.json

@@ -0,0 +1,29 @@
+{
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:51575",
+      "sslPort": 44377
+    }
+  },
+  "profiles": {
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
+      }
+    },
+    "LuckyCallWebCore": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "applicationUrl": "https://localhost:5001;http://localhost:5000",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
+      }
+    }
+  }
+}

+ 756 - 0
LuckyCallWebCore/LuckyCallWebCore/Resources/Lang.Designer.cs

@@ -0,0 +1,756 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Nat_LuckyCall.Resources {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    public class Lang {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Lang() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Nat_LuckyCall.Resources.Lang", typeof(Lang).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Your account is locked, please try again in 5 minutes..
+        /// </summary>
+        public static string AccountLocked {
+            get {
+                return ResourceManager.GetString("AccountLocked", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Cancel.
+        /// </summary>
+        public static string Cancel {
+            get {
+                return ResourceManager.GetString("Cancel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Do you want to cancel %package%?.
+        /// </summary>
+        public static string CancelConfirm {
+            get {
+                return ResourceManager.GetString("CancelConfirm", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Cancelled.
+        /// </summary>
+        public static string Cancelled {
+            get {
+                return ResourceManager.GetString("Cancelled", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Click on a box to spin.
+        /// </summary>
+        public static string ClickToSpin {
+            get {
+                return ResourceManager.GetString("ClickToSpin", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Close.
+        /// </summary>
+        public static string Close {
+            get {
+                return ResourceManager.GetString("Close", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to COLLECT.
+        /// </summary>
+        public static string Collect {
+            get {
+                return ResourceManager.GetString("Collect", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Confirm.
+        /// </summary>
+        public static string Confirm {
+            get {
+                return ResourceManager.GetString("Confirm", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Are you sure want to exit?.
+        /// </summary>
+        public static string ConfirmExit {
+            get {
+                return ResourceManager.GetString("ConfirmExit", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Congratulations.
+        /// </summary>
+        public static string Congratulations {
+            get {
+                return ResourceManager.GetString("Congratulations", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Create account.
+        /// </summary>
+        public static string CreateAccount {
+            get {
+                return ResourceManager.GetString("CreateAccount", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Daily Prize.
+        /// </summary>
+        public static string DailyPrize {
+            get {
+                return ResourceManager.GetString("DailyPrize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to List of winners of the day.
+        /// </summary>
+        public static string DailyPrizeTitle {
+            get {
+                return ResourceManager.GetString("DailyPrizeTitle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Date.
+        /// </summary>
+        public static string Date {
+            get {
+                return ResourceManager.GetString("Date", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enter phone number and password (OTP).
+        /// </summary>
+        public static string EnterLogin {
+            get {
+                return ResourceManager.GetString("EnterLogin", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OTP has been sent to your phone.
+        /// </summary>
+        public static string EnterOtp {
+            get {
+                return ResourceManager.GetString("EnterOtp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Error.
+        /// </summary>
+        public static string Error {
+            get {
+                return ResourceManager.GetString("Error", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Forgot password?.
+        /// </summary>
+        public static string ForgotPassword {
+            get {
+                return ResourceManager.GetString("ForgotPassword", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Game music.
+        /// </summary>
+        public static string GameMusic {
+            get {
+                return ResourceManager.GetString("GameMusic", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Guide.
+        /// </summary>
+        public static string Guide {
+            get {
+                return ResourceManager.GetString("Guide", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Guide Detail.
+        /// </summary>
+        public static string GuideDetail {
+            get {
+                return ResourceManager.GetString("GuideDetail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Hello.
+        /// </summary>
+        public static string Hello {
+            get {
+                return ResourceManager.GetString("Hello", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to High Score.
+        /// </summary>
+        public static string HighScore {
+            get {
+                return ResourceManager.GetString("HighScore", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Home.
+        /// </summary>
+        public static string Home {
+            get {
+                return ResourceManager.GetString("Home", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Introduction how to play.
+        /// </summary>
+        public static string Introduction {
+            get {
+                return ResourceManager.GetString("Introduction", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Phone number invalid.
+        /// </summary>
+        public static string InvalidMsisdn {
+            get {
+                return ResourceManager.GetString("InvalidMsisdn", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Language.
+        /// </summary>
+        public static string Language {
+            get {
+                return ResourceManager.GetString("Language", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Last month winner: .
+        /// </summary>
+        public static string LastMonthWinner {
+            get {
+                return ResourceManager.GetString("LastMonthWinner", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Loading.
+        /// </summary>
+        public static string Loading {
+            get {
+                return ResourceManager.GetString("Loading", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Login.
+        /// </summary>
+        public static string Login {
+            get {
+                return ResourceManager.GetString("Login", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Wrong phone number or password!.
+        /// </summary>
+        public static string LoginFailed {
+            get {
+                return ResourceManager.GetString("LoginFailed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Loyalty Point.
+        /// </summary>
+        public static string LoyaltyPoint {
+            get {
+                return ResourceManager.GetString("LoyaltyPoint", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Minutes Call.
+        /// </summary>
+        public static string MinutesCall {
+            get {
+                return ResourceManager.GetString("MinutesCall", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Monthly Prize.
+        /// </summary>
+        public static string MonthlyPrize {
+            get {
+                return ResourceManager.GetString("MonthlyPrize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to List of special prize winners.
+        /// </summary>
+        public static string MonthlyPrizeTitle {
+            get {
+                return ResourceManager.GetString("MonthlyPrizeTitle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to My coin.
+        /// </summary>
+        public static string MyCoin {
+            get {
+                return ResourceManager.GetString("MyCoin", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to MY GIFT.
+        /// </summary>
+        public static string MyGift {
+            get {
+                return ResourceManager.GetString("MyGift", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to My Package.
+        /// </summary>
+        public static string MyPackage {
+            get {
+                return ResourceManager.GetString("MyPackage", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to My rank.
+        /// </summary>
+        public static string MyRank {
+            get {
+                return ResourceManager.GetString("MyRank", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to No.
+        /// </summary>
+        public static string No {
+            get {
+                return ResourceManager.GetString("No", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to No More Prize.
+        /// </summary>
+        public static string NoMorePrize {
+            get {
+                return ResourceManager.GetString("NoMorePrize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to No ranking.
+        /// </summary>
+        public static string NoRanking {
+            get {
+                return ResourceManager.GetString("NoRanking", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The service is only available of Natcom network operator. For the best game experience, please use Natcom network operator..
+        /// </summary>
+        public static string NotAllowNumber {
+            get {
+                return ResourceManager.GetString("NotAllowNumber", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to of.
+        /// </summary>
+        public static string of {
+            get {
+                return ResourceManager.GetString("of", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Off.
+        /// </summary>
+        public static string Off {
+            get {
+                return ResourceManager.GetString("Off", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to On.
+        /// </summary>
+        public static string On {
+            get {
+                return ResourceManager.GetString("On", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Oh, your turn is over.
+        /// </summary>
+        public static string OutOfTurn {
+            get {
+                return ResourceManager.GetString("OutOfTurn", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Please comeback tomorrow to continue play..
+        /// </summary>
+        public static string OutOfTurnDetail {
+            get {
+                return ResourceManager.GetString("OutOfTurnDetail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to You have not registered to the service, please register to enjoy the service.
+        /// </summary>
+        public static string OutOfTurnRegister {
+            get {
+                return ResourceManager.GetString("OutOfTurnRegister", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Password.
+        /// </summary>
+        public static string Password {
+            get {
+                return ResourceManager.GetString("Password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Password has been sent to your phone number..
+        /// </summary>
+        public static string PasswordSent {
+            get {
+                return ResourceManager.GetString("PasswordSent", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Period.
+        /// </summary>
+        public static string Period {
+            get {
+                return ResourceManager.GetString("Period", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Phone.
+        /// </summary>
+        public static string Phone {
+            get {
+                return ResourceManager.GetString("Phone", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Phone Number.
+        /// </summary>
+        public static string PhoneNumber {
+            get {
+                return ResourceManager.GetString("PhoneNumber", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prize.
+        /// </summary>
+        public static string Prize {
+            get {
+                return ResourceManager.GetString("Prize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to RANKING COIN.
+        /// </summary>
+        public static string RankingCoin {
+            get {
+                return ResourceManager.GetString("RankingCoin", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Updated every half hours.
+        /// </summary>
+        public static string RankUpdate {
+            get {
+                return ResourceManager.GetString("RankUpdate", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Register.
+        /// </summary>
+        public static string Register {
+            get {
+                return ResourceManager.GetString("Register", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Register for Lucky Call service to get spin every day and has chance to get 50.000HTG.
+        /// </summary>
+        public static string RegisterMoreInfo {
+            get {
+                return ResourceManager.GetString("RegisterMoreInfo", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rule.
+        /// </summary>
+        public static string Rule {
+            get {
+                return ResourceManager.GetString("Rule", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 1. Ranking is based on the player&apos;s coins. The more coins a player has, the higher the rank. The player with the highest number of coins will receive 50.000HTG from the service.
+        /// </summary>
+        public static string RuleDetail1 {
+            get {
+                return ResourceManager.GetString("RuleDetail1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 2. Leaderboard is refreshed every half hour.
+        /// </summary>
+        public static string RuleDetail2 {
+            get {
+                return ResourceManager.GetString("RuleDetail2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Special Prize.
+        /// </summary>
+        public static string SpecialPrize {
+            get {
+                return ResourceManager.GetString("SpecialPrize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The player who achieved the highest and fastest number of coins in the month will receive 50.000HTG.
+        /// </summary>
+        public static string SpecialPrizeDetail {
+            get {
+                return ResourceManager.GetString("SpecialPrizeDetail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Spin.
+        /// </summary>
+        public static string Spin {
+            get {
+                return ResourceManager.GetString("Spin", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Success.
+        /// </summary>
+        public static string Success {
+            get {
+                return ResourceManager.GetString("Success", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tap on empty space to leave.
+        /// </summary>
+        public static string TapLeave {
+            get {
+                return ResourceManager.GetString("TapLeave", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Time.
+        /// </summary>
+        public static string Time {
+            get {
+                return ResourceManager.GetString("Time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to To be ranked, please register the service.
+        /// </summary>
+        public static string TobeRanked {
+            get {
+                return ResourceManager.GetString("TobeRanked", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Total Coin.
+        /// </summary>
+        public static string TotalCoin {
+            get {
+                return ResourceManager.GetString("TotalCoin", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Wait for next reset password until %until%.
+        /// </summary>
+        public static string WaitNextReset {
+            get {
+                return ResourceManager.GetString("WaitNextReset", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Wait for sign up until %until%.
+        /// </summary>
+        public static string WaitNextSignup {
+            get {
+                return ResourceManager.GetString("WaitNextSignup", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Warning.
+        /// </summary>
+        public static string Warning {
+            get {
+                return ResourceManager.GetString("Warning", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Weekly Prize.
+        /// </summary>
+        public static string WeeklyPrize {
+            get {
+                return ResourceManager.GetString("WeeklyPrize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to List of winners of the week.
+        /// </summary>
+        public static string WeeklyPrizeTitle {
+            get {
+                return ResourceManager.GetString("WeeklyPrizeTitle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to winners list.
+        /// </summary>
+        public static string WinnerList {
+            get {
+                return ResourceManager.GetString("WinnerList", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to You won!.
+        /// </summary>
+        public static string YouWon {
+            get {
+                return ResourceManager.GetString("YouWon", resourceCulture);
+            }
+        }
+    }
+}

+ 351 - 0
LuckyCallWebCore/LuckyCallWebCore/Resources/Lang.fr.resx

@@ -0,0 +1,351 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="AccountLocked" xml:space="preserve">
+    <value>Kont ou bloke, tanpri eseye nan 5 minit anko</value>
+  </data>
+  <data name="Cancel" xml:space="preserve">
+    <value>Anile</value>
+  </data>
+  <data name="CancelConfirm" xml:space="preserve">
+    <value>Ou vle anile %package%?</value>
+  </data>
+  <data name="Cancelled" xml:space="preserve">
+    <value>Li anile</value>
+  </data>
+  <data name="ClickToSpin" xml:space="preserve">
+    <value>Klike nan bwat la pou vire</value>
+  </data>
+  <data name="Close" xml:space="preserve">
+    <value>Femen</value>
+  </data>
+  <data name="Collect" xml:space="preserve">
+    <value>Kolekte</value>
+  </data>
+  <data name="Confirm" xml:space="preserve">
+    <value>Konfime</value>
+  </data>
+  <data name="ConfirmExit" xml:space="preserve">
+    <value>Eskew vle soti?</value>
+  </data>
+  <data name="Congratulations" xml:space="preserve">
+    <value>Felisitasyon</value>
+  </data>
+  <data name="CreateAccount" xml:space="preserve">
+    <value>Kreye yon kont</value>
+  </data>
+  <data name="DailyPrize" xml:space="preserve">
+    <value>Prim jou a</value>
+  </data>
+  <data name="DailyPrizeTitle" xml:space="preserve">
+    <value>Lis moun ki genyen jodia</value>
+  </data>
+  <data name="Date" xml:space="preserve">
+    <value>Dat</value>
+  </data>
+  <data name="EnterLogin" xml:space="preserve">
+    <value>Antre nimewo telefon ak modpass (OTP)</value>
+  </data>
+  <data name="EnterOtp" xml:space="preserve">
+    <value>Verifye telefon ou pou OTP a</value>
+  </data>
+  <data name="Error" xml:space="preserve">
+    <value>ere</value>
+  </data>
+  <data name="ForgotPassword" xml:space="preserve">
+    <value>Bliye modpas</value>
+  </data>
+  <data name="GameMusic" xml:space="preserve">
+    <value>Jwèt mizik</value>
+  </data>
+  <data name="Guide" xml:space="preserve">
+    <value>Gid</value>
+  </data>
+  <data name="GuideDetail" xml:space="preserve">
+    <value>Gid detaye</value>
+  </data>
+  <data name="Hello" xml:space="preserve">
+    <value>Alo</value>
+  </data>
+  <data name="HighScore" xml:space="preserve">
+    <value>Pi gwo esko</value>
+  </data>
+  <data name="Home" xml:space="preserve">
+    <value>Akèy</value>
+  </data>
+  <data name="Introduction" xml:space="preserve">
+    <value>Kijan pouw jwe</value>
+  </data>
+  <data name="InvalidMsisdn" xml:space="preserve">
+    <value>Nimewo enkorek</value>
+  </data>
+  <data name="Language" xml:space="preserve">
+    <value>Lang</value>
+  </data>
+  <data name="LastMonthWinner" xml:space="preserve">
+    <value>Moun ki genyen mwa pase a</value>
+  </data>
+  <data name="Loading" xml:space="preserve">
+    <value>Telechaje a</value>
+  </data>
+  <data name="Login" xml:space="preserve">
+    <value>Konekte</value>
+  </data>
+  <data name="LoginFailed" xml:space="preserve">
+    <value>Nimewo oswa modpas enkorek</value>
+  </data>
+  <data name="LoyaltyPoint" xml:space="preserve">
+    <value>Pwen fidelite</value>
+  </data>
+  <data name="MinutesCall" xml:space="preserve">
+    <value>Minit apèl</value>
+  </data>
+  <data name="MonthlyPrize" xml:space="preserve">
+    <value>Prim mwa</value>
+  </data>
+  <data name="MonthlyPrizeTitle" xml:space="preserve">
+    <value>Lis moun ki genyen pri espesyal yo</value>
+  </data>
+  <data name="MyCoin" xml:space="preserve">
+    <value>Pyès mwen</value>
+  </data>
+  <data name="MyGift" xml:space="preserve">
+    <value>Kado mwen</value>
+  </data>
+  <data name="MyPackage" xml:space="preserve">
+    <value>plan mwen</value>
+  </data>
+  <data name="MyRank" xml:space="preserve">
+    <value>Nivo</value>
+  </data>
+  <data name="No" xml:space="preserve">
+    <value>Non</value>
+  </data>
+  <data name="NoMorePrize" xml:space="preserve">
+    <value>Pa gen prim anko</value>
+  </data>
+  <data name="NoRanking" xml:space="preserve">
+    <value>Pa gen klasman</value>
+  </data>
+  <data name="NotAllowNumber" xml:space="preserve">
+    <value>Sèvis la disponib selman sou rezo operatè Natcom la. Itilize rezo Natcom la pouw gen pi bèl eksperyans jwe</value>
+  </data>
+  <data name="of" xml:space="preserve">
+    <value>De</value>
+  </data>
+  <data name="Off" xml:space="preserve">
+    <value>Femen</value>
+  </data>
+  <data name="On" xml:space="preserve">
+    <value>Ouvri</value>
+  </data>
+  <data name="OutOfTurn" xml:space="preserve">
+    <value>o,tou paw la fini</value>
+  </data>
+  <data name="OutOfTurnDetail" xml:space="preserve">
+    <value>Tanpri tounen demen pouw ka kontinye jwe</value>
+  </data>
+  <data name="OutOfTurnRegister" xml:space="preserve">
+    <value>Ou pa anrejistre nan sèvis la, tanpri anrejistre pouw ka jwi sèvis la</value>
+  </data>
+  <data name="Password" xml:space="preserve">
+    <value>Modpas</value>
+  </data>
+  <data name="PasswordSent" xml:space="preserve">
+    <value>Verifye mesaj ou pou modpas la</value>
+  </data>
+  <data name="Period" xml:space="preserve">
+    <value>Peryod</value>
+  </data>
+  <data name="Phone" xml:space="preserve">
+    <value>Telefon</value>
+  </data>
+  <data name="PhoneNumber" xml:space="preserve">
+    <value>Nimewo telefon</value>
+  </data>
+  <data name="Prize" xml:space="preserve">
+    <value>Prim</value>
+  </data>
+  <data name="RankingCoin" xml:space="preserve">
+    <value>Klasman pyès</value>
+  </data>
+  <data name="RankUpdate" xml:space="preserve">
+    <value>Mizajou chak 30 minit</value>
+  </data>
+  <data name="Register" xml:space="preserve">
+    <value>Anrejistre</value>
+  </data>
+  <data name="RegisterMoreInfo" xml:space="preserve">
+    <value>Anrejistre nan sèvis lucky Call la pouw ka vire chak jou pouw ka gen chans genyen</value>
+  </data>
+  <data name="Rule" xml:space="preserve">
+    <value>Règ</value>
+  </data>
+  <data name="RuleDetail1" xml:space="preserve">
+    <value>1. Klasman baze sou nonb pyès jwè a. Plis jwè a gen pyès se plis lap pi wo nan klasman. Jwè ki gen plis pyès la, sevis la ap fel kado 50.000HTG.</value>
+  </data>
+  <data name="RuleDetail2" xml:space="preserve">
+    <value>Klasman modifye chak 30 minit</value>
+  </data>
+  <data name="SpecialPrize" xml:space="preserve">
+    <value>Prim espesyal</value>
+  </data>
+  <data name="SpecialPrizeDetail" xml:space="preserve">
+    <value>Jwè ki rive nan tèt klasman ak nonb pyès pi vit nan mwa ap resevwa 50.000HTG</value>
+  </data>
+  <data name="Spin" xml:space="preserve">
+    <value>Vire</value>
+  </data>
+  <data name="Success" xml:space="preserve">
+    <value>Sikse</value>
+  </data>
+  <data name="TapLeave" xml:space="preserve">
+    <value>Tape nan yn espas vid pouw ka soti</value>
+  </data>
+  <data name="Time" xml:space="preserve">
+    <value>Lè</value>
+  </data>
+  <data name="TobeRanked" xml:space="preserve">
+    <value>Pouw nan klasman, fow anrejistre nan sèvis la</value>
+  </data>
+  <data name="TotalCoin" xml:space="preserve">
+    <value>Pyès total</value>
+  </data>
+  <data name="WaitNextReset" xml:space="preserve">
+    <value>Tann nouvo modpas la %until%</value>
+  </data>
+  <data name="WaitNextSignup" xml:space="preserve">
+    <value>Tann pou anrejistre %until%</value>
+  </data>
+  <data name="Warning" xml:space="preserve">
+    <value>Avètisman</value>
+  </data>
+  <data name="WeeklyPrize" xml:space="preserve">
+    <value>Prim semèn</value>
+  </data>
+  <data name="WeeklyPrizeTitle" xml:space="preserve">
+    <value>Lis moun ki genyen nan semèn nan</value>
+  </data>
+  <data name="WinnerList" xml:space="preserve">
+    <value>Lis moun ki genyen</value>
+  </data>
+  <data name="YouWon" xml:space="preserve">
+    <value>Ou genyen</value>
+  </data>
+</root>

+ 351 - 0
LuckyCallWebCore/LuckyCallWebCore/Resources/Lang.resx

@@ -0,0 +1,351 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="AccountLocked" xml:space="preserve">
+    <value>Your account is locked, please try again in 5 minutes.</value>
+  </data>
+  <data name="Cancel" xml:space="preserve">
+    <value>Cancel</value>
+  </data>
+  <data name="CancelConfirm" xml:space="preserve">
+    <value>Do you want to cancel %package%?</value>
+  </data>
+  <data name="Cancelled" xml:space="preserve">
+    <value>Cancelled</value>
+  </data>
+  <data name="ClickToSpin" xml:space="preserve">
+    <value>Click on a box to spin</value>
+  </data>
+  <data name="Close" xml:space="preserve">
+    <value>Close</value>
+  </data>
+  <data name="Collect" xml:space="preserve">
+    <value>COLLECT</value>
+  </data>
+  <data name="Confirm" xml:space="preserve">
+    <value>Confirm</value>
+  </data>
+  <data name="ConfirmExit" xml:space="preserve">
+    <value>Are you sure want to exit?</value>
+  </data>
+  <data name="Congratulations" xml:space="preserve">
+    <value>Congratulations</value>
+  </data>
+  <data name="CreateAccount" xml:space="preserve">
+    <value>Create account</value>
+  </data>
+  <data name="DailyPrize" xml:space="preserve">
+    <value>Daily Prize</value>
+  </data>
+  <data name="DailyPrizeTitle" xml:space="preserve">
+    <value>List of winners of the day</value>
+  </data>
+  <data name="Date" xml:space="preserve">
+    <value>Date</value>
+  </data>
+  <data name="EnterLogin" xml:space="preserve">
+    <value>Enter phone number and password (OTP)</value>
+  </data>
+  <data name="EnterOtp" xml:space="preserve">
+    <value>OTP has been sent to your phone</value>
+  </data>
+  <data name="Error" xml:space="preserve">
+    <value>Error</value>
+  </data>
+  <data name="ForgotPassword" xml:space="preserve">
+    <value>Forgot password?</value>
+  </data>
+  <data name="GameMusic" xml:space="preserve">
+    <value>Game music</value>
+  </data>
+  <data name="Guide" xml:space="preserve">
+    <value>Guide</value>
+  </data>
+  <data name="GuideDetail" xml:space="preserve">
+    <value>Guide Detail</value>
+  </data>
+  <data name="Hello" xml:space="preserve">
+    <value>Hello</value>
+  </data>
+  <data name="HighScore" xml:space="preserve">
+    <value>High Score</value>
+  </data>
+  <data name="Home" xml:space="preserve">
+    <value>Home</value>
+  </data>
+  <data name="Introduction" xml:space="preserve">
+    <value>Introduction how to play</value>
+  </data>
+  <data name="InvalidMsisdn" xml:space="preserve">
+    <value>Phone number invalid</value>
+  </data>
+  <data name="Language" xml:space="preserve">
+    <value>Language</value>
+  </data>
+  <data name="LastMonthWinner" xml:space="preserve">
+    <value>Last month winner: </value>
+  </data>
+  <data name="Loading" xml:space="preserve">
+    <value>Loading</value>
+  </data>
+  <data name="Login" xml:space="preserve">
+    <value>Login</value>
+  </data>
+  <data name="LoginFailed" xml:space="preserve">
+    <value>Wrong phone number or password!</value>
+  </data>
+  <data name="LoyaltyPoint" xml:space="preserve">
+    <value>Loyalty Point</value>
+  </data>
+  <data name="MinutesCall" xml:space="preserve">
+    <value>Minutes Call</value>
+  </data>
+  <data name="MonthlyPrize" xml:space="preserve">
+    <value>Monthly Prize</value>
+  </data>
+  <data name="MonthlyPrizeTitle" xml:space="preserve">
+    <value>List of special prize winners</value>
+  </data>
+  <data name="MyCoin" xml:space="preserve">
+    <value>My coin</value>
+  </data>
+  <data name="MyGift" xml:space="preserve">
+    <value>MY GIFT</value>
+  </data>
+  <data name="MyPackage" xml:space="preserve">
+    <value>My Package</value>
+  </data>
+  <data name="MyRank" xml:space="preserve">
+    <value>My rank</value>
+  </data>
+  <data name="No" xml:space="preserve">
+    <value>No</value>
+  </data>
+  <data name="NoMorePrize" xml:space="preserve">
+    <value>No More Prize</value>
+  </data>
+  <data name="NoRanking" xml:space="preserve">
+    <value>No ranking</value>
+  </data>
+  <data name="NotAllowNumber" xml:space="preserve">
+    <value>The service is only available of Natcom network operator. For the best game experience, please use Natcom network operator.</value>
+  </data>
+  <data name="of" xml:space="preserve">
+    <value>of</value>
+  </data>
+  <data name="Off" xml:space="preserve">
+    <value>Off</value>
+  </data>
+  <data name="On" xml:space="preserve">
+    <value>On</value>
+  </data>
+  <data name="OutOfTurn" xml:space="preserve">
+    <value>Oh, your turn is over</value>
+  </data>
+  <data name="OutOfTurnDetail" xml:space="preserve">
+    <value>Please comeback tomorrow to continue play.</value>
+  </data>
+  <data name="OutOfTurnRegister" xml:space="preserve">
+    <value>You have not registered to the service, please register to enjoy the service</value>
+  </data>
+  <data name="Password" xml:space="preserve">
+    <value>Password</value>
+  </data>
+  <data name="PasswordSent" xml:space="preserve">
+    <value>Password has been sent to your phone number.</value>
+  </data>
+  <data name="Period" xml:space="preserve">
+    <value>Period</value>
+  </data>
+  <data name="Phone" xml:space="preserve">
+    <value>Phone</value>
+  </data>
+  <data name="PhoneNumber" xml:space="preserve">
+    <value>Phone Number</value>
+  </data>
+  <data name="Prize" xml:space="preserve">
+    <value>Prize</value>
+  </data>
+  <data name="RankingCoin" xml:space="preserve">
+    <value>RANKING COIN</value>
+  </data>
+  <data name="RankUpdate" xml:space="preserve">
+    <value>Updated every half hours</value>
+  </data>
+  <data name="Register" xml:space="preserve">
+    <value>Register</value>
+  </data>
+  <data name="RegisterMoreInfo" xml:space="preserve">
+    <value>Register for Lucky Call service to get spin every day and has chance to get 50.000HTG</value>
+  </data>
+  <data name="Rule" xml:space="preserve">
+    <value>Rule</value>
+  </data>
+  <data name="RuleDetail1" xml:space="preserve">
+    <value>1. Ranking is based on the player's coins. The more coins a player has, the higher the rank. The player with the highest number of coins will receive 50.000HTG from the service</value>
+  </data>
+  <data name="RuleDetail2" xml:space="preserve">
+    <value>2. Leaderboard is refreshed every half hour</value>
+  </data>
+  <data name="SpecialPrize" xml:space="preserve">
+    <value>Special Prize</value>
+  </data>
+  <data name="SpecialPrizeDetail" xml:space="preserve">
+    <value>The player who achieved the highest and fastest number of coins in the month will receive 50.000HTG</value>
+  </data>
+  <data name="Spin" xml:space="preserve">
+    <value>Spin</value>
+  </data>
+  <data name="Success" xml:space="preserve">
+    <value>Success</value>
+  </data>
+  <data name="TapLeave" xml:space="preserve">
+    <value>Tap on empty space to leave</value>
+  </data>
+  <data name="Time" xml:space="preserve">
+    <value>Time</value>
+  </data>
+  <data name="TobeRanked" xml:space="preserve">
+    <value>To be ranked, please register the service</value>
+  </data>
+  <data name="TotalCoin" xml:space="preserve">
+    <value>Total Coin</value>
+  </data>
+  <data name="WaitNextReset" xml:space="preserve">
+    <value>Wait for next reset password until %until%</value>
+  </data>
+  <data name="WaitNextSignup" xml:space="preserve">
+    <value>Wait for sign up until %until%</value>
+  </data>
+  <data name="Warning" xml:space="preserve">
+    <value>Warning</value>
+  </data>
+  <data name="WeeklyPrize" xml:space="preserve">
+    <value>Weekly Prize</value>
+  </data>
+  <data name="WeeklyPrizeTitle" xml:space="preserve">
+    <value>List of winners of the week</value>
+  </data>
+  <data name="WinnerList" xml:space="preserve">
+    <value>winners list</value>
+  </data>
+  <data name="YouWon" xml:space="preserve">
+    <value>You won!</value>
+  </data>
+</root>

+ 42 - 0
LuckyCallWebCore/LuckyCallWebCore/Source/ChatWebSocketClient.cs

@@ -0,0 +1,42 @@
+using log4net;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using WebSockets.Client;
+using WebSockets.Common;
+
+namespace LuckyWheelWebCore.Source
+{
+    public class ChatWebSocketClient : WebSocketClient
+    {
+        private static ChatWebSocketClient _client;
+        private ILog logger = LogManager.GetLogger("ChatWebSocketClient");
+
+        public static ChatWebSocketClient GetInstance()
+        {
+            if (_client == null)
+            {
+                Init(true, new WebSocketLogger());
+            }
+            return _client;
+        }
+
+        public static void Init(bool noDelay, IWebSocketLogger logger)
+        {
+            _client = new ChatWebSocketClient(noDelay, logger);
+        }
+
+        public ChatWebSocketClient(bool noDelay, IWebSocketLogger logger) : base(noDelay, logger)
+        {
+
+        }
+
+        public new void Send(string text)
+        {
+            logger.Info("Client send: " + text);
+            byte[] buffer = Encoding.UTF8.GetBytes(text);
+            base.Send(WebSocketOpCode.TextFrame, buffer);
+        }
+    }
+}

+ 42 - 0
LuckyCallWebCore/LuckyCallWebCore/Source/LuckyCallUtils.cs

@@ -0,0 +1,42 @@
+using LuckyCallWebCore.Models;
+using System;
+using System.Collections.Generic;
+
+namespace LuckyCallWebCore.Source
+{
+    public class LuckyCallUtils
+    {
+        public static String ProgramId = "1";
+
+
+        //public static long totalCoin = 0;
+
+
+        public static Dictionary<string, JwtData> mapJwt = new Dictionary<string, JwtData>(); 
+
+        public class Period
+        {
+
+            public static int DAILY = 1;
+            public static int WEEKLY = 2;
+        }
+
+
+        public class ActionType
+        {
+            public static String CHANGE_PASS = "5";
+            public static String HELP = "10";
+            public static String CREATE_ACCOUNT = "1";
+            public static String REGISTER_SUB = "2";
+            public static String BUY_TURN = "3";
+        }
+
+
+        public class ActionCode
+        {
+            public static String INVITE = "INVITE";
+            public static String MISSION = "MISSION";
+            public static String ADD = "ADD";
+        } 
+    }
+}

+ 23 - 0
LuckyCallWebCore/LuckyCallWebCore/Source/MochaApi.cs

@@ -0,0 +1,23 @@
+namespace LuckyCallWebCore.Source
+{
+    public class GetMsisdnReq
+    {
+        public string username { get; set; }
+        public string password { get; set; }
+        public string uuid { get; set; }
+    }
+
+    public class DataRes
+    {
+        public string msisdn { get; set; }
+        public string uuid { get; set; }
+    }
+
+    public class GetMsisdnResult
+    {
+        public int code { get; set; }
+        public string desc { get; set; }
+        public int errorCode { get; set; }
+        public DataRes data { get; set; }
+    }
+}

+ 58 - 0
LuckyCallWebCore/LuckyCallWebCore/Source/MyIdData.cs

@@ -0,0 +1,58 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LuckyCallWebCore.Source
+{
+    public class SubInfoData
+    {
+        public string id { get; set; }
+        public string individualId { get; set; }
+        public string subType { get; set; }
+        public string isdn { get; set; }
+        public bool verify { get; set; }
+        public DateTime createdDateTime { get; set; }
+        public DateTime updatedDateTime { get; set; }
+        public string payType { get; set; }
+        public object ocsAccount { get; set; }
+    }
+
+    public class Pageable
+    {
+        public Sort sort { get; set; }
+        public int pageSize { get; set; }
+        public int pageNumber { get; set; }
+        public int offset { get; set; }
+        public bool paged { get; set; }
+        public bool unpaged { get; set; }
+    }
+
+    public class SubInfoResult
+    {
+        public String tokenGame { get; set; }
+        public String msisdn { get; set; }
+        public String name { get; set; }
+        public String birthday { get; set; }
+    }
+
+    public class GetSubInfoRes
+    {
+        public int code { get; set; }
+        public SubInfoResult data { get; set; }
+        public string message { get; set; }
+
+        public static new GetSubInfoRes Parse(String json)
+        {
+            return JsonConvert.DeserializeObject<GetSubInfoRes>(json);
+        }
+    }
+
+    public class Sort
+    {
+        public bool sorted { get; set; }
+        public bool unsorted { get; set; }
+        public bool empty { get; set; }
+    }
+}

+ 29 - 0
LuckyCallWebCore/LuckyCallWebCore/Source/SessionObj.cs

@@ -0,0 +1,29 @@
+using System;
+using System.CodeDom.Compiler;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Web;
+
+namespace LuckyCallWebCore.Source
+{
+    public class SessionObj
+    {
+        public DateTime? lockUntil { get; set; }
+        public DateTime? lastResetPassword { get; set; }
+        public DateTime? lastSignUp { get; set; }
+        public DateTime? lastLogin { get; set; }
+        public int wrongTimes { get; set; } = 0;
+
+        public static int waitTime = 1; //minute
+        public static int lockLogin = 2; //minute
+        public static int maxWrong = 5; //times
+    }
+
+    public class CheckSessionRes
+    {
+        public string errorCode { get; set; }
+        public string content { get; set; }
+        public DateTime? lockUntil { get; set; }
+    }
+}

+ 30 - 0
LuckyCallWebCore/LuckyCallWebCore/Source/UserInfo.cs

@@ -0,0 +1,30 @@
+using ServiceAPI;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web; 
+
+namespace LuckyCallWebCore.Source
+{
+    public class UserInfo
+    {
+        public string msisdn { get; set; }
+        public string username { get; set; }
+        public int age { get; set; }
+        public int current_question { get; set; }
+        public int correct_question { get; set; }
+
+        //public int remain_spin { get; set; }
+        //public int gift_spin { get; set; }
+        public int total_spin { get; set; }
+        //public string last_action { get; set; }
+
+        public long play_id { get; set; }
+        //public questions[] list_question { get; set; }
+        //public List<prizeObj> list_prize { get; set; } = new List<prizeObj>();
+        public regInfoWs regInfo { get; set; }
+        public userCoinObj userCoin { get; set; }
+
+        public spinResultObj spinInfo { get; set; }
+    }
+}

+ 44 - 0
LuckyCallWebCore/LuckyCallWebCore/Source/WebSocketLogger.cs

@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using WebSockets.Common;
+using System.Diagnostics;
+using log4net;
+
+namespace LuckyCallWebCore.Source
+{
+    internal class WebSocketLogger : IWebSocketLogger
+    {
+        private ILog logger;
+        public WebSocketLogger()
+        {
+            logger = LogManager.GetLogger(typeof(WebSocketLogger));
+        }
+
+        public WebSocketLogger(ILog _logger)
+        {
+            this.logger = _logger;
+        }
+
+        public void Information(Type type, string format, params object[] args)
+        {
+            logger.InfoFormat(format);
+        }
+
+        public void Warning(Type type, string format, params object[] args)
+        {
+            logger.WarnFormat(format);
+        }
+
+        public void Error(Type type, string format, params object[] args)
+        {
+            logger.ErrorFormat(format, args);
+        }
+
+        public void Error(Type type, Exception exception)
+        {
+            Error(type, "{0}", exception);
+        }
+    }
+}

+ 62 - 0
LuckyCallWebCore/LuckyCallWebCore/Source/productInfo.cs

@@ -0,0 +1,62 @@
+using LuckyCallWebCore.Controllers;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace ServiceAPI
+{
+    public partial class productInfo
+    {
+        public string GetDisplayname()
+        {
+            string lang = BaseController.getCurrentLang();
+            if (lang == "1")
+            {
+                return displayName1;
+            }
+            else if (lang == "2")
+            {
+                return displayName2;
+            }
+            // default
+            return displayName;
+        }
+    }
+
+    public partial class prizeObj
+    {
+        public string GetPrizeName()
+        {
+            string lang = BaseController.getCurrentLang();
+            if (lang == "1")
+            {
+                return prizeName1;
+            }
+            else if (lang == "2")
+            {
+                return prizeName2;
+            }
+            // default
+            return prizeName;
+        }
+    }
+
+    public partial class prizeWinner
+    {
+        public string GetPrizeName()
+        {
+            string lang = BaseController.getCurrentLang();
+            if (lang == "1")
+            {
+                return prizeName1;
+            }
+            else if (lang == "2")
+            {
+                return prizeName2;
+            }
+            // default
+            return prizeName;
+        }
+    }
+}

+ 261 - 0
LuckyCallWebCore/LuckyCallWebCore/Startup.cs

@@ -0,0 +1,261 @@
+using LuckyCallWebCore.Extensions;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using WebSockets.Events;
+using LuckyCallWebCore.Source;
+using log4net;
+using System.Threading;
+using LuckyCallWebCore.Controllers;
+using Microsoft.AspNetCore.Authentication.Cookies;
+using Microsoft.AspNetCore.Http;
+using System.Globalization;
+using System.Collections.Generic;
+using Microsoft.Extensions.Options;
+using Microsoft.AspNetCore.Mvc.Razor;
+
+namespace LuckyCallWebCore
+{
+    public class Startup
+    {
+        private ILog logger = LogManager.GetLogger("ThreadLog");
+        //private WebSocketLogger _logger;
+        public Startup(IConfiguration configuration)
+        {
+            Configuration = configuration;
+
+            //GetHu(configuration);
+            //_logger = new WebSocketLogger(logger);
+            // start client socket
+            //Thread clientThread = new Thread(new ParameterizedThreadStart(SocketClient));
+            //clientThread.IsBackground = false; 
+
+            //clientThread.Start(configuration["socketServer"]);
+
+            //Thread clientThread = new Thread(new ParameterizedThreadStart(UpdateHu));
+            //clientThread.Start(configuration);
+        }
+
+        public IConfiguration Configuration { get; }
+
+        // This method gets called by the runtime. Use this method to add services to the container.
+        public void ConfigureServices(IServiceCollection services)
+        {
+            //services.AddControllersWithViews();
+            services.AddControllersWithViews().AddRazorRuntimeCompilation();
+            //services.AddTransient<ISuperAdminRepo, SuperAdminRepo>();
+            services.AddSingleton<IConfiguration>(Configuration);
+            //services.AddMvc();
+            //.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
+            //.AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
+
+            // multilanguage
+            services.AddLocalization(options => options.ResourcesPath = "Resources");
+            services.AddMvc()
+              .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
+              .AddDataAnnotationsLocalization();
+
+            //services.Configure<RequestLocalizationOptions>(options =>
+            //{
+            //    var supportedCultures = new[] { "en-US", "hi-IN" };
+            //    options.SetDefaultCulture(supportedCultures[0])
+            //        .AddSupportedCultures(supportedCultures)
+            //        .AddSupportedUICultures(supportedCultures);
+            //});
+
+            services.Configure<RequestLocalizationOptions>(options =>
+            {
+                var cultures = new List<CultureInfo> {
+                    new CultureInfo("en"),
+                    new CultureInfo("my"),
+                    new CultureInfo("mm"),
+                    new CultureInfo("vn"),
+                    new CultureInfo("fr")
+               };
+                options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("fr");
+                options.SupportedCultures = cultures;
+                options.SupportedUICultures = cultures;
+            });
+
+            services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
+            services.AddDistributedMemoryCache(); // Adds a default in-memory implementation of IDistributedCache
+            services.AddSession(options =>
+            {
+                options.IdleTimeout = TimeSpan.FromSeconds(600);
+                options.Cookie.HttpOnly = true;
+                options.Cookie.IsEssential = true;
+                //options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
+            });
+            //services.AddSession();
+            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
+            services.AddHttpContextAccessor();
+
+            services.AddMvc(options =>
+            {
+                options.Filters.Add(new ConfigAction(
+                    Configuration.GetSection("MyConfig")
+                ));
+            });
+        }
+
+        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+        {
+            if (env.IsDevelopment())
+            {
+                app.UseDeveloperExceptionPage();
+            }
+            else
+            {
+                app.UseExceptionHandler("/Home/Error");
+                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+                app.UseHsts();
+            }
+
+            //app.UseCookiePolicy(new CookiePolicyOptions
+            //{
+            //    Secure = env.IsDevelopment() ? CookieSecurePolicy.None : CookieSecurePolicy.Always,
+            //    MinimumSameSitePolicy = SameSiteMode.None
+            //});
+            app.UseSession();
+            app.UseCookiePolicy();
+            app.UseHttpsRedirection();
+            app.UseStaticFiles();
+
+            //var supportedCultures = new[] { "en", "fr" };
+            //var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
+            //    .AddSupportedCultures(supportedCultures)
+            //    .AddSupportedUICultures(supportedCultures);
+
+            //app.UseRequestLocalization(localizationOptions);
+
+            app.UseRequestLocalization(app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);
+
+            app.Use(async (ctx, next) =>
+            {
+                await next();
+
+                if (ctx.Response.StatusCode == 404 && !ctx.Response.HasStarted)
+                {
+                    //Re-execute the request so the user gets the error page
+                    string originalPath = ctx.Request.Path.Value;
+                    ctx.Items["originalPath"] = originalPath;
+                    ctx.Request.Path = "/Home/Error";
+                    await next();
+                }
+            });
+
+            app.UseRouting();
+
+            app.UseAuthorization();
+
+            app.UseEndpoints(endpoints =>
+            {
+                endpoints.MapControllerRoute(
+                    name: "default",
+                    pattern: "{controller=Home}/{action=Index}/{id?}");
+            });
+        }
+
+        //private void UpdateHu(object state)
+        //{
+        //    IConfiguration configuration = (IConfiguration)state;
+        //    string wsUser = configuration["wsUser"];
+        //    string wsPassword = configuration["wsPassword"];
+        //    string wsUrl = configuration["wsUrl1"];
+        //    ServiceAPI.WsLuckyCallClient client = new ServiceAPI.WsLuckyCallClient();
+        //    client.Endpoint.Address = new System.ServiceModel.EndpointAddress(wsUrl);
+
+        //    while (true)
+        //    {
+        //        Thread.Sleep(60000);
+        //        string coinTotal = LuckyCallUtils.totalCoin + "";
+        //        var res = client.wsUpdateHuValue(wsUser, wsPassword, coinTotal);
+        //        if (res.errorCode == "0")
+        //        {
+        //            logger.InfoFormat("Updated coin total: {0}", coinTotal);
+        //        }
+        //        else
+        //        {
+        //            logger.ErrorFormat("Error update coin value total: {0}", coinTotal);
+        //        }
+        //    }
+        //}
+
+        //private void GetHu(IConfiguration configuration)
+        //{
+        //    string wsUser = configuration["wsUser"];
+        //    string wsPassword = configuration["wsPassword"];
+        //    string wsUrl = configuration["wsUrl1"];
+        //    ServiceAPI.WsLuckyCallClient client = new ServiceAPI.WsLuckyCallClient();
+        //    client.Endpoint.Address = new System.ServiceModel.EndpointAddress(wsUrl);
+
+        //    var res = client.wsGetHuValue(wsUser, wsPassword);
+        //    if (res.errorCode == "0")
+        //    {
+        //        LuckyCallUtils.totalCoin = res.huValue;
+        //        logger.InfoFormat("Loaded coin total: {0}", res.huValue);
+        //    }
+        //    else
+        //    {
+        //        logger.ErrorFormat("Error get coin value total: {0}", res.content);
+        //        return;
+        //    }
+        //}
+
+
+        //public void SocketClient(object state)
+        //{
+        //    try
+        //    {
+        //        string url = (string)state;
+        //        ChatWebSocketClient.Init(true, _logger);
+        //        var client = ChatWebSocketClient.GetInstance();
+
+
+        //        Uri uri = new Uri(url);
+        //        client.TextFrame += Client_TextFrame;
+        //        client.ConnectionOpened += Client_ConnectionOpened;
+
+        //        // test the open handshake
+        //        client.OpenBlocking(uri);
+
+
+        //        _logger.Information(typeof(Program), "Client finished, press any key");
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        _logger.Error(typeof(Program), ex.ToString());
+        //        _logger.Information(typeof(Program), "Client terminated: Press any key");
+        //    }
+
+        //    Console.ReadKey();
+        //}
+
+        //private void Client_ConnectionOpened(object sender, EventArgs e)
+        //{
+        //    logger.Info(typeof(Program) + " Client: Connection Opened");
+        //    var client = (ChatWebSocketClient)sender;
+
+        //    // test sending a message to the server
+        //    client.Send("GET");
+        //}
+
+        //private void Client_TextFrame(object sender, TextFrameEventArgs e)
+        //{
+        //    logger.Info(typeof(Program) + " Client: " + e.Text);
+
+        //    try
+        //    {
+        //        LuckyQuestionUtils.totalCoin = long.Parse(e.Text);
+        //    }
+        //    catch { }
+        //    //var client = (ChatWebSocketClient)sender;
+        //    // lets test the close handshake
+        //    //client.Dispose();
+        //}
+    }
+}

+ 17 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Home/Error.cshtml

@@ -0,0 +1,17 @@
+@model ErrorViewModel
+@{
+    ViewData["Title"] = "Error";
+}
+
+<h1 class="text-danger">Error.</h1>
+<h2 class="text-danger">An error occurred while processing your request.</h2>
+
+<footer>
+    @Html.Partial("../Partial/_Footer")
+</footer>
+
+@section Scripts{
+    <script>
+        showElement('dialogQuit');
+    </script>
+}

+ 105 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Home/Guide_1.cshtml

@@ -0,0 +1,105 @@
+
+@{
+    ViewBag.Title = "Guide";
+}
+
+
+@{
+    UserInfo userInfo = Context.Session.GetComplexData<UserInfo>("userInfo");
+}
+
+<!-- Content page -->
+<main id="page-winnerlist">
+    <div class="title-main">
+        <p>@Lang.Hello @(userInfo != null ? BaseController.DisplayMsisdn(userInfo.msisdn) : "")</p>
+        <p style="font-size: 18px;">@Lang.Introduction</p>
+    </div>
+    <div class="group-info_service">
+        <p style="margin-left:0in;"><strong>Kijan pouw jwe</strong></p>
+        <p style="margin-left:0in;">Lucky Call se yon sevis apel sou fom vire pouw ka gen chans genyen prim entenet,mesaj,telefon sou aplikasyon NatID a.</p>
+        <p style="margin-left:0in;">Kado espesyan lew anrejistre epi akimile pi gwo kantite pwen nan mwa e rive nan pi gwo nivo avan,wap resevwa prim espesyal nan nwa kise 50.000HTG. Gen opotinite pouw resevwa bel ak anpil prim ki valab.</p>
+        <p style="margin-left:0in;">Kijan pouw gen chans vire? Aprew fin pale nan jounen an, system nan ap baw chans pouw vire gratis apre chak apel e li gratis.</p>
+        <p style="margin-left:0in;">Aplike: Yo touche sou kont prensipal ou pou apel sa</p>
+        <br />
+        <p style="margin-left:0in;"><strong>Anrejistre:</strong></p>
+        <p style="margin-left:0in;">Plan pa jou : wap resevwa 3 vire/jou (3HTG/jou/3 tou).</p>
+        <p style="margin-left:0in;">Plan 7 jou: Wap resevwa 14 vire/semen (2 vire pa jou) (10HTG/jou/14 fwa)</p>
+        <p style="margin-left:0in;">Kantite vire wap jwenn apre chak tanw fin pale siw anrejistre nan sevis la. Pouw ka vire, itilizate yo dwe fe 1 minit ap pale pou pi piti, apel pi ba k esa pap ka vire. Swiv tab sa:</p>
+        <p style="margin-left:0in;">Calling package:&nbsp;<span style="">On-net/Off-net</span></p>
+        <ul>
+            <li><span style="">1minute &lt;=A&lt; 2 minutes: 2 spins</span></li>
+            <li><span style="">2 minutes &lt;= A &lt; 5 minutes: 4 spins</span></li>
+            <li><span style="">&gt;= 5 minutes: 7 spins</span></li>
+        </ul>
+        <p style="margin-left:0in;">&nbsp;</p>
+        <p style="margin-left:0in;">Le: Le a se 7 jou avan dat ou resevwa li a. Vire yo ap espire apre 7 jou (23:59:59).</p>
+        <br />
+        <p style="margin-left:0in;"><strong>Prim:</strong></p>
+        <p style="margin-left:0in;">Lew vire wap gen chans genyen youn nan prim say o:</p>
+        <p style="margin-left:0in;"><span style=""><strong>Daily Prize</strong></span></p>
+        <ul>
+            <li><span style="">10 SMS (24h)</span></li>
+            <li><span style="">20 SMS (24h)</span></li>
+            <li><span style="">30 SMS (24h)</span></li>
+            <li><span style="">50 SMS (24h)</span></li>
+            <li><span style="">20 MB data (24h)</span></li>
+            <li><span style="">50 MB data (24h)</span></li>
+            <li><span style="">100 MB data&nbsp;(24h)</span></li>
+            <li><span style="">5 coins</span></li>
+            <li><span style="">10 coins</span></li>
+            <li><span style="">20 coins</span></li>
+            <li><span style="">30 coins</span></li>
+        </ul>
+        <p style="margin-left:0in;"><span style=""><strong>Monthly Prize</strong></span></p>
+        <ul>
+            <li><span style="">50.000 HTG</span></li>
+        </ul>
+        <p style="margin-left:0in;">&nbsp;</p>
+        <p style="margin-left:0in;">Kijan pouw anrejistre?</p>
+        <p style="margin-left:0in;">Ou ka anrejistre direkteman nan aplikasyon an, klike “anrejistre plan pa jou” oswa “anrejistre plan semen” nan paj akey la</p>
+        <p style="margin-left:0in;">Anrejistre sou telefon;</p>
+        <br />
+        <p style="margin-left:0in;"><strong>Plan jou</strong></p>
+        <p style="margin-left:0in;">Konpoze *7080#, peze 1 oswa *7080*1#</p>
+        <p style="margin-left:0in;">Pri: 3HTG/ semen/3 vire pa jou</p>
+        <p style="margin-left:0in;"><strong>Plan 7 jou</strong></p>
+        <p style="margin-left:0in;">Konpoze *7080#, peze 2 oswa *7080*2#</p>
+        <p style="margin-left:0in;">Pri: 10HTG/ semen/2 vire pa jou</p>
+        <br />
+        <p style="margin-left:0in;"><strong>Kijan pouw jwe</strong></p>
+        <p style="margin-left:0in;">Jwe sou aplikasyon an</p>
+        <p style="margin-left:0in;">Nan paj dakey la, klike sou bwat kado a pouw ouvril. Chak bwat kado koresponn ak kado ou ka jwenn.</p>
+        <p style="margin-left:0in;">Pouw we nan ki nivo ou ye, klike sou “Nivo”</p>
+    </div>
+</main>
+<!-- End Content page  -->
+
+<footer>
+    @Html.Partial("../Partial/_Footer")
+</footer>
+
+@section Scripts{
+
+    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@800&display=swap" rel="stylesheet" />
+
+
+    <script>
+        $(document).ready(function () {
+            activeMenu(3);
+        });
+    </script>
+
+    <!--<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6203932774218464"
+            crossorigin="anonymous"></script>-->
+    <!-- Quảng cáo mở màn hình -->
+    <!--<ins class="adsbygoogle"
+         style="display:block"
+         data-ad-client="ca-pub-6203932774218464"
+         data-ad-slot="5428105394"
+         data-ad-format="auto"
+         data-full-width-responsive="true"></ins>
+    <script>
+        (adsbygoogle = window.adsbygoogle || []).push({});
+    </script>-->
+}
+

+ 101 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Home/Guide_2.cshtml

@@ -0,0 +1,101 @@
+
+@{
+    ViewBag.Title = "Guide";
+}
+
+
+@{
+    UserInfo userInfo = Context.Session.GetComplexData<UserInfo>("userInfo");
+}
+
+<!-- Content page -->
+<main id="page-winnerlist">
+    <div class="title-main">
+        <p>@Lang.Hello @(userInfo != null ? BaseController.DisplayMsisdn(userInfo.msisdn) : "")</p>
+        <p style="font-size: 18px;">@Lang.Introduction</p>
+    </div>
+    <div class="group-info_service">
+        <p style="margin-left:0in;"><strong>INTRODUCING HOW TO PLAY</strong></p>
+        <p style="margin-left:0in;">Lucky Call is a lucky calling service in the form of a lucky spin to have the opportunity to give Data, SMS, 50.000 HTG rewards on the NatID application to customers.</p>
+        <p style="margin-left:0in;"><br>Special gift when you register and accumulate the highest number of points in the month and reach the highest rank first, you will receive a special monthly prize of 50.000HTG. Opportunity to receive many attractive and valuable gifts.</p>
+        <p style="margin-left:0in;"><br>How to earn lucky spin? After ending the call for the day, the system will send a free lucky spin after each call ends and there is no fee for this spin.</p>
+        <p style="margin-left:0in;">Apply: Your call spend balance from your main account.</p>
+        <br />
+        <p style="margin-left:0in;"><br><strong>Register:&nbsp;</strong></p>
+        <p style="margin-left:0in;">Daily package: you will receive 3 spins/day (3 HTG/day/3 turns).</p>
+        <p style="margin-left:0in;">Weekly package: you will receive 14 spins/week (2 spins per day) (10 HTG/day/14 turns).</p>
+        <p style="margin-left:0in;">The number of lucky spins you can receive after each call ends if you register for the service. To get a spin, users must call for at least 1 minute, and calls under 1 minute will not be eligible. Follow this:</p>
+        <ul>
+            <li><span style="">1minute &lt;=A&lt; 2 minutes: 2 spins</span></li>
+            <li><span style="">2 minutes &lt;= A &lt; 5 minutes: 4 spins</span></li>
+            <li><span style="">&gt;= 5 minutes: 7 spins</span></li>
+        </ul>
+        <p style="margin-left:0in;">Use time: The time is 7 days from the date you receive it. Spins will expire after 7 days (23:59:59).</p>
+        <br />
+        <p style="margin-left:0in;"><span style=""><strong>Prize:</strong></span></p>
+        <p style="margin-left:0in;"><br>When spinning, you will have a chance to receive one of the following prizes:</p>
+        <p style="margin-left:0in;"><br><span style=""><strong>Daily Prize</strong></span></p>
+        <ul>
+            <li><span style="">10 SMS (24h)</span></li>
+            <li><span style="">20 SMS (24h)</span></li>
+            <li><span style="">30 SMS (24h)</span></li>
+            <li><span style="">50 SMS (24h)</span></li>
+            <li><span style="">20 MB data (24h)</span></li>
+            <li><span style="">50 MB data (24h)</span></li>
+            <li><span style="">100 MB data&nbsp;(24h)</span></li>
+            <li><span style="">5 coins</span></li>
+            <li><span style="">10 coins</span></li>
+            <li><span style="">20 coins</span></li>
+            <li><span style="">30 coins</span></li>
+        </ul>
+        <p style="margin-left:0in;"><span style=""><strong>Monthly Prize</strong></span></p>
+        <ul>
+            <li><span style="">50.000 HTG</span></li>
+        </ul>
+        <p style="margin-left:0in;"><br>50.000 HTG special prize for the user with the highest score (Ranking).</p>
+        <p style="margin-left:0in;"><br>How to register ?</p>
+        <p style="margin-left:0in;">Register directly on the application, click "Register for daily package" or "Register for weekly package" on the home page</p>
+        <br />
+        <p style="margin-left:0in;"><br><strong>Register via mobile phone.</strong></p>
+        <p style="margin-left:0in;"><strong>Daily package:</strong></p>
+        <p style="margin-left:0in;">Dial *7080#, press 1 or dial *7080*1#</p>
+        <p style="margin-left:0in;">Fee: 3 HTG/day/3 spins</p>
+        <p style="margin-left:0in;"><strong>Weekly package:</strong></p>
+        <p style="margin-left:0in;">Dial *7080#, press 2 or *7080*2#</p>
+        <p style="margin-left:0in;">Fee: 10 HTG/week/2 spins per day</p>
+        <br />
+        <p style="margin-left:0in;"><br><span style=""><strong>How to play:</strong></span></p>
+        <p style="margin-left:0in;">Play on the app</p>
+        <p style="margin-left:0in;">On the home page, click on the gift box to open the gift. Each gift box corresponds to a gift you can receive.</p>
+        <p style="margin-left:0in;">To see your ranking, please click "Score Ranking".</p>
+    </div>
+</main>
+<!-- End Content page  -->
+
+<footer>
+    @Html.Partial("../Partial/_Footer")
+</footer>
+
+@section Scripts{
+
+    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@800&display=swap" rel="stylesheet" />
+
+    <script>
+        $(document).ready(function () {
+            activeMenu(3);
+        });
+    </script>
+
+    <!--<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6203932774218464"
+            crossorigin="anonymous"></script>-->
+    <!-- Quảng cáo mở màn hình -->
+    <!--<ins class="adsbygoogle"
+         style="display:block"
+         data-ad-client="ca-pub-6203932774218464"
+         data-ad-slot="5428105394"
+         data-ad-format="auto"
+         data-full-width-responsive="true"></ins>
+    <script>
+        (adsbygoogle = window.adsbygoogle || []).push({});
+    </script>-->
+}

+ 841 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Home/Index.cshtml

@@ -0,0 +1,841 @@
+
+@{
+    ViewBag.Title = "Lucky Call";
+}
+@using LuckyCallWebCore.Controllers;
+@using LuckyCallWebCore.Extensions;
+@using Newtonsoft.Json;
+@using Microsoft.AspNetCore.Http
+
+@inject IJsonHelper Json;
+
+@{
+    UserInfo userInfo = Context.Session.GetComplexData<UserInfo>("userInfo");
+    prizeWinner lastMonthWinner = Context.Session.GetComplexData<prizeWinner>("lastMonthWinner");
+    //string listPrize = JsonConvert.SerializeObject(BaseController.ListPrize());
+    //string listAds = JsonConvert.SerializeObject(BaseController.ListAds());
+    //var listMission = BaseController.ListMission();
+    //var listAds = BaseController.ListAds();
+
+    String uuid = Context.Session.GetString("uuid");
+    var isMytel = BaseController.IsInternalNumber(userInfo.msisdn);
+
+}
+
+<!-- Animation cat and coin -->
+<div class="animation_page">
+    <div id="lucky_call">
+        <img style="max-width: 280px;" src="~/images/bg_cat.png" alt="cat" />
+        <div id="cat_2"></div>
+        <img class="coin_animate" src="~/images/coin/Coin.png" alt="coin" />
+        <img class="coin_animate1" src="~/images/coin/Coin_1.png" alt="coin" />
+        <img class="coin_animate3" src="~/images/coin/Coin_3.png" alt="coin" />
+        <img class="coin_animate7" src="~/images/coin/Coin_7.png" alt="coin" />
+        <img class="coin_animate8" src="~/images/coin/Coin_8.png" alt="coin" />
+    </div>
+    <img class="lucky_call_text_2" src="~/images/lucky-call.png" alt="den" />
+    <div class="bg_lucky_home"></div>
+</div>
+<!-- Animation cat and coin -->
+<!-- Event daily -->
+<section id="event-daily">
+    <div class="ranking_coin">
+        <img src="~/images/bg_rank.png" alt="rank">
+        <div class="bg-title" onclick="getTopCoin();"> <span class="title">@Lang.RankingCoin</span></div>
+        <div class="row_my-coin">
+            <span class="title_my-coin">@Lang.MyCoin</span>
+            <div class="number_coin">
+                <span id="lblTotalCoin">@userInfo.userCoin.totalCoin</span>
+                <img src="~/images/coin/coin_rank.png" alt="coin">
+            </div>
+        </div>
+    </div>
+    <div class="list-box">
+        @if (userInfo.regInfo != null)
+        {
+            <p class="text-style" style="position: absolute; top:-105px; font-size:16px">
+                <span>@Lang.Hello <b>@BaseController.DisplayMsisdn(userInfo.msisdn)</b></span>
+            </p>
+        }
+
+        <input id="lblRemain" value="@userInfo.spinInfo.remainSpin" type="hidden" />
+        <input id="totalCoin" value="@userInfo.userCoin.totalCoin" type="hidden" />
+        <input id="lblPackg" value="@(userInfo.regInfo == null ? "": userInfo.regInfo.productName)" type="hidden" />
+        <div class="box-spin-of-7">
+            <span>@Lang.Spin</span> <span><span id="lblUsedSpin">@userInfo.spinInfo.usedSpin</span> @Lang.of <span id="lblTotalSpin">@userInfo.spinInfo.totalSpin</span></span>
+        </div>
+        <div class="list-box-item">
+            <img class="gift-box gift_1" src="~/images/gift/gift_1.png" alt="gift">
+            <img class="gift-box gift_2" src="~/images/gift/gift_2.png" alt="gift">
+            <img class="gift-box gift_3" src="~/images/gift/gift_3.png" alt="gift">
+        </div>
+        <p class="text-style">@Lang.ClickToSpin</p>
+        <div class="list-box-item">
+            <img class="gift-box gift_4" src="~/images/gift/gift_4.png" alt="gift">
+            <img class="gift-box gift_5" src="~/images/gift/gift_5.png" alt="gift">
+            <img class="gift-box gift_6" src="~/images/gift/gift_6.png" alt="gift">
+        </div>
+    </div>
+</section>
+<!-- End event daily -->
+<!-- Gift phone right -->
+<div class="gift_phone">
+    <div class="gift_phone_1">
+        <img class="img_1" src="~/images/daily/bg-cirAni.png" alt="bg">
+        <img class="img_2" src="~/images/daily/cirAni.png" alt="cir">
+        <img class="img_3" src="~/images/daily/iphone.png" alt="iphone" onclick="showElement('dialogIphone');">
+        <input type="hidden" id="period" value="3" />
+    </div>
+    <a class="item_contact" href="/Home/WinnerList">
+        <img src="~/images/daily/bg_event.png" alt="bg">
+        <div class="info">
+            <img src="~/images/daily/king.svg" alt="kinh">
+            <span style="margin-top: 10px;">@Lang.LoyaltyPoint</span>
+        </div>
+    </a>
+
+    <a class="item_contact phone" href="/Home/WinnerList">
+        <img src="~/images/daily/bg_event.png" alt="bg">
+        <div class="info">
+            <img src="~/images/daily/phone.svg" alt="kinh">
+            <span style="margin-top: 10px;">@Lang.MinutesCall</span>
+        </div>
+    </a>
+</div>
+<!-- End gift phone right -->
+<!-- Logo MYID -->
+<div class="id_my">
+    <img src="~/images/daily/id.png" alt="phone">
+</div>
+<!-- End logo MyID -->
+<!-- Popup daily -->
+@if (userInfo.regInfo == null)
+{
+    <div id="popup_daily">
+        <p class="text-style text_hello">
+            <span>@Lang.Hello <b>@BaseController.DisplayMsisdn(userInfo.msisdn)</b></span>
+        </p>
+        @*<div class="close_popup">
+                <img src="~/images/icon/close.svg" alt="close">
+            </div>*@
+        <div class="row_top">
+            @foreach (productInfo packg in BaseController.ListPackg())
+            {
+                <div class="img">
+                    <img class="img_abso" src="@packg.imageUrl" alt="cat">
+                </div>
+                <div class="title_event" onclick="registerOtp('@packg.productName');">@Lang.Register <br> @packg.GetDisplayname()</div>
+            }
+            @*<div class="img">
+                    <img class="img_abso" src="~/images/daily/Cat_two.png" alt="cat">
+                </div>
+                <div class="title_event">@Lang.Register <br> WEEKLY package</div>*@
+        </div>
+        @*<p class="title_bot">
+                @Lang.RegisterMoreInfo
+            </p>*@
+    </div>
+}
+<!-- End popup daily -->
+<!-- Overlay gift open -->
+<div id="overlay_opened" class="overlay-gift-open" style="display: none">
+    <img id="box-gift"
+         class="img-open"
+         src="~/images/gift/Frame 157.png"
+         alt="gift"
+         style="width: 225px;height: 231px;" />
+    <img class="bg-call-gift" src="~/images/daily/cirAni_2.png" alt="gìft" />
+    <img class="bg-call-gift_2" src="~/images/gift/bg-gift.png" alt="gìft" />
+</div>
+<!-- Overlay gift open -->
+<!-- Overlay page -->
+<div id="overlay-gift" class="overlay-gift" style="display: none">
+    <div id="openGift" class="gift"></div>
+    <img id="bg_cir-gift"
+         class="bg_gift"
+         src="~/images/gift/bg_gift.png"
+         alt="bg" />
+</div>
+<!-- End Overlay page -->
+<!-- Lucky popup -->
+<div id="modal_congra" class="bg_overlay-login-error" style="display: none">
+    <div class="popup_warning">
+        <div class="header-popup_warning">@Lang.Congratulations</div>
+        <div class="body-popup_warning">
+            <p class="desc">@Lang.YouWon</p>
+            <div class="text_box" id="prizeName"></div>
+            <button class="btn_ok" onclick="collect();">@Lang.Collect</button>
+        </div>
+    </div>
+</div>
+<!-- End popup -->
+<!-- Rule -->
+<div class="bg_overlay-login-error" id="dialogRule" style="display:none; z-index:100">
+    <div class="popup_warning bg-open-phone">
+        <img class="icon-close" src="~/images/icon/close.svg" alt="close" onclick="closeDialog('dialogRule')" />
+        <div class="header-popup_warning " id="dialogHeader">@Lang.Rule</div>
+        <div class="body-popup_warning">
+            <div class="box-content_phone">
+                <p class="title_otp" style="text-align:justify">
+                    @Html.Raw(Lang.RuleDetail1)
+                </p>
+                <p class="title_otp" style="text-align:justify">
+                    @Html.Raw(Lang.RuleDetail2)
+                </p>
+            </div>
+            <div class="group_btn">
+                <button class="btn_ok" onclick="closeDialog('dialogRule');">@Lang.Close</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- End Popup Rule -->
+<!-- Adv -->
+<div class="bg_overlay-login-error " id="dialogAdv" style="display:none; z-index:100">
+    <div class="popup_warning bg-open-phone">
+        <div class="body-popup_adv">
+            <div class="box-content_phone">
+                <img src="~/images/adv.jpeg" style="width: 100%"/>
+            </div>
+            <button class="btn_ok" onclick="closeDialog('dialogAdv');">@Lang.Close</button>
+        </div>
+    </div>
+</div>
+
+<!-- Open gift -->
+<div class="bg_overlay-login-error " id="dialogIphone" style="display:none; z-index:100">
+    <div class="popup_warning bg-open-phone">
+        <div class="header-popup_warning ">@Lang.SpecialPrize</div>
+        <div class="body-popup_warning">
+            <div class="box-content_phone">
+                <p class="content_phone">
+                    @Lang.SpecialPrizeDetail
+                </p>
+                <p class="title_phone">@Lang.LastMonthWinner @(lastMonthWinner != null ? BaseController.HiddenMsisdn(lastMonthWinner.msisdn) : "")</p>
+                <div class="opened-phone">
+                    <img class="img_1" src="~/images/daily/iphone_2.png" alt="phone">
+                    <img class="img_2" src="~/images/daily/cirAni_2.png" alt="phone">
+                    <img class="img_3" src="~/images/daily/bg_cir_2.png" alt="phone">
+                </div>
+            </div>
+            <button class="btn_ok" onclick="closeDialog('dialogIphone');">@Lang.Close</button>
+        </div>
+    </div>
+</div>
+ <!-- Modal leader board -->
+<div class="bg_overlay-login-error" style="display:none" id="modal_leader_board">
+    <div class="content-leader-board">
+        <div class="center">
+            <img src="~/images/leaderboard/rank.png" alt="rank">
+        </div>
+        <div class="row-column-table">
+            <span>@Lang.HighScore</span>
+            <span>@Lang.PhoneNumber</span>
+            <span>@Lang.TotalCoin</span>
+            <span>@Lang.Time</span>
+        </div>
+        <p class="text-perior">@Lang.Period: 01 - @DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month)/@DateTime.Now.Month.ToString("00")</p>
+        <div class="table-data" id="leader-board">
+
+        </div>
+    </div>
+</div>
+<!-- End Modal leader board -->
+
+<img id="wheelImage" />
+
+<footer>
+    @Html.Partial("../Partial/_Footer")
+</footer>
+
+@section Scripts{
+    @*<script type="text/javascript" src="~/js/Winwheel.js"></script>*@
+    @*<script type="text/javascript" src="~/js/TweenMax.min.js"></script>*@
+    @*<script type="text/javascript" src="https://unpkg.com/gsap@2.1.2/./umd/TweenMax.js"></script>*@
+
+
+
+    <script>
+
+        @*var listPrize = JSON.parse('@Html.Raw(listPrize)');*@
+        @*var listMission = JSON.parse('@Html.Raw(JsonConvert.SerializeObject(listMission))');
+        var listAds = JSON.parse('@Html.Raw(JsonConvert.SerializeObject(listAds))');*@
+        //var sAngle = 360 / listPrize.length;
+
+        var value = 0;
+        //var repeat;
+        var countClicked = 0;
+        var startAngle = 0;
+        var startTime;
+
+        function stopWheel(content) {
+            console.log("stopWheel: " + content);
+            clicked = false;
+            countClicked = 0;
+            //$("#spin_button").attr('disabled', false);
+        }
+
+        function getPosition(prize) {
+            console.log(prize);
+            stopWheel();
+            if (lang == "en") {
+                $("#prizeName").html(prize.description2);
+            } else {
+                $("#prizeName").html(prize.description1);
+            }
+
+            openGift();
+        }
+
+        $('.gift-box').click(function () {
+
+            //$(".gift-box").attr('disabled', true);
+            console.log("click gift box");
+            if (clicked == true) {
+                countClicked++;
+            }
+            else {
+                console.log($(this).attr("src"));
+                $("#box-gift").attr("src", $(this).attr("src"));
+                clicked = true;
+
+                if (!validateSpin()) {
+                    stopWheel();
+                    return;
+                }
+
+                // repeat
+                startTime = new Date();
+                wheel();
+                //repeat = setInterval(function () {
+                //    wheel();
+                //}, 1000);
+
+                $.ajax({
+                    url: "/Home/SpinAction",
+                    data: {
+                        __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val()
+                    },
+                    type: "POST",
+                    success: function (data) {
+                        console.log(data);
+                        if (data.error == "0") {
+                            //$("#prizeId").val(data.prize.id);
+                            $(".btn-share-facebook").attr("data-bind", data.prize.id);
+                            $(".btn-share-facebook").val(data.playId);
+                            //$(".btn-share-facebook").attr("href", "/Home/PrizeConfirm?prizeId=" + data.prize.id + "&playId=" + data.playId);
+
+                            // clear interval
+                            var now = new Date();
+                            var waitingTime = startTime - now;
+                            if (waitingTime < 2000) {
+                                waitingTime = 2000 - waitingTime;
+                            } else {
+                                waitingTime = 0;
+                            }
+                            console.log("waitingTime " + waitingTime);
+                            setTimeout(function () {
+                                //clearInterval(repeat);
+                                getPosition(data.prize);
+                            }, waitingTime);
+
+
+                            // change remain
+                            //$("#lastAction").val(data.lastAction);
+                            $("#lblRemain").val(data.remainSpin);
+                            $("#lblUsedSpin").html(data.usedSpin);
+                            $("#lblTotalSpin").html(data.totalSpin);
+
+                            if (data.totalCoin > 0) {
+                                console.log("set " + data.totalCoin);
+                                $("#totalCoin").val(data.totalCoin);
+                            }
+                        } else {
+                            //clearInterval(repeat);
+                            stopWheel(data.content);
+                            if (data.href != null && data.href != "") {
+                                location.href = data.href;
+                            }
+                            // show error
+                            alert(data.content);
+                        }
+                    },
+                    error: function (req, st, error) {
+                        //clearInterval(repeat);
+                        stopWheel(error);
+                    }
+                });
+
+                //setTimeout(() => {
+                //    //Chia lấy dư cho 360 để lấy lượng quay không hoàn thành một vòng 360deg
+                //    getPosition(value % 360);
+                //}, 5000);
+            }
+        })
+        $('.congratulation__close').click(function () {
+            $('.congratulation').fadeOut();
+        })
+        $('.congratulation').click(function (event) {
+            if (event.target != this)
+                return;
+            $(this).fadeOut();
+        });
+
+
+        function wheel() {
+            //let random = 4 * 360; //  quay 7 vong truoc //Math.floor((Math.random() * 360) + 7200);
+            //value += random;
+            //$(".wheel__inner").css("transition", "cubic-bezier(1, 1, 1, 1) 1s");
+            //$(".wheel__inner").css("transform", `rotate(${value}deg)`);
+            resetGift();
+            $("#overlay-gift").show();
+        };
+
+        function animateValue(id, start, end, duration) {
+            if (start === end) return;
+            var range = end - start;
+            var current = start;
+            var increment = end > start ? 1 : -1;
+            var stepTime = Math.abs(Math.floor(duration / range));
+            var obj = document.getElementById(id);
+            var timer = setInterval(function () {
+                current += increment;
+                obj.innerHTML = current;
+                if (current == end) {
+                    clearInterval(timer);
+                }
+            }, stepTime);
+        }
+
+
+        function collect() {
+            closeDialog('modal_congra');
+            var totalCoinNew = parseInt($("#totalCoin").val());
+            var oldCoin = parseInt($("#lblTotalCoin").html());
+            console.log("new " + totalCoinNew + ', old ' + oldCoin);
+            if (totalCoinNew != oldCoin) {
+                animateValue("lblTotalCoin", oldCoin, totalCoinNew, 750);
+            }
+        }
+    </script>
+
+    <script>
+
+        function showModalBuyOtp() {
+            $(".modal-body-buy").hide();
+            $(".modal-body-otp").show();
+            $(".modal-body-result").hide();
+
+            $("#modalBuyTurn .logo-modal").attr("src", "/wheel/dia_otp.png");
+        }
+
+        function showModalBuyTurn() {
+            $("#modalBuyTurn").modal("show");
+            $(".modal-body-buy").show();
+            $(".modal-body-otp").hide();
+            $(".modal-body-result").hide();
+
+            $("#modalBuyTurn .logo-modal").attr("src", "/wheel/dia_delete.png");
+            $("#modalBuyTurn .p-content-error").html("");
+        }
+
+        function showModalResult(isSuccess) {
+            $(".modal-body-buy").hide();
+            $(".modal-body-otp").hide();
+            $(".modal-body-result").show();
+            if (isSuccess) {
+                $(".p-content-result").html('Success');
+                $("#modalBuyTurn .logo-modal").attr("src", "/wheel/dia_success.png");
+            } else {
+                $("#modalBuyTurn .logo-modal").attr("src", "/wheel/dia_close.png");
+            }
+        }
+
+        $(".btn-buy-otp").click(function () {
+            // send post
+            $.ajax({
+                url: "/Home/BuyTurnOtp",
+                data: {
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val()
+                },
+                type: "POST",
+                success: function (data) {
+                    console.log(data);
+                    if (data.error == "0") {
+                        // show otp input
+                        showModalBuyOtp();
+
+                        $("#otp1").val("");
+                        $("#otp2").val("");
+                        $("#otp3").val("");
+                        $("#otp4").val("");
+                        $("#otp5").val("");
+                        $("#otp6").val("");
+                        $("#otp1").focus();
+                    } else {
+                        $(".p-content-error").html(data.content);
+                    }
+                },
+                error: function (req, st, error) {
+                    $(".p-content-otp").html("Error:  " + error);
+                }
+            });
+        });
+
+        $(".btn-buy-confirm").click(function () {
+            var otp = $("#otp1").val() + $("#otp2").val() + $("#otp3").val() + $("#otp4").val() + $("#otp5").val() + $("#otp6").val();
+            // send post
+            $.ajax({
+                url: "/Home/BuyTurnConfirm",
+                data: {
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val(),
+                    otp: otp
+                },
+                type: "POST",
+                success: function (data) {
+                    console.log(data);
+                    if (data.error == "0") {
+
+                        showModalResult(true);
+
+                    } else {
+                        if (data.error == "1500") {
+                            // not enough money
+                            $(".p-content-result").html(data.content);
+                            showModalResult(false);
+                        } else {
+                            $(".p-content-error").html(data.content);
+                        }
+                    }
+                },
+                error: function (req, st, error) {
+                    $(".p-content-otp").html("Error:  " + error);
+                }
+            });
+        });
+
+        $(".input-otp").on('keydown', function (e) {
+            if (e.which >= 48 && e.which <= 57) {
+                var num = String.fromCharCode();
+                $(this).val(num);
+            }
+        });
+
+        $(".input-otp").on('keyup', function (e) {
+            if (e.which >= 48 && e.which <= 57) {
+                $(this).next(".input-otp").focus();
+            }
+        });
+
+        function validateSpin() {
+            var remainSpin = parseInt($("#lblRemain").val());
+            console.log(remainSpin);
+
+            if (remainSpin <= 0) {
+                console.log("remain 0");
+                let packg = $("#lblPackg").val();
+                console.log(packg);
+                // alert buy spin
+                if (packg == null || packg == "")
+                {
+                    // show dialog register
+                    showElement('dialogRegister');
+                } else {
+                    // show error
+                    showDialog('dialogResult', "@Lang.OutOfTurn", '@Lang.OutOfTurnDetail');
+                }
+                return false;
+            }
+            return true;
+        }
+
+        function randomMission(listMission) {
+            var min = 1;
+            var max = listMission.length;
+            var idx = Math.floor(Math.random() * (max - min + 1) + min);
+
+            var mission = listMission[idx - 1];
+            var url = mission.url.replace("#uuid#", "@uuid");
+            var fullContent = '<button type="button" class="btn btn-invite btn-orange btn-small" id="btn-invite"'
+                    + ' data-bind="' + url + '"'
+                    + ' data-action="MISSION"'
+                    + ' onclick="invite_action(&quot;MISSION&quot;,&quot;' + url + '&quot;)"'
+                    + '>Visit</button>';
+            $("#mission-content").html(fullContent);
+        }
+
+        function randomAds(listAds) {
+            var min = 1;
+            var max = listAds.length;
+            var idx = Math.floor(Math.random() * (max - min + 1) + min);
+
+            var ads = listAds[idx - 1];
+            console.log(ads);
+            var fullContent = '';
+            if (ads.videoUrl != null && ads.videoUrl != "") {
+                fullContent += '<video src="' + ads.videoUrl + '" id="video_ads" style="display:none"></video>';
+                fullContent += '<button type="button" class="btn btn-orange btn-small" id="btn-ads" action="video"'
+                    + ' onclick="view_ads();"'
+                    + '>View'
+                    + '</button>';
+            } else {
+                fullContent += '<image src="' + ads.imageUrl + '" id="image_ads" style="display:none" />';
+                fullContent += '<button type="button" class="btn btn-orange btn-small" id="btn-ads" action="image"'
+                    + ' onclick="view_ads();"'
+                    + '>View'
+                    + '</button>';
+            }
+
+
+            $("#mission-content").html(fullContent);
+        }
+
+        function randomInvite() {
+            var min = 1;
+            var max = 2;
+            var idx = Math.floor(Math.random() * (max - min + 1) + min);
+
+            var content;
+            if (idx == 1) {
+                content = '<button type="button" class="btn btn-invite btn-orange btn-small" id="btn-invite" data-bind="whatsapp" data-action="INVITE" onclick="invite_action(&quot;INVITE&quot;,&quot;whatsapp&quot;)">Invite</button>';
+            @*} else if (idx == 2) {
+                content = '<button type="button" class="btn btn-invite btn-orange btn-small" id="btn-invite" data-bind="mocha" data-action="INVITE" onclick="invite_action(&quot;INVITE&quot;,&quot;mocha&quot;)">@Lang.Invite</button>';*@
+            } else if (idx == 2) {
+                content = '<button type="button" class="btn btn-invite btn-orange btn-small" id="btn-invite" data-bind="sms" data-action="INVITE"  onclick="invite_action(&quot;INVITE&quot;,&quot;sms&quot;)">Invite</button>';
+            }
+
+
+            $("#invite-content").html(content);
+        }
+
+        $(".btn-confirm").click(function () {
+
+            $("#modalPrize .close-modal").show();
+            $("#modalPrize").modal("hide");
+
+            var remainSpin = parseInt($("#lblRemain").val());
+
+            if (remainSpin <= 0) {
+                // show modal buy turn
+                showModalBuyTurn();
+            }
+
+            //if (remainSpin <= 0) {
+            //    location.href = "/Home/Prize";
+            //} else {
+            //    $("#modalPrize").modal("hide");
+            //}
+        });
+
+        function getMobileOperatingSystem() {
+            var userAgent = navigator.userAgent || navigator.vendor || window.opera;
+
+            // Windows Phone must come first because its UA also contains "Android"
+            if (/windows phone/i.test(userAgent)) {
+                return "Windows Phone";
+            }
+
+            if (/android/i.test(userAgent)) {
+                return "Android";
+            }
+
+            // iOS detection from: http://stackoverflow.com/a/9039885/177710
+            if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {
+                return "iOS";
+            }
+
+            return "unknown";
+        }
+
+        function invite_action(action, url) {
+            startSpinner("btn-invite");
+            var content = encodeURIComponent('Invite');
+            console.log(content);
+            if (action == "INVITE") {
+                switch (url) {
+                    case "mocha":
+                        //url = "mocha://share?ref=" + content;
+                        url = "mocha://invite";
+                        break;
+                    case "whatsapp":
+                        url = "mocha://browser?ref=" + encodeURIComponent("https://api.whatsapp.com/send?text=" + content);
+                        break;
+                    default:
+                        var agent = getMobileOperatingSystem();
+                        if (agent == "iOS") {
+                            url = "sms:&body=" + content;
+                        } else {
+                            url = "sms:?body=" + content;
+                        }
+                        break;
+                }
+
+                // show close button
+                $("#modalInvite .close-modal").show();
+            } else {
+                // show close button
+                $("#modalMission .close-modal").show();
+            }
+
+
+            $.ajax({
+                url: "/Home/DoMission",
+                data: {
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val(),
+                    actionCode: action,
+                    url: url
+                },
+                type: "POST",
+                success: function (data) {
+                    console.log(data);
+                    if (data.error == "0") {
+                        //$("#lastAction").val("");
+
+                        console.log(data.href);
+                        if (data.href != null) {
+
+                        }
+                    } else {
+                        alert(data.content);
+                    }
+                },
+                error: function (req, st, error) {
+                    alert(error);
+                }
+            });
+            window.open(url, "_parent"); // -> not working on ios
+            //console.log(windowReference);
+            //windowReference.location = url;
+
+            stopSpinner("btn-invite");
+        }
+
+        function view_ads() {
+            var action = $("#btn-ads").attr('action');
+            if (action == "close") {
+                $("#btn-ads").attr('action', "view");
+                $("#modalMission").modal("hide");
+                $("#modalMission .close-modal").hide();
+            } else {
+                if (action == "video") {
+                    $("#video_ads").show();
+                    document.getElementById("video_ads").play();
+                } else if (action == "image") {
+                    $("#image_ads").show();
+                }
+                // disable button
+                $("#btn-ads").attr('disabled', true);
+                $("#btn-ads").attr('action', "close");
+                $("#btn-ads").html("5s");
+                // countdown
+                var countDownDate = new Date().getTime() + 5000;
+                var x = setInterval(function () {
+                    // Get today's date and time
+                    var now = new Date().getTime();
+                    var distance = countDownDate - now;
+                    var seconds = Math.round((distance % (1000 * 60)) / 1000);
+                    $("#btn-ads").html(seconds + "s");
+
+                    // If the count down is finished, write some text
+                    if (distance < 0) {
+                        clearInterval(x);
+                        // do mission
+                        $.ajax({
+                            url: "/Home/DoMission",
+                            data: {
+                                __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val(),
+                                actionCode: action
+                            },
+                            type: "POST",
+                            success: function (data) {
+                                console.log(data);
+                                if (data.error == "0") {
+                                    //$("#lastAction").val("");
+                                } else {
+                                    console.log(data.content);
+                                }
+                            },
+                            error: function (req, st, error) {
+                                console.log(error);
+                            }
+                        });
+
+                        $("#btn-ads").attr('disabled', false);
+                        $("#btn-ads").html("@Lang.Close");
+                        $("#modalMission .close-modal").show();
+                    }
+                }, 1000);
+            }
+        }
+
+    </script>
+
+    <script>
+        function getTopCoin() {
+            console.log("getTopCoin ");
+            // get data
+            $.ajax({
+                url: "/Home/GetTopCoin",
+                data: {
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val()
+                },
+                type: "POST",
+                success: function (data) {
+                    $("#leader-board").html(data);
+                    // display page
+                    var curPage = $("#leader-board .pagination span.active-page").html();
+                    $("#leader-board .row-item[page!=" + curPage + "]").hide();
+                    $("#leader-board .row-item[page=" + curPage + "]").show();
+                    // display rank
+                    @*if (data.userCoin.rownum > 0) {
+                        $("#myRank").html(data.userCoin.rownum);
+                    } else {
+                        $("#myRank").html('@Lang.NoRanking');
+                    }*@
+                    showElement("modal_leader_board");
+                },
+                error: function (req) {
+                    console.log(req.responseText);
+                }
+            });
+        }
+
+        $("#leader-board").on('click', '.pagination span', function () {
+            let curPage = $(this).html();
+            console.log("page " + curPage);
+            $("#leader-board .pagination span").removeClass("active-page");
+            $(this).addClass("active-page");
+            // show value
+            $("#leader-board .row-item[page!=" + curPage + "]").hide();
+            $("#leader-board .row-item[page=" + curPage + "]").show();
+        })
+    </script>
+
+    <script>
+        console.log("Load");
+        if (sessionStorage.getItem("shown") === null) {
+            showElement("loading-page");
+            $("footer").hide();
+            animateValue("percent-load", 0, 100, 2000);
+        }
+
+        $(document).ready(function () {
+            console.log("Ready " + '@isMytel');
+            if ('@isMytel.ToString().ToUpper()' == 'FALSE') {
+                sessionStorage.removeItem("shown");
+                showDialog("dialogNotAllow");
+            } else {
+                if (sessionStorage.getItem("shown") === null) {
+                    setTimeout(function () {
+                        sessionStorage.setItem("shown", "true");
+                        hideElement("loading-page");
+                        $("footer").show();
+                        //showElement("dialogAdv");
+                    }, 2000);
+                }
+                activeMenu(0);
+            }
+        });
+    </script>
+
+}

+ 153 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Home/Login.cshtml

@@ -0,0 +1,153 @@
+
+@{
+    ViewBag.Title = "Lucky Call";
+}
+@using LuckyCallWebCore.Controllers;
+@using LuckyCallWebCore.Extensions;
+@using Newtonsoft.Json;
+@using Microsoft.AspNetCore.Http
+
+@inject IJsonHelper Json;
+
+@{ 
+
+}
+
+<!-- Animation cat and coin -->
+<div class="animation_page">
+    <div id="lucky_call">
+        <img src="~/images/bg_cat.png" alt="cat">
+        <div id="cat"></div>
+        <img class="coin_animate" src="~/images/coin/Coin.png" alt="coin">
+        <img class="coin_animate1" src="~/images/coin/Coin_1.png" alt="coin">
+        <img class="coin_animate2" src="~/images/coin/Coin_2.png" alt="coin">
+        <img class="coin_animate3" src="~/images/coin/Coin_3.png" alt="coin">
+        <img class="coin_animate4" src="~/images/coin/Coin_4.png" alt="coin">
+        <img class="coin_animate5" src="~/images/coin/Coin_5.png" alt="coin">
+        <img class="coin_animate6" src="~/images/coin/Coin_6.png" alt="coin">
+        <img class="coin_animate7" src="~/images/coin/Coin_7.png" alt="coin">
+        <img class="coin_animate8" src="~/images/coin/Coin_8.png" alt="coin">
+    </div>
+    <img class="lucky_call_text" src="~/images/lucky.png" alt="den">
+    <div class="bg_lucky"></div>
+</div>
+<!-- Animation cat and coin -->
+<div class="footer_page">
+    <img src="~/images/myID.png" alt="NatId">
+    <p class="text-style">@Lang.EnterLogin</p>
+    <div style="position:relative">
+        <input class="input-style" value="" id="phoneNumber" type="text" placeholder="@Lang.PhoneNumber" />
+        <img class="light_one" src="~/images/light.png" alt="light">
+    </div>
+    <div style="position:relative">
+        <input class="input-style" value="" id="password" type="password" placeholder="@Lang.Password" />
+        <img class="light_two" src="~/images/light.png" alt="light">
+    </div>
+    <button class="btn-style" id="btnLogin">@Lang.Login</button>
+    <div style="width: 255px">
+        <a class="text-style" style="float:left" id="btnResetPassword">@Lang.ForgotPassword</a>
+        <a class="text-style" style="float:right" id="btnCreateAccount">@Lang.CreateAccount</a>
+    </div>
+</div>
+
+<style>
+</style>
+
+@section Scripts{
+
+    <script>
+        $(document).ready(function () {
+
+
+        });
+
+        $('#btnCreateAccount').click(function () {
+            var phoneNumber = $('#phoneNumber').val();
+            var btnId = this.id;
+            startSpinner(btnId);
+            $.ajax({
+                url: "/Home/SignupAction",
+                data: {
+                    phoneNumber: phoneNumber,
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val()
+                    //password: password
+                },
+                type: "POST",
+                success: function (data) {
+                    stopSpinner(btnId);
+                    console.log(data);
+                    if (data.error != "0") {
+                        // failed
+                        showDialog('dialogResult', "@Lang.Error", data.content);
+                    } else {
+                        showDialog('dialogResult', "@Lang.Success", data.content);
+                    }
+                },
+                error: function (req, st, error) {
+                    stopSpinner(btnId);
+                }
+            })
+        });
+
+        $('#btnResetPassword').click(function () {
+            var phoneNumber = $('#phoneNumber').val();
+            var btnId = this.id;
+            startSpinner(btnId);
+            $.ajax({
+                url: "/Home/ResetPassword",
+                data: {
+                    phoneNumber: phoneNumber,
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val()
+                    //password: password
+                },
+                type: "POST",
+                success: function (data) {
+                    stopSpinner(btnId);
+                    console.log(data);
+                    if (data.error != "0") {
+                        // failed
+                        showDialog('dialogResult', "@Lang.Error", data.content);
+                    } else {
+                        showDialog('dialogResult', "@Lang.Success", data.content);
+                    }
+                },
+                error: function (req, st, error) {
+                    stopSpinner(btnId);
+                }
+            })
+        });
+
+        $('#btnLogin').click(function () {
+            var phoneNumber = $('#phoneNumber').val();
+            var password = $('#password').val();
+            //var currentLocation = window.location.href;
+            //console.log(currentLocation);
+            var btnId = this.id;
+            startSpinner(btnId);
+            $.ajax({
+                url: "/Home/LoginAction",
+                data: {
+                    phoneNumber: phoneNumber,
+                    password: password,
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val()
+                },
+                type: "POST",
+                success: function (data) {
+                    stopSpinner(btnId);
+                    if (data.error != "0") {
+                        // failed
+                        showDialog('dialogResult', "@Lang.Error", data.content);
+                    } else {
+                        console.log(data.msisdn);
+                        location.href = "/Home/Index";
+                    }
+                },
+                error: function (req, st, error) {
+                    stopSpinner(btnId);
+                }
+            })
+        });
+    </script>
+
+
+}

+ 14 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Home/NotSupport.cshtml

@@ -0,0 +1,14 @@
+@model ErrorViewModel
+@{
+    ViewData["Title"] = "Not Support";
+}
+
+<footer>
+    @Html.Partial("../Partial/_Footer")
+</footer>
+
+@section Scripts{
+    <script>
+        showDialog("dialogNotAllow");
+    </script>
+}

+ 151 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Home/UserPrize.cshtml

@@ -0,0 +1,151 @@
+
+@{
+    ViewBag.Title = "LuckyDraw";
+}
+@using ServiceAPI;
+@using LuckyCallWebCore.Source;
+@using LuckyCallWebCore.Controllers;
+@using LuckyCallWebCore.Extensions;
+@using System.Globalization;
+@using Newtonsoft.Json;
+
+@model LuckyWheelModel
+
+@{
+    var mapPrize = JsonConvert.SerializeObject(BaseController.MapPrize());
+
+    UserInfo userInfo = Context.Session.GetComplexData<UserInfo>("userInfo");
+    //var listMission = BaseController.ListMission();
+    //List<LuckyCallUtils.segment> segments = BaseController.ListSegments();
+
+    var totalPage = Model.totalPage;
+    var currentPage = int.Parse(Model.page ?? "1");
+}
+
+
+<input id="param-page" type="hidden" value="@currentPage" />
+<input id="param-totalpage" type="hidden" value="@totalPage" />
+
+
+<!-- Content page -->
+<main id="page-winnerlist">
+    <div class="title-main">
+        <p>@Lang.Hello @BaseController.DisplayMsisdn(userInfo.msisdn)</p>
+        <p>@Lang.MyGift</p>
+    </div>
+    <div class="group_winner">
+        <div class="group_winner-item my-gift-header">
+            <span>@Lang.No</span>
+            <span>@Lang.Date</span>
+            <span>@Lang.Prize</span>
+        </div>
+        <div class="table-data-gift">
+            <div class="list-data">
+                @if (Model != null && Model.listWinner != null)
+                {
+                    for (int i = 0; i < Model.listWinner.Length; i++)
+                    {
+                        var prize = Model.listWinner[i];
+                        <div class="row-data">
+                            <span>@(i+1)</span>
+                            <span>@prize.codeTime</span>
+                            <span class="prize-text">@prize.GetPrizeName()</span>
+                        </div>
+                    }
+                }
+                else
+                {
+                    <div class="row-data">
+                        <span>@Lang.NoMorePrize</span>
+                    </div>
+                }
+
+            </div>
+            <div class="pagination">
+                <a class="prev"><img src="~/images/leaderboard/left.svg" alt="pre"></a>
+                @if (currentPage > 2 && totalPage > 3)
+                {
+                    <a href="@("/Home/UserPrize?page=" + (currentPage-1))"><span>...</span></a>
+                }
+                @if (currentPage > 2 && currentPage == totalPage)
+                {
+                    <a href="@("/Home/UserPrize?page=" + (currentPage-2))"><span>@(currentPage-2)</span></a>
+                }
+                @if (currentPage > 1)
+                {
+                    <a href="@("/Home/UserPrize?page=" + (currentPage-1))"><span>@(currentPage-1)</span></a>
+                }
+                <a href="@("/Home/UserPrize?page=" + (currentPage))"><span class="active-page">@(currentPage)</span></a>
+                @if (currentPage < totalPage)
+                {
+                    <a href="@("/Home/UserPrize?page=" + (currentPage+1))"><span>@(currentPage+1)</span></a>
+                }
+                @if (totalPage >= 3 && currentPage == 1)
+                {
+                    <a href="@("/Home/UserPrize?page=" + (currentPage+2))"><span>@(currentPage+2)</span></a>
+                }
+                @if (currentPage <= totalPage - 2)
+                {
+                    <a href="@("/Home/UserPrize?page=" + (currentPage+1))"><span>...</span></a>
+                }
+                <a class="next"><img src="~/images/leaderboard/right.svg" alt="next"></a>
+
+            </div>
+        </div>
+    </div>
+
+</main>
+<!-- End Content page  -->
+
+<footer>
+    @Html.Partial("../Partial/_Footer")
+</footer>
+
+@section Scripts{
+    <script>
+        $(document).ready(function () {
+
+            var page = parseInt($("#param-page").val());
+            var totalpage = parseInt($("#param-totalpage").val());
+
+            if (page == 1) {
+                $(".prev").addClass("disabled");
+            } else {
+                $(".prev").attr("href", "/Home/UserPrize?page=" + (page - 1));
+            }
+            if (page >= totalpage) {
+                $(".next").addClass("disabled");
+            } else {
+                $(".next").attr("href", "/Home/UserPrize?page=" + (page + 1));
+            }
+
+            //$(".pagination a span").removeClass("active-page");
+            //$(".pagination a span").each(function () {
+            //    if ($(this).html() == (page)) {
+            //        $(this).addClass("active-page");
+            //    }
+            //});
+        });
+    </script>
+
+    <script>
+        $(document).ready(function () {
+            activeMenu(1);
+            $("body").addClass("bg-winnerList");
+        });
+    </script>
+
+    <!--<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6203932774218464"
+            crossorigin="anonymous"></script>-->
+    <!-- Quảng cáo mở màn hình -->
+    <!--<ins class="adsbygoogle"
+         style="display:block"
+         data-ad-client="ca-pub-6203932774218464"
+         data-ad-slot="5428105394"
+         data-ad-format="auto"
+         data-full-width-responsive="true"></ins>
+    <script>
+        (adsbygoogle = window.adsbygoogle || []).push({});
+    </script>-->
+}
+

+ 107 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Home/WinnerList.cshtml

@@ -0,0 +1,107 @@
+
+@{
+    ViewBag.Title = "Winner List";
+}
+@using ServiceAPI;
+@using LuckyCallWebCore.Source;
+@using LuckyCallWebCore.Controllers;
+@using LuckyCallWebCore.Extensions;
+@using System.Globalization;
+@using Newtonsoft.Json;
+
+
+@{
+    var mapPrize = JsonConvert.SerializeObject(BaseController.MapPrize());
+
+    UserInfo userInfo = Context.Session.GetComplexData<UserInfo>("userInfo");
+}
+
+
+<input type="hidden" id="period" />
+<!-- Content page -->
+<main id="page-winnerlist">
+    <div class="title-main">
+        <p>@Lang.Hello @BaseController.DisplayMsisdn(userInfo.msisdn)</p>
+        <p>@Lang.WinnerList</p>
+    </div>
+    <div class="group_winner">
+        <div class="group_winner-item" onclick="winnerList('3');">
+            @Lang.MonthlyPrize
+        </div>
+        <div class="winner_section" onclick="winnerList('3');">
+            <img src="~/images/winnerlist/img_1.png" alt="img1">
+            <div class="btn_winnerList">@Lang.WinnerList</div>
+        </div>
+
+        @*<div class="group_winner-item" onclick="winnerList('2');">
+            @Lang.WeeklyPrize
+        </div>
+        <div class="winner_section" onclick="winnerList('2');">
+            <img src="~/images/winnerlist/img_2.png" alt="img1">
+            <div class="btn_winnerList">@Lang.WinnerList</div>
+        </div>*@
+
+        <div class="group_winner-item" onclick="winnerList('1');">
+            @Lang.DailyPrize
+        </div>
+        <div class="winner_section" onclick="winnerList('1');">
+            <img src="~/images/winnerlist/img_3.png" alt="img1">
+            <div class="btn_winnerList">@Lang.WinnerList</div>
+        </div>
+
+
+    </div>
+
+</main>
+<!-- End Content page  -->
+
+<footer>
+    @Html.Partial("../Partial/_Footer")
+</footer>
+
+@section Scripts{
+    @*<script>
+            $(document).ready(function () {
+
+                var page = parseInt($("#param-page").val());
+                var totalpage = parseInt($("#param-totalpage").val());
+
+                if (page == 1) {
+                    $(".prev").addClass("disabled");
+                } else {
+                    $(".prev").attr("page", (page - 1));
+                }
+                if (page >= totalpage) {
+                    $(".next").addClass("disabled");
+                } else {
+                    $(".next").attr("page", (page + 1));
+                }
+
+            });
+        </script>*@
+
+    <script>
+        $(document).ready(function () {
+
+            activeMenu(2);
+            $("body").addClass("bg-winnerList");
+        });
+
+
+
+    </script>
+
+    <!--<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6203932774218464"
+            crossorigin="anonymous"></script>-->
+    <!-- Quảng cáo mở màn hình -->
+    <!--<ins class="adsbygoogle"
+         style="display:block"
+         data-ad-client="ca-pub-6203932774218464"
+         data-ad-slot="5428105394"
+         data-ad-format="auto"
+         data-full-width-responsive="true"></ins>
+    <script>
+        (adsbygoogle = window.adsbygoogle || []).push({});
+    </script>-->
+}
+

+ 28 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_Footer.cshtml

@@ -0,0 +1,28 @@
+
+
+<ul>
+    <li class="link_item">
+        <a href="/">
+            <img src="~/images/icon/home.svg" alt="home">
+            <span>@Lang.Home</span>
+        </a>
+    </li>
+    <li class="link_item ">
+        <a href="/Home/UserPrize">
+            <img src="~/images/icon/gift.svg" alt="home">
+            <span>@Lang.MyGift</span>
+        </a>
+    </li>
+    <li class="link_item ">
+        <a href="/Home/WinnerList">
+            <img src="~/images/icon/star.svg" alt="home">
+            <span>@Lang.WinnerList</span>
+        </a>
+    </li>
+    <li class="link_item ">
+        <a href="/Home/Guide">
+            <img src="~/images/icon/guide.svg" alt="home">
+            <span>@Lang.Guide</span>
+        </a>
+    </li>
+</ul>

+ 89 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_Setting-Dell-Vostro.cshtml

@@ -0,0 +1,89 @@
+@using System.Globalization;
+@{
+    UserInfo userInfo = Context.Session.GetComplexData<UserInfo>("userInfo");
+    productInfo regProduct = null;
+    if (userInfo != null && userInfo.regInfo != null)
+    {
+        foreach (productInfo pro in BaseController.ListPackg())
+        {
+            if (pro.productName == userInfo.regInfo.productName)
+            {
+                regProduct = pro;
+                break;
+            }
+        }
+    }
+
+    String lang = "1";
+    if (CultureInfo.CurrentCulture.Name.ToUpper() == "EN")
+    {
+        lang = "2";
+    }
+}
+
+<!-- Modal setting -->
+<audio src="~/audio/background.mpeg" preload="auto" id="background_music" loop=loop></audio>
+<div class="bg_overlay-login-error" style="display:none" id="dialogSetting">
+    <p class="text-note-setting">
+        @Lang.TapLeave
+    </p>
+    <div class="modal-setting">
+        <img src="~/images/setting/cat.png" alt="cat" />
+
+        <div style="color: white; text-align: center; ">
+            @Lang.Hello
+            @if (userInfo != null)
+            {
+                <b>@BaseController.DisplayMsisdn(userInfo.msisdn)</b>
+            }
+        </div>
+
+        <div class="row_setting">
+            <span>@Lang.GameMusic</span>
+            <div class="group_sound">
+                <div class="sound-item off "><img src="~/images/setting/on.svg" alt="on" /> <span>@Lang.On</span></div>
+                <div class="sound-item on active"><img src="~/images/setting/off.svg" alt="off" /> <span>@Lang.Off</span></div>
+            </div>
+        </div>
+        <div class="row_setting">
+            <span>@Lang.Language</span>
+            <div class="group_flag">
+                <div class="setLang" lang="en">
+                    <img src="~/images/setting/my.svg" alt="English">
+                </div>
+                <div class="setLang no_active" lang="fr">
+                    <img src="~/images/setting/an.png" alt="Creole">
+                </div>
+                @*<img src="~/images/setting/my.svg" alt="English" class="setLang" lang="en" />
+                <img src="~/images/setting/an.svg" alt="Myanmar" class="setLang" lang="my" />*@
+            </div>
+        </div>
+        @if (regProduct != null)
+        {
+            <div class="row_setting">
+                <span>@Lang.MyPackage</span>
+                <img src="@regProduct.imageUrl" alt="cat_2" />
+                <button class="cancel_weekly_btn" onclick="cancelPackage('@regProduct.productName', '@regProduct.GetDisplayname()');">
+                    @if (lang == "1")
+                    {
+                        @regProduct.GetDisplayname()
+
+                        <br />
+
+                        @Lang.Cancel
+                    }
+                    else
+                    {
+                        @Lang.Cancel
+
+                        <br />
+
+                        @regProduct.GetDisplayname()
+                    }
+                </button>
+            </div>
+        }
+    </div>
+
+</div>
+<!-- End modal setting -->

+ 89 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_Setting.cshtml

@@ -0,0 +1,89 @@
+@using System.Globalization;
+@{
+    UserInfo userInfo = Context.Session.GetComplexData<UserInfo>("userInfo");
+    productInfo regProduct = null;
+    if (userInfo != null && userInfo.regInfo != null)
+    {
+        foreach (productInfo pro in BaseController.ListPackg())
+        {
+            if (pro.productName == userInfo.regInfo.productName)
+            {
+                regProduct = pro;
+                break;
+            }
+        }
+    }
+
+    String lang = "1";
+    if (CultureInfo.CurrentCulture.Name.ToUpper() == "EN")
+    {
+        lang = "2";
+    }
+}
+
+<!-- Modal setting -->
+<audio src="~/audio/background.mpeg" preload="auto" id="background_music" loop=loop></audio>
+<div class="bg_overlay-login-error" style="display:none" id="dialogSetting">
+    <p class="text-note-setting">
+        @Lang.TapLeave
+    </p>
+    <div class="modal-setting">
+        <img src="~/images/setting/cat.png" alt="cat" />
+
+        <div style="color: white; text-align: center; ">
+            @Lang.Hello
+            @if (userInfo != null)
+            {
+                <b>@BaseController.DisplayMsisdn(userInfo.msisdn)</b>
+            }
+        </div>
+
+        <div class="row_setting" style="display: none">
+            <span>@Lang.GameMusic</span>
+            <div class="group_sound">
+                <div class="sound-item off "><img src="~/images/setting/on.svg" alt="on" /> <span>@Lang.On</span></div>
+                <div class="sound-item on active"><img src="~/images/setting/off.svg" alt="off" /> <span>@Lang.Off</span></div>
+            </div>
+        </div>
+        <div class="row_setting">
+            <span>@Lang.Language</span>
+            <div class="group_flag">
+                <div class="setLang" lang="en">
+                    <img src="~/images/setting/my.svg" alt="English">
+                </div>
+                <div class="setLang no_active" lang="fr">
+                    <img src="~/images/setting/an.png" alt="Myanmar">
+                </div>
+                @*<img src="~/images/setting/my.svg" alt="English" class="setLang" lang="en" />
+                <img src="~/images/setting/an.svg" alt="Myanmar" class="setLang" lang="my" />*@
+            </div>
+        </div>
+        @if (regProduct != null)
+        {
+            <div class="row_setting">
+                <span>@Lang.MyPackage</span>
+                <img src="@regProduct.imageUrl" alt="cat_2" />
+                <button class="cancel_weekly_btn" onclick="cancelPackage('@regProduct.productName', '@regProduct.GetDisplayname()');">
+                    @if (lang == "1")
+                    {
+                        @regProduct.GetDisplayname()
+
+                        <br />
+
+                        @Lang.Cancel
+                    }
+                    else
+                    {
+                        @Lang.Cancel
+
+                        <br />
+
+                        @regProduct.GetDisplayname()
+                    }
+                </button>
+            </div>
+        }
+    </div>
+
+</div>
+<!-- End modal setting -->

+ 71 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_TopCoin.cshtml

@@ -0,0 +1,71 @@
+
+@model LuckyWheelModel
+@{
+    var totalPage = Model.totalPage;
+    var currentPage = int.Parse(Model.page ?? "1");
+    var pageSize = int.Parse(Model.pageSize);
+    UserInfo userInfo = Context.Session.GetComplexData<UserInfo>("userInfo");
+}
+
+<input id="param-page" type="hidden" value="@currentPage" />
+<input id="param-totalpage" type="hidden" value="@totalPage" />
+
+@if (Model != null && Model.listUserCoin != null && totalPage > 0)
+{
+    <div class="list-row-data">
+        @for (int i = 0; i < Model.listUserCoin.Length; i++)
+        {
+            var userCoin = Model.listUserCoin[i];
+            <div class="row-item" page="@(i/pageSize + 1)">
+                <div class="w-25">
+                    @if (i == 0)
+                    {
+                        <img class="num" src="images/leaderboard/vang.png" alt="gold">
+                    }
+                    else if (i == 1)
+                    {
+                        <img class="num" src="images/leaderboard/bac.png" alt="gold">
+                    }
+                    else if (i == 2)
+                    {
+                        <img class="num" src="images/leaderboard/dong.png" alt="gold">
+                    }
+                    else
+                    {
+                        <span class="num w-25">@(i+1)</span>
+
+                    }
+                </div>
+                <span class="w-25">@userCoin.msisdn</span>
+                <span class="coin w-25">@userCoin.totalCoin</span>
+                <div class="w-25"> <span>@userCoin.lastUpdate.Substring(11, 5)</span> <span style="padding-left:4px">@userCoin.lastUpdate.Substring(0, 10)</span> </div>
+            </div>
+        }
+    </div>
+    <div class="pagination">
+        @for (int i = 0; i < totalPage; i++)
+        {
+            if (i == 0)
+            {
+                <span class="active-page">@(i + 1)</span>
+            }
+            else
+            {
+                <span>@(i + 1)</span>
+            }
+        }
+    </div>
+}
+@if (Model != null)
+{
+    <p class="text_bottom"> <span>@Lang.MyRank: <span id="myRank">@Model.userCoin.rownum</span></span> <span>@Lang.RankUpdate</span> </p>
+
+    @if (userInfo.regInfo == null)
+    {
+        <p class="text_bottom decoration" id="tobeRank">@Lang.TobeRanked</p>
+    }
+    <div class="group_btn center">
+        <button onclick="showElement('dialogRule');">@Lang.Rule</button>
+        <button onclick="hideElement('modal_leader_board');">@Lang.Close</button>
+    </div>
+}

+ 75 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Partial/_Winner.cshtml

@@ -0,0 +1,75 @@
+
+@model LuckyWheelModel
+@{
+    var totalPage = Model.totalPage;
+    var currentPage = int.Parse(Model.page ?? "1");
+}
+
+<input id="param-page" type="hidden" value="@currentPage" />
+<input id="param-totalpage" type="hidden" value="@totalPage" />
+
+
+<div class="list-data">
+    @if (Model != null && Model.listWinner != null)
+    {
+        for (int i = 0; i < Model.listWinner.Length; i++)
+        {
+            var prize = Model.listWinner[i];
+            <div class="row-data">
+                <span>@prize.codeTime.Split(" ")[1].Trim() <br> @prize.codeTime.Split(" ")[0].Trim()</span>
+                <span style="text-align: center;">@prize.msisdn</span>
+                <span class="prize-text" style="text-align: right;">@prize.GetPrizeName()</span>
+            </div>
+        }
+    }
+    else
+    {
+        <div class="row-data">
+            <span>@Lang.NoMorePrize</span>
+        </div>
+    }
+</div>
+
+<div class="pagination">
+    @if (totalPage > 0)
+    {
+        @if (currentPage > 1)
+        {
+            <span class="prev" page="@(currentPage - 1)"><img src="~/images/leaderboard/left.svg" alt="pre"></span>
+        }
+
+        @if (currentPage > 2 && totalPage > 3)
+        {
+            <span page="@(currentPage - 1)">...</span>
+        }
+        @if (currentPage > 2 && currentPage == totalPage)
+        {
+            <span page="@(currentPage - 2)">@(currentPage - 2)</span>
+        }
+        @if (currentPage > 1)
+        {
+            <span page="@(currentPage - 1)">@(currentPage - 1)</span>
+        }
+        <span class="active-page" page="@currentPage">@(currentPage)</span>
+        @if (currentPage < totalPage)
+        {
+            <span page="@(currentPage + 1)"><span>@(currentPage + 1)</span></span>
+        }
+        @if (totalPage >= 3 && currentPage == 1)
+        {
+            <span page="@(currentPage + 2)">@(currentPage + 2)</span>
+        }
+        @if (currentPage <= totalPage - 2)
+        {
+            <span page="@(currentPage + 1)">...</span>
+        }
+        @if (currentPage < totalPage)
+        {
+            <span class="next" page="@(currentPage + 1)"><img src="~/images/leaderboard/right.svg" alt="next"></span>
+        }
+    }
+</div>
+
+<div style="margin: 18px  auto 0 auto; width: 100%; text-align: center">
+    <button class="btn-style btn-style-small" onclick="hideElement('listWinner');">@Lang.Close</button>
+</div>

+ 717 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Shared/_Layout.cshtml

@@ -0,0 +1,717 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+@using ServiceAPI;
+@using LuckyCallWebCore.Source;
+@using LuckyCallWebCore.Controllers;
+@using LuckyCallWebCore.Extensions;
+@using System.Globalization;
+@using Newtonsoft.Json;
+
+@{
+    string channel = Context.Session.GetString("channel");
+}
+
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="vi" lang="vi">
+<head>
+    <meta charset="UTF-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+    <link rel="shortcut icon" href="/favicon.ico?v=1.1" type="image/x-icon" />
+    <title>Natcom - LUCKY CALL</title>
+    <meta name="description" content="Natcom - LUCKY CALL" />
+    <meta name="keywords" content="Natcom, lucky, call" />
+    <meta property="og:locale" content="la_LA" />
+    <meta property="og:site_name" content="Natcom - LUCKY CALL" />
+    <meta property="og:title" content="Natcom - LUCKY CALL" />
+    <meta property="og:description" content="Natcom - LUCKY CALL" />
+    <meta property="og:type" content="website" />
+    <meta property="og:url" content="@BaseController.RootHref" />
+    <meta property="og:image" content="@(BaseController.RootHref + "/wheel/prize/10.png")" />
+    <meta property="fb:app_id" content="@BaseController.FacebookAppId" />
+    @*<meta name="google-adsense-account" content="ca-pub-6203932774218464" />*@
+    <link href="/" title="Natcom - LUCKY CALL" rel="canonical" />
+
+    @*<link href="~/css/bootstrap.min.css" rel="stylesheet" />*@
+    <link rel="stylesheet" type="text/css" href="~/css/spin.css" />
+    @*<link href="~/js/bootstrap-toastr/toastr.min.css" rel="stylesheet" />*@
+    <link href="~/css/font-awesome.min.css" rel="stylesheet" />
+    <link rel="stylesheet" href="~/css/styles.css" />
+    <link rel="stylesheet" href="~/css/custom.css" />
+    <link rel="preconnect" href="https://fonts.googleapis.com" />
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=crossorigin />
+    <link href="https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap"
+          rel="stylesheet" />
+
+    <!-- Google tag (gtag.js) -->
+    @*<script async=async src="https://www.googletagmanager.com/gtag/js?id=G-H3ZXMYRTTP"></script>
+        <script>
+            window.dataLayer = window.dataLayer || [];
+            function gtag() { dataLayer.push(arguments); }
+            gtag('js', new Date());
+
+            gtag('config', 'G-H3ZXMYRTTP');
+        </script>
+
+        <script async=async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6203932774218464"
+                crossorigin="anonymous"></script>*@
+</head>
+
+
+<body>
+
+    <input type="hidden" value="@channel" id="channel" />
+    @Html.AntiForgeryToken()
+
+    <!-- Header -->
+    <header>
+        <div class="header_icon" onclick="showElement('dialogQuit')">
+            <img src="~/images/icon/logout.svg" alt="logout" />
+        </div>
+        <div class="header_icon">
+            <img src="~/images/icon/setting.svg" alt="setting" onclick="showElement('dialogSetting');" />
+        </div>
+    </header>
+    <!-- End header -->
+    @RenderBody()
+
+    @*<footer>
+            @Html.Partial("../Partial/_Footer")
+        </footer>*@
+
+    <!-- Loading page-->
+    <div id="loading-page"
+         style="background-image: url(../images/background.png);
+    background-repeat: no-repeat;
+    background-position: center;
+    background-size: cover;
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    text-align:center;
+    z-index:9999;
+    display:none">
+        <!-- Animation cat -->
+        <div class="animation_page">
+            <div id="lucky_call">
+                <img src="~/images/bg_cat.png" alt="cat" />
+                <div id="cat"></div>
+                <img class="coin_animate" src="~/images/coin/Coin.png" alt="coin" />
+                <img class="coin_animate1" src="~/images/coin/Coin_1.png" alt="coin" />
+                <img class="coin_animate2" src="~/images/coin/Coin_2.png" alt="coin" />
+                <img class="coin_animate3" src="~/images/coin/Coin_3.png" alt="coin" />
+                <img class="coin_animate4" src="~/images/coin/Coin_4.png" alt="coin" />
+                <img class="coin_animate5" src="~/images/coin/Coin_5.png" alt="coin" />
+                <img class="coin_animate6" src="~/images/coin/Coin_6.png" alt="coin" />
+                <img class="coin_animate7" src="~/images/coin/Coin_7.png" alt="coin" />
+                <img class="coin_animate8" src="~/images/coin/Coin_8.png" alt="coin" />
+
+            </div>
+            <img class="lucky_call_text" src="~/images/lucky.png" alt="den" />
+            <div class="bg_lucky"></div>
+        </div>
+        <!--End Animation cat -->
+        <img src="~/images/myID.png" alt="NatID" style="padding: 10vh" />
+        <!-- Loading -->
+        <div class="loading-bottom">
+            <p class="text_loading">@Lang.Loading: <span style="font-weight: 600;" id="percent-load"> </span>%</p>
+            <div class="loading-container">
+                <div class="loading-bar"></div>
+            </div>
+        </div>
+        <!--End Loading -->
+    </div>
+
+    <!-- Popup OTP -->
+    <div class="bg_overlay-login-error" id="dialogOtp" style="display:none">
+        <div class="popup_warning bg-open-phone">
+            <img class="icon-close" src="~/images/icon/close.svg" alt="close" onclick="closeDialog('dialogOtp')" />
+            <div class="header-popup_warning ">@Lang.Confirm</div>
+            <div class="body-popup_warning">
+                <div class="box-content_phone">
+                    <p class="title_otp">@Lang.EnterOtp</p>
+                    <div class="list_number">
+                        <input class="item_number" maxlength="1" />
+                        <input class="item_number" maxlength="1" />
+                        <input class="item_number" maxlength="1" />
+                        <input class="item_number" maxlength="1" />
+                        <input class="item_number" maxlength="1" />
+                        <input class="item_number" maxlength="1" />
+                    </div>
+                </div>
+                <div class="group_btn">
+                    <button class="btn_ok" onclick="confirmOtp();">@Lang.Confirm</button>
+                    <!-- <button class="btn_cancel">CLOSE</button> -->
+                </div>
+            </div>
+        </div>
+    </div>
+    <!-- End OTP -->
+    <!-- Popup confirm exit -->
+    <div class="bg_overlay-login-error" id="dialogQuit" style="display:none">
+        <div class="popup_warning bg-open-phone">
+            <img class="icon-close" src="~/images/icon/close.svg" alt="close" onclick="logout();" />
+            <div class="header-popup_warning " id="dialogHeader">@Lang.Confirm</div>
+            <div class="body-popup_warning">
+                <div class="box-content_phone">
+                    <p class="title_otp">@Lang.ConfirmExit</p>
+                </div>
+                <div class="group_btn">
+                    <button class="btn_ok" onclick="closeDialog('dialogQuit');">@Lang.Close</button>
+                    <button class="btn_cancel" onclick="logout();">@Lang.Confirm</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="bg_overlay-login-error" id="dialogNotAllow" style="display:none; z-index: 999999">
+        <div class="popup_warning bg-open-phone">
+            <img class="icon-close" src="~/images/icon/close.svg" alt="close" onclick="location.href='Natcom://home';" />
+            <div class="header-popup_warning " id="dialogHeader">@Lang.Warning</div>
+            <div class="body-popup_warning">
+                <div class="box-content_phone">
+                    <p class="title_otp">@Lang.NotAllowNumber</p>
+                </div>
+                <div class="group_btn">
+                    <button class="btn_ok" onclick="location.href='Natcom://home';">@Lang.Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Popup confirm cancel -->
+    <div class="bg_overlay-login-error" id="dialogCancel" style="display:none">
+        <div class="popup_warning bg-open-phone">
+            <img class="icon-close" src="~/images/icon/close.svg" alt="close" onclick="closeDialog('dialogCancel')" />
+            <div class="header-popup_warning " id="dialogHeader">@Lang.Confirm</div>
+            <div class="body-popup_warning">
+                <div class="box-content_phone">
+                    <input type="hidden" id="packageName" />
+                    <p class="title_otp" id="cancelMessage"></p>
+                </div>
+                <div class="group_btn">
+                    <button class="btn_ok" onclick="closeDialog('dialogCancel');">@Lang.Close</button>
+                    <button class="btn_cancel" onclick="cancelConfirm();">@Lang.Confirm</button>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!-- End Popup success -->
+    <!-- Popup success -->
+    <div class="bg_overlay-login-error" id="dialogResult" style="display:none">
+        <div class="popup_warning bg-open-phone">
+            <img class="icon-close" src="~/images/icon/close.svg" alt="close" onclick="closeDialog('dialogResult')" />
+            <div class="header-popup_warning " id="dialogHeader">@Lang.Confirm</div>
+            <div class="body-popup_warning">
+                <div class="box-content_phone">
+                    <input type="hidden" id="reload" />
+                    <input type="hidden" id="exit" />
+                    <p class="title_otp" id="dialogMessage"></p>
+                </div>
+                <div class="group_btn">
+                    <button class="btn_ok" onclick="closeDialog('dialogResult');">@Lang.Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!-- End Popup success -->
+    @Html.Partial("../Partial/_Setting")
+
+    <!-- Lucky popup over -->
+    <div class="bg_overlay-login-error" style="display:none" id="dialogRegister">
+        <div class="popup_warning">
+            <div class="header-popup_warning">@Lang.OutOfTurn</div>
+            <div class="body-popup_warning over_page">
+                <div class="box-content_over">
+                    <div class="cat_content">
+                        @foreach (productInfo packg in BaseController.ListPackg())
+                        {
+                            <div class="box_cat">
+                                <img src="@packg.imageUrl" alt="cat" />
+                                <p onclick="registerOtp('@packg.productName');">@Lang.Register <br /> @packg.GetDisplayname()</p>
+                            </div>
+                        }
+                    </div>
+                    <p class="desc_over">
+                        @Lang.OutOfTurnRegister
+                    </p>
+                </div>
+                <button class="btn_ok" onclick="closeDialog('dialogRegister');">@Lang.Close</button>
+            </div>
+        </div>
+    </div>
+    <!-- End lucky popup over -->
+    <!-- Modal winner list -->
+    <div class="bg_overlay-login-error" style="display:none" id="listWinner">
+        <div id="page-winnerlist">
+
+            <div class="group_winner">
+                <div class="title_winner-list"></div>
+                <div class="group_winner-item my-gift-header">
+                    <span>@Lang.Date</span>
+                    <span>@Lang.Phone</span>
+                    <span>@Lang.Prize</span>
+                </div>
+                <div class="table-data-gift table-winner-list" id="data-list">
+
+                    <!-- partial-->
+                </div>
+            </div>
+
+        </div>
+    </div>
+    <!-- End modal winner list -->
+
+    <div id="loading" style="display:none">
+        <img id="loading-image" src="~/images/spinning.gif" alt="Loading..." />
+    </div>
+
+    <script src="~/js/popper.min.js"></script>
+    <script src="~/js/jquery-3.3.1.min.js"></script>
+    <script src="~/js/bootstrap.min.js"></script>
+    <script src="~/js/bootstrap-toastr/toastr.min.js"></script>
+    <script src="~/js/spin.js"></script>
+    <script src="~/js/main.js"></script>
+
+    <script>
+
+        var flag = false;
+
+        var clicked = false;
+
+        $('.game-pack').on('click swipe', function () {
+            $('#confirm-text').html($(this).attr('confirm-text'));
+            $('#pack-cmd').val($(this).attr('pack-cmd'));
+            $('#play-again-btn').attr('target-btn', $(this).attr('id'));
+
+            $('.clicked img').addClass('mbounce');
+            $('.game-pack').removeClass('clicked');
+
+            $(this).addClass('clicked');
+            $('img', $(this)).removeClass('mbounce');
+        });
+        $('#close-result-modal').click(function () {
+            $('#result-modal').hide();
+        });
+        $('#play-again-btn').click(function () {
+            $('#result-modal').hide();
+            $('#' + $(this).attr('target-btn')).click();
+        });
+        $(function () {
+            toastr.options.positionClass = 'toast-top-right';
+            toastr.options.showEasing = 'swing';
+            toastr.options.hideEasing = 'linear';
+            toastr.options.showMethod = 'fadeIn';
+            toastr.options.hideMethod = 'fadeOut';
+            toastr.options.showDuration = 5000;
+            toastr.options.hideDuration = 1000;
+            toastr.options.timeOut = 5000;
+            toastr.options.extendedTimeOut = 1000;
+            toastr.options.closeButton = 1;
+        });
+
+        function closeDialog(name) {
+            hideElement(name);
+            let reload = $("#reload").val();
+            console.log("reload: " + reload);
+            let exit = $("#exit").val();
+            if (reload == "1") {
+                location.reload();
+            }
+            if (exit == "1") {
+                if ($("#channel").val() == "1") {
+                    location.href = 'Natcom://home';
+                } else {
+                    location.href = '/Home/Login';
+                }
+            }
+        }
+
+        function showDialog(name, header, content, error) {
+            $("#dialogHeader").html(header);
+            $("#dialogMessage").html(content);
+            if (error == "-1") {
+                $("#exit").val("1");
+            } else {
+                $("#exit").val("0");
+            }
+            showElement(name);
+        }
+
+        function hideElement(modalName) {
+            $("#" + modalName).hide();
+        }
+        function showElement(modalName) {
+            $("#" + modalName).show();
+        }
+
+        function hideModal(modalName) {
+            $("#" + modalName).modal('hide');
+        }
+        function showModal(modalName) {
+            $("#" + modalName).modal('show');
+        }
+
+        var opts = {
+            lines: 8, // The number of lines to draw
+            length: 5, // The length of each line
+            width: 3, // The line thickness
+            radius: 5, // The radius of the inner circle
+            scale: 1, // Scales overall size of the spinner
+            corners: 1, // Corner roundness (0..1)
+            color: '#ffffff', // CSS color or array of colors
+            fadeColor: 'transparent', // CSS color or array of colors
+            speed: 1, // Rounds per second
+            rotate: 0, // The rotation offset
+            animation: 'spinner-line-fade-quick', // The CSS animation name for the lines
+            direction: 1, // 1: clockwise, -1: counterclockwise
+            zIndex: 2e9, // The z-index (defaults to 2000000000)
+            className: 'spinner', // The CSS class to assign to the spinner
+            //top: '50%', // Top position relative to parent
+            //left: '50%', // Left position relative to parent
+            shadow: '0 0 1px transparent', // Box-shadow for the lines
+            //position: 'absolute' // Element positioning
+        };
+
+        var spinner = new Spinner(opts);
+
+        function startSpinner(obj) {
+            var target = document.getElementById(obj);
+            $("#" + obj).prop("disabled", true);
+            $("#" + obj).addClass("disabled");
+            //spinner.spin(target);
+            $("#loading").show();
+            console.log("startSpinner: " + obj);
+        }
+
+
+        function stopSpinner(obj) {
+            $("#" + obj).prop("disabled", false);
+            $("#" + obj).removeClass("disabled");
+            //if (spinner != undefined) {
+            //    spinner.stop();
+            //}
+            $("#loading").hide();
+            console.log("stopSpinner: " + obj);
+        }
+
+    </script>
+
+    <script>
+        function clearOtp() {
+            $(".item_number").val('');
+        }
+
+        function registerOtp(packgName) {
+            if (clicked == true) {
+                return;
+            }
+            clicked = true;
+
+            startSpinner("popup_daily");
+            startSpinner("dialogRegister");
+
+            clearOtp();
+            $.ajax({
+                url: "/Home/RegisterOtp",
+                data: {
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val(),
+                    packageName: packgName
+                },
+                type: "POST",
+                success: function (data) {
+                    clicked = false;
+                    $(".bg_overlay-login-error").hide();
+                    if (data.error == "100") {
+                        // confirm
+                        showElement("dialogOtp");
+                        $(".item_number").first().focus();
+                    } else if (data.error == "0") {
+                        stopSpinner("popup_daily");
+                        stopSpinner("dialogRegister");
+
+                        // success
+                        $("#reload").val("1");
+                        showDialog('dialogResult', "@Lang.Congratulations", data.content);
+                    } else if (data.error == "417") {
+                        stopSpinner("popup_daily");
+                        stopSpinner("dialogRegister");
+                        // cancel
+                        return;
+                    } else {
+                        stopSpinner("popup_daily");
+                        stopSpinner("dialogRegister");
+                        // failed
+                        showDialog('dialogResult', "@Lang.Error", data.content, data.error);
+                    }
+                },
+                error: function (req, st, error) {
+                    clicked = false;
+                    stopSpinner("popup_daily");
+                    stopSpinner("dialogRegister");
+                    console.log("Error : " + error);
+                }
+            });
+        }
+
+        function confirmOtp() {
+
+            var otp = "";
+            var exit = false;
+            $(".item_number").each(function () {
+                if (exit) {
+                    return;
+                }
+                if ($(this).val() == null || $(this).val() == "") {
+                    $(this).focus();
+                    exit = true;
+                    return;
+                }
+                otp += $(this).val();
+            });
+            if (otp.length < 6) {
+                return;
+            }
+            registerConfirm(otp);
+        }
+
+        function registerConfirm(otp) {
+            if (clicked == true) {
+                return;
+            }
+            clicked = true;
+            $.ajax({
+                url: "/Home/RegisterConfirm",
+                data: {
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val(),
+                    otp: otp
+                },
+                type: "POST",
+                success: function (data) {
+                    clicked = false;
+                    closeDialog('dialogOtp');
+                    if (data.error == "0") {
+                        stopSpinner("popup_daily");
+                        stopSpinner("dialogRegister");
+                        // success
+                        $("#reload").val("1");
+                        showDialog('dialogResult', "@Lang.Congratulations", data.content);
+                    } else {
+                        stopSpinner("popup_daily");
+                        stopSpinner("dialogRegister");
+                        // failed
+                        showDialog('dialogResult', "@Lang.Error", data.content, data.error);
+                    }
+                },
+                error: function (req, st, error) {
+                    clicked = false;
+                    stopSpinner("popup_daily");
+                    stopSpinner("dialogRegister");
+                    console.log("Error : " + error);
+                }
+            });
+        }
+    </script>
+
+    <script>
+        function share_facebook(prizeId, playId, reload) {
+
+            if (playId != null && playId > 0) {
+                // post receive prize
+                $.ajax({
+                    url: "/Home/ConfirmPrize",
+                    data: {
+                        __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val(),
+                        playId: playId
+                    },
+                    type: "POST",
+                    success: function (data) {
+                        console.log(data);
+                        if (data.error == "0") {
+                            //hideModal("modalPrize");
+                            setTimeout(function () {
+                                $("#modalPrize .close-modal").show();
+                                if (reload) {
+                                    location.reload();
+                                }
+                            }, 2000);
+
+                        } else {
+                            alert(data.content);
+                        }
+                    },
+                    error: function (req, st, error) {
+                        alert(error);
+                    }
+                });
+            }
+
+            var link = encodeURIComponent('@BaseController.RootHref' + '/Home/PrizeInfo?prizeId=' + prizeId);
+            var fullLink = encodeURIComponent("https://www.facebook.com/sharer/sharer.php?u=" + link);
+            location.href = "mocha://fb?ref=" + link;
+        }
+
+    </script>
+
+    <script>
+        $(".btn-share-facebook").click(function () {
+            var prizeId = $(this).attr("data-bind");
+            var playId = $(this).val();
+            var reload = $(this).attr("data-content");
+
+            //location.href = "/Home/PrizeConfirm?prizeId=" + prizeId + "&playId=" + playId;
+
+            share_facebook(prizeId, playId, reload);
+        });
+    </script>
+
+    <script>
+        function logout() {
+            if (clicked == true) {
+                return;
+            }
+            clicked = true;
+            $.ajax({
+                url: "/Home/LogoutAction",
+                data: {
+                },
+                type: "POST",
+                success: function (data) {
+                    clicked = false;
+                    if ($("#channel").val() == "1") {
+                        location.href = 'Natcom://home';
+                    } else {
+                        location.href = '/Home/Login';
+                    }
+                },
+                error: function (req, st, error) {
+                    clicked = false;
+                    if ($("#channel").val() == "1") {
+                        location.href = 'Natcom://home';
+                    } else {
+                        location.href = '/Home/Login';
+                    }
+                }
+            });
+
+
+        }
+
+
+        function cancelPackage(productName, displayName) {
+            hideElement("dialogSetting");
+            $("#packageName").val(productName);
+            let message = '@Lang.CancelConfirm';
+            message = message.replace('%package%', displayName);
+            $("#cancelMessage").html(message);
+            showElement("dialogCancel");
+        }
+
+        function cancelConfirm() {
+            if (clicked == true) {
+                return;
+            }
+
+            closeDialog('dialogCancel');
+            clicked = true;
+            var packageName = $("#packageName").val();
+            $.ajax({
+                url: "/Home/CancelConfirm",
+                data: {
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val(),
+                    packageName: packageName
+                },
+                type: "POST",
+                success: function (data) {
+                    clicked = false;
+                    if (data.error == "0") {
+                        // success
+                        $("#reload").val("1");
+                        showDialog('dialogResult', "@Lang.Cancelled", data.content);
+                    } else if (data.error == "417") {
+                        // cancel
+                        return;
+                    } else {
+                        // failed
+                        showDialog('dialogResult', "@Lang.Error", data.content, data.error);
+                    }
+                },
+                error: function (req, st, error) {
+                    clicked = false;
+                    console.log(error);
+                }
+            });
+        }
+
+
+        // menu
+        function activeMenu(index) {
+            $("footer").removeAttr('class');
+            $("footer").attr('class', '');
+            if (index == 1) {
+                $('footer')[0].className = 'bg_my-gift';
+            } else if (index == 2) {
+                $('footer')[0].className = 'bg_winner-list';
+            } else if (index == 3) {
+                $('footer')[0].className = 'bg_guide';
+            }
+        }
+
+    </script>
+
+    <script>
+
+        function winnerList(period) {
+            console.log("winnerList " + period);
+            $("#period").val(period);
+            // title
+            if (period == '1') {
+                $(".title_winner-list").html('@Lang.DailyPrizeTitle');
+            } else if (period == '2') {
+                $(".title_winner-list").html('@Lang.WeeklyPrizeTitle');
+            } else {
+                $(".title_winner-list").html('@Lang.MonthlyPrizeTitle');
+            }
+            getData('1');
+        }
+
+        function getData(page) {
+
+            console.log("getData " + page);
+            let period = $("#period").val();
+            // get data
+            $.ajax({
+                url: "/Home/GetWinner",
+                data: {
+                    __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val(),
+                    page: page,
+                    period: period
+                },
+                type: "POST",
+                success: function (data) {
+                    $("#data-list").html(data);
+                    showElement("listWinner");
+                },
+                error: function (req) {
+                    console.log(req.responseText);
+                }
+            });
+        }
+
+        $("#data-list").on('click', '.pagination span', function () {
+            let page = $(this).attr("page");
+            console.log("page " + page);
+            if (page != null) {
+                getData(page);
+            }
+        })
+    </script>
+
+
+    @RenderSection("scripts", required: false)
+</body>
+
+</html>

+ 2 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/Shared/_ValidationScriptsPartial.cshtml

@@ -0,0 +1,2 @@
+<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
+<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

+ 11 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/_ViewImports.cshtml

@@ -0,0 +1,11 @@
+@using LuckyCallWebCore
+@using LuckyCallWebCore.Models
+@using LuckyCallWebCore.Source
+@using Nat_LuckyCall.Resources
+@using ServiceAPI
+@using LuckyCallWebCore.Controllers;
+@using LuckyCallWebCore.Extensions;
+@using Newtonsoft.Json;
+@using Microsoft.AspNetCore.Http
+
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

+ 3 - 0
LuckyCallWebCore/LuckyCallWebCore/Views/_ViewStart.cshtml

@@ -0,0 +1,3 @@
+@{
+    Layout = "_Layout";
+}

+ 1 - 0
LuckyCallWebCore/LuckyCallWebCore/ads.txt

@@ -0,0 +1 @@
+google.com, pub-6203932774218464, DIRECT, f08c47fec0942fa0

+ 9 - 0
LuckyCallWebCore/LuckyCallWebCore/appsettings.Development.json

@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft": "Warning",
+      "Microsoft.Hosting.Lifetime": "Information"
+    }
+  }
+}

+ 44 - 0
LuckyCallWebCore/LuckyCallWebCore/appsettings.json

@@ -0,0 +1,44 @@
+{
+  "countryCode": "509",
+  "recaptchaPublicKey": "6LfIKMEZAAAAANTtqWd4juaaWWkYKRXMyDADtuPr",
+  "recaptchaPrivateKey": "6LfIKMEZAAAAALWo7VKiBo-w60Dso2hDTcrmQjQT",
+  "wsUser": "lucky_wheel",
+  "wsPassword": "lucky_wheel@123",
+
+  //"mocha_user": "mocha",
+  //"mocha_pass": "mocha@%23$2014",
+  "urlMochaMsisdn": "http://10.201.203.57:8000/game-common/api/individual/subscription?offset=0&limit=10",
+  "PublicKeyMocha": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2zXVaeO3zT66ZCUsr1t8\nLdl8+0lndQ1kpO8/SO+jG4cQC/hnZ0uirj3SfkihGa80UU0TBYuGAbT790vrLbsy\niAabmeCXlwYjb4TZNRMS2Yocyi/\nb8P7ajnbg1VfTVna6yt4yxtr8y59OphbPDa+b\nR9MhW9JDJ/DqEhCQaE+mOERnxypdQVf+AaEqwRA4veD9KTnbHt/BofMsuE8kLmlq\n2g2r0OAukAqLYoAnPKQOhtdh9pW3/KnJnuFpS7cX3UNWF2KRcm9yrshC+jDQVYz2\nkKHQtPjyP8KRQtHUrCSKP67HJI0gdUrOYOeOLrKTu8lazoTdw8o3L+QPziFlZ6yi\nCQIDAQAB",
+
+  "FacebookAppId": "857789678272678",
+  "FacebookShareHref": "http://laosapp.la/app?sc=ilucky",
+  "RootHref": "http://ilucky.la:8080",
+  "socketServer": "ws://localhost/chat",
+
+  "listPrefixMsisdn": "509",
+  "coin1Spin": "5",
+  "channel": "1",
+  "serviceId": "1",
+  "pageSize": "10",
+  "numWs": "2",
+  "wsUrl1": "http://127.0.0.1:8088/WsLuckyCall?wsdl",
+  "wsUrl2": "http://127.0.0.1:8088/WsLuckyCall?wsdl",
+
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft": "Warning",
+      "Microsoft.Hosting.Lifetime": "Information"
+    }
+  },
+  "Kestrel": {
+    "EndPoints": {
+      "Http": {
+        "Url": "http://localhost:8555"
+      }
+    }
+  },
+  "AllowedHosts": "*",
+
+  "testMode": "0"
+}

BIN
LuckyCallWebCore/LuckyCallWebCore/lib/WebSockets.dll


+ 22 - 0
LuckyCallWebCore/LuckyCallWebCore/log4net.config

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<log4net>
+
+  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
+    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
+    <file value="log/" />
+    <datePattern value="'full.'yyyy.MM.dd'.log'" />
+    <staticLogFileName value="false" />
+    <appendToFile value="true" />
+    <rollingStyle value="Composite" />
+    <maxSizeRollBackups value="10" />
+    <maximumFileSize value="5MB" />
+    <layout type="log4net.Layout.PatternLayout">
+      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
+    </layout>
+  </appender>
+  <root>
+    <level value="DEBUG" />
+    <appender-ref ref="RollingLogFileAppender" />
+  </root>
+</log4net>
+

BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/audio/background.mpeg


+ 9273 - 0
LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/bootstrap.min.css

@@ -0,0 +1,9273 @@
+/*!
+ * Bootstrap v4.0.0 (https://getbootstrap.com)
+ * Copyright 2011-2018 The Bootstrap Authors
+ * Copyright 2011-2018 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+:root {
+    --blue: #007bff;
+    --indigo: #6610f2;
+    --purple: #6f42c1;
+    --pink: #e83e8c;
+    --red: #dc3545;
+    --orange: #fd7e14;
+    --yellow: #ffc107;
+    --green: #28a745;
+    --teal: #20c997;
+    --cyan: #17a2b8;
+    --white: #fff;
+    --gray: #6c757d;
+    --gray-dark: #343a40;
+    --primary: #007bff;
+    --secondary: #6c757d;
+    --success: #28a745;
+    --info: #17a2b8;
+    --warning: #ffc107;
+    --danger: #dc3545;
+    --light: #f8f9fa;
+    --dark: #343a40;
+    --breakpoint-xs: 0;
+    --breakpoint-sm: 576px;
+    --breakpoint-md: 768px;
+    --breakpoint-lg: 992px;
+    --breakpoint-xl: 1200px;
+    --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+    --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace
+}
+
+*,
+::after,
+::before {
+    box-sizing: border-box
+}
+
+html {
+    font-family: sans-serif;
+    line-height: 1.15;
+    -webkit-text-size-adjust: 100%;
+    -ms-text-size-adjust: 100%;
+    -ms-overflow-style: scrollbar;
+    -webkit-tap-highlight-color: transparent
+}
+
+@-ms-viewport {
+    width: device-width
+}
+
+article,
+aside,
+dialog,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section {
+    display: block
+}
+
+body {
+    margin: 0;
+    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+    font-size: 1rem;
+    font-weight: 400;
+    line-height: 1.5;
+    color: #212529;
+    text-align: left;
+    background-color: #fff
+}
+
+[tabindex="-1"]:focus {
+    outline: 0 !important
+}
+
+hr {
+    box-sizing: content-box;
+    height: 0;
+    overflow: visible
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+    margin-top: 0;
+    margin-bottom: .5rem
+}
+
+p {
+    margin-top: 0;
+    margin-bottom: 1rem
+}
+
+abbr[data-original-title],
+abbr[title] {
+    text-decoration: underline;
+    -webkit-text-decoration: underline dotted;
+    text-decoration: underline dotted;
+    cursor: help;
+    border-bottom: 0
+}
+
+address {
+    margin-bottom: 1rem;
+    font-style: normal;
+    line-height: inherit
+}
+
+dl,
+ol,
+ul {
+    margin-top: 0;
+    margin-bottom: 1rem
+}
+
+ol ol,
+ol ul,
+ul ol,
+ul ul {
+    margin-bottom: 0
+}
+
+dt {
+    font-weight: 700
+}
+
+dd {
+    margin-bottom: .5rem;
+    margin-left: 0
+}
+
+blockquote {
+    margin: 0 0 1rem
+}
+
+dfn {
+    font-style: italic
+}
+
+b,
+strong {
+    font-weight: bolder
+}
+
+small {
+    font-size: 80%
+}
+
+sub,
+sup {
+    position: relative;
+    font-size: 75%;
+    line-height: 0;
+    vertical-align: baseline
+}
+
+sub {
+    bottom: -.25em
+}
+
+sup {
+    top: -.5em
+}
+
+a {
+    color: #007bff;
+    text-decoration: none;
+    background-color: transparent;
+    -webkit-text-decoration-skip: objects
+}
+
+a:hover {
+    color: #0056b3;
+    text-decoration: underline
+}
+
+a:not([href]):not([tabindex]) {
+    color: inherit;
+    text-decoration: none
+}
+
+a:not([href]):not([tabindex]):focus,
+a:not([href]):not([tabindex]):hover {
+    color: inherit;
+    text-decoration: none
+}
+
+a:not([href]):not([tabindex]):focus {
+    outline: 0
+}
+
+code,
+kbd,
+pre,
+samp {
+    font-family: monospace, monospace;
+    font-size: 1em
+}
+
+pre {
+    margin-top: 0;
+    margin-bottom: 1rem;
+    overflow: auto;
+    -ms-overflow-style: scrollbar
+}
+
+figure {
+    margin: 0 0 1rem
+}
+
+img {
+    vertical-align: middle;
+    border-style: none
+}
+
+svg:not(:root) {
+    overflow: hidden
+}
+
+table {
+    border-collapse: collapse
+}
+
+caption {
+    padding-top: .75rem;
+    padding-bottom: .75rem;
+    color: #6c757d;
+    text-align: left;
+    caption-side: bottom
+}
+
+th {
+    text-align: inherit
+}
+
+label {
+    display: inline-block;
+    margin-bottom: .5rem
+}
+
+button {
+    border-radius: 0
+}
+
+button:focus {
+    outline: 1px dotted;
+    outline: 5px auto -webkit-focus-ring-color
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+    margin: 0;
+    font-family: inherit;
+    font-size: inherit;
+    line-height: inherit
+}
+
+button,
+input {
+    overflow: visible
+}
+
+button,
+select {
+    text-transform: none
+}
+
+[type=reset],
+[type=submit],
+button,
+html [type=button] {
+    -webkit-appearance: button
+}
+
+[type=button]::-moz-focus-inner,
+[type=reset]::-moz-focus-inner,
+[type=submit]::-moz-focus-inner,
+button::-moz-focus-inner {
+    padding: 0;
+    border-style: none
+}
+
+input[type=checkbox],
+input[type=radio] {
+    box-sizing: border-box;
+    padding: 0
+}
+
+input[type=date],
+input[type=datetime-local],
+input[type=month],
+input[type=time] {
+    -webkit-appearance: listbox
+}
+
+textarea {
+    overflow: auto;
+    resize: vertical
+}
+
+fieldset {
+    min-width: 0;
+    padding: 0;
+    margin: 0;
+    border: 0
+}
+
+legend {
+    display: block;
+    width: 100%;
+    max-width: 100%;
+    padding: 0;
+    margin-bottom: .5rem;
+    font-size: 1.5rem;
+    line-height: inherit;
+    color: inherit;
+    white-space: normal
+}
+
+progress {
+    vertical-align: baseline
+}
+
+[type=number]::-webkit-inner-spin-button,
+[type=number]::-webkit-outer-spin-button {
+    height: auto
+}
+
+[type=search] {
+    outline-offset: -2px;
+    -webkit-appearance: none
+}
+
+[type=search]::-webkit-search-cancel-button,
+[type=search]::-webkit-search-decoration {
+    -webkit-appearance: none
+}
+
+::-webkit-file-upload-button {
+    font: inherit;
+    -webkit-appearance: button
+}
+
+output {
+    display: inline-block
+}
+
+summary {
+    display: list-item;
+    cursor: pointer
+}
+
+template {
+    display: none
+}
+
+[hidden] {
+    display: none !important
+}
+
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+    margin-bottom: .5rem;
+    font-family: inherit;
+    font-weight: 500;
+    line-height: 1.2;
+    color: inherit
+}
+
+.h1,
+h1 {
+    font-size: 2.5rem
+}
+
+.h2,
+h2 {
+    font-size: 2rem
+}
+
+.h3,
+h3 {
+    font-size: 1.75rem
+}
+
+.h4,
+h4 {
+    font-size: 1.5rem
+}
+
+.h5,
+h5 {
+    font-size: 1.25rem
+}
+
+.h6,
+h6 {
+    font-size: 1rem
+}
+
+.lead {
+    font-size: 1.25rem;
+    font-weight: 300
+}
+
+.display-1 {
+    font-size: 6rem;
+    font-weight: 300;
+    line-height: 1.2
+}
+
+.display-2 {
+    font-size: 5.5rem;
+    font-weight: 300;
+    line-height: 1.2
+}
+
+.display-3 {
+    font-size: 4.5rem;
+    font-weight: 300;
+    line-height: 1.2
+}
+
+.display-4 {
+    font-size: 3.5rem;
+    font-weight: 300;
+    line-height: 1.2
+}
+
+hr {
+    margin-top: 1rem;
+    margin-bottom: 1rem;
+    border: 0;
+    border-top: 1px solid rgba(0, 0, 0, .1)
+}
+
+.small,
+small {
+    font-size: 80%;
+    font-weight: 400
+}
+
+.mark,
+mark {
+    padding: .2em;
+    background-color: #fcf8e3
+}
+
+.list-unstyled {
+    padding-left: 0;
+    list-style: none
+}
+
+.list-inline {
+    padding-left: 0;
+    list-style: none
+}
+
+.list-inline-item {
+    display: inline-block
+}
+
+.list-inline-item:not(:last-child) {
+    margin-right: .5rem
+}
+
+.initialism {
+    font-size: 90%;
+    text-transform: uppercase
+}
+
+.blockquote {
+    margin-bottom: 1rem;
+    font-size: 1.25rem
+}
+
+.blockquote-footer {
+    display: block;
+    font-size: 80%;
+    color: #6c757d
+}
+
+.blockquote-footer::before {
+    content: "\2014 \00A0"
+}
+
+.img-fluid {
+    max-width: 100%;
+    height: auto
+}
+
+.img-thumbnail {
+    padding: .25rem;
+    background-color: #fff;
+    border: 1px solid #dee2e6;
+    border-radius: .25rem;
+    max-width: 100%;
+    height: auto
+}
+
+.figure {
+    display: inline-block
+}
+
+.figure-img {
+    margin-bottom: .5rem;
+    line-height: 1
+}
+
+.figure-caption {
+    font-size: 90%;
+    color: #6c757d
+}
+
+code,
+kbd,
+pre,
+samp {
+    font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace
+}
+
+code {
+    font-size: 87.5%;
+    color: #e83e8c;
+    word-break: break-word
+}
+
+a>code {
+    color: inherit
+}
+
+kbd {
+    padding: .2rem .4rem;
+    font-size: 87.5%;
+    color: #fff;
+    background-color: #212529;
+    border-radius: .2rem
+}
+
+kbd kbd {
+    padding: 0;
+    font-size: 100%;
+    font-weight: 700
+}
+
+pre {
+    display: block;
+    font-size: 87.5%;
+    color: #212529
+}
+
+pre code {
+    font-size: inherit;
+    color: inherit;
+    word-break: normal
+}
+
+.pre-scrollable {
+    max-height: 340px;
+    overflow-y: scroll
+}
+
+.container {
+    width: 100%;
+    padding-right: 15px;
+    padding-left: 15px;
+    margin-right: auto;
+    margin-left: auto
+}
+
+@media (min-width:576px) {
+    .container {
+        max-width: 540px
+    }
+}
+
+@media (min-width:768px) {
+    .container {
+        max-width: 720px
+    }
+}
+
+@media (min-width:992px) {
+    .container {
+        max-width: 960px
+    }
+}
+
+@media (min-width:1200px) {
+    .container {
+        max-width: 1140px
+    }
+}
+
+.container-fluid {
+    width: 100%;
+    padding-right: 15px;
+    padding-left: 15px;
+    margin-right: auto;
+    margin-left: auto
+}
+
+.row {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-wrap: wrap;
+    flex-wrap: wrap;
+    margin-right: -15px;
+    margin-left: -15px
+}
+
+.no-gutters {
+    margin-right: 0;
+    margin-left: 0
+}
+
+.no-gutters>.col,
+.no-gutters>[class*=col-] {
+    padding-right: 0;
+    padding-left: 0
+}
+
+.col,
+.col-1,
+.col-10,
+.col-11,
+.col-12,
+.col-2,
+.col-3,
+.col-4,
+.col-5,
+.col-6,
+.col-7,
+.col-8,
+.col-9,
+.col-auto,
+.col-lg,
+.col-lg-1,
+.col-lg-10,
+.col-lg-11,
+.col-lg-12,
+.col-lg-2,
+.col-lg-3,
+.col-lg-4,
+.col-lg-5,
+.col-lg-6,
+.col-lg-7,
+.col-lg-8,
+.col-lg-9,
+.col-lg-auto,
+.col-md,
+.col-md-1,
+.col-md-10,
+.col-md-11,
+.col-md-12,
+.col-md-2,
+.col-md-3,
+.col-md-4,
+.col-md-5,
+.col-md-6,
+.col-md-7,
+.col-md-8,
+.col-md-9,
+.col-md-auto,
+.col-sm,
+.col-sm-1,
+.col-sm-10,
+.col-sm-11,
+.col-sm-12,
+.col-sm-2,
+.col-sm-3,
+.col-sm-4,
+.col-sm-5,
+.col-sm-6,
+.col-sm-7,
+.col-sm-8,
+.col-sm-9,
+.col-sm-auto,
+.col-xl,
+.col-xl-1,
+.col-xl-10,
+.col-xl-11,
+.col-xl-12,
+.col-xl-2,
+.col-xl-3,
+.col-xl-4,
+.col-xl-5,
+.col-xl-6,
+.col-xl-7,
+.col-xl-8,
+.col-xl-9,
+.col-xl-auto {
+    position: relative;
+    width: 100%;
+    min-height: 1px;
+    padding-right: 15px;
+    padding-left: 15px
+}
+
+.col {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -webkit-box-flex: 1;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    max-width: 100%
+}
+
+.col-auto {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+    width: auto;
+    max-width: none
+}
+
+.col-1 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 8.333333%;
+    flex: 0 0 8.333333%;
+    max-width: 8.333333%
+}
+
+.col-2 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 16.666667%;
+    flex: 0 0 16.666667%;
+    max-width: 16.666667%
+}
+
+.col-3 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 25%;
+    flex: 0 0 25%;
+    max-width: 25%
+}
+
+.col-4 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 33.333333%;
+    flex: 0 0 33.333333%;
+    max-width: 33.333333%
+}
+
+.col-5 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 41.666667%;
+    flex: 0 0 41.666667%;
+    max-width: 41.666667%
+}
+
+.col-6 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 50%;
+    flex: 0 0 50%;
+    max-width: 50%
+}
+
+.col-7 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 58.333333%;
+    flex: 0 0 58.333333%;
+    max-width: 58.333333%
+}
+
+.col-8 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 66.666667%;
+    flex: 0 0 66.666667%;
+    max-width: 66.666667%
+}
+
+.col-9 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 75%;
+    flex: 0 0 75%;
+    max-width: 75%
+}
+
+.col-10 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 83.333333%;
+    flex: 0 0 83.333333%;
+    max-width: 83.333333%
+}
+
+.col-11 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 91.666667%;
+    flex: 0 0 91.666667%;
+    max-width: 91.666667%
+}
+
+.col-12 {
+    -webkit-box-flex: 0;
+    -ms-flex: 0 0 100%;
+    flex: 0 0 100%;
+    max-width: 100%
+}
+
+.order-first {
+    -webkit-box-ordinal-group: 0;
+    -ms-flex-order: -1;
+    order: -1
+}
+
+.order-last {
+    -webkit-box-ordinal-group: 14;
+    -ms-flex-order: 13;
+    order: 13
+}
+
+.order-0 {
+    -webkit-box-ordinal-group: 1;
+    -ms-flex-order: 0;
+    order: 0
+}
+
+.order-1 {
+    -webkit-box-ordinal-group: 2;
+    -ms-flex-order: 1;
+    order: 1
+}
+
+.order-2 {
+    -webkit-box-ordinal-group: 3;
+    -ms-flex-order: 2;
+    order: 2
+}
+
+.order-3 {
+    -webkit-box-ordinal-group: 4;
+    -ms-flex-order: 3;
+    order: 3
+}
+
+.order-4 {
+    -webkit-box-ordinal-group: 5;
+    -ms-flex-order: 4;
+    order: 4
+}
+
+.order-5 {
+    -webkit-box-ordinal-group: 6;
+    -ms-flex-order: 5;
+    order: 5
+}
+
+.order-6 {
+    -webkit-box-ordinal-group: 7;
+    -ms-flex-order: 6;
+    order: 6
+}
+
+.order-7 {
+    -webkit-box-ordinal-group: 8;
+    -ms-flex-order: 7;
+    order: 7
+}
+
+.order-8 {
+    -webkit-box-ordinal-group: 9;
+    -ms-flex-order: 8;
+    order: 8
+}
+
+.order-9 {
+    -webkit-box-ordinal-group: 10;
+    -ms-flex-order: 9;
+    order: 9
+}
+
+.order-10 {
+    -webkit-box-ordinal-group: 11;
+    -ms-flex-order: 10;
+    order: 10
+}
+
+.order-11 {
+    -webkit-box-ordinal-group: 12;
+    -ms-flex-order: 11;
+    order: 11
+}
+
+.order-12 {
+    -webkit-box-ordinal-group: 13;
+    -ms-flex-order: 12;
+    order: 12
+}
+
+.offset-1 {
+    margin-left: 8.333333%
+}
+
+.offset-2 {
+    margin-left: 16.666667%
+}
+
+.offset-3 {
+    margin-left: 25%
+}
+
+.offset-4 {
+    margin-left: 33.333333%
+}
+
+.offset-5 {
+    margin-left: 41.666667%
+}
+
+.offset-6 {
+    margin-left: 50%
+}
+
+.offset-7 {
+    margin-left: 58.333333%
+}
+
+.offset-8 {
+    margin-left: 66.666667%
+}
+
+.offset-9 {
+    margin-left: 75%
+}
+
+.offset-10 {
+    margin-left: 83.333333%
+}
+
+.offset-11 {
+    margin-left: 91.666667%
+}
+
+@media (min-width:576px) {
+    .col-sm {
+        -ms-flex-preferred-size: 0;
+        flex-basis: 0;
+        -webkit-box-flex: 1;
+        -ms-flex-positive: 1;
+        flex-grow: 1;
+        max-width: 100%
+    }
+    .col-sm-auto {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 auto;
+        flex: 0 0 auto;
+        width: auto;
+        max-width: none
+    }
+    .col-sm-1 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 8.333333%;
+        flex: 0 0 8.333333%;
+        max-width: 8.333333%
+    }
+    .col-sm-2 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 16.666667%;
+        flex: 0 0 16.666667%;
+        max-width: 16.666667%
+    }
+    .col-sm-3 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 25%;
+        flex: 0 0 25%;
+        max-width: 25%
+    }
+    .col-sm-4 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 33.333333%;
+        flex: 0 0 33.333333%;
+        max-width: 33.333333%
+    }
+    .col-sm-5 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 41.666667%;
+        flex: 0 0 41.666667%;
+        max-width: 41.666667%
+    }
+    .col-sm-6 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 50%;
+        flex: 0 0 50%;
+        max-width: 50%
+    }
+    .col-sm-7 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 58.333333%;
+        flex: 0 0 58.333333%;
+        max-width: 58.333333%
+    }
+    .col-sm-8 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 66.666667%;
+        flex: 0 0 66.666667%;
+        max-width: 66.666667%
+    }
+    .col-sm-9 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 75%;
+        flex: 0 0 75%;
+        max-width: 75%
+    }
+    .col-sm-10 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 83.333333%;
+        flex: 0 0 83.333333%;
+        max-width: 83.333333%
+    }
+    .col-sm-11 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 91.666667%;
+        flex: 0 0 91.666667%;
+        max-width: 91.666667%
+    }
+    .col-sm-12 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 100%;
+        flex: 0 0 100%;
+        max-width: 100%
+    }
+    .order-sm-first {
+        -webkit-box-ordinal-group: 0;
+        -ms-flex-order: -1;
+        order: -1
+    }
+    .order-sm-last {
+        -webkit-box-ordinal-group: 14;
+        -ms-flex-order: 13;
+        order: 13
+    }
+    .order-sm-0 {
+        -webkit-box-ordinal-group: 1;
+        -ms-flex-order: 0;
+        order: 0
+    }
+    .order-sm-1 {
+        -webkit-box-ordinal-group: 2;
+        -ms-flex-order: 1;
+        order: 1
+    }
+    .order-sm-2 {
+        -webkit-box-ordinal-group: 3;
+        -ms-flex-order: 2;
+        order: 2
+    }
+    .order-sm-3 {
+        -webkit-box-ordinal-group: 4;
+        -ms-flex-order: 3;
+        order: 3
+    }
+    .order-sm-4 {
+        -webkit-box-ordinal-group: 5;
+        -ms-flex-order: 4;
+        order: 4
+    }
+    .order-sm-5 {
+        -webkit-box-ordinal-group: 6;
+        -ms-flex-order: 5;
+        order: 5
+    }
+    .order-sm-6 {
+        -webkit-box-ordinal-group: 7;
+        -ms-flex-order: 6;
+        order: 6
+    }
+    .order-sm-7 {
+        -webkit-box-ordinal-group: 8;
+        -ms-flex-order: 7;
+        order: 7
+    }
+    .order-sm-8 {
+        -webkit-box-ordinal-group: 9;
+        -ms-flex-order: 8;
+        order: 8
+    }
+    .order-sm-9 {
+        -webkit-box-ordinal-group: 10;
+        -ms-flex-order: 9;
+        order: 9
+    }
+    .order-sm-10 {
+        -webkit-box-ordinal-group: 11;
+        -ms-flex-order: 10;
+        order: 10
+    }
+    .order-sm-11 {
+        -webkit-box-ordinal-group: 12;
+        -ms-flex-order: 11;
+        order: 11
+    }
+    .order-sm-12 {
+        -webkit-box-ordinal-group: 13;
+        -ms-flex-order: 12;
+        order: 12
+    }
+    .offset-sm-0 {
+        margin-left: 0
+    }
+    .offset-sm-1 {
+        margin-left: 8.333333%
+    }
+    .offset-sm-2 {
+        margin-left: 16.666667%
+    }
+    .offset-sm-3 {
+        margin-left: 25%
+    }
+    .offset-sm-4 {
+        margin-left: 33.333333%
+    }
+    .offset-sm-5 {
+        margin-left: 41.666667%
+    }
+    .offset-sm-6 {
+        margin-left: 50%
+    }
+    .offset-sm-7 {
+        margin-left: 58.333333%
+    }
+    .offset-sm-8 {
+        margin-left: 66.666667%
+    }
+    .offset-sm-9 {
+        margin-left: 75%
+    }
+    .offset-sm-10 {
+        margin-left: 83.333333%
+    }
+    .offset-sm-11 {
+        margin-left: 91.666667%
+    }
+}
+
+@media (min-width:768px) {
+    .col-md {
+        -ms-flex-preferred-size: 0;
+        flex-basis: 0;
+        -webkit-box-flex: 1;
+        -ms-flex-positive: 1;
+        flex-grow: 1;
+        max-width: 100%
+    }
+    .col-md-auto {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 auto;
+        flex: 0 0 auto;
+        width: auto;
+        max-width: none
+    }
+    .col-md-1 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 8.333333%;
+        flex: 0 0 8.333333%;
+        max-width: 8.333333%
+    }
+    .col-md-2 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 16.666667%;
+        flex: 0 0 16.666667%;
+        max-width: 16.666667%
+    }
+    .col-md-3 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 25%;
+        flex: 0 0 25%;
+        max-width: 25%
+    }
+    .col-md-4 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 33.333333%;
+        flex: 0 0 33.333333%;
+        max-width: 33.333333%
+    }
+    .col-md-5 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 41.666667%;
+        flex: 0 0 41.666667%;
+        max-width: 41.666667%
+    }
+    .col-md-6 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 50%;
+        flex: 0 0 50%;
+        max-width: 50%
+    }
+    .col-md-7 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 58.333333%;
+        flex: 0 0 58.333333%;
+        max-width: 58.333333%
+    }
+    .col-md-8 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 66.666667%;
+        flex: 0 0 66.666667%;
+        max-width: 66.666667%
+    }
+    .col-md-9 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 75%;
+        flex: 0 0 75%;
+        max-width: 75%
+    }
+    .col-md-10 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 83.333333%;
+        flex: 0 0 83.333333%;
+        max-width: 83.333333%
+    }
+    .col-md-11 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 91.666667%;
+        flex: 0 0 91.666667%;
+        max-width: 91.666667%
+    }
+    .col-md-12 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 100%;
+        flex: 0 0 100%;
+        max-width: 100%
+    }
+    .order-md-first {
+        -webkit-box-ordinal-group: 0;
+        -ms-flex-order: -1;
+        order: -1
+    }
+    .order-md-last {
+        -webkit-box-ordinal-group: 14;
+        -ms-flex-order: 13;
+        order: 13
+    }
+    .order-md-0 {
+        -webkit-box-ordinal-group: 1;
+        -ms-flex-order: 0;
+        order: 0
+    }
+    .order-md-1 {
+        -webkit-box-ordinal-group: 2;
+        -ms-flex-order: 1;
+        order: 1
+    }
+    .order-md-2 {
+        -webkit-box-ordinal-group: 3;
+        -ms-flex-order: 2;
+        order: 2
+    }
+    .order-md-3 {
+        -webkit-box-ordinal-group: 4;
+        -ms-flex-order: 3;
+        order: 3
+    }
+    .order-md-4 {
+        -webkit-box-ordinal-group: 5;
+        -ms-flex-order: 4;
+        order: 4
+    }
+    .order-md-5 {
+        -webkit-box-ordinal-group: 6;
+        -ms-flex-order: 5;
+        order: 5
+    }
+    .order-md-6 {
+        -webkit-box-ordinal-group: 7;
+        -ms-flex-order: 6;
+        order: 6
+    }
+    .order-md-7 {
+        -webkit-box-ordinal-group: 8;
+        -ms-flex-order: 7;
+        order: 7
+    }
+    .order-md-8 {
+        -webkit-box-ordinal-group: 9;
+        -ms-flex-order: 8;
+        order: 8
+    }
+    .order-md-9 {
+        -webkit-box-ordinal-group: 10;
+        -ms-flex-order: 9;
+        order: 9
+    }
+    .order-md-10 {
+        -webkit-box-ordinal-group: 11;
+        -ms-flex-order: 10;
+        order: 10
+    }
+    .order-md-11 {
+        -webkit-box-ordinal-group: 12;
+        -ms-flex-order: 11;
+        order: 11
+    }
+    .order-md-12 {
+        -webkit-box-ordinal-group: 13;
+        -ms-flex-order: 12;
+        order: 12
+    }
+    .offset-md-0 {
+        margin-left: 0
+    }
+    .offset-md-1 {
+        margin-left: 8.333333%
+    }
+    .offset-md-2 {
+        margin-left: 16.666667%
+    }
+    .offset-md-3 {
+        margin-left: 25%
+    }
+    .offset-md-4 {
+        margin-left: 33.333333%
+    }
+    .offset-md-5 {
+        margin-left: 41.666667%
+    }
+    .offset-md-6 {
+        margin-left: 50%
+    }
+    .offset-md-7 {
+        margin-left: 58.333333%
+    }
+    .offset-md-8 {
+        margin-left: 66.666667%
+    }
+    .offset-md-9 {
+        margin-left: 75%
+    }
+    .offset-md-10 {
+        margin-left: 83.333333%
+    }
+    .offset-md-11 {
+        margin-left: 91.666667%
+    }
+}
+
+@media (min-width:992px) {
+    .col-lg {
+        -ms-flex-preferred-size: 0;
+        flex-basis: 0;
+        -webkit-box-flex: 1;
+        -ms-flex-positive: 1;
+        flex-grow: 1;
+        max-width: 100%
+    }
+    .col-lg-auto {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 auto;
+        flex: 0 0 auto;
+        width: auto;
+        max-width: none
+    }
+    .col-lg-1 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 8.333333%;
+        flex: 0 0 8.333333%;
+        max-width: 8.333333%
+    }
+    .col-lg-2 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 16.666667%;
+        flex: 0 0 16.666667%;
+        max-width: 16.666667%
+    }
+    .col-lg-3 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 25%;
+        flex: 0 0 25%;
+        max-width: 25%
+    }
+    .col-lg-4 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 33.333333%;
+        flex: 0 0 33.333333%;
+        max-width: 33.333333%
+    }
+    .col-lg-5 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 41.666667%;
+        flex: 0 0 41.666667%;
+        max-width: 41.666667%
+    }
+    .col-lg-6 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 50%;
+        flex: 0 0 50%;
+        max-width: 50%
+    }
+    .col-lg-7 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 58.333333%;
+        flex: 0 0 58.333333%;
+        max-width: 58.333333%
+    }
+    .col-lg-8 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 66.666667%;
+        flex: 0 0 66.666667%;
+        max-width: 66.666667%
+    }
+    .col-lg-9 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 75%;
+        flex: 0 0 75%;
+        max-width: 75%
+    }
+    .col-lg-10 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 83.333333%;
+        flex: 0 0 83.333333%;
+        max-width: 83.333333%
+    }
+    .col-lg-11 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 91.666667%;
+        flex: 0 0 91.666667%;
+        max-width: 91.666667%
+    }
+    .col-lg-12 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 100%;
+        flex: 0 0 100%;
+        max-width: 100%
+    }
+    .order-lg-first {
+        -webkit-box-ordinal-group: 0;
+        -ms-flex-order: -1;
+        order: -1
+    }
+    .order-lg-last {
+        -webkit-box-ordinal-group: 14;
+        -ms-flex-order: 13;
+        order: 13
+    }
+    .order-lg-0 {
+        -webkit-box-ordinal-group: 1;
+        -ms-flex-order: 0;
+        order: 0
+    }
+    .order-lg-1 {
+        -webkit-box-ordinal-group: 2;
+        -ms-flex-order: 1;
+        order: 1
+    }
+    .order-lg-2 {
+        -webkit-box-ordinal-group: 3;
+        -ms-flex-order: 2;
+        order: 2
+    }
+    .order-lg-3 {
+        -webkit-box-ordinal-group: 4;
+        -ms-flex-order: 3;
+        order: 3
+    }
+    .order-lg-4 {
+        -webkit-box-ordinal-group: 5;
+        -ms-flex-order: 4;
+        order: 4
+    }
+    .order-lg-5 {
+        -webkit-box-ordinal-group: 6;
+        -ms-flex-order: 5;
+        order: 5
+    }
+    .order-lg-6 {
+        -webkit-box-ordinal-group: 7;
+        -ms-flex-order: 6;
+        order: 6
+    }
+    .order-lg-7 {
+        -webkit-box-ordinal-group: 8;
+        -ms-flex-order: 7;
+        order: 7
+    }
+    .order-lg-8 {
+        -webkit-box-ordinal-group: 9;
+        -ms-flex-order: 8;
+        order: 8
+    }
+    .order-lg-9 {
+        -webkit-box-ordinal-group: 10;
+        -ms-flex-order: 9;
+        order: 9
+    }
+    .order-lg-10 {
+        -webkit-box-ordinal-group: 11;
+        -ms-flex-order: 10;
+        order: 10
+    }
+    .order-lg-11 {
+        -webkit-box-ordinal-group: 12;
+        -ms-flex-order: 11;
+        order: 11
+    }
+    .order-lg-12 {
+        -webkit-box-ordinal-group: 13;
+        -ms-flex-order: 12;
+        order: 12
+    }
+    .offset-lg-0 {
+        margin-left: 0
+    }
+    .offset-lg-1 {
+        margin-left: 8.333333%
+    }
+    .offset-lg-2 {
+        margin-left: 16.666667%
+    }
+    .offset-lg-3 {
+        margin-left: 25%
+    }
+    .offset-lg-4 {
+        margin-left: 33.333333%
+    }
+    .offset-lg-5 {
+        margin-left: 41.666667%
+    }
+    .offset-lg-6 {
+        margin-left: 50%
+    }
+    .offset-lg-7 {
+        margin-left: 58.333333%
+    }
+    .offset-lg-8 {
+        margin-left: 66.666667%
+    }
+    .offset-lg-9 {
+        margin-left: 75%
+    }
+    .offset-lg-10 {
+        margin-left: 83.333333%
+    }
+    .offset-lg-11 {
+        margin-left: 91.666667%
+    }
+}
+
+@media (min-width:1200px) {
+    .col-xl {
+        -ms-flex-preferred-size: 0;
+        flex-basis: 0;
+        -webkit-box-flex: 1;
+        -ms-flex-positive: 1;
+        flex-grow: 1;
+        max-width: 100%
+    }
+    .col-xl-auto {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 auto;
+        flex: 0 0 auto;
+        width: auto;
+        max-width: none
+    }
+    .col-xl-1 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 8.333333%;
+        flex: 0 0 8.333333%;
+        max-width: 8.333333%
+    }
+    .col-xl-2 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 16.666667%;
+        flex: 0 0 16.666667%;
+        max-width: 16.666667%
+    }
+    .col-xl-3 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 25%;
+        flex: 0 0 25%;
+        max-width: 25%
+    }
+    .col-xl-4 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 33.333333%;
+        flex: 0 0 33.333333%;
+        max-width: 33.333333%
+    }
+    .col-xl-5 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 41.666667%;
+        flex: 0 0 41.666667%;
+        max-width: 41.666667%
+    }
+    .col-xl-6 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 50%;
+        flex: 0 0 50%;
+        max-width: 50%
+    }
+    .col-xl-7 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 58.333333%;
+        flex: 0 0 58.333333%;
+        max-width: 58.333333%
+    }
+    .col-xl-8 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 66.666667%;
+        flex: 0 0 66.666667%;
+        max-width: 66.666667%
+    }
+    .col-xl-9 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 75%;
+        flex: 0 0 75%;
+        max-width: 75%
+    }
+    .col-xl-10 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 83.333333%;
+        flex: 0 0 83.333333%;
+        max-width: 83.333333%
+    }
+    .col-xl-11 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 91.666667%;
+        flex: 0 0 91.666667%;
+        max-width: 91.666667%
+    }
+    .col-xl-12 {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 100%;
+        flex: 0 0 100%;
+        max-width: 100%
+    }
+    .order-xl-first {
+        -webkit-box-ordinal-group: 0;
+        -ms-flex-order: -1;
+        order: -1
+    }
+    .order-xl-last {
+        -webkit-box-ordinal-group: 14;
+        -ms-flex-order: 13;
+        order: 13
+    }
+    .order-xl-0 {
+        -webkit-box-ordinal-group: 1;
+        -ms-flex-order: 0;
+        order: 0
+    }
+    .order-xl-1 {
+        -webkit-box-ordinal-group: 2;
+        -ms-flex-order: 1;
+        order: 1
+    }
+    .order-xl-2 {
+        -webkit-box-ordinal-group: 3;
+        -ms-flex-order: 2;
+        order: 2
+    }
+    .order-xl-3 {
+        -webkit-box-ordinal-group: 4;
+        -ms-flex-order: 3;
+        order: 3
+    }
+    .order-xl-4 {
+        -webkit-box-ordinal-group: 5;
+        -ms-flex-order: 4;
+        order: 4
+    }
+    .order-xl-5 {
+        -webkit-box-ordinal-group: 6;
+        -ms-flex-order: 5;
+        order: 5
+    }
+    .order-xl-6 {
+        -webkit-box-ordinal-group: 7;
+        -ms-flex-order: 6;
+        order: 6
+    }
+    .order-xl-7 {
+        -webkit-box-ordinal-group: 8;
+        -ms-flex-order: 7;
+        order: 7
+    }
+    .order-xl-8 {
+        -webkit-box-ordinal-group: 9;
+        -ms-flex-order: 8;
+        order: 8
+    }
+    .order-xl-9 {
+        -webkit-box-ordinal-group: 10;
+        -ms-flex-order: 9;
+        order: 9
+    }
+    .order-xl-10 {
+        -webkit-box-ordinal-group: 11;
+        -ms-flex-order: 10;
+        order: 10
+    }
+    .order-xl-11 {
+        -webkit-box-ordinal-group: 12;
+        -ms-flex-order: 11;
+        order: 11
+    }
+    .order-xl-12 {
+        -webkit-box-ordinal-group: 13;
+        -ms-flex-order: 12;
+        order: 12
+    }
+    .offset-xl-0 {
+        margin-left: 0
+    }
+    .offset-xl-1 {
+        margin-left: 8.333333%
+    }
+    .offset-xl-2 {
+        margin-left: 16.666667%
+    }
+    .offset-xl-3 {
+        margin-left: 25%
+    }
+    .offset-xl-4 {
+        margin-left: 33.333333%
+    }
+    .offset-xl-5 {
+        margin-left: 41.666667%
+    }
+    .offset-xl-6 {
+        margin-left: 50%
+    }
+    .offset-xl-7 {
+        margin-left: 58.333333%
+    }
+    .offset-xl-8 {
+        margin-left: 66.666667%
+    }
+    .offset-xl-9 {
+        margin-left: 75%
+    }
+    .offset-xl-10 {
+        margin-left: 83.333333%
+    }
+    .offset-xl-11 {
+        margin-left: 91.666667%
+    }
+}
+
+.table {
+    width: 100%;
+    max-width: 100%;
+    margin-bottom: 1rem;
+    background-color: transparent
+}
+
+.table td,
+.table th {
+    padding: .75rem;
+    vertical-align: top;
+    border-top: 1px solid #dee2e6
+}
+
+.table thead th {
+    vertical-align: bottom;
+    border-bottom: 2px solid #dee2e6
+}
+
+.table tbody+tbody {
+    border-top: 2px solid #dee2e6
+}
+
+.table .table {
+    background-color: #fff
+}
+
+.table-sm td,
+.table-sm th {
+    padding: .3rem
+}
+
+.table-bordered {
+    border: 1px solid #dee2e6
+}
+
+.table-bordered td,
+.table-bordered th {
+    border: 1px solid #dee2e6
+}
+
+.table-bordered thead td,
+.table-bordered thead th {
+    border-bottom-width: 2px
+}
+
+.table-striped tbody tr:nth-of-type(odd) {
+    background-color: rgba(0, 0, 0, .05)
+}
+
+.table-hover tbody tr:hover {
+    background-color: rgba(0, 0, 0, .075)
+}
+
+.table-primary,
+.table-primary>td,
+.table-primary>th {
+    background-color: #b8daff
+}
+
+.table-hover .table-primary:hover {
+    background-color: #9fcdff
+}
+
+.table-hover .table-primary:hover>td,
+.table-hover .table-primary:hover>th {
+    background-color: #9fcdff
+}
+
+.table-secondary,
+.table-secondary>td,
+.table-secondary>th {
+    background-color: #d6d8db
+}
+
+.table-hover .table-secondary:hover {
+    background-color: #c8cbcf
+}
+
+.table-hover .table-secondary:hover>td,
+.table-hover .table-secondary:hover>th {
+    background-color: #c8cbcf
+}
+
+.table-success,
+.table-success>td,
+.table-success>th {
+    background-color: #c3e6cb
+}
+
+.table-hover .table-success:hover {
+    background-color: #b1dfbb
+}
+
+.table-hover .table-success:hover>td,
+.table-hover .table-success:hover>th {
+    background-color: #b1dfbb
+}
+
+.table-info,
+.table-info>td,
+.table-info>th {
+    background-color: #bee5eb
+}
+
+.table-hover .table-info:hover {
+    background-color: #abdde5
+}
+
+.table-hover .table-info:hover>td,
+.table-hover .table-info:hover>th {
+    background-color: #abdde5
+}
+
+.table-warning,
+.table-warning>td,
+.table-warning>th {
+    background-color: #ffeeba
+}
+
+.table-hover .table-warning:hover {
+    background-color: #ffe8a1
+}
+
+.table-hover .table-warning:hover>td,
+.table-hover .table-warning:hover>th {
+    background-color: #ffe8a1
+}
+
+.table-danger,
+.table-danger>td,
+.table-danger>th {
+    background-color: #f5c6cb
+}
+
+.table-hover .table-danger:hover {
+    background-color: #f1b0b7
+}
+
+.table-hover .table-danger:hover>td,
+.table-hover .table-danger:hover>th {
+    background-color: #f1b0b7
+}
+
+.table-light,
+.table-light>td,
+.table-light>th {
+    background-color: #fdfdfe
+}
+
+.table-hover .table-light:hover {
+    background-color: #ececf6
+}
+
+.table-hover .table-light:hover>td,
+.table-hover .table-light:hover>th {
+    background-color: #ececf6
+}
+
+.table-dark,
+.table-dark>td,
+.table-dark>th {
+    background-color: #c6c8ca
+}
+
+.table-hover .table-dark:hover {
+    background-color: #b9bbbe
+}
+
+.table-hover .table-dark:hover>td,
+.table-hover .table-dark:hover>th {
+    background-color: #b9bbbe
+}
+
+.table-active,
+.table-active>td,
+.table-active>th {
+    background-color: rgba(0, 0, 0, .075)
+}
+
+.table-hover .table-active:hover {
+    background-color: rgba(0, 0, 0, .075)
+}
+
+.table-hover .table-active:hover>td,
+.table-hover .table-active:hover>th {
+    background-color: rgba(0, 0, 0, .075)
+}
+
+.table .thead-dark th {
+    color: #fff;
+    background-color: #212529;
+    border-color: #32383e
+}
+
+.table .thead-light th {
+    color: #495057;
+    background-color: #e9ecef;
+    border-color: #dee2e6
+}
+
+.table-dark {
+    color: #fff;
+    background-color: #212529
+}
+
+.table-dark td,
+.table-dark th,
+.table-dark thead th {
+    border-color: #32383e
+}
+
+.table-dark.table-bordered {
+    border: 0
+}
+
+.table-dark.table-striped tbody tr:nth-of-type(odd) {
+    background-color: rgba(255, 255, 255, .05)
+}
+
+.table-dark.table-hover tbody tr:hover {
+    background-color: rgba(255, 255, 255, .075)
+}
+
+@media (max-width:575.98px) {
+    .table-responsive-sm {
+        display: block;
+        width: 100%;
+        overflow-x: auto;
+        -webkit-overflow-scrolling: touch;
+        -ms-overflow-style: -ms-autohiding-scrollbar
+    }
+    .table-responsive-sm>.table-bordered {
+        border: 0
+    }
+}
+
+@media (max-width:767.98px) {
+    .table-responsive-md {
+        display: block;
+        width: 100%;
+        overflow-x: auto;
+        -webkit-overflow-scrolling: touch;
+        -ms-overflow-style: -ms-autohiding-scrollbar
+    }
+    .table-responsive-md>.table-bordered {
+        border: 0
+    }
+}
+
+@media (max-width:991.98px) {
+    .table-responsive-lg {
+        display: block;
+        width: 100%;
+        overflow-x: auto;
+        -webkit-overflow-scrolling: touch;
+        -ms-overflow-style: -ms-autohiding-scrollbar
+    }
+    .table-responsive-lg>.table-bordered {
+        border: 0
+    }
+}
+
+@media (max-width:1199.98px) {
+    .table-responsive-xl {
+        display: block;
+        width: 100%;
+        overflow-x: auto;
+        -webkit-overflow-scrolling: touch;
+        -ms-overflow-style: -ms-autohiding-scrollbar
+    }
+    .table-responsive-xl>.table-bordered {
+        border: 0
+    }
+}
+
+.table-responsive {
+    display: block;
+    width: 100%;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch;
+    -ms-overflow-style: -ms-autohiding-scrollbar
+}
+
+.table-responsive>.table-bordered {
+    border: 0
+}
+
+.form-control {
+    display: block;
+    width: 100%;
+    padding: .375rem .75rem;
+    font-size: 1rem;
+    line-height: 1.5;
+    color: #495057;
+    background-color: #fff;
+    background-clip: padding-box;
+    border: 1px solid #ced4da;
+    border-radius: .25rem;
+    transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+.form-control::-ms-expand {
+    background-color: transparent;
+    border: 0
+}
+
+.form-control:focus {
+    color: #495057;
+    background-color: #fff;
+    border-color: #80bdff;
+    outline: 0;
+    box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.form-control::-webkit-input-placeholder {
+    color: #6c757d;
+    opacity: 1
+}
+
+.form-control::-moz-placeholder {
+    color: #6c757d;
+    opacity: 1
+}
+
+.form-control:-ms-input-placeholder {
+    color: #6c757d;
+    opacity: 1
+}
+
+.form-control::-ms-input-placeholder {
+    color: #6c757d;
+    opacity: 1
+}
+
+.form-control::placeholder {
+    color: #6c757d;
+    opacity: 1
+}
+
+.form-control:disabled,
+.form-control[readonly] {
+    background-color: #e9ecef;
+    opacity: 1
+}
+
+select.form-control:not([size]):not([multiple]) {
+    height: calc(2.25rem + 2px)
+}
+
+select.form-control:focus::-ms-value {
+    color: #495057;
+    background-color: #fff
+}
+
+.form-control-file,
+.form-control-range {
+    display: block;
+    width: 100%
+}
+
+.col-form-label {
+    padding-top: calc(.375rem + 1px);
+    padding-bottom: calc(.375rem + 1px);
+    margin-bottom: 0;
+    font-size: inherit;
+    line-height: 1.5
+}
+
+.col-form-label-lg {
+    padding-top: calc(.5rem + 1px);
+    padding-bottom: calc(.5rem + 1px);
+    font-size: 1.25rem;
+    line-height: 1.5
+}
+
+.col-form-label-sm {
+    padding-top: calc(.25rem + 1px);
+    padding-bottom: calc(.25rem + 1px);
+    font-size: .875rem;
+    line-height: 1.5
+}
+
+.form-control-plaintext {
+    display: block;
+    width: 100%;
+    padding-top: .375rem;
+    padding-bottom: .375rem;
+    margin-bottom: 0;
+    line-height: 1.5;
+    background-color: transparent;
+    border: solid transparent;
+    border-width: 1px 0
+}
+
+.form-control-plaintext.form-control-lg,
+.form-control-plaintext.form-control-sm,
+.input-group-lg>.form-control-plaintext.form-control,
+.input-group-lg>.input-group-append>.form-control-plaintext.btn,
+.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,
+.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,
+.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,
+.input-group-sm>.form-control-plaintext.form-control,
+.input-group-sm>.input-group-append>.form-control-plaintext.btn,
+.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,
+.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,
+.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text {
+    padding-right: 0;
+    padding-left: 0
+}
+
+.form-control-sm,
+.input-group-sm>.form-control,
+.input-group-sm>.input-group-append>.btn,
+.input-group-sm>.input-group-append>.input-group-text,
+.input-group-sm>.input-group-prepend>.btn,
+.input-group-sm>.input-group-prepend>.input-group-text {
+    padding: .25rem .5rem;
+    font-size: .875rem;
+    line-height: 1.5;
+    border-radius: .2rem
+}
+
+.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),
+.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),
+.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),
+.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),
+.input-group-sm>select.form-control:not([size]):not([multiple]),
+select.form-control-sm:not([size]):not([multiple]) {
+    height: calc(1.8125rem + 2px)
+}
+
+.form-control-lg,
+.input-group-lg>.form-control,
+.input-group-lg>.input-group-append>.btn,
+.input-group-lg>.input-group-append>.input-group-text,
+.input-group-lg>.input-group-prepend>.btn,
+.input-group-lg>.input-group-prepend>.input-group-text {
+    padding: .5rem 1rem;
+    font-size: 1.25rem;
+    line-height: 1.5;
+    border-radius: .3rem
+}
+
+.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),
+.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),
+.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),
+.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),
+.input-group-lg>select.form-control:not([size]):not([multiple]),
+select.form-control-lg:not([size]):not([multiple]) {
+    height: calc(2.875rem + 2px)
+}
+
+.form-group {
+    margin-bottom: 1rem
+}
+
+.form-text {
+    display: block;
+    margin-top: .25rem
+}
+
+.form-row {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-wrap: wrap;
+    flex-wrap: wrap;
+    margin-right: -5px;
+    margin-left: -5px
+}
+
+.form-row>.col,
+.form-row>[class*=col-] {
+    padding-right: 5px;
+    padding-left: 5px
+}
+
+.form-check {
+    position: relative;
+    display: block;
+    padding-left: 1.25rem
+}
+
+.form-check-input {
+    position: absolute;
+    margin-top: .3rem;
+    margin-left: -1.25rem
+}
+
+.form-check-input:disabled~.form-check-label {
+    color: #6c757d
+}
+
+.form-check-label {
+    margin-bottom: 0
+}
+
+.form-check-inline {
+    display: -webkit-inline-box;
+    display: -ms-inline-flexbox;
+    display: inline-flex;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+    padding-left: 0;
+    margin-right: .75rem
+}
+
+.form-check-inline .form-check-input {
+    position: static;
+    margin-top: 0;
+    margin-right: .3125rem;
+    margin-left: 0
+}
+
+.valid-feedback {
+    display: none;
+    width: 100%;
+    margin-top: .25rem;
+    font-size: 80%;
+    color: #28a745
+}
+
+.valid-tooltip {
+    position: absolute;
+    top: 100%;
+    z-index: 5;
+    display: none;
+    max-width: 100%;
+    padding: .5rem;
+    margin-top: .1rem;
+    font-size: .875rem;
+    line-height: 1;
+    color: #fff;
+    background-color: rgba(40, 167, 69, .8);
+    border-radius: .2rem
+}
+
+.custom-select.is-valid,
+.form-control.is-valid,
+.was-validated .custom-select:valid,
+.was-validated .form-control:valid {
+    border-color: #28a745
+}
+
+.custom-select.is-valid:focus,
+.form-control.is-valid:focus,
+.was-validated .custom-select:valid:focus,
+.was-validated .form-control:valid:focus {
+    border-color: #28a745;
+    box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.custom-select.is-valid~.valid-feedback,
+.custom-select.is-valid~.valid-tooltip,
+.form-control.is-valid~.valid-feedback,
+.form-control.is-valid~.valid-tooltip,
+.was-validated .custom-select:valid~.valid-feedback,
+.was-validated .custom-select:valid~.valid-tooltip,
+.was-validated .form-control:valid~.valid-feedback,
+.was-validated .form-control:valid~.valid-tooltip {
+    display: block
+}
+
+.form-check-input.is-valid~.form-check-label,
+.was-validated .form-check-input:valid~.form-check-label {
+    color: #28a745
+}
+
+.form-check-input.is-valid~.valid-feedback,
+.form-check-input.is-valid~.valid-tooltip,
+.was-validated .form-check-input:valid~.valid-feedback,
+.was-validated .form-check-input:valid~.valid-tooltip {
+    display: block
+}
+
+.custom-control-input.is-valid~.custom-control-label,
+.was-validated .custom-control-input:valid~.custom-control-label {
+    color: #28a745
+}
+
+.custom-control-input.is-valid~.custom-control-label::before,
+.was-validated .custom-control-input:valid~.custom-control-label::before {
+    background-color: #71dd8a
+}
+
+.custom-control-input.is-valid~.valid-feedback,
+.custom-control-input.is-valid~.valid-tooltip,
+.was-validated .custom-control-input:valid~.valid-feedback,
+.was-validated .custom-control-input:valid~.valid-tooltip {
+    display: block
+}
+
+.custom-control-input.is-valid:checked~.custom-control-label::before,
+.was-validated .custom-control-input:valid:checked~.custom-control-label::before {
+    background-color: #34ce57
+}
+
+.custom-control-input.is-valid:focus~.custom-control-label::before,
+.was-validated .custom-control-input:valid:focus~.custom-control-label::before {
+    box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.custom-file-input.is-valid~.custom-file-label,
+.was-validated .custom-file-input:valid~.custom-file-label {
+    border-color: #28a745
+}
+
+.custom-file-input.is-valid~.custom-file-label::before,
+.was-validated .custom-file-input:valid~.custom-file-label::before {
+    border-color: inherit
+}
+
+.custom-file-input.is-valid~.valid-feedback,
+.custom-file-input.is-valid~.valid-tooltip,
+.was-validated .custom-file-input:valid~.valid-feedback,
+.was-validated .custom-file-input:valid~.valid-tooltip {
+    display: block
+}
+
+.custom-file-input.is-valid:focus~.custom-file-label,
+.was-validated .custom-file-input:valid:focus~.custom-file-label {
+    box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.invalid-feedback {
+    display: none;
+    width: 100%;
+    margin-top: .25rem;
+    font-size: 80%;
+    color: #dc3545
+}
+
+.invalid-tooltip {
+    position: absolute;
+    top: 100%;
+    z-index: 5;
+    display: none;
+    max-width: 100%;
+    padding: .5rem;
+    margin-top: .1rem;
+    font-size: .875rem;
+    line-height: 1;
+    color: #fff;
+    background-color: rgba(220, 53, 69, .8);
+    border-radius: .2rem
+}
+
+.custom-select.is-invalid,
+.form-control.is-invalid,
+.was-validated .custom-select:invalid,
+.was-validated .form-control:invalid {
+    border-color: #dc3545
+}
+
+.custom-select.is-invalid:focus,
+.form-control.is-invalid:focus,
+.was-validated .custom-select:invalid:focus,
+.was-validated .form-control:invalid:focus {
+    border-color: #dc3545;
+    box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.custom-select.is-invalid~.invalid-feedback,
+.custom-select.is-invalid~.invalid-tooltip,
+.form-control.is-invalid~.invalid-feedback,
+.form-control.is-invalid~.invalid-tooltip,
+.was-validated .custom-select:invalid~.invalid-feedback,
+.was-validated .custom-select:invalid~.invalid-tooltip,
+.was-validated .form-control:invalid~.invalid-feedback,
+.was-validated .form-control:invalid~.invalid-tooltip {
+    display: block
+}
+
+.form-check-input.is-invalid~.form-check-label,
+.was-validated .form-check-input:invalid~.form-check-label {
+    color: #dc3545
+}
+
+.form-check-input.is-invalid~.invalid-feedback,
+.form-check-input.is-invalid~.invalid-tooltip,
+.was-validated .form-check-input:invalid~.invalid-feedback,
+.was-validated .form-check-input:invalid~.invalid-tooltip {
+    display: block
+}
+
+.custom-control-input.is-invalid~.custom-control-label,
+.was-validated .custom-control-input:invalid~.custom-control-label {
+    color: #dc3545
+}
+
+.custom-control-input.is-invalid~.custom-control-label::before,
+.was-validated .custom-control-input:invalid~.custom-control-label::before {
+    background-color: #efa2a9
+}
+
+.custom-control-input.is-invalid~.invalid-feedback,
+.custom-control-input.is-invalid~.invalid-tooltip,
+.was-validated .custom-control-input:invalid~.invalid-feedback,
+.was-validated .custom-control-input:invalid~.invalid-tooltip {
+    display: block
+}
+
+.custom-control-input.is-invalid:checked~.custom-control-label::before,
+.was-validated .custom-control-input:invalid:checked~.custom-control-label::before {
+    background-color: #e4606d
+}
+
+.custom-control-input.is-invalid:focus~.custom-control-label::before,
+.was-validated .custom-control-input:invalid:focus~.custom-control-label::before {
+    box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.custom-file-input.is-invalid~.custom-file-label,
+.was-validated .custom-file-input:invalid~.custom-file-label {
+    border-color: #dc3545
+}
+
+.custom-file-input.is-invalid~.custom-file-label::before,
+.was-validated .custom-file-input:invalid~.custom-file-label::before {
+    border-color: inherit
+}
+
+.custom-file-input.is-invalid~.invalid-feedback,
+.custom-file-input.is-invalid~.invalid-tooltip,
+.was-validated .custom-file-input:invalid~.invalid-feedback,
+.was-validated .custom-file-input:invalid~.invalid-tooltip {
+    display: block
+}
+
+.custom-file-input.is-invalid:focus~.custom-file-label,
+.was-validated .custom-file-input:invalid:focus~.custom-file-label {
+    box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.form-inline {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+    -ms-flex-flow: row wrap;
+    flex-flow: row wrap;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center
+}
+
+.form-inline .form-check {
+    width: 100%
+}
+
+@media (min-width:576px) {
+    .form-inline label {
+        display: -webkit-box;
+        display: -ms-flexbox;
+        display: flex;
+        -webkit-box-align: center;
+        -ms-flex-align: center;
+        align-items: center;
+        -webkit-box-pack: center;
+        -ms-flex-pack: center;
+        justify-content: center;
+        margin-bottom: 0
+    }
+    .form-inline .form-group {
+        display: -webkit-box;
+        display: -ms-flexbox;
+        display: flex;
+        -webkit-box-flex: 0;
+        -ms-flex: 0 0 auto;
+        flex: 0 0 auto;
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-flow: row wrap;
+        flex-flow: row wrap;
+        -webkit-box-align: center;
+        -ms-flex-align: center;
+        align-items: center;
+        margin-bottom: 0
+    }
+    .form-inline .form-control {
+        display: inline-block;
+        width: auto;
+        vertical-align: middle
+    }
+    .form-inline .form-control-plaintext {
+        display: inline-block
+    }
+    .form-inline .input-group {
+        width: auto
+    }
+    .form-inline .form-check {
+        display: -webkit-box;
+        display: -ms-flexbox;
+        display: flex;
+        -webkit-box-align: center;
+        -ms-flex-align: center;
+        align-items: center;
+        -webkit-box-pack: center;
+        -ms-flex-pack: center;
+        justify-content: center;
+        width: auto;
+        padding-left: 0
+    }
+    .form-inline .form-check-input {
+        position: relative;
+        margin-top: 0;
+        margin-right: .25rem;
+        margin-left: 0
+    }
+    .form-inline .custom-control {
+        -webkit-box-align: center;
+        -ms-flex-align: center;
+        align-items: center;
+        -webkit-box-pack: center;
+        -ms-flex-pack: center;
+        justify-content: center
+    }
+    .form-inline .custom-control-label {
+        margin-bottom: 0
+    }
+}
+
+.btn {
+    display: inline-block;
+    font-weight: 400;
+    text-align: center;
+    white-space: nowrap;
+    vertical-align: middle;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    border: 1px solid transparent;
+    padding: .375rem .75rem;
+    font-size: 1rem;
+    line-height: 1.5;
+    border-radius: .25rem;
+    transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+.btn:focus,
+.btn:hover {
+    text-decoration: none
+}
+
+.btn.focus,
+.btn:focus {
+    outline: 0;
+    box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.btn.disabled,
+.btn:disabled {
+    opacity: .65
+}
+
+.btn:not(:disabled):not(.disabled) {
+    cursor: pointer
+}
+
+.btn:not(:disabled):not(.disabled).active,
+.btn:not(:disabled):not(.disabled):active {
+    background-image: none
+}
+
+a.btn.disabled,
+fieldset:disabled a.btn {
+    pointer-events: none
+}
+
+.btn-primary {
+    color: #fff;
+    background-color: #007bff;
+    border-color: #007bff
+}
+
+.btn-primary:hover {
+    color: #fff;
+    background-color: #0069d9;
+    border-color: #0062cc
+}
+
+.btn-primary.focus,
+.btn-primary:focus {
+    box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .5)
+}
+
+.btn-primary.disabled,
+.btn-primary:disabled {
+    color: #fff;
+    background-color: #007bff;
+    border-color: #007bff
+}
+
+.btn-primary:not(:disabled):not(.disabled).active,
+.btn-primary:not(:disabled):not(.disabled):active,
+.show>.btn-primary.dropdown-toggle {
+    color: #fff;
+    background-color: #0062cc;
+    border-color: #005cbf
+}
+
+.btn-primary:not(:disabled):not(.disabled).active:focus,
+.btn-primary:not(:disabled):not(.disabled):active:focus,
+.show>.btn-primary.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .5)
+}
+
+.btn-secondary {
+    color: #fff;
+    background-color: #6c757d;
+    border-color: #6c757d
+}
+
+.btn-secondary:hover {
+    color: #fff;
+    background-color: #5a6268;
+    border-color: #545b62
+}
+
+.btn-secondary.focus,
+.btn-secondary:focus {
+    box-shadow: 0 0 0 .2rem rgba(108, 117, 125, .5)
+}
+
+.btn-secondary.disabled,
+.btn-secondary:disabled {
+    color: #fff;
+    background-color: #6c757d;
+    border-color: #6c757d
+}
+
+.btn-secondary:not(:disabled):not(.disabled).active,
+.btn-secondary:not(:disabled):not(.disabled):active,
+.show>.btn-secondary.dropdown-toggle {
+    color: #fff;
+    background-color: #545b62;
+    border-color: #4e555b
+}
+
+.btn-secondary:not(:disabled):not(.disabled).active:focus,
+.btn-secondary:not(:disabled):not(.disabled):active:focus,
+.show>.btn-secondary.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(108, 117, 125, .5)
+}
+
+.btn-success {
+    color: #fff;
+    background-color: #28a745;
+    border-color: #28a745
+}
+
+.btn-success:hover {
+    color: #fff;
+    background-color: #218838;
+    border-color: #1e7e34
+}
+
+.btn-success.focus,
+.btn-success:focus {
+    box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .5)
+}
+
+.btn-success.disabled,
+.btn-success:disabled {
+    color: #fff;
+    background-color: #28a745;
+    border-color: #28a745
+}
+
+.btn-success:not(:disabled):not(.disabled).active,
+.btn-success:not(:disabled):not(.disabled):active,
+.show>.btn-success.dropdown-toggle {
+    color: #fff;
+    background-color: #1e7e34;
+    border-color: #1c7430
+}
+
+.btn-success:not(:disabled):not(.disabled).active:focus,
+.btn-success:not(:disabled):not(.disabled):active:focus,
+.show>.btn-success.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .5)
+}
+
+.btn-info {
+    color: #fff;
+    background-color: #17a2b8;
+    border-color: #17a2b8
+}
+
+.btn-info:hover {
+    color: #fff;
+    background-color: #138496;
+    border-color: #117a8b
+}
+
+.btn-info.focus,
+.btn-info:focus {
+    box-shadow: 0 0 0 .2rem rgba(23, 162, 184, .5)
+}
+
+.btn-info.disabled,
+.btn-info:disabled {
+    color: #fff;
+    background-color: #17a2b8;
+    border-color: #17a2b8
+}
+
+.btn-info:not(:disabled):not(.disabled).active,
+.btn-info:not(:disabled):not(.disabled):active,
+.show>.btn-info.dropdown-toggle {
+    color: #fff;
+    background-color: #117a8b;
+    border-color: #10707f
+}
+
+.btn-info:not(:disabled):not(.disabled).active:focus,
+.btn-info:not(:disabled):not(.disabled):active:focus,
+.show>.btn-info.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(23, 162, 184, .5)
+}
+
+.btn-warning {
+    color: #212529;
+    background-color: #ffc107;
+    border-color: #ffc107
+}
+
+.btn-warning:hover {
+    color: #212529;
+    background-color: #e0a800;
+    border-color: #d39e00
+}
+
+.btn-warning.focus,
+.btn-warning:focus {
+    box-shadow: 0 0 0 .2rem rgba(255, 193, 7, .5)
+}
+
+.btn-warning.disabled,
+.btn-warning:disabled {
+    color: #212529;
+    background-color: #ffc107;
+    border-color: #ffc107
+}
+
+.btn-warning:not(:disabled):not(.disabled).active,
+.btn-warning:not(:disabled):not(.disabled):active,
+.show>.btn-warning.dropdown-toggle {
+    color: #212529;
+    background-color: #d39e00;
+    border-color: #c69500
+}
+
+.btn-warning:not(:disabled):not(.disabled).active:focus,
+.btn-warning:not(:disabled):not(.disabled):active:focus,
+.show>.btn-warning.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(255, 193, 7, .5)
+}
+
+.btn-danger {
+    color: #fff;
+    background-color: #dc3545;
+    border-color: #dc3545
+}
+
+.btn-danger:hover {
+    color: #fff;
+    background-color: #c82333;
+    border-color: #bd2130
+}
+
+.btn-danger.focus,
+.btn-danger:focus {
+    box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .5)
+}
+
+.btn-danger.disabled,
+.btn-danger:disabled {
+    color: #fff;
+    background-color: #dc3545;
+    border-color: #dc3545
+}
+
+.btn-danger:not(:disabled):not(.disabled).active,
+.btn-danger:not(:disabled):not(.disabled):active,
+.show>.btn-danger.dropdown-toggle {
+    color: #fff;
+    background-color: #bd2130;
+    border-color: #b21f2d
+}
+
+.btn-danger:not(:disabled):not(.disabled).active:focus,
+.btn-danger:not(:disabled):not(.disabled):active:focus,
+.show>.btn-danger.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .5)
+}
+
+.btn-light {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa
+}
+
+.btn-light:hover {
+    color: #212529;
+    background-color: #e2e6ea;
+    border-color: #dae0e5
+}
+
+.btn-light.focus,
+.btn-light:focus {
+    box-shadow: 0 0 0 .2rem rgba(248, 249, 250, .5)
+}
+
+.btn-light.disabled,
+.btn-light:disabled {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa
+}
+
+.btn-light:not(:disabled):not(.disabled).active,
+.btn-light:not(:disabled):not(.disabled):active,
+.show>.btn-light.dropdown-toggle {
+    color: #212529;
+    background-color: #dae0e5;
+    border-color: #d3d9df
+}
+
+.btn-light:not(:disabled):not(.disabled).active:focus,
+.btn-light:not(:disabled):not(.disabled):active:focus,
+.show>.btn-light.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(248, 249, 250, .5)
+}
+
+.btn-dark {
+    color: #fff;
+    background-color: #343a40;
+    border-color: #343a40
+}
+
+.btn-dark:hover {
+    color: #fff;
+    background-color: #23272b;
+    border-color: #1d2124
+}
+
+.btn-dark.focus,
+.btn-dark:focus {
+    box-shadow: 0 0 0 .2rem rgba(52, 58, 64, .5)
+}
+
+.btn-dark.disabled,
+.btn-dark:disabled {
+    color: #fff;
+    background-color: #343a40;
+    border-color: #343a40
+}
+
+.btn-dark:not(:disabled):not(.disabled).active,
+.btn-dark:not(:disabled):not(.disabled):active,
+.show>.btn-dark.dropdown-toggle {
+    color: #fff;
+    background-color: #1d2124;
+    border-color: #171a1d
+}
+
+.btn-dark:not(:disabled):not(.disabled).active:focus,
+.btn-dark:not(:disabled):not(.disabled):active:focus,
+.show>.btn-dark.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(52, 58, 64, .5)
+}
+
+.btn-outline-primary {
+    color: #007bff;
+    background-color: transparent;
+    background-image: none;
+    border-color: #007bff
+}
+
+.btn-outline-primary:hover {
+    color: #fff;
+    background-color: #007bff;
+    border-color: #007bff
+}
+
+.btn-outline-primary.focus,
+.btn-outline-primary:focus {
+    box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .5)
+}
+
+.btn-outline-primary.disabled,
+.btn-outline-primary:disabled {
+    color: #007bff;
+    background-color: transparent
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled).active,
+.btn-outline-primary:not(:disabled):not(.disabled):active,
+.show>.btn-outline-primary.dropdown-toggle {
+    color: #fff;
+    background-color: #007bff;
+    border-color: #007bff
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled).active:focus,
+.btn-outline-primary:not(:disabled):not(.disabled):active:focus,
+.show>.btn-outline-primary.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .5)
+}
+
+.btn-outline-secondary {
+    color: #6c757d;
+    background-color: transparent;
+    background-image: none;
+    border-color: #6c757d
+}
+
+.btn-outline-secondary:hover {
+    color: #fff;
+    background-color: #6c757d;
+    border-color: #6c757d
+}
+
+.btn-outline-secondary.focus,
+.btn-outline-secondary:focus {
+    box-shadow: 0 0 0 .2rem rgba(108, 117, 125, .5)
+}
+
+.btn-outline-secondary.disabled,
+.btn-outline-secondary:disabled {
+    color: #6c757d;
+    background-color: transparent
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled).active,
+.btn-outline-secondary:not(:disabled):not(.disabled):active,
+.show>.btn-outline-secondary.dropdown-toggle {
+    color: #fff;
+    background-color: #6c757d;
+    border-color: #6c757d
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
+.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,
+.show>.btn-outline-secondary.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(108, 117, 125, .5)
+}
+
+.btn-outline-success {
+    color: #28a745;
+    background-color: transparent;
+    background-image: none;
+    border-color: #28a745
+}
+
+.btn-outline-success:hover {
+    color: #fff;
+    background-color: #28a745;
+    border-color: #28a745
+}
+
+.btn-outline-success.focus,
+.btn-outline-success:focus {
+    box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .5)
+}
+
+.btn-outline-success.disabled,
+.btn-outline-success:disabled {
+    color: #28a745;
+    background-color: transparent
+}
+
+.btn-outline-success:not(:disabled):not(.disabled).active,
+.btn-outline-success:not(:disabled):not(.disabled):active,
+.show>.btn-outline-success.dropdown-toggle {
+    color: #fff;
+    background-color: #28a745;
+    border-color: #28a745
+}
+
+.btn-outline-success:not(:disabled):not(.disabled).active:focus,
+.btn-outline-success:not(:disabled):not(.disabled):active:focus,
+.show>.btn-outline-success.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .5)
+}
+
+.btn-outline-info {
+    color: #17a2b8;
+    background-color: transparent;
+    background-image: none;
+    border-color: #17a2b8
+}
+
+.btn-outline-info:hover {
+    color: #fff;
+    background-color: #17a2b8;
+    border-color: #17a2b8
+}
+
+.btn-outline-info.focus,
+.btn-outline-info:focus {
+    box-shadow: 0 0 0 .2rem rgba(23, 162, 184, .5)
+}
+
+.btn-outline-info.disabled,
+.btn-outline-info:disabled {
+    color: #17a2b8;
+    background-color: transparent
+}
+
+.btn-outline-info:not(:disabled):not(.disabled).active,
+.btn-outline-info:not(:disabled):not(.disabled):active,
+.show>.btn-outline-info.dropdown-toggle {
+    color: #fff;
+    background-color: #17a2b8;
+    border-color: #17a2b8
+}
+
+.btn-outline-info:not(:disabled):not(.disabled).active:focus,
+.btn-outline-info:not(:disabled):not(.disabled):active:focus,
+.show>.btn-outline-info.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(23, 162, 184, .5)
+}
+
+.btn-outline-warning {
+    color: #ffc107;
+    background-color: transparent;
+    background-image: none;
+    border-color: #ffc107
+}
+
+.btn-outline-warning:hover {
+    color: #212529;
+    background-color: #ffc107;
+    border-color: #ffc107
+}
+
+.btn-outline-warning.focus,
+.btn-outline-warning:focus {
+    box-shadow: 0 0 0 .2rem rgba(255, 193, 7, .5)
+}
+
+.btn-outline-warning.disabled,
+.btn-outline-warning:disabled {
+    color: #ffc107;
+    background-color: transparent
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled).active,
+.btn-outline-warning:not(:disabled):not(.disabled):active,
+.show>.btn-outline-warning.dropdown-toggle {
+    color: #212529;
+    background-color: #ffc107;
+    border-color: #ffc107
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled).active:focus,
+.btn-outline-warning:not(:disabled):not(.disabled):active:focus,
+.show>.btn-outline-warning.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(255, 193, 7, .5)
+}
+
+.btn-outline-danger {
+    color: #dc3545;
+    background-color: transparent;
+    background-image: none;
+    border-color: #dc3545
+}
+
+.btn-outline-danger:hover {
+    color: #fff;
+    background-color: #dc3545;
+    border-color: #dc3545
+}
+
+.btn-outline-danger.focus,
+.btn-outline-danger:focus {
+    box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .5)
+}
+
+.btn-outline-danger.disabled,
+.btn-outline-danger:disabled {
+    color: #dc3545;
+    background-color: transparent
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled).active,
+.btn-outline-danger:not(:disabled):not(.disabled):active,
+.show>.btn-outline-danger.dropdown-toggle {
+    color: #fff;
+    background-color: #dc3545;
+    border-color: #dc3545
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled).active:focus,
+.btn-outline-danger:not(:disabled):not(.disabled):active:focus,
+.show>.btn-outline-danger.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .5)
+}
+
+.btn-outline-light {
+    color: #f8f9fa;
+    background-color: transparent;
+    background-image: none;
+    border-color: #f8f9fa
+}
+
+.btn-outline-light:hover {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa
+}
+
+.btn-outline-light.focus,
+.btn-outline-light:focus {
+    box-shadow: 0 0 0 .2rem rgba(248, 249, 250, .5)
+}
+
+.btn-outline-light.disabled,
+.btn-outline-light:disabled {
+    color: #f8f9fa;
+    background-color: transparent
+}
+
+.btn-outline-light:not(:disabled):not(.disabled).active,
+.btn-outline-light:not(:disabled):not(.disabled):active,
+.show>.btn-outline-light.dropdown-toggle {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa
+}
+
+.btn-outline-light:not(:disabled):not(.disabled).active:focus,
+.btn-outline-light:not(:disabled):not(.disabled):active:focus,
+.show>.btn-outline-light.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(248, 249, 250, .5)
+}
+
+.btn-outline-dark {
+    color: #343a40;
+    background-color: transparent;
+    background-image: none;
+    border-color: #343a40
+}
+
+.btn-outline-dark:hover {
+    color: #fff;
+    background-color: #343a40;
+    border-color: #343a40
+}
+
+.btn-outline-dark.focus,
+.btn-outline-dark:focus {
+    box-shadow: 0 0 0 .2rem rgba(52, 58, 64, .5)
+}
+
+.btn-outline-dark.disabled,
+.btn-outline-dark:disabled {
+    color: #343a40;
+    background-color: transparent
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled).active,
+.btn-outline-dark:not(:disabled):not(.disabled):active,
+.show>.btn-outline-dark.dropdown-toggle {
+    color: #fff;
+    background-color: #343a40;
+    border-color: #343a40
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled).active:focus,
+.btn-outline-dark:not(:disabled):not(.disabled):active:focus,
+.show>.btn-outline-dark.dropdown-toggle:focus {
+    box-shadow: 0 0 0 .2rem rgba(52, 58, 64, .5)
+}
+
+.btn-link {
+    font-weight: 400;
+    color: #007bff;
+    background-color: transparent
+}
+
+.btn-link:hover {
+    color: #0056b3;
+    text-decoration: underline;
+    background-color: transparent;
+    border-color: transparent
+}
+
+.btn-link.focus,
+.btn-link:focus {
+    text-decoration: underline;
+    border-color: transparent;
+    box-shadow: none
+}
+
+.btn-link.disabled,
+.btn-link:disabled {
+    color: #6c757d
+}
+
+.btn-group-lg>.btn,
+.btn-lg {
+    padding: .5rem 1rem;
+    font-size: 1.25rem;
+    line-height: 1.5;
+    border-radius: .3rem
+}
+
+.btn-group-sm>.btn,
+.btn-sm {
+    padding: .25rem .5rem;
+    font-size: .875rem;
+    line-height: 1.5;
+    border-radius: .2rem
+}
+
+.btn-block {
+    display: block;
+    width: 100%
+}
+
+.btn-block+.btn-block {
+    margin-top: .5rem
+}
+
+input[type=button].btn-block,
+input[type=reset].btn-block,
+input[type=submit].btn-block {
+    width: 100%
+}
+
+.fade {
+    opacity: 0;
+    transition: opacity .15s linear
+}
+
+.fade.show {
+    opacity: 1
+}
+
+.collapse {
+    display: none
+}
+
+.collapse.show {
+    display: block
+}
+
+tr.collapse.show {
+    display: table-row
+}
+
+tbody.collapse.show {
+    display: table-row-group
+}
+
+.collapsing {
+    position: relative;
+    height: 0;
+    overflow: hidden;
+    transition: height .35s ease
+}
+
+.dropdown,
+.dropup {
+    position: relative
+}
+
+.dropdown-toggle::after {
+    display: inline-block;
+    width: 0;
+    height: 0;
+    margin-left: .255em;
+    vertical-align: .255em;
+    content: "";
+    border-top: .3em solid;
+    border-right: .3em solid transparent;
+    border-bottom: 0;
+    border-left: .3em solid transparent
+}
+
+.dropdown-toggle:empty::after {
+    margin-left: 0
+}
+
+.dropdown-menu {
+    position: absolute;
+    top: 100%;
+    left: 0;
+    z-index: 1000;
+    display: none;
+    float: left;
+    min-width: 10rem;
+    padding: .5rem 0;
+    margin: .125rem 0 0;
+    font-size: 1rem;
+    color: #212529;
+    text-align: left;
+    list-style: none;
+    background-color: #fff;
+    background-clip: padding-box;
+    border: 1px solid rgba(0, 0, 0, .15);
+    border-radius: .25rem
+}
+
+.dropup .dropdown-menu {
+    margin-top: 0;
+    margin-bottom: .125rem
+}
+
+.dropup .dropdown-toggle::after {
+    display: inline-block;
+    width: 0;
+    height: 0;
+    margin-left: .255em;
+    vertical-align: .255em;
+    content: "";
+    border-top: 0;
+    border-right: .3em solid transparent;
+    border-bottom: .3em solid;
+    border-left: .3em solid transparent
+}
+
+.dropup .dropdown-toggle:empty::after {
+    margin-left: 0
+}
+
+.dropright .dropdown-menu {
+    margin-top: 0;
+    margin-left: .125rem
+}
+
+.dropright .dropdown-toggle::after {
+    display: inline-block;
+    width: 0;
+    height: 0;
+    margin-left: .255em;
+    vertical-align: .255em;
+    content: "";
+    border-top: .3em solid transparent;
+    border-bottom: .3em solid transparent;
+    border-left: .3em solid
+}
+
+.dropright .dropdown-toggle:empty::after {
+    margin-left: 0
+}
+
+.dropright .dropdown-toggle::after {
+    vertical-align: 0
+}
+
+.dropleft .dropdown-menu {
+    margin-top: 0;
+    margin-right: .125rem
+}
+
+.dropleft .dropdown-toggle::after {
+    display: inline-block;
+    width: 0;
+    height: 0;
+    margin-left: .255em;
+    vertical-align: .255em;
+    content: ""
+}
+
+.dropleft .dropdown-toggle::after {
+    display: none
+}
+
+.dropleft .dropdown-toggle::before {
+    display: inline-block;
+    width: 0;
+    height: 0;
+    margin-right: .255em;
+    vertical-align: .255em;
+    content: "";
+    border-top: .3em solid transparent;
+    border-right: .3em solid;
+    border-bottom: .3em solid transparent
+}
+
+.dropleft .dropdown-toggle:empty::after {
+    margin-left: 0
+}
+
+.dropleft .dropdown-toggle::before {
+    vertical-align: 0
+}
+
+.dropdown-divider {
+    height: 0;
+    margin: .5rem 0;
+    overflow: hidden;
+    border-top: 1px solid #e9ecef
+}
+
+.dropdown-item {
+    display: block;
+    width: 100%;
+    padding: .25rem 1.5rem;
+    clear: both;
+    font-weight: 400;
+    color: #212529;
+    text-align: inherit;
+    white-space: nowrap;
+    background-color: transparent;
+    border: 0
+}
+
+.dropdown-item:focus,
+.dropdown-item:hover {
+    color: #16181b;
+    text-decoration: none;
+    background-color: #f8f9fa
+}
+
+.dropdown-item.active,
+.dropdown-item:active {
+    color: #fff;
+    text-decoration: none;
+    background-color: #007bff
+}
+
+.dropdown-item.disabled,
+.dropdown-item:disabled {
+    color: #6c757d;
+    background-color: transparent
+}
+
+.dropdown-menu.show {
+    display: block
+}
+
+.dropdown-header {
+    display: block;
+    padding: .5rem 1.5rem;
+    margin-bottom: 0;
+    font-size: .875rem;
+    color: #6c757d;
+    white-space: nowrap
+}
+
+.btn-group,
+.btn-group-vertical {
+    position: relative;
+    display: -webkit-inline-box;
+    display: -ms-inline-flexbox;
+    display: inline-flex;
+    vertical-align: middle
+}
+
+.btn-group-vertical>.btn,
+.btn-group>.btn {
+    position: relative;
+    -webkit-box-flex: 0;
+    -ms-flex: 0 1 auto;
+    flex: 0 1 auto
+}
+
+.btn-group-vertical>.btn:hover,
+.btn-group>.btn:hover {
+    z-index: 1
+}
+
+.btn-group-vertical>.btn.active,
+.btn-group-vertical>.btn:active,
+.btn-group-vertical>.btn:focus,
+.btn-group>.btn.active,
+.btn-group>.btn:active,
+.btn-group>.btn:focus {
+    z-index: 1
+}
+
+.btn-group .btn+.btn,
+.btn-group .btn+.btn-group,
+.btn-group .btn-group+.btn,
+.btn-group .btn-group+.btn-group,
+.btn-group-vertical .btn+.btn,
+.btn-group-vertical .btn+.btn-group,
+.btn-group-vertical .btn-group+.btn,
+.btn-group-vertical .btn-group+.btn-group {
+    margin-left: -1px
+}
+
+.btn-toolbar {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-wrap: wrap;
+    flex-wrap: wrap;
+    -webkit-box-pack: start;
+    -ms-flex-pack: start;
+    justify-content: flex-start
+}
+
+.btn-toolbar .input-group {
+    width: auto
+}
+
+.btn-group>.btn:first-child {
+    margin-left: 0
+}
+
+.btn-group>.btn-group:not(:last-child)>.btn,
+.btn-group>.btn:not(:last-child):not(.dropdown-toggle) {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0
+}
+
+.btn-group>.btn-group:not(:first-child)>.btn,
+.btn-group>.btn:not(:first-child) {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0
+}
+
+.dropdown-toggle-split {
+    padding-right: .5625rem;
+    padding-left: .5625rem
+}
+
+.dropdown-toggle-split::after {
+    margin-left: 0
+}
+
+.btn-group-sm>.btn+.dropdown-toggle-split,
+.btn-sm+.dropdown-toggle-split {
+    padding-right: .375rem;
+    padding-left: .375rem
+}
+
+.btn-group-lg>.btn+.dropdown-toggle-split,
+.btn-lg+.dropdown-toggle-split {
+    padding-right: .75rem;
+    padding-left: .75rem
+}
+
+.btn-group-vertical {
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    -webkit-box-align: start;
+    -ms-flex-align: start;
+    align-items: flex-start;
+    -webkit-box-pack: center;
+    -ms-flex-pack: center;
+    justify-content: center
+}
+
+.btn-group-vertical .btn,
+.btn-group-vertical .btn-group {
+    width: 100%
+}
+
+.btn-group-vertical>.btn+.btn,
+.btn-group-vertical>.btn+.btn-group,
+.btn-group-vertical>.btn-group+.btn,
+.btn-group-vertical>.btn-group+.btn-group {
+    margin-top: -1px;
+    margin-left: 0
+}
+
+.btn-group-vertical>.btn-group:not(:last-child)>.btn,
+.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle) {
+    border-bottom-right-radius: 0;
+    border-bottom-left-radius: 0
+}
+
+.btn-group-vertical>.btn-group:not(:first-child)>.btn,
+.btn-group-vertical>.btn:not(:first-child) {
+    border-top-left-radius: 0;
+    border-top-right-radius: 0
+}
+
+.btn-group-toggle>.btn,
+.btn-group-toggle>.btn-group>.btn {
+    margin-bottom: 0
+}
+
+.btn-group-toggle>.btn input[type=checkbox],
+.btn-group-toggle>.btn input[type=radio],
+.btn-group-toggle>.btn-group>.btn input[type=checkbox],
+.btn-group-toggle>.btn-group>.btn input[type=radio] {
+    position: absolute;
+    clip: rect(0, 0, 0, 0);
+    pointer-events: none
+}
+
+.input-group {
+    position: relative;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-wrap: wrap;
+    flex-wrap: wrap;
+    -webkit-box-align: stretch;
+    -ms-flex-align: stretch;
+    align-items: stretch;
+    width: 100%
+}
+
+.input-group>.custom-file,
+.input-group>.custom-select,
+.input-group>.form-control {
+    position: relative;
+    -webkit-box-flex: 1;
+    -ms-flex: 1 1 auto;
+    flex: 1 1 auto;
+    width: 1%;
+    margin-bottom: 0
+}
+
+.input-group>.custom-file:focus,
+.input-group>.custom-select:focus,
+.input-group>.form-control:focus {
+    z-index: 3
+}
+
+.input-group>.custom-file+.custom-file,
+.input-group>.custom-file+.custom-select,
+.input-group>.custom-file+.form-control,
+.input-group>.custom-select+.custom-file,
+.input-group>.custom-select+.custom-select,
+.input-group>.custom-select+.form-control,
+.input-group>.form-control+.custom-file,
+.input-group>.form-control+.custom-select,
+.input-group>.form-control+.form-control {
+    margin-left: -1px
+}
+
+.input-group>.custom-select:not(:last-child),
+.input-group>.form-control:not(:last-child) {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0
+}
+
+.input-group>.custom-select:not(:first-child),
+.input-group>.form-control:not(:first-child) {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0
+}
+
+.input-group>.custom-file {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center
+}
+
+.input-group>.custom-file:not(:last-child) .custom-file-label,
+.input-group>.custom-file:not(:last-child) .custom-file-label::before {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0
+}
+
+.input-group>.custom-file:not(:first-child) .custom-file-label,
+.input-group>.custom-file:not(:first-child) .custom-file-label::before {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0
+}
+
+.input-group-append,
+.input-group-prepend {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex
+}
+
+.input-group-append .btn,
+.input-group-prepend .btn {
+    position: relative;
+    z-index: 2
+}
+
+.input-group-append .btn+.btn,
+.input-group-append .btn+.input-group-text,
+.input-group-append .input-group-text+.btn,
+.input-group-append .input-group-text+.input-group-text,
+.input-group-prepend .btn+.btn,
+.input-group-prepend .btn+.input-group-text,
+.input-group-prepend .input-group-text+.btn,
+.input-group-prepend .input-group-text+.input-group-text {
+    margin-left: -1px
+}
+
+.input-group-prepend {
+    margin-right: -1px
+}
+
+.input-group-append {
+    margin-left: -1px
+}
+
+.input-group-text {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+    padding: .375rem .75rem;
+    margin-bottom: 0;
+    font-size: 1rem;
+    font-weight: 400;
+    line-height: 1.5;
+    color: #495057;
+    text-align: center;
+    white-space: nowrap;
+    background-color: #e9ecef;
+    border: 1px solid #ced4da;
+    border-radius: .25rem
+}
+
+.input-group-text input[type=checkbox],
+.input-group-text input[type=radio] {
+    margin-top: 0
+}
+
+.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),
+.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),
+.input-group>.input-group-append:not(:last-child)>.btn,
+.input-group>.input-group-append:not(:last-child)>.input-group-text,
+.input-group>.input-group-prepend>.btn,
+.input-group>.input-group-prepend>.input-group-text {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0
+}
+
+.input-group>.input-group-append>.btn,
+.input-group>.input-group-append>.input-group-text,
+.input-group>.input-group-prepend:first-child>.btn:not(:first-child),
+.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),
+.input-group>.input-group-prepend:not(:first-child)>.btn,
+.input-group>.input-group-prepend:not(:first-child)>.input-group-text {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0
+}
+
+.custom-control {
+    position: relative;
+    display: block;
+    min-height: 1.5rem;
+    padding-left: 1.5rem
+}
+
+.custom-control-inline {
+    display: -webkit-inline-box;
+    display: -ms-inline-flexbox;
+    display: inline-flex;
+    margin-right: 1rem
+}
+
+.custom-control-input {
+    position: absolute;
+    z-index: -1;
+    opacity: 0
+}
+
+.custom-control-input:checked~.custom-control-label::before {
+    color: #fff;
+    background-color: #007bff
+}
+
+.custom-control-input:focus~.custom-control-label::before {
+    box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-control-input:active~.custom-control-label::before {
+    color: #fff;
+    background-color: #b3d7ff
+}
+
+.custom-control-input:disabled~.custom-control-label {
+    color: #6c757d
+}
+
+.custom-control-input:disabled~.custom-control-label::before {
+    background-color: #e9ecef
+}
+
+.custom-control-label {
+    margin-bottom: 0
+}
+
+.custom-control-label::before {
+    position: absolute;
+    top: .25rem;
+    left: 0;
+    display: block;
+    width: 1rem;
+    height: 1rem;
+    pointer-events: none;
+    content: "";
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    background-color: #dee2e6
+}
+
+.custom-control-label::after {
+    position: absolute;
+    top: .25rem;
+    left: 0;
+    display: block;
+    width: 1rem;
+    height: 1rem;
+    content: "";
+    background-repeat: no-repeat;
+    background-position: center center;
+    background-size: 50% 50%
+}
+
+.custom-checkbox .custom-control-label::before {
+    border-radius: .25rem
+}
+
+.custom-checkbox .custom-control-input:checked~.custom-control-label::before {
+    background-color: #007bff
+}
+
+.custom-checkbox .custom-control-input:checked~.custom-control-label::after {
+    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")
+}
+
+.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before {
+    background-color: #007bff
+}
+
+.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after {
+    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")
+}
+
+.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before {
+    background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before {
+    background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-radio .custom-control-label::before {
+    border-radius: 50%
+}
+
+.custom-radio .custom-control-input:checked~.custom-control-label::before {
+    background-color: #007bff
+}
+
+.custom-radio .custom-control-input:checked~.custom-control-label::after {
+    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")
+}
+
+.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before {
+    background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-select {
+    display: inline-block;
+    width: 100%;
+    height: calc(2.25rem + 2px);
+    padding: .375rem 1.75rem .375rem .75rem;
+    line-height: 1.5;
+    color: #495057;
+    vertical-align: middle;
+    background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;
+    background-size: 8px 10px;
+    border: 1px solid #ced4da;
+    border-radius: .25rem;
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    appearance: none
+}
+
+.custom-select:focus {
+    border-color: #80bdff;
+    outline: 0;
+    box-shadow: inset 0 1px 2px rgba(0, 0, 0, .075), 0 0 5px rgba(128, 189, 255, .5)
+}
+
+.custom-select:focus::-ms-value {
+    color: #495057;
+    background-color: #fff
+}
+
+.custom-select[multiple],
+.custom-select[size]:not([size="1"]) {
+    height: auto;
+    padding-right: .75rem;
+    background-image: none
+}
+
+.custom-select:disabled {
+    color: #6c757d;
+    background-color: #e9ecef
+}
+
+.custom-select::-ms-expand {
+    opacity: 0
+}
+
+.custom-select-sm {
+    height: calc(1.8125rem + 2px);
+    padding-top: .375rem;
+    padding-bottom: .375rem;
+    font-size: 75%
+}
+
+.custom-select-lg {
+    height: calc(2.875rem + 2px);
+    padding-top: .375rem;
+    padding-bottom: .375rem;
+    font-size: 125%
+}
+
+.custom-file {
+    position: relative;
+    display: inline-block;
+    width: 100%;
+    height: calc(2.25rem + 2px);
+    margin-bottom: 0
+}
+
+.custom-file-input {
+    position: relative;
+    z-index: 2;
+    width: 100%;
+    height: calc(2.25rem + 2px);
+    margin: 0;
+    opacity: 0
+}
+
+.custom-file-input:focus~.custom-file-control {
+    border-color: #80bdff;
+    box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-file-input:focus~.custom-file-control::before {
+    border-color: #80bdff
+}
+
+.custom-file-input:lang(en)~.custom-file-label::after {
+    content: "Browse"
+}
+
+.custom-file-label {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 0;
+    z-index: 1;
+    height: calc(2.25rem + 2px);
+    padding: .375rem .75rem;
+    line-height: 1.5;
+    color: #495057;
+    background-color: #fff;
+    border: 1px solid #ced4da;
+    border-radius: .25rem
+}
+
+.custom-file-label::after {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    z-index: 3;
+    display: block;
+    height: calc(calc(2.25rem + 2px) - 1px * 2);
+    padding: .375rem .75rem;
+    line-height: 1.5;
+    color: #495057;
+    content: "Browse";
+    background-color: #e9ecef;
+    border-left: 1px solid #ced4da;
+    border-radius: 0 .25rem .25rem 0
+}
+
+.nav {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-wrap: wrap;
+    flex-wrap: wrap;
+    padding-left: 0;
+    margin-bottom: 0;
+    list-style: none
+}
+
+.nav-link {
+    display: block;
+    padding: .5rem 1rem
+}
+
+.nav-link:focus,
+.nav-link:hover {
+    text-decoration: none
+}
+
+.nav-link.disabled {
+    color: #6c757d
+}
+
+.nav-tabs {
+    border-bottom: 1px solid #dee2e6
+}
+
+.nav-tabs .nav-item {
+    margin-bottom: -1px
+}
+
+.nav-tabs .nav-link {
+    border: 1px solid transparent;
+    border-top-left-radius: .25rem;
+    border-top-right-radius: .25rem
+}
+
+.nav-tabs .nav-link:focus,
+.nav-tabs .nav-link:hover {
+    border-color: #e9ecef #e9ecef #dee2e6
+}
+
+.nav-tabs .nav-link.disabled {
+    color: #6c757d;
+    background-color: transparent;
+    border-color: transparent
+}
+
+.nav-tabs .nav-item.show .nav-link,
+.nav-tabs .nav-link.active {
+    color: #495057;
+    background-color: #fff;
+    border-color: #dee2e6 #dee2e6 #fff
+}
+
+.nav-tabs .dropdown-menu {
+    margin-top: -1px;
+    border-top-left-radius: 0;
+    border-top-right-radius: 0
+}
+
+.nav-pills .nav-link {
+    border-radius: .25rem
+}
+
+.nav-pills .nav-link.active,
+.nav-pills .show>.nav-link {
+    color: #fff;
+    background-color: #007bff
+}
+
+.nav-fill .nav-item {
+    -webkit-box-flex: 1;
+    -ms-flex: 1 1 auto;
+    flex: 1 1 auto;
+    text-align: center
+}
+
+.nav-justified .nav-item {
+    -ms-flex-preferred-size: 0;
+    flex-basis: 0;
+    -webkit-box-flex: 1;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    text-align: center
+}
+
+.tab-content>.tab-pane {
+    display: none
+}
+
+.tab-content>.active {
+    display: block
+}
+
+.navbar {
+    position: relative;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-wrap: wrap;
+    flex-wrap: wrap;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+    -webkit-box-pack: justify;
+    -ms-flex-pack: justify;
+    justify-content: space-between;
+    padding: .5rem 1rem
+}
+
+.navbar>.container,
+.navbar>.container-fluid {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-wrap: wrap;
+    flex-wrap: wrap;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+    -webkit-box-pack: justify;
+    -ms-flex-pack: justify;
+    justify-content: space-between
+}
+
+.navbar-brand {
+    display: inline-block;
+    padding-top: .3125rem;
+    padding-bottom: .3125rem;
+    margin-right: 1rem;
+    font-size: 1.25rem;
+    line-height: inherit;
+    white-space: nowrap
+}
+
+.navbar-brand:focus,
+.navbar-brand:hover {
+    text-decoration: none
+}
+
+.navbar-nav {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    padding-left: 0;
+    margin-bottom: 0;
+    list-style: none
+}
+
+.navbar-nav .nav-link {
+    padding-right: 0;
+    padding-left: 0
+}
+
+.navbar-nav .dropdown-menu {
+    position: static;
+    float: none
+}
+
+.navbar-text {
+    display: inline-block;
+    padding-top: .5rem;
+    padding-bottom: .5rem
+}
+
+.navbar-collapse {
+    -ms-flex-preferred-size: 100%;
+    flex-basis: 100%;
+    -webkit-box-flex: 1;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center
+}
+
+.navbar-toggler {
+    padding: .25rem .75rem;
+    font-size: 1.25rem;
+    line-height: 1;
+    background-color: transparent;
+    border: 1px solid transparent;
+    border-radius: .25rem
+}
+
+.navbar-toggler:focus,
+.navbar-toggler:hover {
+    text-decoration: none
+}
+
+.navbar-toggler:not(:disabled):not(.disabled) {
+    cursor: pointer
+}
+
+.navbar-toggler-icon {
+    display: inline-block;
+    width: 1.5em;
+    height: 1.5em;
+    vertical-align: middle;
+    content: "";
+    background: no-repeat center center;
+    background-size: 100% 100%
+}
+
+@media (max-width:575.98px) {
+    .navbar-expand-sm>.container,
+    .navbar-expand-sm>.container-fluid {
+        padding-right: 0;
+        padding-left: 0
+    }
+}
+
+@media (min-width:576px) {
+    .navbar-expand-sm {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-flow: row nowrap;
+        flex-flow: row nowrap;
+        -webkit-box-pack: start;
+        -ms-flex-pack: start;
+        justify-content: flex-start
+    }
+    .navbar-expand-sm .navbar-nav {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-direction: row;
+        flex-direction: row
+    }
+    .navbar-expand-sm .navbar-nav .dropdown-menu {
+        position: absolute
+    }
+    .navbar-expand-sm .navbar-nav .dropdown-menu-right {
+        right: 0;
+        left: auto
+    }
+    .navbar-expand-sm .navbar-nav .nav-link {
+        padding-right: .5rem;
+        padding-left: .5rem
+    }
+    .navbar-expand-sm>.container,
+    .navbar-expand-sm>.container-fluid {
+        -ms-flex-wrap: nowrap;
+        flex-wrap: nowrap
+    }
+    .navbar-expand-sm .navbar-collapse {
+        display: -webkit-box !important;
+        display: -ms-flexbox !important;
+        display: flex !important;
+        -ms-flex-preferred-size: auto;
+        flex-basis: auto
+    }
+    .navbar-expand-sm .navbar-toggler {
+        display: none
+    }
+    .navbar-expand-sm .dropup .dropdown-menu {
+        top: auto;
+        bottom: 100%
+    }
+}
+
+@media (max-width:767.98px) {
+    .navbar-expand-md>.container,
+    .navbar-expand-md>.container-fluid {
+        padding-right: 0;
+        padding-left: 0
+    }
+}
+
+@media (min-width:768px) {
+    .navbar-expand-md {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-flow: row nowrap;
+        flex-flow: row nowrap;
+        -webkit-box-pack: start;
+        -ms-flex-pack: start;
+        justify-content: flex-start
+    }
+    .navbar-expand-md .navbar-nav {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-direction: row;
+        flex-direction: row
+    }
+    .navbar-expand-md .navbar-nav .dropdown-menu {
+        position: absolute
+    }
+    .navbar-expand-md .navbar-nav .dropdown-menu-right {
+        right: 0;
+        left: auto
+    }
+    .navbar-expand-md .navbar-nav .nav-link {
+        padding-right: .5rem;
+        padding-left: .5rem
+    }
+    .navbar-expand-md>.container,
+    .navbar-expand-md>.container-fluid {
+        -ms-flex-wrap: nowrap;
+        flex-wrap: nowrap
+    }
+    .navbar-expand-md .navbar-collapse {
+        display: -webkit-box !important;
+        display: -ms-flexbox !important;
+        display: flex !important;
+        -ms-flex-preferred-size: auto;
+        flex-basis: auto
+    }
+    .navbar-expand-md .navbar-toggler {
+        display: none
+    }
+    .navbar-expand-md .dropup .dropdown-menu {
+        top: auto;
+        bottom: 100%
+    }
+}
+
+@media (max-width:991.98px) {
+    .navbar-expand-lg>.container,
+    .navbar-expand-lg>.container-fluid {
+        padding-right: 0;
+        padding-left: 0
+    }
+}
+
+@media (min-width:992px) {
+    .navbar-expand-lg {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-flow: row nowrap;
+        flex-flow: row nowrap;
+        -webkit-box-pack: start;
+        -ms-flex-pack: start;
+        justify-content: flex-start
+    }
+    .navbar-expand-lg .navbar-nav {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-direction: row;
+        flex-direction: row
+    }
+    .navbar-expand-lg .navbar-nav .dropdown-menu {
+        position: absolute
+    }
+    .navbar-expand-lg .navbar-nav .dropdown-menu-right {
+        right: 0;
+        left: auto
+    }
+    .navbar-expand-lg .navbar-nav .nav-link {
+        padding-right: .5rem;
+        padding-left: .5rem
+    }
+    .navbar-expand-lg>.container,
+    .navbar-expand-lg>.container-fluid {
+        -ms-flex-wrap: nowrap;
+        flex-wrap: nowrap
+    }
+    .navbar-expand-lg .navbar-collapse {
+        display: -webkit-box !important;
+        display: -ms-flexbox !important;
+        display: flex !important;
+        -ms-flex-preferred-size: auto;
+        flex-basis: auto
+    }
+    .navbar-expand-lg .navbar-toggler {
+        display: none
+    }
+    .navbar-expand-lg .dropup .dropdown-menu {
+        top: auto;
+        bottom: 100%
+    }
+}
+
+@media (max-width:1199.98px) {
+    .navbar-expand-xl>.container,
+    .navbar-expand-xl>.container-fluid {
+        padding-right: 0;
+        padding-left: 0
+    }
+}
+
+@media (min-width:1200px) {
+    .navbar-expand-xl {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-flow: row nowrap;
+        flex-flow: row nowrap;
+        -webkit-box-pack: start;
+        -ms-flex-pack: start;
+        justify-content: flex-start
+    }
+    .navbar-expand-xl .navbar-nav {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-direction: row;
+        flex-direction: row
+    }
+    .navbar-expand-xl .navbar-nav .dropdown-menu {
+        position: absolute
+    }
+    .navbar-expand-xl .navbar-nav .dropdown-menu-right {
+        right: 0;
+        left: auto
+    }
+    .navbar-expand-xl .navbar-nav .nav-link {
+        padding-right: .5rem;
+        padding-left: .5rem
+    }
+    .navbar-expand-xl>.container,
+    .navbar-expand-xl>.container-fluid {
+        -ms-flex-wrap: nowrap;
+        flex-wrap: nowrap
+    }
+    .navbar-expand-xl .navbar-collapse {
+        display: -webkit-box !important;
+        display: -ms-flexbox !important;
+        display: flex !important;
+        -ms-flex-preferred-size: auto;
+        flex-basis: auto
+    }
+    .navbar-expand-xl .navbar-toggler {
+        display: none
+    }
+    .navbar-expand-xl .dropup .dropdown-menu {
+        top: auto;
+        bottom: 100%
+    }
+}
+
+.navbar-expand {
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+    -ms-flex-flow: row nowrap;
+    flex-flow: row nowrap;
+    -webkit-box-pack: start;
+    -ms-flex-pack: start;
+    justify-content: flex-start
+}
+
+.navbar-expand>.container,
+.navbar-expand>.container-fluid {
+    padding-right: 0;
+    padding-left: 0
+}
+
+.navbar-expand .navbar-nav {
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: row;
+    flex-direction: row
+}
+
+.navbar-expand .navbar-nav .dropdown-menu {
+    position: absolute
+}
+
+.navbar-expand .navbar-nav .dropdown-menu-right {
+    right: 0;
+    left: auto
+}
+
+.navbar-expand .navbar-nav .nav-link {
+    padding-right: .5rem;
+    padding-left: .5rem
+}
+
+.navbar-expand>.container,
+.navbar-expand>.container-fluid {
+    -ms-flex-wrap: nowrap;
+    flex-wrap: nowrap
+}
+
+.navbar-expand .navbar-collapse {
+    display: -webkit-box !important;
+    display: -ms-flexbox !important;
+    display: flex !important;
+    -ms-flex-preferred-size: auto;
+    flex-basis: auto
+}
+
+.navbar-expand .navbar-toggler {
+    display: none
+}
+
+.navbar-expand .dropup .dropdown-menu {
+    top: auto;
+    bottom: 100%
+}
+
+.navbar-light .navbar-brand {
+    color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-brand:focus,
+.navbar-light .navbar-brand:hover {
+    color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-nav .nav-link {
+    color: rgba(0, 0, 0, .5)
+}
+
+.navbar-light .navbar-nav .nav-link:focus,
+.navbar-light .navbar-nav .nav-link:hover {
+    color: rgba(0, 0, 0, .7)
+}
+
+.navbar-light .navbar-nav .nav-link.disabled {
+    color: rgba(0, 0, 0, .3)
+}
+
+.navbar-light .navbar-nav .active>.nav-link,
+.navbar-light .navbar-nav .nav-link.active,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .show>.nav-link {
+    color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-toggler {
+    color: rgba(0, 0, 0, .5);
+    border-color: rgba(0, 0, 0, .1)
+}
+
+.navbar-light .navbar-toggler-icon {
+    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")
+}
+
+.navbar-light .navbar-text {
+    color: rgba(0, 0, 0, .5)
+}
+
+.navbar-light .navbar-text a {
+    color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-text a:focus,
+.navbar-light .navbar-text a:hover {
+    color: rgba(0, 0, 0, .9)
+}
+
+.navbar-dark .navbar-brand {
+    color: #fff
+}
+
+.navbar-dark .navbar-brand:focus,
+.navbar-dark .navbar-brand:hover {
+    color: #fff
+}
+
+.navbar-dark .navbar-nav .nav-link {
+    color: rgba(255, 255, 255, .5)
+}
+
+.navbar-dark .navbar-nav .nav-link:focus,
+.navbar-dark .navbar-nav .nav-link:hover {
+    color: rgba(255, 255, 255, .75)
+}
+
+.navbar-dark .navbar-nav .nav-link.disabled {
+    color: rgba(255, 255, 255, .25)
+}
+
+.navbar-dark .navbar-nav .active>.nav-link,
+.navbar-dark .navbar-nav .nav-link.active,
+.navbar-dark .navbar-nav .nav-link.show,
+.navbar-dark .navbar-nav .show>.nav-link {
+    color: #fff
+}
+
+.navbar-dark .navbar-toggler {
+    color: rgba(255, 255, 255, .5);
+    border-color: rgba(255, 255, 255, .1)
+}
+
+.navbar-dark .navbar-toggler-icon {
+    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")
+}
+
+.navbar-dark .navbar-text {
+    color: rgba(255, 255, 255, .5)
+}
+
+.navbar-dark .navbar-text a {
+    color: #fff
+}
+
+.navbar-dark .navbar-text a:focus,
+.navbar-dark .navbar-text a:hover {
+    color: #fff
+}
+
+.card {
+    position: relative;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    min-width: 0;
+    word-wrap: break-word;
+    background-color: #fff;
+    background-clip: border-box;
+    border: 1px solid rgba(0, 0, 0, .125);
+    border-radius: .25rem
+}
+
+.card>hr {
+    margin-right: 0;
+    margin-left: 0
+}
+
+.card>.list-group:first-child .list-group-item:first-child {
+    border-top-left-radius: .25rem;
+    border-top-right-radius: .25rem
+}
+
+.card>.list-group:last-child .list-group-item:last-child {
+    border-bottom-right-radius: .25rem;
+    border-bottom-left-radius: .25rem
+}
+
+.card-body {
+    -webkit-box-flex: 1;
+    -ms-flex: 1 1 auto;
+    flex: 1 1 auto;
+    padding: 1.25rem
+}
+
+.card-title {
+    margin-bottom: .75rem
+}
+
+.card-subtitle {
+    margin-top: -.375rem;
+    margin-bottom: 0
+}
+
+.card-text:last-child {
+    margin-bottom: 0
+}
+
+.card-link:hover {
+    text-decoration: none
+}
+
+.card-link+.card-link {
+    margin-left: 1.25rem
+}
+
+.card-header {
+    padding: .75rem 1.25rem;
+    margin-bottom: 0;
+    background-color: rgba(0, 0, 0, .03);
+    border-bottom: 1px solid rgba(0, 0, 0, .125)
+}
+
+.card-header:first-child {
+    border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0
+}
+
+.card-header+.list-group .list-group-item:first-child {
+    border-top: 0
+}
+
+.card-footer {
+    padding: .75rem 1.25rem;
+    background-color: rgba(0, 0, 0, .03);
+    border-top: 1px solid rgba(0, 0, 0, .125)
+}
+
+.card-footer:last-child {
+    border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px)
+}
+
+.card-header-tabs {
+    margin-right: -.625rem;
+    margin-bottom: -.75rem;
+    margin-left: -.625rem;
+    border-bottom: 0
+}
+
+.card-header-pills {
+    margin-right: -.625rem;
+    margin-left: -.625rem
+}
+
+.card-img-overlay {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    padding: 1.25rem
+}
+
+.card-img {
+    width: 100%;
+    border-radius: calc(.25rem - 1px)
+}
+
+.card-img-top {
+    width: 100%;
+    border-top-left-radius: calc(.25rem - 1px);
+    border-top-right-radius: calc(.25rem - 1px)
+}
+
+.card-img-bottom {
+    width: 100%;
+    border-bottom-right-radius: calc(.25rem - 1px);
+    border-bottom-left-radius: calc(.25rem - 1px)
+}
+
+.card-deck {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column
+}
+
+.card-deck .card {
+    margin-bottom: 15px
+}
+
+@media (min-width:576px) {
+    .card-deck {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-flow: row wrap;
+        flex-flow: row wrap;
+        margin-right: -15px;
+        margin-left: -15px
+    }
+    .card-deck .card {
+        display: -webkit-box;
+        display: -ms-flexbox;
+        display: flex;
+        -webkit-box-flex: 1;
+        -ms-flex: 1 0 0%;
+        flex: 1 0 0%;
+        -webkit-box-orient: vertical;
+        -webkit-box-direction: normal;
+        -ms-flex-direction: column;
+        flex-direction: column;
+        margin-right: 15px;
+        margin-bottom: 0;
+        margin-left: 15px
+    }
+}
+
+.card-group {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column
+}
+
+.card-group>.card {
+    margin-bottom: 15px
+}
+
+@media (min-width:576px) {
+    .card-group {
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-flow: row wrap;
+        flex-flow: row wrap
+    }
+    .card-group>.card {
+        -webkit-box-flex: 1;
+        -ms-flex: 1 0 0%;
+        flex: 1 0 0%;
+        margin-bottom: 0
+    }
+    .card-group>.card+.card {
+        margin-left: 0;
+        border-left: 0
+    }
+    .card-group>.card:first-child {
+        border-top-right-radius: 0;
+        border-bottom-right-radius: 0
+    }
+    .card-group>.card:first-child .card-header,
+    .card-group>.card:first-child .card-img-top {
+        border-top-right-radius: 0
+    }
+    .card-group>.card:first-child .card-footer,
+    .card-group>.card:first-child .card-img-bottom {
+        border-bottom-right-radius: 0
+    }
+    .card-group>.card:last-child {
+        border-top-left-radius: 0;
+        border-bottom-left-radius: 0
+    }
+    .card-group>.card:last-child .card-header,
+    .card-group>.card:last-child .card-img-top {
+        border-top-left-radius: 0
+    }
+    .card-group>.card:last-child .card-footer,
+    .card-group>.card:last-child .card-img-bottom {
+        border-bottom-left-radius: 0
+    }
+    .card-group>.card:only-child {
+        border-radius: .25rem
+    }
+    .card-group>.card:only-child .card-header,
+    .card-group>.card:only-child .card-img-top {
+        border-top-left-radius: .25rem;
+        border-top-right-radius: .25rem
+    }
+    .card-group>.card:only-child .card-footer,
+    .card-group>.card:only-child .card-img-bottom {
+        border-bottom-right-radius: .25rem;
+        border-bottom-left-radius: .25rem
+    }
+    .card-group>.card:not(:first-child):not(:last-child):not(:only-child) {
+        border-radius: 0
+    }
+    .card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,
+    .card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,
+    .card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,
+    .card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top {
+        border-radius: 0
+    }
+}
+
+.card-columns .card {
+    margin-bottom: .75rem
+}
+
+@media (min-width:576px) {
+    .card-columns {
+        -webkit-column-count: 3;
+        -moz-column-count: 3;
+        column-count: 3;
+        -webkit-column-gap: 1.25rem;
+        -moz-column-gap: 1.25rem;
+        column-gap: 1.25rem
+    }
+    .card-columns .card {
+        display: inline-block;
+        width: 100%
+    }
+}
+
+.breadcrumb {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-wrap: wrap;
+    flex-wrap: wrap;
+    padding: .75rem 1rem;
+    margin-bottom: 1rem;
+    list-style: none;
+    background-color: #e9ecef;
+    border-radius: .25rem
+}
+
+.breadcrumb-item+.breadcrumb-item::before {
+    display: inline-block;
+    padding-right: .5rem;
+    padding-left: .5rem;
+    color: #6c757d;
+    content: "/"
+}
+
+.breadcrumb-item+.breadcrumb-item:hover::before {
+    text-decoration: underline
+}
+
+.breadcrumb-item+.breadcrumb-item:hover::before {
+    text-decoration: none
+}
+
+.breadcrumb-item.active {
+    color: #6c757d
+}
+
+.pagination {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    padding-left: 0;
+    list-style: none;
+    border-radius: .25rem
+}
+
+.page-link {
+    position: relative;
+    display: block;
+    padding: .5rem .75rem;
+    margin-left: -1px;
+    line-height: 1.25;
+    color: #007bff;
+    background-color: #fff;
+    border: 1px solid #dee2e6
+}
+
+.page-link:hover {
+    color: #0056b3;
+    text-decoration: none;
+    background-color: #e9ecef;
+    border-color: #dee2e6
+}
+
+.page-link:focus {
+    z-index: 2;
+    outline: 0;
+    box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.page-link:not(:disabled):not(.disabled) {
+    cursor: pointer
+}
+
+.page-item:first-child .page-link {
+    margin-left: 0;
+    border-top-left-radius: .25rem;
+    border-bottom-left-radius: .25rem
+}
+
+.page-item:last-child .page-link {
+    border-top-right-radius: .25rem;
+    border-bottom-right-radius: .25rem
+}
+
+.page-item.active .page-link {
+    z-index: 1;
+    color: #fff;
+    background-color: #007bff;
+    border-color: #007bff
+}
+
+.page-item.disabled .page-link {
+    color: #6c757d;
+    pointer-events: none;
+    cursor: auto;
+    background-color: #fff;
+    border-color: #dee2e6
+}
+
+.pagination-lg .page-link {
+    padding: .75rem 1.5rem;
+    font-size: 1.25rem;
+    line-height: 1.5
+}
+
+.pagination-lg .page-item:first-child .page-link {
+    border-top-left-radius: .3rem;
+    border-bottom-left-radius: .3rem
+}
+
+.pagination-lg .page-item:last-child .page-link {
+    border-top-right-radius: .3rem;
+    border-bottom-right-radius: .3rem
+}
+
+.pagination-sm .page-link {
+    padding: .25rem .5rem;
+    font-size: .875rem;
+    line-height: 1.5
+}
+
+.pagination-sm .page-item:first-child .page-link {
+    border-top-left-radius: .2rem;
+    border-bottom-left-radius: .2rem
+}
+
+.pagination-sm .page-item:last-child .page-link {
+    border-top-right-radius: .2rem;
+    border-bottom-right-radius: .2rem
+}
+
+.badge {
+    display: inline-block;
+    padding: .25em .4em;
+    font-size: 75%;
+    font-weight: 700;
+    line-height: 1;
+    text-align: center;
+    white-space: nowrap;
+    vertical-align: baseline;
+    border-radius: .25rem
+}
+
+.badge:empty {
+    display: none
+}
+
+.btn .badge {
+    position: relative;
+    top: -1px
+}
+
+.badge-pill {
+    padding-right: .6em;
+    padding-left: .6em;
+    border-radius: 10rem
+}
+
+.badge-primary {
+    color: #fff;
+    background-color: #007bff
+}
+
+.badge-primary[href]:focus,
+.badge-primary[href]:hover {
+    color: #fff;
+    text-decoration: none;
+    background-color: #0062cc
+}
+
+.badge-secondary {
+    color: #fff;
+    background-color: #6c757d
+}
+
+.badge-secondary[href]:focus,
+.badge-secondary[href]:hover {
+    color: #fff;
+    text-decoration: none;
+    background-color: #545b62
+}
+
+.badge-success {
+    color: #fff;
+    background-color: #28a745
+}
+
+.badge-success[href]:focus,
+.badge-success[href]:hover {
+    color: #fff;
+    text-decoration: none;
+    background-color: #1e7e34
+}
+
+.badge-info {
+    color: #fff;
+    background-color: #17a2b8
+}
+
+.badge-info[href]:focus,
+.badge-info[href]:hover {
+    color: #fff;
+    text-decoration: none;
+    background-color: #117a8b
+}
+
+.badge-warning {
+    color: #212529;
+    background-color: #ffc107
+}
+
+.badge-warning[href]:focus,
+.badge-warning[href]:hover {
+    color: #212529;
+    text-decoration: none;
+    background-color: #d39e00
+}
+
+.badge-danger {
+    color: #fff;
+    background-color: #dc3545
+}
+
+.badge-danger[href]:focus,
+.badge-danger[href]:hover {
+    color: #fff;
+    text-decoration: none;
+    background-color: #bd2130
+}
+
+.badge-light {
+    color: #212529;
+    background-color: #f8f9fa
+}
+
+.badge-light[href]:focus,
+.badge-light[href]:hover {
+    color: #212529;
+    text-decoration: none;
+    background-color: #dae0e5
+}
+
+.badge-dark {
+    color: #fff;
+    background-color: #343a40
+}
+
+.badge-dark[href]:focus,
+.badge-dark[href]:hover {
+    color: #fff;
+    text-decoration: none;
+    background-color: #1d2124
+}
+
+.jumbotron {
+    padding: 2rem 1rem;
+    margin-bottom: 2rem;
+    background-color: #e9ecef;
+    border-radius: .3rem
+}
+
+@media (min-width:576px) {
+    .jumbotron {
+        padding: 4rem 2rem
+    }
+}
+
+.jumbotron-fluid {
+    padding-right: 0;
+    padding-left: 0;
+    border-radius: 0
+}
+
+.alert {
+    position: relative;
+    padding: .75rem 1.25rem;
+    margin-bottom: 1rem;
+    border: 1px solid transparent;
+    border-radius: .25rem
+}
+
+.alert-heading {
+    color: inherit
+}
+
+.alert-link {
+    font-weight: 700
+}
+
+.alert-dismissible {
+    padding-right: 4rem
+}
+
+.alert-dismissible .close {
+    position: absolute;
+    top: 0;
+    right: 0;
+    padding: .75rem 1.25rem;
+    color: inherit
+}
+
+.alert-primary {
+    color: #004085;
+    background-color: #cce5ff;
+    border-color: #b8daff
+}
+
+.alert-primary hr {
+    border-top-color: #9fcdff
+}
+
+.alert-primary .alert-link {
+    color: #002752
+}
+
+.alert-secondary {
+    color: #383d41;
+    background-color: #e2e3e5;
+    border-color: #d6d8db
+}
+
+.alert-secondary hr {
+    border-top-color: #c8cbcf
+}
+
+.alert-secondary .alert-link {
+    color: #202326
+}
+
+.alert-success {
+    color: #155724;
+    background-color: #d4edda;
+    border-color: #c3e6cb
+}
+
+.alert-success hr {
+    border-top-color: #b1dfbb
+}
+
+.alert-success .alert-link {
+    color: #0b2e13
+}
+
+.alert-info {
+    color: #0c5460;
+    background-color: #d1ecf1;
+    border-color: #bee5eb
+}
+
+.alert-info hr {
+    border-top-color: #abdde5
+}
+
+.alert-info .alert-link {
+    color: #062c33
+}
+
+.alert-warning {
+    color: #856404;
+    background-color: #fff3cd;
+    border-color: #ffeeba
+}
+
+.alert-warning hr {
+    border-top-color: #ffe8a1
+}
+
+.alert-warning .alert-link {
+    color: #533f03
+}
+
+.alert-danger {
+    color: #721c24;
+    background-color: #f8d7da;
+    border-color: #f5c6cb
+}
+
+.alert-danger hr {
+    border-top-color: #f1b0b7
+}
+
+.alert-danger .alert-link {
+    color: #491217
+}
+
+.alert-light {
+    color: #818182;
+    background-color: #fefefe;
+    border-color: #fdfdfe
+}
+
+.alert-light hr {
+    border-top-color: #ececf6
+}
+
+.alert-light .alert-link {
+    color: #686868
+}
+
+.alert-dark {
+    color: #1b1e21;
+    background-color: #d6d8d9;
+    border-color: #c6c8ca
+}
+
+.alert-dark hr {
+    border-top-color: #b9bbbe
+}
+
+.alert-dark .alert-link {
+    color: #040505
+}
+
+@-webkit-keyframes progress-bar-stripes {
+    from {
+        background-position: 1rem 0
+    }
+    to {
+        background-position: 0 0
+    }
+}
+
+@keyframes progress-bar-stripes {
+    from {
+        background-position: 1rem 0
+    }
+    to {
+        background-position: 0 0
+    }
+}
+
+.progress {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    height: 1rem;
+    overflow: hidden;
+    font-size: .75rem;
+    background-color: #e9ecef;
+    border-radius: .25rem
+}
+
+.progress-bar {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    -webkit-box-pack: center;
+    -ms-flex-pack: center;
+    justify-content: center;
+    color: #fff;
+    text-align: center;
+    background-color: #007bff;
+    transition: width .6s ease
+}
+
+.progress-bar-striped {
+    background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+    background-size: 1rem 1rem
+}
+
+.progress-bar-animated {
+    -webkit-animation: progress-bar-stripes 1s linear infinite;
+    animation: progress-bar-stripes 1s linear infinite
+}
+
+.media {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: start;
+    -ms-flex-align: start;
+    align-items: flex-start
+}
+
+.media-body {
+    -webkit-box-flex: 1;
+    -ms-flex: 1;
+    flex: 1
+}
+
+.list-group {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    padding-left: 0;
+    margin-bottom: 0
+}
+
+.list-group-item-action {
+    width: 100%;
+    color: #495057;
+    text-align: inherit
+}
+
+.list-group-item-action:focus,
+.list-group-item-action:hover {
+    color: #495057;
+    text-decoration: none;
+    background-color: #f8f9fa
+}
+
+.list-group-item-action:active {
+    color: #212529;
+    background-color: #e9ecef
+}
+
+.list-group-item {
+    position: relative;
+    display: block;
+    padding: .75rem 1.25rem;
+    margin-bottom: -1px;
+    background-color: #fff;
+    border: 1px solid rgba(0, 0, 0, .125)
+}
+
+.list-group-item:first-child {
+    border-top-left-radius: .25rem;
+    border-top-right-radius: .25rem
+}
+
+.list-group-item:last-child {
+    margin-bottom: 0;
+    border-bottom-right-radius: .25rem;
+    border-bottom-left-radius: .25rem
+}
+
+.list-group-item:focus,
+.list-group-item:hover {
+    z-index: 1;
+    text-decoration: none
+}
+
+.list-group-item.disabled,
+.list-group-item:disabled {
+    color: #6c757d;
+    background-color: #fff
+}
+
+.list-group-item.active {
+    z-index: 2;
+    color: #fff;
+    background-color: #007bff;
+    border-color: #007bff
+}
+
+.list-group-flush .list-group-item {
+    border-right: 0;
+    border-left: 0;
+    border-radius: 0
+}
+
+.list-group-flush:first-child .list-group-item:first-child {
+    border-top: 0
+}
+
+.list-group-flush:last-child .list-group-item:last-child {
+    border-bottom: 0
+}
+
+.list-group-item-primary {
+    color: #004085;
+    background-color: #b8daff
+}
+
+.list-group-item-primary.list-group-item-action:focus,
+.list-group-item-primary.list-group-item-action:hover {
+    color: #004085;
+    background-color: #9fcdff
+}
+
+.list-group-item-primary.list-group-item-action.active {
+    color: #fff;
+    background-color: #004085;
+    border-color: #004085
+}
+
+.list-group-item-secondary {
+    color: #383d41;
+    background-color: #d6d8db
+}
+
+.list-group-item-secondary.list-group-item-action:focus,
+.list-group-item-secondary.list-group-item-action:hover {
+    color: #383d41;
+    background-color: #c8cbcf
+}
+
+.list-group-item-secondary.list-group-item-action.active {
+    color: #fff;
+    background-color: #383d41;
+    border-color: #383d41
+}
+
+.list-group-item-success {
+    color: #155724;
+    background-color: #c3e6cb
+}
+
+.list-group-item-success.list-group-item-action:focus,
+.list-group-item-success.list-group-item-action:hover {
+    color: #155724;
+    background-color: #b1dfbb
+}
+
+.list-group-item-success.list-group-item-action.active {
+    color: #fff;
+    background-color: #155724;
+    border-color: #155724
+}
+
+.list-group-item-info {
+    color: #0c5460;
+    background-color: #bee5eb
+}
+
+.list-group-item-info.list-group-item-action:focus,
+.list-group-item-info.list-group-item-action:hover {
+    color: #0c5460;
+    background-color: #abdde5
+}
+
+.list-group-item-info.list-group-item-action.active {
+    color: #fff;
+    background-color: #0c5460;
+    border-color: #0c5460
+}
+
+.list-group-item-warning {
+    color: #856404;
+    background-color: #ffeeba
+}
+
+.list-group-item-warning.list-group-item-action:focus,
+.list-group-item-warning.list-group-item-action:hover {
+    color: #856404;
+    background-color: #ffe8a1
+}
+
+.list-group-item-warning.list-group-item-action.active {
+    color: #fff;
+    background-color: #856404;
+    border-color: #856404
+}
+
+.list-group-item-danger {
+    color: #721c24;
+    background-color: #f5c6cb
+}
+
+.list-group-item-danger.list-group-item-action:focus,
+.list-group-item-danger.list-group-item-action:hover {
+    color: #721c24;
+    background-color: #f1b0b7
+}
+
+.list-group-item-danger.list-group-item-action.active {
+    color: #fff;
+    background-color: #721c24;
+    border-color: #721c24
+}
+
+.list-group-item-light {
+    color: #818182;
+    background-color: #fdfdfe
+}
+
+.list-group-item-light.list-group-item-action:focus,
+.list-group-item-light.list-group-item-action:hover {
+    color: #818182;
+    background-color: #ececf6
+}
+
+.list-group-item-light.list-group-item-action.active {
+    color: #fff;
+    background-color: #818182;
+    border-color: #818182
+}
+
+.list-group-item-dark {
+    color: #1b1e21;
+    background-color: #c6c8ca
+}
+
+.list-group-item-dark.list-group-item-action:focus,
+.list-group-item-dark.list-group-item-action:hover {
+    color: #1b1e21;
+    background-color: #b9bbbe
+}
+
+.list-group-item-dark.list-group-item-action.active {
+    color: #fff;
+    background-color: #1b1e21;
+    border-color: #1b1e21
+}
+
+.close {
+    float: right;
+    font-size: 1.5rem;
+    font-weight: 700;
+    line-height: 1;
+    color: #000;
+    text-shadow: 0 1px 0 #fff;
+    opacity: .5
+}
+
+.close:focus,
+.close:hover {
+    color: #000;
+    text-decoration: none;
+    opacity: .75
+}
+
+.close:not(:disabled):not(.disabled) {
+    cursor: pointer
+}
+
+button.close {
+    padding: 0;
+    background-color: transparent;
+    border: 0;
+    -webkit-appearance: none
+}
+
+.modal-open {
+    overflow: hidden
+}
+
+.modal {
+    position: fixed;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1050;
+    display: none;
+    overflow: hidden;
+    outline: 0
+}
+
+.modal-open .modal {
+    overflow-x: hidden;
+    overflow-y: auto
+}
+
+.modal-dialog {
+    position: relative;
+    width: auto;
+    margin: .5rem;
+    pointer-events: none
+}
+
+.modal.fade .modal-dialog {
+    transition: -webkit-transform .3s ease-out;
+    transition: transform .3s ease-out;
+    transition: transform .3s ease-out, -webkit-transform .3s ease-out;
+    -webkit-transform: translate(0, -25%);
+    transform: translate(0, -25%)
+}
+
+.modal.show .modal-dialog {
+    -webkit-transform: translate(0, 0);
+    transform: translate(0, 0)
+}
+
+.modal-dialog-centered {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+    min-height: calc(100% - (.5rem * 2))
+}
+
+.modal-content {
+    position: relative;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    width: 100%;
+    pointer-events: auto;
+    background-color: #fff;
+    background-clip: padding-box;
+    border: 1px solid rgba(0, 0, 0, .2);
+    border-radius: .3rem;
+    outline: 0
+}
+
+.modal-backdrop {
+    position: fixed;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1040;
+    background-color: #000
+}
+
+.modal-backdrop.fade {
+    opacity: 0
+}
+
+.modal-backdrop.show {
+    opacity: .5
+}
+
+.modal-header {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: start;
+    -ms-flex-align: start;
+    align-items: flex-start;
+    -webkit-box-pack: justify;
+    -ms-flex-pack: justify;
+    justify-content: space-between;
+    padding: 1rem;
+    border-bottom: 1px solid #e9ecef;
+    border-top-left-radius: .3rem;
+    border-top-right-radius: .3rem
+}
+
+.modal-header .close {
+    padding: 1rem;
+    margin: -1rem -1rem -1rem auto
+}
+
+.modal-title {
+    margin-bottom: 0;
+    line-height: 1.5
+}
+
+.modal-body {
+    position: relative;
+    -webkit-box-flex: 1;
+    -ms-flex: 1 1 auto;
+    flex: 1 1 auto;
+    padding: 1rem
+}
+
+.modal-footer {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+    -webkit-box-pack: end;
+    -ms-flex-pack: end;
+    justify-content: flex-end;
+    padding: 1rem;
+    border-top: 1px solid #e9ecef
+}
+
+.modal-footer>:not(:first-child) {
+    margin-left: .25rem
+}
+
+.modal-footer>:not(:last-child) {
+    margin-right: .25rem
+}
+
+.modal-scrollbar-measure {
+    position: absolute;
+    top: -9999px;
+    width: 50px;
+    height: 50px;
+    overflow: scroll
+}
+
+@media (min-width:576px) {
+    .modal-dialog {
+        max-width: 500px;
+        margin: 1.75rem auto
+    }
+    .modal-dialog-centered {
+        min-height: calc(100% - (1.75rem * 2))
+    }
+    .modal-sm {
+        max-width: 300px
+    }
+}
+
+@media (min-width:992px) {
+    .modal-lg {
+        max-width: 800px
+    }
+}
+
+.tooltip {
+    position: absolute;
+    z-index: 1070;
+    display: block;
+    margin: 0;
+    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+    font-style: normal;
+    font-weight: 400;
+    line-height: 1.5;
+    text-align: left;
+    text-align: start;
+    text-decoration: none;
+    text-shadow: none;
+    text-transform: none;
+    letter-spacing: normal;
+    word-break: normal;
+    word-spacing: normal;
+    white-space: normal;
+    line-break: auto;
+    font-size: .875rem;
+    word-wrap: break-word;
+    opacity: 0
+}
+
+.tooltip.show {
+    opacity: .9
+}
+
+.tooltip .arrow {
+    position: absolute;
+    display: block;
+    width: .8rem;
+    height: .4rem
+}
+
+.tooltip .arrow::before {
+    position: absolute;
+    content: "";
+    border-color: transparent;
+    border-style: solid
+}
+
+.bs-tooltip-auto[x-placement^=top],
+.bs-tooltip-top {
+    padding: .4rem 0
+}
+
+.bs-tooltip-auto[x-placement^=top] .arrow,
+.bs-tooltip-top .arrow {
+    bottom: 0
+}
+
+.bs-tooltip-auto[x-placement^=top] .arrow::before,
+.bs-tooltip-top .arrow::before {
+    top: 0;
+    border-width: .4rem .4rem 0;
+    border-top-color: #000
+}
+
+.bs-tooltip-auto[x-placement^=right],
+.bs-tooltip-right {
+    padding: 0 .4rem
+}
+
+.bs-tooltip-auto[x-placement^=right] .arrow,
+.bs-tooltip-right .arrow {
+    left: 0;
+    width: .4rem;
+    height: .8rem
+}
+
+.bs-tooltip-auto[x-placement^=right] .arrow::before,
+.bs-tooltip-right .arrow::before {
+    right: 0;
+    border-width: .4rem .4rem .4rem 0;
+    border-right-color: #000
+}
+
+.bs-tooltip-auto[x-placement^=bottom],
+.bs-tooltip-bottom {
+    padding: .4rem 0
+}
+
+.bs-tooltip-auto[x-placement^=bottom] .arrow,
+.bs-tooltip-bottom .arrow {
+    top: 0
+}
+
+.bs-tooltip-auto[x-placement^=bottom] .arrow::before,
+.bs-tooltip-bottom .arrow::before {
+    bottom: 0;
+    border-width: 0 .4rem .4rem;
+    border-bottom-color: #000
+}
+
+.bs-tooltip-auto[x-placement^=left],
+.bs-tooltip-left {
+    padding: 0 .4rem
+}
+
+.bs-tooltip-auto[x-placement^=left] .arrow,
+.bs-tooltip-left .arrow {
+    right: 0;
+    width: .4rem;
+    height: .8rem
+}
+
+.bs-tooltip-auto[x-placement^=left] .arrow::before,
+.bs-tooltip-left .arrow::before {
+    left: 0;
+    border-width: .4rem 0 .4rem .4rem;
+    border-left-color: #000
+}
+
+.tooltip-inner {
+    max-width: 200px;
+    padding: .25rem .5rem;
+    color: #fff;
+    text-align: center;
+    background-color: #000;
+    border-radius: .25rem
+}
+
+.popover {
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 1060;
+    display: block;
+    max-width: 276px;
+    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+    font-style: normal;
+    font-weight: 400;
+    line-height: 1.5;
+    text-align: left;
+    text-align: start;
+    text-decoration: none;
+    text-shadow: none;
+    text-transform: none;
+    letter-spacing: normal;
+    word-break: normal;
+    word-spacing: normal;
+    white-space: normal;
+    line-break: auto;
+    font-size: .875rem;
+    word-wrap: break-word;
+    background-color: #fff;
+    background-clip: padding-box;
+    border: 1px solid rgba(0, 0, 0, .2);
+    border-radius: .3rem
+}
+
+.popover .arrow {
+    position: absolute;
+    display: block;
+    width: 1rem;
+    height: .5rem;
+    margin: 0 .3rem
+}
+
+.popover .arrow::after,
+.popover .arrow::before {
+    position: absolute;
+    display: block;
+    content: "";
+    border-color: transparent;
+    border-style: solid
+}
+
+.bs-popover-auto[x-placement^=top],
+.bs-popover-top {
+    margin-bottom: .5rem
+}
+
+.bs-popover-auto[x-placement^=top] .arrow,
+.bs-popover-top .arrow {
+    bottom: calc((.5rem + 1px) * -1)
+}
+
+.bs-popover-auto[x-placement^=top] .arrow::after,
+.bs-popover-auto[x-placement^=top] .arrow::before,
+.bs-popover-top .arrow::after,
+.bs-popover-top .arrow::before {
+    border-width: .5rem .5rem 0
+}
+
+.bs-popover-auto[x-placement^=top] .arrow::before,
+.bs-popover-top .arrow::before {
+    bottom: 0;
+    border-top-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=top] .arrow::after,
+.bs-popover-top .arrow::after {
+    bottom: 1px;
+    border-top-color: #fff
+}
+
+.bs-popover-auto[x-placement^=right],
+.bs-popover-right {
+    margin-left: .5rem
+}
+
+.bs-popover-auto[x-placement^=right] .arrow,
+.bs-popover-right .arrow {
+    left: calc((.5rem + 1px) * -1);
+    width: .5rem;
+    height: 1rem;
+    margin: .3rem 0
+}
+
+.bs-popover-auto[x-placement^=right] .arrow::after,
+.bs-popover-auto[x-placement^=right] .arrow::before,
+.bs-popover-right .arrow::after,
+.bs-popover-right .arrow::before {
+    border-width: .5rem .5rem .5rem 0
+}
+
+.bs-popover-auto[x-placement^=right] .arrow::before,
+.bs-popover-right .arrow::before {
+    left: 0;
+    border-right-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=right] .arrow::after,
+.bs-popover-right .arrow::after {
+    left: 1px;
+    border-right-color: #fff
+}
+
+.bs-popover-auto[x-placement^=bottom],
+.bs-popover-bottom {
+    margin-top: .5rem
+}
+
+.bs-popover-auto[x-placement^=bottom] .arrow,
+.bs-popover-bottom .arrow {
+    top: calc((.5rem + 1px) * -1)
+}
+
+.bs-popover-auto[x-placement^=bottom] .arrow::after,
+.bs-popover-auto[x-placement^=bottom] .arrow::before,
+.bs-popover-bottom .arrow::after,
+.bs-popover-bottom .arrow::before {
+    border-width: 0 .5rem .5rem .5rem
+}
+
+.bs-popover-auto[x-placement^=bottom] .arrow::before,
+.bs-popover-bottom .arrow::before {
+    top: 0;
+    border-bottom-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=bottom] .arrow::after,
+.bs-popover-bottom .arrow::after {
+    top: 1px;
+    border-bottom-color: #fff
+}
+
+.bs-popover-auto[x-placement^=bottom] .popover-header::before,
+.bs-popover-bottom .popover-header::before {
+    position: absolute;
+    top: 0;
+    left: 50%;
+    display: block;
+    width: 1rem;
+    margin-left: -.5rem;
+    content: "";
+    border-bottom: 1px solid #f7f7f7
+}
+
+.bs-popover-auto[x-placement^=left],
+.bs-popover-left {
+    margin-right: .5rem
+}
+
+.bs-popover-auto[x-placement^=left] .arrow,
+.bs-popover-left .arrow {
+    right: calc((.5rem + 1px) * -1);
+    width: .5rem;
+    height: 1rem;
+    margin: .3rem 0
+}
+
+.bs-popover-auto[x-placement^=left] .arrow::after,
+.bs-popover-auto[x-placement^=left] .arrow::before,
+.bs-popover-left .arrow::after,
+.bs-popover-left .arrow::before {
+    border-width: .5rem 0 .5rem .5rem
+}
+
+.bs-popover-auto[x-placement^=left] .arrow::before,
+.bs-popover-left .arrow::before {
+    right: 0;
+    border-left-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=left] .arrow::after,
+.bs-popover-left .arrow::after {
+    right: 1px;
+    border-left-color: #fff
+}
+
+.popover-header {
+    padding: .5rem .75rem;
+    margin-bottom: 0;
+    font-size: 1rem;
+    color: inherit;
+    background-color: #f7f7f7;
+    border-bottom: 1px solid #ebebeb;
+    border-top-left-radius: calc(.3rem - 1px);
+    border-top-right-radius: calc(.3rem - 1px)
+}
+
+.popover-header:empty {
+    display: none
+}
+
+.popover-body {
+    padding: .5rem .75rem;
+    color: #212529
+}
+
+.carousel {
+    position: relative
+}
+
+.carousel-inner {
+    position: relative;
+    width: 100%;
+    overflow: hidden
+}
+
+.carousel-item {
+    position: relative;
+    display: none;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+    width: 100%;
+    transition: -webkit-transform .6s ease;
+    transition: transform .6s ease;
+    transition: transform .6s ease, -webkit-transform .6s ease;
+    -webkit-backface-visibility: hidden;
+    backface-visibility: hidden;
+    -webkit-perspective: 1000px;
+    perspective: 1000px
+}
+
+.carousel-item-next,
+.carousel-item-prev,
+.carousel-item.active {
+    display: block
+}
+
+.carousel-item-next,
+.carousel-item-prev {
+    position: absolute;
+    top: 0
+}
+
+.carousel-item-next.carousel-item-left,
+.carousel-item-prev.carousel-item-right {
+    -webkit-transform: translateX(0);
+    transform: translateX(0)
+}
+
+@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)) {
+    .carousel-item-next.carousel-item-left,
+    .carousel-item-prev.carousel-item-right {
+        -webkit-transform: translate3d(0, 0, 0);
+        transform: translate3d(0, 0, 0)
+    }
+}
+
+.active.carousel-item-right,
+.carousel-item-next {
+    -webkit-transform: translateX(100%);
+    transform: translateX(100%)
+}
+
+@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)) {
+    .active.carousel-item-right,
+    .carousel-item-next {
+        -webkit-transform: translate3d(100%, 0, 0);
+        transform: translate3d(100%, 0, 0)
+    }
+}
+
+.active.carousel-item-left,
+.carousel-item-prev {
+    -webkit-transform: translateX(-100%);
+    transform: translateX(-100%)
+}
+
+@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)) {
+    .active.carousel-item-left,
+    .carousel-item-prev {
+        -webkit-transform: translate3d(-100%, 0, 0);
+        transform: translate3d(-100%, 0, 0)
+    }
+}
+
+.carousel-control-next,
+.carousel-control-prev {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+    -webkit-box-pack: center;
+    -ms-flex-pack: center;
+    justify-content: center;
+    width: 15%;
+    color: #fff;
+    text-align: center;
+    opacity: .5
+}
+
+.carousel-control-next:focus,
+.carousel-control-next:hover,
+.carousel-control-prev:focus,
+.carousel-control-prev:hover {
+    color: #fff;
+    text-decoration: none;
+    outline: 0;
+    opacity: .9
+}
+
+.carousel-control-prev {
+    left: 0
+}
+
+.carousel-control-next {
+    right: 0
+}
+
+.carousel-control-next-icon,
+.carousel-control-prev-icon {
+    display: inline-block;
+    width: 20px;
+    height: 20px;
+    background: transparent no-repeat center center;
+    background-size: 100% 100%
+}
+
+.carousel-control-prev-icon {
+    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")
+}
+
+.carousel-control-next-icon {
+    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")
+}
+
+.carousel-indicators {
+    position: absolute;
+    right: 0;
+    bottom: 10px;
+    left: 0;
+    z-index: 15;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-pack: center;
+    -ms-flex-pack: center;
+    justify-content: center;
+    padding-left: 0;
+    margin-right: 15%;
+    margin-left: 15%;
+    list-style: none
+}
+
+.carousel-indicators li {
+    position: relative;
+    -webkit-box-flex: 0;
+    -ms-flex: 0 1 auto;
+    flex: 0 1 auto;
+    width: 30px;
+    height: 3px;
+    margin-right: 3px;
+    margin-left: 3px;
+    text-indent: -999px;
+    background-color: rgba(255, 255, 255, .5)
+}
+
+.carousel-indicators li::before {
+    position: absolute;
+    top: -10px;
+    left: 0;
+    display: inline-block;
+    width: 100%;
+    height: 10px;
+    content: ""
+}
+
+.carousel-indicators li::after {
+    position: absolute;
+    bottom: -10px;
+    left: 0;
+    display: inline-block;
+    width: 100%;
+    height: 10px;
+    content: ""
+}
+
+.carousel-indicators .active {
+    background-color: #fff
+}
+
+.carousel-caption {
+    position: absolute;
+    right: 15%;
+    bottom: 20px;
+    left: 15%;
+    z-index: 10;
+    padding-top: 20px;
+    padding-bottom: 20px;
+    color: #fff;
+    text-align: center
+}
+
+.align-baseline {
+    vertical-align: baseline !important
+}
+
+.align-top {
+    vertical-align: top !important
+}
+
+.align-middle {
+    vertical-align: middle !important
+}
+
+.align-bottom {
+    vertical-align: bottom !important
+}
+
+.align-text-bottom {
+    vertical-align: text-bottom !important
+}
+
+.align-text-top {
+    vertical-align: text-top !important
+}
+
+.bg-primary {
+    background-color: #007bff !important
+}
+
+a.bg-primary:focus,
+a.bg-primary:hover,
+button.bg-primary:focus,
+button.bg-primary:hover {
+    background-color: #0062cc !important
+}
+
+.bg-secondary {
+    background-color: #6c757d !important
+}
+
+a.bg-secondary:focus,
+a.bg-secondary:hover,
+button.bg-secondary:focus,
+button.bg-secondary:hover {
+    background-color: #545b62 !important
+}
+
+.bg-success {
+    background-color: #28a745 !important
+}
+
+a.bg-success:focus,
+a.bg-success:hover,
+button.bg-success:focus,
+button.bg-success:hover {
+    background-color: #1e7e34 !important
+}
+
+.bg-info {
+    background-color: #17a2b8 !important
+}
+
+a.bg-info:focus,
+a.bg-info:hover,
+button.bg-info:focus,
+button.bg-info:hover {
+    background-color: #117a8b !important
+}
+
+.bg-warning {
+    background-color: #ffc107 !important
+}
+
+a.bg-warning:focus,
+a.bg-warning:hover,
+button.bg-warning:focus,
+button.bg-warning:hover {
+    background-color: #d39e00 !important
+}
+
+.bg-danger {
+    background-color: #dc3545 !important
+}
+
+a.bg-danger:focus,
+a.bg-danger:hover,
+button.bg-danger:focus,
+button.bg-danger:hover {
+    background-color: #bd2130 !important
+}
+
+.bg-light {
+    background-color: #f8f9fa !important
+}
+
+a.bg-light:focus,
+a.bg-light:hover,
+button.bg-light:focus,
+button.bg-light:hover {
+    background-color: #dae0e5 !important
+}
+
+.bg-dark {
+    background-color: #343a40 !important
+}
+
+a.bg-dark:focus,
+a.bg-dark:hover,
+button.bg-dark:focus,
+button.bg-dark:hover {
+    background-color: #1d2124 !important
+}
+
+.bg-white {
+    background-color: #fff !important
+}
+
+.bg-transparent {
+    background-color: transparent !important
+}
+
+.border {
+    border: 1px solid #dee2e6 !important
+}
+
+.border-top {
+    border-top: 1px solid #dee2e6 !important
+}
+
+.border-right {
+    border-right: 1px solid #dee2e6 !important
+}
+
+.border-bottom {
+    border-bottom: 1px solid #dee2e6 !important
+}
+
+.border-left {
+    border-left: 1px solid #dee2e6 !important
+}
+
+.border-0 {
+    border: 0 !important
+}
+
+.border-top-0 {
+    border-top: 0 !important
+}
+
+.border-right-0 {
+    border-right: 0 !important
+}
+
+.border-bottom-0 {
+    border-bottom: 0 !important
+}
+
+.border-left-0 {
+    border-left: 0 !important
+}
+
+.border-primary {
+    border-color: #007bff !important
+}
+
+.border-secondary {
+    border-color: #6c757d !important
+}
+
+.border-success {
+    border-color: #28a745 !important
+}
+
+.border-info {
+    border-color: #17a2b8 !important
+}
+
+.border-warning {
+    border-color: #ffc107 !important
+}
+
+.border-danger {
+    border-color: #dc3545 !important
+}
+
+.border-light {
+    border-color: #f8f9fa !important
+}
+
+.border-dark {
+    border-color: #343a40 !important
+}
+
+.border-white {
+    border-color: #fff !important
+}
+
+.rounded {
+    border-radius: .25rem !important
+}
+
+.rounded-top {
+    border-top-left-radius: .25rem !important;
+    border-top-right-radius: .25rem !important
+}
+
+.rounded-right {
+    border-top-right-radius: .25rem !important;
+    border-bottom-right-radius: .25rem !important
+}
+
+.rounded-bottom {
+    border-bottom-right-radius: .25rem !important;
+    border-bottom-left-radius: .25rem !important
+}
+
+.rounded-left {
+    border-top-left-radius: .25rem !important;
+    border-bottom-left-radius: .25rem !important
+}
+
+.rounded-circle {
+    border-radius: 50% !important
+}
+
+.rounded-0 {
+    border-radius: 0 !important
+}
+
+.clearfix::after {
+    display: block;
+    clear: both;
+    content: ""
+}
+
+.d-none {
+    display: none !important
+}
+
+.d-inline {
+    display: inline !important
+}
+
+.d-inline-block {
+    display: inline-block !important
+}
+
+.d-block {
+    display: block !important
+}
+
+.d-table {
+    display: table !important
+}
+
+.d-table-row {
+    display: table-row !important
+}
+
+.d-table-cell {
+    display: table-cell !important
+}
+
+.d-flex {
+    display: -webkit-box !important;
+    display: -ms-flexbox !important;
+    display: flex !important
+}
+
+.d-inline-flex {
+    display: -webkit-inline-box !important;
+    display: -ms-inline-flexbox !important;
+    display: inline-flex !important
+}
+
+@media (min-width:576px) {
+    .d-sm-none {
+        display: none !important
+    }
+    .d-sm-inline {
+        display: inline !important
+    }
+    .d-sm-inline-block {
+        display: inline-block !important
+    }
+    .d-sm-block {
+        display: block !important
+    }
+    .d-sm-table {
+        display: table !important
+    }
+    .d-sm-table-row {
+        display: table-row !important
+    }
+    .d-sm-table-cell {
+        display: table-cell !important
+    }
+    .d-sm-flex {
+        display: -webkit-box !important;
+        display: -ms-flexbox !important;
+        display: flex !important
+    }
+    .d-sm-inline-flex {
+        display: -webkit-inline-box !important;
+        display: -ms-inline-flexbox !important;
+        display: inline-flex !important
+    }
+}
+
+@media (min-width:768px) {
+    .d-md-none {
+        display: none !important
+    }
+    .d-md-inline {
+        display: inline !important
+    }
+    .d-md-inline-block {
+        display: inline-block !important
+    }
+    .d-md-block {
+        display: block !important
+    }
+    .d-md-table {
+        display: table !important
+    }
+    .d-md-table-row {
+        display: table-row !important
+    }
+    .d-md-table-cell {
+        display: table-cell !important
+    }
+    .d-md-flex {
+        display: -webkit-box !important;
+        display: -ms-flexbox !important;
+        display: flex !important
+    }
+    .d-md-inline-flex {
+        display: -webkit-inline-box !important;
+        display: -ms-inline-flexbox !important;
+        display: inline-flex !important
+    }
+}
+
+@media (min-width:992px) {
+    .d-lg-none {
+        display: none !important
+    }
+    .d-lg-inline {
+        display: inline !important
+    }
+    .d-lg-inline-block {
+        display: inline-block !important
+    }
+    .d-lg-block {
+        display: block !important
+    }
+    .d-lg-table {
+        display: table !important
+    }
+    .d-lg-table-row {
+        display: table-row !important
+    }
+    .d-lg-table-cell {
+        display: table-cell !important
+    }
+    .d-lg-flex {
+        display: -webkit-box !important;
+        display: -ms-flexbox !important;
+        display: flex !important
+    }
+    .d-lg-inline-flex {
+        display: -webkit-inline-box !important;
+        display: -ms-inline-flexbox !important;
+        display: inline-flex !important
+    }
+}
+
+@media (min-width:1200px) {
+    .d-xl-none {
+        display: none !important
+    }
+    .d-xl-inline {
+        display: inline !important
+    }
+    .d-xl-inline-block {
+        display: inline-block !important
+    }
+    .d-xl-block {
+        display: block !important
+    }
+    .d-xl-table {
+        display: table !important
+    }
+    .d-xl-table-row {
+        display: table-row !important
+    }
+    .d-xl-table-cell {
+        display: table-cell !important
+    }
+    .d-xl-flex {
+        display: -webkit-box !important;
+        display: -ms-flexbox !important;
+        display: flex !important
+    }
+    .d-xl-inline-flex {
+        display: -webkit-inline-box !important;
+        display: -ms-inline-flexbox !important;
+        display: inline-flex !important
+    }
+}
+
+@media print {
+    .d-print-none {
+        display: none !important
+    }
+    .d-print-inline {
+        display: inline !important
+    }
+    .d-print-inline-block {
+        display: inline-block !important
+    }
+    .d-print-block {
+        display: block !important
+    }
+    .d-print-table {
+        display: table !important
+    }
+    .d-print-table-row {
+        display: table-row !important
+    }
+    .d-print-table-cell {
+        display: table-cell !important
+    }
+    .d-print-flex {
+        display: -webkit-box !important;
+        display: -ms-flexbox !important;
+        display: flex !important
+    }
+    .d-print-inline-flex {
+        display: -webkit-inline-box !important;
+        display: -ms-inline-flexbox !important;
+        display: inline-flex !important
+    }
+}
+
+.embed-responsive {
+    position: relative;
+    display: block;
+    width: 100%;
+    padding: 0;
+    overflow: hidden
+}
+
+.embed-responsive::before {
+    display: block;
+    content: ""
+}
+
+.embed-responsive .embed-responsive-item,
+.embed-responsive embed,
+.embed-responsive iframe,
+.embed-responsive object,
+.embed-responsive video {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    border: 0
+}
+
+.embed-responsive-21by9::before {
+    padding-top: 42.857143%
+}
+
+.embed-responsive-16by9::before {
+    padding-top: 56.25%
+}
+
+.embed-responsive-4by3::before {
+    padding-top: 75%
+}
+
+.embed-responsive-1by1::before {
+    padding-top: 100%
+}
+
+.flex-row {
+    -webkit-box-orient: horizontal !important;
+    -webkit-box-direction: normal !important;
+    -ms-flex-direction: row !important;
+    flex-direction: row !important
+}
+
+.flex-column {
+    -webkit-box-orient: vertical !important;
+    -webkit-box-direction: normal !important;
+    -ms-flex-direction: column !important;
+    flex-direction: column !important
+}
+
+.flex-row-reverse {
+    -webkit-box-orient: horizontal !important;
+    -webkit-box-direction: reverse !important;
+    -ms-flex-direction: row-reverse !important;
+    flex-direction: row-reverse !important
+}
+
+.flex-column-reverse {
+    -webkit-box-orient: vertical !important;
+    -webkit-box-direction: reverse !important;
+    -ms-flex-direction: column-reverse !important;
+    flex-direction: column-reverse !important
+}
+
+.flex-wrap {
+    -ms-flex-wrap: wrap !important;
+    flex-wrap: wrap !important
+}
+
+.flex-nowrap {
+    -ms-flex-wrap: nowrap !important;
+    flex-wrap: nowrap !important
+}
+
+.flex-wrap-reverse {
+    -ms-flex-wrap: wrap-reverse !important;
+    flex-wrap: wrap-reverse !important
+}
+
+.justify-content-start {
+    -webkit-box-pack: start !important;
+    -ms-flex-pack: start !important;
+    justify-content: flex-start !important
+}
+
+.justify-content-end {
+    -webkit-box-pack: end !important;
+    -ms-flex-pack: end !important;
+    justify-content: flex-end !important
+}
+
+.justify-content-center {
+    -webkit-box-pack: center !important;
+    -ms-flex-pack: center !important;
+    justify-content: center !important
+}
+
+.justify-content-between {
+    -webkit-box-pack: justify !important;
+    -ms-flex-pack: justify !important;
+    justify-content: space-between !important
+}
+
+.justify-content-around {
+    -ms-flex-pack: distribute !important;
+    justify-content: space-around !important
+}
+
+.align-items-start {
+    -webkit-box-align: start !important;
+    -ms-flex-align: start !important;
+    align-items: flex-start !important
+}
+
+.align-items-end {
+    -webkit-box-align: end !important;
+    -ms-flex-align: end !important;
+    align-items: flex-end !important
+}
+
+.align-items-center {
+    -webkit-box-align: center !important;
+    -ms-flex-align: center !important;
+    align-items: center !important
+}
+
+.align-items-baseline {
+    -webkit-box-align: baseline !important;
+    -ms-flex-align: baseline !important;
+    align-items: baseline !important
+}
+
+.align-items-stretch {
+    -webkit-box-align: stretch !important;
+    -ms-flex-align: stretch !important;
+    align-items: stretch !important
+}
+
+.align-content-start {
+    -ms-flex-line-pack: start !important;
+    align-content: flex-start !important
+}
+
+.align-content-end {
+    -ms-flex-line-pack: end !important;
+    align-content: flex-end !important
+}
+
+.align-content-center {
+    -ms-flex-line-pack: center !important;
+    align-content: center !important
+}
+
+.align-content-between {
+    -ms-flex-line-pack: justify !important;
+    align-content: space-between !important
+}
+
+.align-content-around {
+    -ms-flex-line-pack: distribute !important;
+    align-content: space-around !important
+}
+
+.align-content-stretch {
+    -ms-flex-line-pack: stretch !important;
+    align-content: stretch !important
+}
+
+.align-self-auto {
+    -ms-flex-item-align: auto !important;
+    align-self: auto !important
+}
+
+.align-self-start {
+    -ms-flex-item-align: start !important;
+    align-self: flex-start !important
+}
+
+.align-self-end {
+    -ms-flex-item-align: end !important;
+    align-self: flex-end !important
+}
+
+.align-self-center {
+    -ms-flex-item-align: center !important;
+    align-self: center !important
+}
+
+.align-self-baseline {
+    -ms-flex-item-align: baseline !important;
+    align-self: baseline !important
+}
+
+.align-self-stretch {
+    -ms-flex-item-align: stretch !important;
+    align-self: stretch !important
+}
+
+@media (min-width:576px) {
+    .flex-sm-row {
+        -webkit-box-orient: horizontal !important;
+        -webkit-box-direction: normal !important;
+        -ms-flex-direction: row !important;
+        flex-direction: row !important
+    }
+    .flex-sm-column {
+        -webkit-box-orient: vertical !important;
+        -webkit-box-direction: normal !important;
+        -ms-flex-direction: column !important;
+        flex-direction: column !important
+    }
+    .flex-sm-row-reverse {
+        -webkit-box-orient: horizontal !important;
+        -webkit-box-direction: reverse !important;
+        -ms-flex-direction: row-reverse !important;
+        flex-direction: row-reverse !important
+    }
+    .flex-sm-column-reverse {
+        -webkit-box-orient: vertical !important;
+        -webkit-box-direction: reverse !important;
+        -ms-flex-direction: column-reverse !important;
+        flex-direction: column-reverse !important
+    }
+    .flex-sm-wrap {
+        -ms-flex-wrap: wrap !important;
+        flex-wrap: wrap !important
+    }
+    .flex-sm-nowrap {
+        -ms-flex-wrap: nowrap !important;
+        flex-wrap: nowrap !important
+    }
+    .flex-sm-wrap-reverse {
+        -ms-flex-wrap: wrap-reverse !important;
+        flex-wrap: wrap-reverse !important
+    }
+    .justify-content-sm-start {
+        -webkit-box-pack: start !important;
+        -ms-flex-pack: start !important;
+        justify-content: flex-start !important
+    }
+    .justify-content-sm-end {
+        -webkit-box-pack: end !important;
+        -ms-flex-pack: end !important;
+        justify-content: flex-end !important
+    }
+    .justify-content-sm-center {
+        -webkit-box-pack: center !important;
+        -ms-flex-pack: center !important;
+        justify-content: center !important
+    }
+    .justify-content-sm-between {
+        -webkit-box-pack: justify !important;
+        -ms-flex-pack: justify !important;
+        justify-content: space-between !important
+    }
+    .justify-content-sm-around {
+        -ms-flex-pack: distribute !important;
+        justify-content: space-around !important
+    }
+    .align-items-sm-start {
+        -webkit-box-align: start !important;
+        -ms-flex-align: start !important;
+        align-items: flex-start !important
+    }
+    .align-items-sm-end {
+        -webkit-box-align: end !important;
+        -ms-flex-align: end !important;
+        align-items: flex-end !important
+    }
+    .align-items-sm-center {
+        -webkit-box-align: center !important;
+        -ms-flex-align: center !important;
+        align-items: center !important
+    }
+    .align-items-sm-baseline {
+        -webkit-box-align: baseline !important;
+        -ms-flex-align: baseline !important;
+        align-items: baseline !important
+    }
+    .align-items-sm-stretch {
+        -webkit-box-align: stretch !important;
+        -ms-flex-align: stretch !important;
+        align-items: stretch !important
+    }
+    .align-content-sm-start {
+        -ms-flex-line-pack: start !important;
+        align-content: flex-start !important
+    }
+    .align-content-sm-end {
+        -ms-flex-line-pack: end !important;
+        align-content: flex-end !important
+    }
+    .align-content-sm-center {
+        -ms-flex-line-pack: center !important;
+        align-content: center !important
+    }
+    .align-content-sm-between {
+        -ms-flex-line-pack: justify !important;
+        align-content: space-between !important
+    }
+    .align-content-sm-around {
+        -ms-flex-line-pack: distribute !important;
+        align-content: space-around !important
+    }
+    .align-content-sm-stretch {
+        -ms-flex-line-pack: stretch !important;
+        align-content: stretch !important
+    }
+    .align-self-sm-auto {
+        -ms-flex-item-align: auto !important;
+        align-self: auto !important
+    }
+    .align-self-sm-start {
+        -ms-flex-item-align: start !important;
+        align-self: flex-start !important
+    }
+    .align-self-sm-end {
+        -ms-flex-item-align: end !important;
+        align-self: flex-end !important
+    }
+    .align-self-sm-center {
+        -ms-flex-item-align: center !important;
+        align-self: center !important
+    }
+    .align-self-sm-baseline {
+        -ms-flex-item-align: baseline !important;
+        align-self: baseline !important
+    }
+    .align-self-sm-stretch {
+        -ms-flex-item-align: stretch !important;
+        align-self: stretch !important
+    }
+}
+
+@media (min-width:768px) {
+    .flex-md-row {
+        -webkit-box-orient: horizontal !important;
+        -webkit-box-direction: normal !important;
+        -ms-flex-direction: row !important;
+        flex-direction: row !important
+    }
+    .flex-md-column {
+        -webkit-box-orient: vertical !important;
+        -webkit-box-direction: normal !important;
+        -ms-flex-direction: column !important;
+        flex-direction: column !important
+    }
+    .flex-md-row-reverse {
+        -webkit-box-orient: horizontal !important;
+        -webkit-box-direction: reverse !important;
+        -ms-flex-direction: row-reverse !important;
+        flex-direction: row-reverse !important
+    }
+    .flex-md-column-reverse {
+        -webkit-box-orient: vertical !important;
+        -webkit-box-direction: reverse !important;
+        -ms-flex-direction: column-reverse !important;
+        flex-direction: column-reverse !important
+    }
+    .flex-md-wrap {
+        -ms-flex-wrap: wrap !important;
+        flex-wrap: wrap !important
+    }
+    .flex-md-nowrap {
+        -ms-flex-wrap: nowrap !important;
+        flex-wrap: nowrap !important
+    }
+    .flex-md-wrap-reverse {
+        -ms-flex-wrap: wrap-reverse !important;
+        flex-wrap: wrap-reverse !important
+    }
+    .justify-content-md-start {
+        -webkit-box-pack: start !important;
+        -ms-flex-pack: start !important;
+        justify-content: flex-start !important
+    }
+    .justify-content-md-end {
+        -webkit-box-pack: end !important;
+        -ms-flex-pack: end !important;
+        justify-content: flex-end !important
+    }
+    .justify-content-md-center {
+        -webkit-box-pack: center !important;
+        -ms-flex-pack: center !important;
+        justify-content: center !important
+    }
+    .justify-content-md-between {
+        -webkit-box-pack: justify !important;
+        -ms-flex-pack: justify !important;
+        justify-content: space-between !important
+    }
+    .justify-content-md-around {
+        -ms-flex-pack: distribute !important;
+        justify-content: space-around !important
+    }
+    .align-items-md-start {
+        -webkit-box-align: start !important;
+        -ms-flex-align: start !important;
+        align-items: flex-start !important
+    }
+    .align-items-md-end {
+        -webkit-box-align: end !important;
+        -ms-flex-align: end !important;
+        align-items: flex-end !important
+    }
+    .align-items-md-center {
+        -webkit-box-align: center !important;
+        -ms-flex-align: center !important;
+        align-items: center !important
+    }
+    .align-items-md-baseline {
+        -webkit-box-align: baseline !important;
+        -ms-flex-align: baseline !important;
+        align-items: baseline !important
+    }
+    .align-items-md-stretch {
+        -webkit-box-align: stretch !important;
+        -ms-flex-align: stretch !important;
+        align-items: stretch !important
+    }
+    .align-content-md-start {
+        -ms-flex-line-pack: start !important;
+        align-content: flex-start !important
+    }
+    .align-content-md-end {
+        -ms-flex-line-pack: end !important;
+        align-content: flex-end !important
+    }
+    .align-content-md-center {
+        -ms-flex-line-pack: center !important;
+        align-content: center !important
+    }
+    .align-content-md-between {
+        -ms-flex-line-pack: justify !important;
+        align-content: space-between !important
+    }
+    .align-content-md-around {
+        -ms-flex-line-pack: distribute !important;
+        align-content: space-around !important
+    }
+    .align-content-md-stretch {
+        -ms-flex-line-pack: stretch !important;
+        align-content: stretch !important
+    }
+    .align-self-md-auto {
+        -ms-flex-item-align: auto !important;
+        align-self: auto !important
+    }
+    .align-self-md-start {
+        -ms-flex-item-align: start !important;
+        align-self: flex-start !important
+    }
+    .align-self-md-end {
+        -ms-flex-item-align: end !important;
+        align-self: flex-end !important
+    }
+    .align-self-md-center {
+        -ms-flex-item-align: center !important;
+        align-self: center !important
+    }
+    .align-self-md-baseline {
+        -ms-flex-item-align: baseline !important;
+        align-self: baseline !important
+    }
+    .align-self-md-stretch {
+        -ms-flex-item-align: stretch !important;
+        align-self: stretch !important
+    }
+}
+
+@media (min-width:992px) {
+    .flex-lg-row {
+        -webkit-box-orient: horizontal !important;
+        -webkit-box-direction: normal !important;
+        -ms-flex-direction: row !important;
+        flex-direction: row !important
+    }
+    .flex-lg-column {
+        -webkit-box-orient: vertical !important;
+        -webkit-box-direction: normal !important;
+        -ms-flex-direction: column !important;
+        flex-direction: column !important
+    }
+    .flex-lg-row-reverse {
+        -webkit-box-orient: horizontal !important;
+        -webkit-box-direction: reverse !important;
+        -ms-flex-direction: row-reverse !important;
+        flex-direction: row-reverse !important
+    }
+    .flex-lg-column-reverse {
+        -webkit-box-orient: vertical !important;
+        -webkit-box-direction: reverse !important;
+        -ms-flex-direction: column-reverse !important;
+        flex-direction: column-reverse !important
+    }
+    .flex-lg-wrap {
+        -ms-flex-wrap: wrap !important;
+        flex-wrap: wrap !important
+    }
+    .flex-lg-nowrap {
+        -ms-flex-wrap: nowrap !important;
+        flex-wrap: nowrap !important
+    }
+    .flex-lg-wrap-reverse {
+        -ms-flex-wrap: wrap-reverse !important;
+        flex-wrap: wrap-reverse !important
+    }
+    .justify-content-lg-start {
+        -webkit-box-pack: start !important;
+        -ms-flex-pack: start !important;
+        justify-content: flex-start !important
+    }
+    .justify-content-lg-end {
+        -webkit-box-pack: end !important;
+        -ms-flex-pack: end !important;
+        justify-content: flex-end !important
+    }
+    .justify-content-lg-center {
+        -webkit-box-pack: center !important;
+        -ms-flex-pack: center !important;
+        justify-content: center !important
+    }
+    .justify-content-lg-between {
+        -webkit-box-pack: justify !important;
+        -ms-flex-pack: justify !important;
+        justify-content: space-between !important
+    }
+    .justify-content-lg-around {
+        -ms-flex-pack: distribute !important;
+        justify-content: space-around !important
+    }
+    .align-items-lg-start {
+        -webkit-box-align: start !important;
+        -ms-flex-align: start !important;
+        align-items: flex-start !important
+    }
+    .align-items-lg-end {
+        -webkit-box-align: end !important;
+        -ms-flex-align: end !important;
+        align-items: flex-end !important
+    }
+    .align-items-lg-center {
+        -webkit-box-align: center !important;
+        -ms-flex-align: center !important;
+        align-items: center !important
+    }
+    .align-items-lg-baseline {
+        -webkit-box-align: baseline !important;
+        -ms-flex-align: baseline !important;
+        align-items: baseline !important
+    }
+    .align-items-lg-stretch {
+        -webkit-box-align: stretch !important;
+        -ms-flex-align: stretch !important;
+        align-items: stretch !important
+    }
+    .align-content-lg-start {
+        -ms-flex-line-pack: start !important;
+        align-content: flex-start !important
+    }
+    .align-content-lg-end {
+        -ms-flex-line-pack: end !important;
+        align-content: flex-end !important
+    }
+    .align-content-lg-center {
+        -ms-flex-line-pack: center !important;
+        align-content: center !important
+    }
+    .align-content-lg-between {
+        -ms-flex-line-pack: justify !important;
+        align-content: space-between !important
+    }
+    .align-content-lg-around {
+        -ms-flex-line-pack: distribute !important;
+        align-content: space-around !important
+    }
+    .align-content-lg-stretch {
+        -ms-flex-line-pack: stretch !important;
+        align-content: stretch !important
+    }
+    .align-self-lg-auto {
+        -ms-flex-item-align: auto !important;
+        align-self: auto !important
+    }
+    .align-self-lg-start {
+        -ms-flex-item-align: start !important;
+        align-self: flex-start !important
+    }
+    .align-self-lg-end {
+        -ms-flex-item-align: end !important;
+        align-self: flex-end !important
+    }
+    .align-self-lg-center {
+        -ms-flex-item-align: center !important;
+        align-self: center !important
+    }
+    .align-self-lg-baseline {
+        -ms-flex-item-align: baseline !important;
+        align-self: baseline !important
+    }
+    .align-self-lg-stretch {
+        -ms-flex-item-align: stretch !important;
+        align-self: stretch !important
+    }
+}
+
+@media (min-width:1200px) {
+    .flex-xl-row {
+        -webkit-box-orient: horizontal !important;
+        -webkit-box-direction: normal !important;
+        -ms-flex-direction: row !important;
+        flex-direction: row !important
+    }
+    .flex-xl-column {
+        -webkit-box-orient: vertical !important;
+        -webkit-box-direction: normal !important;
+        -ms-flex-direction: column !important;
+        flex-direction: column !important
+    }
+    .flex-xl-row-reverse {
+        -webkit-box-orient: horizontal !important;
+        -webkit-box-direction: reverse !important;
+        -ms-flex-direction: row-reverse !important;
+        flex-direction: row-reverse !important
+    }
+    .flex-xl-column-reverse {
+        -webkit-box-orient: vertical !important;
+        -webkit-box-direction: reverse !important;
+        -ms-flex-direction: column-reverse !important;
+        flex-direction: column-reverse !important
+    }
+    .flex-xl-wrap {
+        -ms-flex-wrap: wrap !important;
+        flex-wrap: wrap !important
+    }
+    .flex-xl-nowrap {
+        -ms-flex-wrap: nowrap !important;
+        flex-wrap: nowrap !important
+    }
+    .flex-xl-wrap-reverse {
+        -ms-flex-wrap: wrap-reverse !important;
+        flex-wrap: wrap-reverse !important
+    }
+    .justify-content-xl-start {
+        -webkit-box-pack: start !important;
+        -ms-flex-pack: start !important;
+        justify-content: flex-start !important
+    }
+    .justify-content-xl-end {
+        -webkit-box-pack: end !important;
+        -ms-flex-pack: end !important;
+        justify-content: flex-end !important
+    }
+    .justify-content-xl-center {
+        -webkit-box-pack: center !important;
+        -ms-flex-pack: center !important;
+        justify-content: center !important
+    }
+    .justify-content-xl-between {
+        -webkit-box-pack: justify !important;
+        -ms-flex-pack: justify !important;
+        justify-content: space-between !important
+    }
+    .justify-content-xl-around {
+        -ms-flex-pack: distribute !important;
+        justify-content: space-around !important
+    }
+    .align-items-xl-start {
+        -webkit-box-align: start !important;
+        -ms-flex-align: start !important;
+        align-items: flex-start !important
+    }
+    .align-items-xl-end {
+        -webkit-box-align: end !important;
+        -ms-flex-align: end !important;
+        align-items: flex-end !important
+    }
+    .align-items-xl-center {
+        -webkit-box-align: center !important;
+        -ms-flex-align: center !important;
+        align-items: center !important
+    }
+    .align-items-xl-baseline {
+        -webkit-box-align: baseline !important;
+        -ms-flex-align: baseline !important;
+        align-items: baseline !important
+    }
+    .align-items-xl-stretch {
+        -webkit-box-align: stretch !important;
+        -ms-flex-align: stretch !important;
+        align-items: stretch !important
+    }
+    .align-content-xl-start {
+        -ms-flex-line-pack: start !important;
+        align-content: flex-start !important
+    }
+    .align-content-xl-end {
+        -ms-flex-line-pack: end !important;
+        align-content: flex-end !important
+    }
+    .align-content-xl-center {
+        -ms-flex-line-pack: center !important;
+        align-content: center !important
+    }
+    .align-content-xl-between {
+        -ms-flex-line-pack: justify !important;
+        align-content: space-between !important
+    }
+    .align-content-xl-around {
+        -ms-flex-line-pack: distribute !important;
+        align-content: space-around !important
+    }
+    .align-content-xl-stretch {
+        -ms-flex-line-pack: stretch !important;
+        align-content: stretch !important
+    }
+    .align-self-xl-auto {
+        -ms-flex-item-align: auto !important;
+        align-self: auto !important
+    }
+    .align-self-xl-start {
+        -ms-flex-item-align: start !important;
+        align-self: flex-start !important
+    }
+    .align-self-xl-end {
+        -ms-flex-item-align: end !important;
+        align-self: flex-end !important
+    }
+    .align-self-xl-center {
+        -ms-flex-item-align: center !important;
+        align-self: center !important
+    }
+    .align-self-xl-baseline {
+        -ms-flex-item-align: baseline !important;
+        align-self: baseline !important
+    }
+    .align-self-xl-stretch {
+        -ms-flex-item-align: stretch !important;
+        align-self: stretch !important
+    }
+}
+
+.float-left {
+    float: left !important
+}
+
+.float-right {
+    float: right !important
+}
+
+.float-none {
+    float: none !important
+}
+
+@media (min-width:576px) {
+    .float-sm-left {
+        float: left !important
+    }
+    .float-sm-right {
+        float: right !important
+    }
+    .float-sm-none {
+        float: none !important
+    }
+}
+
+@media (min-width:768px) {
+    .float-md-left {
+        float: left !important
+    }
+    .float-md-right {
+        float: right !important
+    }
+    .float-md-none {
+        float: none !important
+    }
+}
+
+@media (min-width:992px) {
+    .float-lg-left {
+        float: left !important
+    }
+    .float-lg-right {
+        float: right !important
+    }
+    .float-lg-none {
+        float: none !important
+    }
+}
+
+@media (min-width:1200px) {
+    .float-xl-left {
+        float: left !important
+    }
+    .float-xl-right {
+        float: right !important
+    }
+    .float-xl-none {
+        float: none !important
+    }
+}
+
+.position-static {
+    position: static !important
+}
+
+.position-relative {
+    position: relative !important
+}
+
+.position-absolute {
+    position: absolute !important
+}
+
+.position-fixed {
+    position: fixed !important
+}
+
+.position-sticky {
+    position: -webkit-sticky !important;
+    position: sticky !important
+}
+
+.fixed-top {
+    position: fixed;
+    top: 0;
+    right: 0;
+    left: 0;
+    z-index: 1030
+}
+
+.fixed-bottom {
+    position: fixed;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1030
+}
+
+@supports ((position:-webkit-sticky) or (position:sticky)) {
+    .sticky-top {
+        position: -webkit-sticky;
+        position: sticky;
+        top: 0;
+        z-index: 1020
+    }
+}
+
+.sr-only {
+    position: absolute;
+    width: 1px;
+    height: 1px;
+    padding: 0;
+    overflow: hidden;
+    clip: rect(0, 0, 0, 0);
+    white-space: nowrap;
+    -webkit-clip-path: inset(50%);
+    clip-path: inset(50%);
+    border: 0
+}
+
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+    position: static;
+    width: auto;
+    height: auto;
+    overflow: visible;
+    clip: auto;
+    white-space: normal;
+    -webkit-clip-path: none;
+    clip-path: none
+}
+
+.w-25 {
+    width: 25% !important
+}
+
+.w-50 {
+    width: 50% !important
+}
+
+.w-75 {
+    width: 75% !important
+}
+
+.w-100 {
+    width: 100% !important
+}
+
+.h-25 {
+    height: 25% !important
+}
+
+.h-50 {
+    height: 50% !important
+}
+
+.h-75 {
+    height: 75% !important
+}
+
+.h-100 {
+    height: 100% !important
+}
+
+.mw-100 {
+    max-width: 100% !important
+}
+
+.mh-100 {
+    max-height: 100% !important
+}
+
+.m-0 {
+    margin: 0 !important
+}
+
+.mt-0,
+.my-0 {
+    margin-top: 0 !important
+}
+
+.mr-0,
+.mx-0 {
+    margin-right: 0 !important
+}
+
+.mb-0,
+.my-0 {
+    margin-bottom: 0 !important
+}
+
+.ml-0,
+.mx-0 {
+    margin-left: 0 !important
+}
+
+.m-1 {
+    margin: .25rem !important
+}
+
+.mt-1,
+.my-1 {
+    margin-top: .25rem !important
+}
+
+.mr-1,
+.mx-1 {
+    margin-right: .25rem !important
+}
+
+.mb-1,
+.my-1 {
+    margin-bottom: .25rem !important
+}
+
+.ml-1,
+.mx-1 {
+    margin-left: .25rem !important
+}
+
+.m-2 {
+    margin: .5rem !important
+}
+
+.mt-2,
+.my-2 {
+    margin-top: .5rem !important
+}
+
+.mr-2,
+.mx-2 {
+    margin-right: .5rem !important
+}
+
+.mb-2,
+.my-2 {
+    margin-bottom: .5rem !important
+}
+
+.ml-2,
+.mx-2 {
+    margin-left: .5rem !important
+}
+
+.m-3 {
+    margin: 1rem !important
+}
+
+.mt-3,
+.my-3 {
+    margin-top: 1rem !important
+}
+
+.mr-3,
+.mx-3 {
+    margin-right: 1rem !important
+}
+
+.mb-3,
+.my-3 {
+    margin-bottom: 1rem !important
+}
+
+.ml-3,
+.mx-3 {
+    margin-left: 1rem !important
+}
+
+.m-4 {
+    margin: 1.5rem !important
+}
+
+.mt-4,
+.my-4 {
+    margin-top: 1.5rem !important
+}
+
+.mr-4,
+.mx-4 {
+    margin-right: 1.5rem !important
+}
+
+.mb-4,
+.my-4 {
+    margin-bottom: 1.5rem !important
+}
+
+.ml-4,
+.mx-4 {
+    margin-left: 1.5rem !important
+}
+
+.m-5 {
+    margin: 3rem !important
+}
+
+.mt-5,
+.my-5 {
+    margin-top: 3rem !important
+}
+
+.mr-5,
+.mx-5 {
+    margin-right: 3rem !important
+}
+
+.mb-5,
+.my-5 {
+    margin-bottom: 3rem !important
+}
+
+.ml-5,
+.mx-5 {
+    margin-left: 3rem !important
+}
+
+.p-0 {
+    padding: 0 !important
+}
+
+.pt-0,
+.py-0 {
+    padding-top: 0 !important
+}
+
+.pr-0,
+.px-0 {
+    padding-right: 0 !important
+}
+
+.pb-0,
+.py-0 {
+    padding-bottom: 0 !important
+}
+
+.pl-0,
+.px-0 {
+    padding-left: 0 !important
+}
+
+.p-1 {
+    padding: .25rem !important
+}
+
+.pt-1,
+.py-1 {
+    padding-top: .25rem !important
+}
+
+.pr-1,
+.px-1 {
+    padding-right: .25rem !important
+}
+
+.pb-1,
+.py-1 {
+    padding-bottom: .25rem !important
+}
+
+.pl-1,
+.px-1 {
+    padding-left: .25rem !important
+}
+
+.p-2 {
+    padding: .5rem !important
+}
+
+.pt-2,
+.py-2 {
+    padding-top: .5rem !important
+}
+
+.pr-2,
+.px-2 {
+    padding-right: .5rem !important
+}
+
+.pb-2,
+.py-2 {
+    padding-bottom: .5rem !important
+}
+
+.pl-2,
+.px-2 {
+    padding-left: .5rem !important
+}
+
+.p-3 {
+    padding: 1rem !important
+}
+
+.pt-3,
+.py-3 {
+    padding-top: 1rem !important
+}
+
+.pr-3,
+.px-3 {
+    padding-right: 1rem !important
+}
+
+.pb-3,
+.py-3 {
+    padding-bottom: 1rem !important
+}
+
+.pl-3,
+.px-3 {
+    padding-left: 1rem !important
+}
+
+.p-4 {
+    padding: 1.5rem !important
+}
+
+.pt-4,
+.py-4 {
+    padding-top: 1.5rem !important
+}
+
+.pr-4,
+.px-4 {
+    padding-right: 1.5rem !important
+}
+
+.pb-4,
+.py-4 {
+    padding-bottom: 1.5rem !important
+}
+
+.pl-4,
+.px-4 {
+    padding-left: 1.5rem !important
+}
+
+.p-5 {
+    padding: 3rem !important
+}
+
+.pt-5,
+.py-5 {
+    padding-top: 3rem !important
+}
+
+.pr-5,
+.px-5 {
+    padding-right: 3rem !important
+}
+
+.pb-5,
+.py-5 {
+    padding-bottom: 3rem !important
+}
+
+.pl-5,
+.px-5 {
+    padding-left: 3rem !important
+}
+
+.m-auto {
+    margin: auto !important
+}
+
+.mt-auto,
+.my-auto {
+    margin-top: auto !important
+}
+
+.mr-auto,
+.mx-auto {
+    margin-right: auto !important
+}
+
+.mb-auto,
+.my-auto {
+    margin-bottom: auto !important
+}
+
+.ml-auto,
+.mx-auto {
+    margin-left: auto !important
+}
+
+@media (min-width:576px) {
+    .m-sm-0 {
+        margin: 0 !important
+    }
+    .mt-sm-0,
+    .my-sm-0 {
+        margin-top: 0 !important
+    }
+    .mr-sm-0,
+    .mx-sm-0 {
+        margin-right: 0 !important
+    }
+    .mb-sm-0,
+    .my-sm-0 {
+        margin-bottom: 0 !important
+    }
+    .ml-sm-0,
+    .mx-sm-0 {
+        margin-left: 0 !important
+    }
+    .m-sm-1 {
+        margin: .25rem !important
+    }
+    .mt-sm-1,
+    .my-sm-1 {
+        margin-top: .25rem !important
+    }
+    .mr-sm-1,
+    .mx-sm-1 {
+        margin-right: .25rem !important
+    }
+    .mb-sm-1,
+    .my-sm-1 {
+        margin-bottom: .25rem !important
+    }
+    .ml-sm-1,
+    .mx-sm-1 {
+        margin-left: .25rem !important
+    }
+    .m-sm-2 {
+        margin: .5rem !important
+    }
+    .mt-sm-2,
+    .my-sm-2 {
+        margin-top: .5rem !important
+    }
+    .mr-sm-2,
+    .mx-sm-2 {
+        margin-right: .5rem !important
+    }
+    .mb-sm-2,
+    .my-sm-2 {
+        margin-bottom: .5rem !important
+    }
+    .ml-sm-2,
+    .mx-sm-2 {
+        margin-left: .5rem !important
+    }
+    .m-sm-3 {
+        margin: 1rem !important
+    }
+    .mt-sm-3,
+    .my-sm-3 {
+        margin-top: 1rem !important
+    }
+    .mr-sm-3,
+    .mx-sm-3 {
+        margin-right: 1rem !important
+    }
+    .mb-sm-3,
+    .my-sm-3 {
+        margin-bottom: 1rem !important
+    }
+    .ml-sm-3,
+    .mx-sm-3 {
+        margin-left: 1rem !important
+    }
+    .m-sm-4 {
+        margin: 1.5rem !important
+    }
+    .mt-sm-4,
+    .my-sm-4 {
+        margin-top: 1.5rem !important
+    }
+    .mr-sm-4,
+    .mx-sm-4 {
+        margin-right: 1.5rem !important
+    }
+    .mb-sm-4,
+    .my-sm-4 {
+        margin-bottom: 1.5rem !important
+    }
+    .ml-sm-4,
+    .mx-sm-4 {
+        margin-left: 1.5rem !important
+    }
+    .m-sm-5 {
+        margin: 3rem !important
+    }
+    .mt-sm-5,
+    .my-sm-5 {
+        margin-top: 3rem !important
+    }
+    .mr-sm-5,
+    .mx-sm-5 {
+        margin-right: 3rem !important
+    }
+    .mb-sm-5,
+    .my-sm-5 {
+        margin-bottom: 3rem !important
+    }
+    .ml-sm-5,
+    .mx-sm-5 {
+        margin-left: 3rem !important
+    }
+    .p-sm-0 {
+        padding: 0 !important
+    }
+    .pt-sm-0,
+    .py-sm-0 {
+        padding-top: 0 !important
+    }
+    .pr-sm-0,
+    .px-sm-0 {
+        padding-right: 0 !important
+    }
+    .pb-sm-0,
+    .py-sm-0 {
+        padding-bottom: 0 !important
+    }
+    .pl-sm-0,
+    .px-sm-0 {
+        padding-left: 0 !important
+    }
+    .p-sm-1 {
+        padding: .25rem !important
+    }
+    .pt-sm-1,
+    .py-sm-1 {
+        padding-top: .25rem !important
+    }
+    .pr-sm-1,
+    .px-sm-1 {
+        padding-right: .25rem !important
+    }
+    .pb-sm-1,
+    .py-sm-1 {
+        padding-bottom: .25rem !important
+    }
+    .pl-sm-1,
+    .px-sm-1 {
+        padding-left: .25rem !important
+    }
+    .p-sm-2 {
+        padding: .5rem !important
+    }
+    .pt-sm-2,
+    .py-sm-2 {
+        padding-top: .5rem !important
+    }
+    .pr-sm-2,
+    .px-sm-2 {
+        padding-right: .5rem !important
+    }
+    .pb-sm-2,
+    .py-sm-2 {
+        padding-bottom: .5rem !important
+    }
+    .pl-sm-2,
+    .px-sm-2 {
+        padding-left: .5rem !important
+    }
+    .p-sm-3 {
+        padding: 1rem !important
+    }
+    .pt-sm-3,
+    .py-sm-3 {
+        padding-top: 1rem !important
+    }
+    .pr-sm-3,
+    .px-sm-3 {
+        padding-right: 1rem !important
+    }
+    .pb-sm-3,
+    .py-sm-3 {
+        padding-bottom: 1rem !important
+    }
+    .pl-sm-3,
+    .px-sm-3 {
+        padding-left: 1rem !important
+    }
+    .p-sm-4 {
+        padding: 1.5rem !important
+    }
+    .pt-sm-4,
+    .py-sm-4 {
+        padding-top: 1.5rem !important
+    }
+    .pr-sm-4,
+    .px-sm-4 {
+        padding-right: 1.5rem !important
+    }
+    .pb-sm-4,
+    .py-sm-4 {
+        padding-bottom: 1.5rem !important
+    }
+    .pl-sm-4,
+    .px-sm-4 {
+        padding-left: 1.5rem !important
+    }
+    .p-sm-5 {
+        padding: 3rem !important
+    }
+    .pt-sm-5,
+    .py-sm-5 {
+        padding-top: 3rem !important
+    }
+    .pr-sm-5,
+    .px-sm-5 {
+        padding-right: 3rem !important
+    }
+    .pb-sm-5,
+    .py-sm-5 {
+        padding-bottom: 3rem !important
+    }
+    .pl-sm-5,
+    .px-sm-5 {
+        padding-left: 3rem !important
+    }
+    .m-sm-auto {
+        margin: auto !important
+    }
+    .mt-sm-auto,
+    .my-sm-auto {
+        margin-top: auto !important
+    }
+    .mr-sm-auto,
+    .mx-sm-auto {
+        margin-right: auto !important
+    }
+    .mb-sm-auto,
+    .my-sm-auto {
+        margin-bottom: auto !important
+    }
+    .ml-sm-auto,
+    .mx-sm-auto {
+        margin-left: auto !important
+    }
+}
+
+@media (min-width:768px) {
+    .m-md-0 {
+        margin: 0 !important
+    }
+    .mt-md-0,
+    .my-md-0 {
+        margin-top: 0 !important
+    }
+    .mr-md-0,
+    .mx-md-0 {
+        margin-right: 0 !important
+    }
+    .mb-md-0,
+    .my-md-0 {
+        margin-bottom: 0 !important
+    }
+    .ml-md-0,
+    .mx-md-0 {
+        margin-left: 0 !important
+    }
+    .m-md-1 {
+        margin: .25rem !important
+    }
+    .mt-md-1,
+    .my-md-1 {
+        margin-top: .25rem !important
+    }
+    .mr-md-1,
+    .mx-md-1 {
+        margin-right: .25rem !important
+    }
+    .mb-md-1,
+    .my-md-1 {
+        margin-bottom: .25rem !important
+    }
+    .ml-md-1,
+    .mx-md-1 {
+        margin-left: .25rem !important
+    }
+    .m-md-2 {
+        margin: .5rem !important
+    }
+    .mt-md-2,
+    .my-md-2 {
+        margin-top: .5rem !important
+    }
+    .mr-md-2,
+    .mx-md-2 {
+        margin-right: .5rem !important
+    }
+    .mb-md-2,
+    .my-md-2 {
+        margin-bottom: .5rem !important
+    }
+    .ml-md-2,
+    .mx-md-2 {
+        margin-left: .5rem !important
+    }
+    .m-md-3 {
+        margin: 1rem !important
+    }
+    .mt-md-3,
+    .my-md-3 {
+        margin-top: 1rem !important
+    }
+    .mr-md-3,
+    .mx-md-3 {
+        margin-right: 1rem !important
+    }
+    .mb-md-3,
+    .my-md-3 {
+        margin-bottom: 1rem !important
+    }
+    .ml-md-3,
+    .mx-md-3 {
+        margin-left: 1rem !important
+    }
+    .m-md-4 {
+        margin: 1.5rem !important
+    }
+    .mt-md-4,
+    .my-md-4 {
+        margin-top: 1.5rem !important
+    }
+    .mr-md-4,
+    .mx-md-4 {
+        margin-right: 1.5rem !important
+    }
+    .mb-md-4,
+    .my-md-4 {
+        margin-bottom: 1.5rem !important
+    }
+    .ml-md-4,
+    .mx-md-4 {
+        margin-left: 1.5rem !important
+    }
+    .m-md-5 {
+        margin: 3rem !important
+    }
+    .mt-md-5,
+    .my-md-5 {
+        margin-top: 3rem !important
+    }
+    .mr-md-5,
+    .mx-md-5 {
+        margin-right: 3rem !important
+    }
+    .mb-md-5,
+    .my-md-5 {
+        margin-bottom: 3rem !important
+    }
+    .ml-md-5,
+    .mx-md-5 {
+        margin-left: 3rem !important
+    }
+    .p-md-0 {
+        padding: 0 !important
+    }
+    .pt-md-0,
+    .py-md-0 {
+        padding-top: 0 !important
+    }
+    .pr-md-0,
+    .px-md-0 {
+        padding-right: 0 !important
+    }
+    .pb-md-0,
+    .py-md-0 {
+        padding-bottom: 0 !important
+    }
+    .pl-md-0,
+    .px-md-0 {
+        padding-left: 0 !important
+    }
+    .p-md-1 {
+        padding: .25rem !important
+    }
+    .pt-md-1,
+    .py-md-1 {
+        padding-top: .25rem !important
+    }
+    .pr-md-1,
+    .px-md-1 {
+        padding-right: .25rem !important
+    }
+    .pb-md-1,
+    .py-md-1 {
+        padding-bottom: .25rem !important
+    }
+    .pl-md-1,
+    .px-md-1 {
+        padding-left: .25rem !important
+    }
+    .p-md-2 {
+        padding: .5rem !important
+    }
+    .pt-md-2,
+    .py-md-2 {
+        padding-top: .5rem !important
+    }
+    .pr-md-2,
+    .px-md-2 {
+        padding-right: .5rem !important
+    }
+    .pb-md-2,
+    .py-md-2 {
+        padding-bottom: .5rem !important
+    }
+    .pl-md-2,
+    .px-md-2 {
+        padding-left: .5rem !important
+    }
+    .p-md-3 {
+        padding: 1rem !important
+    }
+    .pt-md-3,
+    .py-md-3 {
+        padding-top: 1rem !important
+    }
+    .pr-md-3,
+    .px-md-3 {
+        padding-right: 1rem !important
+    }
+    .pb-md-3,
+    .py-md-3 {
+        padding-bottom: 1rem !important
+    }
+    .pl-md-3,
+    .px-md-3 {
+        padding-left: 1rem !important
+    }
+    .p-md-4 {
+        padding: 1.5rem !important
+    }
+    .pt-md-4,
+    .py-md-4 {
+        padding-top: 1.5rem !important
+    }
+    .pr-md-4,
+    .px-md-4 {
+        padding-right: 1.5rem !important
+    }
+    .pb-md-4,
+    .py-md-4 {
+        padding-bottom: 1.5rem !important
+    }
+    .pl-md-4,
+    .px-md-4 {
+        padding-left: 1.5rem !important
+    }
+    .p-md-5 {
+        padding: 3rem !important
+    }
+    .pt-md-5,
+    .py-md-5 {
+        padding-top: 3rem !important
+    }
+    .pr-md-5,
+    .px-md-5 {
+        padding-right: 3rem !important
+    }
+    .pb-md-5,
+    .py-md-5 {
+        padding-bottom: 3rem !important
+    }
+    .pl-md-5,
+    .px-md-5 {
+        padding-left: 3rem !important
+    }
+    .m-md-auto {
+        margin: auto !important
+    }
+    .mt-md-auto,
+    .my-md-auto {
+        margin-top: auto !important
+    }
+    .mr-md-auto,
+    .mx-md-auto {
+        margin-right: auto !important
+    }
+    .mb-md-auto,
+    .my-md-auto {
+        margin-bottom: auto !important
+    }
+    .ml-md-auto,
+    .mx-md-auto {
+        margin-left: auto !important
+    }
+}
+
+@media (min-width:992px) {
+    .m-lg-0 {
+        margin: 0 !important
+    }
+    .mt-lg-0,
+    .my-lg-0 {
+        margin-top: 0 !important
+    }
+    .mr-lg-0,
+    .mx-lg-0 {
+        margin-right: 0 !important
+    }
+    .mb-lg-0,
+    .my-lg-0 {
+        margin-bottom: 0 !important
+    }
+    .ml-lg-0,
+    .mx-lg-0 {
+        margin-left: 0 !important
+    }
+    .m-lg-1 {
+        margin: .25rem !important
+    }
+    .mt-lg-1,
+    .my-lg-1 {
+        margin-top: .25rem !important
+    }
+    .mr-lg-1,
+    .mx-lg-1 {
+        margin-right: .25rem !important
+    }
+    .mb-lg-1,
+    .my-lg-1 {
+        margin-bottom: .25rem !important
+    }
+    .ml-lg-1,
+    .mx-lg-1 {
+        margin-left: .25rem !important
+    }
+    .m-lg-2 {
+        margin: .5rem !important
+    }
+    .mt-lg-2,
+    .my-lg-2 {
+        margin-top: .5rem !important
+    }
+    .mr-lg-2,
+    .mx-lg-2 {
+        margin-right: .5rem !important
+    }
+    .mb-lg-2,
+    .my-lg-2 {
+        margin-bottom: .5rem !important
+    }
+    .ml-lg-2,
+    .mx-lg-2 {
+        margin-left: .5rem !important
+    }
+    .m-lg-3 {
+        margin: 1rem !important
+    }
+    .mt-lg-3,
+    .my-lg-3 {
+        margin-top: 1rem !important
+    }
+    .mr-lg-3,
+    .mx-lg-3 {
+        margin-right: 1rem !important
+    }
+    .mb-lg-3,
+    .my-lg-3 {
+        margin-bottom: 1rem !important
+    }
+    .ml-lg-3,
+    .mx-lg-3 {
+        margin-left: 1rem !important
+    }
+    .m-lg-4 {
+        margin: 1.5rem !important
+    }
+    .mt-lg-4,
+    .my-lg-4 {
+        margin-top: 1.5rem !important
+    }
+    .mr-lg-4,
+    .mx-lg-4 {
+        margin-right: 1.5rem !important
+    }
+    .mb-lg-4,
+    .my-lg-4 {
+        margin-bottom: 1.5rem !important
+    }
+    .ml-lg-4,
+    .mx-lg-4 {
+        margin-left: 1.5rem !important
+    }
+    .m-lg-5 {
+        margin: 3rem !important
+    }
+    .mt-lg-5,
+    .my-lg-5 {
+        margin-top: 3rem !important
+    }
+    .mr-lg-5,
+    .mx-lg-5 {
+        margin-right: 3rem !important
+    }
+    .mb-lg-5,
+    .my-lg-5 {
+        margin-bottom: 3rem !important
+    }
+    .ml-lg-5,
+    .mx-lg-5 {
+        margin-left: 3rem !important
+    }
+    .p-lg-0 {
+        padding: 0 !important
+    }
+    .pt-lg-0,
+    .py-lg-0 {
+        padding-top: 0 !important
+    }
+    .pr-lg-0,
+    .px-lg-0 {
+        padding-right: 0 !important
+    }
+    .pb-lg-0,
+    .py-lg-0 {
+        padding-bottom: 0 !important
+    }
+    .pl-lg-0,
+    .px-lg-0 {
+        padding-left: 0 !important
+    }
+    .p-lg-1 {
+        padding: .25rem !important
+    }
+    .pt-lg-1,
+    .py-lg-1 {
+        padding-top: .25rem !important
+    }
+    .pr-lg-1,
+    .px-lg-1 {
+        padding-right: .25rem !important
+    }
+    .pb-lg-1,
+    .py-lg-1 {
+        padding-bottom: .25rem !important
+    }
+    .pl-lg-1,
+    .px-lg-1 {
+        padding-left: .25rem !important
+    }
+    .p-lg-2 {
+        padding: .5rem !important
+    }
+    .pt-lg-2,
+    .py-lg-2 {
+        padding-top: .5rem !important
+    }
+    .pr-lg-2,
+    .px-lg-2 {
+        padding-right: .5rem !important
+    }
+    .pb-lg-2,
+    .py-lg-2 {
+        padding-bottom: .5rem !important
+    }
+    .pl-lg-2,
+    .px-lg-2 {
+        padding-left: .5rem !important
+    }
+    .p-lg-3 {
+        padding: 1rem !important
+    }
+    .pt-lg-3,
+    .py-lg-3 {
+        padding-top: 1rem !important
+    }
+    .pr-lg-3,
+    .px-lg-3 {
+        padding-right: 1rem !important
+    }
+    .pb-lg-3,
+    .py-lg-3 {
+        padding-bottom: 1rem !important
+    }
+    .pl-lg-3,
+    .px-lg-3 {
+        padding-left: 1rem !important
+    }
+    .p-lg-4 {
+        padding: 1.5rem !important
+    }
+    .pt-lg-4,
+    .py-lg-4 {
+        padding-top: 1.5rem !important
+    }
+    .pr-lg-4,
+    .px-lg-4 {
+        padding-right: 1.5rem !important
+    }
+    .pb-lg-4,
+    .py-lg-4 {
+        padding-bottom: 1.5rem !important
+    }
+    .pl-lg-4,
+    .px-lg-4 {
+        padding-left: 1.5rem !important
+    }
+    .p-lg-5 {
+        padding: 3rem !important
+    }
+    .pt-lg-5,
+    .py-lg-5 {
+        padding-top: 3rem !important
+    }
+    .pr-lg-5,
+    .px-lg-5 {
+        padding-right: 3rem !important
+    }
+    .pb-lg-5,
+    .py-lg-5 {
+        padding-bottom: 3rem !important
+    }
+    .pl-lg-5,
+    .px-lg-5 {
+        padding-left: 3rem !important
+    }
+    .m-lg-auto {
+        margin: auto !important
+    }
+    .mt-lg-auto,
+    .my-lg-auto {
+        margin-top: auto !important
+    }
+    .mr-lg-auto,
+    .mx-lg-auto {
+        margin-right: auto !important
+    }
+    .mb-lg-auto,
+    .my-lg-auto {
+        margin-bottom: auto !important
+    }
+    .ml-lg-auto,
+    .mx-lg-auto {
+        margin-left: auto !important
+    }
+}
+
+@media (min-width:1200px) {
+    .m-xl-0 {
+        margin: 0 !important
+    }
+    .mt-xl-0,
+    .my-xl-0 {
+        margin-top: 0 !important
+    }
+    .mr-xl-0,
+    .mx-xl-0 {
+        margin-right: 0 !important
+    }
+    .mb-xl-0,
+    .my-xl-0 {
+        margin-bottom: 0 !important
+    }
+    .ml-xl-0,
+    .mx-xl-0 {
+        margin-left: 0 !important
+    }
+    .m-xl-1 {
+        margin: .25rem !important
+    }
+    .mt-xl-1,
+    .my-xl-1 {
+        margin-top: .25rem !important
+    }
+    .mr-xl-1,
+    .mx-xl-1 {
+        margin-right: .25rem !important
+    }
+    .mb-xl-1,
+    .my-xl-1 {
+        margin-bottom: .25rem !important
+    }
+    .ml-xl-1,
+    .mx-xl-1 {
+        margin-left: .25rem !important
+    }
+    .m-xl-2 {
+        margin: .5rem !important
+    }
+    .mt-xl-2,
+    .my-xl-2 {
+        margin-top: .5rem !important
+    }
+    .mr-xl-2,
+    .mx-xl-2 {
+        margin-right: .5rem !important
+    }
+    .mb-xl-2,
+    .my-xl-2 {
+        margin-bottom: .5rem !important
+    }
+    .ml-xl-2,
+    .mx-xl-2 {
+        margin-left: .5rem !important
+    }
+    .m-xl-3 {
+        margin: 1rem !important
+    }
+    .mt-xl-3,
+    .my-xl-3 {
+        margin-top: 1rem !important
+    }
+    .mr-xl-3,
+    .mx-xl-3 {
+        margin-right: 1rem !important
+    }
+    .mb-xl-3,
+    .my-xl-3 {
+        margin-bottom: 1rem !important
+    }
+    .ml-xl-3,
+    .mx-xl-3 {
+        margin-left: 1rem !important
+    }
+    .m-xl-4 {
+        margin: 1.5rem !important
+    }
+    .mt-xl-4,
+    .my-xl-4 {
+        margin-top: 1.5rem !important
+    }
+    .mr-xl-4,
+    .mx-xl-4 {
+        margin-right: 1.5rem !important
+    }
+    .mb-xl-4,
+    .my-xl-4 {
+        margin-bottom: 1.5rem !important
+    }
+    .ml-xl-4,
+    .mx-xl-4 {
+        margin-left: 1.5rem !important
+    }
+    .m-xl-5 {
+        margin: 3rem !important
+    }
+    .mt-xl-5,
+    .my-xl-5 {
+        margin-top: 3rem !important
+    }
+    .mr-xl-5,
+    .mx-xl-5 {
+        margin-right: 3rem !important
+    }
+    .mb-xl-5,
+    .my-xl-5 {
+        margin-bottom: 3rem !important
+    }
+    .ml-xl-5,
+    .mx-xl-5 {
+        margin-left: 3rem !important
+    }
+    .p-xl-0 {
+        padding: 0 !important
+    }
+    .pt-xl-0,
+    .py-xl-0 {
+        padding-top: 0 !important
+    }
+    .pr-xl-0,
+    .px-xl-0 {
+        padding-right: 0 !important
+    }
+    .pb-xl-0,
+    .py-xl-0 {
+        padding-bottom: 0 !important
+    }
+    .pl-xl-0,
+    .px-xl-0 {
+        padding-left: 0 !important
+    }
+    .p-xl-1 {
+        padding: .25rem !important
+    }
+    .pt-xl-1,
+    .py-xl-1 {
+        padding-top: .25rem !important
+    }
+    .pr-xl-1,
+    .px-xl-1 {
+        padding-right: .25rem !important
+    }
+    .pb-xl-1,
+    .py-xl-1 {
+        padding-bottom: .25rem !important
+    }
+    .pl-xl-1,
+    .px-xl-1 {
+        padding-left: .25rem !important
+    }
+    .p-xl-2 {
+        padding: .5rem !important
+    }
+    .pt-xl-2,
+    .py-xl-2 {
+        padding-top: .5rem !important
+    }
+    .pr-xl-2,
+    .px-xl-2 {
+        padding-right: .5rem !important
+    }
+    .pb-xl-2,
+    .py-xl-2 {
+        padding-bottom: .5rem !important
+    }
+    .pl-xl-2,
+    .px-xl-2 {
+        padding-left: .5rem !important
+    }
+    .p-xl-3 {
+        padding: 1rem !important
+    }
+    .pt-xl-3,
+    .py-xl-3 {
+        padding-top: 1rem !important
+    }
+    .pr-xl-3,
+    .px-xl-3 {
+        padding-right: 1rem !important
+    }
+    .pb-xl-3,
+    .py-xl-3 {
+        padding-bottom: 1rem !important
+    }
+    .pl-xl-3,
+    .px-xl-3 {
+        padding-left: 1rem !important
+    }
+    .p-xl-4 {
+        padding: 1.5rem !important
+    }
+    .pt-xl-4,
+    .py-xl-4 {
+        padding-top: 1.5rem !important
+    }
+    .pr-xl-4,
+    .px-xl-4 {
+        padding-right: 1.5rem !important
+    }
+    .pb-xl-4,
+    .py-xl-4 {
+        padding-bottom: 1.5rem !important
+    }
+    .pl-xl-4,
+    .px-xl-4 {
+        padding-left: 1.5rem !important
+    }
+    .p-xl-5 {
+        padding: 3rem !important
+    }
+    .pt-xl-5,
+    .py-xl-5 {
+        padding-top: 3rem !important
+    }
+    .pr-xl-5,
+    .px-xl-5 {
+        padding-right: 3rem !important
+    }
+    .pb-xl-5,
+    .py-xl-5 {
+        padding-bottom: 3rem !important
+    }
+    .pl-xl-5,
+    .px-xl-5 {
+        padding-left: 3rem !important
+    }
+    .m-xl-auto {
+        margin: auto !important
+    }
+    .mt-xl-auto,
+    .my-xl-auto {
+        margin-top: auto !important
+    }
+    .mr-xl-auto,
+    .mx-xl-auto {
+        margin-right: auto !important
+    }
+    .mb-xl-auto,
+    .my-xl-auto {
+        margin-bottom: auto !important
+    }
+    .ml-xl-auto,
+    .mx-xl-auto {
+        margin-left: auto !important
+    }
+}
+
+.text-justify {
+    text-align: justify !important
+}
+
+.text-nowrap {
+    white-space: nowrap !important
+}
+
+.text-truncate {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap
+}
+
+.text-left {
+    text-align: left !important
+}
+
+.text-right {
+    text-align: right !important
+}
+
+.text-center {
+    text-align: center !important
+}
+
+@media (min-width:576px) {
+    .text-sm-left {
+        text-align: left !important
+    }
+    .text-sm-right {
+        text-align: right !important
+    }
+    .text-sm-center {
+        text-align: center !important
+    }
+}
+
+@media (min-width:768px) {
+    .text-md-left {
+        text-align: left !important
+    }
+    .text-md-right {
+        text-align: right !important
+    }
+    .text-md-center {
+        text-align: center !important
+    }
+}
+
+@media (min-width:992px) {
+    .text-lg-left {
+        text-align: left !important
+    }
+    .text-lg-right {
+        text-align: right !important
+    }
+    .text-lg-center {
+        text-align: center !important
+    }
+}
+
+@media (min-width:1200px) {
+    .text-xl-left {
+        text-align: left !important
+    }
+    .text-xl-right {
+        text-align: right !important
+    }
+    .text-xl-center {
+        text-align: center !important
+    }
+}
+
+.text-lowercase {
+    text-transform: lowercase !important
+}
+
+.text-uppercase {
+    text-transform: uppercase !important
+}
+
+.text-capitalize {
+    text-transform: capitalize !important
+}
+
+.font-weight-light {
+    font-weight: 300 !important
+}
+
+.font-weight-normal {
+    font-weight: 400 !important
+}
+
+.font-weight-bold {
+    font-weight: 700 !important
+}
+
+.font-italic {
+    font-style: italic !important
+}
+
+.text-white {
+    color: #fff !important
+}
+
+.text-primary {
+    color: #007bff !important
+}
+
+a.text-primary:focus,
+a.text-primary:hover {
+    color: #0062cc !important
+}
+
+.text-secondary {
+    color: #6c757d !important
+}
+
+a.text-secondary:focus,
+a.text-secondary:hover {
+    color: #545b62 !important
+}
+
+.text-success {
+    color: #28a745 !important
+}
+
+a.text-success:focus,
+a.text-success:hover {
+    color: #1e7e34 !important
+}
+
+.text-info {
+    color: #17a2b8 !important
+}
+
+a.text-info:focus,
+a.text-info:hover {
+    color: #117a8b !important
+}
+
+.text-warning {
+    color: #ffc107 !important
+}
+
+a.text-warning:focus,
+a.text-warning:hover {
+    color: #d39e00 !important
+}
+
+.text-danger {
+    color: #dc3545 !important
+}
+
+a.text-danger:focus,
+a.text-danger:hover {
+    color: #bd2130 !important
+}
+
+.text-light {
+    color: #f8f9fa !important
+}
+
+a.text-light:focus,
+a.text-light:hover {
+    color: #dae0e5 !important
+}
+
+.text-dark {
+    color: #343a40 !important
+}
+
+a.text-dark:focus,
+a.text-dark:hover {
+    color: #1d2124 !important
+}
+
+.text-muted {
+    color: #6c757d !important
+}
+
+.text-hide {
+    font: 0/0 a;
+    color: transparent;
+    text-shadow: none;
+    background-color: transparent;
+    border: 0
+}
+
+.visible {
+    visibility: visible !important
+}
+
+.invisible {
+    visibility: hidden !important
+}
+
+@media print {
+    *,
+    ::after,
+    ::before {
+        text-shadow: none !important;
+        box-shadow: none !important
+    }
+    a:not(.btn) {
+        text-decoration: underline
+    }
+    abbr[title]::after {
+        content: " (" attr(title) ")"
+    }
+    pre {
+        white-space: pre-wrap !important
+    }
+    blockquote,
+    pre {
+        border: 1px solid #999;
+        page-break-inside: avoid
+    }
+    thead {
+        display: table-header-group
+    }
+    img,
+    tr {
+        page-break-inside: avoid
+    }
+    h2,
+    h3,
+    p {
+        orphans: 3;
+        widows: 3
+    }
+    h2,
+    h3 {
+        page-break-after: avoid
+    }
+    @page {
+        size: a3
+    }
+    body {
+        min-width: 992px !important
+    }
+    .container {
+        min-width: 992px !important
+    }
+    .navbar {
+        display: none
+    }
+    .badge {
+        border: 1px solid #000
+    }
+    .table {
+        border-collapse: collapse !important
+    }
+    .table td,
+    .table th {
+        background-color: #fff !important
+    }
+    .table-bordered td,
+    .table-bordered th {
+        border: 1px solid #ddd !important
+    }
+}
+
+/*# sourceMappingURL=bootstrap.min.css.map */

+ 74 - 0
LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/custom.css

@@ -0,0 +1,74 @@
+#loading {
+    position: fixed;
+    display: block;
+    width: 100%;
+    height: 100%;
+    top: 0;
+    left: 0;
+    text-align: center;
+    opacity: 0.7;
+    background-color: #000;
+    z-index: 99;
+}
+
+#loading-image {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform:translate(-50%, -50%);
+    z-index: 100;
+    max-width: 50px;
+}
+
+.disabled {
+    pointer-events: none;
+    opacity: 0.4;
+}
+
+.gift-box {
+    cursor: pointer;
+}
+
+#dialogNotAllow {
+    z-index: 99999;
+}
+
+input.item_number {
+    text-align: center;
+    padding: 0;
+    margin: 0;
+    border-width: 0;
+}
+
+a, a:link, a:visited, a:focus, a:hover, a:active {
+    color: #fff2bb;
+    text-decoration: none;
+    cursor: pointer;
+}
+
+    a.disabled img {
+        display: none;
+    }
+
+.pagination span {
+    padding: 3px;
+}
+
+.bg_overlay-login-error .text_box { 
+    text-align:center;
+}
+
+.box-content_phone .title_otp {
+    font-style: normal;
+    font-weight: 400;
+    font-size: 14px;
+    line-height: 18px;
+    text-align: center;
+    color: #330908;
+    padding: 0px 16px;
+}
+
+.btn-style-small {
+    width: 124px !important;
+    height: 42px !important;
+}

+ 3044 - 0
LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/font-awesome.min.css

@@ -0,0 +1,3044 @@
+/*!
+ *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+
+@font-face {
+    font-family: 'FontAwesome';
+    src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
+    src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
+    font-weight: normal;
+    font-style: normal
+}
+
+.fa {
+    display: inline-block;
+    font: normal normal normal 14px/1 FontAwesome;
+    font-size: inherit;
+    text-rendering: auto;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale
+}
+
+.fa-lg {
+    font-size: 1.33333333em;
+    line-height: .75em;
+    vertical-align: -15%
+}
+
+.fa-2x {
+    font-size: 2em
+}
+
+.fa-3x {
+    font-size: 3em
+}
+
+.fa-4x {
+    font-size: 4em
+}
+
+.fa-5x {
+    font-size: 5em
+}
+
+.fa-fw {
+    width: 1.28571429em;
+    text-align: center
+}
+
+.fa-ul {
+    padding-left: 0;
+    margin-left: 2.14285714em;
+    list-style-type: none
+}
+
+.fa-ul>li {
+    position: relative
+}
+
+.fa-li {
+    position: absolute;
+    left: -2.14285714em;
+    width: 2.14285714em;
+    top: .14285714em;
+    text-align: center
+}
+
+.fa-li.fa-lg {
+    left: -1.85714286em
+}
+
+.fa-border {
+    padding: .2em .25em .15em;
+    border: solid .08em #eee;
+    border-radius: .1em
+}
+
+.fa-pull-left {
+    float: left
+}
+
+.fa-pull-right {
+    float: right
+}
+
+.fa.fa-pull-left {
+    margin-right: .3em
+}
+
+.fa.fa-pull-right {
+    margin-left: .3em
+}
+
+.pull-right {
+    float: right
+}
+
+.pull-left {
+    float: left
+}
+
+.fa.pull-left {
+    margin-right: .3em
+}
+
+.fa.pull-right {
+    margin-left: .3em
+}
+
+.fa-spin {
+    -webkit-animation: fa-spin 2s infinite linear;
+    animation: fa-spin 2s infinite linear
+}
+
+.fa-pulse {
+    -webkit-animation: fa-spin 1s infinite steps(8);
+    animation: fa-spin 1s infinite steps(8)
+}
+
+@-webkit-keyframes fa-spin {
+    0% {
+        -webkit-transform: rotate(0deg);
+        transform: rotate(0deg)
+    }
+    100% {
+        -webkit-transform: rotate(359deg);
+        transform: rotate(359deg)
+    }
+}
+
+@keyframes fa-spin {
+    0% {
+        -webkit-transform: rotate(0deg);
+        transform: rotate(0deg)
+    }
+    100% {
+        -webkit-transform: rotate(359deg);
+        transform: rotate(359deg)
+    }
+}
+
+.fa-rotate-90 {
+    -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+    -webkit-transform: rotate(90deg);
+    -ms-transform: rotate(90deg);
+    transform: rotate(90deg)
+}
+
+.fa-rotate-180 {
+    -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+    -webkit-transform: rotate(180deg);
+    -ms-transform: rotate(180deg);
+    transform: rotate(180deg)
+}
+
+.fa-rotate-270 {
+    -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+    -webkit-transform: rotate(270deg);
+    -ms-transform: rotate(270deg);
+    transform: rotate(270deg)
+}
+
+.fa-flip-horizontal {
+    -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+    -webkit-transform: scale(-1, 1);
+    -ms-transform: scale(-1, 1);
+    transform: scale(-1, 1)
+}
+
+.fa-flip-vertical {
+    -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+    -webkit-transform: scale(1, -1);
+    -ms-transform: scale(1, -1);
+    transform: scale(1, -1)
+}
+
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+    filter: none
+}
+
+.fa-stack {
+    position: relative;
+    display: inline-block;
+    width: 2em;
+    height: 2em;
+    line-height: 2em;
+    vertical-align: middle
+}
+
+.fa-stack-1x,
+.fa-stack-2x {
+    position: absolute;
+    left: 0;
+    width: 100%;
+    text-align: center
+}
+
+.fa-stack-1x {
+    line-height: inherit
+}
+
+.fa-stack-2x {
+    font-size: 2em
+}
+
+.fa-inverse {
+    color: #fff
+}
+
+.fa-glass:before {
+    content: "\f000"
+}
+
+.fa-music:before {
+    content: "\f001"
+}
+
+.fa-search:before {
+    content: "\f002"
+}
+
+.fa-envelope-o:before {
+    content: "\f003"
+}
+
+.fa-heart:before {
+    content: "\f004"
+}
+
+.fa-star:before {
+    content: "\f005"
+}
+
+.fa-star-o:before {
+    content: "\f006"
+}
+
+.fa-user:before {
+    content: "\f007"
+}
+
+.fa-film:before {
+    content: "\f008"
+}
+
+.fa-th-large:before {
+    content: "\f009"
+}
+
+.fa-th:before {
+    content: "\f00a"
+}
+
+.fa-th-list:before {
+    content: "\f00b"
+}
+
+.fa-check:before {
+    content: "\f00c"
+}
+
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+    content: "\f00d"
+}
+
+.fa-search-plus:before {
+    content: "\f00e"
+}
+
+.fa-search-minus:before {
+    content: "\f010"
+}
+
+.fa-power-off:before {
+    content: "\f011"
+}
+
+.fa-signal:before {
+    content: "\f012"
+}
+
+.fa-gear:before,
+.fa-cog:before {
+    content: "\f013"
+}
+
+.fa-trash-o:before {
+    content: "\f014"
+}
+
+.fa-home:before {
+    content: "\f015"
+}
+
+.fa-file-o:before {
+    content: "\f016"
+}
+
+.fa-clock-o:before {
+    content: "\f017"
+}
+
+.fa-road:before {
+    content: "\f018"
+}
+
+.fa-download:before {
+    content: "\f019"
+}
+
+.fa-arrow-circle-o-down:before {
+    content: "\f01a"
+}
+
+.fa-arrow-circle-o-up:before {
+    content: "\f01b"
+}
+
+.fa-inbox:before {
+    content: "\f01c"
+}
+
+.fa-play-circle-o:before {
+    content: "\f01d"
+}
+
+.fa-rotate-right:before,
+.fa-repeat:before {
+    content: "\f01e"
+}
+
+.fa-refresh:before {
+    content: "\f021"
+}
+
+.fa-list-alt:before {
+    content: "\f022"
+}
+
+.fa-lock:before {
+    content: "\f023"
+}
+
+.fa-flag:before {
+    content: "\f024"
+}
+
+.fa-headphones:before {
+    content: "\f025"
+}
+
+.fa-volume-off:before {
+    content: "\f026"
+}
+
+.fa-volume-down:before {
+    content: "\f027"
+}
+
+.fa-volume-up:before {
+    content: "\f028"
+}
+
+.fa-qrcode:before {
+    content: "\f029"
+}
+
+.fa-barcode:before {
+    content: "\f02a"
+}
+
+.fa-tag:before {
+    content: "\f02b"
+}
+
+.fa-tags:before {
+    content: "\f02c"
+}
+
+.fa-book:before {
+    content: "\f02d"
+}
+
+.fa-bookmark:before {
+    content: "\f02e"
+}
+
+.fa-print:before {
+    content: "\f02f"
+}
+
+.fa-camera:before {
+    content: "\f030"
+}
+
+.fa-font:before {
+    content: "\f031"
+}
+
+.fa-bold:before {
+    content: "\f032"
+}
+
+.fa-italic:before {
+    content: "\f033"
+}
+
+.fa-text-height:before {
+    content: "\f034"
+}
+
+.fa-text-width:before {
+    content: "\f035"
+}
+
+.fa-align-left:before {
+    content: "\f036"
+}
+
+.fa-align-center:before {
+    content: "\f037"
+}
+
+.fa-align-right:before {
+    content: "\f038"
+}
+
+.fa-align-justify:before {
+    content: "\f039"
+}
+
+.fa-list:before {
+    content: "\f03a"
+}
+
+.fa-dedent:before,
+.fa-outdent:before {
+    content: "\f03b"
+}
+
+.fa-indent:before {
+    content: "\f03c"
+}
+
+.fa-video-camera:before {
+    content: "\f03d"
+}
+
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+    content: "\f03e"
+}
+
+.fa-pencil:before {
+    content: "\f040"
+}
+
+.fa-map-marker:before {
+    content: "\f041"
+}
+
+.fa-adjust:before {
+    content: "\f042"
+}
+
+.fa-tint:before {
+    content: "\f043"
+}
+
+.fa-edit:before,
+.fa-pencil-square-o:before {
+    content: "\f044"
+}
+
+.fa-share-square-o:before {
+    content: "\f045"
+}
+
+.fa-check-square-o:before {
+    content: "\f046"
+}
+
+.fa-arrows:before {
+    content: "\f047"
+}
+
+.fa-step-backward:before {
+    content: "\f048"
+}
+
+.fa-fast-backward:before {
+    content: "\f049"
+}
+
+.fa-backward:before {
+    content: "\f04a"
+}
+
+.fa-play:before {
+    content: "\f04b"
+}
+
+.fa-pause:before {
+    content: "\f04c"
+}
+
+.fa-stop:before {
+    content: "\f04d"
+}
+
+.fa-forward:before {
+    content: "\f04e"
+}
+
+.fa-fast-forward:before {
+    content: "\f050"
+}
+
+.fa-step-forward:before {
+    content: "\f051"
+}
+
+.fa-eject:before {
+    content: "\f052"
+}
+
+.fa-chevron-left:before {
+    content: "\f053"
+}
+
+.fa-chevron-right:before {
+    content: "\f054"
+}
+
+.fa-plus-circle:before {
+    content: "\f055"
+}
+
+.fa-minus-circle:before {
+    content: "\f056"
+}
+
+.fa-times-circle:before {
+    content: "\f057"
+}
+
+.fa-check-circle:before {
+    content: "\f058"
+}
+
+.fa-question-circle:before {
+    content: "\f059"
+}
+
+.fa-info-circle:before {
+    content: "\f05a"
+}
+
+.fa-crosshairs:before {
+    content: "\f05b"
+}
+
+.fa-times-circle-o:before {
+    content: "\f05c"
+}
+
+.fa-check-circle-o:before {
+    content: "\f05d"
+}
+
+.fa-ban:before {
+    content: "\f05e"
+}
+
+.fa-arrow-left:before {
+    content: "\f060"
+}
+
+.fa-arrow-right:before {
+    content: "\f061"
+}
+
+.fa-arrow-up:before {
+    content: "\f062"
+}
+
+.fa-arrow-down:before {
+    content: "\f063"
+}
+
+.fa-mail-forward:before,
+.fa-share:before {
+    content: "\f064"
+}
+
+.fa-expand:before {
+    content: "\f065"
+}
+
+.fa-compress:before {
+    content: "\f066"
+}
+
+.fa-plus:before {
+    content: "\f067"
+}
+
+.fa-minus:before {
+    content: "\f068"
+}
+
+.fa-asterisk:before {
+    content: "\f069"
+}
+
+.fa-exclamation-circle:before {
+    content: "\f06a"
+}
+
+.fa-gift:before {
+    content: "\f06b"
+}
+
+.fa-leaf:before {
+    content: "\f06c"
+}
+
+.fa-fire:before {
+    content: "\f06d"
+}
+
+.fa-eye:before {
+    content: "\f06e"
+}
+
+.fa-eye-slash:before {
+    content: "\f070"
+}
+
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+    content: "\f071"
+}
+
+.fa-plane:before {
+    content: "\f072"
+}
+
+.fa-calendar:before {
+    content: "\f073"
+}
+
+.fa-random:before {
+    content: "\f074"
+}
+
+.fa-comment:before {
+    content: "\f075"
+}
+
+.fa-magnet:before {
+    content: "\f076"
+}
+
+.fa-chevron-up:before {
+    content: "\f077"
+}
+
+.fa-chevron-down:before {
+    content: "\f078"
+}
+
+.fa-retweet:before {
+    content: "\f079"
+}
+
+.fa-shopping-cart:before {
+    content: "\f07a"
+}
+
+.fa-folder:before {
+    content: "\f07b"
+}
+
+.fa-folder-open:before {
+    content: "\f07c"
+}
+
+.fa-arrows-v:before {
+    content: "\f07d"
+}
+
+.fa-arrows-h:before {
+    content: "\f07e"
+}
+
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+    content: "\f080"
+}
+
+.fa-twitter-square:before {
+    content: "\f081"
+}
+
+.fa-facebook-square:before {
+    content: "\f082"
+}
+
+.fa-camera-retro:before {
+    content: "\f083"
+}
+
+.fa-key:before {
+    content: "\f084"
+}
+
+.fa-gears:before,
+.fa-cogs:before {
+    content: "\f085"
+}
+
+.fa-comments:before {
+    content: "\f086"
+}
+
+.fa-thumbs-o-up:before {
+    content: "\f087"
+}
+
+.fa-thumbs-o-down:before {
+    content: "\f088"
+}
+
+.fa-star-half:before {
+    content: "\f089"
+}
+
+.fa-heart-o:before {
+    content: "\f08a"
+}
+
+.fa-sign-out:before {
+    content: "\f08b"
+}
+
+.fa-linkedin-square:before {
+    content: "\f08c"
+}
+
+.fa-thumb-tack:before {
+    content: "\f08d"
+}
+
+.fa-external-link:before {
+    content: "\f08e"
+}
+
+.fa-sign-in:before {
+    content: "\f090"
+}
+
+.fa-trophy:before {
+    content: "\f091"
+}
+
+.fa-github-square:before {
+    content: "\f092"
+}
+
+.fa-upload:before {
+    content: "\f093"
+}
+
+.fa-lemon-o:before {
+    content: "\f094"
+}
+
+.fa-phone:before {
+    content: "\f095"
+}
+
+.fa-square-o:before {
+    content: "\f096"
+}
+
+.fa-bookmark-o:before {
+    content: "\f097"
+}
+
+.fa-phone-square:before {
+    content: "\f098"
+}
+
+.fa-twitter:before {
+    content: "\f099"
+}
+
+.fa-facebook-f:before,
+.fa-facebook:before {
+    content: "\f09a"
+}
+
+.fa-github:before {
+    content: "\f09b"
+}
+
+.fa-unlock:before {
+    content: "\f09c"
+}
+
+.fa-credit-card:before {
+    content: "\f09d"
+}
+
+.fa-feed:before,
+.fa-rss:before {
+    content: "\f09e"
+}
+
+.fa-hdd-o:before {
+    content: "\f0a0"
+}
+
+.fa-bullhorn:before {
+    content: "\f0a1"
+}
+
+.fa-bell:before {
+    content: "\f0f3"
+}
+
+.fa-certificate:before {
+    content: "\f0a3"
+}
+
+.fa-hand-o-right:before {
+    content: "\f0a4"
+}
+
+.fa-hand-o-left:before {
+    content: "\f0a5"
+}
+
+.fa-hand-o-up:before {
+    content: "\f0a6"
+}
+
+.fa-hand-o-down:before {
+    content: "\f0a7"
+}
+
+.fa-arrow-circle-left:before {
+    content: "\f0a8"
+}
+
+.fa-arrow-circle-right:before {
+    content: "\f0a9"
+}
+
+.fa-arrow-circle-up:before {
+    content: "\f0aa"
+}
+
+.fa-arrow-circle-down:before {
+    content: "\f0ab"
+}
+
+.fa-globe:before {
+    content: "\f0ac"
+}
+
+.fa-wrench:before {
+    content: "\f0ad"
+}
+
+.fa-tasks:before {
+    content: "\f0ae"
+}
+
+.fa-filter:before {
+    content: "\f0b0"
+}
+
+.fa-briefcase:before {
+    content: "\f0b1"
+}
+
+.fa-arrows-alt:before {
+    content: "\f0b2"
+}
+
+.fa-group:before,
+.fa-users:before {
+    content: "\f0c0"
+}
+
+.fa-chain:before,
+.fa-link:before {
+    content: "\f0c1"
+}
+
+.fa-cloud:before {
+    content: "\f0c2"
+}
+
+.fa-flask:before {
+    content: "\f0c3"
+}
+
+.fa-cut:before,
+.fa-scissors:before {
+    content: "\f0c4"
+}
+
+.fa-copy:before,
+.fa-files-o:before {
+    content: "\f0c5"
+}
+
+.fa-paperclip:before {
+    content: "\f0c6"
+}
+
+.fa-save:before,
+.fa-floppy-o:before {
+    content: "\f0c7"
+}
+
+.fa-square:before {
+    content: "\f0c8"
+}
+
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+    content: "\f0c9"
+}
+
+.fa-list-ul:before {
+    content: "\f0ca"
+}
+
+.fa-list-ol:before {
+    content: "\f0cb"
+}
+
+.fa-strikethrough:before {
+    content: "\f0cc"
+}
+
+.fa-underline:before {
+    content: "\f0cd"
+}
+
+.fa-table:before {
+    content: "\f0ce"
+}
+
+.fa-magic:before {
+    content: "\f0d0"
+}
+
+.fa-truck:before {
+    content: "\f0d1"
+}
+
+.fa-pinterest:before {
+    content: "\f0d2"
+}
+
+.fa-pinterest-square:before {
+    content: "\f0d3"
+}
+
+.fa-google-plus-square:before {
+    content: "\f0d4"
+}
+
+.fa-google-plus:before {
+    content: "\f0d5"
+}
+
+.fa-money:before {
+    content: "\f0d6"
+}
+
+.fa-caret-down:before {
+    content: "\f0d7"
+}
+
+.fa-caret-up:before {
+    content: "\f0d8"
+}
+
+.fa-caret-left:before {
+    content: "\f0d9"
+}
+
+.fa-caret-right:before {
+    content: "\f0da"
+}
+
+.fa-columns:before {
+    content: "\f0db"
+}
+
+.fa-unsorted:before,
+.fa-sort:before {
+    content: "\f0dc"
+}
+
+.fa-sort-down:before,
+.fa-sort-desc:before {
+    content: "\f0dd"
+}
+
+.fa-sort-up:before,
+.fa-sort-asc:before {
+    content: "\f0de"
+}
+
+.fa-envelope:before {
+    content: "\f0e0"
+}
+
+.fa-linkedin:before {
+    content: "\f0e1"
+}
+
+.fa-rotate-left:before,
+.fa-undo:before {
+    content: "\f0e2"
+}
+
+.fa-legal:before,
+.fa-gavel:before {
+    content: "\f0e3"
+}
+
+.fa-dashboard:before,
+.fa-tachometer:before {
+    content: "\f0e4"
+}
+
+.fa-comment-o:before {
+    content: "\f0e5"
+}
+
+.fa-comments-o:before {
+    content: "\f0e6"
+}
+
+.fa-flash:before,
+.fa-bolt:before {
+    content: "\f0e7"
+}
+
+.fa-sitemap:before {
+    content: "\f0e8"
+}
+
+.fa-umbrella:before {
+    content: "\f0e9"
+}
+
+.fa-paste:before,
+.fa-clipboard:before {
+    content: "\f0ea"
+}
+
+.fa-lightbulb-o:before {
+    content: "\f0eb"
+}
+
+.fa-exchange:before {
+    content: "\f0ec"
+}
+
+.fa-cloud-download:before {
+    content: "\f0ed"
+}
+
+.fa-cloud-upload:before {
+    content: "\f0ee"
+}
+
+.fa-user-md:before {
+    content: "\f0f0"
+}
+
+.fa-stethoscope:before {
+    content: "\f0f1"
+}
+
+.fa-suitcase:before {
+    content: "\f0f2"
+}
+
+.fa-bell-o:before {
+    content: "\f0a2"
+}
+
+.fa-coffee:before {
+    content: "\f0f4"
+}
+
+.fa-cutlery:before {
+    content: "\f0f5"
+}
+
+.fa-file-text-o:before {
+    content: "\f0f6"
+}
+
+.fa-building-o:before {
+    content: "\f0f7"
+}
+
+.fa-hospital-o:before {
+    content: "\f0f8"
+}
+
+.fa-ambulance:before {
+    content: "\f0f9"
+}
+
+.fa-medkit:before {
+    content: "\f0fa"
+}
+
+.fa-fighter-jet:before {
+    content: "\f0fb"
+}
+
+.fa-beer:before {
+    content: "\f0fc"
+}
+
+.fa-h-square:before {
+    content: "\f0fd"
+}
+
+.fa-plus-square:before {
+    content: "\f0fe"
+}
+
+.fa-angle-double-left:before {
+    content: "\f100"
+}
+
+.fa-angle-double-right:before {
+    content: "\f101"
+}
+
+.fa-angle-double-up:before {
+    content: "\f102"
+}
+
+.fa-angle-double-down:before {
+    content: "\f103"
+}
+
+.fa-angle-left:before {
+    content: "\f104"
+}
+
+.fa-angle-right:before {
+    content: "\f105"
+}
+
+.fa-angle-up:before {
+    content: "\f106"
+}
+
+.fa-angle-down:before {
+    content: "\f107"
+}
+
+.fa-desktop:before {
+    content: "\f108"
+}
+
+.fa-laptop:before {
+    content: "\f109"
+}
+
+.fa-tablet:before {
+    content: "\f10a"
+}
+
+.fa-mobile-phone:before,
+.fa-mobile:before {
+    content: "\f10b"
+}
+
+.fa-circle-o:before {
+    content: "\f10c"
+}
+
+.fa-quote-left:before {
+    content: "\f10d"
+}
+
+.fa-quote-right:before {
+    content: "\f10e"
+}
+
+.fa-spinner:before {
+    content: "\f110"
+}
+
+.fa-circle:before {
+    content: "\f111"
+}
+
+.fa-mail-reply:before,
+.fa-reply:before {
+    content: "\f112"
+}
+
+.fa-github-alt:before {
+    content: "\f113"
+}
+
+.fa-folder-o:before {
+    content: "\f114"
+}
+
+.fa-folder-open-o:before {
+    content: "\f115"
+}
+
+.fa-smile-o:before {
+    content: "\f118"
+}
+
+.fa-frown-o:before {
+    content: "\f119"
+}
+
+.fa-meh-o:before {
+    content: "\f11a"
+}
+
+.fa-gamepad:before {
+    content: "\f11b"
+}
+
+.fa-keyboard-o:before {
+    content: "\f11c"
+}
+
+.fa-flag-o:before {
+    content: "\f11d"
+}
+
+.fa-flag-checkered:before {
+    content: "\f11e"
+}
+
+.fa-terminal:before {
+    content: "\f120"
+}
+
+.fa-code:before {
+    content: "\f121"
+}
+
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+    content: "\f122"
+}
+
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+    content: "\f123"
+}
+
+.fa-location-arrow:before {
+    content: "\f124"
+}
+
+.fa-crop:before {
+    content: "\f125"
+}
+
+.fa-code-fork:before {
+    content: "\f126"
+}
+
+.fa-unlink:before,
+.fa-chain-broken:before {
+    content: "\f127"
+}
+
+.fa-question:before {
+    content: "\f128"
+}
+
+.fa-info:before {
+    content: "\f129"
+}
+
+.fa-exclamation:before {
+    content: "\f12a"
+}
+
+.fa-superscript:before {
+    content: "\f12b"
+}
+
+.fa-subscript:before {
+    content: "\f12c"
+}
+
+.fa-eraser:before {
+    content: "\f12d"
+}
+
+.fa-puzzle-piece:before {
+    content: "\f12e"
+}
+
+.fa-microphone:before {
+    content: "\f130"
+}
+
+.fa-microphone-slash:before {
+    content: "\f131"
+}
+
+.fa-shield:before {
+    content: "\f132"
+}
+
+.fa-calendar-o:before {
+    content: "\f133"
+}
+
+.fa-fire-extinguisher:before {
+    content: "\f134"
+}
+
+.fa-rocket:before {
+    content: "\f135"
+}
+
+.fa-maxcdn:before {
+    content: "\f136"
+}
+
+.fa-chevron-circle-left:before {
+    content: "\f137"
+}
+
+.fa-chevron-circle-right:before {
+    content: "\f138"
+}
+
+.fa-chevron-circle-up:before {
+    content: "\f139"
+}
+
+.fa-chevron-circle-down:before {
+    content: "\f13a"
+}
+
+.fa-html5:before {
+    content: "\f13b"
+}
+
+.fa-css3:before {
+    content: "\f13c"
+}
+
+.fa-anchor:before {
+    content: "\f13d"
+}
+
+.fa-unlock-alt:before {
+    content: "\f13e"
+}
+
+.fa-bullseye:before {
+    content: "\f140"
+}
+
+.fa-ellipsis-h:before {
+    content: "\f141"
+}
+
+.fa-ellipsis-v:before {
+    content: "\f142"
+}
+
+.fa-rss-square:before {
+    content: "\f143"
+}
+
+.fa-play-circle:before {
+    content: "\f144"
+}
+
+.fa-ticket:before {
+    content: "\f145"
+}
+
+.fa-minus-square:before {
+    content: "\f146"
+}
+
+.fa-minus-square-o:before {
+    content: "\f147"
+}
+
+.fa-level-up:before {
+    content: "\f148"
+}
+
+.fa-level-down:before {
+    content: "\f149"
+}
+
+.fa-check-square:before {
+    content: "\f14a"
+}
+
+.fa-pencil-square:before {
+    content: "\f14b"
+}
+
+.fa-external-link-square:before {
+    content: "\f14c"
+}
+
+.fa-share-square:before {
+    content: "\f14d"
+}
+
+.fa-compass:before {
+    content: "\f14e"
+}
+
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+    content: "\f150"
+}
+
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+    content: "\f151"
+}
+
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+    content: "\f152"
+}
+
+.fa-euro:before,
+.fa-eur:before {
+    content: "\f153"
+}
+
+.fa-gbp:before {
+    content: "\f154"
+}
+
+.fa-dollar:before,
+.fa-usd:before {
+    content: "\f155"
+}
+
+.fa-rupee:before,
+.fa-inr:before {
+    content: "\f156"
+}
+
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+    content: "\f157"
+}
+
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+    content: "\f158"
+}
+
+.fa-won:before,
+.fa-krw:before {
+    content: "\f159"
+}
+
+.fa-bitcoin:before,
+.fa-btc:before {
+    content: "\f15a"
+}
+
+.fa-file:before {
+    content: "\f15b"
+}
+
+.fa-file-text:before {
+    content: "\f15c"
+}
+
+.fa-sort-alpha-asc:before {
+    content: "\f15d"
+}
+
+.fa-sort-alpha-desc:before {
+    content: "\f15e"
+}
+
+.fa-sort-amount-asc:before {
+    content: "\f160"
+}
+
+.fa-sort-amount-desc:before {
+    content: "\f161"
+}
+
+.fa-sort-numeric-asc:before {
+    content: "\f162"
+}
+
+.fa-sort-numeric-desc:before {
+    content: "\f163"
+}
+
+.fa-thumbs-up:before {
+    content: "\f164"
+}
+
+.fa-thumbs-down:before {
+    content: "\f165"
+}
+
+.fa-youtube-square:before {
+    content: "\f166"
+}
+
+.fa-youtube:before {
+    content: "\f167"
+}
+
+.fa-xing:before {
+    content: "\f168"
+}
+
+.fa-xing-square:before {
+    content: "\f169"
+}
+
+.fa-youtube-play:before {
+    content: "\f16a"
+}
+
+.fa-dropbox:before {
+    content: "\f16b"
+}
+
+.fa-stack-overflow:before {
+    content: "\f16c"
+}
+
+.fa-instagram:before {
+    content: "\f16d"
+}
+
+.fa-flickr:before {
+    content: "\f16e"
+}
+
+.fa-adn:before {
+    content: "\f170"
+}
+
+.fa-bitbucket:before {
+    content: "\f171"
+}
+
+.fa-bitbucket-square:before {
+    content: "\f172"
+}
+
+.fa-tumblr:before {
+    content: "\f173"
+}
+
+.fa-tumblr-square:before {
+    content: "\f174"
+}
+
+.fa-long-arrow-down:before {
+    content: "\f175"
+}
+
+.fa-long-arrow-up:before {
+    content: "\f176"
+}
+
+.fa-long-arrow-left:before {
+    content: "\f177"
+}
+
+.fa-long-arrow-right:before {
+    content: "\f178"
+}
+
+.fa-apple:before {
+    content: "\f179"
+}
+
+.fa-windows:before {
+    content: "\f17a"
+}
+
+.fa-android:before {
+    content: "\f17b"
+}
+
+.fa-linux:before {
+    content: "\f17c"
+}
+
+.fa-dribbble:before {
+    content: "\f17d"
+}
+
+.fa-skype:before {
+    content: "\f17e"
+}
+
+.fa-foursquare:before {
+    content: "\f180"
+}
+
+.fa-trello:before {
+    content: "\f181"
+}
+
+.fa-female:before {
+    content: "\f182"
+}
+
+.fa-male:before {
+    content: "\f183"
+}
+
+.fa-gittip:before,
+.fa-gratipay:before {
+    content: "\f184"
+}
+
+.fa-sun-o:before {
+    content: "\f185"
+}
+
+.fa-moon-o:before {
+    content: "\f186"
+}
+
+.fa-archive:before {
+    content: "\f187"
+}
+
+.fa-bug:before {
+    content: "\f188"
+}
+
+.fa-vk:before {
+    content: "\f189"
+}
+
+.fa-weibo:before {
+    content: "\f18a"
+}
+
+.fa-renren:before {
+    content: "\f18b"
+}
+
+.fa-pagelines:before {
+    content: "\f18c"
+}
+
+.fa-stack-exchange:before {
+    content: "\f18d"
+}
+
+.fa-arrow-circle-o-right:before {
+    content: "\f18e"
+}
+
+.fa-arrow-circle-o-left:before {
+    content: "\f190"
+}
+
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+    content: "\f191"
+}
+
+.fa-dot-circle-o:before {
+    content: "\f192"
+}
+
+.fa-wheelchair:before {
+    content: "\f193"
+}
+
+.fa-vimeo-square:before {
+    content: "\f194"
+}
+
+.fa-turkish-lira:before,
+.fa-try:before {
+    content: "\f195"
+}
+
+.fa-plus-square-o:before {
+    content: "\f196"
+}
+
+.fa-space-shuttle:before {
+    content: "\f197"
+}
+
+.fa-slack:before {
+    content: "\f198"
+}
+
+.fa-envelope-square:before {
+    content: "\f199"
+}
+
+.fa-wordpress:before {
+    content: "\f19a"
+}
+
+.fa-openid:before {
+    content: "\f19b"
+}
+
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+    content: "\f19c"
+}
+
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+    content: "\f19d"
+}
+
+.fa-yahoo:before {
+    content: "\f19e"
+}
+
+.fa-google:before {
+    content: "\f1a0"
+}
+
+.fa-reddit:before {
+    content: "\f1a1"
+}
+
+.fa-reddit-square:before {
+    content: "\f1a2"
+}
+
+.fa-stumbleupon-circle:before {
+    content: "\f1a3"
+}
+
+.fa-stumbleupon:before {
+    content: "\f1a4"
+}
+
+.fa-delicious:before {
+    content: "\f1a5"
+}
+
+.fa-digg:before {
+    content: "\f1a6"
+}
+
+.fa-pied-piper-pp:before {
+    content: "\f1a7"
+}
+
+.fa-pied-piper-alt:before {
+    content: "\f1a8"
+}
+
+.fa-drupal:before {
+    content: "\f1a9"
+}
+
+.fa-joomla:before {
+    content: "\f1aa"
+}
+
+.fa-language:before {
+    content: "\f1ab"
+}
+
+.fa-fax:before {
+    content: "\f1ac"
+}
+
+.fa-building:before {
+    content: "\f1ad"
+}
+
+.fa-child:before {
+    content: "\f1ae"
+}
+
+.fa-paw:before {
+    content: "\f1b0"
+}
+
+.fa-spoon:before {
+    content: "\f1b1"
+}
+
+.fa-cube:before {
+    content: "\f1b2"
+}
+
+.fa-cubes:before {
+    content: "\f1b3"
+}
+
+.fa-behance:before {
+    content: "\f1b4"
+}
+
+.fa-behance-square:before {
+    content: "\f1b5"
+}
+
+.fa-steam:before {
+    content: "\f1b6"
+}
+
+.fa-steam-square:before {
+    content: "\f1b7"
+}
+
+.fa-recycle:before {
+    content: "\f1b8"
+}
+
+.fa-automobile:before,
+.fa-car:before {
+    content: "\f1b9"
+}
+
+.fa-cab:before,
+.fa-taxi:before {
+    content: "\f1ba"
+}
+
+.fa-tree:before {
+    content: "\f1bb"
+}
+
+.fa-spotify:before {
+    content: "\f1bc"
+}
+
+.fa-deviantart:before {
+    content: "\f1bd"
+}
+
+.fa-soundcloud:before {
+    content: "\f1be"
+}
+
+.fa-database:before {
+    content: "\f1c0"
+}
+
+.fa-file-pdf-o:before {
+    content: "\f1c1"
+}
+
+.fa-file-word-o:before {
+    content: "\f1c2"
+}
+
+.fa-file-excel-o:before {
+    content: "\f1c3"
+}
+
+.fa-file-powerpoint-o:before {
+    content: "\f1c4"
+}
+
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+    content: "\f1c5"
+}
+
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+    content: "\f1c6"
+}
+
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+    content: "\f1c7"
+}
+
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+    content: "\f1c8"
+}
+
+.fa-file-code-o:before {
+    content: "\f1c9"
+}
+
+.fa-vine:before {
+    content: "\f1ca"
+}
+
+.fa-codepen:before {
+    content: "\f1cb"
+}
+
+.fa-jsfiddle:before {
+    content: "\f1cc"
+}
+
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+    content: "\f1cd"
+}
+
+.fa-circle-o-notch:before {
+    content: "\f1ce"
+}
+
+.fa-ra:before,
+.fa-resistance:before,
+.fa-rebel:before {
+    content: "\f1d0"
+}
+
+.fa-ge:before,
+.fa-empire:before {
+    content: "\f1d1"
+}
+
+.fa-git-square:before {
+    content: "\f1d2"
+}
+
+.fa-git:before {
+    content: "\f1d3"
+}
+
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+    content: "\f1d4"
+}
+
+.fa-tencent-weibo:before {
+    content: "\f1d5"
+}
+
+.fa-qq:before {
+    content: "\f1d6"
+}
+
+.fa-wechat:before,
+.fa-weixin:before {
+    content: "\f1d7"
+}
+
+.fa-send:before,
+.fa-paper-plane:before {
+    content: "\f1d8"
+}
+
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+    content: "\f1d9"
+}
+
+.fa-history:before {
+    content: "\f1da"
+}
+
+.fa-circle-thin:before {
+    content: "\f1db"
+}
+
+.fa-header:before {
+    content: "\f1dc"
+}
+
+.fa-paragraph:before {
+    content: "\f1dd"
+}
+
+.fa-sliders:before {
+    content: "\f1de"
+}
+
+.fa-share-alt:before {
+    content: "\f1e0"
+}
+
+.fa-share-alt-square:before {
+    content: "\f1e1"
+}
+
+.fa-bomb:before {
+    content: "\f1e2"
+}
+
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+    content: "\f1e3"
+}
+
+.fa-tty:before {
+    content: "\f1e4"
+}
+
+.fa-binoculars:before {
+    content: "\f1e5"
+}
+
+.fa-plug:before {
+    content: "\f1e6"
+}
+
+.fa-slideshare:before {
+    content: "\f1e7"
+}
+
+.fa-twitch:before {
+    content: "\f1e8"
+}
+
+.fa-yelp:before {
+    content: "\f1e9"
+}
+
+.fa-newspaper-o:before {
+    content: "\f1ea"
+}
+
+.fa-wifi:before {
+    content: "\f1eb"
+}
+
+.fa-calculator:before {
+    content: "\f1ec"
+}
+
+.fa-paypal:before {
+    content: "\f1ed"
+}
+
+.fa-google-wallet:before {
+    content: "\f1ee"
+}
+
+.fa-cc-visa:before {
+    content: "\f1f0"
+}
+
+.fa-cc-mastercard:before {
+    content: "\f1f1"
+}
+
+.fa-cc-discover:before {
+    content: "\f1f2"
+}
+
+.fa-cc-amex:before {
+    content: "\f1f3"
+}
+
+.fa-cc-paypal:before {
+    content: "\f1f4"
+}
+
+.fa-cc-stripe:before {
+    content: "\f1f5"
+}
+
+.fa-bell-slash:before {
+    content: "\f1f6"
+}
+
+.fa-bell-slash-o:before {
+    content: "\f1f7"
+}
+
+.fa-trash:before {
+    content: "\f1f8"
+}
+
+.fa-copyright:before {
+    content: "\f1f9"
+}
+
+.fa-at:before {
+    content: "\f1fa"
+}
+
+.fa-eyedropper:before {
+    content: "\f1fb"
+}
+
+.fa-paint-brush:before {
+    content: "\f1fc"
+}
+
+.fa-birthday-cake:before {
+    content: "\f1fd"
+}
+
+.fa-area-chart:before {
+    content: "\f1fe"
+}
+
+.fa-pie-chart:before {
+    content: "\f200"
+}
+
+.fa-line-chart:before {
+    content: "\f201"
+}
+
+.fa-lastfm:before {
+    content: "\f202"
+}
+
+.fa-lastfm-square:before {
+    content: "\f203"
+}
+
+.fa-toggle-off:before {
+    content: "\f204"
+}
+
+.fa-toggle-on:before {
+    content: "\f205"
+}
+
+.fa-bicycle:before {
+    content: "\f206"
+}
+
+.fa-bus:before {
+    content: "\f207"
+}
+
+.fa-ioxhost:before {
+    content: "\f208"
+}
+
+.fa-angellist:before {
+    content: "\f209"
+}
+
+.fa-cc:before {
+    content: "\f20a"
+}
+
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+    content: "\f20b"
+}
+
+.fa-meanpath:before {
+    content: "\f20c"
+}
+
+.fa-buysellads:before {
+    content: "\f20d"
+}
+
+.fa-connectdevelop:before {
+    content: "\f20e"
+}
+
+.fa-dashcube:before {
+    content: "\f210"
+}
+
+.fa-forumbee:before {
+    content: "\f211"
+}
+
+.fa-leanpub:before {
+    content: "\f212"
+}
+
+.fa-sellsy:before {
+    content: "\f213"
+}
+
+.fa-shirtsinbulk:before {
+    content: "\f214"
+}
+
+.fa-simplybuilt:before {
+    content: "\f215"
+}
+
+.fa-skyatlas:before {
+    content: "\f216"
+}
+
+.fa-cart-plus:before {
+    content: "\f217"
+}
+
+.fa-cart-arrow-down:before {
+    content: "\f218"
+}
+
+.fa-diamond:before {
+    content: "\f219"
+}
+
+.fa-ship:before {
+    content: "\f21a"
+}
+
+.fa-user-secret:before {
+    content: "\f21b"
+}
+
+.fa-motorcycle:before {
+    content: "\f21c"
+}
+
+.fa-street-view:before {
+    content: "\f21d"
+}
+
+.fa-heartbeat:before {
+    content: "\f21e"
+}
+
+.fa-venus:before {
+    content: "\f221"
+}
+
+.fa-mars:before {
+    content: "\f222"
+}
+
+.fa-mercury:before {
+    content: "\f223"
+}
+
+.fa-intersex:before,
+.fa-transgender:before {
+    content: "\f224"
+}
+
+.fa-transgender-alt:before {
+    content: "\f225"
+}
+
+.fa-venus-double:before {
+    content: "\f226"
+}
+
+.fa-mars-double:before {
+    content: "\f227"
+}
+
+.fa-venus-mars:before {
+    content: "\f228"
+}
+
+.fa-mars-stroke:before {
+    content: "\f229"
+}
+
+.fa-mars-stroke-v:before {
+    content: "\f22a"
+}
+
+.fa-mars-stroke-h:before {
+    content: "\f22b"
+}
+
+.fa-neuter:before {
+    content: "\f22c"
+}
+
+.fa-genderless:before {
+    content: "\f22d"
+}
+
+.fa-facebook-official:before {
+    content: "\f230"
+}
+
+.fa-pinterest-p:before {
+    content: "\f231"
+}
+
+.fa-whatsapp:before {
+    content: "\f232"
+}
+
+.fa-server:before {
+    content: "\f233"
+}
+
+.fa-user-plus:before {
+    content: "\f234"
+}
+
+.fa-user-times:before {
+    content: "\f235"
+}
+
+.fa-hotel:before,
+.fa-bed:before {
+    content: "\f236"
+}
+
+.fa-viacoin:before {
+    content: "\f237"
+}
+
+.fa-train:before {
+    content: "\f238"
+}
+
+.fa-subway:before {
+    content: "\f239"
+}
+
+.fa-medium:before {
+    content: "\f23a"
+}
+
+.fa-yc:before,
+.fa-y-combinator:before {
+    content: "\f23b"
+}
+
+.fa-optin-monster:before {
+    content: "\f23c"
+}
+
+.fa-opencart:before {
+    content: "\f23d"
+}
+
+.fa-expeditedssl:before {
+    content: "\f23e"
+}
+
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+    content: "\f240"
+}
+
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+    content: "\f241"
+}
+
+.fa-battery-2:before,
+.fa-battery-half:before {
+    content: "\f242"
+}
+
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+    content: "\f243"
+}
+
+.fa-battery-0:before,
+.fa-battery-empty:before {
+    content: "\f244"
+}
+
+.fa-mouse-pointer:before {
+    content: "\f245"
+}
+
+.fa-i-cursor:before {
+    content: "\f246"
+}
+
+.fa-object-group:before {
+    content: "\f247"
+}
+
+.fa-object-ungroup:before {
+    content: "\f248"
+}
+
+.fa-sticky-note:before {
+    content: "\f249"
+}
+
+.fa-sticky-note-o:before {
+    content: "\f24a"
+}
+
+.fa-cc-jcb:before {
+    content: "\f24b"
+}
+
+.fa-cc-diners-club:before {
+    content: "\f24c"
+}
+
+.fa-clone:before {
+    content: "\f24d"
+}
+
+.fa-balance-scale:before {
+    content: "\f24e"
+}
+
+.fa-hourglass-o:before {
+    content: "\f250"
+}
+
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+    content: "\f251"
+}
+
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+    content: "\f252"
+}
+
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+    content: "\f253"
+}
+
+.fa-hourglass:before {
+    content: "\f254"
+}
+
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+    content: "\f255"
+}
+
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+    content: "\f256"
+}
+
+.fa-hand-scissors-o:before {
+    content: "\f257"
+}
+
+.fa-hand-lizard-o:before {
+    content: "\f258"
+}
+
+.fa-hand-spock-o:before {
+    content: "\f259"
+}
+
+.fa-hand-pointer-o:before {
+    content: "\f25a"
+}
+
+.fa-hand-peace-o:before {
+    content: "\f25b"
+}
+
+.fa-trademark:before {
+    content: "\f25c"
+}
+
+.fa-registered:before {
+    content: "\f25d"
+}
+
+.fa-creative-commons:before {
+    content: "\f25e"
+}
+
+.fa-gg:before {
+    content: "\f260"
+}
+
+.fa-gg-circle:before {
+    content: "\f261"
+}
+
+.fa-tripadvisor:before {
+    content: "\f262"
+}
+
+.fa-odnoklassniki:before {
+    content: "\f263"
+}
+
+.fa-odnoklassniki-square:before {
+    content: "\f264"
+}
+
+.fa-get-pocket:before {
+    content: "\f265"
+}
+
+.fa-wikipedia-w:before {
+    content: "\f266"
+}
+
+.fa-safari:before {
+    content: "\f267"
+}
+
+.fa-chrome:before {
+    content: "\f268"
+}
+
+.fa-firefox:before {
+    content: "\f269"
+}
+
+.fa-opera:before {
+    content: "\f26a"
+}
+
+.fa-internet-explorer:before {
+    content: "\f26b"
+}
+
+.fa-tv:before,
+.fa-television:before {
+    content: "\f26c"
+}
+
+.fa-contao:before {
+    content: "\f26d"
+}
+
+.fa-500px:before {
+    content: "\f26e"
+}
+
+.fa-amazon:before {
+    content: "\f270"
+}
+
+.fa-calendar-plus-o:before {
+    content: "\f271"
+}
+
+.fa-calendar-minus-o:before {
+    content: "\f272"
+}
+
+.fa-calendar-times-o:before {
+    content: "\f273"
+}
+
+.fa-calendar-check-o:before {
+    content: "\f274"
+}
+
+.fa-industry:before {
+    content: "\f275"
+}
+
+.fa-map-pin:before {
+    content: "\f276"
+}
+
+.fa-map-signs:before {
+    content: "\f277"
+}
+
+.fa-map-o:before {
+    content: "\f278"
+}
+
+.fa-map:before {
+    content: "\f279"
+}
+
+.fa-commenting:before {
+    content: "\f27a"
+}
+
+.fa-commenting-o:before {
+    content: "\f27b"
+}
+
+.fa-houzz:before {
+    content: "\f27c"
+}
+
+.fa-vimeo:before {
+    content: "\f27d"
+}
+
+.fa-black-tie:before {
+    content: "\f27e"
+}
+
+.fa-fonticons:before {
+    content: "\f280"
+}
+
+.fa-reddit-alien:before {
+    content: "\f281"
+}
+
+.fa-edge:before {
+    content: "\f282"
+}
+
+.fa-credit-card-alt:before {
+    content: "\f283"
+}
+
+.fa-codiepie:before {
+    content: "\f284"
+}
+
+.fa-modx:before {
+    content: "\f285"
+}
+
+.fa-fort-awesome:before {
+    content: "\f286"
+}
+
+.fa-usb:before {
+    content: "\f287"
+}
+
+.fa-product-hunt:before {
+    content: "\f288"
+}
+
+.fa-mixcloud:before {
+    content: "\f289"
+}
+
+.fa-scribd:before {
+    content: "\f28a"
+}
+
+.fa-pause-circle:before {
+    content: "\f28b"
+}
+
+.fa-pause-circle-o:before {
+    content: "\f28c"
+}
+
+.fa-stop-circle:before {
+    content: "\f28d"
+}
+
+.fa-stop-circle-o:before {
+    content: "\f28e"
+}
+
+.fa-shopping-bag:before {
+    content: "\f290"
+}
+
+.fa-shopping-basket:before {
+    content: "\f291"
+}
+
+.fa-hashtag:before {
+    content: "\f292"
+}
+
+.fa-bluetooth:before {
+    content: "\f293"
+}
+
+.fa-bluetooth-b:before {
+    content: "\f294"
+}
+
+.fa-percent:before {
+    content: "\f295"
+}
+
+.fa-gitlab:before {
+    content: "\f296"
+}
+
+.fa-wpbeginner:before {
+    content: "\f297"
+}
+
+.fa-wpforms:before {
+    content: "\f298"
+}
+
+.fa-envira:before {
+    content: "\f299"
+}
+
+.fa-universal-access:before {
+    content: "\f29a"
+}
+
+.fa-wheelchair-alt:before {
+    content: "\f29b"
+}
+
+.fa-question-circle-o:before {
+    content: "\f29c"
+}
+
+.fa-blind:before {
+    content: "\f29d"
+}
+
+.fa-audio-description:before {
+    content: "\f29e"
+}
+
+.fa-volume-control-phone:before {
+    content: "\f2a0"
+}
+
+.fa-braille:before {
+    content: "\f2a1"
+}
+
+.fa-assistive-listening-systems:before {
+    content: "\f2a2"
+}
+
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+    content: "\f2a3"
+}
+
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+    content: "\f2a4"
+}
+
+.fa-glide:before {
+    content: "\f2a5"
+}
+
+.fa-glide-g:before {
+    content: "\f2a6"
+}
+
+.fa-signing:before,
+.fa-sign-language:before {
+    content: "\f2a7"
+}
+
+.fa-low-vision:before {
+    content: "\f2a8"
+}
+
+.fa-viadeo:before {
+    content: "\f2a9"
+}
+
+.fa-viadeo-square:before {
+    content: "\f2aa"
+}
+
+.fa-snapchat:before {
+    content: "\f2ab"
+}
+
+.fa-snapchat-ghost:before {
+    content: "\f2ac"
+}
+
+.fa-snapchat-square:before {
+    content: "\f2ad"
+}
+
+.fa-pied-piper:before {
+    content: "\f2ae"
+}
+
+.fa-first-order:before {
+    content: "\f2b0"
+}
+
+.fa-yoast:before {
+    content: "\f2b1"
+}
+
+.fa-themeisle:before {
+    content: "\f2b2"
+}
+
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+    content: "\f2b3"
+}
+
+.fa-fa:before,
+.fa-font-awesome:before {
+    content: "\f2b4"
+}
+
+.fa-handshake-o:before {
+    content: "\f2b5"
+}
+
+.fa-envelope-open:before {
+    content: "\f2b6"
+}
+
+.fa-envelope-open-o:before {
+    content: "\f2b7"
+}
+
+.fa-linode:before {
+    content: "\f2b8"
+}
+
+.fa-address-book:before {
+    content: "\f2b9"
+}
+
+.fa-address-book-o:before {
+    content: "\f2ba"
+}
+
+.fa-vcard:before,
+.fa-address-card:before {
+    content: "\f2bb"
+}
+
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+    content: "\f2bc"
+}
+
+.fa-user-circle:before {
+    content: "\f2bd"
+}
+
+.fa-user-circle-o:before {
+    content: "\f2be"
+}
+
+.fa-user-o:before {
+    content: "\f2c0"
+}
+
+.fa-id-badge:before {
+    content: "\f2c1"
+}
+
+.fa-drivers-license:before,
+.fa-id-card:before {
+    content: "\f2c2"
+}
+
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+    content: "\f2c3"
+}
+
+.fa-quora:before {
+    content: "\f2c4"
+}
+
+.fa-free-code-camp:before {
+    content: "\f2c5"
+}
+
+.fa-telegram:before {
+    content: "\f2c6"
+}
+
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+    content: "\f2c7"
+}
+
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+    content: "\f2c8"
+}
+
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+    content: "\f2c9"
+}
+
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+    content: "\f2ca"
+}
+
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+    content: "\f2cb"
+}
+
+.fa-shower:before {
+    content: "\f2cc"
+}
+
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+    content: "\f2cd"
+}
+
+.fa-podcast:before {
+    content: "\f2ce"
+}
+
+.fa-window-maximize:before {
+    content: "\f2d0"
+}
+
+.fa-window-minimize:before {
+    content: "\f2d1"
+}
+
+.fa-window-restore:before {
+    content: "\f2d2"
+}
+
+.fa-times-rectangle:before,
+.fa-window-close:before {
+    content: "\f2d3"
+}
+
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+    content: "\f2d4"
+}
+
+.fa-bandcamp:before {
+    content: "\f2d5"
+}
+
+.fa-grav:before {
+    content: "\f2d6"
+}
+
+.fa-etsy:before {
+    content: "\f2d7"
+}
+
+.fa-imdb:before {
+    content: "\f2d8"
+}
+
+.fa-ravelry:before {
+    content: "\f2d9"
+}
+
+.fa-eercast:before {
+    content: "\f2da"
+}
+
+.fa-microchip:before {
+    content: "\f2db"
+}
+
+.fa-snowflake-o:before {
+    content: "\f2dc"
+}
+
+.fa-superpowers:before {
+    content: "\f2dd"
+}
+
+.fa-wpexplorer:before {
+    content: "\f2de"
+}
+
+.fa-meetup:before {
+    content: "\f2e0"
+}
+
+.sr-only {
+    position: absolute;
+    width: 1px;
+    height: 1px;
+    padding: 0;
+    margin: -1px;
+    overflow: hidden;
+    clip: rect(0, 0, 0, 0);
+    border: 0
+}
+
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+    position: static;
+    width: auto;
+    height: auto;
+    margin: 0;
+    overflow: visible;
+    clip: auto
+}

+ 26 - 0
LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/spin.css

@@ -0,0 +1,26 @@
+@keyframes spinner-line-fade-more {
+  0%, 100% {
+    opacity: 0; /* minimum opacity */
+  }
+  1% {
+    opacity: 1;
+  }
+}
+
+@keyframes spinner-line-fade-quick {
+  0%, 39%, 100% {
+    opacity: 0.25; /* minimum opacity */
+  }
+  40% {
+    opacity: 1;
+  }
+}
+
+@keyframes spinner-line-fade-default {
+  0%, 100% {
+    opacity: 0.22; /* minimum opacity */
+  }
+  1% {
+    opacity: 1;
+  }
+}

+ 1904 - 0
LuckyCallWebCore/LuckyCallWebCore/wwwroot/css/styles.css

@@ -0,0 +1,1904 @@
+* {
+    margin: 0;
+    padding: 0;
+}
+
+html {
+    box-sizing: border-box;
+    font-family: "Quicksand";
+    font-style: normal;
+}
+
+body {
+    background-image: url("../images/background.png");
+    background-repeat: no-repeat;
+    background-position: center;
+    -webkit-background-size: cover;
+    -moz-background-size: cover;
+    -o-background-size: cover;
+    background-size: cover;
+    min-height: 100vh;
+    /* max-height: 100vh; */
+    max-width: 100vw;
+    position: relative;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: space-between;
+    /* overflow: hidden; */
+}
+
+/* Class common */
+
+.center {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.text-style {
+    font-family: "Quicksand";
+    font-style: normal;
+    font-weight: 400;
+    font-size: 14px;
+    line-height: 17px;
+    display: flex;
+    align-items: center;
+    text-align: center;
+    color: #fff2bb;
+    text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+}
+
+.input-style {
+    width: 255px;
+    height: 40px;
+    /*background: linear-gradient(90deg, #e8855a -0.01%, #e8c808 99.99%);*/
+    border: 4px solid #ffdd50;
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    border-radius: 73px;
+    font-family: "Quicksand";
+    font-style: normal;
+    font-weight: 700;
+    font-size: 20px;
+    line-height: 24px;
+    color: #5e0b08;
+    text-align: center;
+}
+
+.btn-style {
+    width: 255px;
+    height: 40px;
+    background: linear-gradient(90deg, #e8855a -0.01%, #e8c808 99.99%);
+    border: 4px solid #ffdd50;
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    border-radius: 73px;
+    font-family: "Quicksand";
+    font-style: normal;
+    font-weight: 700;
+    font-size: 20px;
+    line-height: 24px;
+    color: #5e0b08;
+}
+
+/* End class common */
+
+.animation_page {
+    height: 60vh;
+    max-height: 400px;
+    width: 100%;
+    position: relative;
+}
+
+@media (min-width: 376px) {
+    .animation_page {
+        padding-top: 40px;
+    }
+}
+
+.header_page {
+    display: flex;
+    align-items: flex-start;
+    justify-content: space-between;
+    width: 98%;
+    position: absolute;
+    top: 0;
+    left: 51%;
+    transform: translateX(-50%);
+}
+
+.body_page {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    position: relative;
+    position: absolute;
+    bottom: 0;
+    height: 207px;
+}
+
+.bg_lucky {
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    z-index: 10;
+    width: 100%;
+    height: 300px;
+    background-image: url("../images/florer.png");
+    mix-blend-mode: screen;
+}
+
+@keyframes textAnima {
+    from {
+        transform: scale(1) translate(-50%, -50%);
+    }
+
+    to {
+        transform: scale(1.05) translate(-50%, -50%);
+    }
+}
+
+.lucky_call_text {
+    width: 100%;
+    position: absolute;
+    z-index: 9;
+    bottom: -132px;
+    left: 53%;
+    transform: translate(-50%, -50%);
+    max-width: 350px;
+    animation: textAnima 0.5s linear infinite alternate;
+}
+
+.footer_page {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 10px;
+    flex-direction: column;
+    margin-bottom: 25px;
+}
+
+/* Animation cat */
+
+@keyframes walk {
+    0% {
+        background-image: url("../images/Cat2.png");
+    }
+
+    50% {
+        background-image: url("../images/Cat3.png");
+    }
+
+    100% {
+        background-image: url("../images/Cat4.png");
+    }
+}
+
+#lucky_call {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    position: relative;
+    width: 100%;
+    margin-top: 10px;
+}
+
+    #lucky_call img {
+        max-width: 350px;
+    }
+
+#cat {
+    width: 300px;
+    height: 300px;
+    top: 50%;
+    left: 50%;
+    position: absolute;
+    animation-name: walk;
+    animation-duration: 1.2s;
+    animation-timing-function: step-start;
+    animation-iteration-count: infinite;
+    transform: translate(-50%, -50%);
+    background-repeat: no-repeat;
+    background-position: center;
+}
+
+/* Animation coin */
+@keyframes coin {
+    from {
+        top: 2%;
+    }
+
+    to {
+        top: 6%;
+        right: 17%;
+    }
+}
+
+.coin_animate {
+    position: absolute;
+    right: 20%;
+    animation: coin 1s linear infinite alternate;
+}
+
+@keyframes coin_1 {
+    from {
+        top: 4%;
+    }
+
+    to {
+        top: 8%;
+        left: 17%;
+    }
+}
+
+.coin_animate1 {
+    position: absolute;
+    left: 10%;
+    animation: coin_1 1s linear infinite alternate;
+}
+
+@keyframes coin_2 {
+    from {
+        top: 15%;
+        left: 45%;
+    }
+
+    to {
+        top: 18%;
+    }
+}
+
+.coin_animate2 {
+    position: absolute;
+    left: 40%;
+    animation: coin_2 1s linear infinite alternate;
+}
+
+@keyframes coin_3 {
+    from {
+        top: 35%;
+        right: 20%;
+    }
+
+    to {
+        top: 40%;
+    }
+}
+
+.coin_animate3 {
+    position: absolute;
+    right: 20%;
+    animation: coin_3 1s linear infinite alternate;
+}
+
+@keyframes coin_4 {
+    from {
+        bottom: 0%;
+        right: 20%;
+    }
+
+    to {
+        bottom: 10px;
+    }
+}
+
+.coin_animate4 {
+    z-index: 10;
+    position: absolute;
+    left: 40%;
+    animation: coin_4 1s linear infinite alternate;
+}
+
+@keyframes coin_5 {
+    from {
+        bottom: 0%;
+        right: 10%;
+    }
+
+    to {
+        bottom: -10px;
+    }
+}
+
+.coin_animate5 {
+    position: absolute;
+    z-index: 11;
+    right: 20%;
+    animation: coin_5 1s linear infinite alternate;
+}
+
+@keyframes coin_5 {
+    from {
+        bottom: -30%;
+        right: 20%;
+    }
+
+    to {
+        bottom: -10px;
+    }
+}
+
+.coin_animate6 {
+    position: absolute;
+    right: 0%;
+    bottom: 10%;
+}
+
+.coin_animate7 {
+    position: absolute;
+    left: 0;
+    bottom: 0%;
+}
+
+@keyframes coin_8 {
+    from {
+        bottom: -30%;
+        left: 10%;
+    }
+
+    to {
+        bottom: -10px;
+    }
+}
+
+.coin_animate8 {
+    position: absolute;
+    left: 0%;
+    top: 50%;
+    animation: coin_8 1s linear infinite alternate;
+}
+
+@keyframes light_ani {
+    from {
+        transform: scale(1);
+    }
+
+    to {
+        transform: scale(1.5);
+    }
+}
+
+.footer_page button {
+    position: relative;
+}
+
+.light_one {
+    position: absolute;
+    left: -26px;
+    top: 3%;
+    mix-blend-mode: screen;
+    animation: light_ani 0.5s linear infinite alternate;
+}
+
+.light_two {
+    position: absolute;
+    right: -26px;
+    top: 3%;
+    mix-blend-mode: screen;
+    animation: light_ani 0.7s linear infinite alternate;
+}
+
+/* END INDEX PAGE */
+
+/* LOADING PAGE */
+.loading-bottom {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+    gap: 10px;
+}
+
+.text_loading {
+    display: flex;
+    gap: 3px;
+    font-weight: 400;
+    font-size: 14px;
+    line-height: 18px;
+    color: #fff2bb;
+    text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+}
+
+.loading-container {
+    margin-bottom: 100px;
+    width: 80vw;
+    background: #7c0a0a;
+    box-shadow: inset 0px 3px 3px rgba(0, 0, 0, 0.5);
+    border-radius: 30px;
+    height: 12px;
+}
+
+.loading-bar {
+    height: 100%;
+    background: #ffdd50;
+    border-radius: 30px;
+    animation: loading 2s ease-in-out;
+}
+
+@keyframes loading {
+    0% {
+        width: 0%;
+    }
+
+    50% {
+        width: 50%;
+    }
+
+    100% {
+        width: 100%;
+    }
+}
+
+/* END LOADING PAGE */
+
+/* LOGIN ERROR PAGE */
+.bg_overlay-login-error {
+    position: absolute;
+    left: 0px;
+    right: 0px;
+    top: 0px;
+    bottom: 0px;
+    background: rgba(0, 0, 0, 0.5);
+    backdrop-filter: blur(2px);
+    z-index: 99;
+}
+
+.popup_warning {
+    position: absolute;
+    bottom: 22%;
+    left: 50%;
+    transform: translateX(-50%);
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    /* backdrop-filter: blur(2px); */
+    border-radius: 20px;
+    width: 320px;
+    overflow: hidden;
+}
+
+    .popup_warning .header-popup_warning {
+        height: 60px;
+        background: rgba(167, 0, 0, 0.7);
+        text-align: center;
+        font-family: "Quicksand";
+        font-style: normal;
+        font-weight: 700;
+        font-size: 14px;
+        line-height: 20px;
+        text-align: center;
+        text-transform: uppercase;
+        color: #fff2bb;
+        line-height: 60px;
+    }
+
+    .popup_warning .body-popup_adv {
+        display: flex;
+        align-items: center;
+        flex-direction: column;
+        justify-content: center;
+        min-height: 156px;
+        background: rgba(255, 255, 255, 0.7);
+    }
+
+    .popup_warning .btn_ok {
+        width: 103px;
+        height: 41px;
+        background: linear-gradient(90deg, #e8855a -0.01%, #e8c808 99.99%);
+        border: 2px solid #ffdd50;
+        box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+        border-radius: 73px;
+        font-style: normal;
+        font-weight: 700;
+        font-size: 14px;
+        line-height: 18px;
+        text-transform: uppercase;
+        color: #5e0b08;
+    }
+
+    .popup_warning .body-popup_warning {
+        display: flex;
+        align-items: center;
+        flex-direction: column;
+        gap: 20px;
+        justify-content: center;
+        min-height: 156px;
+        background: rgba(255, 255, 255, 0.7);
+        padding: 20px 0;
+    }
+
+        .popup_warning .body-popup_warning .desc {
+            font-weight: 400;
+            font-size: 14px;
+            line-height: 17px;
+            text-align: center;
+            color: #330908;
+            width: 60%;
+        }
+
+
+.bg_overlay-login-error .text_box {
+    min-width: 156px;
+    min-height: 64px;
+    text-align: center;
+    max-width: 80%;
+    padding: 5px 0;
+    background: linear-gradient(90deg, #e8855a -0.01%, #e8c808 99.99%);
+    border-radius: 20px;
+    font-family: "Quicksand";
+    font-style: normal;
+    font-weight: 800;
+    font-size: 20px;
+    line-height: 24px;
+    color: #ffffff;
+    text-shadow: 3px 3px 4px rgba(0, 0, 0, 0.5);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+/* END LOGIN ERROR PAGE */
+
+/* LUCKY CALL PAGE */
+.overlay-gift {
+    position: fixed;
+    left: 0px;
+    right: 0px;
+    top: 0px;
+    bottom: 0px;
+    background: rgba(0, 0, 0, 0.5);
+    backdrop-filter: blur(2px);
+    z-index: 99;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+@keyframes bg_gift_rotate {
+    from {
+        transform: rotate(0);
+    }
+
+    to {
+        transform: rotate(360deg);
+    }
+}
+
+@keyframes gift_animation {
+    from {
+        top: 48%;
+    }
+
+    to {
+        top: 52%;
+    }
+}
+
+@keyframes walk_2 {
+    0% {
+        background-image: url("../images/gift/mystery.png");
+    }
+
+    100% {
+        background-image: url("../images/gift/mystery_2.png");
+    }
+}
+
+.overlay-gift .gift {
+    height: 212px;
+    width: 180px;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    animation-name: walk_2;
+    animation-duration: 1.2s;
+    animation-timing-function: unset;
+    animation-iteration-count: infinite;
+    background-repeat: no-repeat;
+    background-position: center;
+    z-index: 99;
+    transition: all 0.5s ease-in-out;
+}
+
+.overlay-gift .bg_gift {
+    animation: bg_gift_rotate 2.5s linear infinite;
+}
+
+.overlay-gift .open_gift_scale {
+    transition: all 0.5s ease-in-out;
+    transform: translate(-50%, -50%) scale(5);
+}
+
+.open_gift_scale_2 {
+    transition: all 0.5s ease-in-out;
+    transform: scale(4);
+}
+
+#cat_2 {
+    width: 250px;
+    height: 250px;
+    top: 39%;
+    left: 50%;
+    position: absolute;
+    animation-name: walk;
+    animation-duration: 1s;
+    animation-timing-function: step-start;
+    animation-iteration-count: infinite;
+    transform: translate(-50%, -50%);
+    background-repeat: no-repeat;
+    background-position: center;
+    background-size: contain;
+}
+
+.lucky_call_text_2 {
+    width: 193px;
+    position: absolute;
+    z-index: 9;
+    bottom: 40px;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    max-width: 350px;
+    animation: textAnima 0.5s linear infinite alternate;
+}
+
+.bg_lucky_home {
+    position: absolute;
+    right: 0;
+    bottom: 90px;
+    z-index: 10;
+    width: 100%;
+    height: 300px;
+    background-image: url("../images/florer.png");
+    mix-blend-mode: screen;
+}
+
+header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    position: fixed;
+    height: 64px;
+    left: 0px;
+    right: 0px;
+    top: 0px;
+    background: rgba(255, 255, 255, 0.1);
+    border-bottom: 1px solid #fff2bb;
+    backdrop-filter: blur(2px);
+    z-index: 99;
+}
+
+    header .header_icon {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        padding: 0 22px;
+    }
+
+footer {
+    width: 100%;
+    position: fixed;
+    height: 80px;
+    left: 0;
+    right: 0;
+    bottom: 0px;
+    backdrop-filter: blur(2px);
+    background-image: url("../images/menu/menu.png");
+    background-position: center;
+    background-repeat: no-repeat;
+    background-size: cover;
+}
+
+    footer ul {
+        display: flex;
+        align-items: center;
+        justify-content: space-around;
+        list-style-type: none;
+        height: 100%;
+    }
+
+        footer ul li a {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            flex-direction: column;
+            font-family: "Quicksand";
+            gap: 5px;
+            font-style: normal;
+            font-weight: 600;
+            font-size: 10px;
+            line-height: 12px;
+            font-feature-settings: "case" on;
+            color: #fff2bb;
+            text-decoration: none;
+            position: relative;
+        }
+
+        footer ul li {
+            position: relative;
+            height: 100%;
+            display: flex;
+            align-items: center;
+        }
+
+#event-daily {
+    position: relative;
+    height: 400px;
+}
+
+    #event-daily .ranking_coin .bg-title {
+        position: absolute;
+        width: 177px;
+        height: 28px;
+        top: 15px;
+        left: 50%;
+        transform: translateX(-50%);
+        background: #a446d318;
+        background-blend-mode: soft-light;
+        border-radius: 10px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border: 1px solid #5e0b08;
+        background: linear-gradient(90deg, #e8855a -0.01%, #e8c808 99.99%);
+    }
+
+        #event-daily .ranking_coin .bg-title .title {
+            color: #5e0b08;
+            font-family: "Quicksand";
+            font-style: normal;
+            font-weight: 800;
+            font-size: 18px;
+            line-height: 22px;
+            text-align: center;
+            text-transform: uppercase;
+        }
+
+    #event-daily .ranking_coin .row_my-coin {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        position: absolute;
+        top: 45px;
+        left: 50%;
+        transform: translateX(-50%);
+        width: 80%;
+    }
+
+        #event-daily .ranking_coin .row_my-coin .title_my-coin {
+            font-family: "Quicksand";
+            font-style: normal;
+            font-weight: 400;
+            font-size: 14px;
+            line-height: 17px;
+            text-align: center;
+            color: #fff2bb;
+        }
+
+        #event-daily .ranking_coin .row_my-coin .number_coin {
+            display: flex;
+            align-items: center;
+            gap: 5px;
+        }
+
+            #event-daily .ranking_coin .row_my-coin .number_coin span {
+                font-family: "Quicksand";
+                font-style: normal;
+                font-weight: 700;
+                font-size: 14px;
+                line-height: 17px;
+                text-align: center;
+                color: #fff2bb;
+            }
+
+@keyframes gift {
+    from {
+        transform: translateY(0);
+    }
+
+    to {
+        transform: translateY(10px);
+    }
+}
+
+#event-daily .list-box .list-box-item .gift_1 {
+    animation: gift 1s linear infinite alternate;
+}
+
+#event-daily .list-box .list-box-item .gift_2 {
+    animation: gift 1.1s linear infinite alternate;
+}
+
+#event-daily .list-box .list-box-item .gift_3 {
+    animation: gift 1.2s linear infinite alternate;
+}
+
+#event-daily .list-box .list-box-item .gift_4 {
+    animation: gift 1.3s linear infinite alternate;
+}
+
+#event-daily .list-box .list-box-item .gift_5 {
+    animation: gift 1.4s linear infinite alternate;
+}
+
+#event-daily .list-box .list-box-item .gift_6 {
+    animation: gift 1.5s linear infinite alternate;
+}
+
+#event-daily .list-box {
+    position: absolute;
+    top: 80px;
+    left: 50%;
+    transform: translateX(-50%);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+    gap: 10px;
+}
+
+.box-spin-of-7 {
+    position: absolute;
+    top: 45%;
+    left: -20px;
+    width: 51px;
+    height: 33px;
+    background: #fff2bb;
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    border-radius: 12px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+}
+
+    .box-spin-of-7 span:first-child {
+        font-style: normal;
+        font-weight: 400;
+        font-size: 10px;
+        line-height: 12px;
+        text-align: center;
+        color: #5e0b08;
+    }
+
+    .box-spin-of-7 span:last-child {
+        font-style: normal;
+        font-weight: bold;
+        font-size: 10px;
+        line-height: 12px;
+        text-align: center;
+        color: #5e0b08;
+    }
+
+.list-box-item {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 10px;
+}
+
+.id_my {
+    position: absolute;
+    top: 12%;
+    left: 3%;
+    z-index: 99;
+}
+
+#popup_daily {
+    background: rgba(255, 255, 255, 0.7);
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    border-radius: 20px;
+    height: 70px;
+    width: auto;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    gap: 10px;
+    position: absolute;
+    top: 46%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    width: 87%;
+    z-index: 99;
+}
+
+.text_hello {
+    position: absolute;
+    font-size: 16px;
+    top: -30%;
+}
+
+#popup_daily .close_popup {
+    position: absolute;
+    top: -9px;
+    right: -10px;
+    z-index: 99;
+}
+
+#popup_daily .row_top {
+    display: flex;
+    align-items: center;
+    position: relative;
+    width: 100%;
+    justify-content: center;
+}
+
+    #popup_daily .row_top .img {
+        position: relative;
+        min-width: 15%;
+    }
+
+.img_abso {
+    position: absolute;
+    bottom: -15px;
+    right: 4px;
+}
+
+#popup_daily .title_event {
+    width: 92px;
+    height: 44px;
+    font-family: "Quicksand";
+    font-style: normal;
+    font-weight: 600;
+    font-size: 10px;
+    line-height: 14px;
+    text-align: center;
+    color: #fff2bb;
+    background: rgba(167, 0, 0, 0.7);
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    border-radius: 8px;
+    align-items: center;
+    display: flex;
+    justify-content: center;
+}
+
+#popup_daily .title_bot {
+    font-family: "Quicksand";
+    font-style: normal;
+    font-weight: 600;
+    font-size: 10px;
+    line-height: 12px;
+    text-align: center;
+    font-feature-settings: "case" on;
+    color: #330908;
+    width: 70%;
+}
+
+.gift_phone {
+    height: 102px;
+    position: fixed;
+    top: 15%;
+    right: 0;
+    z-index: 99;
+}
+
+    .gift_phone .gift_phone_1 {
+        position: absolute;
+        top: 0;
+        right: 0;
+    }
+
+        .gift_phone .gift_phone_1 .img_2 {
+            position: absolute;
+            left: -7px;
+            top: -20px;
+            animation: bg_gift_rotate 2.5s linear infinite;
+        }
+
+        .gift_phone .gift_phone_1 .img_3 {
+            position: absolute;
+            left: -2px;
+            top: -9px;
+        }
+
+    .gift_phone .item_contact {
+        position: absolute;
+        bottom: -65%;
+        right: 0;
+        z-index: 99;
+    }
+
+        .gift_phone .item_contact.phone {
+            right: 0;
+            z-index: 99;
+            bottom: -124px;
+        }
+
+        .gift_phone .item_contact .info {
+            position: absolute;
+            top: 2px;
+            left: 8px;
+            width: 44px;
+            height: 44px;
+            border-radius: 100%;
+            background: linear-gradient(147.97deg, #351093 26.34%, #550050 80.76%);
+            font-style: normal;
+            font-weight: 700;
+            font-size: 10px;
+            line-height: 12px;
+            display: flex;
+            align-items: center;
+            text-align: center;
+            font-feature-settings: "case" on;
+            color: #fff2bb;
+        }
+
+            .gift_phone .item_contact .info img {
+                position: absolute;
+                top: -16px;
+                right: -4px;
+            }
+
+        .gift_phone .item_contact.phone img {
+            top: 0px;
+            right: 9px;
+        }
+
+/* END LUCKY CALL PAGE */
+
+/* PAGE OPEN GIFT */
+.overlay-gift-open {
+    position: absolute;
+    left: 0px;
+    right: 0px;
+    top: 0px;
+    bottom: 0px;
+    z-index: 99;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    background: radial-gradient( 83.5% 59.17% at 53.72% 33.74%, #55060349 0%, #110707 100% );
+}
+
+@keyframes giftOpen {
+    from {
+        transform: rotate(0);
+    }
+
+    to {
+        transform: rotate(360deg);
+    }
+}
+
+@keyframes giftOpen_2 {
+    from {
+        transform: rotate(-15deg);
+    }
+
+    to {
+        transform: rotate(30deg);
+    }
+}
+
+.bg-call-gift {
+    border-radius: 20px;
+    position: fixed;
+    width: 250%;
+    height: 250%;
+    animation: giftOpen 1.2s linear infinite;
+}
+
+.bg-call-gift_2 {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    animation: giftOpen_2 1.2s linear infinite alternate;
+}
+/* END PAGE OPEN GIFT */
+
+/* PAGE POPUP IS OVER */
+.over_page {
+    height: 243px;
+    padding-top: 20px;
+}
+
+.box-content_over .cat_content {
+    display: flex;
+    align-items: center;
+    justify-content: space-around;
+}
+
+    .box-content_over .cat_content .box_cat {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        flex-direction: column;
+        gap: 5px;
+    }
+
+        .box-content_over .cat_content .box_cat p {
+            width: 100px;
+            height: 34px;
+            background: rgba(167, 0, 0, 0.7);
+            box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+            border-radius: 73px;
+            font-style: normal;
+            font-weight: 600;
+            font-size: 10px;
+            text-align: center;
+            color: #fff2bb;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+
+.box-content_over .desc_over {
+    font-style: normal;
+    font-weight: 400;
+    font-size: 14px;
+    line-height: 18px;
+    text-align: center;
+    color: #330908;
+    margin-top: 10px;
+    width: 90%;
+    padding: 10px 0 0 0;
+    margin: 0 auto;
+}
+
+/* END PAGE POPUP IS OVER */
+
+/* PAGE OPEN PHONE */
+.bg-open-phone {
+    position: absolute;
+}
+
+    .bg-open-phone .icon-close {
+        position: absolute;
+        right: 3px;
+        top: 1px;
+    }
+
+.box-content_phone {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+}
+
+    .box-content_phone .content_phone {
+        font-style: normal;
+        font-weight: 400;
+        font-size: 14px;
+        line-height: 18px;
+        text-align: justify;
+        color: #330908;
+        width: 254px;
+    }
+
+    .box-content_phone .title_phone {
+        margin-top: 10px;
+        font-style: normal;
+        font-weight: 700;
+        font-size: 14px;
+        line-height: 18px;
+        text-align: center;
+        color: #330908;
+    }
+
+.opened-phone {
+    position: relative;
+    height: 328px;
+    width: 326px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+    .opened-phone .img_1 {
+        position: absolute;
+        z-index: 9;
+        left: 50%;
+        transform: translateX(-50%);
+    }
+
+    .opened-phone .img_2 {
+        position: absolute;
+        left: 5%;
+        animation: bg_gift_rotate 2.5s linear infinite;
+    }
+
+    .opened-phone .img_3 {
+        position: absolute;
+        left: 50%;
+        transform: translateX(-50%);
+        mix-blend-mode: screen;
+    }
+/* END PAGE PHONE */
+
+/* PAGE POPUP CONFIRM */
+.box-content_phone .title_otp {
+    font-style: normal;
+    font-weight: 600;
+    font-size: 16px;
+    line-height: 18px;
+    text-align: center;
+    color: #330908;
+}
+
+.box-content_phone .list_number {
+    display: flex;
+    align-items: center;
+    gap: 4px;
+    background: rgba(255, 255, 255, 0.6);
+    border-radius: 8px;
+    padding: 6px;
+    margin-top: 15px;
+}
+
+    .box-content_phone .list_number .item_number {
+        width: 36px;
+        height: 36px;
+        background: #474747;
+        border-radius: 8px;
+        font-style: normal;
+        font-weight: 700;
+        font-size: 14px;
+        line-height: 18px;
+        display: flex;
+        align-items: center;
+        color: #ffffff;
+        justify-content: center;
+    }
+
+.body-popup_warning .group_btn .btn_cancel {
+    background: #575757;
+    border: 2px solid #fff2bb;
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    border-radius: 73px;
+    width: 100px;
+    height: 42px;
+    font-style: normal;
+    font-weight: 700;
+    font-size: 14px;
+    line-height: 18px;
+    text-transform: uppercase;
+    color: #fff2bb;
+}
+
+/* END PAGE POPUP CONFIRM */
+/* PAGE AFTER DAILY WEEKED */
+#popup_daily .title_event_after_daily {
+    width: 182px;
+    height: 44px;
+    font-family: "Quicksand";
+    font-style: normal;
+    font-weight: 600;
+    font-size: 10px;
+    line-height: 14px;
+    text-align: center;
+    color: #fff2bb;
+    background: rgba(167, 0, 0, 0.7);
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    border-radius: 8px;
+    align-items: center;
+    display: flex;
+    justify-content: center;
+}
+
+.row_top_after {
+    gap: 20px;
+}
+/* PAGE AFTER DAILY WEEKED */
+
+/* Modal setting */
+.modal-setting {
+    background: rgba(0, 0, 0, 0.5);
+    border: 1px solid #ffffff;
+    /* backdrop-filter: blur(2px); */
+    border-radius: 20px;
+    padding: 24px;
+    position: fixed;
+    top: 12px;
+    right: 12px;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    gap: 10px;
+    max-width: 281px;
+}
+
+.row_setting {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    gap: 5px;
+}
+
+.group_flag {
+    display: flex;
+    align-items: center;
+    gap: 5px;
+}
+
+    .group_flag .no_active {
+        position: relative;
+    }
+
+        .group_flag .no_active::after {
+            content: "";
+            position: absolute;
+            top: 0;
+            left: 0;
+            background-color: #330908b3;
+            width: 24px;
+            height: 25px;
+            border-radius: 100%;
+        }
+
+.row_setting span {
+    font-style: normal;
+    font-weight: 700;
+    font-size: 14px;
+    line-height: 18px;
+    color: #ffffff;
+}
+
+.group_sound {
+    display: flex;
+    align-items: center;
+    gap: 5px;
+}
+
+    .group_sound .sound-item {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        gap: 2px;
+        background: #676767;
+        border-radius: 0px 12px 12px 0px;
+        width: 48px;
+        height: 23px;
+    }
+
+        .group_sound .sound-item.off {
+            border-radius: 12px 0px 0px 12px;
+        }
+
+    .group_sound .active {
+        background: rgba(167, 0, 0, 0.7);
+    }
+
+        .group_sound .active span {
+            color: #fff2bb;
+        }
+
+.cancel_weekly_btn {
+    width: 103px;
+    height: 34px;
+    background: rgba(167, 0, 0, 0.7);
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    border-radius: 73px;
+    border: none;
+    outline: none;
+    font-style: normal;
+    font-weight: 500;
+    font-size: 10px;
+    line-height: 12px;
+    text-align: center;
+    color: #fff2bb;
+}
+
+.text-note-setting {
+    font-style: normal;
+    font-weight: 700;
+    font-size: 14px;
+    line-height: 18px;
+    text-align: center;
+    color: #ffffffde;
+    text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    position: absolute;
+    top: 470px;
+    left: 50%;
+    transform: translateX(-50%);
+}
+/* End modal setting */
+
+/* Modal leader board */
+.content-leader-board {
+    display: flex;
+    align-items: center;
+    flex-direction: column;
+    justify-content: center;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+}
+
+.row-column-table {
+    width: 320px;
+    height: 40px;
+    background: linear-gradient(90deg, #e8855a -0.01%, #e8c808 99.99%);
+    border-radius: 20px;
+    display: flex;
+    align-items: center;
+    justify-content: space-around;
+    padding: 0 5px;
+}
+
+    .row-column-table span {
+        width: 25%;
+        text-align: center;
+        font-weight: 700;
+        font-size: 15px;
+        line-height: 12px;
+        font-feature-settings: "case" on;
+        color: #330908;
+    }
+
+.text-perior {
+    font-style: normal;
+    font-weight: 600;
+    font-size: 10px;
+    line-height: 12px;
+    font-feature-settings: "case" on;
+    color: #fff2bb;
+    text-align: left;
+    width: 80%;
+    margin: 5px auto;
+}
+
+.table-data {
+    background: rgba(0, 0, 0, 0.7);
+    backdrop-filter: blur(10px);
+    border-radius: 30px;
+    padding: 20px;
+    margin: 0 10px;
+}
+
+    .table-data .list-row-data {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        gap: 12px;
+    }
+
+.list-row-data .row-item {
+    width: 308px;
+    display: flex;
+    align-items: center;
+    justify-content: space-around;
+    gap: 20px;
+    flex: 1;
+}
+
+    .list-row-data .row-item span {
+        font-weight: 300;
+        font-size: 12px;
+        line-height: 12px;
+        color: #fff2bb;
+        width: 60px;
+        text-align: right;
+    }
+
+        .list-row-data .row-item span.coin {
+            font-weight: 700;
+            font-size: 10px;
+            line-height: 12px;
+            text-align: right;
+            font-feature-settings: "case" on;
+            color: #fff2bb;
+        }
+
+        .list-row-data .row-item span.num {
+            font-weight: 700;
+            font-size: 14px;
+            line-height: 18px;
+            text-align: center;
+            color: #fff2bb;
+            width: 25%;
+        }
+
+.w-25 {
+    width: 25%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.pagination {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 15px;
+    margin-top: 15px;
+    font-weight: 300;
+    font-size: 10px;
+    line-height: 12px;
+    text-align: right;
+    font-feature-settings: "case" on;
+    color: #fff2bb;
+}
+
+    .pagination span.active-page {
+        font-weight: 700;
+        font-size: 10px;
+        line-height: 12px;
+        text-align: right;
+        font-feature-settings: "case" on;
+        color: #fff2bb;
+        border: 1px solid #fff2bb;
+        padding: 0 4px;
+    }
+
+.text_bottom {
+    font-weight: 700;
+    font-size: 10px;
+    line-height: 12px;
+    font-feature-settings: "case" on;
+    color: #fff2bb;
+    display: flex;
+    justify-content: space-between;
+    margin: 10px 0;
+}
+
+    .text_bottom.decoration {
+        text-decoration: underline;
+    }
+
+.content-leader-board .group_btn {
+    gap: 40px;
+}
+
+    .content-leader-board .group_btn button:first-child {
+        width: 92px;
+        height: 42px;
+        background: linear-gradient(90deg, #e8855a -0.01%, #e8c808 99.99%);
+        border: 2px solid #ffdd50;
+        box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+        border-radius: 73px;
+        font-weight: 700;
+        font-size: 14px;
+        line-height: 18px;
+        text-transform: uppercase;
+        color: #5e0b08;
+    }
+
+    .content-leader-board .group_btn button:last-child {
+        width: 100px;
+        height: 42px;
+        background: #575757;
+        border: 2px solid #fff2bb;
+        box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+        border-radius: 73px;
+        font-weight: 700;
+        font-size: 14px;
+        line-height: 18px;
+        text-transform: uppercase;
+        color: #fff2bb;
+    }
+/* End modal leader board */
+
+/* PAGE WINNER LIST */
+
+.bg-winnerList {
+    background-image: url("../images/winnerlist/bg-winnerlist.png");
+}
+
+#page-winnerlist {
+    margin-top: 100px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    gap: 16px;
+    padding-bottom: 100px;
+}
+
+    #page-winnerlist .title-main p:first-child {
+        font-weight: 600;
+        font-size: 16px;
+        line-height: 12px;
+        text-align: center;
+        font-feature-settings: "case" on;
+        color: #fff2bb;
+    }
+
+    #page-winnerlist .title-main p:last-child {
+        font-family: "Montserrat";
+        font-weight: 800;
+        font-size: 36px;
+        line-height: 44px;
+        text-align: center;
+        text-transform: uppercase;
+        background: linear-gradient( 11.07deg, #78140c -4.89%, #e2a630 27.33%, #f8da08 51.46%, #ffc263 78.36%, #ff5127 109.67% );
+        -webkit-background-clip: text;
+        -webkit-text-fill-color: transparent;
+        background-clip: text;
+        text-fill-color: transparent;
+    }
+
+.group_winner {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+    gap: 8px;
+}
+
+.group_winner-item {
+    width: 286px;
+    height: 21px;
+    background: linear-gradient(90deg, #e8855a -0.01%, #e8c808 99.99%);
+    border-radius: 20px;
+    font-weight: 700;
+    font-size: 15px;
+    font-feature-settings: "case" on;
+    color: #330908;
+    text-align: center;
+    line-height: 21px;
+}
+
+.bg_winner-list {
+    background-image: url("../images/winnerlist/bg-footer.png");
+}
+
+.winner_section {
+    position: relative;
+}
+
+.btn_winnerList {
+    position: absolute;
+    width: 100px;
+    height: 21px;
+    right: 12px;
+    bottom: 12px;
+    background: linear-gradient( 128.05deg, #efc008 9.55%, #a83808 51.07%, #f8bf10 86.43% );
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.5);
+    border-radius: 20px;
+    text-align: center;
+    font-weight: 700;
+    font-size: 12px;
+    line-height: 21px;
+    font-feature-settings: "case" on;
+    color: #fff2bb;
+}
+/* END PAGE WINNER LIST */
+
+/* MY GIFT PAGE */
+
+.my-gift-header {
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    width: 330px;
+}
+
+.table-data-gift {
+    background: rgba(0, 0, 0, 0.7);
+    /* backdrop-filter: blur(10px); */
+    border-radius: 30px;
+    padding: 20px;
+    width: 320px;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+}
+
+    .table-data-gift .list-data {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        gap: 28px;
+    }
+
+        .table-data-gift .list-data .row-data {
+            display: flex;
+            justify-content: space-around;
+            align-items: center;
+            width: 90%;
+        }
+
+            .table-data-gift .list-data .row-data span {
+                font-style: normal;
+                font-weight: 300;
+                font-size: 12px;
+                line-height: 16px;
+                font-feature-settings: "case" on;
+                color: #fff2bb;
+            }
+
+                .table-data-gift .list-data .row-data span.prize-text {
+                    width: 40%;
+                    text-align: center;
+                }
+
+    .table-data-gift.table-winner-list .list-data .row-data span {
+        width: 33%;
+    }
+
+.bg_my-gift {
+    background-image: url("../images/bg-footer-my-gift.png");
+}
+
+/* END MY GIFT PAGE */
+
+/* GUIDE PAGE */
+.group-info_service {
+    padding: 15px;
+    background: rgba(0, 0, 0, 0.7);
+    border-radius: 30px;
+    height: calc(100vh - 300px);
+    overflow-y: scroll;
+    color: #fff;
+}
+
+    .group-info_service .title {
+        font-style: normal;
+        font-weight: 700;
+        font-size: 16px;
+        line-height: 20px;
+        text-align: center;
+        text-transform: uppercase;
+        color: #fff2bb;
+        margin-bottom: 20px;
+    }
+
+    .group-info_service ul {
+        margin-left: 20px;
+    }
+
+    .group-info_service .desc {
+        font-style: normal;
+        font-weight: 400;
+        font-size: 14px;
+        line-height: 18px;
+        text-align: justify;
+        color: #fff2bb;
+        margin-bottom: 20px;
+    }
+
+        .group-info_service .desc span {
+            font-weight: 700;
+        }
+
+.special_gift {
+    position: relative;
+    background: #ffdd50;
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
+    border-radius: 102px;
+    font-style: normal;
+    font-weight: 700;
+    font-size: 16px;
+    line-height: 54px;
+    text-align: center;
+    text-transform: uppercase;
+    color: #330908;
+    width: 300px;
+    height: 54px;
+    margin: 20px auto;
+}
+
+    .special_gift .iphone {
+        position: absolute;
+        left: -15px;
+        top: 47%;
+        transform: translateY(-50%);
+    }
+
+    .special_gift .cir {
+        position: absolute;
+        left: -13px;
+        top: -37%;
+        animation: bg_gift_rotate 1.5s linear infinite;
+    }
+
+.bg_guide {
+    background-image: url("../images/bg-footer-guide.png");
+}
+
+.table-guide {
+    border-bottom: 1px solid #fff2bb;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+
+    .table-guide span {
+        font-style: normal;
+        font-weight: 700;
+        font-size: 14px;
+        line-height: 18px;
+        color: #fff2bb;
+        text-align: center;
+    }
+
+.title-table-col {
+    font-style: normal;
+    font-weight: 700;
+    font-size: 14px;
+    line-height: 18px;
+    color: #fff2bb;
+    text-align: center;
+    margin-bottom: 10px;
+}
+
+.content-table {
+    display: flex;
+}
+
+.col-table-guide {
+    border-right: 1px solid #fff2bb;
+    padding-right: 10px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 40px;
+}
+
+.table-guide_2 {
+    gap: 60px;
+    border-bottom: 1px solid #fff2bb;
+    display: flex;
+    align-items: center;
+    font-style: normal;
+    font-weight: 700;
+    font-size: 14px;
+    line-height: 18px;
+    color: #fff2bb;
+    text-align: center;
+}
+
+.col-table-guide_2 {
+    padding-left: 10px;
+    width: 67%;
+}
+
+.desc_2 {
+    font-style: normal;
+    font-weight: 400;
+    font-size: 14px;
+    line-height: 18px;
+    color: #fff2bb;
+    margin-bottom: 20px;
+}
+
+.col-table-guide_2 .row {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+
+.col-table-guide_3 {
+    width: 80%;
+    padding-left: 20px;
+}
+
+    .col-table-guide_3 .row {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+    }
+
+        .col-table-guide_3 .row .desc_2:first-child {
+            width: 30%;
+        }
+
+        .col-table-guide_3 .row .desc_2:last-child {
+            text-align: center;
+            width: 33%;
+        }
+
+.line_table {
+    height: 1px;
+    background-color: #fff2bb;
+    width: 100%;
+}
+/* END GUIDE PAGE */
+
+/* POPUP WINNER LIST */
+.title_winner-list {
+    font-weight: 700;
+    font-size: 16px;
+    line-height: 41px;
+    text-transform: uppercase;
+    text-align: center;
+    color: #fff2bb;
+    width: 340px;
+    height: 41px;
+    background: rgba(0, 0, 0, 0.7);
+    border-radius: 20px;
+}
+/* END POPUP WINNER LIST */

BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/favicon.ico


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat1.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat2.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat3.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat4.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat5.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/Cat6.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/adv.jpeg


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/background.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg-footer-guide.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg-footer-my-gift.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg_cat.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg_cat2.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/bg_rank.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_1.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_2.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_3.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_4.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_5.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_6.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_7.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_8.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/Coin_9.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/coin/coin_rank.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/Cat_one.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/Cat_two.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/bg-cirAni.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/bg_cir_2.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/bg_event.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/cat.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/cat_1.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/cirAni.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/cirAni_2.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/id.bk.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/id.png


BIN
LuckyCallWebCore/LuckyCallWebCore/wwwroot/images/daily/iphone.bk1.png


Някои файлове не бяха показани, защото твърде много файлове са промени