diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..edbb2ddc --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,18 @@ +{ + "image": "mcr.microsoft.com/devcontainers/dotnet", + "features": { + "ghcr.io/devcontainers/features/dotnet:2": { + "version": "9.0" + } + }, + "postCreateCommand": ".devcontainer/setup-nuget-auth.sh", + "customizations": { + "vscode": { + "extensions": [ + "ms-dotnettools.csharp", + "ms-dotnettools.csdevkit" + ] + } + }, + "remoteUser": "vscode" +} diff --git a/.devcontainer/setup-nuget-auth.sh b/.devcontainer/setup-nuget-auth.sh new file mode 100755 index 00000000..1fbd62df --- /dev/null +++ b/.devcontainer/setup-nuget-auth.sh @@ -0,0 +1,54 @@ +#!/bin/bash +set -e + +echo "Setting up NuGet authentication for Azure DevOps..." + +# Install Azure Artifacts Credential Provider +echo "Installing Azure Artifacts Credential Provider..." +if sh -c "$(curl -fsSL https://aka.ms/install-artifacts-credprovider.sh)" 2>/dev/null; then + echo "βœ… Azure Artifacts Credential Provider installed successfully" +else + echo "⚠️ Could not download Azure Artifacts Credential Provider installer." + echo "This may be due to network restrictions. Falling back to public packages only." + export ACCESS_TO_NUGET_FEED=false +fi + +# Display .NET version +echo "Checking .NET SDK version..." +dotnet --version + +# Try to restore packages with interactive authentication if credential provider is available +echo "Attempting to restore NuGet packages..." +if command -v dotnet-credential-provider-installer >/dev/null 2>&1 || [ -n "$(find ~/.nuget -name "*CredentialProvider*" 2>/dev/null | head -1)" ]; then + echo "" + echo "πŸ” The credential provider is available for Azure DevOps authentication." + echo "If prompted for credentials during package restoration, you can:" + echo " 1. Use your Azure DevOps account credentials, or" + echo " 2. Create a Personal Access Token (PAT) with 'Packaging (read)' permissions" + echo " from: https://dev.azure.com/intelliTect/_usersSettings/tokens" + echo "" + + # First try to restore with interactive authentication for private packages + if dotnet restore --interactive -p:AccessToNugetFeed=true; then + echo "βœ… Package restoration successful with private feed access!" + else + echo "⚠️ Private package restoration failed or was cancelled." + echo "Falling back to public packages only..." + if dotnet restore -p:AccessToNugetFeed=false; then + echo "βœ… Package restoration successful with public packages only!" + else + echo "❌ Package restoration failed completely." + exit 1 + fi + fi +else + echo "Credential provider not available, using public packages only..." + if dotnet restore -p:AccessToNugetFeed=false; then + echo "βœ… Package restoration successful with public packages only!" + else + echo "❌ Package restoration failed." + exit 1 + fi +fi + +echo "πŸŽ‰ Devcontainer setup complete!" \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..3729ff0c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/.editorconfig b/.editorconfig index bed05628..90272961 100644 --- a/.editorconfig +++ b/.editorconfig @@ -63,6 +63,8 @@ dotnet_style_operator_placement_when_wrapping = beginning_of_line tab_width = 4 end_of_line = crlf dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_allow_multiple_blank_lines_experimental = false:suggestion +dotnet_style_allow_statement_immediately_after_block_experimental = true:silent ############################### # C# Coding Conventions # ############################### @@ -123,9 +125,9 @@ csharp_preserve_single_line_blocks = true # IntelliTect Conventions # ############################### # var preferences -csharp_style_var_for_built_in_types = false:warning +csharp_style_var_for_built_in_types = false:none csharp_style_var_when_type_is_apparent = true:suggestion -csharp_style_var_elsewhere = false:warning +csharp_style_var_elsewhere = false:none ## Naming # Style Definitions @@ -151,4 +153,10 @@ csharp_style_namespace_declarations = block_scoped:silent csharp_style_prefer_method_group_conversion = true:silent csharp_style_prefer_top_level_statements = true:silent csharp_style_expression_bodied_lambdas = true:silent -csharp_style_expression_bodied_local_functions = false:silent \ No newline at end of file +csharp_style_expression_bodied_local_functions = false:silent + +# CA1848: Use the LoggerMessage delegates +dotnet_diagnostic.CA1848.severity = suggestion +# Test files - allow underscore-separated test method names (CA1707) +[{EssentialCSharp.Web.Tests,EssentialCSharp.Chat.Tests}/**] +dotnet_diagnostic.CA1707.severity = none diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..b49228d9 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,265 @@ +# GitHub Copilot Instructions for EssentialCSharp.Web + +## Project Overview & Core Purpose +This is a comprehensive ASP.NET Core 9.0 web application ecosystem for the **Essential C#** programming education platform. The project serves as the technical foundation for [essentialcsharp.com](https://essentialcsharp.com/), providing educational content, AI-powered chat assistance, and user management for C# learning resources. + +**Key Value**: Provides an interactive learning platform where developers can access Essential C# content, engage with AI-powered assistance for C# questions, and track their learning progress through a modern web interface. + +**Target Audience**: C# developers at all levels, students learning C#, and educators teaching C# programming concepts. + +## Project Structure & Architecture +This solution follows a modular architecture with clear separation of concerns: + +``` +EssentialCSharp.Web.sln +β”œβ”€β”€ EssentialCSharp.Web/ # Main ASP.NET Core web application +β”‚ β”œβ”€β”€ Areas/ # Identity and feature-specific areas +β”‚ β”œβ”€β”€ Controllers/ # MVC controllers +β”‚ β”œβ”€β”€ Views/ # Razor views and layouts +β”‚ β”œβ”€β”€ Models/ # View models and data models +β”‚ β”œβ”€β”€ Services/ # Business logic services +β”‚ β”œβ”€β”€ Migrations/ # Entity Framework migrations +β”‚ └── wwwroot/ # Static assets (CSS, JS, images) +β”œβ”€β”€ EssentialCSharp.Chat/ # Console application for AI chat +β”œβ”€β”€ EssentialCSharp.Chat.Shared/ # Shared models and services +β”œβ”€β”€ EssentialCSharp.Web.Tests/ # Integration tests for web app +└── EssentialCSharp.Chat.Tests/ # Unit tests for chat functionality +``` + +## Tech Stack & Core Technologies + +### Framework & Runtime +- **.NET 9.0** with **C# 13** language features +- **ASP.NET Core 9.0** for web application framework +- **Entity Framework Core 8.0.10** for data access with SQL Server +- **ASP.NET Core Identity** for user authentication and authorization + +### AI & Chat Integration +- **Microsoft Semantic Kernel 1.60.0** for AI orchestration +- **Azure OpenAI** integration for chat functionality +- **pgvector with PostgreSQL** for vector database operations +- **Model Context Protocol (MCP)** for AI agent integration + +### Authentication & Security +- **GitHub OAuth** integration for developer authentication +- **Microsoft Account** authentication support +- **HCaptcha** for bot protection +- **JWT tokens** for API authentication + +### Development & Deployment +- **Docker** containerization with multi-stage builds +- **Azure Application Insights** for telemetry and monitoring +- **Azure Monitor OpenTelemetry** for observability +- **Mailjet API** for email services + +### Package Management & Build +- **Central Package Management** via `Directory.Packages.props` +- **Private NuGet feed** from Azure DevOps for internal packages +- **Source Link** for debugging support +- **Build versioning** with continuous integration support + +## Coding Conventions & Development Patterns + +### Project Structure Conventions +- **Areas**: Use for Identity and distinct feature modules +- **Controllers**: Follow MVC pattern with async actions +- **Services**: Implement business logic with dependency injection +- **Models**: Separate view models from domain models +- **Extensions**: Place extension methods in dedicated Extension classes + +### Code Style & Patterns +- **Async/Await**: Use consistently for all I/O operations +- **Dependency Injection**: Register services in `Program.cs` +- **Repository Pattern**: Implement for data access abstraction +- **Error Handling**: Use structured logging and custom exceptions +- **Configuration**: Use strongly-typed configuration classes + +### File Naming & Organization +- **Controllers**: `{Feature}Controller.cs` (e.g., `HomeController.cs`) +- **Services**: `{Feature}Service.cs` and `I{Feature}Service.cs` +- **Models**: `{Entity}Model.cs` for view models, `{Entity}.cs` for domain +- **Extensions**: `{Type}Extensions.cs` +- **Tests**: `{ClassUnderTest}Tests.cs` + +## Testing Strategy & Frameworks + +### Test Organization +- **Integration Tests**: `EssentialCSharp.Web.Tests` using `Microsoft.AspNetCore.Mvc.Testing` +- **Unit Tests**: `EssentialCSharp.Chat.Tests` using `xUnit` and `Moq` +- **Test Structure**: Follow AAA pattern (Arrange, Act, Assert) + +### Testing Tools +- **xUnit 2.9.3** as the primary testing framework +- **Moq 4.20.72** for mocking dependencies +- **Coverlet** for code coverage collection +- **Microsoft.AspNetCore.Mvc.Testing** for integration testing + +### Test Conventions +```csharp +[Fact] +public async Task MethodName_Scenario_ExpectedBehavior() +{ + // Arrange + var service = new TestService(); + + // Act + var result = await service.MethodAsync(); + + // Assert + Assert.NotNull(result); +} +``` + +## Build & Development Commands + +### Essential Commands +```bash +# Restore all packages +dotnet restore + +# Build entire solution +dotnet build --configuration Release --no-restore + +# Run all tests +dotnet test --no-build --configuration Release + +# Run web application +dotnet run --project EssentialCSharp.Web + +# Run chat application +dotnet run --project EssentialCSharp.Chat + +# Entity Framework operations +dotnet ef migrations add MigrationName --project EssentialCSharp.Web +dotnet ef database update --project EssentialCSharp.Web +``` + +### Docker Operations +```bash +# Build Docker image +docker build -t essentialcsharp-web -f EssentialCSharp.Web/Dockerfile . + +# Run with Docker Compose (if available) +docker-compose up --build +``` + +## Configuration & Environment Setup + +### Required Secrets (Use dotnet user-secrets) +```bash +# Email configuration +dotnet user-secrets set "AuthMessageSender:SendFromName" "Essential C# Team" +dotnet user-secrets set "AuthMessageSender:SendFromEmail" "no-reply@essentialcsharp.com" +dotnet user-secrets set "AuthMessageSender:SecretKey" "your-mailjet-secret" +dotnet user-secrets set "AuthMessageSender:APIKey" "your-mailjet-api-key" + +# OAuth providers +dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "microsoft-oauth-secret" +dotnet user-secrets set "Authentication:Microsoft:ClientId" "microsoft-oauth-client-id" +dotnet user-secrets set "Authentication:github:clientSecret" "github-oauth-secret" +dotnet user-secrets set "Authentication:github:clientId" "github-oauth-client-id" + +# Security +dotnet user-secrets set "HCaptcha:SiteKey" "hcaptcha-site-key" +dotnet user-secrets set "HCaptcha:SecretKey" "hcaptcha-secret-key" + +# Application Insights +dotnet user-secrets set "APPLICATIONINSIGHTS_CONNECTION_STRING" "your-app-insights-connection" +``` + +### Package Feed Configuration +- Set `false` in `Directory.Packages.props` if you don't have access to private Azure DevOps feed +- Private feed contains `EssentialCSharp.Shared.Models` and content packages + +## AI Integration Patterns + +### Semantic Kernel Usage +- **Chat Services**: Implement AI chat functionality using Semantic Kernel +- **Vector Operations**: Use pgvector for semantic search and retrieval +- **Model Context Protocol**: Integrate with MCP for agent communication +- **Prompt Engineering**: Store prompts as structured templates + +### AI Service Patterns +```csharp +public interface IChatService +{ + Task ProcessMessageAsync(string message, CancellationToken cancellationToken); + Task> SearchContentAsync(string query, CancellationToken cancellationToken); +} +``` + +## Development Workflow & Best Practices + +### Code Review Guidelines +- Ensure all new code includes appropriate tests +- Follow established naming conventions and patterns +- Use async/await for all I/O operations +- Implement proper error handling and logging +- Add XML documentation for public APIs + +### Performance Considerations +- Use Entity Framework efficiently (avoid N+1 queries) +- Implement caching where appropriate +- Use async patterns for database and API calls +- Optimize Docker image size with multi-stage builds + +### Security Best Practices +- Never commit secrets to source control +- Use HTTPS for all external communications +- Implement proper input validation +- Follow OWASP security guidelines +- Use parameterized queries for database operations + +## Common Patterns & Utilities + +### Service Registration Pattern +```csharp +// In Program.cs +builder.Services.AddScoped(); +builder.Services.AddSingleton(); +``` + +### Configuration Pattern +```csharp +public class FeatureOptions +{ + public const string SectionName = "Feature"; + public string ApiKey { get; set; } = string.Empty; + public int TimeoutSeconds { get; set; } = 30; +} + +// Registration +builder.Services.Configure( + builder.Configuration.GetSection(FeatureOptions.SectionName)); +``` + +### Error Handling Pattern +```csharp +public async Task> MethodAsync() +{ + try + { + var result = await SomeOperationAsync(); + return Result.Success(result); + } + catch (SpecificException ex) + { + logger.LogError(ex, "Operation failed"); + return Result.Failure(ex.Message); + } +} +``` + +## Future Roadmap Considerations +- **Microservices Evolution**: Consider splitting into microservices as features grow +- **Performance Optimization**: Implement advanced caching and CDN strategies +- **AI Enhancement**: Expand AI capabilities with more sophisticated models +- **Mobile Support**: Potential mobile app integration +- **API Expansion**: RESTful API for third-party integrations + +## Anti-Patterns & Gotchas +- **Avoid**: Synchronous calls in async methods (use ConfigureAwait(false)) +- **Avoid**: Large Entity Framework queries without pagination +- **Avoid**: Hardcoded configuration values (use appsettings.json) +- **Avoid**: Missing error handling in async operations +- **Security**: Never expose sensitive configuration in client-side code \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ff37dc42..af927156 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,17 +5,53 @@ registries: url: https://pkgs.dev.azure.com/intelliTect/_packaging/EssentialCSharp/nuget/v3/index.json username: ${{secrets.AZURE_DEVOPS_PAT_USERNAME}} password: ${{secrets.AZURE_DEVOPS_PAT}} +multi-ecosystem-groups: + dotnet-sdk-updates: + schedule: + interval: "weekly" updates: - package-ecosystem: "nuget" # See documentation for possible values - directory: "/" # Location of package manifests + directories: + - "/" registries: - nuget-azure-artifacts schedule: interval: "daily" - time: "03:00" + time: "04:00" timezone: "America/Los_Angeles" + groups: + tooling-dependencies: + applies-to: version-updates + patterns: + - "ContentFeedNuget" + - "EssentialCSharp.Shared.Models" - package-ecosystem: "github-actions" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "weekly" + + - package-ecosystem: "docker" + # Look for a `Dockerfile` in the `root` directory + directory: "/EssentialCSharp.Web/" + patterns: + - "*" + multi-ecosystem-group: "dotnet-sdk-updates" + # Check for updates once a week + schedule: + interval: "weekly" + + - package-ecosystem: "dotnet-sdk" + # Look for a `global.json` in the `root` directory + directory: "/" + patterns: + - "*" + multi-ecosystem-group: "dotnet-sdk-updates" + # Check for updates once a week + schedule: + interval: "weekly" + + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: weekly diff --git a/.github/workflows/Automerge-ContentNugetFeed.yml b/.github/workflows/Automerge-ContentNugetFeed.yml new file mode 100644 index 00000000..cd2f68fb --- /dev/null +++ b/.github/workflows/Automerge-ContentNugetFeed.yml @@ -0,0 +1,33 @@ +name: Dependabot auto-merge +on: pull_request + +permissions: + contents: write + pull-requests: write + +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' }} + steps: + - name: Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@v3 + with: + github-token: ${{ secrets.BOT_PAT }} + - name: Add a label for content updates + if: ${{contains(steps.metadata.outputs.dependency-names, 'ContentFeedNuget')}} + run: gh pr edit "$PR_URL" --add-label "content update" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{ secrets.BOT_PAT }} + - name: Approve a PR + run: gh pr review --approve "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.BOT_PAT}} + - name: Enable auto-merge for Dependabot PRs + run: gh pr merge --auto --squash --delete-branch "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.BOT_PAT}} diff --git a/.github/workflows/Build-Test-And-Deploy.yml b/.github/workflows/Build-Test-And-Deploy.yml index 498d7dd7..ba675573 100644 --- a/.github/workflows/Build-Test-And-Deploy.yml +++ b/.github/workflows/Build-Test-And-Deploy.yml @@ -2,29 +2,31 @@ name: Build, Test, and Deploy EssentialCSharp.Web on: push: - branches: [ "main" ] - pull_request: - schedule: - - cron: '0 4 * * *' + branches: ["main"] workflow_dispatch: +permissions: + id-token: write + contents: read + jobs: build-and-test: runs-on: ubuntu-latest + environment: "BuildAndUploadImage" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: Set up .NET Core - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v5 with: global-json-file: global.json source-url: https://pkgs.dev.azure.com/intelliTect/_packaging/EssentialCSharp/nuget/v3/index.json env: - NUGET_AUTH_TOKEN: ${{secrets.AZURE_DEVOPS_PAT}} + NUGET_AUTH_TOKEN: ${{ secrets.AZURE_DEVOPS_PAT }} - name: Set up dependency caching for faster builds - uses: actions/cache@v3 + uses: actions/cache@v5 id: nuget-cache with: path: | @@ -34,69 +36,234 @@ jobs: restore-keys: | ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} ${{ runner.os }}-nuget- - + - name: Restore with dotnet run: dotnet restore - + - name: Build with dotnet - run: dotnet build --configuration Release --no-restore - + run: dotnet build -p:ContinuousIntegrationBuild=True -p:ReleaseDateAttribute=True --configuration Release --no-restore + + - name: Expose GitHub Actions Runtime + uses: actions/github-script@v9 + with: + script: | + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN']); + core.exportVariable('ACTIONS_RESULTS_URL', process.env['ACTIONS_RESULTS_URL']); + - name: Run .NET Tests run: dotnet test --no-build --configuration Release - - name: dotnet publish - if: github.event_name != 'pull_request' - run: dotnet publish -c Release -p:PublishDir=${{github.workspace}}/DeployEssentialCSharp.Web + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + +# Build but no push with a PR + - name: Docker build (no push) + if: github.event_name == 'pull_request' || github.event_name == 'merge_group' + uses: docker/build-push-action@v7 + with: + push: false + tags: temp-pr-validation + file: ./EssentialCSharp.Web/Dockerfile - - name: Upload artifact for deployment job - if: github.event_name != 'pull_request' - uses: actions/upload-artifact@v3 + - name: Build Container Image + if: github.event_name != 'pull_request_target' && github.event_name != 'pull_request' + uses: docker/build-push-action@v7 + with: + tags: ${{ vars.DEVCONTAINER_REGISTRY }}/essentialcsharpweb:${{ github.sha }},${{ vars.DEVCONTAINER_REGISTRY }}/essentialcsharpweb:latest,${{ vars.PRODCONTAINER_REGISTRY }}/essentialcsharpweb:${{ github.sha }},${{ vars.PRODCONTAINER_REGISTRY }}/essentialcsharpweb:latest + file: ./EssentialCSharp.Web/Dockerfile + context: . + secrets: | + "nuget_auth_token=${{ secrets.AZURE_DEVOPS_PAT }}" + outputs: type=docker,dest=${{ github.workspace }}/essentialcsharpwebimage.tar + cache-from: type=gha + cache-to: type=gha,mode=max + - name: Upload artifact + uses: actions/upload-artifact@v7 with: - name: .net-app - path: ${{github.workspace}}/DeployEssentialCSharp.Web + name: essentialcsharpwebimage + path: ${{ github.workspace }}/essentialcsharpwebimage.tar deploy-development: - if: github.event_name != 'pull_request' + if: github.event_name != 'pull_request_target' && github.event_name != 'pull_request' runs-on: ubuntu-latest needs: build-and-test + concurrency: + group: deploy-development + cancel-in-progress: false environment: - name: 'Development' - url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + name: "Development" steps: - - name: Download artifact from build job - uses: actions/download-artifact@v3 + - name: Azure Login + uses: azure/login@v3 with: - name: .net-app + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.ESSENTIALCSHARP_APPIDENTITY_TENANT_ID }} + subscription-id: ${{ secrets.ESSENTIALCSHARP_SUBSCRIPTION_ID }} - - name: Deploy to Azure Web App - id: deploy-to-webapp - uses: azure/webapps-deploy@v2 + - name: Download artifact + uses: actions/download-artifact@v8 with: - app-name: EssentialCSharpDev - slot-name: 'Production' - publish-profile: ${{ secrets.AZURE_DEVELOPMENT_PUBLISH_PROFILE }} - package: . - + name: essentialcsharpwebimage + path: ${{ github.workspace }} + + - name: Load image + run: | + docker load --input ${{ github.workspace }}/essentialcsharpwebimage.tar + docker image ls -a + + - name: Log in to container registry + run: | + REGISTRY="${{ vars.DEVCONTAINER_REGISTRY }}" + az acr login --name "${REGISTRY%.azurecr.io}" + + - name: Push Image to Container Registry + run: docker push --all-tags ${{ vars.DEVCONTAINER_REGISTRY }}/essentialcsharpweb + + - name: Configure Container App Identity and Registry + uses: azure/CLI@v3 + env: + CONTAINER_APP_NAME: ${{ vars.CONTAINER_APP_NAME }} + RESOURCEGROUP: ${{ vars.RESOURCEGROUP }} + CONTAINER_REGISTRY: ${{ vars.DEVCONTAINER_REGISTRY }} + with: + inlineScript: | + # Assumes container app already exists (provisioned by Terraform) + az extension add --name containerapp --upgrade + az containerapp identity assign --name $CONTAINER_APP_NAME --resource-group $RESOURCEGROUP --user-assigned ${{ secrets.WEB_UAMI_RESOURCE_ID }} + az containerapp registry set --name $CONTAINER_APP_NAME --resource-group $RESOURCEGROUP --server $CONTAINER_REGISTRY --identity ${{ secrets.WEB_UAMI_RESOURCE_ID }} + + - name: Assign Managed Identity to Container App and Set Secrets and Environment Variables + uses: azure/CLI@v3 + env: + CONTAINER_APP_NAME: ${{ vars.CONTAINER_APP_NAME }} + RESOURCEGROUP: ${{ vars.RESOURCEGROUP }} + CONTAINER_REGISTRY: ${{ vars.DEVCONTAINER_REGISTRY }} + KEYVAULTURI: ${{ secrets.ESSENTIALCSHARP_KEYVAULT_URI }} + MANAGEDIDENTITYID: ${{ secrets.WEB_UAMI_RESOURCE_ID }} + AZURECLIENTID: ${{ secrets.WEB_UAMI_CLIENT_ID }} + TRYDOTNET_ORIGIN: ${{ vars.TRYDOTNET_ORIGIN }} + with: + inlineScript: | + az containerapp secret set -n $CONTAINER_APP_NAME -g $RESOURCEGROUP --secrets github-clientid=keyvaultref:$KEYVAULTURI/secrets/authentication-github-clientid,identityref:$MANAGEDIDENTITYID \ + github-clientsecret=keyvaultref:$KEYVAULTURI/secrets/authentication-github-clientsecret,identityref:$MANAGEDIDENTITYID msft-clientid=keyvaultref:$KEYVAULTURI/secrets/authentication-microsoft-clientid,identityref:$MANAGEDIDENTITYID \ + msft-clientsecret=keyvaultref:$KEYVAULTURI/secrets/authentication-microsoft-clientsecret,identityref:$MANAGEDIDENTITYID emailsender-apikey=keyvaultref:$KEYVAULTURI/secrets/authmessagesender-apikey,identityref:$MANAGEDIDENTITYID \ + emailsender-secret=keyvaultref:$KEYVAULTURI/secrets/authmessagesender-secretkey,identityref:$MANAGEDIDENTITYID emailsender-name=keyvaultref:$KEYVAULTURI/secrets/authmessagesender-sendfromname,identityref:$MANAGEDIDENTITYID \ + emailsender-email=keyvaultref:$KEYVAULTURI/secrets/authmessagesender-sendfromemail,identityref:$MANAGEDIDENTITYID connectionstring=keyvaultref:$KEYVAULTURI/secrets/connectionstrings-essentialcsharpwebcontextconnection,identityref:$MANAGEDIDENTITYID \ + captcha-sitekey=keyvaultref:$KEYVAULTURI/secrets/captcha-sitekey,identityref:$MANAGEDIDENTITYID captcha-secretkey=keyvaultref:$KEYVAULTURI/secrets/captcha-secretkey,identityref:$MANAGEDIDENTITYID \ + appinsights-connectionstring=keyvaultref:$KEYVAULTURI/secrets/applicationinsights-connectionstring,identityref:$MANAGEDIDENTITYID \ + ai-endpoint=keyvaultref:$KEYVAULTURI/secrets/AIOptions--Endpoint,identityref:$MANAGEDIDENTITYID ai-apikey=keyvaultref:$KEYVAULTURI/secrets/AIOptions--ApiKey,identityref:$MANAGEDIDENTITYID \ + ai-vectordeployment=keyvaultref:$KEYVAULTURI/secrets/AIOptions--VectorGenerationDeploymentName,identityref:$MANAGEDIDENTITYID ai-chatdeployment=keyvaultref:$KEYVAULTURI/secrets/AIOptions--ChatDeploymentName,identityref:$MANAGEDIDENTITYID \ + ai-systemprompt=keyvaultref:$KEYVAULTURI/secrets/AIOptions--SystemPrompt,identityref:$MANAGEDIDENTITYID \ + postgres-vectorstore-connectionstring=keyvaultref:$KEYVAULTURI/secrets/ConnectionStrings--PostgresVectorStore,identityref:$MANAGEDIDENTITYID + az containerapp update --name $CONTAINER_APP_NAME --resource-group $RESOURCEGROUP \ + --image $CONTAINER_REGISTRY/essentialcsharpweb:${{ github.sha }} \ + --replace-env-vars Authentication__github__clientId=secretref:github-clientid Authentication__github__clientSecret=secretref:github-clientsecret \ + Authentication__microsoft__clientId=secretref:msft-clientid Authentication__microsoft__clientSecret=secretref:msft-clientsecret AuthMessageSender__ApiKey=secretref:emailsender-apikey AuthMessageSender__SecretKey=secretref:emailsender-secret \ + AuthMessageSender__SendFromName=secretref:emailsender-name AuthMessageSender__SendFromEmail=secretref:emailsender-email ConnectionStrings__EssentialCSharpWebContextConnection=secretref:connectionstring ASPNETCORE_ENVIRONMENT=Staging \ + AZURE_CLIENT_ID=$AZURECLIENTID HCaptcha__SiteKey=secretref:captcha-sitekey HCaptcha__SecretKey=secretref:captcha-secretkey APPLICATIONINSIGHTS_CONNECTION_STRING=secretref:appinsights-connectionstring \ + AIOptions__Endpoint=secretref:ai-endpoint AIOptions__ApiKey=secretref:ai-apikey AIOptions__VectorGenerationDeploymentName=secretref:ai-vectordeployment AIOptions__ChatDeploymentName=secretref:ai-chatdeployment \ + AIOptions__SystemPrompt=secretref:ai-systemprompt ConnectionStrings__PostgresVectorStore=secretref:postgres-vectorstore-connectionstring \ + TryDotNet__Origin=$TRYDOTNET_ORIGIN DataProtection__AzureKeyVaultKeyUri=$KEYVAULTURI/keys/dataprotection + + - name: Logout of Azure CLI + if: always() + uses: azure/CLI@v3 + with: + inlineScript: | + az logout + az cache purge + az account clear + deploy-production: - if: github.event_name != 'pull_request' + if: github.event_name != 'pull_request_target' && github.event_name != 'pull_request' runs-on: ubuntu-latest - needs: [build-and-test, deploy-development] + needs: [deploy-development] + concurrency: + group: deploy-production + cancel-in-progress: false environment: - name: 'Production' - url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + name: "Production" steps: - - name: Download artifact from build job - uses: actions/download-artifact@v3 + - name: Azure Login + uses: azure/login@v3 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.ESSENTIALCSHARP_TENANT_ID }} + subscription-id: ${{ secrets.ESSENTIALCSHARP_SUBSCRIPTION_ID }} + + - name: Download artifact + uses: actions/download-artifact@v8 + with: + name: essentialcsharpwebimage + path: ${{ github.workspace }} + + - name: Load image + run: | + docker load --input ${{ github.workspace }}/essentialcsharpwebimage.tar + docker image ls -a + + - name: Log in to container registry + run: | + REGISTRY="${{ vars.PRODCONTAINER_REGISTRY }}" + az acr login --name "${REGISTRY%.azurecr.io}" + + - name: Push Image to Container Registry + run: docker push --all-tags ${{ vars.PRODCONTAINER_REGISTRY }}/essentialcsharpweb + + - name: Configure Container App Identity and Registry + uses: azure/CLI@v3 + env: + CONTAINER_APP_NAME: ${{ vars.CONTAINER_APP_NAME }} + RESOURCEGROUP: ${{ vars.RESOURCEGROUP }} + CONTAINER_REGISTRY: ${{ vars.PRODCONTAINER_REGISTRY }} with: - name: .net-app + inlineScript: | + # Assumes container app already exists (provisioned by Terraform) + az extension add --name containerapp --upgrade + az containerapp identity assign --name $CONTAINER_APP_NAME --resource-group $RESOURCEGROUP --user-assigned ${{ secrets.WEB_UAMI_RESOURCE_ID }} + az containerapp registry set --name $CONTAINER_APP_NAME --resource-group $RESOURCEGROUP --server $CONTAINER_REGISTRY --identity ${{ secrets.WEB_UAMI_RESOURCE_ID }} + + - name: Assign Managed Identity to Container App and Set Secrets and Environment Variables + uses: azure/CLI@v3 + env: + CONTAINER_APP_NAME: ${{ vars.CONTAINER_APP_NAME }} + RESOURCEGROUP: ${{ vars.RESOURCEGROUP }} + CONTAINER_REGISTRY: ${{ vars.PRODCONTAINER_REGISTRY }} + KEYVAULTURI: ${{ secrets.ESSENTIALCSHARP_KEYVAULT_URI }} + MANAGEDIDENTITYID: ${{ secrets.WEB_UAMI_RESOURCE_ID }} + AZURECLIENTID: ${{ secrets.WEB_UAMI_CLIENT_ID }} + TRYDOTNET_ORIGIN: ${{ vars.PROD_TRYDOTNET_ORIGIN }} + with: + inlineScript: | + az containerapp secret set -n $CONTAINER_APP_NAME -g $RESOURCEGROUP --secrets github-clientid=keyvaultref:$KEYVAULTURI/secrets/authentication-github-clientid,identityref:$MANAGEDIDENTITYID \ + github-clientsecret=keyvaultref:$KEYVAULTURI/secrets/authentication-github-clientsecret,identityref:$MANAGEDIDENTITYID msft-clientid=keyvaultref:$KEYVAULTURI/secrets/authentication-microsoft-clientid,identityref:$MANAGEDIDENTITYID \ + msft-clientsecret=keyvaultref:$KEYVAULTURI/secrets/authentication-microsoft-clientsecret,identityref:$MANAGEDIDENTITYID emailsender-apikey=keyvaultref:$KEYVAULTURI/secrets/authmessagesender-apikey,identityref:$MANAGEDIDENTITYID \ + emailsender-secret=keyvaultref:$KEYVAULTURI/secrets/authmessagesender-secretkey,identityref:$MANAGEDIDENTITYID emailsender-name=keyvaultref:$KEYVAULTURI/secrets/authmessagesender-sendfromname,identityref:$MANAGEDIDENTITYID \ + emailsender-email=keyvaultref:$KEYVAULTURI/secrets/authmessagesender-sendfromemail,identityref:$MANAGEDIDENTITYID connectionstring=keyvaultref:$KEYVAULTURI/secrets/connectionstrings-essentialcsharpwebcontextconnection,identityref:$MANAGEDIDENTITYID \ + captcha-sitekey=keyvaultref:$KEYVAULTURI/secrets/captcha-sitekey,identityref:$MANAGEDIDENTITYID captcha-secretkey=keyvaultref:$KEYVAULTURI/secrets/captcha-secretkey,identityref:$MANAGEDIDENTITYID \ + appinsights-connectionstring=keyvaultref:$KEYVAULTURI/secrets/applicationinsights-connectionstring,identityref:$MANAGEDIDENTITYID \ + ai-endpoint=keyvaultref:$KEYVAULTURI/secrets/AIOptions--Endpoint,identityref:$MANAGEDIDENTITYID ai-apikey=keyvaultref:$KEYVAULTURI/secrets/AIOptions--ApiKey,identityref:$MANAGEDIDENTITYID \ + ai-vectordeployment=keyvaultref:$KEYVAULTURI/secrets/AIOptions--VectorGenerationDeploymentName,identityref:$MANAGEDIDENTITYID ai-chatdeployment=keyvaultref:$KEYVAULTURI/secrets/AIOptions--ChatDeploymentName,identityref:$MANAGEDIDENTITYID \ + ai-systemprompt=keyvaultref:$KEYVAULTURI/secrets/AIOptions--SystemPrompt,identityref:$MANAGEDIDENTITYID \ + postgres-vectorstore-connectionstring=keyvaultref:$KEYVAULTURI/secrets/ConnectionStrings--PostgresVectorStore,identityref:$MANAGEDIDENTITYID + az containerapp update --name $CONTAINER_APP_NAME --resource-group $RESOURCEGROUP \ + --image $CONTAINER_REGISTRY/essentialcsharpweb:${{ github.sha }} \ + --replace-env-vars Authentication__github__clientId=secretref:github-clientid Authentication__github__clientSecret=secretref:github-clientsecret \ + Authentication__microsoft__clientId=secretref:msft-clientid Authentication__microsoft__clientSecret=secretref:msft-clientsecret AuthMessageSender__ApiKey=secretref:emailsender-apikey AuthMessageSender__SecretKey=secretref:emailsender-secret \ + AuthMessageSender__SendFromName=secretref:emailsender-name AuthMessageSender__SendFromEmail=secretref:emailsender-email ConnectionStrings__EssentialCSharpWebContextConnection=secretref:connectionstring ASPNETCORE_ENVIRONMENT=Production \ + AZURE_CLIENT_ID=$AZURECLIENTID HCaptcha__SiteKey=secretref:captcha-sitekey HCaptcha__SecretKey=secretref:captcha-secretkey APPLICATIONINSIGHTS_CONNECTION_STRING=secretref:appinsights-connectionstring \ + AIOptions__Endpoint=secretref:ai-endpoint AIOptions__ApiKey=secretref:ai-apikey AIOptions__VectorGenerationDeploymentName=secretref:ai-vectordeployment AIOptions__ChatDeploymentName=secretref:ai-chatdeployment \ + AIOptions__SystemPrompt=secretref:ai-systemprompt ConnectionStrings__PostgresVectorStore=secretref:postgres-vectorstore-connectionstring \ + TryDotNet__Origin=$TRYDOTNET_ORIGIN DataProtection__AzureKeyVaultKeyUri=$KEYVAULTURI/keys/dataprotection + - - name: Deploy to Azure Web App - id: deploy-to-webapp - uses: azure/webapps-deploy@v2 + - name: Logout of Azure CLI + if: always() + uses: azure/CLI@v3 with: - app-name: essentialcsharp - slot-name: 'Production' - publish-profile: ${{ secrets.AZURE_PRODUCTION_PUBLISH_PROFILE }} - package: . + inlineScript: | + az logout + az cache purge + az account clear diff --git a/.github/workflows/Build-Vector-DB.yml b/.github/workflows/Build-Vector-DB.yml new file mode 100644 index 00000000..b8940e9a --- /dev/null +++ b/.github/workflows/Build-Vector-DB.yml @@ -0,0 +1,26 @@ +name: Build Vector DB + +on: + push: + branches: ["main"] + pull_request_target: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Set up Python 3.8 + uses: actions/setup-python@v6 + with: + python-version: 3.8 + - name: Install dependencies + run: | + sudo apt-get install nuget + nuget config -Set repositoryPath=${{ github.workspace }}/packages -configfile ${{ github.workspace }}/nuget.config + nuget.exe setapikey ${{ secrets.NUGET_API_KEY }} -source "https://pkgs.dev.azure.com/intelliTect/_packaging/EssentialCSharp/nuget/v3/index.json" + nuget.exe restore ${{ github.workspace }}/EssentialCSharp.Chat/packages.config -PackagesDirectory ${{ github.workspace }}/packages + python -m pip install --upgrade pip + pip install -r ${{ github.workspace }}/EssentialCSharp.Chat/requirements.txt + ls ${{ github.workspace }}/packages \ No newline at end of file diff --git a/.github/workflows/CleanupCaches.yml b/.github/workflows/CleanupCaches.yml index 0850e5de..7818ba9b 100644 --- a/.github/workflows/CleanupCaches.yml +++ b/.github/workflows/CleanupCaches.yml @@ -4,29 +4,27 @@ on: types: - closed +permissions: + actions: write + jobs: cleanup: runs-on: ubuntu-latest steps: - - name: Check out code - uses: actions/checkout@v3 - - name: Cleanup run: | - gh extension install actions/gh-actions-cache - REPO=${{ github.repository }} BRANCH="refs/pull/${{ github.event.pull_request.number }}/merge" - echo "Fetching list of cache key" - cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH | cut -f 1 ) + echo "Fetching list of cache keys" + cacheKeysForPR=$(gh cache list -R $REPO --ref $BRANCH | cut -f 1) - ## Setting this to not fail the workflow while deleting cache keys. + ## Setting this to not fail the workflow while deleting cache keys. set +e echo "Deleting caches..." for cacheKey in $cacheKeysForPR do - gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm + gh cache delete $cacheKey -R $REPO done echo "Done" env: diff --git a/.github/workflows/PR-Build-And-Test.yml b/.github/workflows/PR-Build-And-Test.yml new file mode 100644 index 00000000..6da97804 --- /dev/null +++ b/.github/workflows/PR-Build-And-Test.yml @@ -0,0 +1,65 @@ +name: PR Build and Test EssentialCSharp.Web + +on: + pull_request: + branches: ["main"] + workflow_dispatch: + +jobs: + build-and-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Set up .NET Core + uses: actions/setup-dotnet@v5 + with: + global-json-file: global.json + + - name: Set up dependency caching for faster builds + uses: actions/cache@v5 + id: nuget-cache + with: + path: | + ~/.nuget/packages + ${{ github.workspace }}/**/obj/project.assets.json + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + restore-keys: | + ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + ${{ runner.os }}-nuget- + + - name: Restore with dotnet + run: dotnet restore /p:AccessToNugetFeed=false + + - name: Build with dotnet + run: dotnet build --configuration Release --no-restore /p:AccessToNugetFeed=false + + - name: Expose GitHub Actions Runtime + uses: actions/github-script@v9 + with: + script: | + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN']); + core.exportVariable('ACTIONS_RESULTS_URL', process.env['ACTIONS_RESULTS_URL']); + + - name: Run .NET Tests + run: dotnet test --no-build --configuration Release --report-trx --coverage --results-directory ${{ runner.temp }} + + - name: Convert TRX to VS Playlist + if: failure() + uses: BenjaminMichaelis/trx-to-vsplaylist@v3 + with: + trx-file-path: '${{ runner.temp }}/*.trx' + output-directory: '${{ runner.temp }}/vsplaylists' + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + + - name: Build Container Image + uses: docker/build-push-action@v7 + with: + file: ./EssentialCSharp.Web/Dockerfile + context: . + outputs: type=docker,dest=${{ github.workspace }}/essentialcsharpwebimage.tar + cache-from: type=gha + cache-to: type=gha,mode=max + build-args: ACCESS_TO_NUGET_FEED=false diff --git a/.github/workflows/UpdateSiteCertificate.yml b/.github/workflows/UpdateSiteCertificate.yml new file mode 100644 index 00000000..ad4c2b3d --- /dev/null +++ b/.github/workflows/UpdateSiteCertificate.yml @@ -0,0 +1,100 @@ +name: Update Site Certificate + +on: + schedule: + - cron: "1 1 1 * *" + workflow_dispatch: + +permissions: + id-token: write + contents: read + +jobs: + update-site-certificate: + runs-on: ubuntu-latest + environment: WebCertificate + + steps: + - name: Azure login + uses: azure/login@v3 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + + - uses: actions/checkout@v6 + with: + repository: "EssentialCSharp/EssentialCSharp.Web.CertbotDnsGoDaddy" + token: ${{ secrets.CERTBOTDNSGODADDY_PAT }} + # If testing, change this to the "staging" branch to not use up your Let's Encrypt quota for the week (which is very very small) + ref: "main" + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version: '3.12' + cache: 'pip' + + - name: Retrieve the key and add it to a file + env: + APIKEY_BASE64: ${{ secrets.GODADDY_APIKEY_BASE64 }} + run: | + echo $APIKEY_BASE64 | base64 --decode > godaddycreds.ini + + - name: Run Certbot + run: | + pip install --upgrade pip + python3 -m venv .venv + source .venv/bin/activate + pip install -r requirements.txt + chmod 600 godaddycreds.ini + sudo .venv/bin/python -m main + deactivate + + - name: Clear API File + if: '!cancelled()' + run: | + rm *ini + + - name: Create Private Certificate + env: + CERT_PASSWORD: ${{ secrets.CERT_PASSWORD }} + run: | + sudo chmod 0755 /etc/letsencrypt/{live,archive} + sudo chown $USER: /etc/letsencrypt/live/essentialcsharp.com/privkey.pem + sudo chmod 0640 /etc/letsencrypt/live/essentialcsharp.com/privkey.pem + openssl pkcs12 -export -out certificate.pfx -inkey /etc/letsencrypt/live/essentialcsharp.com/privkey.pem -in /etc/letsencrypt/live/essentialcsharp.com/cert.pem -certfile /etc/letsencrypt/live/essentialcsharp.com/chain.pem -passout pass:"$CERT_PASSWORD" -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -macalg SHA1 + + - name: Upload certificate + env: + CERT_PASSWORD: ${{ secrets.CERT_PASSWORD }} + RESOURCE_GROUP: ${{ vars.RESOURCE_GROUP }} + CONTAINER_APP_NAME: ${{ vars.CONTAINER_APP_NAME }} + CONTAINER_APP_ENVIRONMENT: ${{ vars.CONTAINER_APP_ENVIRONMENT }} + uses: azure/CLI@v3 + with: + azcliversion: latest + inlineScript: | + az containerapp ssl upload --resource-group $RESOURCE_GROUP --name $CONTAINER_APP_NAME --environment $CONTAINER_APP_ENVIRONMENT --hostname essentialcsharp.com --certificate-file /home/runner/work/EssentialCSharp.Web/EssentialCSharp.Web/certificate.pfx --certificate-name essentialcsharp.comcertificate --password "$CERT_PASSWORD" + + - name: Clear certificate directories + if: '!cancelled()' + run: | + sudo rm -rf /etc/letsencrypt + + - name: Logout of Azure CLI + if: '!cancelled()' + uses: azure/CLI@v3 + with: + inlineScript: | + az logout + az cache purge + az account clear + + - name: Clear Azure PowerShell Context + if: '!cancelled()' + uses: azure/powershell@v3.0.0 + with: + azPSVersion: "latest" + inlineScript: | + Clear-AzContext -Scope Process \ No newline at end of file diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..324e67af --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,91 @@ +name: "CodeQL" + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + schedule: + - cron: '21 15 * * 5' + +jobs: + analyze-csharp: + name: Analyze C# (CodeQL) + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'csharp' ] + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + + - name: Set up .NET Core + uses: actions/setup-dotnet@v5 + + - name: Set up dependency caching for faster builds + uses: actions/cache@v5 + id: nuget-cache + with: + path: | + ~/.nuget/packages + ${{ github.workspace }}/**/obj/project.assets.json + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + restore-keys: | + ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + ${{ runner.os }}-nuget- + + - name: Restore with dotnet + run: | + dotnet restore /p:AccessToNugetFeed=false + dotnet build --configuration Release --no-restore --no-incremental /p:AccessToNugetFeed=false + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + with: + category: "/language:${{matrix.language}}" + + analyze-non-compiled-languages: + name: Analyze Non-Compiled Languages (CodeQL) + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript-typescript' ] + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + + - name: Autobuild + uses: github/codeql-action/autobuild@v4 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 00000000..325da14f --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,66 @@ +name: Setup GitHub Copilot Agent Environment + +on: + workflow_dispatch: + push: + paths: + - '.github/workflows/copilot-setup-steps.yml' + pull_request: + paths: + - '.github/workflows/copilot-setup-steps.yml' + +permissions: + contents: read + +jobs: + copilot-setup-steps: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + + - name: Set up .NET Core + uses: actions/setup-dotnet@v5 + with: + global-json-file: global.json + source-url: https://pkgs.dev.azure.com/intelliTect/_packaging/EssentialCSharp/nuget/v3/index.json + env: + NUGET_AUTH_TOKEN: ${{ secrets.AZURE_DEVOPS_PAT }} + + - name: Set up dependency caching for faster builds + uses: actions/cache@v5 + id: nuget-cache + with: + path: | + ~/.nuget/packages + ${{ github.workspace }}/**/obj/project.assets.json + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + restore-keys: | + ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + ${{ runner.os }}-nuget- + + - name: Restore with dotnet + run: dotnet restore + + - name: Build with dotnet + run: dotnet build -p:ContinuousIntegrationBuild=True -p:ReleaseDateAttribute=True --configuration Release --no-restore + + - name: Run .NET Tests + run: dotnet test --no-build --configuration Release + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + + - name: Set up Node.js for frontend development + uses: actions/setup-node@v6 + with: + node-version: '20' + + - name: Install additional development tools + run: | + # Install common development tools that Copilot agents might need + echo "Installing additional tools for Copilot agent environment..." + + # Install EF Core tools globally + dotnet tool install --global dotnet-ef diff --git a/.gitignore b/.gitignore index a250f036..7a8c84ce 100644 --- a/.gitignore +++ b/.gitignore @@ -6,10 +6,12 @@ EssentialCSharpManuscript.[0-9] .vs/ obj bin +TestResults/ ~$*.do[ct]x ~*.tmp ~$*.dotm +# Files to keep (primarily book content) !.gitignore !.gitattributes !EssentialC#.dotx @@ -27,29 +29,260 @@ bin !Michaelis_Acknowledgments.docx !Michaelis_Forward.docx !Michaelis_TableOfContents.docx + +# Old or generated files to not commit wwwroot/sitemap.xml +wwwroot/Chapters +EssentialCSharp.Web/wwwroot/Chapters +EssentialCSharp.Web/wwwroot/sitemap.xml +EssentialCSharp.Web/Chapters/ +EssentialCSharp.Web/ListingSourceCode +Utilities/EssentialCSharp.Web/Chapters/ +Utilities/EssentialCSharp.Web/wwwroot/sitemap.xml +Utilities/EssentialCSharp.Web/wwwroot/Chapters/ *.user Utilities/Parser.Web/.local-chromium -# Local History for Visual Studio Code -.history/ +[Ee]xpress/ -# Visual Studio code coverage results -*.coverage -*.coveragexml -Utilities/EssentialCSharp.Web/wwwroot/Chapters/ +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html -#JetBrains Rider IDE Settings -*/.idea/ +# Click-Once directory +publish/ -Utilities/EssentialCSharp.Web/Chapters/ +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj -Utilities/EssentialCSharp.Web/wwwroot/sitemap.xml +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ -Utilities/EssentialCSharpUtilities.lutconfig +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets -EssentialCSharp.Web/Chapters/ +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log msbuild.binlog +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/mcp.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +EssentialCSharp.Web/Markdown/ + +EssentialCSharp.Web/Guidelines/ + +# DevContainer environment files with sensitive data +.devcontainer/.env diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..d5b04848 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,35 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md. + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/EssentialCSharp.Web/bin/Debug/net9.0/EssentialCSharp.Web.dll", + "args": [], + "cwd": "${workspaceFolder}/EssentialCSharp.Web", + "stopAtEntry": false, + // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser + "serverReadyAction": { + "action": "openExternally", + "pattern": "\\bNow listening on:\\s+(https?://\\S+)" + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/.vscode/mcp.json b/.vscode/mcp.json new file mode 100644 index 00000000..81ac25d9 --- /dev/null +++ b/.vscode/mcp.json @@ -0,0 +1,12 @@ +{ + "servers": { + "context7": { + "type": "http", + "url": "https://mcp.context7.com/mcp" + }, + "microsoftdocs": { + "type": "http", + "url": "https://learn.microsoft.com/api/mcp" + } + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..57ccdc50 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/EssentialCSharp.Web.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/EssentialCSharp.Web.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/EssentialCSharp.Web.sln" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props index 42f6809e..1a87d274 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,13 +1,15 @@ enable - 11 + 14 Recommended enable true true + Linux True + 18e91e0d-ea2d-490f-b77e-ec008f9d09ec - \ No newline at end of file + diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 00000000..079538fa --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,68 @@ + + + true + false + 1.1.1.18983 + false + + https://api.nuget.org/v3/index.json; + + + $(RestoreSources); + https://pkgs.dev.azure.com/intelliTect/_packaging/EssentialCSharp/nuget/v3/index.json; + + + + 1.74.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/EssentialCSharp.Chat.Shared/EssentialCSharp.Chat.Common.csproj b/EssentialCSharp.Chat.Shared/EssentialCSharp.Chat.Common.csproj new file mode 100644 index 00000000..20ffba5d --- /dev/null +++ b/EssentialCSharp.Chat.Shared/EssentialCSharp.Chat.Common.csproj @@ -0,0 +1,20 @@ + + + + net10.0 + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/EssentialCSharp.Chat.Shared/Extensions/ServiceCollectionExtensions.cs b/EssentialCSharp.Chat.Shared/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 00000000..3e9aef3b --- /dev/null +++ b/EssentialCSharp.Chat.Shared/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,249 @@ +using Azure.AI.OpenAI; +using Azure.Core; +using Azure.Identity; +using EssentialCSharp.Chat.Common.Services; +using Microsoft.Extensions.AI; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.SemanticKernel; +using Npgsql; + +namespace EssentialCSharp.Chat.Common.Extensions; + +public static class ServiceCollectionExtensions +{ + private static readonly string[] _PostgresScopes = ["https://ossrdbms-aad.database.windows.net/.default"]; + + /// + /// Adds Azure OpenAI and related AI services to the service collection using Managed Identity + /// + /// The service collection to add services to + /// The AI configuration options + /// The PostgreSQL connection string for the vector store + /// The token credential to use for authentication. If null, DefaultAzureCredential will be used. + /// The service collection for chaining + public static IServiceCollection AddAzureOpenAIServices( + this IServiceCollection services, + AIOptions aiOptions, + string postgresConnectionString, + TokenCredential? credential = null) + { + // Use DefaultAzureCredential if no credential is provided + // This works both locally (using Azure CLI, Visual Studio, etc.) and in Azure (using Managed Identity) + credential ??= new DefaultAzureCredential(); + + if (string.IsNullOrEmpty(aiOptions.Endpoint)) + { + throw new InvalidOperationException("AIOptions.Endpoint is required."); + } + + var endpoint = new Uri(aiOptions.Endpoint); + + // Register Azure OpenAI services with Managed Identity authentication +#pragma warning disable SKEXP0010 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + services.AddAzureOpenAIChatClient( + aiOptions.ChatDeploymentName, + endpoint.ToString(), + credential); + + services.AddSingleton(provider => + new AzureOpenAIClient(endpoint, credential)); + + services.AddAzureOpenAIChatCompletion( + aiOptions.ChatDeploymentName, + aiOptions.Endpoint, + credential); + + // Add PostgreSQL vector store with managed identity support + services.AddPostgresVectorStoreWithManagedIdentity(postgresConnectionString, credential); + + services.AddEmbeddingGenerator(sp => + sp.GetRequiredService() + .GetEmbeddingClient(aiOptions.VectorGenerationDeploymentName) + .AsIEmbeddingGenerator()) + .UseLogging() + .UseOpenTelemetry(); +#pragma warning restore SKEXP0010 + + // Register shared AI services + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + return services; + } + + /// + /// Adds Azure OpenAI and related AI services to the service collection using configuration + /// + /// The service collection to add services to + /// The configuration to read AIOptions from + /// Optional token credential to use for authentication. If null, DefaultAzureCredential will be used. + /// The service collection for chaining + public static IServiceCollection AddAzureOpenAIServices( + this IServiceCollection services, + IConfiguration configuration, + TokenCredential? credential = null) + { + // Configure AI options from configuration + services.Configure(configuration.GetSection("AIOptions")); + + var aiOptions = configuration.GetSection("AIOptions").Get(); + if (aiOptions == null) + { + throw new InvalidOperationException("AIOptions section is missing from configuration."); + } + + // Get PostgreSQL connection string using the standard method + var postgresConnectionString = configuration.GetConnectionString("PostgresVectorStore") ?? + throw new InvalidOperationException("Connection string 'PostgresVectorStore' not found."); + + return services.AddAzureOpenAIServices(aiOptions, postgresConnectionString, credential); + } + + /// + /// Adds PostgreSQL vector store with managed identity authentication support. + /// Uses per-connection token refresh via UsePasswordProvider, which calls + /// on every new physical connection. + /// caches tokens internally and auto-refreshes + /// ~5 minutes before expiry, so this does not add Azure AD overhead. + /// + /// The service collection to add services to + /// The PostgreSQL connection string (without password) + /// The token credential to use for authentication. If null, DefaultAzureCredential will be used. + /// The service collection for chaining + private static IServiceCollection AddPostgresVectorStoreWithManagedIdentity( + this IServiceCollection services, + string connectionString, + TokenCredential? credential = null) + { + credential ??= new DefaultAzureCredential(); + + // Register NpgsqlDataSource with UseVector() enabled - this is critical for pgvector support + services.AddSingleton(sp => + { + var connBuilder = new NpgsqlConnectionStringBuilder(connectionString); + bool isAzurePostgres = connBuilder.Host?.Contains(".postgres.database.azure.com", + StringComparison.OrdinalIgnoreCase) ?? false; + + var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString); + // IMPORTANT: UseVector() must be called to enable pgvector support + dataSourceBuilder.UseVector(); + + if (isAzurePostgres && string.IsNullOrEmpty(connBuilder.Password)) + { + // Ensure SSL is enabled for Azure PostgreSQL + if (dataSourceBuilder.ConnectionStringBuilder.SslMode < SslMode.Require) + { + dataSourceBuilder.ConnectionStringBuilder.SslMode = SslMode.Require; + } + + var tokenRequestContext = new TokenRequestContext(_PostgresScopes); + + // UsePasswordProvider is called for every new physical connection. + // DefaultAzureCredential caches tokens internally and auto-refreshes ~5 min before + // expiry β€” no extra Azure AD load. This is the approach recommended by the Npgsql + // docs for cloud providers that implement their own caching (Azure MI does). + // UsePeriodicPasswordProvider is only for token sources without built-in caching. + // See: https://www.npgsql.org/doc/security.html + // See: https://github.com/npgsql/npgsql/issues/5186 + // + // Note: The username is expected to be set in the connection string already + // (Aspire sets it during deployment for Azure PostgreSQL Flexible Server). + // If a standalone username-extraction fallback is ever needed, use the + // Microsoft.Azure.PostgreSQL.Auth package (UseEntraAuthentication extension) + // once it ships on NuGet. + dataSourceBuilder.UsePasswordProvider( + passwordProvider: _ => credential.GetToken(tokenRequestContext, default).Token, + passwordProviderAsync: async (_, ct) => + (await credential.GetTokenAsync(tokenRequestContext, ct)).Token); + + // Recycle pooled connections after 50 min, well before the 60-min JWT token TTL. + // Combined with UsePasswordProvider (called on every new physical connection), + // this ensures no pooled connection ever holds an expired token. + dataSourceBuilder.ConnectionStringBuilder.ConnectionLifetime = 3000; + } + + return dataSourceBuilder.Build(); + }); + + // Register the vector store using the NpgsqlDataSource from DI +#pragma warning disable SKEXP0010 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + services.AddPostgresVectorStore(); +#pragma warning restore SKEXP0010 + + return services; + } + + /// + /// Adds Azure OpenAI and related AI services to the service collection using API key authentication (legacy) + /// + /// The service collection to add services to + /// The AI configuration options + /// The PostgreSQL connection string for the vector store + /// The API key for Azure OpenAI authentication + /// The service collection for chaining + [Obsolete("API key authentication is not recommended for production. Use AddAzureOpenAIServices with Managed Identity instead.")] + public static IServiceCollection AddAzureOpenAIServicesWithApiKey( + this IServiceCollection services, + AIOptions aiOptions, + string postgresConnectionString, + string apiKey) + { + if (string.IsNullOrEmpty(apiKey)) + { + throw new ArgumentException("API key cannot be null or empty.", nameof(apiKey)); + } + + if (string.IsNullOrEmpty(aiOptions.Endpoint)) + { + throw new InvalidOperationException("AIOptions.Endpoint is required."); + } + + var endpoint = new Uri(aiOptions.Endpoint); + + // Register Azure OpenAI services with API key authentication +#pragma warning disable SKEXP0010 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + services.AddAzureOpenAIChatClient( + aiOptions.ChatDeploymentName, + aiOptions.Endpoint, + apiKey); + + services.AddSingleton(provider => + new AzureOpenAIClient(endpoint, new Azure.AzureKeyCredential(apiKey))); + + services.AddAzureOpenAIChatCompletion( + aiOptions.ChatDeploymentName, + aiOptions.Endpoint, + apiKey); + + // Register NpgsqlDataSource with UseVector() enabled for API key scenario as well + services.AddSingleton(sp => + { + var dataSourceBuilder = new NpgsqlDataSourceBuilder(postgresConnectionString); + // IMPORTANT: UseVector() must be called to enable pgvector support + dataSourceBuilder.UseVector(); + return dataSourceBuilder.Build(); + }); + + // Add PostgreSQL vector store using the NpgsqlDataSource from DI + services.AddPostgresVectorStore(); + + services.AddEmbeddingGenerator(sp => + sp.GetRequiredService() + .GetEmbeddingClient(aiOptions.VectorGenerationDeploymentName) + .AsIEmbeddingGenerator()) + .UseLogging() + .UseOpenTelemetry(); +#pragma warning restore SKEXP0010 + + // Register shared AI services + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + return services; + } +} diff --git a/EssentialCSharp.Chat.Shared/Models/AIOptions.cs b/EssentialCSharp.Chat.Shared/Models/AIOptions.cs new file mode 100644 index 00000000..290b49ab --- /dev/null +++ b/EssentialCSharp.Chat.Shared/Models/AIOptions.cs @@ -0,0 +1,29 @@ +ο»Ώnamespace EssentialCSharp.Chat; + +public class AIOptions +{ + /// + /// The Azure OpenAI deployment name for text embedding generation. + /// + public string VectorGenerationDeploymentName { get; set; } = string.Empty; + + /// + /// The Azure OpenAI deployment name for chat completions. + /// + public string ChatDeploymentName { get; set; } = string.Empty; + + /// + /// The system prompt to use for the chat model. + /// + public string SystemPrompt { get; set; } = string.Empty; + + /// + /// The Azure OpenAI endpoint URL. + /// + public string Endpoint { get; set; } = string.Empty; + + /// + /// The API key for accessing Azure OpenAI services. + /// + public string ApiKey { get; set; } = string.Empty; +} diff --git a/EssentialCSharp.Chat.Shared/Models/BookContentChunk.cs b/EssentialCSharp.Chat.Shared/Models/BookContentChunk.cs new file mode 100644 index 00000000..e70ac015 --- /dev/null +++ b/EssentialCSharp.Chat.Shared/Models/BookContentChunk.cs @@ -0,0 +1,56 @@ +using Microsoft.Extensions.VectorData; + +namespace EssentialCSharp.Chat.Common.Models; + +/// +/// Represents a chunk of book content for vector search +/// +public sealed class BookContentChunk +{ + /// + /// Unique identifier for the chunk - serves as the vector store key + /// + [VectorStoreKey] + public string Id { get; set; } = string.Empty; + + /// + /// Original source file name + /// + [VectorStoreData] + public string FileName { get; set; } = string.Empty; + + /// + /// Heading or title of the markdown chunk + /// + [VectorStoreData] + public string Heading { get; set; } = string.Empty; + + /// + /// The actual markdown content text for this chunk + /// + [VectorStoreData] + public string ChunkText { get; set; } = string.Empty; + + /// + /// Chapter number extracted from filename (e.g., "Chapter01.md" -> 1) + /// + [VectorStoreData] + public int? ChapterNumber { get; set; } + + /// + /// SHA256 hash of the chunk content for change detection + /// + [VectorStoreData] + public string ContentHash { get; set; } = string.Empty; + + /// + /// Vector embedding for the chunk text - will be generated by embedding service + /// Using 1536 dimensions for Azure OpenAI text-embedding-3-small + /// Note: HNSW index in Semantic Kernel PostgreSQL connector supports max 2000 dimensions + /// https://github.com/pgvector/pgvector/issues/461 + /// Use CosineSimilarity distance function since we are using text-embedding-3 (https://platform.openai.com/docs/guides/embeddings#which-distance-function-should-i-use) + /// Postgres supports only Hnsw: https://learn.microsoft.com/en-us/semantic-kernel/concepts/vector-store-connectors/out-of-the-box-connectors/postgres-connector?pivots=programming-language-csharp&WT.mc_id=8B97120A00B57354 + /// + [VectorStoreVector(Dimensions: 1536, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)] + public ReadOnlyMemory? TextEmbedding { get; set; } +} diff --git a/EssentialCSharp.Chat.Shared/Services/AIChatService.cs b/EssentialCSharp.Chat.Shared/Services/AIChatService.cs new file mode 100644 index 00000000..0474ce92 --- /dev/null +++ b/EssentialCSharp.Chat.Shared/Services/AIChatService.cs @@ -0,0 +1,360 @@ +using Azure.AI.OpenAI; +using Microsoft.Extensions.Options; +using ModelContextProtocol.Client; +using ModelContextProtocol.Protocol; +using OpenAI.Responses; + +namespace EssentialCSharp.Chat.Common.Services; + +/// +/// Service for handling AI chat completions using the OpenAI Responses API +/// +public class AIChatService +{ + private readonly AIOptions _Options; + private readonly AzureOpenAIClient _AzureClient; +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + private readonly OpenAIResponseClient _ResponseClient; +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + private readonly AISearchService _SearchService; + + public AIChatService(IOptions options, AISearchService searchService, AzureOpenAIClient azureClient) + { + _Options = options.Value; + _SearchService = searchService; + + // Initialize Azure OpenAI client and get the Response Client from it + _AzureClient = azureClient; + +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + _ResponseClient = _AzureClient.GetOpenAIResponseClient(_Options.ChatDeploymentName); +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + } + + /// + /// Gets a single chat completion response with all optional features + /// + /// The user's input prompt + /// Optional system prompt to override the default + /// Previous response ID to maintain conversation context + /// Optional tools for the AI to use + /// Optional reasoning effort level for reasoning models + /// Enable vector search for contextual information + /// Cancellation token + /// The AI response text and response ID for conversation continuity + public async Task<(string response, string responseId)> GetChatCompletion( + string prompt, + string? systemPrompt = null, + string? previousResponseId = null, + IMcpClient? mcpClient = null, +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + IEnumerable? tools = null, + ResponseReasoningEffortLevel? reasoningEffortLevel = null, +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + bool enableContextualSearch = false, + CancellationToken cancellationToken = default) + { + var responseOptions = await CreateResponseOptionsAsync(previousResponseId, tools, reasoningEffortLevel, mcpClient: mcpClient, cancellationToken: cancellationToken); + var enrichedPrompt = await EnrichPromptWithContext(prompt, enableContextualSearch, cancellationToken); + return await GetChatCompletionCore(enrichedPrompt, responseOptions, systemPrompt, cancellationToken); + } + + /// + /// Gets a streaming chat completion response with all optional features + /// + /// The user's input prompt + /// Optional system prompt to override the default + /// Previous response ID to maintain conversation context + /// Optional tools for the AI to use + /// Optional reasoning effort level for reasoning models + /// Enable vector search for contextual information + /// Cancellation token + /// An async enumerable of response text chunks and final response ID + public async IAsyncEnumerable<(string text, string? responseId)> GetChatCompletionStream( + string prompt, + string? systemPrompt = null, + string? previousResponseId = null, + IMcpClient? mcpClient = null, +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + IEnumerable? tools = null, + ResponseReasoningEffortLevel? reasoningEffortLevel = null, +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + bool enableContextualSearch = false, + [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken = default) + { + var responseOptions = await CreateResponseOptionsAsync(previousResponseId, tools, reasoningEffortLevel, mcpClient: mcpClient, cancellationToken: cancellationToken); + var enrichedPrompt = await EnrichPromptWithContext(prompt, enableContextualSearch, cancellationToken); + + // Construct the user input with system context if provided + var systemContext = systemPrompt ?? _Options.SystemPrompt; + + // Create the streaming response using the Responses API +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + List responseItems = [ResponseItem.CreateUserMessageItem(enrichedPrompt)]; + if (systemContext is not null) + { + responseItems.Add( + ResponseItem.CreateSystemMessageItem(systemContext)); + } +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + var streamingUpdates = _ResponseClient.CreateResponseStreamingAsync( + responseItems, + options: responseOptions, + cancellationToken: cancellationToken); + + await foreach (var result in ProcessStreamingUpdatesAsync(streamingUpdates, responseOptions, mcpClient, cancellationToken)) + { + yield return result; + } + } + + /// + /// Enriches the user prompt with contextual information from vector search + /// + private async Task EnrichPromptWithContext(string prompt, bool enableContextualSearch, CancellationToken cancellationToken) + { + if (!enableContextualSearch) + { + return prompt; + } + + var searchResults = await _SearchService.ExecuteVectorSearch(prompt, cancellationToken: cancellationToken); + var contextualInfo = new System.Text.StringBuilder(); + + contextualInfo.AppendLine("## Contextual Information"); + contextualInfo.AppendLine("The following information might be relevant to your question:"); + contextualInfo.AppendLine(); + + foreach (var result in searchResults) + { + contextualInfo.AppendLine(System.Globalization.CultureInfo.InvariantCulture, $"**From: {result.Record.Heading}**"); + contextualInfo.AppendLine(result.Record.ChunkText); + contextualInfo.AppendLine(); + } + + contextualInfo.AppendLine("## User Question"); + contextualInfo.AppendLine(prompt); + + return contextualInfo.ToString(); + } + + /// + /// Processes streaming updates from the OpenAI Responses API, handling both regular responses and function calls + /// + private async IAsyncEnumerable<(string text, string? responseId)> ProcessStreamingUpdatesAsync( +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + IAsyncEnumerable streamingUpdates, + ResponseCreationOptions responseOptions, +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + IMcpClient? mcpClient, + [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken = default) + { + await foreach (var update in streamingUpdates.WithCancellation(cancellationToken)) + { + string? responseId; +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + if (update is StreamingResponseCreatedUpdate created) + { + // Remember the response ID for later function calls + responseId = created.Response.Id; + } + else if (update is StreamingResponseOutputItemDoneUpdate itemDone) + { + // Check if this is a function call that needs to be executed + if (itemDone.Item is FunctionCallResponseItem functionCallItem && mcpClient != null) + { + // Execute the function call and stream its response + await foreach (var functionResult in ExecuteFunctionCallAsync(functionCallItem, responseOptions, mcpClient, cancellationToken)) + { + if (functionResult.responseId != null) + { + responseId = functionResult.responseId; + } + yield return functionResult; + } + } + } + else if (update is StreamingResponseOutputTextDeltaUpdate deltaUpdate) + { + yield return (deltaUpdate.Delta.ToString(), null); + } + else if (update is StreamingResponseCompletedUpdate completedUpdate) + { + yield return (string.Empty, responseId: completedUpdate.Response.Id); // Signal completion with response ID + } +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + } + } + + /// + /// Executes a function call and streams the response + /// + private async IAsyncEnumerable<(string text, string? responseId)> ExecuteFunctionCallAsync( +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + FunctionCallResponseItem functionCallItem, + ResponseCreationOptions responseOptions, +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + IMcpClient mcpClient, + [System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken cancellationToken = default) + { + // A dictionary of arguments to pass to the tool. Each key represents a parameter name, and its associated value represents the argument value. + Dictionary arguments = []; + // example JsonResponse: + // "{\"question\":\"Azure OpenAI Responses API (Preview)\"}" + var jsonResponse = functionCallItem.FunctionArguments.ToString(); + var jsonArguments = System.Text.Json.JsonSerializer.Deserialize>(jsonResponse) ?? new Dictionary(); + + // Convert JsonElement values to their actual types + foreach (var kvp in jsonArguments) + { + if (kvp.Value is System.Text.Json.JsonElement jsonElement) + { + arguments[kvp.Key] = jsonElement.ValueKind switch + { + System.Text.Json.JsonValueKind.String => jsonElement.GetString(), + System.Text.Json.JsonValueKind.Number => jsonElement.GetDecimal(), + System.Text.Json.JsonValueKind.True => true, + System.Text.Json.JsonValueKind.False => false, + System.Text.Json.JsonValueKind.Null => null, + _ => jsonElement.ToString() + }; + } + else + { + arguments[kvp.Key] = kvp.Value; + } + } + + // Execute the function call using the MCP client + var toolResult = await mcpClient.CallToolAsync( + functionCallItem.FunctionName, + arguments: arguments, + cancellationToken: cancellationToken); + + // Create input items with both the function call and the result + // This matches the Python pattern: append both tool_call and result +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + var inputItems = new List + { + functionCallItem, // The original function call + new FunctionCallOutputResponseItem(functionCallItem.CallId, string.Join("", toolResult.Content.Where(x => x.Type == "text").OfType().Select(x => x.Text))) + }; +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + + // Stream the function call response using the same processing logic + var functionResponseStream = _ResponseClient.CreateResponseStreamingAsync( + inputItems, + responseOptions, + cancellationToken); + + await foreach (var result in ProcessStreamingUpdatesAsync(functionResponseStream, responseOptions, mcpClient, cancellationToken)) + { + yield return result; + } + } + + /// + /// Creates response options with optional features + /// +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + private static async Task CreateResponseOptionsAsync( + string? previousResponseId = null, + IEnumerable? tools = null, + ResponseReasoningEffortLevel? reasoningEffortLevel = null, + IMcpClient? mcpClient = null, + CancellationToken cancellationToken = default + ) + { + var options = new ResponseCreationOptions(); +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + + // Add conversation context if available + if (!string.IsNullOrEmpty(previousResponseId)) + { + options.PreviousResponseId = previousResponseId; + } + + // Add tools if provided + if (tools != null) + { + foreach (var tool in tools) + { + options.Tools.Add(tool); + } + } + + if (mcpClient is not null) + { + await foreach (McpClientTool tool in mcpClient.EnumerateToolsAsync(cancellationToken: cancellationToken)) + { +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + options.Tools.Add(ResponseTool.CreateFunctionTool(tool.Name, functionDescription: tool.Description, strictModeEnabled: true, functionParameters: BinaryData.FromString(tool.JsonSchema.GetRawText()))); +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + } + } + + // Add reasoning options if specified + if (reasoningEffortLevel.HasValue) + { +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + options.ReasoningOptions = new ResponseReasoningOptions() + { + ReasoningEffortLevel = reasoningEffortLevel.Value + }; +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + } + + return options; + } + + /// + /// Core method for getting chat completions with configurable response options + /// + private async Task<(string response, string responseId)> GetChatCompletionCore( + string prompt, +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + ResponseCreationOptions responseOptions, +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + string? systemPrompt = null, + CancellationToken cancellationToken = default) + { + // Construct the user input with system context if provided + var systemContext = systemPrompt ?? _Options.SystemPrompt; + + // Create the streaming response using the Responses API +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + List responseItems = [ResponseItem.CreateUserMessageItem(prompt)]; + if (systemContext is not null) + { + responseItems.Add( + ResponseItem.CreateSystemMessageItem(systemContext)); + } +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + + // Create the response using the Responses API + var response = await _ResponseClient.CreateResponseAsync( + responseItems, + options: responseOptions, + cancellationToken: cancellationToken); + + // Extract the message content and response ID + string responseText = string.Empty; + string responseId = response.Value.Id; + +#pragma warning disable OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + var assistantMessage = response.Value.OutputItems + .OfType() + .FirstOrDefault(m => m.Role == MessageRole.Assistant && + !string.IsNullOrEmpty(m.Content?.FirstOrDefault()?.Text)); + + if (assistantMessage is not null) + { + responseText = assistantMessage.Content?.FirstOrDefault()?.Text ?? string.Empty; + } +#pragma warning restore OPENAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + + return (responseText, responseId); + } + + // TODO: Look into using UserSecurityContext (https://learn.microsoft.com/en-us/azure/defender-for-cloud/gain-end-user-context-ai) +} diff --git a/EssentialCSharp.Chat.Shared/Services/AISearchService.cs b/EssentialCSharp.Chat.Shared/Services/AISearchService.cs new file mode 100644 index 00000000..37f21b09 --- /dev/null +++ b/EssentialCSharp.Chat.Shared/Services/AISearchService.cs @@ -0,0 +1,54 @@ +ο»Ώusing System.Diagnostics; +using EssentialCSharp.Chat.Common.Models; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.VectorData; +using Npgsql; + +namespace EssentialCSharp.Chat.Common.Services; + +public class AISearchService( + VectorStore vectorStore, + EmbeddingService embeddingService, + ILogger logger) +{ + // TODO: Implement Hybrid Search functionality, may need to switch db providers to support full text search? + + public async Task>> ExecuteVectorSearch( + string query, string? collectionName = null, CancellationToken cancellationToken = default) + { + collectionName ??= EmbeddingService.CollectionName; + + VectorStoreCollection collection = vectorStore.GetCollection(collectionName); + + ReadOnlyMemory searchVector = await embeddingService.GenerateEmbeddingAsync(query, cancellationToken); + + var vectorSearchOptions = new VectorSearchOptions + { + VectorProperty = x => x.TextEmbedding, + }; + + for (int attempt = 0; attempt <= 1; attempt++) + { + try + { + var results = new List>(); + await foreach (var result in collection.SearchAsync(searchVector, options: vectorSearchOptions, top: 3, cancellationToken: cancellationToken)) + { + results.Add(result); + } + return results; + } + catch (PostgresException ex) when (ex.SqlState == "28000" && attempt == 0) + { + // The pooled connection held an expired Entra ID token. Npgsql automatically + // removes the broken connection from the pool on error β€” no manual pool clearing + // needed (clearing would evict all healthy connections, hurting concurrent users). + // The retry opens a fresh physical connection, which calls UsePasswordProvider + // and gets a new token from DefaultAzureCredential. + logger.LogWarning(ex, "Entra ID token expired on pooled connection (SqlState 28000); retrying once."); + } + } + + throw new UnreachableException("Retry loop exited without returning or throwing."); + } +} diff --git a/EssentialCSharp.Chat.Shared/Services/ChunkingResultExtensions.cs b/EssentialCSharp.Chat.Shared/Services/ChunkingResultExtensions.cs new file mode 100644 index 00000000..f6be7d13 --- /dev/null +++ b/EssentialCSharp.Chat.Shared/Services/ChunkingResultExtensions.cs @@ -0,0 +1,62 @@ +using System.Security.Cryptography; +using System.Text; +using System.Linq; +using EssentialCSharp.Chat.Common.Models; + +namespace EssentialCSharp.Chat.Common.Services; + +public static partial class ChunkingResultExtensions +{ + public static List ToBookContentChunks(this FileChunkingResult result) + { + int? chapterNumber = ExtractChapterNumber(result.FileName); + + var chunks = result.Chunks + .Select(chunkText => + { + var contentHash = ComputeSha256Hash(chunkText); + return new BookContentChunk + { + Id = Guid.NewGuid().ToString(), + FileName = result.FileName, + Heading = ExtractHeading(chunkText), + ChunkText = chunkText, + ChapterNumber = chapterNumber, + ContentHash = contentHash + }; + }) + .ToList(); + + return chunks; + } + + private static string ExtractHeading(string chunkText) + { + // get characters until the first " - " or newline + var firstLine = chunkText.Split(["\r\n", "\r", "\n"], StringSplitOptions.None)[0]; + var headingParts = firstLine.Split([" - "], StringSplitOptions.None); + return headingParts.Length > 0 ? headingParts[0].Trim() : string.Empty; + } + + private static int ExtractChapterNumber(string fileName) + { + // Example: "Chapter01.md" -> 1 + // Regex: Chapter(?[0-9]{2}) + var match = ChapterNumberRegex().Match(fileName); + if (match.Success && int.TryParse(match.Groups["ChapterNumber"].Value, out int chapterNumber)) + + { + return chapterNumber; + } + throw new InvalidOperationException($"File name '{fileName}' does not contain a valid chapter number in the expected format."); + } + + private static string ComputeSha256Hash(string text) + { + var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(text)); + return Convert.ToHexStringLower(bytes); + } + + [System.Text.RegularExpressions.GeneratedRegex(@"Chapter(?\d{2})")] + private static partial System.Text.RegularExpressions.Regex ChapterNumberRegex(); +} diff --git a/EssentialCSharp.Chat.Shared/Services/EmbeddingService.cs b/EssentialCSharp.Chat.Shared/Services/EmbeddingService.cs new file mode 100644 index 00000000..dd1fe89c --- /dev/null +++ b/EssentialCSharp.Chat.Shared/Services/EmbeddingService.cs @@ -0,0 +1,51 @@ +using EssentialCSharp.Chat.Common.Models; +using Microsoft.Extensions.AI; +using Microsoft.Extensions.VectorData; + +namespace EssentialCSharp.Chat.Common.Services; + +/// +/// Service for generating embeddings for markdown chunks using Azure OpenAI +/// +public class EmbeddingService(VectorStore vectorStore, IEmbeddingGenerator> embeddingGenerator) +{ + public static string CollectionName { get; } = "markdown_chunks"; + + /// + /// Generate an embedding for the given text. + /// + /// The text to generate an embedding for. + /// The cancellation token. + /// A search vector as ReadOnlyMemory<float>. + public async Task> GenerateEmbeddingAsync(string text, CancellationToken cancellationToken = default) + { + var embedding = await embeddingGenerator.GenerateAsync(text, cancellationToken: cancellationToken); + return embedding.Vector; + } + + /// + /// Generate an embedding for each text paragraph and upload it to the specified collection. + /// + /// The name of the collection to upload the text paragraphs to. + /// An async task. + public async Task GenerateBookContentEmbeddingsAndUploadToVectorStore(IEnumerable bookContents, CancellationToken cancellationToken, string? collectionName = null) + { + collectionName ??= CollectionName; + + var collection = vectorStore.GetCollection(collectionName); + await collection.EnsureCollectionDeletedAsync(cancellationToken); + await collection.EnsureCollectionExistsAsync(cancellationToken); + + int uploadedCount = 0; + + foreach (var chunk in bookContents) + { + cancellationToken.ThrowIfCancellationRequested(); + chunk.TextEmbedding = await GenerateEmbeddingAsync(chunk.ChunkText, cancellationToken); + await collection.UpsertAsync(chunk, cancellationToken); + Console.WriteLine($"Uploaded chunk '{chunk.Id}' to collection '{collectionName}' for file '{chunk.FileName}' with heading '{chunk.Heading}'."); + uploadedCount++; + } + Console.WriteLine($"Successfully generated embeddings and uploaded {uploadedCount} chunks to collection '{collectionName}'."); + } +} diff --git a/EssentialCSharp.Chat.Shared/Services/FileChunkingResult.cs b/EssentialCSharp.Chat.Shared/Services/FileChunkingResult.cs new file mode 100644 index 00000000..e2d0f40e --- /dev/null +++ b/EssentialCSharp.Chat.Shared/Services/FileChunkingResult.cs @@ -0,0 +1,14 @@ +namespace EssentialCSharp.Chat.Common.Services; + +/// +/// Data structure to hold chunking results for a single file +/// +public class FileChunkingResult +{ + public string FileName { get; set; } = string.Empty; + public string FilePath { get; set; } = string.Empty; + public int OriginalCharCount { get; set; } + public int ChunkCount { get; set; } + public List Chunks { get; set; } = []; + public int TotalChunkCharacters { get; set; } +} diff --git a/EssentialCSharp.Chat.Shared/Services/MarkdownChunkingService.cs b/EssentialCSharp.Chat.Shared/Services/MarkdownChunkingService.cs new file mode 100644 index 00000000..d50ee214 --- /dev/null +++ b/EssentialCSharp.Chat.Shared/Services/MarkdownChunkingService.cs @@ -0,0 +1,180 @@ +using System.Text.RegularExpressions; +using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel.Text; + +namespace EssentialCSharp.Chat.Common.Services; + +/// +/// Markdown chunking service using Semantic Kernel's TextChunker +/// +public partial class MarkdownChunkingService( + ILogger logger, + int maxTokensPerChunk = 256, + int overlapTokens = 25) +{ + private static readonly string[] _NewLineSeparators = ["\r\n", "\n", "\r"]; + private readonly int _MaxTokensPerChunk = maxTokensPerChunk; + private readonly int _OverlapTokens = overlapTokens; + + /// + /// Process markdown files in the specified directory using Semantic Kernel's TextChunker + /// + public async Task> ProcessMarkdownFilesAsync( + DirectoryInfo directory, + string filePattern) + { + // Validate input parameters + if (!directory.Exists) + { + logger.LogError("Error: Directory {DirectoryName} does not exist.", directory.FullName); + throw new InvalidOperationException($"Error: Directory '{directory.FullName}' does not exist."); + } + + // Find markdown files + var markdownFiles = directory.GetFiles(filePattern, SearchOption.TopDirectoryOnly); + + if (markdownFiles.Length == 0) + { + throw new InvalidOperationException($"No files matching pattern '{filePattern}' found in '{directory.FullName}'"); + } + + Console.WriteLine($"Processing {markdownFiles.Length} markdown files..."); + + int totalChunks = 0; + var results = new List(); + + foreach (var file in markdownFiles) + { + string[] fileContent = await File.ReadAllLinesAsync(file.FullName); + var result = ProcessSingleMarkdownFile(fileContent, file.Name, file.FullName); + results.Add(result); + totalChunks += result.ChunkCount; + } + Console.WriteLine($"Processed {markdownFiles.Length} markdown files with a total of {totalChunks} chunks."); + + return results; + } + + /// + /// Process a single markdown file using Semantic Kernel's SplitMarkdownParagraphs method + /// + public FileChunkingResult ProcessSingleMarkdownFile( + string[] fileContent, string fileName, string filePath) + { + // Remove all multiple empty lines so there is no more than one empty line between paragraphs + string[] lines = [.. fileContent + .Select(line => line.Trim()) + .Where(line => !string.IsNullOrWhiteSpace(line))]; + + string content = string.Join(Environment.NewLine, lines); + + var sections = MarkdownContentToHeadersAndSection(content); + var allChunks = new List(); + int totalChunkCharacters = 0; + int chunkCount = 0; + + foreach (var (Header, Content) in sections) + { +#pragma warning disable SKEXP0050 + var chunks = TextChunker.SplitMarkdownParagraphs( + lines: Content, + maxTokensPerParagraph: _MaxTokensPerChunk, + overlapTokens: _OverlapTokens, + chunkHeader: Header + " - " + ); +#pragma warning restore SKEXP0050 + allChunks.AddRange(chunks); + chunkCount += chunks.Count; + totalChunkCharacters += chunks.Sum(c => c.Length); + } + + return new FileChunkingResult + { + FileName = fileName, + FilePath = filePath, + OriginalCharCount = content.Length, + ChunkCount = chunkCount, + Chunks = allChunks, + TotalChunkCharacters = totalChunkCharacters + }; + } + + /// + /// Convert markdown content into a list of headers and their associated content sections. + /// + /// + /// + public static List<(string Header, List Content)> MarkdownContentToHeadersAndSection(string content) + { + var lines = content.Split(_NewLineSeparators, StringSplitOptions.None); + var sections = new List<(string Header, List Content)>(); + var headerRegex = HeadingRegex(); + var listingPattern = ListingRegex(); + var headerStack = new List<(int Level, string Text)>(); + int i = 0; + while (i < lines.Length) + { + // Find next header + while (i < lines.Length && !headerRegex.IsMatch(lines[i])) + i++; + if (i >= lines.Length) break; + + var match = headerRegex.Match(lines[i]); + int level = match.Groups[1].Value.Length; + string headerText = match.Groups[2].Value.Trim(); + bool isListing = headerText.StartsWith("Listing", StringComparison.OrdinalIgnoreCase) && listingPattern.IsMatch(headerText); + + // If this is a listing header, append its content to the previous section + if (isListing && sections.Count > 0) + { + i++; // skip the listing header + var listingContent = new List(); + while (i < lines.Length && !headerRegex.IsMatch(lines[i])) + { + if (!string.IsNullOrWhiteSpace(lines[i])) + listingContent.Add(lines[i]); + i++; + } + // Append to previous section's content + var prev = sections[^1]; + prev.Content.AddRange(listingContent); + sections[^1] = prev; + continue; + } + + // Update header stack for non-listing headers + if (headerStack.Count == 0 || level > headerStack.Last().Level) + { + headerStack.Add((level, headerText)); + } + else + { + while (headerStack.Count > 0 && headerStack.Last().Level >= level) + headerStack.RemoveAt(headerStack.Count - 1); + headerStack.Add((level, headerText)); + } + i++; + + // Collect content until next header + var contentLines = new List(); + while (i < lines.Length && !headerRegex.IsMatch(lines[i])) + { + if (!string.IsNullOrWhiteSpace(lines[i])) + contentLines.Add(lines[i]); + i++; + } + + // Compose full header context + var fullHeader = string.Join(": ", headerStack.Select(h => h.Text)); + if (contentLines.Count > 0) + sections.Add((fullHeader, contentLines)); + } + return sections; + } + + [GeneratedRegex(@"^Listing \d+\.\d+(:.*)?$")] + private static partial Regex ListingRegex(); + + [GeneratedRegex(@"^(#{1,6}) +(.+)$")] + private static partial Regex HeadingRegex(); +} diff --git a/EssentialCSharp.Chat.Tests/AISearchServiceTests.cs b/EssentialCSharp.Chat.Tests/AISearchServiceTests.cs new file mode 100644 index 00000000..9e0366a4 --- /dev/null +++ b/EssentialCSharp.Chat.Tests/AISearchServiceTests.cs @@ -0,0 +1,109 @@ +using EssentialCSharp.Chat.Common.Models; +using EssentialCSharp.Chat.Common.Services; +using Microsoft.Extensions.AI; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.VectorData; +using Moq; +using Moq.Language.Flow; +using Npgsql; + +namespace EssentialCSharp.Chat.Tests; + +public class AISearchServiceTests +{ + private static readonly BookContentChunk _TestChunk = new() { Id = "test-1", ChunkText = "test" }; + + private static (AISearchService svc, Mock> collectionMock) + CreateService() + { + var collectionMock = new Mock>(); + + var vectorStoreMock = new Mock(); + vectorStoreMock + .Setup(vs => vs.GetCollection(It.IsAny(), It.IsAny())) + .Returns(collectionMock.Object); + + // IEmbeddingGenerator>.GenerateAsync is the batch interface method + // called internally by the single-value extension used in EmbeddingService.GenerateEmbeddingAsync. + var embGenMock = new Mock>>(); + embGenMock + .Setup(g => g.GenerateAsync( + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(new GeneratedEmbeddings>([new Embedding(new float[1536])])); + + var embeddingService = new EmbeddingService(vectorStoreMock.Object, embGenMock.Object); + var loggerMock = new Mock>(); + + return (new AISearchService(vectorStoreMock.Object, embeddingService, loggerMock.Object), collectionMock); + } + + private static async IAsyncEnumerable> OneResultStream() + { + yield return new VectorSearchResult(_TestChunk, 0.9f); + await Task.CompletedTask; + } + + private static ISetup, IAsyncEnumerable>> + SetupSearch(Mock> mock) => + mock.Setup(c => c.SearchAsync( + It.IsAny>(), + It.IsAny(), + It.IsAny?>(), + It.IsAny())); + + [Test] + public async Task ExecuteVectorSearch_HappyPath_ReturnsResultsWithoutRetry() + { + var (svc, collectionMock) = CreateService(); + int callCount = 0; + + SetupSearch(collectionMock).Returns(() => { callCount++; return OneResultStream(); }); + + var results = await svc.ExecuteVectorSearch("test query"); + + await Assert.That(results.Count).IsEqualTo(1); + await Assert.That(callCount).IsEqualTo(1); + } + + [Test] + public async Task ExecuteVectorSearch_RetriesOnce_WhenFirstAttemptThrows28000() + { + var (svc, collectionMock) = CreateService(); + int callCount = 0; + + SetupSearch(collectionMock).Returns(() => + { + callCount++; + if (callCount == 1) + throw new PostgresException("auth token expired", "FATAL", "FATAL", "28000"); + return OneResultStream(); + }); + + var results = await svc.ExecuteVectorSearch("test query"); + + await Assert.That(results.Count).IsEqualTo(1); + await Assert.That(callCount).IsEqualTo(2); + } + + [Test] + public async Task ExecuteVectorSearch_DoesNotRetry_WhenSqlStateIsNot28000() + { + var (svc, collectionMock) = CreateService(); + + SetupSearch(collectionMock).Returns(() => throw new PostgresException("table not found", "ERROR", "ERROR", "42P01")); + + await Assert.ThrowsAsync(() => svc.ExecuteVectorSearch("test query")); + } + + [Test] + public async Task ExecuteVectorSearch_PropagatesException_WhenBothAttemptsFail28000() + { + var (svc, collectionMock) = CreateService(); + + SetupSearch(collectionMock).Returns(() => throw new PostgresException("auth failed", "FATAL", "FATAL", "28000")); + + await Assert.ThrowsAsync(() => svc.ExecuteVectorSearch("test query")); + } +} diff --git a/EssentialCSharp.Chat.Tests/EssentialCSharp.Chat.Tests.csproj b/EssentialCSharp.Chat.Tests/EssentialCSharp.Chat.Tests.csproj new file mode 100644 index 00000000..992d1c7f --- /dev/null +++ b/EssentialCSharp.Chat.Tests/EssentialCSharp.Chat.Tests.csproj @@ -0,0 +1,19 @@ +ο»Ώ + + + net10.0 + false + false + + + + + + + + + + + + + diff --git a/EssentialCSharp.Chat.Tests/MarkdownChunkingServiceTests.cs b/EssentialCSharp.Chat.Tests/MarkdownChunkingServiceTests.cs new file mode 100644 index 00000000..978417d8 --- /dev/null +++ b/EssentialCSharp.Chat.Tests/MarkdownChunkingServiceTests.cs @@ -0,0 +1,191 @@ +using EssentialCSharp.Chat.Common.Services; +using Moq; + +namespace EssentialCSharp.Chat.Tests; + +public class MarkdownChunkingServiceTests +{ + #region MarkdownContentToHeadersAndSection + [Test] + public async Task MarkdownContentToHeadersAndSection_ParsesSampleMarkdown_CorrectlyCombinesHeadersAndExtractsContent() + { + string markdown = """ +### Beginner Topic +#### What Is a Method? + +Syntactically, a **method** in C# is a named block of code introduced by a method declaration (e.g., `static void Main()`) and (usually) followed by zero or more statements within curly braces. Methods perform computations and/or actions. Like paragraphs in written languages, methods provide a means of structuring and organizing code so that it is more readable. More important, methods can be reused and called from multiple places and so avoid the need to duplicate code. The method declaration introduces the method and defines the method name along with the data passed to and from the method. In Listing 1.8, `Main()` followed by `{ ... }` is an example of a C# method. + +## Main Method + +The location where C# programs begin execution is the **Main method**, which begins with `static void Main()`. When you execute the program by typing `dotnet run` on the terminal, the program starts with the Main method and begins executing the first statement, as identified in Listing 1.8. + + + +### Listing 1.8: Breaking Apart `HelloWorld` +publicclass Program // BEGIN Class definition +{ +publicstaticvoid Main() // Method declaration + { // BEGIN method implementation + Console.WriteLine( // This statement spans 2 lines +"Hello, My name is Inigo Montoya"); + } // END method implementation +} // END class definition +Although the Main method declaration can vary to some degree, `static` and the method name, `Main`, are always required for a program (see β€œAdvanced Topic: Declaration of the Main Method”). + +The **comments**, text that begins with `//` in Listing 1.8, are explained later in the chapter. They are included to identify the various constructs in the listing. + +### Advanced Topic +#### Declaration of the Main Method + +C# requires that the Main method return either `void` or `int` and that it take either no parameters or a single array of strings. Listing 1.9 shows the full declaration of the Main method. The `args` parameter is an array of strings corresponding to the command-line arguments. The executable name is not included in the `args` array (unlike in C and C++). To retrieve the full command used to execute the program, including the program name, use `Environment.CommandLine`. +"""; + + var sections = MarkdownChunkingService.MarkdownContentToHeadersAndSection(markdown); + + await Assert.That(sections).Count().IsEqualTo(3); + await Assert.That(sections).Contains(s => s.Header == "Beginner Topic: What Is a Method?" && string.Join("\n", s.Content).Contains("Syntactically, a **method** in C# is a named block of code")); + + await Assert.That(sections).Contains(s => s.Header == "Main Method" && string.Join("\n", s.Content).Contains("The location where C# programs begin execution is the **Main method**, which begins with `static void Main()`") && string.Join("\n", s.Content).Contains("publicclass Program")); + + await Assert.That(sections).Contains(s => s.Header == "Main Method: Advanced Topic: Declaration of the Main Method" && string.Join("\n", s.Content).Contains("C# requires that the Main method return either `void` or `int`")); + } + + [Test] + public async Task MarkdownContentToHeadersAndSection_AppendsCodeListingToPriorSection() + { + string markdown = """ +## Working with Variables + +Now that you’ve been introduced to the most basic C# program, it’s time to declare a local variable. Once a variable is declared, you can assign it a value, replace that value with a new value, and use it in calculations, output, and so on. However, you cannot change the data type of the variable. In Listing 1.12, `string max` is a variable declaration. + + + +### Listing 1.12: Declaring and Assigning a Variable + +publicclass MiracleMax +{ +publicstaticvoid Main() + { +string max; // "string" identifies the data type +// "max" is the variable + max = "Have fun storming the castle!"; + Console.WriteLine(max); + } +} + +### Beginner Topic +#### Local Variables + +A **variable** is a name that refers to a value that can change over time. Local indicates that the programmer **declared** the variable within a method. + +To declare a variable is to define it, which you do by + +* Specifying the type of data which the variable will contain +* Assigning it an identifier (name) +"""; + + var sections = MarkdownChunkingService.MarkdownContentToHeadersAndSection(markdown); + + await Assert.That(sections).Count().IsEqualTo(2); + // The code listing should be appended to the Working with Variables section, not as its own section + await Assert.That(sections).Contains(s => s.Header == "Working with Variables" && string.Join("\n", s.Content).Contains("publicclass MiracleMax")); + await Assert.That(sections).DoesNotContain(s => s.Header == "Listing 1.12: Declaring and Assigning a Variable"); + } + + [Test] + public async Task MarkdownContentToHeadersAndSection_KeepsPriorHeadersAppended() + { + string markdown = """ +### Beginner Topic +#### What Is a Data Type? + +The type of data that a variable declaration specifies is called a **data type** (or object type). A data type, or simply **type**, is a classification of things that share similar characteristics and behavior. For example, animal is a type. It classifies all things (monkeys, warthogs, and platypuses) that have animal characteristics (multicellular, capacity for locomotion, and so on). Similarly, in programming languages, a type is a definition for several items endowed with similar qualities. + +## Declaring a Variable + +In Listing 1.12, `string max` is a variable declaration of a string type whose name is `max`. It is possible to declare multiple variables within the same statement by specifying the data type once and separating each identifier with a comma. Listing 1.13 demonstrates such a declaration. + +### Listing 1.13: Declaring Two Variables within One Statement +string message1, message2; + +### Declaring another thing + +Because a multivariable declaration statement allows developers to provide the data type only once within a declaration, all variables will be of the same type. + +In C#, the name of the variable may begin with any letter or an underscore (`_`), followed by any number of letters, numbers, and/or underscores. By convention, however, local variable names are camelCased (the first letter in each word is capitalized, except for the first word) and do not include underscores. + +## Assigning a Variable + +After declaring a local variable, you must assign it a value before reading from it. One way to do this is to use the `=` **operator**, also known as the **simple assignment operator**. Operators are symbols used to identify the function the code is to perform. Listing 1.14 demonstrates how to use the assignment operator to designate the string values to which the variables `miracleMax` and `valerie` will point. + +### Listing 1.14: Changing the Value of a Variable +publicclass StormingTheCastle +{ +publicstaticvoid Main() + { +string valerie; +string miracleMax = "Have fun storming the castle!"; + + valerie = "Think it will work?"; + + Console.WriteLine(miracleMax); + Console.WriteLine(valerie); + + miracleMax = "It would take a miracle."; + Console.WriteLine(miracleMax); + } +} + +### Continued Learning +From this listing, observe that it is possible to assign a variable as part of the variable declaration (as it was for `miracleMax`) or afterward in a separate statement (as with the variable `valerie`). The value assigned must always be on the right side of the declaration. +"""; + + var sections = MarkdownChunkingService.MarkdownContentToHeadersAndSection(markdown); + await Assert.That(sections).Count().IsEqualTo(5); + + await Assert.That(sections).Contains(s => s.Header == "Beginner Topic: What Is a Data Type?" && string.Join("\n", s.Content).Contains("The type of data that a variable declaration specifies is called a **data type**")); + + await Assert.That(sections).Contains(s => s.Header == "Declaring a Variable" && string.Join("\n", s.Content).Contains("In Listing 1.12, `string max` is a variable declaration")); + + await Assert.That(sections).Contains(s => s.Header == "Declaring a Variable: Declaring another thing" && string.Join("\n", s.Content).Contains("Because a multivariable declaration statement allows developers to provide the data type only once")); + + await Assert.That(sections).Contains(s => s.Header == "Assigning a Variable" && string.Join("\n", s.Content).Contains("After declaring a local variable, you must assign it a value before reading from it.")); + + await Assert.That(sections).Contains(s => s.Header == "Assigning a Variable: Continued Learning" && string.Join("\n", s.Content).Contains("From this listing, observe that it is possible to assign a variable as part of the variable declaration")); + } + #endregion MarkdownContentToHeadersAndSection + + #region ProcessSingleMarkdownFile + [Test] + public async Task ProcessSingleMarkdownFile_ProducesExpectedChunksAndHeaders() + { + // Arrange + var logger = new Mock>().Object; + var service = new MarkdownChunkingService(logger); + string[] fileContent = new[] + { + "## Section 1", + "This is the first section.", + "", + "### Listing 1.1: Example Listing", + "Console.WriteLine(\"Hello World\");", + "", + "## Section 2", + "This is the second section." + }; + string fileName = "TestFile.md"; + string filePath = "/path/to/TestFile.md"; + + // Act + var result = service.ProcessSingleMarkdownFile(fileContent, fileName, filePath); + + // Assert + await Assert.That(result).IsNotNull(); + await Assert.That(result.FileName).IsEqualTo(fileName); + await Assert.That(result.FilePath).IsEqualTo(filePath); + await Assert.That(string.Join("\n", result.Chunks)).Contains("This is the first section."); + await Assert.That(string.Join("\n", result.Chunks)).Contains("Console.WriteLine(\"Hello World\");"); + await Assert.That(result.Chunks).Contains(c => c.Contains("This is the second section.")); + } + #endregion ProcessSingleMarkdownFile +} diff --git a/EssentialCSharp.Chat.Tests/PgVectorConnectorTests.cs b/EssentialCSharp.Chat.Tests/PgVectorConnectorTests.cs new file mode 100644 index 00000000..ed5c9fe9 --- /dev/null +++ b/EssentialCSharp.Chat.Tests/PgVectorConnectorTests.cs @@ -0,0 +1,28 @@ +using EssentialCSharp.Chat.Common.Models; +using Microsoft.SemanticKernel.Connectors.PgVector; + +namespace EssentialCSharp.Chat.Tests; + +public class PgVectorConnectorTests +{ + /// + /// Verifies that PostgresVectorStore.GetCollection does not throw a TypeLoadException, + /// which would indicate a version mismatch between Microsoft.SemanticKernel core and + /// Microsoft.SemanticKernel.Connectors.PgVector (e.g., missing vtable slots on + /// internal types like PostgresModelBuilder). + /// + [Test] + public async Task GetCollection_WithBookContentChunk_DoesNotThrowTypeLoadException() + { + // Arrange β€” no real DB connection is needed; connections are only opened for actual queries +#pragma warning disable SKEXP0010 // PostgresVectorStore is experimental + using var store = new PostgresVectorStore("Host=localhost;Database=test;Username=test;Password=test"); + + // Act β€” this triggers loading internal PostgresModelBuilder via PostgresCollection ctor + var collection = store.GetCollection("test-collection"); +#pragma warning restore SKEXP0010 + + // Assert + await Assert.That(collection).IsNotNull(); + } +} diff --git a/EssentialCSharp.Chat/EssentialCSharp.Chat.csproj b/EssentialCSharp.Chat/EssentialCSharp.Chat.csproj new file mode 100644 index 00000000..01ea6026 --- /dev/null +++ b/EssentialCSharp.Chat/EssentialCSharp.Chat.csproj @@ -0,0 +1,37 @@ +ο»Ώ + + + Exe + net10.0 + 0.0.1 + + + + + + EssentialCSharp.Chat + true + essentialcsharpchat + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/EssentialCSharp.Chat/Program.cs b/EssentialCSharp.Chat/Program.cs new file mode 100644 index 00000000..ac92ca77 --- /dev/null +++ b/EssentialCSharp.Chat/Program.cs @@ -0,0 +1,419 @@ +using System.CommandLine; +using System.Text.Json; +using Azure.Identity; +using EssentialCSharp.Chat.Common.Extensions; +using EssentialCSharp.Chat.Common.Services; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel; + +namespace EssentialCSharp.Chat; + +public class Program +{ + private static readonly JsonSerializerOptions _JsonOptions = new() { WriteIndented = true }; + + static int Main(string[] args) + { + Option directoryOption = new("--directory") + { + Description = "Directory containing markdown files.", + Required = true + }; + Option filePatternOption = new("--file-pattern") + { + Description = "File pattern to match (e.g. *.md)", + DefaultValueFactory = _ => "*.md" + }; + Option outputDirectoryOption = new("--output-directory") + { + Description = "Directory to write chunked output files. If not provided, output is written to console.", + }; + + RootCommand rootCommand = new("EssentialCSharp.Chat Utilities"); + + var chunkMarkdownCommand = new Command("chunk-markdown", "Chunk markdown files in a directory.") + { + directoryOption, + filePatternOption, + outputDirectoryOption + }; + + var buildVectorDbCommand = new Command("build-vector-db", "Build a vector database from markdown chunks.") + { + directoryOption, + filePatternOption, + }; + + var chatCommand = new Command("chat", "Start an interactive AI chat session.") + { + new Option("--stream"), + new Option("--web-search"), + new Option("--contextual-search"), + new Option("--system-prompt") + }; + + buildVectorDbCommand.SetAction(async (ParseResult parseResult, CancellationToken cancellationToken) => + { + var config = CreateConfiguration(); + + var builder = Kernel.CreateBuilder(); + builder.Services.Configure(config.GetRequiredSection("AIOptions")); + + // Use shared extension to register Azure OpenAI services with configuration + builder.Services.AddAzureOpenAIServices(config); + + builder.Services.AddLogging(loggingBuilder => + { + loggingBuilder.AddSimpleConsole(options => + { + options.TimestampFormat = "HH:mm:ss "; + options.SingleLine = true; + }); + }); + + // Build the kernel and get the data uploader. + var kernel = builder.Build(); + var directory = parseResult.GetValue(directoryOption); + var filePattern = parseResult.GetValue(filePatternOption) ?? "*.md"; + var markdownService = kernel.GetRequiredService(); + if (directory is null) + { + Console.Error.WriteLine("Error: Directory is required."); + return; + } + var results = await markdownService.ProcessMarkdownFilesAsync(directory, filePattern); + // Convert results to BookContentChunks + var bookContentChunks = results.SelectMany(result => result.ToBookContentChunks()).ToList(); + // Generate embeddings and upload to vector store + var embeddingService = kernel.GetRequiredService(); + await embeddingService.GenerateBookContentEmbeddingsAndUploadToVectorStore(bookContentChunks, cancellationToken, "markdown_chunks"); + Console.WriteLine($"Successfully processed {bookContentChunks.Count} chunks."); + }); + + chatCommand.SetAction(async (ParseResult parseResult, CancellationToken cancellationToken) => + { + var config = CreateConfiguration(); + + // https://learn.microsoft.com/api/mcp + + //SseClientTransport microsoftLearnMcp = new SseClientTransport( + // new SseClientTransportOptions + // { + // Name = "Microsoft Learn MCP", + // Endpoint = new Uri("https://learn.microsoft.com/api/mcp"), + // }); + + //IMcpClient mcpClient = await McpClientFactory.CreateAsync(clientTransport: microsoftLearnMcp, cancellationToken: cancellationToken); + + var enableStreaming = parseResult.GetValue("--stream"); + var customSystemPrompt = parseResult.GetValue("--system-prompt"); + + + AIOptions aiOptions = config.GetRequiredSection("AIOptions").Get() ?? throw new InvalidOperationException( + "AIOptions section is missing or not configured correctly in appsettings.json or environment variables."); + + // Create service collection and register dependencies + var services = new ServiceCollection(); + services.Configure(config.GetRequiredSection("AIOptions")); + services.AddLogging(builder => builder.AddSimpleConsole(options => + { + options.TimestampFormat = "HH:mm:ss "; + options.SingleLine = true; + })); + + // Use shared extension to register Azure OpenAI services with configuration + services.AddAzureOpenAIServices(config); + + var serviceProvider = services.BuildServiceProvider(); + var aiChatService = serviceProvider.GetRequiredService(); + + Console.WriteLine("πŸ€– AI Chat Session Started!"); + Console.WriteLine("Features enabled:"); + Console.WriteLine($" β€’ Streaming: {(enableStreaming ? "βœ…" : "❌")}"); + if (!string.IsNullOrEmpty(customSystemPrompt)) + Console.WriteLine($" β€’ Custom System Prompt: {customSystemPrompt}"); + Console.WriteLine(); + Console.WriteLine("Commands:"); + Console.WriteLine(" β€’ 'exit' or 'quit' - End the chat session"); + Console.WriteLine(" β€’ 'clear' - Start a new conversation context"); + Console.WriteLine(" β€’ 'help' - Show this help message"); + Console.WriteLine(" β€’ 'history' - Show conversation history"); + Console.WriteLine(" β€’ Any other text - Chat with the AI"); + Console.WriteLine("====================================="); + + // Track conversation context with response IDs + string? previousResponseId = null; + var conversationHistory = new List<(string Role, string Content)>(); + + while (!cancellationToken.IsCancellationRequested) + { + Console.WriteLine(); + Console.Write("πŸ‘€ You: "); + var userInput = Console.ReadLine(); + + if (string.IsNullOrWhiteSpace(userInput)) + continue; + + userInput = userInput.Trim(); + + if (userInput.Equals("exit", StringComparison.OrdinalIgnoreCase) || + userInput.Equals("quit", StringComparison.OrdinalIgnoreCase)) + { + Console.WriteLine("Goodbye! πŸ‘‹"); + break; + } + + if (userInput.Equals("clear", StringComparison.OrdinalIgnoreCase)) + { + // Reset conversation context when PreviousResponseId is implemented + previousResponseId = null; + conversationHistory.Clear(); + Console.WriteLine("🧹 Conversation context cleared. Starting fresh!"); + continue; + } + + if (userInput.Equals("help", StringComparison.OrdinalIgnoreCase)) + { + Console.WriteLine(); + Console.WriteLine("Commands:"); + Console.WriteLine(" β€’ 'exit' or 'quit' - End the chat session"); + Console.WriteLine(" β€’ 'clear' - Start a new conversation context"); + Console.WriteLine(" β€’ 'help' - Show this help message"); + Console.WriteLine(" β€’ 'history' - Show conversation history"); + Console.WriteLine(" β€’ Any other text - Chat with the AI"); + continue; + } + + if (userInput.Equals("history", StringComparison.OrdinalIgnoreCase)) + { + Console.WriteLine(); + Console.WriteLine("πŸ“œ Conversation History:"); + if (conversationHistory.Count == 0) + { + Console.WriteLine(" No conversation history yet."); + } + else + { + for (int i = 0; i < conversationHistory.Count; i++) + { + var (role, content) = conversationHistory[i]; + var emoji = role == "User" ? "πŸ‘€" : "πŸ€–"; + Console.WriteLine($" {i + 1}. {emoji} {role}: {content}"); + } + } + continue; + } + + conversationHistory.Add(("User", userInput)); + + try + { + Console.Write("πŸ€– AI: "); + + if (enableStreaming) + { + // Use streaming with optional tools and conversation context + var fullResponse = new System.Text.StringBuilder(); + + await foreach (var (text, responseId) in aiChatService.GetChatCompletionStream( + prompt: userInput/*, mcpClient: mcpClient*/, previousResponseId: previousResponseId, systemPrompt: customSystemPrompt, cancellationToken: cancellationToken)) + { + if (!string.IsNullOrEmpty(text)) + { + Console.Write(text); + fullResponse.Append(text); + } + if (!string.IsNullOrEmpty(responseId)) + { + previousResponseId = responseId; // Update for next turn + } + } + Console.WriteLine(); + + conversationHistory.Add(("Assistant", fullResponse.ToString())); + } + else + { + // Non-streaming response with optional tools and conversation context + var (response, responseId) = await aiChatService.GetChatCompletion( + prompt: userInput, previousResponseId: previousResponseId, systemPrompt: customSystemPrompt, cancellationToken: cancellationToken); + + Console.WriteLine(response); + conversationHistory.Add(("Assistant", response)); + + if (!string.IsNullOrEmpty(responseId)) + { + previousResponseId = responseId; + } + } + + Console.WriteLine(); + } + catch (OperationCanceledException) + { + Console.WriteLine(); + Console.WriteLine("Operation cancelled. Goodbye! πŸ‘‹"); + break; + } + catch (Exception ex) + { + Console.WriteLine(); + Console.WriteLine($"❌ Error: {ex.Message}"); + if (ex.InnerException != null) + { + Console.WriteLine($" Details: {ex.InnerException.Message}"); + } + } + } + }); + + chunkMarkdownCommand.SetAction(async parseResult => + { + var directory = parseResult.GetValue(directoryOption); + var filePattern = parseResult.GetValue(filePatternOption) ?? "*.md"; + var outputDirectory = parseResult.GetValue(outputDirectoryOption); + + using var loggerFactory = LoggerFactory.Create(builder => builder.AddSimpleConsole()); + var logger = loggerFactory.CreateLogger(); + var service = new MarkdownChunkingService(logger); + try + { + if (directory is null) + { + Console.Error.WriteLine("Error: Directory is required."); + return; + } + var results = await service.ProcessMarkdownFilesAsync(directory, filePattern); + + int maxChunkLength = 0; + int minChunkLength = 0; + + void WriteChunkingResult(FileChunkingResult result, TextWriter writer) + { + // lets build up some stats over the chunking + var chunkAverage = result.Chunks.Average(chunk => chunk.Length); + var chunkMedian = result.Chunks.OrderBy(chunk => chunk.Length).ElementAt(result.Chunks.Count / 2).Length; + var chunkMax = result.Chunks.Max(chunk => chunk.Length); + var chunkMin = result.Chunks.Min(chunk => chunk.Length); + var chunkTotal = result.Chunks.Sum(chunk => chunk.Length); + var chunkStandardDeviation = Math.Sqrt(result.Chunks.Average(chunk => Math.Pow(chunk.Length - chunkAverage, 2))); + var numberOfOutliers = result.Chunks.Count(chunk => chunk.Length > chunkAverage + chunkStandardDeviation); + + if (chunkMax > maxChunkLength) maxChunkLength = chunkMax; + if (chunkMin < minChunkLength || minChunkLength == 0) minChunkLength = chunkMin; + + writer.WriteLine($"File: {result.FileName}"); + writer.WriteLine($"Number of Chunks: {result.ChunkCount}"); + writer.WriteLine($"Average Chunk Length: {chunkAverage}"); + writer.WriteLine($"Median Chunk Length: {chunkMedian}"); + writer.WriteLine($"Max Chunk Length: {chunkMax}"); + writer.WriteLine($"Min Chunk Length: {chunkMin}"); + writer.WriteLine($"Total Chunk Characters: {chunkTotal}"); + writer.WriteLine($"Standard Deviation: {chunkStandardDeviation}"); + writer.WriteLine($"Number of Outliers: {numberOfOutliers}"); + writer.WriteLine($"Original Character Count: {result.OriginalCharCount}"); + writer.WriteLine($"New Character Count: {result.TotalChunkCharacters}"); + foreach (var chunk in result.Chunks) + { + writer.WriteLine(); + writer.WriteLine(chunk); + } + } + + if (outputDirectory != null) + { + if (!outputDirectory.Exists) + outputDirectory.Create(); + foreach (var result in results) + { + var outputFile = Path.Join(outputDirectory.FullName, Path.GetFileNameWithoutExtension(result.FileName) + ".chunks.txt"); + using var writer = new StreamWriter(outputFile, false); + WriteChunkingResult(result, writer); + Console.WriteLine($"Wrote: {outputFile}"); + } + } + else + { + foreach (var result in results) + { + WriteChunkingResult(result, Console.Out); + } + } + Console.WriteLine($"Max Chunk Length: {maxChunkLength}"); + Console.WriteLine($"Min Chunk Length: {minChunkLength}"); + } + catch (Exception ex) + { + Console.Error.WriteLine($"Error: {ex.Message}"); + return; + } + }); + rootCommand.Subcommands.Add(chunkMarkdownCommand); + rootCommand.Subcommands.Add(buildVectorDbCommand); + rootCommand.Subcommands.Add(chatCommand); + + return rootCommand.Parse(args).Invoke(); + } + + /// + /// Creates and configures the IConfiguration used by multiple commands. + /// Supports Azure Key Vault integration for secure secret management. + /// + /// The configured IConfigurationRoot + /// + /// Configuration precedence (highest to lowest): + /// 1. Environment Variables + /// 2. Azure Key Vault (if configured) + /// 3. User Secrets (development only) + /// 4. appsettings.json + /// + /// To enable Key Vault, set the "KeyVaultName" configuration value in appsettings.json or user secrets: + /// { + /// "KeyVaultName": "your-keyvault-name" + /// } + /// + /// The application will use DefaultAzureCredential for authentication, which supports: + /// - Managed Identity (in Azure) + /// - Azure CLI (local development) + /// - Visual Studio (local development) + /// - Environment variables (AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID) + /// + private static IConfigurationRoot CreateConfiguration() + { + var configBuilder = new ConfigurationBuilder() + .SetBasePath(IntelliTect.Multitool.RepositoryPaths.GetDefaultRepoRoot()) + .AddJsonFile("EssentialCSharp.Web/appsettings.json", optional: false, reloadOnChange: true) + .AddJsonFile($"EssentialCSharp.Web/appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true, reloadOnChange: true) + .AddUserSecrets(optional: true) + .AddEnvironmentVariables(); + + // Build a temporary configuration to check for Key Vault settings + var tempConfig = configBuilder.Build(); + var keyVaultName = tempConfig["KeyVaultName"]; + + // If Key Vault is configured, add it to the configuration pipeline + if (!string.IsNullOrEmpty(keyVaultName)) + { + try + { + var keyVaultUri = new Uri($"https://{keyVaultName}.vault.azure.net/"); + + // Use DefaultAzureCredential which works both locally and in Azure + var credential = new DefaultAzureCredential(); + + configBuilder.AddAzureKeyVault(keyVaultUri, credential); + + Console.WriteLine($"βœ… Connected to Azure Key Vault: {keyVaultName}"); + } + catch (Exception ex) + { + Console.WriteLine($"⚠️ Warning: Could not connect to Azure Key Vault '{keyVaultName}': {ex.Message}"); + Console.WriteLine(" Continuing with other configuration sources..."); + } + } + + return configBuilder.Build(); + } +} diff --git a/EssentialCSharp.Chat/Properties/launchSettings.json b/EssentialCSharp.Chat/Properties/launchSettings.json new file mode 100644 index 00000000..cc4de81e --- /dev/null +++ b/EssentialCSharp.Chat/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "EssentialCSharp.Chat": { + "commandName": "Project", + "commandLineArgs": "chat --stream --web-search" + } + } +} \ No newline at end of file diff --git a/EssentialCSharp.Web.Tests/EssentialCSharp.Web.Tests.csproj b/EssentialCSharp.Web.Tests/EssentialCSharp.Web.Tests.csproj index 97dcb54c..50848f91 100644 --- a/EssentialCSharp.Web.Tests/EssentialCSharp.Web.Tests.csproj +++ b/EssentialCSharp.Web.Tests/EssentialCSharp.Web.Tests.csproj @@ -1,31 +1,37 @@ - net7.0 + net10.0 false - - $(NoWarn);CA1707 + false - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - + + + + + + + + + + + + + + + + + PreserveNewest + + + diff --git a/EssentialCSharp.Web.Tests/FunctionalTests.cs b/EssentialCSharp.Web.Tests/FunctionalTests.cs index 14d2ff84..31aa723e 100644 --- a/EssentialCSharp.Web.Tests/FunctionalTests.cs +++ b/EssentialCSharp.Web.Tests/FunctionalTests.cs @@ -1,20 +1,55 @@ -ο»Ώusing System.Net; +using System.Net; namespace EssentialCSharp.Web.Tests; -public class FunctionalTests +[NotInParallel("FunctionalTests")] +[ClassDataSource(Shared = SharedType.PerClass)] +public class FunctionalTests(WebApplicationFactory factory) { - [Theory] - [InlineData("/")] - [InlineData("/hello-world")] - [InlineData("/hello-world#hello-world")] + [Test] + [Arguments("/")] + [Arguments("/hello-world")] + [Arguments("/hello-world#hello-world")] + [Arguments("/guidelines")] + [Arguments("/health")] + [Arguments("/alive")] public async Task WhenTheApplicationStarts_ItCanLoadLoadPages(string relativeUrl) { - using WebApplicationFactory factory = new(); + HttpClient client = factory.CreateClient(); + using HttpResponseMessage response = await client.GetAsync(relativeUrl); + + await Assert.That(response.StatusCode).IsEqualTo(HttpStatusCode.OK); + } + [Test] + [Arguments("/guidelines?rid=test-referral-id")] + [Arguments("/about?rid=abc123")] + [Arguments("/hello-world?rid=user-referral")] + [Arguments("/guidelines?rid=")] + [Arguments("/about?rid= ")] + [Arguments("/guidelines?foo=bar")] + [Arguments("/about?someOtherParam=value")] + public async Task WhenPagesAreAccessed_TheyReturnHtml(string relativeUrl) + { HttpClient client = factory.CreateClient(); using HttpResponseMessage response = await client.GetAsync(relativeUrl); - Assert.Equal(HttpStatusCode.OK, response.StatusCode); + await Assert.That(response.StatusCode).IsEqualTo(HttpStatusCode.OK); + + // Ensure the response has content (not blank) + string content = await response.Content.ReadAsStringAsync(); + await Assert.That(content).IsNotEmpty(); + + // Verify it's actually HTML content, not just whitespace + await Assert.That(content).Contains("(Shared = SharedType.PerClass)] +public class CaptchaTests(CaptchaServiceProvider serviceProvider) +{ + [Test] + public async Task CaptchaService_Verify_Success(CancellationToken cancellationToken) + { + ICaptchaService captchaService = serviceProvider.ServiceProvider.GetRequiredService(); + + // From https://docs.hcaptcha.com/#integration-testing-test-keys + string hCaptchaSecret = "0x0000000000000000000000000000000000000000"; + string hCaptchaToken = "10000000-aaaa-bbbb-cccc-000000000001"; + string hCaptchaSiteKey = "10000000-ffff-ffff-ffff-000000000001"; + HCaptchaResult? response = await captchaService.VerifyAsync(hCaptchaSecret, hCaptchaToken, hCaptchaSiteKey, cancellationToken); + + await Assert.That(response).IsNotNull(); + await Assert.That(response.Success).IsTrue(); + } +} + +public class CaptchaServiceProvider : IDisposable, IAsyncDisposable +{ + public ServiceProvider ServiceProvider { get; } = CreateServiceProvider(); + public static ServiceProvider CreateServiceProvider() + { + IServiceCollection services = new ServiceCollection(); + + IConfigurationRoot configuration = new ConfigurationBuilder() + .SetBasePath(IntelliTect.Multitool.RepositoryPaths.GetDefaultRepoRoot()) + .AddJsonFile($"{nameof(EssentialCSharp)}.{nameof(Web)}/appsettings.json") + .Build(); + services.AddCaptchaService(configuration.GetSection(CaptchaOptions.CaptchaSender)); + // Add other necessary services here + + return services.BuildServiceProvider(); + } + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + ServiceProvider.Dispose(); + } + } + + public async ValueTask DisposeAsync() + { + await ServiceProvider.DisposeAsync().ConfigureAwait(false); + Dispose(disposing: false); + GC.SuppressFinalize(this); + } +} \ No newline at end of file diff --git a/EssentialCSharp.Web.Tests/ListingSourceCodeControllerTests.cs b/EssentialCSharp.Web.Tests/ListingSourceCodeControllerTests.cs new file mode 100644 index 00000000..05a29baa --- /dev/null +++ b/EssentialCSharp.Web.Tests/ListingSourceCodeControllerTests.cs @@ -0,0 +1,107 @@ +using System.Net; +using System.Net.Http.Json; +using EssentialCSharp.Web.Models; + +namespace EssentialCSharp.Web.Tests; + +[ClassDataSource(Shared = SharedType.PerClass)] +public class ListingSourceCodeControllerTests(WebApplicationFactory factory) +{ + [Test] + public async Task GetListing_WithValidChapterAndListing_Returns200WithContent() + { + // Arrange + HttpClient client = factory.CreateClient(); + + // Act + using HttpResponseMessage response = await client.GetAsync("/api/ListingSourceCode/chapter/1/listing/1"); + + // Assert + await Assert.That(response.StatusCode).IsEqualTo(HttpStatusCode.OK); + + ListingSourceCodeResponse? result = await response.Content.ReadFromJsonAsync(); + await Assert.That(result).IsNotNull(); + using (Assert.Multiple()) + { + await Assert.That(result.ChapterNumber).IsEqualTo(1); + await Assert.That(result.ListingNumber).IsEqualTo(1); + await Assert.That(result.FileExtension).IsNotEmpty(); + await Assert.That(result.Content).IsNotEmpty(); + } + } + + + [Test] + public async Task GetListing_WithInvalidChapter_Returns404() + { + // Arrange + HttpClient client = factory.CreateClient(); + + // Act + using HttpResponseMessage response = await client.GetAsync("/api/ListingSourceCode/chapter/999/listing/1"); + + // Assert + await Assert.That(response.StatusCode).IsEqualTo(HttpStatusCode.NotFound); + } + + [Test] + public async Task GetListing_WithInvalidListing_Returns404() + { + // Arrange + HttpClient client = factory.CreateClient(); + + // Act + using HttpResponseMessage response = await client.GetAsync("/api/ListingSourceCode/chapter/1/listing/999"); + + // Assert + await Assert.That(response.StatusCode).IsEqualTo(HttpStatusCode.NotFound); + } + + [Test] + public async Task GetListingsByChapter_WithValidChapter_ReturnsMultipleListings() + { + // Arrange + HttpClient client = factory.CreateClient(); + + // Act + using HttpResponseMessage response = await client.GetAsync("/api/ListingSourceCode/chapter/1"); + + // Assert + await Assert.That(response.StatusCode).IsEqualTo(HttpStatusCode.OK); + + List? results = await response.Content.ReadFromJsonAsync>(); + await Assert.That(results).IsNotNull(); + await Assert.That(results).IsNotEmpty(); + + // Verify results are ordered by listing number + await Assert.That(results).IsOrderedBy(r => r.ListingNumber); + + // Verify all results are from chapter 1 and have required properties + foreach (var r in results) + { + using (Assert.Multiple()) + { + await Assert.That(r.ChapterNumber).IsEqualTo(1); + await Assert.That(r.FileExtension).IsNotEmpty(); + await Assert.That(r.Content).IsNotEmpty(); + } + } + } + + [Test] + public async Task GetListingsByChapter_WithInvalidChapter_ReturnsEmptyList() + { + // Arrange + HttpClient client = factory.CreateClient(); + + // Act + using HttpResponseMessage response = await client.GetAsync("/api/ListingSourceCode/chapter/999"); + + // Assert + await Assert.That(response.StatusCode).IsEqualTo(HttpStatusCode.OK); + + List? results = await response.Content.ReadFromJsonAsync>(); + await Assert.That(results).IsNotNull(); + await Assert.That(results).IsEmpty(); + } +} diff --git a/EssentialCSharp.Web.Tests/ListingSourceCodeServiceTests.cs b/EssentialCSharp.Web.Tests/ListingSourceCodeServiceTests.cs new file mode 100644 index 00000000..83a413c0 --- /dev/null +++ b/EssentialCSharp.Web.Tests/ListingSourceCodeServiceTests.cs @@ -0,0 +1,131 @@ +using EssentialCSharp.Web.Models; +using EssentialCSharp.Web.Services; + +namespace EssentialCSharp.Web.Tests; + +public class ListingSourceCodeServiceTests +{ + [Test] + public async Task GetListingAsync_WithValidChapterAndListing_ReturnsCorrectListing() + { + // Arrange + ListingSourceCodeService service = CreateService(); + + // Act + ListingSourceCodeResponse? result = await service.GetListingAsync(1, 1); + + // Assert + await Assert.That(result).IsNotNull(); + using (Assert.Multiple()) + { + await Assert.That(result.ChapterNumber).IsEqualTo(1); + await Assert.That(result.ListingNumber).IsEqualTo(1); + await Assert.That(result.FileExtension).IsEqualTo("cs"); + await Assert.That(result.Content).IsNotEmpty(); + } + } + + [Test] + public async Task GetListingAsync_WithInvalidChapter_ReturnsNull() + { + // Arrange + ListingSourceCodeService service = CreateService(); + + // Act + ListingSourceCodeResponse? result = await service.GetListingAsync(999, 1); + + // Assert + await Assert.That(result).IsNull(); + } + + [Test] + public async Task GetListingAsync_WithInvalidListing_ReturnsNull() + { + // Arrange + ListingSourceCodeService service = CreateService(); + + // Act + ListingSourceCodeResponse? result = await service.GetListingAsync(1, 999); + + // Assert + await Assert.That(result).IsNull(); + } + + [Test] + public async Task GetListingAsync_DifferentFileExtension_AutoDiscoversFileExtension() + { + // Arrange + ListingSourceCodeService service = CreateService(); + + // Act - Get an XML file (01.02.xml exists in Chapter 1) + ListingSourceCodeResponse? result = await service.GetListingAsync(1, 2); + + // Assert + await Assert.That(result).IsNotNull(); + await Assert.That(result.FileExtension).IsEqualTo("xml"); + } + + [Test] + public async Task GetListingsByChapterAsync_WithValidChapter_ReturnsAllListings() + { + // Arrange + ListingSourceCodeService service = CreateService(); + + // Act + IReadOnlyList results = await service.GetListingsByChapterAsync(1); + + // Assert + await Assert.That(results).IsNotEmpty(); + foreach (var r in results) + { + using (Assert.Multiple()) + { + await Assert.That(r.ChapterNumber).IsEqualTo(1); + await Assert.That(r.Content).IsNotEmpty(); + await Assert.That(r.FileExtension).IsNotEmpty(); + } + } + + // Verify results are ordered + await Assert.That(results).IsOrderedBy(r => r.ListingNumber); + } + + [Test] + public async Task GetListingsByChapterAsync_DirectoryContainsNonListingFiles_ExcludesNonListingFiles() + { + // Arrange - Chapter 10 has Employee.cs which doesn't match the pattern + ListingSourceCodeService service = CreateService(); + + // Act + IReadOnlyList results = await service.GetListingsByChapterAsync(10); + + // Assert + await Assert.That(results).IsNotEmpty(); + + // Ensure all results match the {CC}.{LL}.{ext} pattern + foreach (var r in results) + { + using (Assert.Multiple()) + { + await Assert.That(r.ChapterNumber).IsEqualTo(10); + await Assert.That(r.ListingNumber).IsBetween(1, 99); + } + } + } + + [Test] + public async Task GetListingsByChapterAsync_WithInvalidChapter_ReturnsEmptyList() + { + // Arrange + ListingSourceCodeService service = CreateService(); + + // Act + IReadOnlyList results = await service.GetListingsByChapterAsync(999); + + // Assert + await Assert.That(results).IsEmpty(); + } + + private static ListingSourceCodeService CreateService() => + TestListingSourceCodeServiceHelper.CreateService(); +} diff --git a/EssentialCSharp.Web.Tests/RouteConfigurationServiceTests.cs b/EssentialCSharp.Web.Tests/RouteConfigurationServiceTests.cs new file mode 100644 index 00000000..ed5866fc --- /dev/null +++ b/EssentialCSharp.Web.Tests/RouteConfigurationServiceTests.cs @@ -0,0 +1,36 @@ +using EssentialCSharp.Web.Services; +using Microsoft.Extensions.DependencyInjection; + +namespace EssentialCSharp.Web.Tests; + +[ClassDataSource(Shared = SharedType.PerClass)] +public class RouteConfigurationServiceTests +{ + private readonly WebApplicationFactory _Factory; + + public RouteConfigurationServiceTests(WebApplicationFactory factory) + { + _Factory = factory; + } + + [Test] + public async Task GetStaticRoutes_ShouldReturnExpectedRoutes() + { + // Act + var routes = _Factory.InServiceScope(serviceProvider => + { + var routeConfigurationService = serviceProvider.GetRequiredService(); + return routeConfigurationService.GetStaticRoutes().ToList(); + }); + + // Assert + await Assert.That(routes).IsNotEmpty(); + + // Check for expected routes from the HomeController + await Assert.That(routes).Contains("home"); + await Assert.That(routes).Contains("about"); + await Assert.That(routes).Contains("guidelines"); + await Assert.That(routes).Contains("announcements"); + await Assert.That(routes).Contains("termsofservice"); + } +} \ No newline at end of file diff --git a/EssentialCSharp.Web.Tests/SiteMappingTests.cs b/EssentialCSharp.Web.Tests/SiteMappingTests.cs new file mode 100644 index 00000000..91b4e7d9 --- /dev/null +++ b/EssentialCSharp.Web.Tests/SiteMappingTests.cs @@ -0,0 +1,149 @@ +ο»Ώusing EssentialCSharp.Web.Extensions; + +namespace EssentialCSharp.Web.Tests; + +public class SiteMappingTests +{ + static SiteMapping HelloWorldSiteMapping => new( + keys: ["hello-world"], + primaryKey: "hello-world", + pagePath: + [ + "Chapters", + "01", + "Pages", + "01.html" + ], + chapterNumber: 1, + pageNumber: 1, + orderOnPage: 1, + chapterTitle: "Introducing C#", + rawHeading: "Introduction", + anchorId: "hello-world", + indentLevel: 0 + ); + + static SiteMapping CSyntaxFundamentalsSiteMapping => new( + keys: ["c-syntax-fundamentals"], + primaryKey: "c-syntax-fundamentals", + pagePath: + [ + "Chapters", + "01", + "Pages", + "02.html" + ], + chapterNumber: 1, + pageNumber: 2, + orderOnPage: 1, + chapterTitle: "Introducing C#", + rawHeading: "C# Syntax Fundamentals", + anchorId: "c-syntax-fundamentals", + indentLevel: 2 + ); + + public static List GetSiteMap() + { + return + [ + HelloWorldSiteMapping, + CSyntaxFundamentalsSiteMapping + ]; + } + + [Test] + public async Task FindHelloWorldWithAnchorSlugReturnsCorrectSiteMap() + { + SiteMapping? foundSiteMap = GetSiteMap().Find("hello-world#hello-world"); + await Assert.That(foundSiteMap).IsNotNull(); + await Assert.That(foundSiteMap).IsEquivalentTo(HelloWorldSiteMapping); + } + + [Test] + public async Task FindCSyntaxFundamentalsWithSpacesReturnsCorrectSiteMap() + { + SiteMapping? foundSiteMap = GetSiteMap().Find("C# Syntax Fundamentals"); + await Assert.That(foundSiteMap).IsNotNull(); + await Assert.That(foundSiteMap).IsEquivalentTo(CSyntaxFundamentalsSiteMapping); + } + + [Test] + public async Task FindCSyntaxFundamentalsWithSpacesAndAnchorReturnsCorrectSiteMap() + { + SiteMapping? foundSiteMap = GetSiteMap().Find("C# Syntax Fundamentals#hello-world"); + await Assert.That(foundSiteMap).IsNotNull(); + await Assert.That(foundSiteMap).IsEquivalentTo(CSyntaxFundamentalsSiteMapping); + } + + [Test] + public async Task FindCSyntaxFundamentalsSanitizedWithAnchorReturnsCorrectSiteMap() + { + SiteMapping? foundSiteMap = GetSiteMap().Find("c-syntax-fundamentals#hello-world"); + await Assert.That(foundSiteMap).IsNotNull(); + await Assert.That(foundSiteMap).IsEquivalentTo(CSyntaxFundamentalsSiteMapping); + } + + [Test] + public async Task FindPercentComplete_KeyIsNull_ReturnsNull() + { + // Arrange + + // Act + string? percent = GetSiteMap().FindPercentComplete(null!); + + // Assert + await Assert.That(percent).IsNull(); + } + + [Test] + [Arguments(" ")] + [Arguments("")] + public async Task FindPercentComplete_KeyIsWhiteSpace_ThrowsArgumentException(string? key) + { + // Arrange + + // Act + + // Assert + await Assert.That(() => GetSiteMap().FindPercentComplete(key)).Throws(); + } + + [Test] + [Arguments("hello-world", "50.00")] + [Arguments("c-syntax-fundamentals", "100.00")] + public async Task FindPercentComplete_ValidKey_Success(string? key, string result) + { + // Arrange + + // Act + string? percent = GetSiteMap().FindPercentComplete(key); + + // Assert + await Assert.That(percent).IsEqualTo(result); + } + + [Test] + public async Task FindPercentComplete_EmptySiteMappings_ReturnsZeroPercent() + { + // Arrange + IList siteMappings = new List(); + + // Act + string? percent = siteMappings.FindPercentComplete("test"); + + // Assert + await Assert.That(percent).IsEqualTo("0.00"); + } + + [Test] + public async Task FindPercentComplete_KeyNotFound_ReturnsZeroPercent() + { + // Arrange + + // Act + string? percent = GetSiteMap().FindPercentComplete("non-existent-key"); + + // Assert + await Assert.That(percent).IsEqualTo("0.00"); + } +} \ No newline at end of file diff --git a/EssentialCSharp.Web.Tests/SitemapXmlHelpersTests.cs b/EssentialCSharp.Web.Tests/SitemapXmlHelpersTests.cs new file mode 100644 index 00000000..7573e34b --- /dev/null +++ b/EssentialCSharp.Web.Tests/SitemapXmlHelpersTests.cs @@ -0,0 +1,251 @@ +using System.IO; +using System.Globalization; +using DotnetSitemapGenerator; +using EssentialCSharp.Web.Helpers; +using EssentialCSharp.Web.Services; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +namespace EssentialCSharp.Web.Tests; + +[NotInParallel("SitemapTests")] +[ClassDataSource(Shared = SharedType.PerClass)] +public class SitemapXmlHelpersTests +{ + private readonly WebApplicationFactory _Factory; + + public SitemapXmlHelpersTests(WebApplicationFactory factory) + { + _Factory = factory; + } + + [Test] + public async Task EnsureSitemapHealthy_WithValidSiteMappings_DoesNotThrow() + { + // Arrange + var siteMappings = new List + { + CreateSiteMapping(1, 1, true), + CreateSiteMapping(1, 2, true), + CreateSiteMapping(2, 1, true) + }; + + // Act & Assert + await Assert.That(() => SitemapXmlHelpers.EnsureSitemapHealthy(siteMappings)).ThrowsNothing(); + } + + [Test] + public async Task EnsureSitemapHealthy_WithMultipleCanonicalLinksForSamePage_ThrowsException() + { + // Arrange - Two mappings for the same chapter/page both marked as canonical + var siteMappings = new List + { + CreateSiteMapping(1, 1, true), + CreateSiteMapping(1, 1, true) // Same chapter/page, also canonical + }; + + // Act & Assert + await Assert.That(() => SitemapXmlHelpers.EnsureSitemapHealthy(siteMappings)) + .Throws() + .WithMessageContaining("Chapter 1, Page 1") + .And.WithMessageContaining("more than one canonical link"); + } + + [Test] + public async Task EnsureSitemapHealthy_WithNoCanonicalLinksForPage_ThrowsException() + { + // Arrange - No mappings marked as canonical for this page + var siteMappings = new List + { + CreateSiteMapping(1, 1, false), + CreateSiteMapping(1, 1, false) // Same chapter/page, neither canonical + }; + + // Act & Assert + await Assert.That(() => SitemapXmlHelpers.EnsureSitemapHealthy(siteMappings)) + .Throws() + .WithMessageContaining("Chapter 1, Page 1"); + } + + [Test] + public async Task GenerateSitemapXml_DoesNotIncludeIdentityRoutes() + { + // Arrange + var tempDir = Directory.CreateTempSubdirectory("SitemapTest_"); + var siteMappings = new List { CreateSiteMapping(1, 1, true) }; + var baseUrl = "https://test.example.com/"; + + // Act & Assert + var routeConfigurationService = _Factory.Services.GetRequiredService(); + SitemapXmlHelpers.GenerateSitemapXml( + tempDir, + siteMappings, + routeConfigurationService, + baseUrl, + out var nodes); + + var allUrls = nodes.Select(n => n.Url).ToList(); + + // Verify no Identity routes are included + await Assert.That(allUrls).DoesNotContain(url => url.Contains("Identity", StringComparison.OrdinalIgnoreCase)); + await Assert.That(allUrls).DoesNotContain(url => url.Contains("Account", StringComparison.OrdinalIgnoreCase)); + + // But verify that expected routes are included + await Assert.That(allUrls).Contains(url => url.Contains("/home", StringComparison.OrdinalIgnoreCase)); + await Assert.That(allUrls).Contains(url => url.Contains("/about", StringComparison.OrdinalIgnoreCase)); + } + + [Test] + public async Task GenerateSitemapXml_IncludesBaseUrl() + { + // Arrange + var tempDir = Directory.CreateTempSubdirectory("SitemapTest_"); + var siteMappings = new List(); + var baseUrl = "https://test.example.com/"; + + // Act & Assert + var routeConfigurationService = _Factory.Services.GetRequiredService(); + SitemapXmlHelpers.GenerateSitemapXml( + tempDir, + siteMappings, + routeConfigurationService, + baseUrl, + out var nodes); + + await Assert.That(nodes).Contains(node => node.Url == baseUrl); + + // Verify the root URL has highest priority + var rootNode = nodes.First(node => node.Url == baseUrl); + using (Assert.Multiple()) + { + await Assert.That(rootNode.Priority).IsEqualTo(1.0M); + await Assert.That(rootNode.ChangeFrequency).IsEqualTo(ChangeFrequency.Daily); + } + } + + [Test] + public async Task GenerateSitemapXml_IncludesSiteMappingsMarkedForXml() + { + // Arrange + var tempDir = Directory.CreateTempSubdirectory("SitemapTest_"); + var baseUrl = "https://test.example.com/"; + + var siteMappings = new List + { + CreateSiteMapping(1, 1, true, "test-page-1"), + CreateSiteMapping(1, 2, false, "test-page-2"), // Not included in XML + CreateSiteMapping(2, 1, true, "test-page-3") + }; + + // Act & Assert + var routeConfigurationService = _Factory.Services.GetRequiredService(); + SitemapXmlHelpers.GenerateSitemapXml( + tempDir, + siteMappings, + routeConfigurationService, + baseUrl, + out var nodes); + + var allUrls = nodes.Select(n => n.Url).ToList(); + + await Assert.That(allUrls).Contains(url => url.Contains("test-page-1", StringComparison.OrdinalIgnoreCase)); + await Assert.That(allUrls).DoesNotContain(url => url.Contains("test-page-2", StringComparison.OrdinalIgnoreCase)); // Not marked for XML + await Assert.That(allUrls).Contains(url => url.Contains("test-page-3", StringComparison.OrdinalIgnoreCase)); + } + + [Test] + public async Task GenerateSitemapXml_DoesNotIncludeIndexRoutes() + { + // Arrange + var tempDir = Directory.CreateTempSubdirectory("SitemapTest_"); + var siteMappings = new List(); + var baseUrl = "https://test.example.com/"; + + // Act & Assert + var routeConfigurationService = _Factory.Services.GetRequiredService(); + SitemapXmlHelpers.GenerateSitemapXml( + tempDir, + siteMappings, + routeConfigurationService, + baseUrl, + out var nodes); + + var allUrls = nodes.Select(n => n.Url).ToList(); + + // Should not include Index action routes (they're the default) + await Assert.That(allUrls).DoesNotContain(url => url.Contains("/Index", StringComparison.OrdinalIgnoreCase)); + } + + [Test] + public async Task GenerateSitemapXml_DoesNotIncludeErrorRoutes() + { + // Arrange + var tempDir = Directory.CreateTempSubdirectory("SitemapTest_"); + var siteMappings = new List(); + var baseUrl = "https://test.example.com/"; + + // Act & Assert + var routeConfigurationService = _Factory.Services.GetRequiredService(); + SitemapXmlHelpers.GenerateSitemapXml( + tempDir, + siteMappings, + routeConfigurationService, + baseUrl, + out var nodes); + + var allUrls = nodes.Select(n => n.Url).ToList(); + + // Should not include Error action routes + await Assert.That(allUrls).DoesNotContain(url => url.Contains("/Error", StringComparison.OrdinalIgnoreCase)); + } + + [Test] + public async Task GenerateSitemapXml_UsesLastModifiedDateFromSiteMapping() + { + // Arrange + var tempDir = Directory.CreateTempSubdirectory("SitemapTest_"); + var baseUrl = "https://test.example.com/"; + var specificLastModified = new DateTime(2023, 5, 15, 10, 30, 0, DateTimeKind.Utc); + + var siteMappings = new List + { + CreateSiteMapping(1, 1, true, "test-page-1", specificLastModified) + }; + + // Act + var routeConfigurationService = _Factory.Services.GetRequiredService(); + SitemapXmlHelpers.GenerateSitemapXml( + tempDir, + siteMappings, + routeConfigurationService, + baseUrl, + out var nodes); + + // Assert + var siteMappingNode = nodes.First(node => node.Url.Contains("test-page-1")); + await Assert.That(siteMappingNode.LastModificationDate).IsEqualTo(specificLastModified); + } + + private static SiteMapping CreateSiteMapping( + int chapterNumber, + int pageNumber, + bool includeInSitemapXml, + string key = "test-key", + DateTime? lastModified = null) + { + return new SiteMapping( + keys: [key], + primaryKey: key, + pagePath: ["Chapters", chapterNumber.ToString("00", CultureInfo.InvariantCulture), "Pages", $"{pageNumber:00}.html"], + chapterNumber: chapterNumber, + pageNumber: pageNumber, + orderOnPage: 0, + chapterTitle: $"Chapter {chapterNumber}", + rawHeading: "Test Heading", + anchorId: key, + indentLevel: 1, + contentHash: "TestHash123", + includeInSitemapXml: includeInSitemapXml, + lastModified: lastModified + ); + } +} diff --git a/EssentialCSharp.Web.Tests/StringExtensionsTests.cs b/EssentialCSharp.Web.Tests/StringExtensionsTests.cs index 50116ab3..254db0d2 100644 --- a/EssentialCSharp.Web.Tests/StringExtensionsTests.cs +++ b/EssentialCSharp.Web.Tests/StringExtensionsTests.cs @@ -2,33 +2,33 @@ public class StringExtensionsTests { - [Theory] - [InlineData(" ExtraSpacing ", "extraspacing")] - [InlineData("Hello World", "hello-world")] - [InlineData("Coding the Publish–Subscribe Pattern with Multicast Delegates", "coding-the-publish-subscribe-pattern-with-multicast-delegates")] - [InlineData("C#", "c")] - [InlineData("C# Syntax Fundamentals", "c-syntax-fundamentals")] - [InlineData("C#_Syntax_Fundamentals", "c-syntax-fundamentals")] - [InlineData("C# Syntax_Fundamentals-for-me", "c-syntax-fundamentals-for-me")] - [InlineData("Bitwise Operators (<<, >>, |, &, ^, ~)", "bitwise-operators")] - [InlineData(".NET Standard", "net-standard")] - [InlineData("Working with System.Threading", "working-with-system-threading")] - public void SanitizeStringToOnlyHaveDashesAndLowerCase(string actual, string sanitized) + [Test] + [Arguments(" ExtraSpacing ", "extraspacing")] + [Arguments("Hello World", "hello-world")] + [Arguments("Coding the Publish–Subscribe Pattern with Multicast Delegates", "coding-the-publish-subscribe-pattern-with-multicast-delegates")] + [Arguments("C#", "c")] + [Arguments("C# Syntax Fundamentals", "c-syntax-fundamentals")] + [Arguments("C#_Syntax_Fundamentals", "c-syntax-fundamentals")] + [Arguments("C# Syntax_Fundamentals-for-me", "c-syntax-fundamentals-for-me")] + [Arguments("Bitwise Operators (<<, >>, |, &, ^, ~)", "bitwise-operators")] + [Arguments(".NET Standard", "net-standard")] + [Arguments("Working with System.Threading", "working-with-system-threading")] + public async Task SanitizeStringToOnlyHaveDashesAndLowerCase(string actual, string sanitized) { - Assert.Equal(sanitized, actual.Sanitize()); - Assert.Equal(sanitized, actual.Sanitize().Sanitize()); + await Assert.That(actual.Sanitize()).IsEqualTo(sanitized); + await Assert.That(actual.Sanitize().Sanitize()).IsEqualTo(sanitized); } - [Theory] - [InlineData("hello-world#hello-world", "hello-world")] - [InlineData("C#Syntax#hello-world", "csyntax")] - [InlineData("C#Syntax", "csyntax")] - [InlineData("cSyntax", "csyntax")] - [InlineData(".NET", "net")] - [InlineData("System.Threading", "system-threading")] - public void GetPotentialMatches(string actual, string match) + [Test] + [Arguments("hello-world#hello-world", "hello-world")] + [Arguments("C#Syntax#hello-world", "csyntax")] + [Arguments("C#Syntax", "csyntax")] + [Arguments("cSyntax", "csyntax")] + [Arguments(".NET", "net")] + [Arguments("System.Threading", "system-threading")] + public async Task GetPotentialMatches(string actual, string match) { var matches = actual.GetPotentialMatches().ToList(); - Assert.Contains(match, matches); + await Assert.That(matches).Contains(match); } -} +} \ No newline at end of file diff --git a/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter01/01.01.cs b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter01/01.01.cs new file mode 100644 index 00000000..1d0e12f4 --- /dev/null +++ b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter01/01.01.cs @@ -0,0 +1,10 @@ +// Test listing 01.01 +using System; + +class Program +{ + static void Main() + { + Console.WriteLine("Hello, World!"); + } +} diff --git a/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter01/01.02.xml b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter01/01.02.xml new file mode 100644 index 00000000..a0ba1622 --- /dev/null +++ b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter01/01.02.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter01/01.03.cs b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter01/01.03.cs new file mode 100644 index 00000000..b03ff26b --- /dev/null +++ b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter01/01.03.cs @@ -0,0 +1,8 @@ +// Test listing 01.03 +namespace TestNamespace +{ + public class TestClass + { + public int TestProperty { get; set; } + } +} diff --git a/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter10/10.01.cs b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter10/10.01.cs new file mode 100644 index 00000000..9d73d9cd --- /dev/null +++ b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter10/10.01.cs @@ -0,0 +1,6 @@ +// Test listing 10.01 +public class Employee +{ + public string Name { get; set; } + public int Id { get; set; } +} diff --git a/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter10/10.02.cs b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter10/10.02.cs new file mode 100644 index 00000000..1ddb62b1 --- /dev/null +++ b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter10/10.02.cs @@ -0,0 +1,5 @@ +// Test listing 10.02 +public class Manager : Employee +{ + public List DirectReports { get; set; } +} diff --git a/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter10/Employee.cs b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter10/Employee.cs new file mode 100644 index 00000000..6cdb6753 --- /dev/null +++ b/EssentialCSharp.Web.Tests/TestData/ListingSourceCode/src/Chapter10/Employee.cs @@ -0,0 +1,6 @@ +// This file should NOT be picked up by the listing pattern +// It doesn't match {CC}.{LL}.{ext} format +public class EmployeeHelper +{ + public static void DoSomething() { } +} diff --git a/EssentialCSharp.Web.Tests/TestData/README.md b/EssentialCSharp.Web.Tests/TestData/README.md new file mode 100644 index 00000000..80baafc5 --- /dev/null +++ b/EssentialCSharp.Web.Tests/TestData/README.md @@ -0,0 +1,46 @@ +# Test Data Directory + +This directory contains test fixtures used by the test suite to ensure tests are isolated and independent of production data. + +## Structure + +``` +TestData/ +└── ListingSourceCode/ + └── src/ + β”œβ”€β”€ Chapter01/ + β”‚ β”œβ”€β”€ 01.01.cs + β”‚ β”œβ”€β”€ 01.02.xml + β”‚ └── 01.03.cs + └── Chapter10/ + β”œβ”€β”€ 10.01.cs + β”œβ”€β”€ 10.02.cs + └── Employee.cs # Non-listing file to test filtering +``` + +## Purpose + +Test files in this directory: +- Provide controlled, predictable test data +- Isolate tests from changes to production listing files +- Enable testing of edge cases and error conditions +- Are minimal in size for fast test execution +- Are automatically copied to the output directory during build + +## File Naming Convention + +Listing files follow the pattern: `{CC}.{LL}.{ext}` +- `CC`: Two-digit chapter number (e.g., "01", "10") +- `LL`: Two-digit listing number (e.g., "01", "15") +- `ext`: File extension (e.g., "cs", "xml") + +Files not matching this pattern (like `Employee.cs`) are used to test that the service correctly excludes non-listing files. + +## Build Configuration + +These files are: +- Excluded from compilation via `` +- Included as content via `` +- Copied to output directory with `CopyToOutputDirectory.PreserveNewest` + +See [EssentialCSharp.Web.Tests.csproj](../EssentialCSharp.Web.Tests.csproj) for the full build configuration. diff --git a/EssentialCSharp.Web.Tests/TestListingSourceCodeServiceHelper.cs b/EssentialCSharp.Web.Tests/TestListingSourceCodeServiceHelper.cs new file mode 100644 index 00000000..a37d32fa --- /dev/null +++ b/EssentialCSharp.Web.Tests/TestListingSourceCodeServiceHelper.cs @@ -0,0 +1,29 @@ +using EssentialCSharp.Web.Services; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.FileProviders; +using Moq.AutoMock; + +namespace EssentialCSharp.Web.Tests; + +internal static class TestListingSourceCodeServiceHelper +{ + internal static string ResolveTestDataPath() + { + string testDataPath = Path.Join(AppContext.BaseDirectory, "TestData"); + if (!Directory.Exists(testDataPath)) + throw new InvalidOperationException($"TestData directory not found at: {testDataPath}"); + return testDataPath; + } + + internal static ListingSourceCodeService CreateService() + { + string testDataPath = ResolveTestDataPath(); + + AutoMocker mocker = new(); + mocker.Setup(m => m.ContentRootPath).Returns(testDataPath); + mocker.Setup(m => m.ContentRootFileProvider) + .Returns(new PhysicalFileProvider(testDataPath)); + + return mocker.CreateInstance(); + } +} diff --git a/EssentialCSharp.Web.Tests/Usings.cs b/EssentialCSharp.Web.Tests/Usings.cs deleted file mode 100644 index 8c927eb7..00000000 --- a/EssentialCSharp.Web.Tests/Usings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Xunit; \ No newline at end of file diff --git a/EssentialCSharp.Web.Tests/Web.Tests.cs b/EssentialCSharp.Web.Tests/Web.Tests.cs deleted file mode 100644 index 4713e2a9..00000000 --- a/EssentialCSharp.Web.Tests/Web.Tests.cs +++ /dev/null @@ -1,70 +0,0 @@ -ο»Ώnamespace EssentialCSharp.Web.Tests; - -public class SiteMappingTests -{ - static SiteMapping HelloWorldSiteMapping { get; } = new(Key: "hello-world", - PagePath: new string[] - { - "Chapters", - "01", - "Pages", - "01.html" - }, - ChapterNumber: 1, - PageNumber: 1, - ChapterTitle: "Introducing C#", - RawHeading: "Introduction", - AnchorId: "hello-world", - IndentLevel: 0); - static SiteMapping CSyntaxFundamentalsSiteMapping { get; } = new(Key: "c-syntax-fundamentals", - PagePath: new string[] - { - "Chapters", - "01", - "Pages", - "02.html" - }, - ChapterNumber: 1, - PageNumber: 2, - ChapterTitle: "Introducing C#", - RawHeading: "C# Syntax Fundamentals", - AnchorId: "c-syntax-fundamentals", - IndentLevel: 2); - public static List GetSiteMap() - { - return new List() - { - HelloWorldSiteMapping, - CSyntaxFundamentalsSiteMapping - }; - } - - [Fact] - public void FindHelloWorldWithAnchorSlugReturnsCorrectSiteMap() - { - SiteMapping? foundSiteMap = SiteMapping.Find("hello-world#hello-world", GetSiteMap()); - Assert.NotNull(foundSiteMap); - Assert.Equal(HelloWorldSiteMapping, foundSiteMap!); - } - [Fact] - public void FindCSyntaxFundamentalsWithSpacesReturnsCorrectSiteMap() - { - SiteMapping? foundSiteMap = SiteMapping.Find("C# Syntax Fundamentals", GetSiteMap()); - Assert.NotNull(foundSiteMap); - Assert.Equal(CSyntaxFundamentalsSiteMapping, foundSiteMap!); - } - [Fact] - public void FindCSyntaxFundamentalsWithSpacesAndAnchorReturnsCorrectSiteMap() - { - SiteMapping? foundSiteMap = SiteMapping.Find("C# Syntax Fundamentals#hello-world", GetSiteMap()); - Assert.NotNull(foundSiteMap); - Assert.Equal(CSyntaxFundamentalsSiteMapping, foundSiteMap!); - } - [Fact] - public void FindCSyntaxFundamentalsSanitizedWithAnchorReturnsCorrectSiteMap() - { - SiteMapping? foundSiteMap = SiteMapping.Find("c-syntax-fundamentals#hello-world", GetSiteMap()); - Assert.NotNull(foundSiteMap); - Assert.Equal(CSyntaxFundamentalsSiteMapping, foundSiteMap!); - } -} diff --git a/EssentialCSharp.Web.Tests/WebApplicationFactory.cs b/EssentialCSharp.Web.Tests/WebApplicationFactory.cs index a385322a..287150ee 100644 --- a/EssentialCSharp.Web.Tests/WebApplicationFactory.cs +++ b/EssentialCSharp.Web.Tests/WebApplicationFactory.cs @@ -1,8 +1,127 @@ -ο»Ώusing Microsoft.AspNetCore.Mvc.Testing; +using System.Data.Common; +using EssentialCSharp.Web.Data; +using EssentialCSharp.Web.Services; +using TUnit.Core.Interfaces; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace EssentialCSharp.Web.Tests; -internal sealed class WebApplicationFactory : WebApplicationFactory +public sealed class WebApplicationFactory : WebApplicationFactory, IAsyncInitializer { + public Task InitializeAsync() + { + // Force eager server initialization before tests run. + // This is thread-safe and prevents race conditions from parallel tests + // calling CreateClient() concurrently during lazy init. + _ = Server; + return Task.CompletedTask; + } + private static string SqlConnectionString => $"DataSource=file:{Guid.NewGuid()}?mode=memory&cache=shared"; + private SqliteConnection? _Connection; + + protected override void ConfigureWebHost(IWebHostBuilder builder) + { + builder.ConfigureServices(services => + { + ServiceDescriptor? dbContextDescriptor = services.SingleOrDefault( + d => d.ServiceType == + typeof(IDbContextOptionsConfiguration)); + + if (dbContextDescriptor != null) + { + services.Remove(dbContextDescriptor); + } + + ServiceDescriptor? dbConnectionDescriptor = + services.SingleOrDefault( + d => d.ServiceType == + typeof(DbConnection)); + + if (dbConnectionDescriptor != null) + { + services.Remove(dbConnectionDescriptor); + } + + // Remove DatabaseMigrationService: it calls MigrateAsync which conflicts + // with EnsureCreated() used below for the in-memory SQLite test database. + ServiceDescriptor? migrationServiceDescriptor = services.SingleOrDefault( + d => d.ImplementationType == typeof(DatabaseMigrationService)); + if (migrationServiceDescriptor != null) + { + services.Remove(migrationServiceDescriptor); + } + + _Connection = new SqliteConnection(SqlConnectionString); + _Connection.Open(); + + services.AddDbContext(options => + { + options.UseSqlite(_Connection); + }); + + using ServiceProvider serviceProvider = services.BuildServiceProvider(); + using IServiceScope scope = serviceProvider.CreateScope(); + IServiceProvider scopedServices = scope.ServiceProvider; + EssentialCSharpWebContext db = scopedServices.GetRequiredService(); + + db.Database.EnsureCreated(); + + // Replace IListingSourceCodeService with one backed by TestData + services.RemoveAll(); + services.AddSingleton( + _ => TestListingSourceCodeServiceHelper.CreateService()); + }); + } + + /// + /// Executes an action within a service scope, handling scope creation and cleanup automatically. + /// + /// The return type of the action + /// The action to execute with the scoped service provider + /// The result of the action + public T InServiceScope(Func action) + { + var factory = Services.GetRequiredService(); + using var scope = factory.CreateScope(); + return action(scope.ServiceProvider); + } + + /// + /// Executes an action within a service scope, handling scope creation and cleanup automatically. + /// + /// The action to execute with the scoped service provider + public void InServiceScope(Action action) + { + var factory = Services.GetRequiredService(); + using var scope = factory.CreateScope(); + action(scope.ServiceProvider); + } + + public override async ValueTask DisposeAsync() + { + await base.DisposeAsync().ConfigureAwait(false); + if (_Connection != null) + { + await _Connection.DisposeAsync().ConfigureAwait(false); + _Connection = null; + } + GC.SuppressFinalize(this); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (disposing) + { + _Connection?.Dispose(); + _Connection = null; + } + } } diff --git a/EssentialCSharp.Web.sln b/EssentialCSharp.Web.sln deleted file mode 100644 index a184136a..00000000 --- a/EssentialCSharp.Web.sln +++ /dev/null @@ -1,41 +0,0 @@ -ο»Ώ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.32014.148 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{18ABEFF6-6517-4245-B77E-E67D8B6B4682}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - ..\.gitattributes = ..\.gitattributes - ..\azure-pipelines.yml = ..\azure-pipelines.yml - Directory.Build.props = Directory.Build.props - Directory.Build.targets = Directory.Build.targets - nuget.config = nuget.config - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EssentialCSharp.Web", "EssentialCSharp.Web\EssentialCSharp.Web.csproj", "{B560B909-5FA2-4070-BDE3-1A4DDAA04E12}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EssentialCSharp.Web.Tests", "EssentialCSharp.Web.Tests\EssentialCSharp.Web.Tests.csproj", "{5717B439-2CFF-4BC5-A1DC-48BBF0FBE50F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B560B909-5FA2-4070-BDE3-1A4DDAA04E12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B560B909-5FA2-4070-BDE3-1A4DDAA04E12}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B560B909-5FA2-4070-BDE3-1A4DDAA04E12}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B560B909-5FA2-4070-BDE3-1A4DDAA04E12}.Release|Any CPU.Build.0 = Release|Any CPU - {5717B439-2CFF-4BC5-A1DC-48BBF0FBE50F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5717B439-2CFF-4BC5-A1DC-48BBF0FBE50F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5717B439-2CFF-4BC5-A1DC-48BBF0FBE50F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5717B439-2CFF-4BC5-A1DC-48BBF0FBE50F}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0EDAAE0E-CC92-4F4C-AE09-6BDE77693EE2} - EndGlobalSection -EndGlobal diff --git a/EssentialCSharp.Web.slnx b/EssentialCSharp.Web.slnx new file mode 100644 index 00000000..aa0e7b94 --- /dev/null +++ b/EssentialCSharp.Web.slnx @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/EssentialCSharp.Web/Areas/Identity/Data/EssentialCSharpWebContext.cs b/EssentialCSharp.Web/Areas/Identity/Data/EssentialCSharpWebContext.cs new file mode 100644 index 00000000..a64d3b63 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Data/EssentialCSharpWebContext.cs @@ -0,0 +1,17 @@ +ο»Ώusing EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; + +namespace EssentialCSharp.Web.Data; + +public class EssentialCSharpWebContext(DbContextOptions options) + : IdentityDbContext(options), IDataProtectionKeyContext +{ + public DbSet DataProtectionKeys { get; set; } = null!; + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Data/EssentialCSharpWebUser.cs b/EssentialCSharp.Web/Areas/Identity/Data/EssentialCSharpWebUser.cs new file mode 100644 index 00000000..04e02555 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Data/EssentialCSharpWebUser.cs @@ -0,0 +1,14 @@ +ο»Ώusing Microsoft.AspNetCore.Identity; + +namespace EssentialCSharp.Web.Areas.Identity.Data; + +// Add profile data for application users by adding properties to the EssentialCSharpWebUser class +public class EssentialCSharpWebUser : IdentityUser +{ + [ProtectedPersonalData] + public virtual string? FirstName { get; set; } + [ProtectedPersonalData] + public virtual string? LastName { get; set; } + public int ReferralCount { get; set; } +} + diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/AccessDenied.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/AccessDenied.cshtml new file mode 100644 index 00000000..017f6ff4 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/AccessDenied.cshtml @@ -0,0 +1,10 @@ +ο»Ώ@page +@model AccessDeniedModel +@{ + ViewData["Title"] = "Access denied"; +} + +
+

@ViewData["Title"]

+

You do not have access to this resource.

+
diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/AccessDenied.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/AccessDenied.cshtml.cs new file mode 100644 index 00000000..6e3f9335 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/AccessDenied.cshtml.cs @@ -0,0 +1,15 @@ +ο»Ώusing Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +/// +/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used +/// directly from your code. This API may change or be removed in future releases. +/// +public class AccessDeniedModel : PageModel +{ + + public void OnGet() + { + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmail.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmail.cshtml new file mode 100644 index 00000000..2deb2e52 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmail.cshtml @@ -0,0 +1,8 @@ +ο»Ώ@page +@model ConfirmEmailModel +@{ + ViewData["Title"] = "Confirm email"; +} + +

@ViewData["Title"]

+ diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmail.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmail.cshtml.cs new file mode 100644 index 00000000..a7fc8785 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmail.cshtml.cs @@ -0,0 +1,32 @@ +ο»Ώusing System.Text; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public class ConfirmEmailModel(UserManager userManager) : PageModel +{ + [TempData] + public string StatusMessage { get; set; } = string.Empty; + public async Task OnGetAsync(string? userId, string? code) + { + if (userId is null || code is null) + { + return RedirectToPage("/Index"); + } + + EssentialCSharpWebUser? user = await userManager.FindByIdAsync(userId); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userId}'."); + } + + code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); + IdentityResult result = await userManager.ConfirmEmailAsync(user, code); + StatusMessage = result.Succeeded ? "Thank you for confirming your email." : "Error confirming your email."; + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmailChange.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmailChange.cshtml new file mode 100644 index 00000000..114fa88a --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmailChange.cshtml @@ -0,0 +1,8 @@ +ο»Ώ@page +@model ConfirmEmailChangeModel +@{ + ViewData["Title"] = "Confirm email change"; +} + +

@ViewData["Title"]

+ diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmailChange.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmailChange.cshtml.cs new file mode 100644 index 00000000..9c86b055 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ConfirmEmailChange.cshtml.cs @@ -0,0 +1,49 @@ +ο»Ώusing System.Text; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public class ConfirmEmailChangeModel(UserManager userManager, SignInManager signInManager) : PageModel +{ + [TempData] + public string StatusMessage { get; set; } = string.Empty; + + public async Task OnGetAsync(string? userId, string? email, string? code) + { + if (userId is null || email is null || code is null) + { + return RedirectToPage("/Index"); + } + + EssentialCSharpWebUser? user = await userManager.FindByIdAsync(userId); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userId}'."); + } + + code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); + IdentityResult result = await userManager.ChangeEmailAsync(user, email, code); + if (!result.Succeeded) + { + StatusMessage = "Error changing email."; + return Page(); + } + + // In our UI email and user name are one and the same, so when we update the email + // we need to update the user name. + IdentityResult setUserNameResult = await userManager.SetUserNameAsync(user, email); + if (!setUserNameResult.Succeeded) + { + StatusMessage = "Error changing user name."; + return Page(); + } + + await signInManager.RefreshSignInAsync(user); + StatusMessage = "Thank you for confirming your email change."; + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ExternalLogin.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ExternalLogin.cshtml new file mode 100644 index 00000000..15d8f352 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ExternalLogin.cshtml @@ -0,0 +1,33 @@ +ο»Ώ@page +@model ExternalLoginModel +@{ + ViewData["Title"] = "Register"; +} + +

@ViewData["Title"]

+

Associate your @Model.ProviderDisplayName account.

+
+ +

+ You've successfully authenticated with @Model.ProviderDisplayName. + Please enter an email address for this site below and click the Register button to finish + logging in. +

+ +
+
+
+ +
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ExternalLogin.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ExternalLogin.cshtml.cs new file mode 100644 index 00000000..1316d553 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ExternalLogin.cshtml.cs @@ -0,0 +1,213 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using System.Security.Claims; +using System.Text; +using System.Text.Encodings.Web; +using EssentialCSharp.Web.Areas.Identity.Data; +using EssentialCSharp.Web.Services.Referrals; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +[AllowAnonymous] +public class ExternalLoginModel( + SignInManager signInManager, + UserManager userManager, + IUserStore userStore, + ILogger logger, + IEmailSender emailSender, + IUserEmailStore emailStore, + IReferralService referralService) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public string? ProviderDisplayName { get; set; } + + public string? ReturnUrl { get; set; } + + [TempData] + public string? ErrorMessage { get; set; } + + public class InputModel + { + [Required] + [EmailAddress] + public string? Email { get; set; } + } + + public IActionResult OnGet() => RedirectToPage("./Login"); + + public IActionResult OnPost(string provider, string? returnUrl = null) + { + // Request a redirect to the external login provider. + string redirectUrl = Url.Page("./ExternalLogin", pageHandler: "Callback", values: new { returnUrl }) ?? "/"; + Microsoft.AspNetCore.Authentication.AuthenticationProperties properties = signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl); + return new ChallengeResult(provider, properties); + } + + public async Task OnGetCallbackAsync(string? returnUrl = null, string? remoteError = null) + { + returnUrl ??= Url.Content("~/"); + if (remoteError is not null) + { + ErrorMessage = $"Error from external provider: {remoteError}"; + return RedirectToPage("./Login", new { ReturnUrl = returnUrl }); + } + ExternalLoginInfo? info = await signInManager.GetExternalLoginInfoAsync(); + if (info is null) + { + ErrorMessage = "Error loading external login information."; + return RedirectToPage("./Login", new { ReturnUrl = returnUrl }); + } + + // Sign in the user with this external login provider if the user already has a login. + Microsoft.AspNetCore.Identity.SignInResult result = await signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true); + if (result.Succeeded) + { + logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity?.Name, info.LoginProvider); + // Ensure referral ID is set for the user + var user = await userManager.FindByLoginAsync(info.LoginProvider, info.ProviderKey); + if (user != null) + { + await referralService.EnsureReferralIdAsync(user); + // Refresh sign-in to pick up the newly added referral ID claim + await signInManager.RefreshSignInAsync(user); + } + return LocalRedirect(returnUrl); + } + if (result.IsLockedOut) + { + return RedirectToPage("./Lockout"); + } + else + { + // If the user does not have an account, then ask the user to create an account. + ReturnUrl = returnUrl; + ProviderDisplayName = info.ProviderDisplayName; + if (info.Principal.HasClaim(c => c.Type == ClaimTypes.Email)) + { + Input = new() + { + Email = info.Principal.FindFirstValue(ClaimTypes.Email) + }; + } + return Page(); + } + } + + public async Task OnPostConfirmationAsync(string? returnUrl = null) + { + returnUrl ??= Url.Content("~/"); + // Get the information about the user from the external login provider + ExternalLoginInfo? info = await signInManager.GetExternalLoginInfoAsync(); + if (info is null) + { + ErrorMessage = "Error loading external login information during confirmation."; + return RedirectToPage("./Login", new { ReturnUrl = returnUrl }); + } + + if (ModelState.IsValid) + { + if (Input.Email is null) + { + ErrorMessage = "Error: Email may not be null."; + return RedirectToPage("./Login", new { ReturnUrl = returnUrl }); + } + EssentialCSharpWebUser user = CreateUser(); + + EssentialCSharpWebUser? existingUser = await userManager.FindByEmailAsync(Input.Email).ConfigureAwait(false); + if (existingUser is null) + { + await userStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); + await emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None); + IdentityResult result = await userManager.CreateAsync(user); + if (result.Succeeded) + { + result = await userManager.AddLoginAsync(user, info); + if (result.Succeeded) + { + logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider); + return await SendConfirmationEmail(returnUrl, info, user); + } + } + foreach (IdentityError error in result.Errors) + { + ModelState.AddModelError(string.Empty, error.Description); + } + } + else + { + if (!existingUser.EmailConfirmed) + { + await SendConfirmationEmail(returnUrl, info, existingUser); + } + } + } + + ProviderDisplayName = info.ProviderDisplayName; + ReturnUrl = returnUrl; + ModelState.AddModelError(string.Empty, "Please check confirmation email to complete registration."); + return Page(); + } + + private async Task SendConfirmationEmail(string returnUrl, ExternalLoginInfo info, EssentialCSharpWebUser user) + { + if (Input.Email is null) + { + ErrorMessage = "Error: Email may not be null."; + return RedirectToPage("./Login", new { ReturnUrl = returnUrl }); + } + string userId = await userManager.GetUserIdAsync(user); + string code = await userManager.GenerateEmailConfirmationTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + string? callbackUrl = Url.Page( + "/Account/ConfirmEmail", + pageHandler: null, + values: new { area = "Identity", userId = userId, code = code }, + protocol: Request.Scheme); + + if (callbackUrl is null) + { + ErrorMessage = "Error: callback url unexpectedly null."; + return RedirectToPage("./Login", new { ReturnUrl = returnUrl }); + } + + await emailSender.SendEmailAsync(Input.Email, "Confirm your email", + $"Please confirm your account by clicking here."); + + // If account confirmation is required, we need to show the link if we don't have a real email sender + if (userManager.Options.SignIn.RequireConfirmedAccount) + { + return RedirectToPage("./RegisterConfirmation", new { Email = Input.Email }); + } + + // Ensure referral ID is set for the new user before signing in + await referralService.EnsureReferralIdAsync(user); + await signInManager.SignInAsync(user, isPersistent: false, info.LoginProvider); + return LocalRedirect(returnUrl); + } + + private EssentialCSharpWebUser CreateUser() + { + try + { + return new EssentialCSharpWebUser(); + } + catch (MissingMethodException innerException) + { + throw new InvalidOperationException($"Can't create an instance of '{nameof(EssentialCSharpWebUser)}'. " + + $"Ensure that '{nameof(EssentialCSharpWebUser)}' is not an abstract class and has a parameterless constructor, or alternatively " + + $"override the external login page in /Areas/Identity/Pages/Account/ExternalLogin.cshtml", innerException); + } + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPassword.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPassword.cshtml new file mode 100644 index 00000000..54b477e1 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPassword.cshtml @@ -0,0 +1,26 @@ +@page +@model ForgotPasswordModel +@{ + ViewData["Title"] = "Forgot your password?"; +} + +

@ViewData["Title"]

+

Enter your email.

+
+
+
+
+ +
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPassword.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPassword.cshtml.cs new file mode 100644 index 00000000..305730b7 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPassword.cshtml.cs @@ -0,0 +1,71 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using System.Text; +using System.Text.Encodings.Web; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public class ForgotPasswordModel(UserManager userManager, IEmailSender emailSender) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public class InputModel + { + + [Required] + [EmailAddress] + public string? Email { get; set; } + } + + public async Task OnPostAsync() + { + if (ModelState.IsValid) + { + if (Input.Email is null) + { + return RedirectToPage("./ForgotPasswordConfirmation"); + } + EssentialCSharpWebUser? user = await userManager.FindByEmailAsync(Input.Email); + if (user is null || !(await userManager.IsEmailConfirmedAsync(user))) + { + // Don't reveal that the user does not exist or is not confirmed + return RedirectToPage("./ForgotPasswordConfirmation"); + } + + // For more information on how to enable account confirmation and password reset please + // visit https://go.microsoft.com/fwlink/?LinkID=532713 + string code = await userManager.GeneratePasswordResetTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + string? callbackUrl = Url.Page( + "/Account/ResetPassword", + pageHandler: null, + values: new { area = "Identity", code }, + protocol: Request.Scheme); + + if (callbackUrl is null) + { + return RedirectToPage("./ForgotPasswordConfirmation"); + } + + await emailSender.SendEmailAsync( + Input.Email, + "Reset Password", + $"Please reset your password by clicking here."); + + return RedirectToPage("./ForgotPasswordConfirmation"); + } + + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml new file mode 100644 index 00000000..2fccecf0 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml @@ -0,0 +1,10 @@ +ο»Ώ@page +@model ForgotPasswordConfirmation +@{ + ViewData["Title"] = "Forgot password confirmation"; +} + +

@ViewData["Title"]

+

+ Please check your email to reset your password. If you can't find the email, please check your spam folder. +

diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml.cs new file mode 100644 index 00000000..1be625d3 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ForgotPasswordConfirmation.cshtml.cs @@ -0,0 +1,17 @@ +ο»Ώusing Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +/// +/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used +/// directly from your code. This API may change or be removed in future releases. +/// +[AllowAnonymous] +public class ForgotPasswordConfirmation : PageModel +{ + + public void OnGet() + { + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Lockout.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Lockout.cshtml new file mode 100644 index 00000000..4eded882 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Lockout.cshtml @@ -0,0 +1,10 @@ +ο»Ώ@page +@model LockoutModel +@{ + ViewData["Title"] = "Locked out"; +} + +
+

@ViewData["Title"]

+

This account has been locked out, please try again later.

+
diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Lockout.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Lockout.cshtml.cs new file mode 100644 index 00000000..2deff5a2 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Lockout.cshtml.cs @@ -0,0 +1,17 @@ +ο»Ώusing Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +/// +/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used +/// directly from your code. This API may change or be removed in future releases. +/// +[AllowAnonymous] +public class LockoutModel : PageModel +{ + + public void OnGet() + { + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Login.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Login.cshtml new file mode 100644 index 00000000..ddb1f9a2 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Login.cshtml @@ -0,0 +1,86 @@ +ο»Ώ@page +@model LoginModel + +@{ + ViewData["Title"] = "Log in"; +} + +

@ViewData["Title"]

+
+
+
+
+

Use a local account to log in.

+
+ +
+ + + +
+
+ + + +
+
+ +
+
+ +
+ +
+
+
+
+
+

Use another service to log in.

+
+ @{ + if ((Model.ExternalLogins?.Count ?? 0) == 0) + { +
+

+ There are no external authentication services configured. See this article + about setting up this ASP.NET application to support logging in via external services. +

+
+ } + else + { +
+
+

+ @foreach (var provider in Model.ExternalLogins!) + { + + } +

+
+
+ } + } +
+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Login.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Login.cshtml.cs new file mode 100644 index 00000000..a3ea80a7 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Login.cshtml.cs @@ -0,0 +1,112 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using EssentialCSharp.Web.Areas.Identity.Data; +using EssentialCSharp.Web.Services.Referrals; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public class LoginModel(SignInManager signInManager, UserManager userManager, ILogger logger, IReferralService referralService) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public IList? ExternalLogins { get; set; } + + public string? ReturnUrl { get; set; } + + [TempData] + public string? ErrorMessage { get; set; } + + public class InputModel + { + + [Required] + [EmailAddress] + public string? Email { get; set; } + + [Required] + [DataType(DataType.Password)] + public string? Password { get; set; } + + [Display(Name = "Remember me?")] + public bool RememberMe { get; set; } + } + + public async Task OnGetAsync(string? returnUrl = null) + { + if (!string.IsNullOrEmpty(ErrorMessage)) + { + ModelState.AddModelError(string.Empty, ErrorMessage); + } + + returnUrl ??= Url.Content("~/"); + + // Clear the existing external cookie to ensure a clean login process + await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme); + + ExternalLogins = (await signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); + + ReturnUrl = returnUrl; + } + + public async Task OnPostAsync(string? returnUrl = null) + { + returnUrl ??= Url.Content("~/"); + + ExternalLogins = (await signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); + + if (ModelState.IsValid) + { + Microsoft.AspNetCore.Identity.SignInResult result; + if (Input.Email is null) + { + return RedirectToPage(Url.Content("~/"), new { ReturnUrl = returnUrl }); + } + EssentialCSharpWebUser? foundUser = await userManager.FindByEmailAsync(Input.Email); + if (Input.Password is null) + { + return RedirectToPage(Url.Content("~/"), new { ReturnUrl = returnUrl }); + } + if (foundUser is not null) + { + result = await signInManager.PasswordSignInAsync(foundUser, Input.Password, Input.RememberMe, lockoutOnFailure: true); + // Call the referral service to get the referral ID and set it onto the user claim + _ = await referralService.EnsureReferralIdAsync(foundUser); + } + else + { + result = await signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true); + } + if (result.Succeeded) + { + logger.LogInformation("User logged in."); + return LocalRedirect(returnUrl); + } + if (result.RequiresTwoFactor) + { + return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe }); + } + if (result.IsLockedOut) + { + logger.LogWarning("User account locked out."); + return RedirectToPage("./Lockout"); + } + else + { + ModelState.AddModelError(string.Empty, "Invalid login attempt."); + return Page(); + } + } + + // If we got this far, something failed, redisplay form + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWith2fa.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWith2fa.cshtml new file mode 100644 index 00000000..047462d7 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWith2fa.cshtml @@ -0,0 +1,39 @@ +@page +@model LoginWith2faModel +@{ + ViewData["Title"] = "Two-factor authentication"; +} + +

@ViewData["Title"]

+
+

Your login is protected with an authenticator app. Enter your authenticator code below.

+
+
+
+ + +
+ + + +
+
+ +
+
+ +
+
+
+
+

+ Don't have access to your authenticator device? You can + log in with a recovery code. +

+ +@section Scripts { + +} \ No newline at end of file diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWith2fa.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWith2fa.cshtml.cs new file mode 100644 index 00000000..a2434d0a --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWith2fa.cshtml.cs @@ -0,0 +1,86 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public class LoginWith2faModel( + SignInManager signInManager, + UserManager userManager, + ILogger logger) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public bool RememberMe { get; set; } + + public string? ReturnUrl { get; set; } + + public class InputModel + { + [Required] + [StringLength(ValidationMessages.VerificationCodeMaximumLength, ErrorMessage = ValidationMessages.StringLengthErrorMessage, MinimumLength = ValidationMessages.VerificationCodeMaximumLength)] + [DataType(DataType.Text)] + [Display(Name = "Authenticator code")] + public string? TwoFactorCode { get; set; } + + [Display(Name = "Remember this machine")] + public bool RememberMachine { get; set; } + } + + public async Task OnGetAsync(bool rememberMe, string? returnUrl = null) + { + // Ensure the user has gone through the username & password screen first + _ = await signInManager.GetTwoFactorAuthenticationUserAsync() ?? throw new InvalidOperationException($"Unable to load two-factor authentication user."); + if (returnUrl is not null) ReturnUrl = returnUrl; + RememberMe = rememberMe; + + return Page(); + } + + public async Task OnPostAsync(bool rememberMe, string? returnUrl = null) + { + if (!ModelState.IsValid) + { + return Page(); + } + + returnUrl ??= Url.Content("~/"); + + EssentialCSharpWebUser user = await signInManager.GetTwoFactorAuthenticationUserAsync() ?? throw new InvalidOperationException($"Unable to load two-factor authentication user."); + if (Input.TwoFactorCode is null) + { + return RedirectToPage("./Lockout", new { ReturnUrl = returnUrl }); + } + string authenticatorCode = Input.TwoFactorCode.Replace(" ", string.Empty).Replace("-", string.Empty); + + Microsoft.AspNetCore.Identity.SignInResult result = await signInManager.TwoFactorAuthenticatorSignInAsync(authenticatorCode, rememberMe, Input.RememberMachine); + + // Not sure what this is used for but was in identity scaffolding so hesitant to remove without understanding + _ = await userManager.GetUserIdAsync(user); + + if (result.Succeeded) + { + logger.LogInformation("User with ID '{UserId}' logged in with 2fa.", user.Id); + return LocalRedirect(returnUrl); + } + else if (result.IsLockedOut) + { + logger.LogWarning("User with ID '{UserId}' account locked out.", user.Id); + return RedirectToPage("./Lockout"); + } + else + { + logger.LogWarning("Invalid authenticator code entered for user with ID '{UserId}'.", user.Id); + ModelState.AddModelError(string.Empty, "Invalid authenticator code."); + return Page(); + } + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWithRecoveryCode.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWithRecoveryCode.cshtml new file mode 100644 index 00000000..0d44e37d --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWithRecoveryCode.cshtml @@ -0,0 +1,29 @@ +ο»Ώ@page +@model LoginWithRecoveryCodeModel +@{ + ViewData["Title"] = "Recovery code verification"; +} + +

@ViewData["Title"]

+
+

+ You have requested to log in with a recovery code. This login will not be remembered until you provide + an authenticator app code at log in or disable 2FA and log in again. +

+
+
+
+ +
+ + + +
+ +
+
+
+ +@section Scripts { + +} \ No newline at end of file diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWithRecoveryCode.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWithRecoveryCode.cshtml.cs new file mode 100644 index 00000000..9dba5e44 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/LoginWithRecoveryCode.cshtml.cs @@ -0,0 +1,77 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public class LoginWithRecoveryCodeModel( + SignInManager signInManager, + UserManager userManager, + ILogger logger) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public string? ReturnUrl { get; set; } + + public class InputModel + { + + [BindProperty] + [Required] + [DataType(DataType.Text)] + [Display(Name = "Recovery Code")] + public string? RecoveryCode { get; set; } + } + + public async Task OnGetAsync(string? returnUrl = null) + { + // Ensure the user has gone through the username & password screen first + EssentialCSharpWebUser user = await signInManager.GetTwoFactorAuthenticationUserAsync() ?? throw new InvalidOperationException($"Unable to load two-factor authentication user."); + ReturnUrl = returnUrl; + + return Page(); + } + + public async Task OnPostAsync(string? returnUrl = null) + { + if (!ModelState.IsValid) + { + return Page(); + } + + EssentialCSharpWebUser user = await signInManager.GetTwoFactorAuthenticationUserAsync() ?? throw new InvalidOperationException($"Unable to load two-factor authentication user."); + if (Input.RecoveryCode is null) + { + return Page(); + } + string recoveryCode = Input.RecoveryCode.Replace(" ", string.Empty); + + Microsoft.AspNetCore.Identity.SignInResult result = await signInManager.TwoFactorRecoveryCodeSignInAsync(recoveryCode); + + string userId = await userManager.GetUserIdAsync(user); + + if (result.Succeeded) + { + logger.LogInformation("User with ID '{UserId}' logged in with a recovery code.", user.Id); + return LocalRedirect(returnUrl ?? Url.Content("~/")); + } + if (result.IsLockedOut) + { + logger.LogWarning("User account locked out."); + return RedirectToPage("./Lockout"); + } + else + { + logger.LogWarning("Invalid recovery code entered for user with ID '{UserId}' ", user.Id); + ModelState.AddModelError(string.Empty, "Invalid recovery code entered."); + return Page(); + } + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Logout.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Logout.cshtml new file mode 100644 index 00000000..eba64741 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Logout.cshtml @@ -0,0 +1,21 @@ +ο»Ώ@page +@model LogoutModel +@{ + ViewData["Title"] = "Log out"; +} + +
+

@ViewData["Title"]

+ @{ + if (User.Identity?.IsAuthenticated ?? false) + { +
+ +
+ } + else + { +

You have successfully logged out of the application.

+ } + } +
diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Logout.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Logout.cshtml.cs new file mode 100644 index 00000000..fb356e12 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Logout.cshtml.cs @@ -0,0 +1,18 @@ +ο»Ώusing EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public class LogoutModel(SignInManager signInManager, ILogger logger) : PageModel +{ + public async Task OnPost(string? returnUrl = null) + { + await signInManager.SignOutAsync(); + logger.LogInformation("User logged out."); + // This needs to be a redirect so that the browser performs a new + // request and the identity for the user gets updated. + return returnUrl is not null ? LocalRedirect(returnUrl) : RedirectToPage(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml new file mode 100644 index 00000000..6429c1ae --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml @@ -0,0 +1,36 @@ +ο»Ώ@page +@model ChangePasswordModel +@{ + ViewData["Title"] = "Change password"; +ViewData["ActivePage"] = ManageNavPages.ChangePassword; +} + +

@ViewData["Title"]

+ +
+
+
+ +
+ + + +
+
+ + + +
+
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs new file mode 100644 index 00000000..730871dc --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs @@ -0,0 +1,101 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class ChangePasswordModel( + UserManager userManager, + SignInManager signInManager, + ILogger logger) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + [TempData] + public string? StatusMessage { get; set; } + + public class InputModel + { + [Required] + [DataType(DataType.Password)] + [Display(Name = "Current password")] + public string? OldPassword { get; set; } + + [Required] + [StringLength(Web.Services.PasswordRequirementOptions.PasswordMaximumLength, ErrorMessage = ValidationMessages.StringLengthErrorMessage, MinimumLength = Web.Services.PasswordRequirementOptions.PasswordMinimumLength)] + [DataType(DataType.Password)] + [Display(Name = "New password")] + public string? NewPassword { get; set; } + + [DataType(DataType.Password)] + [Display(Name = "Confirm new password")] + [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] + public string? ConfirmPassword { get; set; } + } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + bool hasPassword = await userManager.HasPasswordAsync(user); + if (!hasPassword) + { + return RedirectToPage("./SetPassword"); + } + + return Page(); + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return Page(); + } + + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + if (Input.NewPassword is null) + { + ModelState.AddModelError(string.Empty, "New password is required."); + return RedirectToPage(); + } + if (Input.OldPassword is null) + { + ModelState.AddModelError(string.Empty, "Current password is required."); + return RedirectToPage(); + } + + IdentityResult changePasswordResult = await userManager.ChangePasswordAsync(user, Input.OldPassword, Input.NewPassword); + if (!changePasswordResult.Succeeded) + { + foreach (IdentityError error in changePasswordResult.Errors) + { + ModelState.AddModelError(string.Empty, error.Description); + } + return Page(); + } + + await signInManager.RefreshSignInAsync(user); + logger.LogInformation("User changed their password successfully."); + StatusMessage = "Your password has been changed."; + + return RedirectToPage(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml new file mode 100644 index 00000000..be1d3ca3 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml @@ -0,0 +1,33 @@ +ο»Ώ@page +@model DeletePersonalDataModel +@{ + ViewData["Title"] = "Delete Personal Data"; +ViewData["ActivePage"] = ManageNavPages.PersonalData; +} + +

@ViewData["Title"]

+ + + +
+
+ + @if (Model.RequirePassword) + { +
+ + + +
+ } + +
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml.cs new file mode 100644 index 00000000..94658086 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml.cs @@ -0,0 +1,79 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class DeletePersonalDataModel( + UserManager userManager, + SignInManager signInManager, + ILogger logger) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public class InputModel + { + [Required] + [DataType(DataType.Password)] + public string? Password { get; set; } + } + + public bool RequirePassword { get; set; } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + RequirePassword = await userManager.HasPasswordAsync(user); + return Page(); + } + + public async Task OnPostAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + RequirePassword = await userManager.HasPasswordAsync(user); + if (RequirePassword) + { + if (Input.Password is null) + { + ModelState.AddModelError(string.Empty, "Please enter a password."); + return Page(); + } + if (!await userManager.CheckPasswordAsync(user, Input.Password)) + { + ModelState.AddModelError(string.Empty, "Incorrect password."); + return Page(); + } + } + + IdentityResult result = await userManager.DeleteAsync(user); + string userId = await userManager.GetUserIdAsync(user); + if (!result.Succeeded) + { + throw new InvalidOperationException($"Unexpected error occurred deleting user."); + } + + await signInManager.SignOutAsync(); + + logger.LogInformation("User with ID '{UserId}' deleted themselves.", userId); + + return Redirect("~/"); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Disable2fa.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Disable2fa.cshtml new file mode 100644 index 00000000..cde15b12 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Disable2fa.cshtml @@ -0,0 +1,25 @@ +ο»Ώ@page +@model Disable2faModel +@{ + ViewData["Title"] = "Disable two-factor authentication (2FA)"; +ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; +} + + +

@ViewData["Title"]

+ + + +
+
+ +
+
diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Disable2fa.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Disable2fa.cshtml.cs new file mode 100644 index 00000000..4ee04cd7 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Disable2fa.cshtml.cs @@ -0,0 +1,49 @@ +ο»Ώusing EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class Disable2faModel( + UserManager userManager, + ILogger logger) : PageModel +{ + [TempData] + public string? StatusMessage { get; set; } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + if (!await userManager.GetTwoFactorEnabledAsync(user)) + { + throw new InvalidOperationException("Cannot disable 2FA for user as it's not currently enabled."); + } + + return Page(); + } + + public async Task OnPostAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + IdentityResult disable2faResult = await userManager.SetTwoFactorEnabledAsync(user, false); + if (!disable2faResult.Succeeded) + { + throw new InvalidOperationException($"Unexpected error occurred disabling 2FA."); + } + + logger.LogInformation("User with ID '{UserId}' has disabled 2fa.", userManager.GetUserId(User)); + StatusMessage = "2fa has been disabled. You can reenable 2fa when you setup an authenticator app"; + return RedirectToPage("./TwoFactorAuthentication"); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml new file mode 100644 index 00000000..23a19a2b --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml @@ -0,0 +1,12 @@ +ο»Ώ@page +@model DownloadPersonalDataModel +@{ + ViewData["Title"] = "Download Your Data"; +ViewData["ActivePage"] = ManageNavPages.PersonalData; +} + +

@ViewData["Title"]

+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml.cs new file mode 100644 index 00000000..1b07b3e2 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml.cs @@ -0,0 +1,51 @@ +ο»Ώusing System.Text.Json; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class DownloadPersonalDataModel( + UserManager userManager, + ILogger logger) : PageModel +{ + public IActionResult OnGet() + { + return NotFound(); + } + + public async Task OnPostAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + logger.LogInformation("User with ID '{UserId}' asked for their personal data.", userManager.GetUserId(User)); + + // Only include personal data for download + var personalData = new Dictionary(); + IEnumerable personalDataProps = typeof(EssentialCSharpWebUser).GetProperties().Where( + prop => Attribute.IsDefined(prop, typeof(PersonalDataAttribute))); + foreach (System.Reflection.PropertyInfo p in personalDataProps) + { + personalData.Add(p.Name, p.GetValue(user)?.ToString() ?? "null"); + } + + IList logins = await userManager.GetLoginsAsync(user); + foreach (UserLoginInfo l in logins) + { + personalData.Add($"{l.LoginProvider} external login provider key", l.ProviderKey); + } + string? authenticatorKey = await userManager.GetAuthenticatorKeyAsync(user); + if (!string.IsNullOrWhiteSpace(authenticatorKey)) + { + personalData.Add($"Authenticator Key", authenticatorKey); + } + + Response.Headers.Append("Content-Disposition", "attachment; filename=PersonalData.json"); + return new FileContentResult(JsonSerializer.SerializeToUtf8Bytes(personalData), "application/json"); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Email.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Email.cshtml new file mode 100644 index 00000000..e2fe09ed --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Email.cshtml @@ -0,0 +1,44 @@ +ο»Ώ@page +@model EmailModel +@{ + ViewData["Title"] = "Manage Email"; +ViewData["ActivePage"] = ManageNavPages.Email; +} + +

@ViewData["Title"]

+ +
+
+
+ + @if (Model.IsEmailConfirmed) + { +
+ +
+ βœ“ +
+ +
+ } + else + { +
+ + + +
+ } +
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Email.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Email.cshtml.cs new file mode 100644 index 00000000..097e947c --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Email.cshtml.cs @@ -0,0 +1,158 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using System.Text; +using System.Text.Encodings.Web; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class EmailModel( + UserManager userManager, + SignInManager signInManager, + IEmailSender emailSender) : PageModel +{ + private readonly UserManager _UserManager = userManager; + private readonly SignInManager _SignInManager = signInManager; + private readonly IEmailSender _EmailSender = emailSender; + + public string? Email { get; set; } + + public bool IsEmailConfirmed { get; set; } + + [TempData] + public string? StatusMessage { get; set; } + + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public class InputModel + { + [Required] + [EmailAddress] + [Display(Name = "New email")] + public string? NewEmail { get; set; } + } + + private async Task LoadAsync(EssentialCSharpWebUser user) + { + string? email = await _UserManager.GetEmailAsync(user); + Email = email; + + Input = new InputModel + { + NewEmail = email, + }; + + IsEmailConfirmed = await _UserManager.IsEmailConfirmedAsync(user); + } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await _UserManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{_UserManager.GetUserId(User)}'."); + } + + await LoadAsync(user); + return Page(); + } + + public async Task OnPostChangeEmailAsync() + { + EssentialCSharpWebUser? user = await _UserManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{_UserManager.GetUserId(User)}'."); + } + + if (!ModelState.IsValid) + { + await LoadAsync(user); + return Page(); + } + + string? email = await _UserManager.GetEmailAsync(user); + if (Input.NewEmail != email) + { + string userId = await _UserManager.GetUserIdAsync(user); + if (Input.NewEmail is null) + { + StatusMessage = "Please enter in a new email."; + return RedirectToPage(); + } + string code = await _UserManager.GenerateChangeEmailTokenAsync(user, Input.NewEmail); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + string? callbackUrl = Url.Page( + "/Account/ConfirmEmailChange", + pageHandler: null, + values: new { area = "Identity", userId = userId, email = Input.NewEmail, code = code }, + protocol: Request.Scheme); + if (callbackUrl is null) + { + StatusMessage = "Error: callback url unexpectedly null."; + return RedirectToPage(); + } + await _EmailSender.SendEmailAsync( + Input.NewEmail, + "Confirm your email", + $"Please confirm your account by clicking here."); + + StatusMessage = "Confirmation link to change email sent. Please check your email. If you can't find the email, please check your spam folder."; + return RedirectToPage(); + } + + StatusMessage = "Your email is unchanged."; + return RedirectToPage(); + } + + public async Task OnPostSendVerificationEmailAsync() + { + EssentialCSharpWebUser? user = await _UserManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{_UserManager.GetUserId(User)}'."); + } + + if (!ModelState.IsValid) + { + await LoadAsync(user); + return Page(); + } + + string userId = await _UserManager.GetUserIdAsync(user); + string? email = await _UserManager.GetEmailAsync(user); + string code = await _UserManager.GenerateEmailConfirmationTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + string? callbackUrl = Url.Page( + "/Account/ConfirmEmail", + pageHandler: null, + values: new { area = "Identity", userId = userId, code = code }, + protocol: Request.Scheme); + if (callbackUrl is null) + { + StatusMessage = "Error: callback url unexpectedly null."; + return RedirectToPage(); + } + if (email is null) + { + return NotFound($"Unable to load user email with ID '{_UserManager.GetUserId(User)}'."); + } + await _EmailSender.SendEmailAsync( + email, + "Confirm your email", + $"Please confirm your account by clicking here."); + + StatusMessage = "Verification email sent. Please check your email. If you can't find the email, please check your spam folder."; + return RedirectToPage(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml new file mode 100644 index 00000000..53d5e7da --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml @@ -0,0 +1,69 @@ +@page +@model EnableAuthenticatorModel +@{ + ViewData["Title"] = "Configure authenticator app"; + ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; +} + + +

@ViewData["Title"]

+
+

To use an authenticator app go through the following steps:

+
    +
  1. +

    + Download a two-factor authenticator app such as: +

    + 2FAS: + Android - + iOS +

    +

    + Ente.io + Android - + iOS + +

    +

    + Aegis: + Android +

    +

    + Microsoft Authenticator: + Android - + iOS +

    +
  2. +
  3. +

    Scan the QR Code or enter this key @Model.SharedKey into your two factor authenticator app. Spaces and casing do not matter.

    +
    +
    +
  4. +
  5. +

    + Once you have scanned the QR code or input the key above, your two factor authentication app will provide you + with a unique code. Enter the code in the confirmation box below. +

    +
    +
    +
    +
    + + + +
    + + +
    +
    +
    +
  6. +
+
+ +@section Scripts { + + + + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml.cs new file mode 100644 index 00000000..75db8eb2 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml.cs @@ -0,0 +1,162 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using System.Globalization; +using System.Text; +using System.Text.Encodings.Web; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class EnableAuthenticatorModel( + UserManager userManager, + ILogger logger, + UrlEncoder urlEncoder) : PageModel +{ + private static readonly CompositeFormat _AuthenticatorUriFormat = CompositeFormat.Parse("otpauth://totp/{0}:{1}?secret={2}&issuer={0}&digits=6"); + + public string? SharedKey { get; set; } + + public string? AuthenticatorUri { get; set; } + + [TempData] + public string[]? RecoveryCodes { get; set; } + + [TempData] + public string? StatusMessage { get; set; } + + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public class InputModel + { + + [Required] + [StringLength(ValidationMessages.VerificationCodeMaximumLength, ErrorMessage = ValidationMessages.StringLengthErrorMessage, MinimumLength = ValidationMessages.VerificationCodeMinimumLength)] + [DataType(DataType.Text)] + [Display(Name = "Verification Code")] + public string? Code { get; set; } + } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + await LoadSharedKeyAndQrCodeUriAsync(user); + + return Page(); + } + + public async Task OnPostAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + if (!ModelState.IsValid) + { + await LoadSharedKeyAndQrCodeUriAsync(user); + return Page(); + } + + if (Input.Code is null) + { + return RedirectToPage("./TwoFactorAuthentication"); + } + // Strip spaces and hyphens + string verificationCode = Input.Code.Replace(" ", string.Empty).Replace("-", string.Empty); + + bool is2faTokenValid = await userManager.VerifyTwoFactorTokenAsync( + user, userManager.Options.Tokens.AuthenticatorTokenProvider, verificationCode); + + if (!is2faTokenValid) + { + ModelState.AddModelError(nameof(Input.Code), "Verification code is invalid."); + await LoadSharedKeyAndQrCodeUriAsync(user); + return Page(); + } + + await userManager.SetTwoFactorEnabledAsync(user, true); + string userId = await userManager.GetUserIdAsync(user); + logger.LogInformation("User with ID '{UserId}' has enabled 2FA with an authenticator app.", userId); + + StatusMessage = "Your authenticator app has been verified."; + + if (await userManager.CountRecoveryCodesAsync(user) == 0) + { + IEnumerable? recoveryCodes = await userManager.GenerateNewTwoFactorRecoveryCodesAsync(user, 10); + if (recoveryCodes is null) + { + return RedirectToPage("./TwoFactorAuthentication"); + } + RecoveryCodes = recoveryCodes.ToArray(); + return RedirectToPage("./ShowRecoveryCodes"); + } + else + { + return RedirectToPage("./TwoFactorAuthentication"); + } + } + + private async Task LoadSharedKeyAndQrCodeUriAsync(EssentialCSharpWebUser user) + { + // Load the authenticator key & QR code URI to display on the form + string? unformattedKey = await userManager.GetAuthenticatorKeyAsync(user); + if (string.IsNullOrEmpty(unformattedKey)) + { + await userManager.ResetAuthenticatorKeyAsync(user); + unformattedKey = await userManager.GetAuthenticatorKeyAsync(user); + } + if (!string.IsNullOrEmpty(unformattedKey)) + { + SharedKey = FormatKey(unformattedKey); + } + + string? email = await userManager.GetEmailAsync(user); + if (!string.IsNullOrEmpty(email) && !string.IsNullOrEmpty(unformattedKey)) + { + AuthenticatorUri = GenerateQrCodeUri(email, unformattedKey); + } + } + +#pragma warning disable CA1822 // Mark members as static + private string FormatKey(string unformattedKey) +#pragma warning restore CA1822 // Mark members as static + { + var result = new StringBuilder(); + int currentPosition = 0; + while (currentPosition + 4 < unformattedKey.Length) + { + result.Append(unformattedKey.AsSpan(currentPosition, 4)).Append(' '); + currentPosition += 4; + } + if (currentPosition < unformattedKey.Length) + { + result.Append(unformattedKey.AsSpan(currentPosition)); + } + + return result.ToString().ToLowerInvariant(); + } + + private string GenerateQrCodeUri(string email, string unformattedKey) + { + return string.Format( + CultureInfo.InvariantCulture, + _AuthenticatorUriFormat, + urlEncoder.Encode("EssentialCSharp.com"), + urlEncoder.Encode(email), + unformattedKey); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ExternalLogins.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ExternalLogins.cshtml new file mode 100644 index 00000000..7c397e57 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ExternalLogins.cshtml @@ -0,0 +1,53 @@ +ο»Ώ@page +@model ExternalLoginsModel +@{ + ViewData["Title"] = "Manage your external logins"; + ViewData["ActivePage"] = ManageNavPages.ExternalLogins; +} + + +@if (Model.CurrentLogins?.Count > 0) +{ +

Registered Logins

+ + + @foreach (var login in Model.CurrentLogins) + { + + + + + } + +
@login.ProviderDisplayName + @if (Model.ShowRemoveButton) + { +
+
+ + + +
+
+ } + else + { + @:   + } +
+} +@if (Model.OtherLogins?.Count > 0) +{ +

Add another service to log in.

+
+ +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ExternalLogins.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ExternalLogins.cshtml.cs new file mode 100644 index 00000000..808ccc3d --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ExternalLogins.cshtml.cs @@ -0,0 +1,97 @@ +ο»Ώusing EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class ExternalLoginsModel( + UserManager userManager, + SignInManager signInManager, + IUserPasswordStore userPasswordStore) : PageModel +{ + public IList? CurrentLogins { get; set; } + + public IList? OtherLogins { get; set; } + + public bool ShowRemoveButton { get; set; } + + [TempData] + public string? StatusMessage { get; set; } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + CurrentLogins = await userManager.GetLoginsAsync(user); + OtherLogins = (await signInManager.GetExternalAuthenticationSchemesAsync()) + .Where(auth => CurrentLogins.All(ul => auth.Name != ul.LoginProvider)) + .ToList(); + + string? passwordHash = null; + passwordHash = await userPasswordStore.GetPasswordHashAsync(user, HttpContext.RequestAborted); + + ShowRemoveButton = passwordHash is not null || CurrentLogins.Count > 1; + return Page(); + } + + public async Task OnPostRemoveLoginAsync(string loginProvider, string providerKey) + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + IdentityResult result = await userManager.RemoveLoginAsync(user, loginProvider, providerKey); + if (!result.Succeeded) + { + StatusMessage = "The external login was not removed."; + return RedirectToPage(); + } + + await signInManager.RefreshSignInAsync(user); + StatusMessage = "The external login was removed."; + return RedirectToPage(); + } + + public async Task OnPostLinkLoginAsync(string provider) + { + // Clear the existing external cookie to ensure a clean login process + await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme); + + // Request a redirect to the external login provider to link a login for the current user + string? redirectUrl = Url.Page("./ExternalLogins", pageHandler: "LinkLoginCallback"); + AuthenticationProperties properties = signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, userManager.GetUserId(User)); + return new ChallengeResult(provider, properties); + } + + public async Task OnGetLinkLoginCallbackAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + string userId = await userManager.GetUserIdAsync(user); + ExternalLoginInfo info = await signInManager.GetExternalLoginInfoAsync(userId) ?? throw new InvalidOperationException($"Unexpected error occurred loading external login info."); + IdentityResult result = await userManager.AddLoginAsync(user, info); + if (!result.Succeeded) + { + StatusMessage = "The external login was not added. External logins can only be associated with one account."; + return RedirectToPage(); + } + + // Clear the existing external cookie to ensure a clean login process + await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme); + + StatusMessage = "The external login was added."; + return RedirectToPage(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/GenerateRecoveryCodes.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/GenerateRecoveryCodes.cshtml new file mode 100644 index 00000000..6c8d7b6b --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/GenerateRecoveryCodes.cshtml @@ -0,0 +1,27 @@ +ο»Ώ@page +@model GenerateRecoveryCodesModel +@{ + ViewData["Title"] = "Generate two-factor authentication (2FA) recovery codes"; +ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; +} + + +

@ViewData["Title"]

+ +
+
+ +
+
diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/GenerateRecoveryCodes.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/GenerateRecoveryCodes.cshtml.cs new file mode 100644 index 00000000..7d0df6e8 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/GenerateRecoveryCodes.cshtml.cs @@ -0,0 +1,57 @@ +ο»Ώusing EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class GenerateRecoveryCodesModel( + UserManager userManager, + ILogger logger) : PageModel +{ + [TempData] + public string[]? RecoveryCodes { get; set; } + + [TempData] + public string? StatusMessage { get; set; } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + bool isTwoFactorEnabled = await userManager.GetTwoFactorEnabledAsync(user); + if (!isTwoFactorEnabled) + { + throw new InvalidOperationException($"Cannot generate recovery codes for user because they do not have 2FA enabled."); + } + + return Page(); + } + + public async Task OnPostAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + bool isTwoFactorEnabled = await userManager.GetTwoFactorEnabledAsync(user); + string userId = await userManager.GetUserIdAsync(user); + if (!isTwoFactorEnabled) + { + throw new InvalidOperationException($"Cannot generate recovery codes for user as they do not have 2FA enabled."); + } + + IEnumerable? recoveryCodes = await userManager.GenerateNewTwoFactorRecoveryCodesAsync(user, 10); + RecoveryCodes = recoveryCodes?.ToArray(); + + logger.LogInformation("User with ID '{UserId}' has generated new 2FA recovery codes.", userId); + StatusMessage = "You have generated new recovery codes."; + return RedirectToPage("./ShowRecoveryCodes"); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Index.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Index.cshtml new file mode 100644 index 00000000..f63c961f --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Index.cshtml @@ -0,0 +1,43 @@ +ο»Ώ@page +@model IndexModel +@{ + ViewData["Title"] = "Profile"; +ViewData["ActivePage"] = ManageNavPages.Index; +} + +

@ViewData["Title"]

+ +
+
+
+ +
+ + + +
+
+
+ + + +
+
+ + + +
+
+
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs new file mode 100644 index 00000000..27474e1e --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs @@ -0,0 +1,130 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class IndexModel( + UserManager userManager, + SignInManager signInManager) : PageModel +{ + public string? Username { get; set; } + + public string? FirstName { get; set; } + public string? LastName { get; set; } + + [TempData] + public string? StatusMessage { get; set; } + + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public class InputModel + { + [Display(Name = "Username")] + public string? Username { get; set; } + + [Phone] + [Display(Name = "Phone number")] + public string? PhoneNumber { get; set; } + + [Display(Name = "First Name")] + public string? FirstName { get; set; } + + [Display(Name = "Last Name")] + public string? LastName { get; set; } + } + + private async Task LoadAsync(EssentialCSharpWebUser user) + { + string? userName = await userManager.GetUserNameAsync(user); + string? phoneNumber = await userManager.GetPhoneNumberAsync(user); + + Input = new InputModel + { + Username = userName, + PhoneNumber = phoneNumber, + FirstName = user.FirstName, + LastName = user.LastName + }; + } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + await LoadAsync(user); + return Page(); + } + + public async Task OnPostAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + if (!ModelState.IsValid) + { + await LoadAsync(user); + return Page(); + } + + string? phoneNumber = await userManager.GetPhoneNumberAsync(user); + if (Input.PhoneNumber != phoneNumber) + { + IdentityResult setPhoneResult = await userManager.SetPhoneNumberAsync(user, Input.PhoneNumber); + if (!setPhoneResult.Succeeded) + { + StatusMessage = "Unexpected error when trying to set phone number."; + return RedirectToPage(); + } + } + string? username = await userManager.GetUserNameAsync(user); + if (Input.Username != username) + { + IdentityResult setUsernameResult = await userManager.SetUserNameAsync(user, Input.Username); + if (!setUsernameResult.Succeeded) + { + StatusMessage = "Unexpected error when trying to set username."; + return RedirectToPage(); + } + } + if (Input.FirstName != user.FirstName) + { + user.FirstName = Input.FirstName; + IdentityResult setFirstNameResult = await userManager.UpdateAsync(user); + if (!setFirstNameResult.Succeeded) + { + StatusMessage = "Unexpected error when trying to set first name."; + return RedirectToPage(); + } + } + if (Input.LastName != user.LastName) + { + user.LastName = Input.LastName; + IdentityResult setLastNameResult = await userManager.UpdateAsync(user); + if (!setLastNameResult.Succeeded) + { + StatusMessage = "Unexpected error when trying to set last name."; + return RedirectToPage(); + } + } + + await signInManager.RefreshSignInAsync(user); + StatusMessage = "Your profile has been updated"; + return RedirectToPage(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ManageNavPages.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ManageNavPages.cs new file mode 100644 index 00000000..e362bf1c --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ManageNavPages.cs @@ -0,0 +1,53 @@ +ο»Ώusing Microsoft.AspNetCore.Mvc.Rendering; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +/// +/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used +/// directly from your code. This API may change or be removed in future releases. +/// +public static class ManageNavPages +{ + public static string Index => "Index"; + + public static string Email => "Email"; + + public static string ChangePassword => "ChangePassword"; + + public static string DownloadPersonalData => "DownloadPersonalData"; + + public static string DeletePersonalData => "DeletePersonalData"; + + public static string ExternalLogins => "ExternalLogins"; + + public static string PersonalData => "PersonalData"; + + public static string TwoFactorAuthentication => "TwoFactorAuthentication"; + + public static string Referrals => "Referrals"; + + public static string? IndexNavClass(ViewContext viewContext) => PageNavClass(viewContext, Index); + + public static string? EmailNavClass(ViewContext viewContext) => PageNavClass(viewContext, Email); + + public static string? ChangePasswordNavClass(ViewContext viewContext) => PageNavClass(viewContext, ChangePassword); + + public static string? DownloadPersonalDataNavClass(ViewContext viewContext) => PageNavClass(viewContext, DownloadPersonalData); + + public static string? DeletePersonalDataNavClass(ViewContext viewContext) => PageNavClass(viewContext, DeletePersonalData); + + public static string? ExternalLoginsNavClass(ViewContext viewContext) => PageNavClass(viewContext, ExternalLogins); + + public static string? PersonalDataNavClass(ViewContext viewContext) => PageNavClass(viewContext, PersonalData); + + public static string? TwoFactorAuthenticationNavClass(ViewContext viewContext) => PageNavClass(viewContext, TwoFactorAuthentication); + + public static string? ReferralsNavClass(ViewContext viewContext) => PageNavClass(viewContext, Referrals); + + public static string? PageNavClass(ViewContext viewContext, string page) + { + string? activePage = viewContext.ViewData["ActivePage"] as string + ?? Path.GetFileNameWithoutExtension(viewContext.ActionDescriptor.DisplayName); + return string.Equals(activePage, page, StringComparison.OrdinalIgnoreCase) ? "active" : null; + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml new file mode 100644 index 00000000..2c2458cd --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml @@ -0,0 +1,27 @@ +ο»Ώ@page +@model PersonalDataModel +@{ + ViewData["Title"] = "Personal Data"; +ViewData["ActivePage"] = ManageNavPages.PersonalData; +} + +

@ViewData["Title"]

+ +
+
+

Your account contains personal data that you have given us. This page allows you to download or delete that data.

+

+ Deleting this data will permanently remove your account, and this cannot be recovered. +

+
+ +
+

+ Delete +

+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml.cs new file mode 100644 index 00000000..f0422f55 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml.cs @@ -0,0 +1,31 @@ +ο»Ώusing EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class PersonalDataModel : PageModel +{ + private readonly UserManager _UserManager; + private readonly ILogger _Logger; + + public PersonalDataModel( + UserManager userManager, + ILogger logger) + { + _UserManager = userManager; + _Logger = logger; + } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await _UserManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{_UserManager.GetUserId(User)}'."); + } + + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Referrals.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Referrals.cshtml new file mode 100644 index 00000000..f228413a --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Referrals.cshtml @@ -0,0 +1,18 @@ +ο»Ώ@page +@model ReferralsDataModel +@{ + ViewData["Title"] = "Referrals"; + ViewData["ActivePage"] = ManageNavPages.Referrals; +} + +

@ViewData["Title"]

+ +
+

+ You have @Model.ReferralCount referrals. +

+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Referrals.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Referrals.cshtml.cs new file mode 100644 index 00000000..f6136cf5 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/Referrals.cshtml.cs @@ -0,0 +1,34 @@ +ο»Ώusing EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class ReferralsDataModel : PageModel +{ + private readonly UserManager _UserManager; + private readonly ILogger _Logger; + + public int ReferralCount { get; private set; } + + public ReferralsDataModel( + UserManager userManager, + ILogger logger) + { + _UserManager = userManager; + _Logger = logger; + } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await _UserManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{_UserManager.GetUserId(User)}'."); + } + ReferralCount = user.ReferralCount; + + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ResetAuthenticator.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ResetAuthenticator.cshtml new file mode 100644 index 00000000..157ec63d --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ResetAuthenticator.cshtml @@ -0,0 +1,24 @@ +ο»Ώ@page +@model ResetAuthenticatorModel +@{ + ViewData["Title"] = "Reset authenticator key"; +ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; +} + + +

@ViewData["Title"]

+ +
+
+ +
+
diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ResetAuthenticator.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ResetAuthenticator.cshtml.cs new file mode 100644 index 00000000..8fd8ef5d --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ResetAuthenticator.cshtml.cs @@ -0,0 +1,45 @@ +ο»Ώusing EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class ResetAuthenticatorModel( + UserManager userManager, + SignInManager signInManager, + ILogger logger) : PageModel +{ + [TempData] + public string? StatusMessage { get; set; } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + return Page(); + } + + public async Task OnPostAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + await userManager.SetTwoFactorEnabledAsync(user, false); + await userManager.ResetAuthenticatorKeyAsync(user); + _ = await userManager.GetUserIdAsync(user); + logger.LogInformation("User with ID '{UserId}' has reset their authentication app key.", user.Id); + + await signInManager.RefreshSignInAsync(user); + StatusMessage = "Your authenticator app key has been reset, you will need to configure your authenticator app using the new key."; + + return RedirectToPage("./EnableAuthenticator"); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml new file mode 100644 index 00000000..dd29662c --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml @@ -0,0 +1,35 @@ +ο»Ώ@page +@model SetPasswordModel +@{ + ViewData["Title"] = "Set password"; +ViewData["ActivePage"] = ManageNavPages.ChangePassword; +} + +

Set your password

+ +

+ You do not have a local username/password for this site. Add a local + account so you can log in without an external login. +

+
+
+
+ +
+ + + +
+
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml.cs new file mode 100644 index 00000000..a0e06458 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml.cs @@ -0,0 +1,90 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class SetPasswordModel( + UserManager userManager, + SignInManager signInManager) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + [TempData] + public string? StatusMessage { get; set; } + + public class InputModel + { + [Required] + [StringLength(Web.Services.PasswordRequirementOptions.PasswordMaximumLength, ErrorMessage = ValidationMessages.StringLengthErrorMessage, MinimumLength = Web.Services.PasswordRequirementOptions.PasswordMinimumLength)] + [DataType(DataType.Password)] + [Display(Name = "New password")] + public string? NewPassword { get; set; } + + [DataType(DataType.Password)] + [Display(Name = "Confirm new password")] + [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] + public string? ConfirmPassword { get; set; } + } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + bool hasPassword = await userManager.HasPasswordAsync(user); + + if (hasPassword) + { + return RedirectToPage("./ChangePassword"); + } + + return Page(); + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return Page(); + } + + EssentialCSharpWebUser? user = await userManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + if (Input.NewPassword is null) + { + StatusMessage = "Please enter a new password."; + return Page(); + } + + IdentityResult addPasswordResult = await userManager.AddPasswordAsync(user, Input.NewPassword); + if (!addPasswordResult.Succeeded) + { + foreach (IdentityError error in addPasswordResult.Errors) + { + ModelState.AddModelError(string.Empty, error.Description); + } + return Page(); + } + + await signInManager.RefreshSignInAsync(user); + StatusMessage = "Your password has been set."; + + return RedirectToPage(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ShowRecoveryCodes.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ShowRecoveryCodes.cshtml new file mode 100644 index 00000000..0f69d138 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ShowRecoveryCodes.cshtml @@ -0,0 +1,25 @@ +ο»Ώ@page +@model ShowRecoveryCodesModel +@{ + ViewData["Title"] = "Recovery codes"; +ViewData["ActivePage"] = "TwoFactorAuthentication"; +} + + +

@ViewData["Title"]

+ +
+
+ @for (var row = 0; row < Model.RecoveryCodes?.Length; row += 2) + { + @Model.RecoveryCodes[row] @Model.RecoveryCodes[row + 1]
+ } +
+
diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ShowRecoveryCodes.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ShowRecoveryCodes.cshtml.cs new file mode 100644 index 00000000..5671518c --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/ShowRecoveryCodes.cshtml.cs @@ -0,0 +1,28 @@ +ο»Ώusing Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +/// +/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used +/// directly from your code. This API may change or be removed in future releases. +/// +public class ShowRecoveryCodesModel : PageModel +{ + + [TempData] + public string[]? RecoveryCodes { get; set; } + + [TempData] + public string? StatusMessage { get; set; } + + public IActionResult OnGet() + { + if (RecoveryCodes is null || RecoveryCodes.Length is 0) + { + return RedirectToPage("./TwoFactorAuthentication"); + } + + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/TwoFactorAuthentication.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/TwoFactorAuthentication.cshtml new file mode 100644 index 00000000..7bf35e76 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/TwoFactorAuthentication.cshtml @@ -0,0 +1,71 @@ +ο»Ώ@page +@using Microsoft.AspNetCore.Http.Features +@model TwoFactorAuthenticationModel +@{ + ViewData["Title"] = "Two-factor authentication (2FA)"; +ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; +} + + +

@ViewData["Title"]

+@{ + var consentFeature = HttpContext.Features.Get(); + @if (consentFeature?.CanTrack ?? false) +{ + @if (Model.Is2faEnabled) + { + if (Model.RecoveryCodesLeft == 0) + { +
+ You have no recovery codes left. +

You must generate a new set of recovery codes before you can log in with a recovery code.

+
+ } + else if (Model.RecoveryCodesLeft is 1) + { +
+ You have 1 recovery code left. +

You can generate a new set of recovery codes.

+
+ } + else if (Model.RecoveryCodesLeft is 2 or 3) + { +
+ You have @Model.RecoveryCodesLeft recovery codes left. +

You should generate a new set of recovery codes.

+
+ } + + if (Model.IsMachineRemembered) + { +
+ +
+ } + Disable 2FA + Reset recovery codes + } + +

Authenticator app

+ @if (!Model.HasAuthenticator) + { + Add authenticator app + } + else + { + Set up authenticator app + Reset authenticator app + } +} +else +{ +
+ Privacy and cookie policy have not been accepted. +

You must accept the policy before you can enable two factor authentication.

+
+} +} + +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/TwoFactorAuthentication.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/TwoFactorAuthentication.cshtml.cs new file mode 100644 index 00000000..347b2157 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/TwoFactorAuthentication.cshtml.cs @@ -0,0 +1,62 @@ +ο»Ώusing EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage; + +public class TwoFactorAuthenticationModel : PageModel +{ + private readonly UserManager _UserManager; + private readonly SignInManager _SignInManager; + private readonly ILogger _Logger; + + public TwoFactorAuthenticationModel( + UserManager userManager, SignInManager signInManager, ILogger logger) + { + _UserManager = userManager; + _SignInManager = signInManager; + _Logger = logger; + } + + public bool HasAuthenticator { get; set; } + + public int RecoveryCodesLeft { get; set; } + + [BindProperty] + public bool Is2faEnabled { get; set; } + + public bool IsMachineRemembered { get; set; } + + [TempData] + public string? StatusMessage { get; set; } + + public async Task OnGetAsync() + { + EssentialCSharpWebUser? user = await _UserManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{_UserManager.GetUserId(User)}'."); + } + + HasAuthenticator = await _UserManager.GetAuthenticatorKeyAsync(user) != null; + Is2faEnabled = await _UserManager.GetTwoFactorEnabledAsync(user); + IsMachineRemembered = await _SignInManager.IsTwoFactorClientRememberedAsync(user); + RecoveryCodesLeft = await _UserManager.CountRecoveryCodesAsync(user); + + return Page(); + } + + public async Task OnPostAsync() + { + EssentialCSharpWebUser? user = await _UserManager.GetUserAsync(User); + if (user is null) + { + return NotFound($"Unable to load user with ID '{_UserManager.GetUserId(User)}'."); + } + + await _SignInManager.ForgetTwoFactorClientAsync(); + StatusMessage = "The current browser has been forgotten. When you login again from this browser you will be prompted for your 2fa code."; + return RedirectToPage(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_Layout.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_Layout.cshtml new file mode 100644 index 00000000..8535db4d --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_Layout.cshtml @@ -0,0 +1,29 @@ +ο»Ώ@{ + if (ViewData.TryGetValue("ParentLayout", out var parentLayout) && parentLayout != null) + { + Layout = parentLayout.ToString(); + } + else + { + Layout = "/Areas/Identity/Pages/_Layout.cshtml"; + } +} + +

Manage your account

+ +
+

Change your account settings

+
+
+
+ +
+
+ @RenderBody() +
+
+
+ +@section Scripts { + @RenderSection("Scripts", required: false) +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_ManageNav.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_ManageNav.cshtml new file mode 100644 index 00000000..15dfee37 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_ManageNav.cshtml @@ -0,0 +1,16 @@ +ο»Ώ@inject SignInManager SignInManager +@{ + var hasExternalLogins = (await SignInManager.GetExternalAuthenticationSchemesAsync()).Any(); +} + diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_StatusMessage.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_StatusMessage.cshtml new file mode 100644 index 00000000..c8985432 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_StatusMessage.cshtml @@ -0,0 +1,10 @@ +ο»Ώ@model string + +@if (!String.IsNullOrEmpty(Model)) +{ + var statusMessageClass = Model.StartsWith("Error") ? "danger" : "success"; + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml new file mode 100644 index 00000000..54ceb57a --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml @@ -0,0 +1 @@ +ο»Ώ@using EssentialCSharp.Web.Areas.Identity.Pages.Account.Manage \ No newline at end of file diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Register.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Register.cshtml new file mode 100644 index 00000000..44d63e7f --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Register.cshtml @@ -0,0 +1,93 @@ +@page +@model RegisterModel +@{ + ViewData["Title"] = "Register"; +} + +

@ViewData["Title"]

+ +
+
+
+

Create a new account.

+
+ +
+ + + +
+
+ + + +
+
+
+ + + +
+
+ + + +
+
+
+ + + +
+
+ + + +
+
+
+
+ +
+
+
+
+

Use another service to register.

+
+ @{ + if ((Model.ExternalLogins?.Count ?? 0) == 0) + { +
+

+ There are no external authentication services configured. See this + article + about setting up this ASP.NET application to support logging in via external services + . +

+
+ } + else + { +
+
+

+ @foreach (var provider in Model.ExternalLogins!) + { + + } +

+
+
+ } + } +
+
+
+ +@section Scripts { + + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/Register.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Register.cshtml.cs new file mode 100644 index 00000000..5e2db228 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/Register.cshtml.cs @@ -0,0 +1,233 @@ +using System.ComponentModel.DataAnnotations; +using System.Text; +using System.Text.Encodings.Web; +using EssentialCSharp.Web.Areas.Identity.Data; +using EssentialCSharp.Web.Models; +using EssentialCSharp.Web.Services; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; +using Microsoft.Extensions.Options; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public class RegisterModel( + UserManager userManager, + IUserStore userStore, + SignInManager signInManager, + ILogger logger, + IEmailSender emailSender, + ICaptchaService captchaService, + IOptions optionsAccessor, + IUserEmailStore emailStore) : PageModel +{ + public CaptchaOptions CaptchaOptions { get; } = optionsAccessor.Value; + + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public string? ReturnUrl { get; set; } + + public IList? ExternalLogins { get; set; } + + public class InputModel + { + [Required] + [DataType(DataType.Text)] + [Display(Name = "User Name")] + public string? UserName { get; set; } + + [Required] + [DataType(DataType.Text)] + [Display(Name = "First Name")] + public string? FirstName { get; set; } + + [Required] + [DataType(DataType.Text)] + [Display(Name = "Last Name")] + public string? LastName { get; set; } + + [Required] + [EmailAddress] + [Display(Name = "Email")] + public string? Email { get; set; } + + [Required] + [StringLength(PasswordRequirementOptions.PasswordMaximumLength, ErrorMessage = ValidationMessages.StringLengthErrorMessage, MinimumLength = PasswordRequirementOptions.PasswordMinimumLength)] + [DataType(DataType.Password)] + [Display(Name = "Password")] + public string? Password { get; set; } + + [DataType(DataType.Password)] + [Display(Name = "Confirm password")] + [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] + public string? ConfirmPassword { get; set; } + } + + public async Task OnGetAsync(string? returnUrl = null) + { + ReturnUrl = returnUrl; + ExternalLogins = (await signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); + } + + public async Task OnPostAsync(string? returnUrl = null) + { + returnUrl ??= Url.Content("~/"); + string? hCaptcha_response = Request.Form[CaptchaOptions.HttpPostResponseKeyName]; + + if (!ModelState.IsValid) + { + return Page(); + } + + if (hCaptcha_response is null) + { + ModelState.AddModelError(CaptchaOptions.HttpPostResponseKeyName, HCaptchaErrorDetails.GetValue(HCaptchaErrorDetails.MissingInputResponse).FriendlyDescription); + return Page(); + } + + HCaptchaResult? response = await captchaService.VerifyAsync(hCaptcha_response); + if (response is null) + { + ModelState.AddModelError(CaptchaOptions.HttpPostResponseKeyName, "Error: HCaptcha API response unexpectedly null"); + return Page(); + } + + // The JSON should also return a field "success" as true + // https://docs.hcaptcha.com/#verify-the-user-response-server-side + if (response.Success) + { + ExternalLogins = (await signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); + if (ModelState.IsValid) + { + EssentialCSharpWebUser user = CreateUser(); + user.FirstName = Input.FirstName; + user.LastName = Input.LastName; + + await userStore.SetUserNameAsync(user, Input.UserName, CancellationToken.None); + await emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None); + if (Input.Password is null) + { + logger.LogInformation("Error: Password null; please enter in a password"); + ModelState.AddModelError(string.Empty, "Error: Password null; please enter in a password"); + return Page(); + } + IdentityResult result = await userManager.CreateAsync(user, Input.Password); + + if (result.Succeeded) + { + logger.LogInformation("User created a new account with password."); + + string userId = await userManager.GetUserIdAsync(user); + string code = await userManager.GenerateEmailConfirmationTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + string? callbackUrl = Url.Page( + "/Account/ConfirmEmail", + pageHandler: null, + values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl }, + protocol: Request.Scheme); + + if (callbackUrl is null) + { + ModelState.AddModelError(string.Empty, "Error: callback url unexpectedly null."); + return Page(); + } + if (Input.Email is null) + { + ModelState.AddModelError(string.Empty, "Error: Email may not be null."); + return Page(); + } + await emailSender.SendEmailAsync(Input.Email, "Confirm your email", + $"Please confirm your account by clicking here."); + + if (userManager.Options.SignIn.RequireConfirmedAccount) + { + return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl }); + } + else + { + await signInManager.SignInAsync(user, isPersistent: false); + return LocalRedirect(returnUrl); + } + } + foreach (IdentityError error in result.Errors) + { + ModelState.AddModelError(string.Empty, error.Description); + } + } + } + else + { + switch (response.ErrorCodes?.Length) + { + case 0: + throw new InvalidOperationException("The HCaptcha determined the passcode is not valid, and does not meet the security criteria"); + case > 1: + throw new InvalidOperationException("HCaptcha returned error codes: " + string.Join(", ", response.ErrorCodes)); + default: + { + if (response.ErrorCodes is null) + { + throw new InvalidOperationException("HCaptcha returned error codes unexpectedly null"); + } + if (HCaptchaErrorDetails.TryGetValue(response.ErrorCodes.Single(), out HCaptchaErrorDetails? details)) + { + switch (details.ErrorCode) + { + case HCaptchaErrorDetails.MissingInputResponse: + case HCaptchaErrorDetails.InvalidInputResponse: + case HCaptchaErrorDetails.InvalidOrAlreadySeenResponse: + ModelState.AddModelError(string.Empty, details.FriendlyDescription); + logger.LogInformation("HCaptcha returned error code: {ErrorDetails}", details.ToString()); + break; + case HCaptchaErrorDetails.BadRequest: + ModelState.AddModelError(string.Empty, details.FriendlyDescription); + logger.LogInformation("HCaptcha returned error code: {ErrorDetails}", details.ToString()); + break; + case HCaptchaErrorDetails.MissingInputSecret: + case HCaptchaErrorDetails.InvalidInputSecret: + case HCaptchaErrorDetails.NotUsingDummyPasscode: + case HCaptchaErrorDetails.SitekeySecretMismatch: + logger.LogCritical("HCaptcha returned error code: {ErrorDetails}", details.ToString()); + break; + default: + throw new InvalidOperationException("HCaptcha returned unknown error code: " + details?.ErrorCode); + } + } + else + { + throw new InvalidOperationException("HCaptcha returned unknown error code: " + response.ErrorCodes.Single()); + } + + break; + } + + } + } + + // If we got this far, something failed, redisplay form + return Page(); + } + + private EssentialCSharpWebUser CreateUser() + { + try + { + return new EssentialCSharpWebUser(); + } + catch + { + throw new InvalidOperationException($"Can't create an instance of '{nameof(EssentialCSharpWebUser)}'. " + + $"Ensure that '{nameof(EssentialCSharpWebUser)}' is not an abstract class and has a parameterless constructor, or alternatively " + + $"override the register page in /Areas/Identity/Pages/Account/Register.cshtml"); + } + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/RegisterConfirmation.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/RegisterConfirmation.cshtml new file mode 100644 index 00000000..48869443 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/RegisterConfirmation.cshtml @@ -0,0 +1,23 @@ +ο»Ώ@page +@model RegisterConfirmationModel +@{ + ViewData["Title"] = "Register confirmation"; +} + +

@ViewData["Title"]

+@{ + if (@Model.DisplayConfirmAccountLink) +{ +

+ This app does not currently have a real email sender registered, see these docs for how to configure a real email sender. + Normally this would be emailed: Click here to confirm your account +

+ } +else +{ +

+ Please check your email to confirm your account. If you can't find the email, please check your spam folder. +

+ } +} + diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs new file mode 100644 index 00000000..1f840a4f --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs @@ -0,0 +1,61 @@ +ο»Ώusing System.Text; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +[AllowAnonymous] +public class RegisterConfirmationModel : PageModel +{ + private readonly UserManager _UserManager; + private readonly IEmailSender _Sender; + + public RegisterConfirmationModel(UserManager userManager, IEmailSender sender) + { + _UserManager = userManager; + _Sender = sender; + } + + public string? Email { get; set; } + + public bool DisplayConfirmAccountLink { get; set; } + + public string? EmailConfirmationUrl { get; set; } + + public async Task OnGetAsync(string? email, string? returnUrl = null) + { + if (email is null) + { + return RedirectToPage("/Index"); + } + returnUrl ??= Url.Content("~/"); + + EssentialCSharpWebUser? user = await _UserManager.FindByEmailAsync(email); + if (user is null) + { + return NotFound($"Unable to load user with email '{email}'."); + } + + Email = email; + // Once you add a real email sender, you should remove this code that lets you confirm the account + DisplayConfirmAccountLink = false; + if (DisplayConfirmAccountLink) + { + string userId = await _UserManager.GetUserIdAsync(user); + string code = await _UserManager.GenerateEmailConfirmationTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + EmailConfirmationUrl = Url.Page( + "/Account/ConfirmEmail", + pageHandler: null, + values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl }, + protocol: Request.Scheme); + } + + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResendEmailConfirmation.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResendEmailConfirmation.cshtml new file mode 100644 index 00000000..d457b6b8 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResendEmailConfirmation.cshtml @@ -0,0 +1,26 @@ +ο»Ώ@page +@model ResendEmailConfirmationModel +@{ + ViewData["Title"] = "Resend email confirmation"; +} + +

@ViewData["Title"]

+

Enter your email.

+
+
+
+
+ +
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResendEmailConfirmation.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResendEmailConfirmation.cshtml.cs new file mode 100644 index 00000000..8ef99283 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResendEmailConfirmation.cshtml.cs @@ -0,0 +1,73 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using System.Text; +using System.Text.Encodings.Web; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +[AllowAnonymous] +public class ResendEmailConfirmationModel(UserManager userManager, IEmailSender emailSender) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public class InputModel + { + [Required] + [EmailAddress] + public string? Email { get; set; } + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return Page(); + } + + if (Input.Email is null) + { + ModelState.AddModelError(string.Empty, "Error: Email is null. Please enter in an email"); + return Page(); + } + + EssentialCSharpWebUser? user = await userManager.FindByEmailAsync(Input.Email); + if (user is null) + { + return NotFound($"Unable to load user with ID '{userManager.GetUserId(User)}'."); + } + + string userId = await userManager.GetUserIdAsync(user); + string code = await userManager.GenerateEmailConfirmationTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + string? callbackUrl = Url.Page( + "/Account/ConfirmEmail", + pageHandler: null, + values: new { userId = userId, code = code }, + protocol: Request.Scheme); + + if (callbackUrl is null) + { + ModelState.AddModelError(string.Empty, "Error: callback url unexpectedly null."); + return Page(); + } + await emailSender.SendEmailAsync( + Input.Email, + "Confirm your email", + $"Please confirm your account by clicking here."); + + ModelState.AddModelError(string.Empty, "Verification email sent. Please check your email. If you can't find the email, please check your spam folder."); + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPassword.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPassword.cshtml new file mode 100644 index 00000000..e430d01e --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPassword.cshtml @@ -0,0 +1,37 @@ +ο»Ώ@page +@model ResetPasswordModel +@{ + ViewData["Title"] = "Reset password"; +} + +

@ViewData["Title"]

+

Reset your password.

+
+
+
+
+ + +
+ + + +
+
+ + + +
+
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPassword.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPassword.cshtml.cs new file mode 100644 index 00000000..383de416 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPassword.cshtml.cs @@ -0,0 +1,100 @@ +ο»Ώusing System.ComponentModel.DataAnnotations; +using System.Text; +using EssentialCSharp.Web.Areas.Identity.Data; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public class ResetPasswordModel(UserManager userManager) : PageModel +{ + private InputModel? _Input; + [BindProperty] + public InputModel Input + { + get => _Input!; + set => _Input = value ?? throw new ArgumentNullException(nameof(value)); + } + + public class InputModel + { + [Required] + [EmailAddress] + public string? Email { get; set; } + + [Required] + [StringLength(Web.Services.PasswordRequirementOptions.PasswordMaximumLength, ErrorMessage = ValidationMessages.StringLengthErrorMessage, MinimumLength = Web.Services.PasswordRequirementOptions.PasswordMinimumLength)] + [DataType(DataType.Password)] + public string? Password { get; set; } + + [DataType(DataType.Password)] + [Display(Name = "Confirm password")] + [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] + public string? ConfirmPassword { get; set; } + + [Required] + public string? Code { get; set; } + + } + + public IActionResult OnGet(string? code = null) + { + if (code is null) + { + return BadRequest("A code must be supplied for password reset."); + } + else + { + Input = new InputModel + { + Code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)) + }; + return Page(); + } + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return Page(); + } + + if (Input.Email is null) + { + ModelState.AddModelError(string.Empty, "Error: Email is required."); + return RedirectToPage(); + } + EssentialCSharpWebUser? user = await userManager.FindByEmailAsync(Input.Email); + if (user is null) + { + // Don't reveal that the user does not exist + return RedirectToPage("./ResetPasswordConfirmation"); + } + + if (Input.Password is null) + { + ModelState.AddModelError(string.Empty, "Error: Password is required."); + return RedirectToPage(); + } + if (Input.Code is null) + { + ModelState.AddModelError(string.Empty, "Error: Code is required."); + return RedirectToPage(); + } + + IdentityResult result = await userManager.ResetPasswordAsync(user, Input.Code, Input.Password); + if (result.Succeeded) + { + return RedirectToPage("./ResetPasswordConfirmation"); + } + + foreach (IdentityError error in result.Errors) + { + ModelState.AddModelError(string.Empty, error.Description); + } + return Page(); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml new file mode 100644 index 00000000..c52552f3 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml @@ -0,0 +1,10 @@ +ο»Ώ@page +@model ResetPasswordConfirmationModel +@{ + ViewData["Title"] = "Reset password confirmation"; +} + +

@ViewData["Title"]

+

+ Your password has been reset. Please click here to log in. +

diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml.cs new file mode 100644 index 00000000..a75f6d05 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ResetPasswordConfirmation.cshtml.cs @@ -0,0 +1,16 @@ +ο»Ώusing Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +/// +/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used +/// directly from your code. This API may change or be removed in future releases. +/// +[AllowAnonymous] +public class ResetPasswordConfirmationModel : PageModel +{ + public void OnGet() + { + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/ValidationMessages.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ValidationMessages.cs new file mode 100644 index 00000000..09f2e79d --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/ValidationMessages.cs @@ -0,0 +1,8 @@ +ο»Ώnamespace EssentialCSharp.Web.Areas.Identity.Pages.Account; + +public static class ValidationMessages +{ + public const string StringLengthErrorMessage = "The {0} must be at least {2} and at max {1} characters long."; + public const int VerificationCodeMaximumLength = 7; + public const int VerificationCodeMinimumLength = 6; +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/_StatusMessage.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/_StatusMessage.cshtml new file mode 100644 index 00000000..567648b5 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/_StatusMessage.cshtml @@ -0,0 +1,10 @@ +ο»Ώ@model string + +@if (!string.IsNullOrEmpty(Model)) +{ + var statusMessageClass = Model.StartsWith("Error") ? "danger" : "success"; + +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Account/_ViewImports.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Account/_ViewImports.cshtml new file mode 100644 index 00000000..b45b7975 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Account/_ViewImports.cshtml @@ -0,0 +1 @@ +ο»Ώ@using EssentialCSharp.Web.Areas.Identity.Pages.Account \ No newline at end of file diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Error.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/Error.cshtml new file mode 100644 index 00000000..b1f3143a --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Error.cshtml @@ -0,0 +1,23 @@ +ο»Ώ@page +@model ErrorModel +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +

Development Mode

+

+ Swapping to Development environment will display more detailed information about the error that occurred. +

+

+ Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application. +

diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/Error.cshtml.cs b/EssentialCSharp.Web/Areas/Identity/Pages/Error.cshtml.cs new file mode 100644 index 00000000..ba439189 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/Error.cshtml.cs @@ -0,0 +1,24 @@ +ο»Ώusing Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace EssentialCSharp.Web.Areas.Identity.Pages; + +/// +/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used +/// directly from your code. This API may change or be removed in future releases. +/// +[AllowAnonymous] +[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] +public class ErrorModel : PageModel +{ + + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/_ValidationScriptsPartial.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/_ValidationScriptsPartial.cshtml new file mode 100644 index 00000000..48d0ce6b --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/_ValidationScriptsPartial.cshtml @@ -0,0 +1,14 @@ +ο»Ώ + + + diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/_ViewImports.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/_ViewImports.cshtml new file mode 100644 index 00000000..e39c9a84 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/_ViewImports.cshtml @@ -0,0 +1,5 @@ +ο»Ώ@using Microsoft.AspNetCore.Identity +@using EssentialCSharp.Web.Areas.Identity +@using EssentialCSharp.Web.Areas.Identity.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@using EssentialCSharp.Web.Areas.Identity.Data diff --git a/EssentialCSharp.Web/Areas/Identity/Pages/_ViewStart.cshtml b/EssentialCSharp.Web/Areas/Identity/Pages/_ViewStart.cshtml new file mode 100644 index 00000000..94fd419e --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Pages/_ViewStart.cshtml @@ -0,0 +1,4 @@ +ο»Ώ +@{ + Layout = "/Views/Shared/_Layout.cshtml"; +} diff --git a/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/CommonPasswordValidator.cs b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/CommonPasswordValidator.cs new file mode 100644 index 00000000..1b634695 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/CommonPasswordValidator.cs @@ -0,0 +1,35 @@ +ο»Ώusing Microsoft.AspNetCore.Identity; + +namespace EssentialCSharp.Web.Areas.Identity.Services.PasswordValidators; + +/// +/// Provides an abstraction for validating that the supplied password is not in a list of common passwords +/// +public abstract class CommonPasswordValidator(HashSet passwords) : IPasswordValidator + where TUser : IdentityUser +{ + + /// + /// The collection of common passwords which should not be allowed + /// + protected HashSet Passwords { get; } = passwords; + + /// + public Task ValidateAsync(UserManager manager, + TUser user, + string? password) + { + ArgumentNullException.ThrowIfNull(manager); + ArgumentNullException.ThrowIfNull(password); + + IdentityResult result = Passwords.Contains(password, StringComparer.InvariantCultureIgnoreCase) + ? IdentityResult.Failed(new IdentityError + { + Code = "CommonPassword", + Description = "The password you chose is too common." + }) + : IdentityResult.Success; + + return Task.FromResult(result); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/PasswordLists.cs b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/PasswordLists.cs new file mode 100644 index 00000000..d5f39d31 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/PasswordLists.cs @@ -0,0 +1,25 @@ +ο»Ώusing EssentialCSharp.Web.Services; + +namespace EssentialCSharp.Web.Areas.Identity.Services.PasswordValidators; + +public class PasswordLists +{ + private static readonly string _Prefix = Path.Join("Areas","Identity","Services","PasswordValidators","PasswordLists"); + + public PasswordLists() + { + Top100000PasswordsPlus = new Lazy>(() => LoadPasswordList("Top100000CommonPasswordsPlus.txt")); + } + + public Lazy> Top100000PasswordsPlus { get; } + + private static HashSet LoadPasswordList(string listName) + { + // Only store in memory common passwords that are actually possible for a user to enter + // based on our current password requirements + return new HashSet(File.ReadLines(Path.Join(_Prefix, listName)) + .Where(password => password.Length >= PasswordRequirementOptions.PasswordMinimumLength + && password.Length <= PasswordRequirementOptions.PasswordMaximumLength + && password.Distinct().Count() >= PasswordRequirementOptions.RequiredUniqueChars)); + } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/PasswordLists/Top100000CommonPasswordsPlus.txt b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/PasswordLists/Top100000CommonPasswordsPlus.txt new file mode 100644 index 00000000..05eb5a9c --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/PasswordLists/Top100000CommonPasswordsPlus.txt @@ -0,0 +1,100215 @@ +password +123456 +12345678 +1234 +qwerty +12345 +dragon +pussy +baseball +football +letmein +monkey +696969 +abc123 +mustang +michael +shadow +master +jennifer +111111 +2000 +jordan +superman +harley +1234567 +fuckme +hunter +fuckyou +trustno1 +ranger +buster +thomas +tigger +robert +soccer +fuck +batman +test +pass +killer +hockey +george +charlie +andrew +michelle +love +sunshine +jessica +asshole +6969 +pepper +daniel +access +123456789 +654321 +joshua +maggie +starwars +silver +william +dallas +yankees +123123 +ashley +666666 +hello +amanda +orange +biteme +freedom +computer +sexy +thunder +nicole +ginger +heather +hammer +summer +corvette +taylor +fucker +austin +1111 +merlin +matthew +121212 +golfer +cheese +princess +martin +chelsea +patrick +richard +diamond +yellow +bigdog +secret +asdfgh +sparky +cowboy +camaro +anthony +matrix +falcon +iloveyou +bailey +guitar +jackson +purple +scooter +phoenix +aaaaaa +morgan +tigers +porsche +mickey +maverick +cookie +nascar +peanut +justin +131313 +money +horny +samantha +panties +steelers +joseph +snoopy +boomer +whatever +iceman +smokey +gateway +dakota +cowboys +eagles +chicken +dick +black +zxcvbn +please +andrea +ferrari +knight +hardcore +melissa +compaq +coffee +booboo +bitch +johnny +bulldog +xxxxxx +welcome +james +player +ncc1701 +wizard +scooby +charles +junior +internet +bigdick +mike +brandy +tennis +blowjob +banana +monster +spider +lakers +miller +rabbit +enter +mercedes +brandon +steven +fender +john +yamaha +diablo +chris +boston +tiger +marine +chicago +rangers +gandalf +winter +bigtits +barney +edward +raiders +porn +badboy +blowme +spanky +bigdaddy +johnson +chester +london +midnight +blue +fishing +000000 +hannah +slayer +11111111 +rachel +sexsex +redsox +thx1138 +asdf +marlboro +panther +zxcvbnm +arsenal +oliver +qazwsx +mother +victoria +7777777 +jasper +angel +david +winner +crystal +golden +butthead +viking +jack +iwantu +shannon +murphy +angels +prince +cameron +girls +madison +wilson +carlos +hooters +willie +startrek +captain +maddog +jasmine +butter +booger +angela +golf +lauren +rocket +tiffany +theman +dennis +liverpoo +flower +forever +green +jackie +muffin +turtle +sophie +danielle +redskins +toyota +jason +sierra +winston +debbie +giants +packers +newyork +jeremy +casper +bubba +112233 +sandra +lovers +mountain +united +cooper +driver +tucker +helpme +fucking +pookie +lucky +maxwell +8675309 +bear +suckit +gators +5150 +222222 +shithead +fuckoff +jaguar +monica +fred +happy +hotdog +tits +gemini +lover +xxxxxxxx +777777 +canada +nathan +victor +florida +88888888 +nicholas +rosebud +metallic +doctor +trouble +success +stupid +tomcat +warrior +peaches +apples +fish +qwertyui +magic +buddy +dolphins +rainbow +gunner +987654 +freddy +alexis +braves +cock +2112 +1212 +cocacola +xavier +dolphin +testing +bond007 +member +calvin +voodoo +7777 +samson +alex +apollo +fire +tester +walter +beavis +voyager +peter +porno +bonnie +rush2112 +beer +apple +scorpio +jonathan +skippy +sydney +scott +red123 +power +gordon +travis +beaver +star +jackass +flyers +boobs +232323 +zzzzzz +steve +rebecca +scorpion +doggie +legend +ou812 +yankee +blazer +bill +runner +birdie +bitches +555555 +parker +topgun +asdfasdf +heaven +viper +animal +2222 +bigboy +4444 +arthur +baby +private +godzilla +donald +williams +lifehack +phantom +dave +rock +august +sammy +cool +brian +platinum +jake +bronco +paul +mark +frank +heka6w2 +copper +billy +cumshot +garfield +willow +cunt +little +carter +slut +albert +69696969 +kitten +super +jordan23 +eagle1 +shelby +america +11111 +jessie +house +free +123321 +chevy +bullshit +white +broncos +horney +surfer +nissan +999999 +saturn +airborne +elephant +marvin +shit +action +adidas +qwert +kevin +1313 +explorer +walker +police +christin +december +benjamin +wolf +sweet +therock +king +online +dickhead +brooklyn +teresa +cricket +sharon +dexter +racing +penis +gregory +0000 +teens +redwings +dreams +michigan +hentai +magnum +87654321 +nothing +donkey +trinity +digital +333333 +stella +cartman +guinness +123abc +speedy +buffalo +kitty +pimpin +eagle +einstein +kelly +nelson +nirvana +vampire +xxxx +playboy +louise +pumpkin +snowball +test123 +girl +sucker +mexico +beatles +fantasy +ford +gibson +celtic +marcus +cherry +cassie +888888 +natasha +sniper +chance +genesis +hotrod +reddog +alexande +college +jester +passw0rd +bigcock +smith +lasvegas +carmen +slipknot +3333 +death +kimberly +1q2w3e +eclipse +1q2w3e4r +stanley +samuel +drummer +homer +montana +music +aaaa +spencer +jimmy +carolina +colorado +creative +hello1 +rocky +goober +friday +bollocks +scotty +abcdef +bubbles +hawaii +fluffy +mine +stephen +horses +thumper +5555 +pussies +darkness +asdfghjk +pamela +boobies +buddha +vanessa +sandman +naughty +douglas +honda +matt +azerty +6666 +shorty +money1 +beach +loveme +4321 +simple +poohbear +444444 +badass +destiny +sarah +denise +vikings +lizard +melanie +assman +sabrina +nintendo +water +good +howard +time +123qwe +november +xxxxx +october +leather +bastard +young +101010 +extreme +hard +password1 +vincent +pussy1 +lacrosse +hotmail +spooky +amateur +alaska +badger +paradise +maryjane +poop +crazy +mozart +video +russell +vagina +spitfire +anderson +norman +eric +cherokee +cougar +barbara +long +420420 +family +horse +enigma +allison +raider +brazil +blonde +jones +55555 +dude +drowssap +jeff +school +marshall +lovely +1qaz2wsx +jeffrey +caroline +franklin +booty +molly +snickers +leslie +nipples +courtney +diesel +rocks +eminem +westside +suzuki +daddy +passion +hummer +ladies +zachary +frankie +elvis +reggie +alpha +suckme +simpson +patricia +147147 +pirate +tommy +semperfi +jupiter +redrum +freeuser +wanker +stinky +ducati +paris +natalie +babygirl +bishop +windows +spirit +pantera +monday +patches +brutus +houston +smooth +penguin +marley +forest +cream +212121 +flash +maximus +nipple +bobby +bradley +vision +pokemon +champion +fireman +indian +softball +picard +system +clinton +cobra +enjoy +lucky1 +claire +claudia +boogie +timothy +marines +security +dirty +admin +wildcats +pimp +dancer +hardon +veronica +fucked +abcd1234 +abcdefg +ironman +wolverin +remember +great +freepass +bigred +squirt +justice +francis +hobbes +kermit +pearljam +mercury +domino +9999 +denver +brooke +rascal +hitman +mistress +simon +tony +bbbbbb +friend +peekaboo +naked +budlight +electric +sluts +stargate +saints +bondage +brittany +bigman +zombie +swimming +duke +qwerty1 +babes +scotland +disney +rooster +brenda +mookie +swordfis +candy +duncan +olivia +hunting +blink182 +alicia +8888 +samsung +bubba1 +whore +virginia +general +passport +aaaaaaaa +erotic +liberty +arizona +jesus +abcd +newport +skipper +rolltide +balls +happy1 +galore +christ +weasel +242424 +wombat +digger +classic +bulldogs +poopoo +accord +popcorn +turkey +jenny +amber +bunny +mouse +007007 +titanic +liverpool +dreamer +everton +friends +chevelle +carrie +gabriel +psycho +nemesis +burton +pontiac +connor +eatme +lickme +roland +cumming +mitchell +ireland +lincoln +arnold +spiderma +patriots +goblue +devils +eugene +empire +asdfg +cardinal +brown +shaggy +froggy +qwer +kawasaki +kodiak +people +phpbb +light +54321 +kramer +chopper +hooker +honey +whynot +lesbian +lisa +baxter +adam +snake +teen +ncc1701d +qqqqqq +airplane +britney +avalon +sandy +sugar +sublime +stewart +wildcat +raven +scarface +elizabet +123654 +trucks +wolfpack +pervert +lawrence +raymond +redhead +american +alyssa +bambam +movie +woody +shaved +snowman +tiger1 +chicks +raptor +1969 +stingray +shooter +france +stars +madmax +kristen +sports +jerry +789456 +garcia +simpsons +lights +ryan +looking +chronic +alison +hahaha +packard +hendrix +perfect +service +spring +srinivas +spike +katie +252525 +oscar +brother +bigmac +suck +single +cannon +georgia +popeye +tattoo +texas +party +bullet +taurus +sailor +wolves +panthers +japan +strike +flowers +pussycat +chris1 +loverboy +berlin +sticky +marina +tarheels +fisher +russia +connie +wolfgang +testtest +mature +bass +catch22 +juice +michael1 +nigger +159753 +women +alpha1 +trooper +hawkeye +head +freaky +dodgers +pakistan +machine +pyramid +vegeta +katana +moose +tinker +coyote +infinity +inside +pepsi +letmein1 +bang +control +hercules +morris +james1 +tickle +outlaw +browns +billybob +pickle +test1 +michele +antonio +sucks +pavilion +changeme +caesar +prelude +tanner +adrian +darkside +bowling +wutang +sunset +robbie +alabama +danger +zeppelin +juan +rusty +pppppp +nick +2001 +ping +darkstar +madonna +qwe123 +bigone +casino +cheryl +charlie1 +mmmmmm +integra +wrangler +apache +tweety +qwerty12 +bobafett +simone +none +business +sterling +trevor +transam +dustin +harvey +england +2323 +seattle +ssssss +rose +harry +openup +pandora +pussys +trucker +wallace +indigo +storm +malibu +weed +review +babydoll +doggy +dilbert +pegasus +joker +catfish +flipper +valerie +herman +fuckit +detroit +kenneth +cheyenne +bruins +stacey +smoke +joey +seven +marino +fetish +xfiles +wonder +stinger +pizza +babe +pretty +stealth +manutd +gracie +gundam +cessna +longhorn +presario +mnbvcxz +wicked +mustang1 +victory +21122112 +shelly +awesome +athena +q1w2e3r4 +help +holiday +knicks +street +redneck +12341234 +casey +gizmo +scully +dragon1 +devildog +triumph +eddie +bluebird +shotgun +peewee +ronnie +angel1 +daisy +special +metallica +madman +country +impala +lennon +roscoe +omega +access14 +enterpri +miranda +search +smitty +blizzard +unicorn +tight +rick +ronald +asdf1234 +harrison +trigger +truck +danny +home +winnie +beauty +thailand +1234567890 +cadillac +castle +tyler +bobcat +buddy1 +sunny +stones +asian +freddie +chuck +butt +loveyou +norton +hellfire +hotsex +indiana +short +panzer +lonewolf +trumpet +colors +blaster +12121212 +fireball +logan +precious +aaron +elaine +jungle +atlanta +gold +corona +curtis +nikki +polaris +timber +theone +baller +chipper +orlando +island +skyline +dragons +dogs +benson +licker +goldie +engineer +kong +pencil +basketba +open +hornet +world +linda +barbie +chan +farmer +valentin +wetpussy +indians +larry +redman +foobar +travel +morpheus +bernie +target +141414 +hotstuff +photos +laura +savage +holly +rocky1 +fuck_inside +dollar +turbo +design +newton +hottie +moon +202020 +blondes +4128 +lestat +avatar +future +goforit +random +abgrtyu +jjjjjj +cancer +q1w2e3 +smiley +goldberg +express +virgin +zipper +wrinkle1 +stone +andy +babylon +dong +powers +consumer +dudley +monkey1 +serenity +samurai +99999999 +bigboobs +skeeter +lindsay +joejoe +master1 +aaaaa +chocolat +christia +birthday +stephani +tang +1234qwer +alfred +ball +98765432 +maria +sexual +maxima +77777777 +sampson +buckeye +highland +kristin +seminole +reaper +bassman +nugget +lucifer +airforce +nasty +watson +warlock +2121 +philip +always +dodge +chrissy +burger +bird +snatch +missy +pink +gang +maddie +holmes +huskers +piglet +photo +joanne +hamilton +dodger +paladin +christy +chubby +buckeyes +hamlet +abcdefgh +bigfoot +sunday +manson +goldfish +garden +deftones +icecream +blondie +spartan +julie +harold +charger +brandi +stormy +sherry +pleasure +juventus +rodney +galaxy +holland +escort +zxcvb +planet +jerome +wesley +blues +song +peace +david1 +ncc1701e +1966 +51505150 +cavalier +gambit +karen +sidney +ripper +oicu812 +jamie +sister +marie +martha +nylons +aardvark +nadine +minnie +whiskey +bing +plastic +anal +babylon5 +chang +savannah +loser +racecar +insane +yankees1 +mememe +hansolo +chiefs +fredfred +freak +frog +salmon +concrete +yvonne +zxcv +shamrock +atlantis +warren +wordpass +julian +mariah +rommel +1010 +harris +predator +sylvia +massive +cats +sammy1 +mister +stud +marathon +rubber +ding +trunks +desire +montreal +justme +faster +kathleen +irish +1999 +bertha +jessica1 +alpine +sammie +diamonds +tristan +00000 +swinger +shan +stallion +pitbull +letmein2 +roberto +ready +april +palmer +ming +shadow1 +audrey +chong +clitoris +wang +shirley +fuckers +jackoff +bluesky +sundance +renegade +hollywoo +151515 +bernard +wolfman +soldier +picture +pierre +ling +goddess +manager +nikita +sweety +titans +hang +fang +ficken +niners +bottom +bubble +hello123 +ibanez +webster +sweetpea +stocking +323232 +tornado +lindsey +content +bruce +buck +aragorn +griffin +chen +campbell +trojan +christop +newman +wayne +tina +rockstar +father +geronimo +pascal +crimson +brooks +hector +penny +anna +google +camera +chandler +fatcat +lovelove +cody +cunts +waters +stimpy +finger +cindy +wheels +viper1 +latin +robin +greenday +987654321 +creampie +brendan +hiphop +willy +snapper +funtime +duck +trombone +adult +cotton +cookies +kaiser +mulder +westham +latino +jeep +ravens +aurora +drizzt +madness +energy +kinky +314159 +sophia +stefan +slick +rocker +55555555 +freeman +french +mongoose +speed +dddddd +hong +henry +hungry +yang +catdog +cheng +ghost +gogogo +randy +tottenha +curious +butterfl +mission +january +singer +sherman +shark +techno +lancer +lalala +autumn +chichi +orion +trixie +clifford +delta +bobbob +bomber +holden +kang +kiss +1968 +spunky +liquid +mary +beagle +granny +network +bond +kkkkkk +millie +1973 +biggie +beetle +teacher +susan +toronto +anakin +genius +dream +cocks +dang +bush +karate +snakes +bangkok +callie +fuckyou2 +pacific +daytona +kelsey +infantry +skywalke +foster +felix +sailing +raistlin +vanhalen +huang +herbert +jacob +blackie +tarzan +strider +sherlock +lang +gong +sang +dietcoke +ultimate +tree +shai +sprite +ting +artist +chai +chao +devil +python +ninja +misty +ytrewq +sweetie +superfly +456789 +tian +jing +jesus1 +freedom1 +dian +drpepper +potter +chou +darren +hobbit +violet +yong +shen +phillip +maurice +gloria +nolimit +mylove +biscuit +yahoo +shasta +sex4me +smoker +smile +pebbles +pics +philly +tong +tintin +lesbians +marlin +cactus +frank1 +tttttt +chun +danni +emerald +showme +pirates +lian +dogg +colleen +xiao +xian +tazman +tanker +patton +toshiba +richie +alberto +gotcha +graham +dillon +rang +emily +keng +jazz +bigguy +yuan +woman +tomtom +marion +greg +chaos +fossil +flight +racerx +tuan +creamy +boss +bobo +musicman +warcraft +window +blade +shuang +sheila +shun +lick +jian +microsoft +rong +allen +feng +getsome +sally +quality +kennedy +morrison +1977 +beng +wwwwww +yoyoyo +zhang +seng +teddy +joanna +andreas +harder +luke +qazxsw +qian +cong +chuan +deng +nang +boeing +keeper +western +isabelle +1963 +subaru +sheng +thuglife +teng +jiong +miao +martina +mang +maniac +pussie +tracey +a1b2c3 +clayton +zhou +zhuang +xing +stonecol +snow +spyder +liang +jiang +memphis +regina +ceng +magic1 +logitech +chuang +dark +million +blow +sesame +shao +poison +titty +terry +kuan +kuai +kyle +mian +guan +hamster +guai +ferret +florence +geng +duan +pang +maiden +quan +velvet +nong +neng +nookie +buttons +bian +bingo +biao +zhong +zeng +xiong +zhun +ying +zong +xuan +zang +0.0.000 +suan +shei +shui +sharks +shang +shua +small +peng +pian +piao +liao +meng +miami +reng +guang +cang +change +ruan +diao +luan +lucas +qing +chui +chuo +cuan +nuan +ning +heng +huan +kansas +muscle +monroe +weng +whitney +1passwor +bluemoon +zhui +zhua +xiang +zheng +zhen +zhei +zhao +zhan +yomama +zhai +zhuo +zuan +tarheel +shou +shuo +tiao +lady +leonard +leng +kuang +jiao +13579 +basket +qiao +qiong +qiang +chuai +nian +niao +niang +huai +22222222 +bianca +zhuan +zhuai +shuan +shuai +stardust +jumper +margaret +archie +66666666 +charlott +forget +qwertz +bones +history +milton +waterloo +2002 +stuff +11223344 +office +oldman +preston +trains +murray +vertigo +246810 +black1 +swallow +smiles +standard +alexandr +parrot +luther +user +nicolas +1976 +surfing +pioneer +pete +masters +apple1 +asdasd +auburn +hannibal +frontier +panama +lucy +buffy +brianna +welcome1 +vette +blue22 +shemale +111222 +baggins +groovy +global +turner +181818 +1979 +blades +spanking +life +byteme +lobster +collins +dawg +hilton +japanese +1970 +1964 +2424 +polo +markus +coco +deedee +mikey +1972 +171717 +1701 +strip +jersey +green1 +capital +sasha +sadie +putter +vader +seven7 +lester +marcel +banshee +grendel +gilbert +dicks +dead +hidden +iloveu +1980 +sound +ledzep +michel +147258 +female +bugger +buffett +bryan +hell +kristina +molson +2020 +wookie +sprint +thanks +jericho +102030 +grace +fuckin +mandy +ranger1 +trebor +deepthroat +bonehead +molly1 +mirage +models +1984 +2468 +stuart +showtime +squirrel +pentium +mario +anime +gator +powder +twister +connect +neptune +bruno +butts +engine +eatshit +mustangs +woody1 +shogun +septembe +pooh +jimbo +roger +annie +bacon +center +russian +sabine +damien +mollie +voyeur +2525 +363636 +leonardo +camel +chair +germany +giant +qqqq +nudist +bone +sleepy +tequila +megan +fighter +garrett +dominic +obiwan +makaveli +vacation +walnut +1974 +ladybug +cantona +ccbill +satan +rusty1 +passwor1 +columbia +napoleon +dusty +kissme +motorola +william1 +1967 +zzzz +skater +smut +play +matthew1 +robinson +valley +coolio +dagger +boner +bull +horndog +jason1 +blake +penguins +rescue +griffey +8j4ye3uz +californ +champs +qwertyuiop +portland +queen +colt45 +boat +xxxxxxx +xanadu +tacoma +mason +carpet +gggggg +safety +palace +italia +stevie +picturs +picasso +thongs +tempest +ricardo +roberts +asd123 +hairy +foxtrot +gary +nimrod +hotboy +343434 +1111111 +asdfghjkl +goose +overlord +blood +wood +stranger +454545 +shaolin +sooners +socrates +spiderman +peanuts +maxine +rogers +13131313 +andrew1 +filthy +donnie +ohyeah +africa +national +kenny +keith +monique +intrepid +jasmin +pickles +assass +fright +potato +darwin +hhhhhh +kingdom +weezer +424242 +pepsi1 +throat +romeo +gerard +looker +puppy +butch +monika +suzanne +sweets +temple +laurie +josh +megadeth +analsex +nymets +ddddddd +bigballs +support +stick +today +down +oakland +oooooo +qweasd +chucky +bridge +carrot +chargers +discover +dookie +condor +night +butler +hoover +horny1 +isabella +sunrise +sinner +jojo +megapass +martini +assfuck +grateful +ffffff +abigail +esther +mushroom +janice +jamaica +wright +sims +space +there +timmy +7654321 +77777 +cccccc +gizmodo +roxanne +ralph +tractor +cristina +dance +mypass +hongkong +helena +1975 +blue123 +pissing +thomas1 +redred +rich +basketball +attack +cash +satan666 +drunk +dixie +dublin +bollox +kingkong +katrina +miles +1971 +22222 +272727 +sexx +penelope +thompson +anything +bbbb +battle +grizzly +passat +porter +tracy +defiant +bowler +knickers +monitor +wisdom +wild +slappy +thor +letsgo +robert1 +feet +rush +brownie +hudson +098765 +playing +playtime +lightnin +melvin +atomic +bart +hawk +goku +glory +llllll +qwaszx +cosmos +bosco +knights +bentley +beast +slapshot +lewis +assword +frosty +gillian +sara +dumbass +mallard +dddd +deanna +elwood +wally +159357 +titleist +angelo +aussie +guest +golfing +doobie +loveit +chloe +elliott +werewolf +vipers +janine +1965 +blabla +surf +sucking +tardis +serena +shelley +thegame +legion +rebels +fernando +fast +gerald +sarah1 +double +onelove +loulou +toto +crash +blackcat +0007 +tacobell +soccer1 +jedi +manuel +method +river +chase +ludwig +poopie +derrick +boob +breast +kittycat +isabel +belly +pikachu +thunder1 +thankyou +jose +celeste +celtics +frances +frogger +scoobydo +sabbath +coltrane +budman +willis +jackal +bigger +zzzzz +silvia +sooner +licking +gopher +geheim +lonestar +primus +pooper +newpass +brasil +heather1 +husker +element +moomoo +beefcake +zzzzzzzz +tammy +shitty +smokin +personal +jjjj +anthony1 +anubis +backup +gorilla +fuckface +painter +lowrider +punkrock +traffic +claude +daniela +dale +delta1 +nancy +boys +easy +kissing +kelley +wendy +theresa +amazon +alan +fatass +dodgeram +dingdong +malcolm +qqqqqqqq +breasts +boots +honda1 +spidey +poker +temp +johnjohn +miguel +147852 +archer +asshole1 +dogdog +tricky +crusader +weather +syracuse +spankme +speaker +meridian +amadeus +back +harley1 +falcons +dorothy +turkey50 +kenwood +keyboard +ilovesex +1978 +blackman +shazam +shalom +lickit +jimbob +richmond +roller +carson +check +fatman +funny +garbage +sandiego +loving +magnus +cooldude +clover +mobile +bell +payton +plumber +texas1 +tool +topper +jenna +mariners +rebel +harmony +caliente +celica +fletcher +german +diana +oxford +osiris +orgasm +punkin +porsche9 +tuesday +close +breeze +bossman +kangaroo +billie +latinas +judith +astros +scruffy +donna +qwertyu +davis +hearts +kathy +jammer +java +springer +rhonda +ricky +1122 +goodtime +chelsea1 +freckles +flyboy +doodle +city +nebraska +bootie +kicker +webmaster +vulcan +iverson +191919 +blueeyes +stoner +321321 +farside +rugby +director +pussy69 +power1 +bobbie +hershey +hermes +monopoly +west +birdman +blessed +blackjac +southern +peterpan +thumbs +lawyer +melinda +fingers +fuckyou1 +rrrrrr +a1b2c3d4 +coke +nicola +bohica +heart +elvis1 +kids +blacky +stories +sentinel +snake1 +phoebe +jesse +richard1 +1234abcd +guardian +candyman +fisting +scarlet +dildo +pancho +mandingo +lucky7 +condom +munchkin +billyboy +summer1 +student +sword +skiing +sergio +site +sony +thong +rootbeer +assassin +cassidy +frederic +fffff +fitness +giovanni +scarlett +durango +postal +achilles +dawn +dylan +kisses +warriors +imagine +plymouth +topdog +asterix +hallo +cameltoe +fuckfuck +bridget +eeeeee +mouth +weird +will +sithlord +sommer +toby +theking +juliet +avenger +backdoor +goodbye +chevrole +faith +lorraine +trance +cosworth +brad +houses +homers +eternity +kingpin +verbatim +incubus +1961 +blond +zaphod +shiloh +spurs +station +jennie +maynard +mighty +aliens +hank +charly +running +dogman +omega1 +printer +aggies +chocolate +deadhead +hope +javier +bitch1 +stone55 +pineappl +thekid +lizzie +rockets +ashton +camels +formula +forrest +rosemary +oracle +rain +pussey +porkchop +abcde +clancy +nellie +mystic +inferno +blackdog +steve1 +pauline +alexander +alice +alfa +grumpy +flames +scream +lonely +puffy +proxy +valhalla +unreal +cynthia +herbie +engage +yyyyyy +010101 +solomon +pistol +melody +celeb +flying +gggg +santiago +scottie +oakley +portugal +a12345 +newbie +mmmm +venus +1qazxsw2 +beverly +zorro +work +writer +stripper +sebastia +spread +phil +tobias +links +members +metal +1221 +andre +565656 +funfun +trojans +again +cyber +hurrican +moneys +1x2zkg8w +zeus +thing +tomato +lion +atlantic +celine +usa123 +trans +account +aaaaaaa +homerun +hyperion +kevin1 +blacks +44444444 +skittles +sean +hastings +fart +gangbang +fubar +sailboat +older +oilers +craig +conrad +church +damian +dean +broken +buster1 +hithere +immortal +sticks +pilot +peters +lexmark +jerkoff +maryland +anders +cheers +possum +columbus +cutter +muppet +beautiful +stolen +swordfish +sport +sonic +peter1 +jethro +rockon +asdfghj +pass123 +paper +pornos +ncc1701a +bootys +buttman +bonjour +escape +1960 +becky +bears +362436 +spartans +tinman +threesom +lemons +maxmax +1414 +bbbbb +camelot +chad +chewie +gogo +fusion +saint +dilligaf +nopass +myself +hustler +hunter1 +whitey +beast1 +yesyes +spank +smudge +pinkfloy +patriot +lespaul +annette +hammers +catalina +finish +formula1 +sausage +scooter1 +orioles +oscar1 +over +colombia +cramps +natural +eating +exotic +iguana +bella +suckers +strong +sheena +start +slave +pearl +topcat +lancelot +angelica +magelan +racer +ramona +crunch +british +button +eileen +steph +456123 +skinny +seeking +rockhard +chief +filter +first +freaks +sakura +pacman +poontang +dalton +newlife +homer1 +klingon +watcher +walleye +tasha +tasty +sinatra +starship +steel +starbuck +poncho +amber1 +gonzo +grover +catherin +carol +candle +firefly +goblin +scotch +diver +usmc +huskies +eleven +kentucky +kitkat +israel +beckham +bicycle +yourmom +studio +tara +33333333 +shane +splash +jimmy1 +reality +12344321 +caitlin +focus +sapphire +mailman +raiders1 +clark +ddddd +hopper +excalibu +more +wilbur +illini +imperial +phillips +lansing +maxx +gothic +golfball +carlton +camille +facial +front242 +macdaddy +qwer1234 +vectra +cowboys1 +crazy1 +dannyboy +jane +betty +benny +bennett +leader +martinez +aquarius +barkley +hayden +caught +franky +ffff +floyd +sassy +pppp +pppppppp +prodigy +clarence +noodle +eatpussy +vortex +wanking +beatrice +billy1 +siemens +pedro +phillies +research +groups +carolyn +chevy1 +cccc +fritz +gggggggg +doughboy +dracula +nurses +loco +madrid +lollipop +trout +utopia +chrono +cooler +conner +nevada +wibble +werner +summit +marco +marilyn +1225 +babies +capone +fugazi +panda +mama +qazwsxed +puppies +triton +9876 +command +nnnnnn +ernest +momoney +iforgot +wolfie +studly +shawn +renee +alien +hamburg +81fukkc +741852 +catman +china +forgot +gagging +scott1 +drew +oregon +qweqwe +train +crazybab +daniel1 +cutlass +brothers +holes +heidi +mothers +music1 +what +walrus +1957 +bigtime +bike +xtreme +simba +ssss +rookie +angie +bathing +fresh +sanchez +rotten +maestro +luis +look +turbo1 +99999 +butthole +hhhh +elijah +monty +bender +yoda +shania +shock +phish +thecat +rightnow +reagan +baddog +asia +greatone +gateway1 +randall +abstr +napster +brian1 +bogart +high +hitler +emma +kill +weaver +wildfire +jackson1 +isaiah +1981 +belinda +beaner +yoyo +0.0.0.000 +super1 +select +snuggles +slutty +some +phoenix1 +technics +toon +raven1 +rayray +123789 +1066 +albion +greens +fashion +gesperrt +santana +paint +powell +credit +darling +mystery +bowser +bottle +brucelee +hehehe +kelly1 +mojo +1998 +bikini +woofwoof +yyyy +strap +sites +spears +theodore +julius +richards +amelia +central +f**k +nyjets +punisher +username +vanilla +twisted +bryant +brent +bunghole +here +elizabeth +erica +kimber +viagra +veritas +pony +pool +titts +labtec +lifetime +jenny1 +masterbate +mayhem +redbull +govols +gremlin +505050 +gmoney +rupert +rovers +diamond1 +lorenzo +trident +abnormal +davidson +deskjet +cuddles +nice +bristol +karina +milano +vh5150 +jarhead +1982 +bigbird +bizkit +sixers +slider +star69 +starfish +penetration +tommy1 +john316 +meghan +michaela +market +grant +caligula +carl +flicks +films +madden +railroad +cosmo +cthulhu +bradford +br0d3r +military +bearbear +swedish +spawn +patrick1 +polly +these +todd +reds +anarchy +groove +franco +fuckher +oooo +tyrone +vegas +airbus +cobra1 +christine +clips +delete +duster +kitty1 +mouse1 +monkeys +jazzman +1919 +262626 +swinging +stroke +stocks +sting +pippen +labrador +jordan1 +justdoit +meatball +females +saturday +park +vector +cooter +defender +desert +demon +nike +bubbas +bonkers +english +kahuna +wildman +4121 +sirius +static +piercing +terror +teenage +leelee +marissa +microsof +mechanic +robotech +rated +hailey +chaser +sanders +salsero +nuts +macross +quantum +rachael +tsunami +universe +daddy1 +cruise +nguyen +newpass6 +nudes +hellyeah +vernon +1959 +zaq12wsx +striker +sixty +steele +spice +spectrum +smegma +thumb +jjjjjjjj +mellow +astrid +cancun +cartoon +sabres +samiam +pants +oranges +oklahoma +lust +coleman +denali +nude +noodles +buzz +brest +hooter +mmmmmmmm +warthog +bloody +blueblue +zappa +wolverine +sniffing +lance +jean +jjjjj +harper +calico +freee +rover +door +pooter +closeup +bonsai +evelyn +emily1 +kathryn +keystone +iiii +1955 +yzerman +theboss +tolkien +jill +megaman +rasta +bbbbbbbb +bean +handsome +hal9000 +goofy +gringo +gofish +gizmo1 +samsam +scuba +onlyme +tttttttt +corrado +clown +clapton +deborah +boris +bulls +vivian +jayhawk +bethany +wwww +sharky +seeker +ssssssss +somethin +pillow +thesims +lighter +lkjhgf +melissa1 +marcius2 +barry +guiness +gymnast +casey1 +goalie +godsmack +doug +lolo +rangers1 +poppy +abby +clemson +clipper +deeznuts +nobody +holly1 +elliot +eeee +kingston +miriam +belle +yosemite +sucked +sex123 +sexy69 +pic\'s +tommyboy +lamont +meat +masterbating +marianne +marc +gretzky +happyday +frisco +scratch +orchid +orange1 +manchest +quincy +unbelievable +aberdeen +dawson +nathalie +ne1469 +boxing +hill +korn +intercourse +161616 +1985 +ziggy +supersta +stoney +senior +amature +barber +babyboy +bcfields +goliath +hack +hardrock +children +frodo +scout +scrappy +rosie +qazqaz +tracker +active +craving +commando +cohiba +deep +cyclone +dana +bubba69 +katie1 +mpegs +vsegda +jade +irish1 +better +sexy1 +sinclair +smelly +squerting +lions +jokers +jeanette +julia +jojojo +meathead +ashley1 +groucho +cheetah +champ +firefox +gandalf1 +packer +magnolia +love69 +tyler1 +typhoon +tundra +bobby1 +kenworth +village +volley +beth +wolf359 +0420 +000007 +swimmer +skydive +smokes +patty +peugeot +pompey +legolas +kristy +redhot +rodman +redalert +having +grapes +4runner +carrera +floppy +dollars +ou8122 +quattro +adams +cloud9 +davids +nofear +busty +homemade +mmmmm +whisper +vermont +webmaste +wives +insertion +jayjay +philips +phone +topher +tongue +temptress +midget +ripken +havefun +gretchen +canon +celebrity +five +getting +ghetto +direct +otto +ragnarok +trinidad +usnavy +conover +cruiser +dalshe +nicole1 +buzzard +hottest +kingfish +misfit +moore +milfnew +warlord +wassup +bigsexy +blackhaw +zippy +shearer +tights +thursday +kungfu +labia +journey +meatloaf +marlene +rider +area51 +batman1 +bananas +636363 +cancel +ggggg +paradox +mack +lynn +queens +adults +aikido +cigars +nova +hoosier +eeyore +moose1 +warez +interacial +streaming +313131 +pertinant +pool6123 +mayday +rivers +revenge +animated +banker +baddest +gordon24 +ccccc +fortune +fantasies +touching +aisan +deadman +homepage +ejaculation +whocares +iscool +jamesbon +1956 +1pussy +womam +sweden +skidoo +spock +sssss +petra +pepper1 +pinhead +micron +allsop +amsterda +army +aside +gunnar +666999 +chip +foot +fowler +february +face +fletch +george1 +sapper +science +sasha1 +luckydog +lover1 +magick +popopo +public +ultima +derek +cypress +booker +businessbabe +brandon1 +edwards +experience +vulva +vvvv +jabroni +bigbear +yummy +010203 +searay +secret1 +showing +sinbad +sexxxx +soleil +software +piccolo +thirteen +leopard +legacy +jensen +justine +memorex +marisa +mathew +redwing +rasputin +134679 +anfield +greenbay +gore +catcat +feather +scanner +pa55word +contortionist +danzig +daisy1 +hores +erik +exodus +vinnie +iiiiii +zero +1001 +subway +tank +second +snapple +sneakers +sonyfuck +picks +poodle +test1234 +their +llll +junebug +june +marker +mellon +ronaldo +roadkill +amanda1 +asdfjkl +beaches +greene +great1 +cheerleaers +force +doitnow +ozzy +madeline +radio +tyson +christian +daphne +boxster +brighton +housewifes +emmanuel +emerson +kkkk +mnbvcx +moocow +vides +wagner +janet +1717 +bigmoney +blonds +1000 +storys +stereo +4545 +420247 +seductive +sexygirl +lesbean +live +justin1 +124578 +animals +balance +hansen +cabbage +canadian +gangbanged +dodge1 +dimas +lori +loud +malaka +puss +probes +adriana +coolman +crawford +dante +nacked +hotpussy +erotica +kool +mirror +wearing +implants +intruder +bigass +zenith +woohoo +womans +tanya +tango +stacy +pisces +laguna +krystal +maxell +andyod22 +barcelon +chainsaw +chickens +flash1 +downtown +orgasms +magicman +profit +pusyy +pothead +coconut +chuckie +contact +clevelan +designer +builder +budweise +hotshot +horizon +hole +experienced +mondeo +wifes +1962 +strange +stumpy +smiths +sparks +slacker +piper +pitchers +passwords +laptop +jeremiah +allmine +alliance +bbbbbbb +asscock +halflife +grandma +hayley +88888 +cecilia +chacha +saratoga +sandy1 +santos +doogie +number +positive +qwert40 +transexual +crow +close-up +darrell +bonita +ib6ub9 +volvo +jacob1 +iiiii +beastie +sunnyday +stoned +sonics +starfire +snapon +pictuers +pepe +testing1 +tiberius +lisalisa +lesbain +litle +retard +ripple +austin1 +badgirl +golfgolf +flounder +garage +royals +dragoon +dickie +passwor +ocean +majestic +poppop +trailers +dammit +nokia +bobobo +br549 +emmitt +knock +minime +mikemike +whitesox +1954 +3232 +353535 +seamus +solo +sparkle +sluttey +pictere +titten +lback +1024 +angelina +goodluck +charlton +fingerig +gallaries +goat +ruby +passme +oasis +lockerroom +logan1 +rainman +twins +treasure +absolutely +club +custom +cyclops +nipper +bucket +homepage- +hhhhh +momsuck +indain +2345 +beerbeer +bimmer +susanne +stunner +stevens +456456 +shell +sheba +tootsie +tiny +testerer +reefer +really +1012 +harcore +gollum +545454 +chico +caveman +carole +fordf150 +fishes +gaymen +saleen +doodoo +pa55w0rd +looney +presto +qqqqq +cigar +bogey +brewer +helloo +dutch +kamikaze +monte +wasser +vietnam +visa +japanees +0123 +swords +slapper +peach +jump +marvel +masterbaiting +march +redwood +rolling +1005 +ametuer +chiks +cathy +callaway +fucing +sadie1 +panasoni +mamas +race +rambo +unknown +absolut +deacon +dallas1 +housewife +kristi +keywest +kirsten +kipper +morning +wings +idiot +18436572 +1515 +beating +zxczxc +sullivan +303030 +shaman +sparrow +terrapin +jeffery +masturbation +mick +redfish +1492 +angus +barrett +goirish +hardcock +felicia +forfun +galary +freeporn +duchess +olivier +lotus +pornographic +ramses +purdue +traveler +crave +brando +enter1 +killme +moneyman +welder +windsor +wifey +indon +yyyyy +stretch +taylor1 +4417 +shopping +picher +pickup +thumbnils +johnboy +jets +jess +maureen +anne +ameteur +amateurs +apollo13 +hambone +goldwing +5050 +charley +sally1 +doghouse +padres +pounding +quest +truelove +underdog +trader +crack +climber +bolitas +bravo +hohoho +model +italian +beanie +beretta +wrestlin +stroker +tabitha +sherwood +sexyman +jewels +johannes +mets +marcos +rhino +bdsm +balloons +goodman +grils +happy123 +flamingo +games +route66 +devo +dino +outkast +paintbal +magpie +llllllll +twilight +critter +christie +cupcake +nickel +bullseye +krista +knickerless +mimi +murder +videoes +binladen +xerxes +slim +slinky +pinky +peterson +thanatos +meister +menace +ripley +retired +albatros +balloon +bank +goten +5551212 +getsdown +donuts +divorce +nwo4life +lord +lost +underwear +tttt +comet +deer +damnit +dddddddd +deeznutz +nasty1 +nonono +nina +enterprise +eeeee +misfit99 +milkman +vvvvvv +isaac +1818 +blueboy +beans +bigbutt +wyatt +tech +solution +poetry +toolman +laurel +juggalo +jetski +meredith +barefoot +50spanks +gobears +scandinavian +original +truman +cubbies +nitram +briana +ebony +kings +warner +bilbo +yumyum +zzzzzzz +stylus +321654 +shannon1 +server +secure +silly +squash +starman +steeler +staples +phrases +techniques +laser +135790 +allan +barker +athens +cbr600 +chemical +fester +gangsta +fucku2 +freeze +game +salvador +droopy +objects +passwd +lllll +loaded +louis +manchester +losers +vedder +clit +chunky +darkman +damage +buckshot +buddah +boobed +henti +hillary +webber +winter1 +ingrid +bigmike +beta +zidane +talon +slave1 +pissoff +person +thegreat +living +lexus +matador +readers +riley +roberta +armani +ashlee +goldstar +5656 +cards +fmale +ferris +fuking +gaston +fucku +ggggggg +sauron +diggler +pacers +looser +pounded +premier +pulled +town +trisha +triangle +cornell +collin +cosmic +deeper +depeche +norway +bright +helmet +kristine +kendall +mustard +misty1 +watch +jagger +bertie +berger +word +3x7pxr +silver1 +smoking +snowboar +sonny +paula +penetrating +photoes +lesbens +lambert +lindros +lillian +roadking +rockford +1357 +143143 +asasas +goodboy +898989 +chicago1 +card +ferrari1 +galeries +godfathe +gawker +gargoyle +gangster +rubble +rrrr +onetime +pussyman +pooppoop +trapper +twenty +abraham +cinder +company +newcastl +boricua +bunny1 +boxer +hotred +hockey1 +hooper +edward1 +evan +kris +misery +moscow +milk +mortgage +bigtit +show +snoopdog +three +lionel +leanne +joshua1 +july +1230 +assholes +cedric +fallen +farley +gene +frisky +sanity +script +divine +dharma +lucky13 +property +tricia +akira +desiree +broadway +butterfly +hunt +hotbox +hootie +heat +howdy +earthlink +karma +kiteboy +motley +westwood +1988 +bert +blackbir +biggles +wrench +working +wrestle +slippery +pheonix +penny1 +pianoman +tomorrow +thedude +jenn +jonjon +jones1 +mattie +memory +micheal +roadrunn +arrow +attitude +azzer +seahawks +diehard +dotcom +lola +tunafish +chivas +cinnamon +clouds +deluxe +northern +nuclear +north +boom +boobie +hurley +krishna +momomo +modles +volume +23232323 +bluedog +wwwwwww +zerocool +yousuck +pluto +limewire +link +joung +marcia +awnyce +gonavy +haha +films+pic+galeries +fabian +francois +girsl +fuckthis +girfriend +rufus +drive +uncencored +a123456 +airport +clay +chrisbln +combat +cygnus +cupoi +never +netscape +brett +hhhhhhhh +eagles1 +elite +knockers +kendra +mommy +1958 +tazmania +shonuf +piano +pharmacy +thedog +lips +jillian +jenkins +midway +arsenal1 +anaconda +australi +gromit +gotohell +787878 +66666 +carmex2 +camber +gator1 +ginger1 +fuzzy +seadoo +dorian +lovesex +rancid +uuuuuu +911911 +nature +bulldog1 +helen +health +heater +higgins +kirk +monalisa +mmmmmmm +whiteout +virtual +ventura +jamie1 +japanes +james007 +2727 +2469 +blam +bitchass +believe +zephyr +stiffy +sweet1 +silent +southpar +spectre +tigger1 +tekken +lenny +lakota +lionking +jjjjjjj +medical +megatron +1369 +hawaiian +gymnastic +golfer1 +gunners +7779311 +515151 +famous +glass +screen +rudy +royal +sanfran +drake +optimus +panther1 +love1 +mail +maggie1 +pudding +venice +aaron1 +delphi +niceass +bounce +busted +house1 +killer1 +miracle +momo +musashi +jammin +2003 +234567 +wp2003wp +submit +silence +sssssss +state +spikes +sleeper +passwort +toledo +kume +media +meme +medusa +mantis +remote +reading +reebok +1017 +artemis +hampton +harry1 +cafc91 +fettish +friendly +oceans +oooooooo +mango +ppppp +trainer +troy +uuuu +909090 +cross +death1 +news +bullfrog +hokies +holyshit +eeeeeee +mitch +jasmine1 +& +& +sergeant +spinner +leon +jockey +records +right +babyblue +hans +gooner +474747 +cheeks +cars +candice +fight +glow +pass1234 +parola +okokok +pablo +magical +major +ramsey +poseidon +989898 +confused +circle +crusher +cubswin +nnnn +hollywood +erin +kotaku +milo +mittens +whatsup +vvvvv +iomega +insertions +bengals +bermuda +biit +yellow1 +012345 +spike1 +south +sowhat +pitures +peacock +pecker +theend +juliette +jimmie +romance +augusta +hayabusa +hawkeyes +castro +florian +geoffrey +dolly +lulu +qaz123 +usarmy +twinkle +cloud +chuckles +cold +hounddog +hover +hothot +europa +ernie +kenshin +kojak +mikey1 +water1 +196969 +because +wraith +zebra +wwwww +33333 +simon1 +spider1 +snuffy +philippe +thunderb +teddy1 +lesley +marino13 +maria1 +redline +renault +aloha +antoine +handyman +cerberus +gamecock +gobucks +freesex +duffman +ooooo +papa +nuggets +magician +longbow +preacher +porno1 +county +chrysler +contains +dalejr +darius +darlene +dell +navy +buffy1 +hedgehog +hoosiers +honey1 +hott +heyhey +europe +dutchess +everest +wareagle +ihateyou +sunflowe +3434 +senators +shag +spoon +sonoma +stalker +poochie +terminal +terefon +laurence +maradona +maryann +marty +roman +1007 +142536 +alibaba +america1 +bartman +astro +goth +century +chicken1 +cheater +four +ghost1 +passpass +oral +r2d2c3po +civic +cicero +myxworld +kkkkk +missouri +wishbone +infiniti +jameson +1a2b3c +1qwerty +wonderboy +skip +shojou +stanford +sparky1 +smeghead +poiuy +titanium +torres +lantern +jelly +jeanne +meier +1213 +bayern +basset +gsxr750 +cattle +charlene +fishing1 +fullmoon +gilles +dima +obelix +popo +prissy +ramrod +unique +absolute +bummer +hotone +dynasty +entry +konyor +missy1 +moses +282828 +yeah +xyz123 +stop +426hemi +404040 +seinfeld +simmons +pingpong +lazarus +matthews +marine1 +manning +recovery +12345a +beamer +babyface +greece +gustav +7007 +charity +camilla +ccccccc +faggot +foxy +frozen +gladiato +duckie +dogfood +paranoid +packers1 +longjohn +radical +tuna +clarinet +claudio +circus +danny1 +novell +nights +bonbon +kashmir +kiki +mortimer +modelsne +moondog +monaco +vladimir +insert +1953 +zxc123 +supreme +3131 +sexxx +selena +softail +poipoi +pong +together +mars +martin1 +rogue +alone +avalanch +audia4 +55bgates +cccccccc +chick +came11 +figaro +geneva +dogboy +dnsadm +dipshit +paradigm +othello +operator +officer +malone +post +rafael +valencia +tripod +choice +chopin +coucou +coach +cocksuck +common +creature +borussia +book +browning +heritage +hiziad +homerj +eight +earth +millions +mullet +whisky +jacques +store +4242 +speedo +starcraf +skylar +spaceman +piggy +pierce +tiger2 +legos +lala +jezebel +judy +joker1 +mazda +barton +baker +727272 +chester1 +fishman +food +rrrrrrrr +sandwich +dundee +lumber +magazine +radar +ppppppp +tranny +aaliyah +admiral +comics +cleo +delight +buttfuck +homeboy +eternal +kilroy +kellie +khan +violin +wingman +walmart +bigblue +blaze +beemer +beowulf +bigfish +yyyyyyy +woodie +yeahbaby +0123456 +tbone +style +syzygy +starter +lemon +linda1 +merlot +mexican +11235813 +anita +banner +bangbang +badman +barfly +grease +carla +charles1 +ffffffff +screw +doberman +diane +dogshit +overkill +counter +coolguy +claymore +demons +demo +nomore +normal +brewster +hhhhhhh +hondas +iamgod +enterme +everett +electron +eastside +kayla +minimoni +mybaby +wildbill +wildcard +ipswich +200000 +bearcat +zigzag +yyyyyyyy +xander +sweetnes +369369 +skyler +skywalker +pigeon +peyton +tipper +lilly +asdf123 +alphabet +asdzxc +babybaby +banane +barnes +guyver +graphics +grand +chinook +florida1 +flexible +fuckinside +otis +ursitesux +tototo +trust +tower +adam12 +christma +corey +chrome +buddie +bombers +bunker +hippie +keegan +misfits +vickie +292929 +woofer +wwwwwwww +stubby +sheep +secrets +sparta +stang +spud +sporty +pinball +jorge +just4fun +johanna +maxxxx +rebecca1 +gunther +fatima +fffffff +freeway +garion +score +rrrrr +sancho +outback +maggot +puddin +trial +adrienne +987456 +colton +clyde +brain +brains +hoops +eleanor +dwayne +kirby +mydick +villa +19691969 +bigcat +becker +shiner +silverad +spanish +templar +lamer +juicy +marsha +mike1 +maximum +rhiannon +real +1223 +10101010 +arrows +andres +alucard +baldwin +baron +avenue +ashleigh +haggis +channel +cheech +safari +ross +dog123 +orion1 +paloma +qwerasdf +presiden +vegitto +trees +969696 +adonis +colonel +cookie1 +newyork1 +brigitte +buddyboy +hellos +heineken +dwight +eraser +kerstin +motion +moritz +millwall +visual +jaybird +1983 +beautifu +bitter +yvette +zodiac +steven1 +sinister +slammer +smashing +slick1 +sponge +teddybea +theater +this +ticklish +lipstick +jonny +massage +mann +reynolds +ring +1211 +amazing +aptiva +applepie +bailey1 +guitar1 +chanel +canyon +gagged +fuckme1 +rough +digital1 +dinosaur +punk +98765 +90210 +clowns +cubs +daniels +deejay +nigga +naruto +boxcar +icehouse +hotties +electra +kent +widget +india +insanity +1986 +2004 +best +bluefish +bingo1 +***** +stratus +strength +sultan +storm1 +44444 +4200 +sentnece +season +sexyboy +sigma +smokie +spam +point +pippo +ticket +temppass +joel +manman +medicine +1022 +anton +almond +bacchus +aztnm +axio +awful +bamboo +hakr +gregor +hahahaha +5678 +casanova +caprice +camero1 +fellow +fountain +dupont +dolphin1 +dianne +paddle +magnet +qwert1 +pyon +porsche1 +tripper +vampires +coming +noway +burrito +bozo +highheel +hughes +hookem +eddie1 +ellie +entropy +kkkkkkkk +kkkkkkk +illinois +jacobs +1945 +1951 +24680 +21212121 +100000 +stonecold +taco +subzero +sharp +sexxxy +skolko +shanna +skyhawk +spurs1 +sputnik +piazza +testpass +letter +lane +kurt +jiggaman +matilda +1224 +harvard +hannah1 +525252 +4ever +carbon +chef +federico +ghosts +gina +scorpio1 +rt6ytere +madison1 +loki +raquel +promise +coolness +christina +coldbeer +citadel +brittney +highway +evil +monarch +morgan1 +washingt +1997 +bella1 +berry +yaya +yolanda +superb +taxman +studman +stephanie +3636 +sherri +sheriff +shepherd +poland +pizzas +tiffany1 +toilet +latina +lassie +larry1 +joseph1 +mephisto +meagan +marian +reptile +rico +razor +1013 +barron +hammer1 +gypsy +grande +carroll +camper +chippy +cat123 +call +chimera +fiesta +glock +glenn +domain +dieter +dragonba +onetwo +nygiants +odessa +password2 +louie +quartz +prowler +prophet +towers +ultra +cocker +corleone +dakota1 +cumm +nnnnnnn +natalia +boxers +hugo +heynow +hollow +iceberg +elvira +kittykat +kate +kitchen +wasabi +vikings1 +impact +beerman +string +sleep +splinter +snoopy1 +pipeline +pocket +legs +maple +mickey1 +manuela +mermaid +micro +meowmeow +redbird +alisha +baura +battery +grass +chevys +chestnut +caravan +carina +charmed +fraser +frogman +diving +dogger +draven +drifter +oatmeal +paris1 +longdong +quant4307s +rachel1 +vegitta +cole +cobras +corsair +dadada +noelle +mylife +nine +bowwow +body +hotrats +eastwood +moonligh +modena +wave +illusion +iiiiiii +jayhawks +birgit +zone +sutton +susana +swingers +shocker +shrimp +sexgod +squall +stefanie +squeeze +soul +patrice +poiu +players +tigers1 +toejam +tickler +line +julie1 +jimbo1 +jefferso +juanita +michael2 +rodeo +robot +1023 +annie1 +bball +guess +happy2 +charter +farm +flasher +falcon1 +fiction +fastball +gadget +scrabble +diaper +dirtbike +dinner +oliver1 +partner +paco +lucille +macman +poopy +popper +postman +ttttttt +ursula +acura +cowboy1 +conan +daewoo +cyrus +customer +nation +nemrac58 +nnnnn +nextel +bolton +bobdylan +hopeless +eureka +extra +kimmie +kcj9wx5n +killbill +musica +volkswag +wage +windmill +wert +vintage +iloveyou1 +itsme +bessie +zippo +311311 +starligh +smokey1 +spot +snappy +soulmate +plasma +thelma +tonight +krusty +just4me +mcdonald +marius +rochelle +rebel1 +1123 +alfredo +aubrey +audi +chantal +fick +goaway +roses +sales +rusty2 +dirt +dogbone +doofus +ooooooo +oblivion +mankind +luck +mahler +lllllll +pumper +puck +pulsar +valkyrie +tupac +compass +concorde +costello +cougars +delaware +niceguy +nocturne +bob123 +boating +bronze +hopkins +herewego +hewlett +houhou +hubert +earnhard +eeeeeeee +keller +mingus +mobydick +venture +verizon +imation +1950 +1948 +1949 +223344 +bigbig +blossom +zack +wowwow +sissy +skinner +spiker +square +snooker +sluggo +player1 +junk +jeannie +jsbach +jumbo +jewel +medic +robins +reddevil +reckless +123456a +1125 +1031 +beacon +astra +gumby +hammond +hassan +757575 +585858 +chillin +fuck1 +sander +lowell +radiohea +upyours +trek +courage +coolcool +classics +choochoo +darryl +nikki1 +nitro +bugs +boytoy +ellen +excite +kirsty +kane +wingnut +wireless +icu812 +1master +beatle +bigblock +blanca +wolfen +summer99 +sugar1 +tartar +sexysexy +senna +sexman +sick +someone +soprano +pippin +platypus +pixies +telephon +land +laura1 +laurent +rimmer +road +report +1020 +12qwaszx +arturo +around +hamish +halifax +fishhead +forum +dododo +doit +outside +paramedi +lonesome +mandy1 +twist +uuuuu +uranus +ttttt +butcher +bruce1 +helper +hopeful +eduard +dusty1 +kathy1 +katherin +moonbeam +muscles +monster1 +monkeybo +morton +windsurf +vvvvvvv +vivid +install +1947 +187187 +1941 +1952 +tatiana +susan1 +31415926 +sinned +sexxy +senator +sebastian +shadows +smoothie +snowflak +playstat +playa +playboy1 +toaster +jerry1 +marie1 +mason1 +merlin1 +roger1 +roadster +112358 +1121 +andrea1 +bacardi +auto +hardware +hardy +789789 +5555555 +captain1 +flores +fergus +sascha +rrrrrrr +dome +onion +nutter +lololo +qqqqqqq +quick +undertak +uuuuuuuu +uuuuuuu +criminal +cobain +cindy1 +coors +dani +descent +nimbus +nomad +nanook +norwich +bomb +bombay +broker +hookup +kiwi +winners +jackpot +1a2b3c4d +1776 +beardog +bighead +blast +bird33 +0987 +stress +shot +spooge +pelican +peepee +perry +pointer +titan +thedoors +jeremy1 +annabell +altima +baba +hallie +hate +hardone +5454 +candace +catwoman +flip +faithful +finance +farmboy +farscape +genesis1 +salomon +destroy +papers +option +page +loser1 +lopez +r2d2 +pumpkins +training +chriss +cumcum +ninjas +ninja1 +hung +erika +eduardo +killers +miller1 +islander +jamesbond +intel +jarvis +19841984 +2626 +bizzare +blue12 +biker +yoyoma +sushi +styles +shitface +series +shanti +spanker +steffi +smart +sphinx +please1 +paulie +pistons +tiburon +limited +maxwell1 +mdogg +rockies +armstron +alexia +arlene +alejandr +arctic +banger +audio +asimov +augustus +grandpa +753951 +4you +chilly +care1839 +chapman +flyfish +fantasia +freefall +santa +sandrine +oreo +ohshit +macbeth +madcat +loveya +mallory +rage +quentin +qwerqwer +project +ramirez +colnago +citizen +chocha +cobalt +crystal1 +dabears +nevets +nineinch +broncos1 +helene +huge +edgar +epsilon +easter +kestrel +moron +virgil +winston1 +warrior1 +iiiiiiii +iloveyou2 +1616 +beat +bettina +woowoo +zander +straight +shower +sloppy +specialk +tinkerbe +jellybea +reader +romero +redsox1 +ride +1215 +1112 +annika +arcadia +answer +baggio +base +guido +555666 +carmel +cayman +cbr900rr +chips +gabriell +gertrude +glennwei +roxy +sausages +disco +pass1 +luna +lovebug +macmac +queenie +puffin +vanguard +trip +trinitro +airwolf +abbott +aaa111 +cocaine +cisco +cottage +dayton +deadly +datsun +bricks +bumper +eldorado +kidrock +wizard1 +whiskers +wind +wildwood +istheman +interest +italy +25802580 +benoit +bigones +woodland +wolfpac +strawber +suicide +3030 +sheba1 +sixpack +peace1 +physics +pearson +tigger2 +toad +megan1 +meow +ringo +roll +amsterdam +717171 +686868 +5424 +catherine +canuck +football1 +footjob +fulham +seagull +orgy +lobo +mancity +truth +trace +vancouve +vauxhall +acidburn +derf +myspace1 +boozer +buttercu +howell +hola +easton +minemine +munch +jared +1dragon +biology +bestbuy +bigpoppa +blackout +blowfish +bmw325 +bigbob +stream +talisman +tazz +sundevil +3333333 +skate +shutup +shanghai +shop +spencer1 +slowhand +polish +pinky1 +tootie +thecrow +leroy +jonathon +jubilee +jingle +martine +matrix1 +manowar +michaels +messiah +mclaren +resident +reilly +redbaron +rollins +romans +return +rivera +andromed +athlon +beach1 +badgers +guitars +harald +harddick +gotribe +6996 +7grout +5wr2i7h8 +635241 +chase1 +carver +charlotte +fallout +fiddle +fredrick +fenris +francesc +fortuna +ferguson +fairlane +felipe +felix1 +forward +gasman +frost +fucks +sahara +sassy1 +dogpound +dogbert +divx1 +manila +loretta +priest +pornporn +quasar +venom +987987 +access1 +clippers +daylight +decker +daman +data +dentist +crusty +nathan1 +nnnnnnnn +bruno1 +bucks +brodie +budapest +kittens +kerouac +mother1 +waldo1 +wedding +whistler +whatwhat +wanderer +idontkno +1942 +1946 +bigdawg +bigpimp +zaqwsx +414141 +3000gt +434343 +shoes +serpent +starr +smurf +pasword +tommie +thisisit +lake +john1 +robotics +redeye +rebelz +1011 +alatam +asses +asians +bama +banzai +harvest +gonzalez +hair +hanson +575757 +5329 +cascade +chinese +fatty +fender1 +flower2 +funky +sambo +drummer1 +dogcat +dottie +oedipus +osama +macleod +prozac +private1 +rampage +punch +presley +concord +cook +cinema +cornwall +cleaner +christopher +ciccio +corinne +clutch +corvet07 +daemon +bruiser +boiler +hjkl +eyes +egghead +expert +ethan +kasper +mordor +wasted +jamess +iverson3 +bluesman +zouzou +090909 +1002 +switch +stone1 +4040 +sisters +sexo +shawna +smith1 +sperma +sneaky +polska +thewho +terminat +krypton +lawson +library +lekker +jules +johnson1 +johann +justus +rockie +romano +aspire +bastards +goodie +cheese1 +fenway +fishon +fishin +fuckoff1 +girls1 +sawyer +dolores +desmond +duane +doomsday +pornking +ramones +rabbits +transit +aaaaa1 +clock +delilah +noel +boyz +bookworm +bongo +bunnies +brady +buceta +highbury +henry1 +heels +eastern +krissy +mischief +mopar +ministry +vienna +weston +wildone +vodka +jayson +bigbooty +beavis1 +betsy +xxxxxx1 +yogibear +000001 +0815 +zulu +420000 +september +sigmar +sprout +stalin +peggy +patch +lkjhgfds +lagnaf +rolex +redfox +referee +123123123 +1231 +angus1 +ariana +ballin +attila +hall +greedy +grunt +747474 +carpedie +cecile +caramel +foxylady +field +gatorade +gidget +futbol +frosch +saiyan +schmidt +drums +donner +doggy1 +drum +doudou +pack +pain +nutmeg +quebec +valdepen +trash +triple +tosser +tuscl +track +comfort +choke +comein +cola +deputy +deadpool +bremen +borders +bronson +break +hotass +hotmail1 +eskimo +eggman +koko +kieran +katrin +kordell1 +komodo +mone +munich +vvvvvvvv +winger +jaeger +ivan +jackson5 +2222222 +bergkamp +bennie +bigben +zanzibar +worm +xxx123 +sunny1 +373737 +services +sheridan +slater +slayer1 +snoop +stacie +peachy +thecure +times +little1 +jennaj +marquis +middle +rasta69 +1114 +aries +havana +gratis +calgary +checkers +flanker +salope +dirty1 +draco +dogface +luv2epus +rainbow6 +qwerty123 +umpire +turnip +vbnm +tucson +troll +aileen +codered +commande +damon +nana +neon +nico +nightwin +neil +boomer1 +bushido +hotmail0 +horace +enternow +kaitlyn +keepout +karen1 +mindy +mnbv +viewsoni +volcom +wizards +wine +1995 +berkeley +bite +zach +woodstoc +tarpon +shinobi +starstar +phat +patience +patrol +toolbox +julien +johnny1 +joebob +marble +riders +reflex +120676 +1235 +angelus +anthrax +atlas +hawks +grandam +harlem +hawaii50 +gorgeous +655321 +cabron +challeng +callisto +firewall +firefire +fischer +flyer +flower1 +factory +federal +gambler +frodo1 +funk +sand +sam123 +scania +dingo +papito +passmast +olive +palermo +ou8123 +lock +ranch +pride +randy1 +twiggy +travis1 +transfer +treetop +addict +admin1 +963852 +aceace +clarissa +cliff +cirrus +clifton +colin +bobdole +bonner +bogus +bonjovi +bootsy +boater +elway7 +edison +kelvin +kenny1 +moonshin +montag +moreno +wayne1 +white1 +jazzy +jakejake +1994 +1991 +2828 +blunt +bluejays +beau +belmont +worthy +systems +sensei +southpark +stan +peeper +pharao +pigpen +tomahawk +teensex +leedsutd +larkin +jermaine +jeepster +jimjim +josephin +melons +marlon +matthias +marriage +robocop +1003 +1027 +antelope +azsxdc +gordo +hazard +granada +8989 +7894 +ceasar +cabernet +cheshire +california +chelle +candy1 +fergie +fanny +fidelio +giorgio +fuckhead +ruth +sanford +diego +dominion +devon +panic +longer +mackie +qawsed +trucking +twelve +chloe1 +coral +daddyo +nostromo +boyboy +booster +bucky +honolulu +esquire +dynamite +motor +mollydog +wilder +windows1 +waffle +wallet +warning +virus +washburn +wealth +vincent1 +jabber +jaguars +javelin +irishman +idefix +bigdog1 +blue42 +blanked +blue32 +biteme1 +bearcats +blaine +yessir +sylveste +team +stephan +sunfire +tbird +stryker +3ip76k2 +sevens +sheldon +pilgrim +tenchi +titman +leeds +lithium +lander +linkin +landon +marijuan +mariner +markie +midnite +reddwarf +1129 +123asd +12312312 +allstar +albany +asdf12 +antonia +aspen +hardball +goldfing +7734 +49ers +carlo +chambers +cable +carnage +callum +carlos1 +fitter +fandango +festival +flame +gofast +gamma +fucmy69 +scrapper +dogwood +django +magneto +loose +premium +addison +9999999 +abc1234 +cromwell +newyear +nichole +bookie +burns +bounty +brown1 +bologna +earl +entrance +elway +killjoy +kerry +keenan +kick +klondike +mini +mouser +mohammed +wayer +impreza +irene +insomnia +24682468 +2580 +24242424 +billbill +bellaco +blessing +blues1 +bedford +blanco +blunts +stinks +teaser +streets +sf49ers +shovel +solitude +spikey +sonia +pimpdadd +timeout +toffee +lefty +johndoe +johndeer +mega +manolo +mentor +margie +ratman +ridge +record +rhodes +robin1 +1124 +1210 +1028 +1226 +another +babylove +barbados +harbor +gramma +646464 +carpente +chaos1 +fishbone +fireblad +glasgow +frogs +scissors +screamer +salem +scuba1 +ducks +driven +doggies +dicky +donovan +obsidian +rams +progress +tottenham +aikman +comanche +corolla +clarke +conway +cumslut +cyborg +dancing +boston1 +bong +houdini +helmut +elvisp +edge +keksa12 +misha +monty1 +monsters +wetter +watford +wiseguy +veronika +visitor +janelle +1989 +1987 +20202020 +biatch +beezer +bigguns +blueball +bitchy +wyoming +yankees2 +wrestler +stupid1 +sealteam +sidekick +simple1 +smackdow +sporting +spiral +smeller +sperm +plato +tophat +test2 +theatre +thick +toomuch +leigh +jello +jewish +junkie +maxim +maxime +meadow +remingto +roofer +124038 +1018 +1269 +1227 +123457 +arkansas +alberta +aramis +andersen +beaker +barcelona +baltimor +googoo +goochi +852456 +4711 +catcher +carman +champ1 +chess +fortress +fishfish +firefigh +geezer +rsalinas +samuel1 +saigon +scooby1 +doors +dick1 +devin +doom +dirk +doris +dontknow +load +magpies +manfred +raleigh +vader1 +universa +tulips +defense +mygirl +burn +bowtie +bowman +holycow +heinrich +honeys +enforcer +katherine +minerva +wheeler +witch +waterboy +jaime +irving +1992 +23skidoo +bimbo +blue11 +birddog +woodman +womble +zildjian +030303 +stinker +stoppedby +sexybabe +speakers +slugger +spotty +smoke1 +polopolo +perfect1 +things +torpedo +tender +thrasher +lakeside +lilith +jimmys +jerk +junior1 +marsh +masamune +rice +root +1214 +april1 +allgood +bambi +grinch +767676 +5252 +cherries +chipmunk +cezer121 +carnival +capecod +finder +flint +fearless +goats +funstuff +gideon +savior +seabee +sandro +schalke +salasana +disney1 +duckman +options +pancake +pantera1 +malice +lookin +love123 +lloyd +qwert123 +puppet +prayers +union +tracer +crap +creation +cwoui +nascar24 +hookers +hollie +hewitt +estrella +erection +ernesto +ericsson +edthom +kaylee +kokoko +kokomo +kimball +morales +mooses +monk +walton +weekend +inter +internal +1michael +1993 +19781978 +25252525 +worker +summers +surgery +shibby +shamus +skibum +sheepdog +sex69 +spliff +slipper +spoons +spanner +snowbird +slow +toriamos +temp123 +tennesse +lakers1 +jomama +julio +mazdarx7 +rosario +recon +riddle +room +revolver +1025 +1101 +barney1 +babycake +baylor +gotham +gravity +hallowee +hancock +616161 +515000 +caca +cannabis +castor +chilli +fdsa +getout +fuck69 +gators1 +sail +sable +rumble +dolemite +dork +dickens +duffer +dodgers1 +painting +onions +logger +lorena +lookout +magic32 +port +poon +prime +twat +coventry +citroen +christmas +civicsi +cocksucker +coochie +compaq1 +nancy1 +buzzer +boulder +butkus +bungle +hogtied +honor +hero +hotgirls +hilary +heidi1 +eggplant +mustang6 +mortal +monkey12 +wapapapa +wendy1 +volleyba +vibrate +vicky +bledsoe +blink +birthday4 +woof +xxxxx1 +talk +stephen1 +suburban +stock +tabatha +sheeba +start1 +soccer10 +something +starcraft +soccer12 +peanut1 +plastics +penthous +peterbil +tools +tetsuo +torino +tennis1 +termite +ladder +last +lemmein +lakewood +jughead +melrose +megane +reginald +redone +request +angela1 +alive +alissa +goodgirl +gonzo1 +golden1 +gotyoass +656565 +626262 +capricor +chains +calvin1 +foolish +fallon +getmoney +godfather +gabber +gilligan +runaway +salami +dummy +dungeon +dudedude +dumb +dope +opus +paragon +oxygen +panhead +pasadena +opendoor +odyssey +magellan +lottie +printing +pressure +prince1 +trustme +christa +court +davies +neville +nono +bread +buffet +hound +kajak +killkill +mona +moto +mildred +winner1 +vixen +whiteboy +versace +winona +voyager1 +instant +indy +jackjack +bigal +beech +biggun +blake1 +blue99 +big1 +woods +synergy +success1 +336699 +sixty9 +shark1 +skin +simba1 +sharpe +sebring +spongebo +spunk +springs +sliver +phialpha +password9 +pizza1 +plane +perkins +pookey +tickling +lexingky +lawman +joe123 +jolly +mike123 +romeo1 +redheads +reserve +apple123 +alanis +ariane +antony +backbone +aviation +band +hand +green123 +haley +carlitos +byebye +cartman1 +camden +chewy +camaross +favorite6 +forumwp +franks +ginscoot +fruity +sabrina1 +devil666 +doughnut +pantie +oldone +paintball +lumina +rainbow1 +prosper +total +true +umbrella +ajax +951753 +achtung +abc12345 +compact +color +corn +complete +christi +closer +corndog +deerhunt +darklord +dank +nimitz +brandy1 +bowl +breanna +holidays +hetfield +holein1 +hillbill +hugetits +east +evolutio +kenobi +whiplash +waldo +wg8e3wjf +wing +istanbul +invis +1996 +benton +bigjohn +bluebell +beef +beater +benji +bluejay +xyzzy +wrestling +storage +superior +suckdick +taichi +stellar +stephane +shaker +skirt +seymour +semper +splurge +squeak +pearls +playball +pitch +phyllis +pooky +piss +tomas +titfuck +joemama +johnny5 +marcello +marjorie +married +maxi +rhubarb +rockwell +ratboy +reload +rooney +redd +1029 +1030 +1220 +anchor +bbking +baritone +gryphon +gone +57chevy +494949 +celeron +fishy +gladiator +fucker1 +roswell +dougie +downer +dicker +diva +domingo +donjuan +nympho +omar +praise +racers +trick +trauma +truck1 +trample +acer +corwin +cricket1 +clemente +climax +denmark +cuervo +notnow +nittany +neutron +native +bosco1 +buffa +breaker +hello2 +hydro +estelle +exchange +explore +kisskiss +kittys +kristian +montecar +modem +mississi +mooney +weiner +washington +20012001 +bigdick1 +bibi +benfica +yahoo1 +striper +tabasco +supra +383838 +456654 +seneca +serious +shuttle +socks +stanton +penguin1 +pathfind +testibil +thethe +listen +lightning +lighting +jeter2 +marma +mark1 +metoo +republic +rollin +redleg +redbone +redskin +rocco +1245 +armand +anthony7 +altoids +andrews +barley +away +asswipe +bauhaus +bbbbbb1 +gohome +harrier +golfpro +goldeney +818181 +6666666 +5000 +5rxypn +cameron1 +calling +checker +calibra +fields +freefree +faith1 +fist +fdm7ed +finally +giraffe +glasses +giggles +fringe +gate +georgie +scamper +rrpass1 +screwyou +duffy +deville +dimples +pacino +ontario +passthie +oberon +quest1 +postov1000 +puppydog +puffer +raining +protect +qwerty7 +trey +tribe +ulysses +tribal +adam25 +a1234567 +compton +collie +cleopatr +contract +davide +norris +namaste +myrtle +buffalo1 +bonovox +buckley +bukkake +burning +burner +bordeaux +burly +hun999 +emilie +elmo +enters +enrique +keisha +mohawk +willard +vgirl +whale +vince +jayden +jarrett +1812 +1943 +222333 +bigjim +bigd +zoom +wordup +ziggy1 +yahooo +workout +young1 +written +xmas +zzzzzz1 +surfer1 +strife +sunlight +tasha1 +skunk +shauna +seth +soft +sprinter +peaches1 +planes +pinetree +plum +pimping +theforce +thedon +toocool +leeann +laddie +list +lkjh +lara +joke +jupiter1 +mckenzie +matty +rene +redrose +1200 +102938 +annmarie +alexa +antares +austin31 +ground +goose1 +737373 +78945612 +789987 +6464 +calimero +caster +casper1 +cement +chevrolet +chessie +caddy +chill +child +canucks +feeling +favorite +fellatio +f00tball +francine +gateway2 +gigi +gamecube +giovanna +rugby1 +scheisse +dshade +dudes +dixie1 +owen +offshore +olympia +lucas1 +macaroni +manga +pringles +puff +tribble +trouble1 +ussy +core +clint +coolhand +colonial +colt +debra +darthvad +dealer +cygnusx1 +natalie1 +newark +husband +hiking +errors +eighteen +elcamino +emmett +emilia +koolaid +knight1 +murphy1 +volcano +idunno +2005 +2233 +block +benito +blueberr +biguns +yamahar1 +zapper +zorro1 +0911 +3006 +sixsix +shopper +siobhan +sextoy +stafford +snowboard +speedway +sounds +pokey +peabody +playboy2 +titi +think +toast +toonarmy +lister +lambda +joecool +jonas +joyce +juniper +mercer +max123 +manny +massimo +mariposa +met2002 +reggae +ricky1 +1236 +1228 +1016 +all4one +arianna +baberuth +asgard +gonzales +484848 +5683 +6669 +catnip +chiquita +charisma +capslock +cashmone +chat +figure +galant +frenchy +gizmodo1 +girlies +gabby +garner +screwy +doubled +divers +dte4uw +done +dragonfl +maker +locks +rachelle +treble +twinkie +trailer +tropical +acid +crescent +cooking +cococo +cory +dabomb +daffy +dandfa +cyrano +nathanie +briggs +boners +helium +horton +hoffman +hellas +espresso +emperor +killa +kikimora +wanda +w4g8at +verona +ilikeit +iforget +1944 +20002000 +birthday1 +beatles1 +blue1 +bigdicks +beethove +blacklab +blazers +benny1 +woodwork +0069 +0101 +taffy +susie +survivor +swim +stokes +4567 +shodan +spoiled +steffen +pissed +pavlov +pinnacle +place +petunia +terrell +thirty +toni +tito +teenie +lemonade +lily +lillie +lalakers +lebowski +lalalala +ladyboy +jeeper +joyjoy +mercury1 +mantle +mannn +rocknrol +riversid +reeves +123aaa +11112222 +121314 +1021 +1004 +1120 +allen1 +ambers +amstel +ambrose +alice1 +alleycat +allegro +ambrosia +alley +australia +hatred +gspot +graves +goodsex +hattrick +harpoon +878787 +8inches +4wwvte +cassandr +charlie123 +case +chavez +fighting +gabriela +gatsby +fudge +gerry +generic +gareth +fuckme2 +samm +sage +seadog +satchmo +scxakv +santafe +dipper +dingle +dizzy +outoutout +madmad +london1 +qbg26i +pussy123 +randolph +vaughn +tzpvaw +vamp +comedy +comp +cowgirl +coldplay +dawgs +delaney +nt5d27 +novifarm +needles +notredam +newness +mykids +bryan1 +bouncer +hihihi +honeybee +iceman1 +herring +horn +hook +hotlips +dynamo +klaus +kittie +kappa +kahlua +muffy +mizzou +mohamed +musical +wannabe +wednesda +whatup +weller +waterfal +willy1 +invest +blanche +bear1 +billabon +youknow +zelda +yyyyyy1 +zachary1 +01234567 +070462 +zurich +superstar +storms +tail +stiletto +strat +427900 +sigmachi +shelter +shells +sexy123 +smile1 +sophie1 +stefano +stayout +somerset +smithers +playmate +pinkfloyd +phish1 +payday +thebear +telefon +laetitia +kswbdu +larson +jetta +jerky +melina +metro +revoluti +retire +respect +1216 +1201 +1204 +1222 +1115 +archange +barry1 +handball +676767 +chandra +chewbacc +flesh +furball +gocubs +fruit +fullback +gman +gentle +dunbar +dewalt +dominiqu +diver1 +dhip6a +olemiss +ollie +mandrake +mangos +pretzel +pusssy +tripleh +valdez +vagabond +clean +comment +crew +clovis +deaths +dandan +csfbr5yy +deadspin +darrel +ninguna +noah +ncc74656 +bootsie +bp2002 +bourbon +brennan +bumble +books +hose +heyyou +houston1 +hemlock +hippo +hornets +hurricane +horseman +hogan +excess +extensa +muffin1 +virginie +werdna +idontknow +info +iron +jack1 +1bitch +151nxjmt +bendover +bmwbmw +bills +zaq123 +wxcvbn +surprise +supernov +tahoe +talbot +simona +shakur +sexyone +seviyi +sonja +smart1 +speed1 +pepito +phantom1 +playoffs +terry1 +terrier +laser1 +lite +lancia +johngalt +jenjen +jolene +midori +message +maserati +matteo +mental +miami1 +riffraff +ronald1 +reason +rhythm +1218 +1026 +123987 +1015 +1103 +armada +architec +austria +gotmilk +hawkins +gray +camila +camp +cambridg +charge +camero +flex +foreplay +getoff +glacier +glotest +froggie +gerbil +rugger +sanity72 +salesman +donna1 +dreaming +deutsch +orchard +oyster +palmtree +ophelia +pajero +m5wkqf +magenta +luckyone +treefrog +vantage +usmarine +tyvugq +uptown +abacab +aaaaaa1 +advance +chuck1 +delmar +darkange +cyclones +nate +navajo +nope +border +bubba123 +building +iawgk2 +hrfzlz +dylan1 +enrico +encore +emilio +eclipse1 +killian +kayleigh +mutant +mizuno +mustang2 +video1 +viewer +weed420 +whales +jaguar1 +insight +1990 +159159 +1love +bliss +bears1 +bigtruck +binder +bigboss +blitz +xqgann +yeahyeah +zeke +zardoz +stickman +table +3825 +signal +sentra +side +shiva +skipper1 +singapor +southpaw +sonora +squid +slamdunk +slimjim +placid +photon +placebo +pearl1 +test12 +therock1 +tiger123 +leinad +legman +jeepers +joeblow +mccarthy +mike23 +redcar +rhinos +rjw7x4 +1102 +13576479 +112211 +alcohol +gwju3g +greywolf +7bgiqk +7878 +535353 +4snz9g +candyass +cccccc1 +carola +catfight +cali +fister +fosters +finland +frankie1 +gizzmo +fuller +royalty +rugrat +sandie +rudolf +dooley +dive +doreen +dodo +drop +oemdlg +out3xf +paddy +opennow +puppy1 +qazwsxedc +pregnant +quinn +ramjet +under +uncle +abraxas +corner +creed +cocoa +crown +cows +cn42qj +dancer1 +death666 +damned +nudity +negative +nimda2k +buick +bobb +braves1 +brook +henrik +higher +hooligan +dust +everlast +karachi +mortis +mulligan +monies +motocros +wally1 +weapon +waterman +view +willie1 +vicki +inspiron +1test +2929 +bigblack +xytfu7 +yackwin +zaq1xsw2 +yy5rbfsc +100100 +0660 +tahiti +takehana +talks +332211 +3535 +sedona +seawolf +skydiver +shine +spleen +slash +spjfet +special1 +spooner +slimshad +sopranos +spock1 +penis1 +patches1 +terri +thierry +thething +toohot +large +limpone +johnnie +mash4077 +matchbox +masterp +maxdog +ribbit +reed +rita +rockin +redhat +rising +1113 +14789632 +1331 +allday +aladin +andrey +amethyst +ariel +anytime +baseball1 +athome +basil +goofy1 +greenman +gustavo +goofball +ha8fyp +goodday +778899 +charon +chappy +castillo +caracas +cardiff +capitals +canada1 +cajun +catter +freddy1 +favorite2 +frazier +forme +follow +forsaken +feelgood +gavin +gfxqx686 +garlic +sarge +saskia +sanjose +russ +salsa +dilbert1 +dukeduke +downhill +longhair +loop +locutus +lockdown +malachi +mamacita +lolipop +rainyday +pumpkin1 +punker +prospect +rambo1 +rainbows +quake +twin +trinity1 +trooper1 +aimee +citation +coolcat +crappy +default +dental +deniro +d9ungl +daddys +napoli +nautica +nermal +bukowski +brick +bubbles1 +bogota +board +branch +breath +buds +hulk +humphrey +hitachi +evans +ender +export +kikiki +kcchiefs +kram +morticia +montrose +mongo +waqw3p +wizzard +visited +whdbtp +whkzyc +image +154ugeiu +1fuck +binky +blind +bigred1 +blubber +benz +becky1 +year2005 +wonderfu +wooden +xrated +0001 +tampabay +survey +tammy1 +stuffer +3mpz4r +3000 +3some +selina +sierra1 +shampoo +silk +shyshy +slapnuts +standby +spartan1 +sprocket +sometime +stanley1 +poker1 +plus +thought +theshit +torture +thinking +lavalamp +light1 +laserjet +jediknig +jjjjj1 +jocelyn +mazda626 +menthol +maximo +margaux +medic1 +release +richter +rhino1 +roach +renate +repair +reveal +1209 +1234321 +amigos +apricot +alexandra +asdfgh1 +hairball +hatter +graduate +grimace +7xm5rq +6789 +cartoons +capcom +cheesy +cashflow +carrots +camping +fanatic +fool +format +fleming +girlie +glover +gilmore +gardner +safeway +ruthie +dogfart +dondon +diapers +outsider +odin +opiate +lollol +love12 +loomis +mallrats +prague +primetime21 +pugsley +program +r29hqq +touch +valleywa +airman +abcdefg1 +darkone +cummer +dempsey +damn +nadia +natedogg +nineball +ndeyl5 +natchez +newone +normandy +nicetits +buddy123 +buddys +homely +husky +iceland +hr3ytm +highlife +holla +earthlin +exeter +eatmenow +kimkim +karine +k2trix +kernel +kirkland +money123 +moonman +miles1 +mufasa +mousey +wilma +wilhelm +whites +warhamme +instinct +jackass1 +2277 +20spanks +blobby +blair +blinky +bikers +blackjack +becca +blue23 +xman +wyvern +085tzzqi +zxzxzx +zsmj2v +suede +t26gn4 +sugars +sylvie +tantra +swoosh +swiss +4226 +4271 +321123 +383pdjvl +shoe +shane1 +shelby1 +spades +spain +smother +soup +sparhawk +pisser +photo1 +pebble +phones +peavey +picnic +pavement +terra +thistle +tokyo +therapy +lives +linden +kronos +lilbit +linux +johnston +material +melanie1 +marbles +redlight +reno +recall +1208 +1138 +1008 +alchemy +aolsucks +alexalex +atticus +auditt +ballet +b929ezzh +goodyear +hanna +griffith +gubber +863abgsg +7474 +797979 +464646 +543210 +4zqauf +4949 +ch5nmk +carlito +chewey +carebear +caleb +checkmat +cheddar +chachi +fever +forgetit +fine +forlife +giants1 +gates +getit +gamble +gerhard +galileo +g3ujwg +ganja +rufus1 +rushmore +scouts +discus +dudeman +olympus +oscars +osprey +madcow +locust +loyola +mammoth +proton +rabbit1 +question +ptfe3xxp +pwxd5x +purple1 +punkass +prophecy +uyxnyd +tyson1 +aircraft +access99 +abcabc +cocktail +colts +civilwar +cleveland +claudia1 +contour +clement +dddddd1 +cypher +denied +dapzu455 +dagmar +daisydog +name +noles +butters +buford +hoochie +hotel +hoser +eddy +ellis +eldiablo +kingrich +mudvayne +motown +mp8o6d +wife +vipergts +italiano +innocent +2055 +2211 +beavers +bloke +blade1 +yamato +zooropa +yqlgr667 +050505 +zxcvbnm1 +zw6syj +suckcock +tango1 +swing +stern +stephens +swampy +susanna +tammie +445566 +333666 +380zliki +sexpot +sexylady +sixtynin +sickboy +spiffy +sleeping +skylark +sparkles +slam +pintail +phreak +places +teller +timtim +tires +thighs +left +latex +llamas +letsdoit +lkjhg +landmark +letters +lizzard +marlins +marauder +metal1 +manu +register +righton +1127 +alain +alcat +amigo +basebal1 +azertyui +attract +azrael +hamper +gotenks +golfgti +gutter +hawkwind +h2slca +harman +grace1 +6chid8 +789654 +canine +casio +cazzo +chamber +cbr900 +cabrio +calypso +capetown +feline +flathead +fisherma +flipmode +fungus +goal +g9zns4 +full +giggle +gabriel1 +fuck123 +saffron +dogmeat +dreamcas +dirtydog +dunlop +douche +dresden +dickdick +destiny1 +pappy +oaktree +lydia +luft4 +puta +prayer +ramada +trumpet1 +vcradq +tulip +tracy71 +tycoon +aaaaaaa1 +conquest +click +chitown +corps +creepers +constant +couples +code +cornhole +danman +dada +density +d9ebk7 +cummins +darth +cute +nash +nirvana1 +nixon +norbert +nestle +brenda1 +bonanza +bundy +buddies +hotspur +heavy +horror +hufmqw +electro +erasure +enough +elisabet +etvww4 +ewyuza +eric1 +kinder +kenken +kismet +klaatu +musician +milamber +willi +waiting +isacs155 +igor +1million +1letmein +x35v8l +yogi +ywvxpz +xngwoj +zippy1 +020202 +**** +stonewal +sweeney +story +sentry +sexsexsex +spence +sonysony +smirnoff +star12 +solace +sledge +states +snyder +star1 +paxton +pentagon +pkxe62 +pilot1 +pommes +paulpaul +plants +tical +tictac +toes +lighthou +lemans +kubrick +letmein22 +letmesee +jys6wz +jonesy +jjjjjj1 +jigga +joelle +mate +merchant +redstorm +riley1 +rosa +relief +14141414 +1126 +allison1 +badboy1 +asthma +auggie +basement +hartley +hartford +hardwood +gumbo +616913 +57np39 +56qhxs +4mnveh +cake +forbes +fatluvr69 +fqkw5m +fidelity +feathers +fresno +godiva +gecko +gladys +gibson1 +gogators +fridge +general1 +saxman +rowing +sammys +scotts +scout1 +sasasa +samoht +dragon69 +ducky +dragonball +driller +p3wqaw +nurse +papillon +oneone +openit +optimist +longshot +portia +rapier +pussy2 +ralphie +tuxedo +ulrike +undertow +trenton +copenhag +come +delldell +culinary +deltas +mytime +nicky +nickie +noname +noles1 +bucker +bopper +bullock +burnout +bryce +hedges +ibilltes +hihje863 +hitter +ekim +espana +eatme69 +elpaso +envelope +express1 +eeeeee1 +eatme1 +karaoke +kara +mustang5 +misses +wellingt +willem +waterski +webcam +jasons +infinite +iloveyou! +jakarta +belair +bigdad +beerme +yoshi +yinyang +zimmer +x24ik3 +063dyjuy +0000007 +ztmfcq +stopit +stooges +survival +stockton +symow8 +strato +2hot4u +ship +simons +skins +shakes +sex1 +shield +snacks +softtail +slimed123 +pizzaman +pipe +pitt +pathetic +pinto +tigercat +tonton +lager +lizzy +juju +john123 +jennings +josiah +jesse1 +jordon +jingles +martian +mario1 +rootedit +rochard +redwine +requiem +riverrat +rats +1117 +1014 +1205 +althea +allie +amor +amiga +alpina +alert +atreides +banana1 +bahamut +hart +golfman +happines +7uftyx +5432 +5353 +5151 +4747 +byron +chatham +chadwick +cherie +foxfire +ffvdj474 +freaked +foreskin +gayboy +gggggg1 +glenda +gameover +glitter +funny1 +scoobydoo +scroll +rudolph +saddle +saxophon +dingbat +digimon +omicron +parsons +ohio +panda1 +loloxx +macintos +lululu +lollypop +racer1 +queen1 +qwertzui +prick +upnfmc +tyrant +trout1 +9skw5g +aceman +adelaide +acls2h +aaabbb +acapulco +aggie +comcast +craft +crissy +cloudy +cq2kph +custer +d6o8pm +cybersex +davecole +darian +crumbs +daisey +davedave +dasani +needle +mzepab +myporn +narnia +nineteen +booger1 +bravo1 +budgie +btnjey +highlander +hotel6 +humbug +edwin +ewtosi +kristin1 +kobe +knuckles +keith1 +katarina +muff +muschi +montana1 +wingchun +wiggle +whatthe +walking +watching +vette1 +vols +virago +intj3a +ishmael +intern +jachin +illmatic +199999 +2010 +beck +blender +bigpenis +bengal +blue1234 +your +zaqxsw +xray +xxxxxxx1 +zebras +yanks +worlds +tadpole +stripes +svetlana +3737 +4343 +3728 +4444444 +368ejhih +solar +sonne +smalls +sniffer +sonata +squirts +pitcher +playstation +pktmxr +pescator +points +texaco +lesbos +lilian +l8v53x +jo9k2jw2 +jimbeam +josie +jimi +jupiter2 +jurassic +marines1 +maya +rocket1 +ringer +14725836 +12345679 +1219 +123098 +1233 +alessand +althor +angelika +arch +armando +alpha123 +basher +barefeet +balboa +bbbbb1 +banks +badabing +harriet +gopack +golfnut +gsxr1000 +gregory1 +766rglqy +8520 +753159 +8dihc6 +69camaro +666777 +cheeba +chino +calendar +cheeky +camel1 +fishcake +falling +flubber +giuseppe +gianni +gloves +gnasher23 +frisbee +fuzzy1 +fuzzball +sauce +save13tx +schatz +russell1 +sandra1 +scrotum +scumbag +sabre +samdog +dripping +dragon12 +dragster +paige +orwell +mainland +lunatic +lonnie +lotion +maine +maddux +qn632o +poophead +rapper +porn4life +producer +rapunzel +tracks +velocity +vanessa1 +ulrich +trueblue +vampire1 +abacus +902100 +crispy +corky +crane +chooch +d6wnro +cutie +deal +dabulls +dehpye +navyseal +njqcw4 +nownow +nigger1 +nightowl +nonenone +nightmar +bustle +buddy2 +boingo +bugman +bulletin +bosshog +bowie +hybrid +hillside +hilltop +hotlegs +honesty +hzze929b +hhhhh1 +hellohel +eloise +evilone +edgewise +e5pftu +eded +embalmer +excalibur +elefant +kenzie +karl +karin +killah +kleenex +mouses +mounta1n +motors +mutley +muffdive +vivitron +winfield +wednesday +w00t88 +iloveit +jarjar +incest +indycar +17171717 +1664 +17011701 +222777 +2663 +beelch +benben +yitbos +yyyyy1 +yasmin +zapata +zzzzz1 +stooge +tangerin +taztaz +stewart1 +summer69 +sweetness +system1 +surveyor +stirling +3qvqod +3way +456321 +sizzle +simhrq +shrink +shawnee +someday +sparty +ssptx452 +sphere +spark +slammed +sober +persian +peppers +ploppy +pn5jvw +poobear +pianos +plaster +testme +tiff +thriller +larissa +lennox +jewell +master12 +messier +rockey +1229 +1217 +1478 +1009 +anastasi +almighty +amonra +aragon +argentin +albino +azazel +grinder +6uldv8 +83y6pv +8888888 +4tlved +515051 +carsten +changes +flanders +flyers88 +ffffff1 +firehawk +foreman +firedog +flashman +ggggg1 +gerber +godspeed +galway +giveitup +funtimes +gohan +giveme +geryfe +frenchie +sayang +rudeboy +savanna +sandals +devine +dougal +drag0n +dga9la +disaster +desktop +only +onlyone +otter +pandas +mafia +lombard +luckys +lovejoy +lovelife +manders +product +qqh92r +qcmfd454 +pork +radar1 +punani +ptbdhw +turtles +undertaker +trs8f7 +tramp +ugejvp +abba +911turbo +acdc +abcd123 +clever +corina +cristian +create +crash1 +colony +crosby +delboy +daniele +davinci +daughter +notebook +niki +nitrox +borabora +bonzai +budd +brisbane +hotter +heeled +heroes +hooyah +hotgirl +i62gbq +horse1 +hills +hpk2qc +epvjb6 +echo +korean +kristie +mnbvc +mohammad +mind +mommy1 +munster +wade +wiccan +wanted +jacket +2369 +bettyboo +blondy +bismark +beanbag +bjhgfi +blackice +yvtte545 +ynot +yess +zlzfrh +wolvie +007bond +****** +tailgate +tanya1 +sxhq65 +stinky1 +3234412 +3ki42x +seville +shimmer +sheryl +sienna +shitshit +skillet +seaman +sooners1 +solaris +smartass +pastor +pasta +pedros +pennywis +pfloyd +tobydog +thetruth +lethal +letme1n +leland +jenifer +mario66 +micky +rocky2 +rewq +ripped +reindeer +1128 +1207 +1104 +1432 +aprilia +allstate +alyson +bagels +basic +baggies +barb +barrage +greatest +gomez +guru +guard +72d5tn +606060 +4wcqjn +caldwell +chance1 +catalog +faust +film +flange +fran +fartman +geil +gbhcf2 +fussball +glen +fuaqz4 +gameboy +garnet +geneviev +rotary +seahawk +russel +saab +seal +samadams +devlt4 +ditto +drevil +drinker +deuce +dipstick +donut +octopus +ottawa +losangel +loverman +porky +q9umoz +rapture +pump +pussy4me +university +triplex +ue8fpw +trent +trophy +turbos +troubles +agent +aaa340 +churchil +crazyman +consult +creepy +craven +class +cutiepie +ddddd1 +dejavu +cuxldv +nettie +nbvibt +nikon +niko +norwood +nascar1 +nolan +bubba2 +boobear +boogers +buff +bullwink +bully +bulldawg +horsemen +escalade +editor +eagle2 +dynamic +ella +efyreg +edition +kidney +minnesot +mogwai +morrow +msnxbi +moonlight +mwq6qlzo +wars +werder +verygood +voodoo1 +wheel +iiiiii1 +159951 +1624 +1911a1 +2244 +bellagio +bedlam +belkin +bill1 +woodrow +xirt2k +worship +?????? +tanaka +swift +susieq +sundown +sukebe +tales +swifty +2fast4u +senate +sexe +sickness +shroom +shaun +seaweed +skeeter1 +status +snicker +sorrow +spanky1 +spook +patti +phaedrus +pilots +pinch +peddler +theo +thumper1 +tessie +tiger7 +tmjxn151 +thematri +l2g7k3 +letmeinn +lazy +jeffjeff +joan +johnmish +mantra +mariana +mike69 +marshal +mart +mazda6 +riptide +robots +rental +1107 +1130 +142857 +11001001 +1134 +armored +alvin +alec +allnight +alright +amatuers +bartok +attorney +astral +baboon +bahamas +balls1 +bassoon +hcleeb +happyman +granite +graywolf +golf1 +gomets +8vjzus +7890 +789123 +8uiazp +5757 +474jdvff +551scasi +50cent +camaro1 +cherry1 +chemist +final +firenze +fishtank +farrell +freewill +glendale +frogfrog +gerhardt +ganesh +same +scirocco +devilman +doodles +dinger +okinawa +olympic +nursing +orpheus +ohmygod +paisley +pallmall +null +lounge +lunchbox +manhatta +mahalo +mandarin +qwqwqw +qguvyt +pxx3eftp +president +rambler +puzzle +poppy1 +turk182 +trotter +vdlxuc +trish +tugboat +valiant +tracie +uwrl7c +chris123 +coaster +cmfnpu +decimal +debbie1 +dandy +daedalus +dede +natasha1 +nissan1 +nancy123 +nevermin +napalm +newcastle +boats +branden +britt +bonghit +hester +ibxnsm +hhhhhh1 +holger +durham +edmonton +erwin +equinox +dvader +kimmy +knulla +mustafa +monsoon +mistral +morgana +monica1 +mojave +month +monterey +mrbill +vkaxcs +victor1 +wacker +wendell +violator +vfdhif +wilson1 +wavpzt +verena +wildstar +winter99 +iqzzt580 +jarrod +imback +1914 +19741974 +1monkey +1q2w3e4r5t +2500 +2255 +blank +bigshow +bigbucks +blackcoc +zoomer +wtcacq +wobble +xmen +xjznq5 +yesterda +yhwnqc +zzzxxx +streak +393939 +2fchbg +skinhead +skilled +shakira +shaft +shadow12 +seaside +sigrid +sinful +silicon +smk7366 +snapshot +sniper1 +soccer11 +staff +slap +smutty +peepers +pleasant +plokij +pdiddy +pimpdaddy +thrust +terran +topaz +today1 +lionhear +littlema +lauren1 +lincoln1 +lgnu9d +laughing +juneau +methos +medina +merlyn +rogue1 +romulus +redshift +1202 +1469 +12locked +arizona1 +alfarome +al9agd +aol123 +altec +apollo1 +arse +baker1 +bbb747 +bach +axeman +astro1 +hawthorn +goodfell +hawks1 +gstring +hannes +8543852 +868686 +4ng62t +554uzpad +5401 +567890 +5232 +catfood +frame +flow +fire1 +flipflop +fffff1 +fozzie +fluff +garrison +fzappa +furious +round +rustydog +sandberg +scarab +satin +ruger +samsung1 +destin +diablo2 +dreamer1 +detectiv +dominick +doqvq3 +drywall +paladin1 +papabear +offroad +panasonic +nyyankee +luetdi +qcfmtz +pyf8ah +puddles +privacy +rainer +pussyeat +ralph1 +princeto +trivia +trewq +tri5a3 +advent +9898 +agyvorc +clarkie +coach1 +courier +contest +christo +corinna +chowder +concept +climbing +cyzkhw +davidb +dad2ownu +days +daredevi +de7mdf +nose +necklace +nazgul +booboo1 +broad +bonzo +brenna +boot +butch1 +huskers1 +hgfdsa +hornyman +elmer +elektra +england1 +elodie +kermit1 +knife +kaboom +minute +modern +motherfucker +morten +mocha +monday1 +morgoth +ward +weewee +weenie +walters +vorlon +website +wahoo +ilovegod +insider +jayman +1911 +1dallas +1900 +1ranger +201jedlz +2501 +1qaz +bertram +bignuts +bigbad +beebee +billows +belize +bebe +wvj5np +wu4etd +yamaha1 +wrinkle5 +zebra1 +yankee1 +zoomzoom +09876543 +0311 +????? +stjabn +tainted +3tmnej +shoot +skooter +skelter +sixteen +starlite +smack +spice1 +stacey1 +smithy +perrin +pollux +peternorth +pixie +paulina +piston +pick +poets +pine +toons +tooth +topspin +kugm7b +legends +jeepjeep +juliana +joystick +junkmail +jojojojo +jonboy +judge +midland +meteor +mccabe +matter +mayfair +meeting +merrill +raul +riches +reznor +rockrock +reboot +reject +robyn +renee1 +roadway +rasta220 +1411 +1478963 +1019 +archery +allman +andyandy +barks +bagpuss +auckland +gooseman +hazmat +gucci +guns +grammy +happydog +greek +7kbe9d +7676 +6bjvpe +5lyedn +5858 +5291 +charlie2 +chas +c7lrwu +candys +chateau +ccccc1 +cardinals +fear +fihdfv +fortune12 +gocats +gaelic +fwsadn +godboy +gldmeo +fx3tuo +fubar1 +garland +generals +gforce +rxmtkp +rulz +sairam +dunhill +division +dogggg +detect +details +doll +drinks +ozlq6qwm +ov3ajy +lockout +makayla +macgyver +mallorca +loves +prima +pvjegu +qhxbij +raphael +prelude1 +totoro +tusymo +trousers +tunnel +valeria +tulane +turtle1 +tracy1 +aerosmit +abbey1 +address +clticic +clueless +cooper1 +comets +collect +corbin +delpiero +derick +cyprus +dante1 +dave1 +nounours +neal +nexus6 +nero +nogard +norfolk +brent1 +booyah +bootleg +buckaroo +bulls23 +bulls1 +booper +heretic +icecube +hellno +hounds +honeydew +hooters1 +hoes +howie +hevnm4 +hugohugo +eighty +epson +evangeli +eeeee1 +eyphed +picture1 +senha +Million2 +aaron431 +qqww1122 +123 +omgpop +qwer123456 +chatbooks +20100728 +jacket025 +evite +5201314 +Bangbang123 +jobandtalent +ohmnamah23 +12345678910 +zing +147258369 +a123456789 +789456123 +anhyeuem +lol123 +6655321 +maggieown +123456789a +password123 +686584 +25251325 +princess1 +a801016 +yugioh +x4ivygA51F +00000000 +jakcgt333 +babygirl1 +10203 +123456b +Sample123 +b123456 +1111111111 +firebird +0 +alejandra +alejandro +beatriz +password12 +tequiero +twitter +covfefe +yourefired +maga2020! + +klaster +gfhjkm +q1w2e3r4t5 +ghbdtn +Password +razz +bandit +123456q +4815162342 +01012011 +315475 +minecraft +sergey +0987654321 +12345q +qweasdzxc +1232323q +12345qwert +ruslan +1234554321 +Usuckballz1 +vfhbyf +oksana +PASSWORD +rasdzv3 +123123a +9379992 +yfnfif +123654789 +fylhtq +kirill +741852963 +serega +fktrcfylh +147852369 +12312 +vfrcbv +galina +qqq111 +123456789q +01011980 +polina +fyfcnfcbz +maksim +1029384756 +01011 +01012000 +cjkysirj +123qweasd +nastya +hacker +viktor +natali +dbrnjhbz +Soso123aljg +123qweasdzxc +lolita +999999999 +nfnmzyf +cthutq +elena +dfvgbh +valentina +hjvfirf +blahblah +01011990 +qazwsx123 +fatboy +141627 +hesoyam +larisa +valera +1qaz2wsx3edc +0123456789 +irina +pornstar +trfnthbyf +caserta +123qwe123 +q12345 +ybrbnf +vfvjxrf +q1w2e3r4t5y6 +poiuyt +123454321 +spartak +Exigen +65432 +fktrctq +qazxswedc +adgjmptw +1123581321 +andrei +ghbdtnbr +olga +7895123 +super123 +aleksandr +rhbcnbyf +flatron +01012010 +cdtnkfyf +1q1q1q +gn56gn56 +111222333 +cjkywt +rfrfirf +privet +1q2w3e4r5t6y +denis +456852 +147896325 +shaney14 +qwerty12345 +123321123 +1234567a +princes +192837465 +cracker +ekaterina +123698745 +1234512345 +kolobok +123456z +12369874 +Mailcreated5240 +258456 +ghjcnj +Michael +0000000 +tamara +rjntyjr +123qaz +rulez +lvbnhbq +1122334455 +anastasia +123zxc +19921992 +vfhecz +sobaka +nuttertools +dkflbvbh +6751520 +12121 +aspirine +aezakmi +1234567q +mersedes +sergei +01012001 +rammstein +katerina +qazwsxedcrfv +margarita +abc12 +zxcv1234 +cxfcnmt +a1s2d3f4 +Dragon +123321q +Software +qawsedrf +Exigent +123456qwerty +tatyana +kaktus +1234567890q +napass +906090 +q1q1q1 +ivanov +Passw0rd +8J4yE3Uz +19871987 +0000000000 +moloko +drago +19891989 +qwerty123456 +01011991 +15426378 +132435 +qwertyuio +1366613 +111111111 +rbhbkk +5555555555 +gjkbyf +viktoria +terminator +19751975 +12332 +romashka +sterlin +kotenok +gbpltw +9876543210 +vkontakte +19851985 +vfrcbvrf +svetik +agent007 +19911991 +01011985 +sabina +73501505 +123456k +zvezda +microlab +jrcfyf +function +19941994 +01011970 +vladik +SaUn +titties +danila +128500 +zxcasd +warhammer +iloveyo +dthjybrf +Password1 +321654987 +1qaz1qaz +1234qwe +01011981 +tdutybq +pokemon1 +pantyhos +daniil +Thomas +19861986 +01011986 +rjirfrgbde +123456789z +rfnthbyf +bogdan +azamat +Turkey50 +Jennifer +giorgi +azsxdcfv +arjay +19931993 +19901990 +poiuytrewq +150781 +rereirf +movies +19831983 +danie +19951995 +13243546 +123456aa +Check +1Passwor +zxcasdqwe +vfvekz +rfhbyf +Sojdlg123aljg +963852741 +321456 +rustam +rfrnec +milana +fernand +rastaman +oleg +number1 +dfkthbz +charli +vfksirf +609609609 +162534 +shado +knopka +1qa2ws3ed +135246 +123789456 +122333 +p0015123 +milena +koshka +crysis +7753191 +20102010 +123123q +12131415 +vladislav +vfczyz +karolina +dfkthf +barsik +Translator +789789789 +vitalik +qwer123 +pupsik +nikola +kickass +01011989 +malina +gabrie +dinamo +asdasdasd +xbox360 +fktrcfylhf +2128506 +123456r +01011988 +z1x2c3 +multiplelo +Computer +555777 +19721972 +mamapapa +ghjcnjnfr +solnce +skorpion +samara +rctybz +lkjhgfdsa +ktyjxrf +ivanova +192837 +q123456 +compute +boomboom +Robert +Passwor1 +777888 +12345z +01011987 +01011984 +19881988 +vfvfgfgf +rtyuehe +fghtkm +deniska +cambiami +Shadow +19731973 +070707 +03082006 +02071986 +vfhufhbnf +rabota +motherlode +lokomotiv +kostya +gegcbr +12345678q +qazwsx12 +10203040 +01011910 +ybrjkfq +steam +sasuke +rules +Superman +sersolution +rhfcjnrf +qwerty1234 +montgom240 +hacked +dkflbckfd +dfktynbyf +albina +19821982 +19811981 +12qw34er +123qwerty +10101 +080808 +salamander +michell +artur +1q2w3e4r5 +125125 +123451 +ufkbyf +superman1 +sunshin +qwertyqwerty +monke +changed +a1s2d3 +Master +784512 +235689 +19411945 +11223 +01091989 +01011992 +sex +runescape +crjhgbjy +alina +787898 +02071982 +viewsonic +spongebob +mazafaka +footbal +135792468 +12345qwe +01011975 +zxasqw12 +pobeda +mishka +leonid +kosmos +jessic +gfhjkm123 +123456s +123456654321 +01011993 +sacred +heckfy +cfitymrf +blablabla +aleksey +Pussy1 +Charlie +12301230 +syncmaster +aleksandra +19961996 +19791979 +02091987 +02021987 +maste +marin +Michelle +19801980 +147369 +12qwas +02081988 +02051986 +02041986 +02011985 +01011977 +valeri +rjycnfynby +rhtdtlrj +dbrnjh +andromeda +a1a1a1 +12345678a +12011987 +02101985 +02031986 +02021988 +tinkerbell +satana +qazzaq +nikolay +ghostrider +cgfhnfr +Jessica +794613 +654123 +02061985 +02011987 +svoboda +realmadrid +nokia6300 +marika +madina +antoni +PolniyPizdec0211 +369963 +1357924680 +12qw12 +1236987 +111333 +02091986 +02021986 +01011983 +000111 +jktymrf +inuyasha +bagira +7uGd5HIp2J +1qaz2ws +123321a +02081987 +02081984 +02061986 +02021984 +01011982 +willia +venera +sveta +qweqweqwe +leavemealone +fytxrf +02031984 +02021985 +xxxpass +michae +mamama +ghblehjr +armagedon +alenka +ABC123 +987456321 +21031988 +123qq123 +12345t +1234567890a +123455 +02081989 +02011986 +01020304 +01011999 +petrov +myname +foryou +Harley +19771977 +19761976 +02061989 +02041984 +yfnfkmz +teddybear +samtron +pdtplf +ntktajy +microphone +asdfzxcv +DRAGON +147963 +02021983 +vadim +ludmila +kakashka +gfhjkmgfhjkm +gfhjkm1 +fyutkbyf +claudi +carolin +artem +9562876 +159632 +15151515 +123456qw +1234567891 +02051983 +02041983 +02031987 +02021989 +z1x2c3v4 +vSjasnel12 +q2w3e4r5 +lineage2 +fuckyo +fgtkmcby +dfcbkbq +argentina +15975 +11221122 +02081986 +02041988 +02041987 +02041982 +02011988 +vasilisa +qazwsx1 +nicol +a11111 +PUSSY +12365 +02101984 +02081985 +02071984 +02011980 +010180 +01011979 +zaraza +slavik +jorda +bhbirf +Richard +BASEBALL +123465 +111111a +02021982 +tdutybz +samsun +persik +orient +mamamama +alex123 +998877 +12365478 +02061988 +02031985 +yfcntymrf +vfibyf +thoma +piramida +elizaveta +dialog +asddsa +HARLEY +69696 +258852 +147741 +1234asdf +02081982 +02051982 +zalupa +universal +sunflower +strawberry +stepan +ltybcrf +lena +artemka +Buster +Andrew +369258 +225588 +1z2x3c +1a2s3d4f +123456qwe +02061980 +02031982 +02011984 +zaqxswcde +violetta +tuning +sophi +rjhjktdf +nightmare +iloveme +drakon +download +Jordan +9293709b13 +369852 +1qa2ws +1Pussy +1234560 +1000000 +02091983 +02061987 +01081989 +yjdsqgfhjkm +rhjrjlbk +qazwsxedc123 +nevermind +mari +321321321 +12051988 +111qqq +05051987 +02101989 +02101987 +02071987 +02071980 +02041985 +stanislav +q1q2q3 +kfhbcf +hjccbz +happiness +georg +cdtnbr +RuleZ +19711971 +134679852 +123qw +123000 +02091984 +02091981 +02091980 +02061983 +02041981 +01011900 +zhjckfd +zazaza +webhompas +qwer12 +pineapple +nikitos +mihail +maksimka +loveless +kleopatra +kamila +MICHAEL +78945 +333777 +22041987 +2008 +20022002 +153624 +111111q +05051985 +02081977 +02071988 +02051988 +02051987 +02041979 +sergi +radiohead +pavel +kjkszpj +evolution +ctrhtn +cthtuf +a1a2a3 +a12345678 +Michael1 +Good123654 +26061987 +15051981 +08031986 +060606 +02061984 +02061982 +02051989 +02051984 +02031981 +super12 +patric +Football +9876543 +987123 +7894561230 +786786 +21031987 +13041988 +1234qw +123456l +111000 +11051987 +10011986 +06061986 +02091985 +02021981 +02021979 +01031988 +vjcrdf +salome +renata +kjrjvjnbd +killer12 +harrypotter +basebal +amerika +135791 +02101986 +02081983 +02041989 +02011989 +01011978 +zxcvbnm123 +welcom +vera +superma +mypassword +milan +mama123 +krasotka +koroleva +jennife +habibi +francesco +fabric +Stone55 +74108520 +45M2DO5BS +30051985 +258258 +24061986 +22021989 +21011989 +20061988 +1z2x3c4v +14061991 +13041987 +123456m +12021988 +11081989 +03041991 +02071981 +02031979 +02021976 +01061990 +01011960 +stasik +hellboy +gbhfvblf +freebird +asdfgh01 +alessandro +abrakadabra +ROBERT +Horny +7777777777 +23456789 +23041987 +19701970 +18011987 +172839 +123456789s +07071987 +02091989 +02071989 +02071983 +02021973 +02011981 +01121986 +01071986 +wapbbs +viktoriya +varvara +underground +undead +nfytxrf +moskva +marianna +maggi +kissmyass +ghjcnjgfhjkm +dindom +chiara +alexey +Master1 +JORDAN +FOOTBALL +45678 +28041987 +25081988 +24011985 +20111986 +19651965 +19101987 +19061987 +14111986 +13031987 +123ewq +123456123 +12121990 +112112 +10071987 +10031988 +02101988 +02081980 +02021990 +01091987 +01041985 +01011995 +olesya +medion +markiz +james123 +ijrjkfl +Dragon1 +Daniel +987321 +28021992 +25800852 +22011988 +19971997 +17051988 +14021985 +13061986 +12121985 +11061985 +10101986 +10051987 +10011990 +09051945 +08121986 +04041991 +03041986 +02101983 +02101981 +02031989 +02031980 +01121988 +tatarin +qwerty11 +qweasd123 +parol +klaste +ghjuhfvvf +foreve +azazaz +anastasiya +456456456 +415263 +30041986 +29071983 +29051989 +29011985 +28021990 +28011987 +27061988 +25121987 +25031987 +22021986 +21031990 +20091991 +20031987 +19681968 +17061988 +16051989 +16051987 +11051990 +100500 +08051990 +05051989 +04041988 +02051980 +02051976 +02041980 +02031977 +02011983 +01061986 +01041988 +01011994 +zxcasdqwe123 +vfitymrf +sekret +sasha_007 +qwert12345 +notused +noname123 +marseille +mamamia +letmei +kalina +irinka +fabie +asdqwe +anthon +amorcit +MUSTANG +31011987 +30031988 +224466 +22071986 +21101986 +21051991 +20091988 +2009 +20051988 +19661966 +18091985 +18061990 +15101986 +15051990 +15011987 +13121985 +12qw12qw +1234123 +12031987 +12031985 +11121986 +08081988 +08031985 +03031986 +02101979 +02071979 +02071978 +02051985 +02051978 +02051973 +02041975 +02041974 +02031988 +02011982 +01031989 +01011974 +zoloto +w_pass +popova +marti +fantomas +capricorn +bigbang +angel123 +Salsero +Kordell1 +Hunter +George +Baseball +999666 +3x7PxR +357357 +30041987 +27081990 +26031988 +258369 +25091987 +25041988 +24111989 +23021986 +22041988 +22031984 +21051988 +17011987 +16121987 +15021985 +14021986 +13021990 +12345qw +123456ru +10101990 +10041986 +07091990 +02051981 +01031985 +01021990 +yfnfkb +vitamin +valentine +tigge +rober +rfvfcenhf +qazws +pufunga7782 +pizdec +nikolai +lineage +korova +isabell +franc +dominik +david123 +WP2003WP +Beast1 +741963 +654654 +357159 +345678 +31031988 +25091990 +25011990 +24111987 +23031990 +22061988 +21011991 +21011988 +19283746 +19031985 +19011989 +18091986 +17111985 +16051988 +15071987 +145236 +14081985 +132456 +13071984 +12081985 +11021985 +10071988 +09021988 +05061990 +02051972 +02041978 +02031983 +01091985 +01031984 +010191 +01012009 +wormix +wertyu +vjqgfhjkm +slimshady +qwedsa +q11111 +petrova +krolik +kille +hejsan +glamour +ghbywtccf +ghbdtn123 +dmitriy +dkflbr +chelse +assasin +acmilan +Princess +Maverick +7896321 +30081984 +258963 +25101988 +23051985 +23041986 +23021989 +22121987 +22091988 +22071987 +22021988 +2006 +20052005 +19051987 +15041988 +15011985 +14021990 +14011986 +13051987 +13011988 +13011987 +12345s +12061988 +12041988 +12041986 +11111q +11071988 +11031988 +10081989 +08081986 +07071990 +07071977 +05071984 +04041983 +03021986 +02091988 +02081976 +02051977 +02031978 +01071987 +01041987 +01011976 +vjkjrj +vendetta +tkbpfdtnf +telephone +qwe123qwe +portal +passes +nautilus +murzik +medved +marseill +gtnhjdbx +godlike +ghhh47hj7649 +fkbyjxrf +bismillah +ashle +Patrick +Misfit99 +Letmein1 +858585 +333444 +30041985 +29071985 +29061990 +27071987 +27061985 +27041990 +26031990 +24031988 +23051990 +22011986 +21061986 +20121989 +20092009 +20091986 +20081991 +20041988 +20041986 +19671967 +19121989 +19061990 +18101987 +18051988 +18041986 +18021984 +17101986 +17061989 +17041991 +16021990 +15071988 +15071986 +14101987 +135798642 +13061987 +1234zxcv +12321 +12071989 +11121985 +11061991 +10121987 +101101 +10101985 +10031987 +100200 +09041987 +09031988 +06041988 +05071988 +03081989 +02071985 +02071975 +01051989 +01041992 +01041990 +zarina +volkov +vlad +vbkfirf +samira +roma +qazxcv +q2w3e4 +peppe +money12 +konstantin +k.lvbkf +johncena +dinara +cevthrb +amand +alexandre +Qwerty1 +Password123 +9999999999 +875421 +30011985 +29051985 +26061985 +25111987 +25071990 +22081986 +22061989 +21061985 +20082008 +20021988 +1a2s3d +19981998 +16051985 +15111988 +15051985 +15021990 +147896 +14041988 +123567 +12345qwerty +12121988 +12051990 +12051986 +12041990 +11091989 +11051986 +11051984 +10061986 +06081987 +06021987 +04041990 +02081981 +02061977 +02041977 +02031975 +01121987 +01061988 +01031986 +01021989 +01021988 +vehpbr +vampir +timosha +suckmydick +stratfor +steaua +simsim +nokian73 +mariya +ksusha +hellokitty +hallo123 +dfktynby +derparol +cvthnm +cleopatra +buste +barselona +asdqwe123 +americ +adgjmp +aaasss +357951 +29061989 +28051987 +27081986 +25061985 +25011986 +24091986 +24061988 +24031990 +21081987 +21041992 +20031991 +2001112 +19061985 +18111987 +18021988 +17071989 +17031987 +16051990 +15021986 +14031988 +14021987 +14011989 +120120 +111999 +111777 +11011990 +10011983 +09021989 +07051990 +06051986 +05091988 +05081988 +04061986 +04041985 +03041980 +02101976 +02071976 +02061976 +02011975 +01031983 +zasada +sterva +rfhnjirf +qqqqq1 +platon +paolo +nbvjatq +navigator +millenium +max333 +maveric +matthe +marijuana +lfybbk +klizma +kfgjxrf +joshu +jktxrf +irishka +ilove +hunte +htubcnhfwbz +gerrard +fktyrf +facebook +darkangel +antonina +amore +alena +a1234 +Trustno1 +QWERTY +Phoenix +Phoeni +996633 +556677 +28051986 +28021985 +27031989 +26021987 +25101989 +25061986 +25041985 +25011985 +24061987 +23021985 +23011985 +223322 +22121986 +22121983 +22081983 +22071989 +22061987 +22061941 +22041986 +22021985 +21021985 +2007 +20031988 +19101990 +19071988 +19071986 +18061985 +18051990 +17071985 +16111990 +16061986 +16011989 +15081991 +15051987 +14071987 +13031986 +123qwer +1235789 +123459 +12101988 +12081984 +12071987 +11121987 +11081987 +11071985 +11011991 +08071987 +08061987 +05061986 +04061991 +03111987 +03071987 +02091976 +02081979 +02041976 +02031973 +02021991 +02021980 +02021971 +sandr +roadrunner +ricard +metroid +margarit +lolol +ilikepie +homework +globus +friendster +cucumber +cnfybckfd +brand +azert +angelic +Welcome1 +VQsaBLPzLa +Ranger +Matthew +31121990 +30121987 +29121987 +29111989 +29081990 +29081985 +29051990 +27272727 +27091985 +27031987 +26031987 +26031984 +24051990 +23061990 +22061990 +22041985 +22031991 +22021990 +21111985 +21041985 +20021986 +19071990 +19051986 +19011987 +17061986 +17041987 +16101987 +16031990 +159357a +15091987 +15081988 +15071985 +15011986 +14101988 +14071988 +14051990 +14021983 +132465 +13111990 +12121987 +12121982 +12061986 +12011989 +11111987 +11081990 +10111986 +10031991 +09090909 +08051987 +08041986 +05051990 +04081987 +04051988 +03061987 +03031993 +03031988 +02101980 +02101977 +02091977 +02091975 +02061979 +02051975 +01081990 +01061987 +01011971 +taekwondo +starwar +sonyericsson +skateboard +riccardo +rfntymrf +qwe321 +qqqwww +proview +persona +nokia6233 +nightwish +marcelo +mad +loren +krokodil +kolbasa +hello12 +gthcbr +grin +ghbrjk +evangelion +delfin +budweiser +beloved +Mercedes +LOVE +FUCKYOU +David +Batman +963963 +852852 +45454545 +31011990 +29011987 +28071986 +28021986 +27051987 +27011988 +26051988 +26041991 +26041986 +25011993 +24121986 +24061992 +24021991 +24011990 +23051986 +23021988 +23011990 +21121986 +21111990 +21071989 +20071986 +20051985 +20011989 +19111987 +19091988 +18041990 +18021986 +18011986 +17101987 +17091987 +17021985 +17011990 +16061985 +1598753 +15051986 +14881488 +14121989 +14081988 +14071986 +13111984 +122112 +12121989 +12101985 +12051985 +111213 +11071986 +11011987 +10293847 +101112 +10081985 +10061987 +10041983 +07091982 +07081986 +06061987 +06041987 +06031983 +04091986 +03071986 +03051987 +03051986 +03031990 +03011987 +02101978 +02091973 +02081974 +02071977 +02071971 +0192837465 +01051988 +01051986 +01011973 +zxcv123 +zxasqw +werty +tokiohotel +suslik +sofia +rocknroll +q123456789 +purpl +power123 +poiuytre +nthvbyfnjh +mississippi +liliana +ksenia +kolokol +kazantip +junio +jajaja +ironmaiden +iriska +fyfnjkbq +flamengo +benessere +banan +awesome1 +asdffdsa +aaaaaaaaaa +Victoria +Mustang +Merlin +777999 +43214321 +369258147 +31121988 +31121987 +30061987 +30011986 +29041985 +28121984 +28061986 +28041992 +28031982 +27111985 +27021991 +26111985 +26101986 +26091986 +26031986 +25021988 +24111990 +24101986 +24071987 +24011987 +23051991 +23051987 +23031987 +22071983 +22051986 +21101989 +21071987 +21051986 +20081986 +20061986 +20031986 +20021985 +20011988 +19641964 +19111986 +19101986 +19021990 +18051987 +18031991 +18021987 +16111982 +16011987 +15111984 +15091988 +15061988 +15031988 +15021983 +14021989 +14011988 +14011987 +12348765 +12345qaz +1234566 +12111990 +12091988 +12051989 +12051987 +12031988 +12021985 +12011985 +11111986 +11091984 +1109 +11071989 +10071985 +10061984 +10041990 +10031989 +10011988 +06071983 +05021988 +03041987 +02091982 +02091971 +02061974 +02051990 +02051979 +02011990 +01051990 +010390 +01021985 +youtube +wonderful +ukraine +segblue2 +revolution +rasmus +p0o9i8u7 +monic +mikael +metall +luca +lokiloki +kamasutra +interne +gannibal +evgeniy +algebra +adrenalin +Samantha +SHADOW +Marlboro +Fabie +888999 +789654123 +777333 +5Wr2i7H8 +32167 +31031987 +30111987 +30071986 +30061983 +30051989 +30041991 +28071987 +28051990 +28051985 +27041985 +26071987 +26061986 +26051986 +25121985 +25051985 +24081988 +24041988 +24031987 +24021988 +23121986 +23091987 +23071985 +23061992 +22111985 +22091986 +22081991 +22071990 +22061985 +21081985 +21071992 +21021987 +20101988 +20061984 +20051989 +20041990 +1Dragon +19091990 +19031987 +18121984 +18081988 +18061991 +18041991 +18011988 +17061991 +17021987 +16031988 +16021987 +15091989 +15081990 +15071983 +15041987 +14091990 +14081990 +14041992 +14041987 +14031989 +13081985 +13021987 +123qwert +12345qwer +12345abc +123456t +123456789m +1212121212 +12081983 +12021991 +111112 +11101986 +11081988 +11061989 +11041991 +11011989 +10121986 +10121985 +10101989 +10041991 +09091986 +09081988 +09051986 +08071988 +08011986 +07101987 +07071985 +06061985 +06011988 +05031991 +05021987 +04061984 +04051985 +02101973 +02061981 +02061972 +02041973 +02011979 +01101987 +01051985 +01021987 +stigmata +smackdown +sergbest +sammy123 +restart +pictures +patrici +p4ssw0rd +nevermore +nataly +michal +m123456 +luciano +inlove +grisha +gatit +futurama +crackers +buttercup +alisa +alex12 +Tigger +MASTER +Joshua +Jordan23 +Anthony +Anai +951357 +321678 +31101987 +31051985 +30121986 +30091989 +30031992 +30031986 +30011987 +29061988 +29061985 +29031988 +28061988 +27061983 +27031986 +27021990 +26101987 +26071989 +26071986 +25081986 +25061987 +25051987 +25041991 +24101989 +24071991 +23111987 +23091986 +23051983 +23031986 +2222222222 +22121989 +22071991 +22051991 +22011985 +21121985 +21031985 +20121988 +20121986 +20061990 +20051987 +1q2q3q +19091983 +19061992 +1905 +19021991 +18121987 +18121983 +18111986 +16121986 +16091987 +16071991 +16071987 +15111989 +15031990 +14041986 +13121983 +13101987 +13091984 +13071990 +12345m +1234568 +123456789qwe +1234567899 +1234561 +12211221 +12121991 +12121986 +12101990 +12101984 +12091991 +12081988 +12071990 +12071988 +115599 +11111a +11041990 +10081990 +10081983 +10071990 +10061989 +10011992 +09111987 +09081985 +08121987 +08111984 +08101986 +08051989 +07091988 +07081987 +07071988 +07071984 +07071982 +07051987 +06031992 +05111986 +05051991 +05031990 +05011987 +04111988 +04061987 +04041987 +040404 +02081973 +02061978 +02031991 +02031990 +02011976 +01071984 +01041980 +01021992 +zaqwsxcde +tralala +tarakan +romantic +q1234567 +pancakes +nokia1 +nastia +mynameis +meliss +lucia +lhfrjy +leopold +iklo +hansol +fyutkjxtr +francisc +fabio +dbnfkbr +cannibal +bynthytn +bumbum +azertyuiop +asd222 +afrika +adelina +William +741741 +66613666 +44332211 +31071990 +31051993 +30051987 +30011990 +29091987 +29061986 +29011982 +28101986 +28081990 +28081986 +28011988 +27111989 +27031992 +27021992 +26081986 +25081985 +25031991 +25031983 +24121987 +24091991 +23111989 +23091989 +23091985 +23061989 +22091991 +22071985 +22071984 +22061984 +22051989 +22051987 +22031986 +22011992 +21061988 +21031984 +20071988 +20061983 +20041985 +1qazzaq1 +1qazxsw23edc +19991999 +19061991 +18101985 +18051989 +18031988 +18021992 +18011985 +17051990 +17051989 +17051987 +17021989 +16091988 +16081986 +16061988 +16061987 +15121987 +15091985 +15081986 +15061985 +15011983 +14101986 +1357911 +13071987 +13061985 +13021985 +123456qqq +123456789d +1234509876 +12131213 +12111991 +12111985 +12081990 +12081987 +12071991 +120689 +11071987 +11051988 +11031983 +10091984 +10071989 +10071986 +10061985 +10051990 +10041987 +10031993 +10031990 +09091988 +09051987 +09041986 +08081990 +08081989 +08021990 +07101984 +07071989 +07041987 +07031989 +07021991 +06061981 +06021986 +05121990 +05061988 +05031987 +04071988 +04071986 +04041986 +03101991 +03091983 +03051988 +03041983 +03031992 +02081970 +02061971 +02051970 +02041972 +02031974 +02021978 +0202 +02011977 +01121990 +01091992 +01081992 +01081985 +01011972 +vfntvfnbrf +vfndtq +tujhrf +supernova +slonik +renato +redstar +q1w2e3r +poptart +papamama +panter +makaka +liverpool1 +kingking +killer123 +itisme +hellsing +fujitsu +frederik +emil +eleonora +contra +boubou +behappy +barbar +adriano +THOMAS +Mustang1 +Heather +HIZIAD +GEORGE +ANDREW +808080 +7777777a +777666 +31121986 +31121985 +31051991 +31051987 +30121988 +30121985 +30101988 +30061988 +29041988 +27091991 +26121989 +26061989 +26031991 +25111991 +25031984 +25021986 +24121989 +24121988 +24101990 +24101984 +24071992 +24051989 +24041986 +23091991 +23061987 +23041988 +23021992 +23021983 +22111988 +22091990 +22091984 +22051988 +21111986 +21101988 +21101987 +21091989 +21051990 +21021989 +20101987 +20071984 +20051983 +20031990 +20031985 +20011983 +19111985 +19081987 +19051983 +19041985 +18121990 +18121985 +18121812 +18091987 +17121985 +17111987 +17071987 +17071986 +17061987 +17041986 +17041985 +16121991 +16101986 +16041988 +16041985 +16031986 +16021988 +16011986 +15121983 +15101991 +15061984 +15011988 +14091987 +14061988 +14051983 +13101992 +13101988 +13101982 +13071989 +13071985 +13061991 +13051990 +13031989 +123456n +1234567890- +123450 +12101989 +12071984 +12061987 +12041991 +12031990 +12021984 +11091986 +11091985 +11081986 +10101988 +10101980 +10091986 +10091985 +10081987 +10051988 +10021987 +10021986 +09041985 +09031987 +08041985 +08031987 +07061988 +07041989 +07021980 +06011982 +05121988 +05061989 +05051986 +04031991 +03071985 +03061986 +03061985 +03031987 +03031984 +03011991 +02111987 +02061990 +02011971 +01091988 +01071990 +01061983 +01051980 +01022010 +000777 +000123 +videos +s123456 +rfgecnf +qwqwqwqw +pushkin +mariam +malish +maison +lfitymrf +jesper +jellybean +hanuman +hacking +goldeneye +fduecn +eunice +elements +doktor +dimitri +cassandra +cashmoney +camil +bobmarley +bleach +baracuda +ananas +alinka +alcatraz +Sandra +GOLF +Dallas +334455 +31051982 +30051988 +30051986 +29111988 +29051992 +29041989 +29031990 +28121989 +28071985 +28021983 +27111990 +27071988 +26071984 +26061991 +26021992 +26011990 +26011986 +25091991 +25091989 +25081989 +25071987 +25071985 +25071983 +25051988 +25051980 +25041987 +25021985 +24101991 +24101988 +24071990 +24061985 +24041985 +24041984 +23456 +23111986 +23101987 +23041991 +23031983 +22071992 +22071988 +21121989 +21111989 +21111983 +21101983 +21041991 +21041987 +21031986 +21021990 +21021988 +20081990 +20061991 +20061987 +20032003 +20031992 +1qw23er4 +1q1q1q1q +1Master +19121988 +19081986 +19071989 +19041986 +18111983 +18071990 +18071989 +18071986 +18031986 +17121987 +17091985 +17071990 +17051983 +16091990 +15081989 +15071990 +15051992 +15051989 +15031991 +15011990 +14031986 +13091988 +13091987 +13091986 +13081986 +13071982 +13051986 +13041989 +13021991 +123890 +1234rewq +12345r +1231234 +12111984 +12091986 +12081993 +12071992 +1206 +12021990 +111555 +11111991 +11091990 +11061987 +11061986 +11061984 +11041985 +11031986 +101091m +10041984 +10031980 +10011980 +09051984 +08071985 +07081984 +07041988 +06101989 +06061988 +06041984 +05091987 +05081992 +05081986 +05071985 +05041985 +04111991 +04071987 +04021990 +03091988 +03061988 +03041989 +03041984 +03031991 +02091978 +01071988 +01061992 +01041993 +01041983 +01031981 +zyjxrf +welkom +weare138 +unlock +sqdwfe +socce +smirnov +shady +samanth +salman +rjhjkm +rfhfylfi +qwerasdfzxcv +password99 +olenka +nikolas +muslim +muhammad +morrowind +missie +mierda +mercede +leoleo +hyundai +hfytnrb +ghjcnbnenrf +gabriele +forever1 +dragonballz +darina +chouchou +c2h5oh +ballsack +ass +asasasas +apollo11 +abracadabra +Martin +KILLER +Fktrcfylh +Charles +963258 +848484 +765432 +595959 +456987 +333555 +31101991 +31081989 +31051986 +31011985 +30101987 +30071992 +30061989 +30061985 +29121988 +29121984 +29111987 +29081987 +29081982 +29071986 +29051987 +29041987 +29031982 +28071984 +28061985 +28051988 +28041988 +28021989 +27101989 +27101987 +27091983 +27061990 +27051991 +26121987 +26111984 +26051990 +26041988 +26041983 +25091992 +25081987 +250588 +25051989 +24041990 +23091982 +23071986 +23061985 +23051984 +23021991 +22446688 +22091987 +22091985 +22061991 +22051990 +22041991 +21121988 +21091990 +21071990 +21071985 +21041990 +21021986 +20101986 +20072007 +20061980 +20051986 +20021991 +20011987 +19071983 +19021985 +19011985 +18061987 +18061986 +18011984 +17121986 +17111988 +17031992 +17021986 +16111989 +16061990 +16011991 +16011985 +159263 +15121985 +15111986 +15031987 +14101991 +14101983 +14051987 +14041991 +14021991 +13081987 +13071991 +13061990 +13031991 +1237895 +12121984 +12101986 +12091990 +12081986 +12041987 +1111qqqq +11061988 +11051989 +11041987 +11041986 +11021990 +10101991 +10081991 +10021983 +09876 +09101985 +09051990 +09011990 +08111983 +08071986 +08061986 +08031988 +08021989 +07021987 +06091989 +06081988 +06081986 +06071984 +06061990 +06051987 +06031986 +06021989 +05101984 +05061983 +05041986 +04081985 +04061990 +04061988 +04051987 +04021985 +04011990 +03121986 +03101985 +03061984 +02081975 +02031970 +02021977 +01051987 +01041989 +01031980 +01010101 +zerozero +trustno +trigun +tiamat +sweeps +starwars1 +sexybitch +sephiroth +range +raduga +natalya +myXworld +momdad +misiek +malaysia +left4dead +justi +jordan2 +jesus123 +handbag +giulia +ghjcnjq +fabulous +begemot +arsena +annaanna +alvaro +alterego +accept +FUCKME +Andrea +918273 +77347734 +7412369 +55BGates +31031990 +30091985 +30081989 +30011992 +29081988 +29061984 +29041986 +29041984 +29011990 +29011988 +28121990 +28071988 +280597 +28051989 +28041983 +28011989 +27091987 +27091984 +27071983 +27061989 +27051986 +27011990 +26081983 +26041990 +25121986 +25111988 +25081983 +25021984 +25021983 +24081990 +24061984 +24021985 +23061988 +23041992 +23031989 +23021984 +22081987 +22031987 +21121987 +21091987 +21081990 +21061989 +21041986 +21011990 +21011985 +20111987 +20061992 +20051984 +20021990 +198 +19631963 +19091986 +19011986 +18101989 +18091984 +18011991 +17081990 +17061992 +17021992 +16051986 +16041986 +16021989 +15081980 +15051991 +15031989 +15031986 +15021991 +15011991 +14785236 +14111987 +14091989 +14091988 +14051986 +14031990 +13131 +13121989 +13091990 +13061989 +13021984 +123q123 +123456w +123456789987654321 +12071982 +12061980 +12031986 +12021987 +11121990 +1106 +11021988 +11021987 +11021984 +1020304050 +10111989 +10101987 +10071983 +10051989 +10051986 +10041989 +10021988 +10011989 +09061990 +09041990 +09011987 +08081983 +08081979 +08031992 +08021985 +08011988 +07111987 +07061986 +07041985 +07031986 +07021989 +06111990 +06111986 +06081990 +06071990 +06071986 +06051983 +05081989 +05081987 +05071986 +05071983 +05051993 +05051982 +05041991 +05041990 +05041983 +04121985 +04111989 +04031982 +04021987 +03111986 +03071984 +03051985 +03021987 +03011986 +02101975 +02061973 +02021992 +02011978 +01092010 +01091986 +01041986 +01031991 +z1x2c3v4b5 +xantia +wazzup +victori +valery +thebeast +tamerlan +sunshine1 +stitch +soldat +rhfcfdbwf +reloaded +powerful +pokemo +pinkie +parkour +ownage +nopassword +nestor +nanana +mazda3 +mariel +marcin +liliya +libero +lenochka +issues +grayson +elmira +egorka +duckduck +diamon +dangerous +dan123 +cantona7 +biohazard +baby123 +anonymous +alexi +Penthous +JOSHUA +JENNIFER +Aa123456 +741258963 +31071986 +30071983 +30041988 +29101992 +29091990 +29071988 +29041990 +29031983 +28121988 +28121987 +28121986 +28081985 +28061984 +28041991 +28041986 +28031990 +28021984 +27121988 +27051984 +27041987 +27021986 +27011985 +27011983 +26121985 +26121984 +26091985 +26021990 +26011989 +25091984 +25041984 +25041983 +24121990 +24121984 +24101987 +24011989 +24011986 +23071988 +23021987 +23011992 +2212 +22101988 +22091983 +22081990 +22081985 +21071986 +21071983 +21061987 +21051989 +21051983 +21011986 +20121985 +20111984 +20071985 +20011985 +19101989 +19101982 +19081991 +19031990 +18081989 +18051982 +18041988 +18041983 +17111989 +17111982 +17101991 +17091991 +17051993 +17051991 +17011986 +17011985 +16081985 +16071986 +16061984 +16021982 +15121989 +15111987 +15111985 +15101983 +15081984 +15041983 +15031984 +14101989 +14081986 +14061985 +14031985 +13121990 +13111986 +13111985 +13101990 +13101985 +13081988 +13081982 +13071992 +13051991 +13051988 +13041991 +13031992 +13031990 +13021992 +1234qaz +123456g +12345677 +123456123456 +12061990 +12061984 +114477 +112233445566 +111aaa +11101990 +11081985 +11081984 +11081983 +11031991 +11031990 +11031987 +10121991 +10121989 +10111983 +10071991 +09051983 +09031991 +08091988 +08081985 +08031991 +07031988 +07031985 +07011989 +06111984 +06071988 +06071985 +06031988 +06031984 +05121985 +05121983 +05101986 +05061987 +05051988 +05051980 +05021989 +04121987 +04121986 +04051990 +03101983 +03081984 +03021982 +02101982 +02101974 +02091979 +02091974 +02071991 +02071974 +02021974 +01111990 +01091984 +01071989 +01061985 +01041981 +01041979 +010181 +01011950 +z12345 +xxx +wanrltw +trinitron +tortoise +topolino +tetris +sweetheart +supersonic +strelok +source +sonic1 +sashka +richar +qweasdzx +qqwwee +pro100 +powerman +parlament +monkeyboy +migue +messenger +memememe +makeitso +madagaskar +londo +ljxtymrf +liza +kamilla +kamikadze +kakashi +ismail +integral +ibrahim +harmon +harle +godbless +fisherman +dimadima +converse +computer1 +comeon +boroda +blah +asshol +asdfqwer +amelie +alfonso +ahmed +Qwerty123 +HUNTER +Christin +BUSTER +999888 +8765432 +789632145 +56789 +56565656 +444555 +32323232 +31121992 +31081985 +31071985 +31051990 +31011983 +30071990 +30061986 +29091986 +29071990 +29011983 +28101988 +28091984 +28081984 +28071989 +28061990 +28051981 +28031984 +27121986 +27081989 +26111987 +26051987 +25121982 +25091988 +25071989 +25071986 +25051992 +25051990 +25011991 +25011988 +24121985 +24081987 +24071989 +24061990 +23111990 +23081986 +23061983 +23031988 +23021990 +23011989 +23011988 +23011984 +22111991 +22031990 +22021984 +22011991 +21212 +21121984 +21031991 +21011992 +2012 +20091984 +20071990 +20071981 +20061989 +20051992 +20041981 +19601960 +19121986 +19121985 +19101983 +19071985 +18011990 +18011989 +17121990 +17081992 +17081988 +17071991 +17071984 +17041990 +17031991 +17021988 +16111987 +16031987 +16021983 +16011990 +15101987 +15081985 +15021988 +15011992 +14121986 +14111989 +14091982 +14071983 +14061982 +14021988 +1357908642 +13121984 +13081990 +13081984 +13021989 +123456789r +12091987 +12071985 +12071983 +12051993 +12041985 +11111983 +11111979 +11091983 +11081992 +11071984 +11041988 +10121979 +10111988 +10111981 +10091989 +10091988 +10081988 +10041982 +10021985 +09121983 +09011991 +08061989 +08041988 +07081989 +07071986 +07071980 +07041986 +07021990 +06101991 +06081985 +06071987 +06031989 +05101983 +05071991 +05071990 +05011990 +04111986 +04081989 +04051983 +04041984 +04011988 +04011987 +03101989 +03101988 +03091991 +03081990 +03081988 +03071989 +03061989 +03051993 +03041990 +03031989 +0303 +03021989 +03011984 +02111989 +02081990 +02081972 +02081971 +02061992 +02061975 +01081980 +01071985 +01061984 +01051983 +01021986 +01021980 +zxccxz +whores +websolutions +websol76 +vincenzo +timoxa94 +tgtgtg +tata +summe +soulfly +sasha123 +sasa +sapphic +rodrigo +rhjkbr +rfhfvtkmrf +reuben +q1q2q3q4q5 +popcorn1 +poop123 +ocelot +nokia5800 +nachos +mustan +melani +maximka +matri +matisse +mashka +markmark +margot +manunited +magic123 +ltkmaby +love1234 +lilwayne +kontol +jehovah +greedisgood +gogogogo +fuckme69 +freestyle +foofoo +festus +dtkjcbgtl +dipset +cullen +continue +cfvceyu +blackbird +blackberry +bismarck +beckham7 +baronn +babybear +aviator +ass123 +asdfg123 +analog +agassi +aaa123 +a1a2a3a4 +Tasty +LasVega +Kinky +Killer +BATMAN +999000 +99762000 +986532 +918273645 +852258 +741258 +31101989 +31051988 +30061982 +29121985 +29091991 +29081983 +29071987 +29061987 +28111987 +28111986 +28091992 +28091985 +28061983 +27101990 +27071984 +27051989 +27041989 +27041988 +27031985 +26091991 +26091984 +26081985 +26071990 +26041984 +26021985 +26011981 +25121989 +25091985 +25051984 +24101985 +24071988 +24071986 +24051987 +24051986 +24041992 +24041991 +24021987 +24021986 +23101988 +23081984 +23041990 +23031985 +23021993 +22111989 +22101991 +22041993 +22041990 +21091988 +21091986 +21091984 +21051985 +20091983 +20031984 +20011991 +20011984 +1z2x3c4v5b +1q2q3q4q +19101993 +19081985 +19061986 +19061984 +1906 +19041992 +19041987 +19031980 +19021982 +18081986 +18071988 +18051985 +18031981 +18021993 +17101990 +17091984 +17021990 +17021982 +16121985 +16121982 +16111983 +16091991 +16061992 +16031985 +15111991 +15111990 +15101992 +15091990 +15091983 +15071984 +15041985 +15031985 +14121987 +14101985 +14091991 +14081991 +14081989 +14031984 +13121988 +13071983 +13061984 +13061983 +13051989 +13051985 +13011985 +13011981 +123456v +123456d +123456987 +12101987 +12051992 +12041983 +12031989 +12021986 +12011988 +11101987 +11101985 +11081982 +11071983 +11041983 +11031984 +11031982 +11021991 +11011980 +10111987 +101090 +10101993 +10051985 +10051983 +10031986 +10031985 +09101986 +09071990 +09071984 +09061989 +09051985 +09011985 +08061990 +08041989 +07101985 +07091985 +07031991 +07021986 +07011988 +06101986 +06061989 +06061982 +06051989 +06031985 +06011987 +05051992 +05051983 +05031988 +05031986 +04121988 +04121984 +04071983 +04051984 +04041995 +04041989 +04031990 +03091986 +03031983 +02061970 +02051974 +01111987 +01081988 +01071980 +01031987 +01011961 +000666 +000000000 +zxcvb123 +werwer +werter +warwick +wachtwoord +volleyball +sebora +schumi +sarasara +rosewood +rhfcjnf +rfrfrfrf +qwerty13 +qweasdzxc123 +pjkjnj +paperino +newuser +naughty1 +myworld +melisa +mazda323 +mastermind +lehjxrf +larsen +jefferson +hejhej +heavenly +halloween +gigabyte +freedo +fivestar +estrell +emanuel +ekmzyf +diana1 +danish +cool123 +commander +ciaociao +chickenwing101 +buddydog +bradley1 +bisexual +angell +amatory +abdullah +Sunshine +Nicole +MAGGIE +James +CORVETTE +Benjamin +Abc123 +9111961 +895623 +777555 +31101986 +30101990 +30101984 +30051984 +30041992 +30031989 +30011983 +29101991 +29101985 +29011992 +28111984 +28091990 +28091987 +28091982 +28051983 +28031986 +28021981 +27071991 +27071982 +27041993 +27031983 +27011986 +26121990 +26121983 +26101989 +26101984 +26091989 +26091988 +26031992 +26011993 +26011987 +25252 +25101990 +25101986 +25091986 +25031988 +25021987 +25021978 +24101980 +24051985 +24021990 +23232 +2312 +23111985 +23111982 +23091988 +23091983 +23081990 +22111982 +22101985 +22051980 +22041983 +22011989 +214365 +21121980 +21041989 +21021984 +21021983 +21011987 +20081987 +20062006 +20061981 +20021981 +1qazxsw +19611961 +19091992 +19081988 +19061989 +19041988 +18111989 +18111984 +18091991 +18081987 +18061988 +18041985 +18031993 +18021982 +17111986 +17081984 +16121989 +16101985 +16091986 +16081988 +16071983 +16041993 +16041990 +16041984 +16031991 +15081987 +15071989 +15061983 +15041993 +15041989 +15041982 +15021989 +14121988 +14111988 +14061984 +14041989 +132132 +13121986 +13111988 +13071988 +130680 +13051983 +13031985 +13011984 +13011983 +123456789v +123456789o +1234567890z +12111987 +120986 +12041994 +12041984 +12021980 +11121984 +11111982 +1105 +11021993 +11011985 +11011982 +10121984 +10101983 +10091991 +10051993 +10051984 +09121987 +09071987 +09071986 +09051988 +09041988 +08101989 +08061988 +08031983 +07121987 +07081982 +07061990 +07051989 +07051988 +06121988 +06111985 +06091987 +06051990 +06041989 +05121986 +05071989 +05061985 +05041984 +05021991 +05021985 +05011988 +04121982 +04091991 +04091987 +04081986 +04021988 +03101984 +03091984 +03081992 +03071983 +03061992 +03051989 +02121990 +02121983 +02041970 +02031993 +02011974 +01101985 +010989 +01081991 +01071983 +01041982 +01031990 +01021991 +000999 +zxcvzxcv +zinger +wsxedc +whoknows +wertzu +wdtnjxtr +vfcnth +vbienrf +topsecret +taylo +sarita +ronaldinho +qaywsx +prototype +protocol +princesa +pizzahut +passord +oswald +ntktdbpjh +nokia123 +mikkel +mendoza +mamochka +mailru +lucky123 +lourdes +libertad +justice1 +infected +ilya1234 +gizmos +getlost +fynjirf +flvbybcnhfnjh +edcrfv +dtxyjcnm +dfytxrf +dfhdfhf +demon1 +daredevil +cool12 +celina +candies +bramble +bismilla +bdfyjd +batista +bandit1 +aspirin +asdasd123 +angel2 +altair +alcatel +aladdin +Williams +Taylor +Sweet +RANGER +London +DANIEL +DALLAS +Bailey +8888888888 +828282 +707070 +3rJs1la7qE +34343434 +31121983 +31031986 +30111986 +30101986 +30081990 +30071985 +30031987 +30011980 +29121986 +29111983 +29091985 +29091982 +29051988 +29051986 +29051984 +29031989 +29031986 +29021988 +28111990 +28071983 +28051992 +28041989 +28031991 +28031988 +28031983 +27101992 +27071990 +27071985 +27061984 +27021987 +26111989 +26061983 +26031985 +26021989 +26011988 +258000 +25121990 +25111989 +25111986 +25041989 +25041980 +250388 +25031992 +25031986 +25021990 +25021989 +25011987 +24681012 +24121982 +24111983 +24091990 +24081986 +24061989 +24021989 +23071984 +23061980 +23051988 +23041985 +23011991 +23011982 +22121982 +22111990 +22101987 +22101981 +22041989 +21121992 +21061990 +21051987 +21051984 +20121987 +20111985 +2011 +20051981 +20041992 +20041984 +20031980 +20021983 +20011981 +19121987 +19081983 +19021988 +18101990 +18101988 +18081990 +18071983 +18021991 +17121983 +17101992 +17091986 +17051986 +17031988 +17031984 +17031983 +17021983 +16111986 +16101989 +16081991 +16071988 +16071985 +16061989 +15121990 +15121986 +15101984 +15071992 +15061987 +15051982 +15031992 +15021987 +15011981 +14789 +1475369 +14725 +14111990 +14091986 +14081982 +14061990 +14041984 +14031987 +14011991 +13071993 +13051992 +13041984 +13031980 +13011993 +123581321 +123456as +123321123321 +12121981 +12121977 +120786 +12051981 +12041989 +12011991 +11111989 +11111988 +11091987 +1108 +11071990 +11051991 +11031992 +11021992 +11021981 +10121982 +101080 +10101992 +10101982 +10071984 +10041985 +09121985 +09121982 +0909 +09071988 +09061991 +09051981 +09031990 +08101987 +08101980 +08061992 +08061985 +08021991 +07101989 +07091987 +07081992 +07061985 +07041990 +07041983 +07021984 +06101987 +06101985 +06091991 +06061983 +06051985 +06021988 +05111992 +05091985 +05081985 +05031989 +04111992 +04061982 +04051989 +03121985 +03091987 +03081987 +03071992 +03071990 +03051984 +02091972 +02081978 +02041991 +02041990 +02031995 +02031976 +02021993 +02021975 +01121985 +01121984 +01101990 +01091980 +01091979 +01081986 +01071991 +01061979 +010190 +010170 +yorkie +yfcntyf +vodafone +vfhujif +valeriya +trista +timur +tequier +tatjana +starlight +splendid +sokolova +smooch +shurik +shredder +salvatore +rubicon +rjhjdf +rjcvjc +qpalzm +powpow +piggies +petrovich +patrik +pasha +paradis +nbvcxz +morena +molly123 +mimosa +maxpower +marcella +malinka +malika +loveis +locoloco +livewire +lipton +lionheart +lahore +kurtis +kontakt +jennifer1 +infamous +hugoboss +hospital +horatio +godawgs +gianluca +ghbdtnrfrltkf +ghbdtndctv +gdtrfb +fujifilm +farida +famil +dragonfly +dasha +darkelf +charle +bullit +bracken +blueberry +blackhawk +benjami +bandi +antonov +alexxx +alexus +alexander1 +acclaim +aaaaaaaaa +a1b2c3d4e5 +SUPERMAN +STEVEN +Maggie +MONKEY +Groupd2013 +Drunk +Charlie1 +987654321a +919191 +85208520 +748596 +74123698 +31101988 +31071983 +31011989 +30121984 +30111990 +30111989 +30071987 +30061981 +30051992 +2sweet +29091980 +29081986 +29041992 +29031991 +27101986 +27081985 +27071989 +27071986 +27051992 +27051985 +27031990 +26111986 +26021988 +25121983 +25111992 +25031993 +24051979 +24031985 +24021983 +24011992 +24011991 +24011983 +232425 +23121983 +23101990 +23091994 +23081991 +23081988 +23041989 +23031991 +23031980 +23011980 +22121985 +22101989 +22101983 +22031989 +22021992 +22021987 +22011993 +22011987 +21111992 +21091985 +21071994 +21071982 +21061983 +21031981 +20121990 +20121982 +20081988 +20081985 +20081984 +20042004 +20031983 +20021992 +20021989 +20021987 +20021980 +1qaz2wsx3edc4rfv +19121982 +19111984 +19081992 +19081990 +19021987 +19021986 +18121992 +18111988 +18071981 +18061992 +18061984 +18051992 +18051986 +18041987 +17081989 +17061985 +17061983 +17051992 +17041984 +17031985 +17021991 +17011991 +16111984 +16101992 +16081989 +16061983 +16041987 +16011983 +159753456 +15081983 +15071991 +15061990 +15051983 +15041990 +15041986 +14111984 +14111982 +14061983 +14051993 +14051985 +14021992 +14021984 +13121987 +13091985 +13081991 +13011986 +123456c +12121980 +12091983 +12081989 +12041978 +12031991 +12031984 +1177 +11121989 +11121981 +11091988 +11051985 +11051982 +11051979 +11041993 +11031989 +10121990 +10031992 +10031984 +10011987 +09101988 +09091991 +09091987 +09071991 +09061986 +08121989 +08091989 +08081992 +08071983 +08061984 +08021988 +08011987 +07081983 +07051992 +06121982 +06071989 +06051988 +06041990 +06021984 +06021983 +06011991 +06011986 +05121989 +05111982 +05031984 +05021993 +04111987 +04101988 +04091985 +03091990 +03051981 +03051979 +03041988 +03041985 +03031994 +03021990 +03011990 +03011985 +02121988 +02121986 +02121981 +02091990 +02041971 +02031972 +02031971 +02022009 +01121989 +01101986 +01081984 +01061989 +01041991 +01041984 +01020 +001122 +yaroslav +waffles +volvo1 +treetree +traktor +tonytony +starfox +star123 +smirnova +slava +samir +roosters +romania +rfgbnjirf +profile +poster +poisson +paulin +passfan +p0o9i8 +nosferatu +nfhfrfy +monste +monkey69 +meggie +ludacris +luckyme +lovehate +loader +letsfuck +lacoste +kitties +kakarot +janjan +inna +indira +hydrogen +honest +helios +hackers +georgina +gaylord +francisco +flowe +faraon +esprit +dragon123 +dominique +dima123 +didier +daydream +dasher +daniell +carpediem +carmine +carme +canton +canary +buster12 +browndog +bmw318 +bmw2002 +blackops +beverley +bajingan +badboys +ayanami +audia6 +asdas +argyle +ankara +allah +advanced +abc123456 +a1s2d3f4g5 +Yankees +PRINCESS +Madala11 +Johnson +Brandy +Black +Ashley +Amanda +9874123 +666333 +6661313 +651550 +31121982 +31071988 +30111982 +30101985 +30091987 +30081986 +30071991 +30071982 +29111985 +29071993 +29051991 +29011991 +29011980 +28111982 +28101991 +28091988 +28041990 +28021988 +28011991 +27121990 +27121981 +27111992 +27111984 +27081988 +27031984 +27021985 +26071985 +26061990 +26041987 +25111985 +25081994 +25071984 +25051986 +25051983 +24111988 +24111985 +24111982 +24091988 +24091984 +24081985 +24051991 +24041987 +24031989 +24031981 +24031980 +24021984 +24011988 +24011984 +23051989 +23041984 +23041983 +2300mj +222111 +22061982 +22051985 +2205 +22021994 +22011990 +21121991 +21101980 +21091991 +21081991 +21081988 +21081986 +21061991 +21041988 +21041983 +21031992 +20101984 +20101982 +20091985 +20021993 +1Michael +19621962 +19091987 +19091980 +19071991 +19041993 +19041989 +18121988 +18111985 +18071991 +18051984 +18041984 +17091981 +17081987 +17061982 +17041988 +17031986 +16091992 +16081980 +16061981 +16041992 +16041989 +16031992 +16011988 +15121984 +15101985 +15061993 +15051993 +15021984 +14071989 +14061986 +14031991 +13111989 +13101986 +13091982 +13081983 +13041986 +12349876 +12345d +123456f +12345687 +123456789123456789 +121121 +12091989 +12091985 +12061989 +12061985 +12051983 +12041982 +12011992 +1110 +11081991 +11081980 +11061992 +11061980 +110442 +11041992 +10241024 +10081981 +10011985 +0o9i8u7y +09111988 +09111983 +09101984 +09091985 +09081986 +09081984 +09031992 +09021987 +08111987 +08081984 +08051983 +08041992 +08041990 +08031989 +08031980 +07121984 +07111982 +07101983 +07081985 +07071994 +07061991 +07051986 +07011980 +06081991 +06081983 +06031987 +06011984 +05071987 +05031992 +05031981 +05011989 +04101992 +04081992 +04081982 +04081978 +04071985 +04051986 +04041992 +04041982 +04031984 +04011986 +03081985 +03071980 +03061991 +03061990 +03021992 +03011992 +02121985 +02101972 +02101970 +02051971 +02041992 +02031992 +02022010 +02021972 +01121980 +01091990 +01051992 +010185 +01011996 +zxcvasdf +wrinkles +wdtnjr +warcraft3 +vika +utjhubq +toasty +suntzu +spiderman1 +skeleton +shanno +sexymama +scorpions +satellite +saibaba +romario +qwedsazxc +quaker +popopopo +pavlik +passcode +orang +offspring +nothing1 +nokia5530 +niggers +nassau +mygirls +motocross +mike1234 +meonly +marcela +mannheim +macaco +livelife +lfybkf +lapochka +lakshmi +kelli +kaka +julia1 +josep +jkjkjk +jesus777 +icecold +hocke +hobart +gulnara +guillerm +gfynthf +gfgfvfvf +gaucho +forester +firestorm +finalfantasy +fernande +fantom +euphoria +euclid +estate +escorpio +dorado +deathnote +cousin +confirm +cnfkrth +bluestar +bionicle +billabong +bernardo +b12345 +audi80 +aqwzsx +anton1 +anfisa +android +aliali +aassdd +aaaa1111 +Nicholas +Joseph +Gandalf +GINGER +Belly +963258741 +666555 +567567 +42424242 +333999 +3141592 +31101985 +31071989 +31071984 +31011992 +30091988 +30091983 +30011993 +2wsx3edc +29101990 +29071982 +29061982 +29031987 +28111989 +28101985 +28091993 +28091986 +28071993 +28071982 +28061989 +28031989 +27121989 +27111986 +27111982 +27081987 +27051988 +27041983 +27011982 +26121986 +26111978 +26101988 +26101983 +26041989 +26031982 +26021986 +26011985 +25111990 +25091983 +25071992 +25061984 +25051991 +25041992 +25021994 +25011983 +24111992 +24111991 +2411 +24051988 +24041989 +23121984 +23101981 +23091984 +23071992 +23071981 +23021982 +22111986 +21081980 +21061980 +21051979 +21021992 +21021991 +210187 +20202 +20121984 +20111989 +20081989 +20071983 +20061985 +20041987 +20041980 +20031989 +20021982 +20011986 +1a1a1a +198888 +19121978 +19051990 +19051989 +19011990 +19011988 +19011981 +18121986 +18081982 +18061993 +18061982 +18051991 +18041989 +18031989 +17111979 +17101988 +17101985 +17051985 +17031989 +17011992 +16101984 +16071989 +16051991 +16021991 +16021986 +16011982 +153759 +15121993 +15071981 +15071980 +15041984 +15011984 +14121991 +14121984 +14121979 +14111991 +14101992 +14091984 +14081992 +14081987 +14071985 +14011990 +13101989 +13091989 +130588 +13041990 +13041985 +13031988 +13031983 +13021986 +13011991 +13011990 +123qwe123qwe +1234abc +12345123 +121288 +12091982 +12051982 +12041977 +12031982 +120288 +12021989 +12021983 +12011986 +11121983 +11121980 +11111984 +11101988 +11101982 +11071991 +11061983 +11041980 +11031985 +11031980 +11011988 +110011 +10121988 +10111985 +10081993 +10081986 +10081982 +10071980 +10061991 +10061990 +0987654321q +09121989 +09111985 +09091989 +09081990 +09071985 +09031989 +09031986 +09031981 +09021990 +09021986 +08121983 +08111986 +08071990 +08041982 +08041980 +08031993 +08021992 +07121992 +07111986 +07091984 +07091983 +07081990 +07081981 +07071992 +07051985 +07041984 +06021981 +05111991 +05111989 +05111984 +05061984 +05061981 +05061980 +05041989 +05041988 +04101984 +04101980 +04091990 +04081983 +04061985 +04031989 +03121990 +03051991 +03031982 +03021993 +02111990 +02111985 +02081991 +02071973 +02011972 +01111989 +01111984 +01101989 +01061982 +01031982 +01021994 +01021984 +z123456 +youyou +xxx777 +winwin +winters +vfpfafrf +vflfufcrfh +vfhbyjxrf +tonya +tiptop +taipan +supply +spamspam +sharma +sephirot +sdfsdf +sativa +sarajevo +sanjay +salinas +rodrigue +ritter +revival47 +qazqazqaz +qaz123wsx +qawsedrftg +priyanka +pippen33 +petite +pakpak +pakista +orbital +openme +oldfart +nurlan +newproject2004 +nataha +myfriend +motdepasse +mikado +maurizio +mathias +marty1 +marta +lux2000 +libido +leonidas +leaves +lamborghini +kraken +komputer +kickflip +katelyn +justinbieber +jumanji +jkljkl +jessi +insecure +india123 +ilovepussy +honeybun +helsinki +gagarin +fhvfutljy +fastcar +ezekiel +dinero +dfcbkbcf +danilka +daniella +cowboyup +corazon +comicbookdb +cocacol +chowchow +chingon +cesare +cerebus +caution +carlisle +campus +blaze1 +bernice +bergen +before +beeline +bazooka +batman12 +basketbal +bababa +assmunch +as123456 +angel666 +amour +alex01 +alesha +aleksei +Sparky +SUNSHINE +John +Jackson +Iloveyou +Hammer +From +Danielle +CHARLIE +BaBeMaGn +AAAAAA +987789 +31081987 +31031985 +30111988 +30091986 +30081982 +30061992 +30061980 +30061979 +30051981 +300465 +30011988 +29121989 +29121982 +29101986 +29101982 +29091988 +29041982 +29011993 +29011989 +28071991 +28051991 +28051984 +28031985 +28021991 +28011984 +27731828 +27101985 +27051990 +27031988 +27021984 +26111992 +26081989 +26081988 +26071983 +26071982 +26051993 +25101991 +25101987 +25101985 +25061992 +25061988 +25041990 +25031980 +250185 +25011989 +25011982 +24091989 +24091987 +24091985 +24081982 +24031984 +24031983 +24021993 +23121990 +23121989 +23121982 +23101986 +23101985 +23091992 +23081985 +23041993 +23041982 +23011987 +22121988 +22121984 +22121978 +22111987 +22101990 +22091981 +22071981 +22011982 +21111984 +21071988 +21071984 +21051993 +20091989 +20091987 +20051991 +20041983 +20011979 +1912 +19091984 +19081982 +19071984 +19061982 +19051988 +19051985 +19051977 +19041990 +19021993 +19021984 +19011993 +18121979 +18101986 +18101983 +18091989 +180888 +18081992 +18071979 +18061989 +18061981 +18051993 +18031985 +18031982 +18031980 +18011993 +18011992 +17121993 +17121992 +17091983 +17081986 +17051981 +170484 +17031993 +17011989 +17011983 +16121990 +16121983 +16111992 +16081984 +16041978 +16021984 +15101982 +15081992 +15071982 +15061992 +15051988 +15041980 +15021993 +14121985 +14111985 +14101990 +14051991 +14051982 +14011983 +1324 +13121982 +13111982 +13101984 +13071979 +13061988 +13041983 +130390 +13011989 +123412 +12101983 +12081994 +12051980 +12041980 +12021993 +12021982 +12011993 +12011979 +11101984 +110686 +11041974 +11011986 +10111991 +10111990 +101086 +10101981 +10101975 +10091992 +10091980 +10081984 +10061988 +10041992 +10041979 +10021984 +10021982 +09101991 +09091990 +09071981 +09061988 +09061983 +08091987 +08091986 +08091985 +08081981 +08071984 +08071982 +08051992 +08041984 +08021984 +08011989 +07101988 +07101986 +07091989 +07051984 +07041980 +07021988 +07011985 +06091985 +06081989 +06071982 +06051991 +06021992 +06011989 +05121984 +05111983 +05101990 +05101989 +05081991 +05011985 +05011984 +04101989 +04101986 +04101977 +04071982 +04061980 +0404 +04011989 +03121987 +03111984 +03101979 +03081983 +03051990 +03031981 +03021984 +03021979 +02121992 +02101990 +02091991 +02071972 +02071970 +02051991 +02011973 +01101984 +01101979 +01081987 +01081982 +01071978 +01051993 +01051984 +01021995 +01011998 +xxxzzz +www123 +wrigley +voltron +vicious +vfhnsirf +vegas1 +vbifyz +vanity +ticktock +telecom +swatch +surfsup +spiders +smoke420 +shitter +sharpie +sfgiants +schubert +rdfhnbhf +ranetki +raiden +pushok +present +praxis +password01 +panache +newstart +nathaniel +my3sons +montoya +monolith +mojojojo +moimoi +mistake +metallica1 +maxpayne +maryam +magdalena +lynette +lukas +losangeles +lolololo +lioness +lighthouse +lexus1 +leonie +leeloo +lbtest +laker +lacrimosa +kookie +koleso +kissmyas +kareem +karamba +jeffrey1 +imtheman +iiyama +iamcool +hustle +hummel +honduras +homebrew +gabrielle +futyn007 +fruitbat +friday13 +forsberg +forge +fordtruc +footman +fishface +esteban +elevator +duracell +dominika +diplomat +dima1995 +diedie +diamante +dallas22 +custard +csyjxtr +csyekz +costanza +cortez +cornelia +coffees +cobra427 +cjytxrf +ciao +chevys10 +carling +capoeira +cantor +cacaca +bunnie +budlite +bobobobo +avanti +athletic +angelit +amalia +adventure +adrianna +administrator +addicted +abbey +WILLIAM +ShitHead +PEPPER +Liverpool +HOCKEY +Diamond +Barney +BIGDADDY +ASSHOLE +837519 +7410 +630112 +615243 +3edc4rfv +31081990 +31071991 +31071982 +31071980 +31051977 +31031982 +30121990 +30101991 +30091992 +30081988 +30071989 +30071979 +30051991 +30041990 +30031985 +30031984 +30011989 +29121981 +29111982 +29101984 +29091984 +29071981 +29061991 +28111988 +28091989 +28081988 +28051980 +28031981 +28011985 +27121982 +27091988 +27041986 +27031993 +27031991 +27011987 +27011981 +26081987 +26051985 +26031980 +26011991 +25121988 +25121984 +25111982 +25111978 +2510 +25071978 +25051981 +25041986 +2504 +25031989 +24111981 +24081984 +24031991 +231287 +23121991 +23111988 +2311 +23101992 +23081992 +23071989 +23051980 +23041996 +23021977 +22121992 +22111983 +22081981 +2208 +22051984 +22051982 +22041992 +22041984 +22031981 +22011984 +21121978 +21111988 +21101984 +21101981 +21081989 +21061993 +21061992 +21041984 +21011984 +21011981 +20091990 +20081982 +20071993 +20061982 +20011992 +20011980 +1a2s3d4f5g +1Qwerty +19111988 +19101988 +19101985 +19101984 +19091985 +19081984 +19051981 +19021983 +19021980 +18181818 +18111990 +18101991 +18091983 +18041992 +18021989 +17121991 +17101980 +17071988 +17051979 +17041989 +17011984 +16091984 +16081990 +15101989 +15091986 +1500 +14121990 +14121983 +14111983 +14101984 +14081984 +14051992 +14051981 +14051977 +14041982 +13121980 +13111991 +13101993 +13101983 +13071994 +130686 +1234KEKC +12345w +123456y +1234567aA +1213141516 +121281 +12121983 +12111981 +121088 +12091984 +120488 +12041993 +12011995 +11111978 +11101989 +11081978 +11041989 +1100 +101077 +10101984 +10061983 +10031983 +10021993 +10021990 +10011001 +09091984 +09061987 +09051991 +09051989 +09051975 +09041991 +09031985 +08121985 +08121984 +08121982 +08101985 +08091984 +08081982 +08061983 +08031990 +07121988 +07111985 +07101990 +07091986 +07011986 +06121989 +06121986 +06081992 +06081984 +06081979 +06041986 +05111985 +05091992 +05091991 +05081983 +05081981 +05081977 +05061982 +05051984 +05011992 +04101991 +04091989 +04071989 +04061993 +04031994 +04031985 +03101990 +03101986 +03081993 +03081991 +03061982 +03051982 +03051980 +03011989 +02101971 +02091993 +02091970 +02071990 +012345678 +01111988 +01101982 +01081978 +01071981 +01051979 +01042000 +01012006 +01011967 +010100 +00001111 +zzxxcc +zxczxczxc +zimbabwe +yfnfirf +woodstock +wingzero +vova +vorona +virgo +veronic +vaness +truffles +tortuga +tkfkdg +tiberian +teapot +superbow +start123 +somebody +sodapop +slasher +silverado +shinji +shawn1 +serge +school1 +scenery +santiag +sammydog +saltydog +s12345 +rfhlbyfk +rehbwf +redwall +quaint +q1q2q3q4 +pupkin +prosto +pioner +petrus +paola +opera +nonstop +neworder +needforspeed +narut +nadejda +murph +muffins +monkeyman +maurici +margo +manatee +ltymub +lol12345 +lisenok +lingerie +lilman +lasers +landrove +lambchop +ladybird +klopklop +kjiflm +josephine +jonatha +jessica2 +impulse +icarus +hunter12 +hondacbr +greentea +graphic +goarmy +ghjdthrf +gfhjdjp +friends1 +frederick +foxfox +fernanda +fantasti +emine +dreamcast +dragon01 +disturbed +dianna +delphine +deepthro +chinchin +chewy1 +chemistry +cedars +casablanca +burgess +buffer +buckwhea +bertrand +beachbum +barnie +banaan +arnaud +armageddon +allied +aligator +adrock +a111111 +Steelers +Shadow1 +Robert1 +RICHARD +Marine +L58jkdjP! +Internet +Gandalf1 +GOLFER +Alexander +9090 +890098890 +753357 +666666666 +6543210 +555222 +4455 +3984240 +3698741 +31101983 +31081982 +31051989 +31051983 +30071988 +30061990 +30061984 +30041984 +30041983 +30031979 +29121992 +29101989 +29091989 +29091983 +29071980 +29041980 +29021984 +29011984 +28111985 +28101989 +28101979 +28061981 +28011986 +27111978 +27081984 +27021988 +27011989 +26121988 +26121981 +26111988 +26101985 +26101981 +26081990 +26051992 +26051989 +26031989 +26011992 +26011984 +25121991 +25091982 +25071981 +25071980 +25061983 +25061981 +25031985 +25031982 +25011984 +2412 +24101994 +24071982 +24051984 +24041983 +23121988 +23111991 +23111984 +23111983 +23081983 +23061991 +23061986 +23051981 +230383 +23031984 +23021978 +228228 +22334455 +220689 +22061992 +22041982 +21101990 +21101982 +21091982 +20111991 +20111990 +20101992 +20101990 +20101985 +20071987 +20021984 +20011990 +1a2a3a4a +19121990 +19111990 +1908 +19061988 +19041983 +19041978 +19031986 +19021992 +19011982 +18121989 +18111992 +18111982 +18081985 +18061983 +18061980 +17121988 +171186 +17101989 +17091992 +17091982 +17091979 +17071992 +17071983 +17061993 +17051982 +17041983 +16121988 +16101991 +16071993 +16061991 +15101981 +15061994 +15061991 +15041981 +150385 +15031994 +15031983 +15011993 +15011982 +14101993 +14071984 +14061987 +1406 +14041993 +14041976 +14031980 +14031978 +14011984 +14011982 +13245768 +13081978 +13061981 +13041992 +13021995 +123mudar +123456789l +123456789123 +12345612 +12340987 +121282 +12111988 +12111986 +12111982 +12071980 +12051984 +120489 +120485 +12011984 +12011980 +1122334 +11121991 +11101979 +11091992 +11091991 +11081993 +11051983 +11021983 +10111982 +101082 +10091983 +10061980 +10011982 +09121992 +09101982 +09091979 +09081989 +09061984 +09051978 +09041982 +09021991 +09021985 +08101984 +08091981 +08081991 +08071991 +08051986 +08051985 +08051984 +08031982 +08031977 +08021986 +07121985 +07071983 +07041979 +07031984 +07021985 +06121987 +06111982 +06061991 +06061984 +06041991 +06011990 +05111990 +05101987 +05051981 +05031983 +05021990 +04111990 +04111985 +04101990 +04071990 +03111992 +03091982 +03071991 +03071978 +03061983 +03021988 +03011988 +02081994 +02041993 +02021994 +02021970 +01121982 +01111983 +01101991 +01061991 +01031992 +01031976 +01021983 +01011966 +01011965 +ytngfhjkz +yourmama +wsxzaq +wildlife +welcome2 +wakeup +thomson +sverige +sunkist +submarin +sublime1 +starbucks +spalding +sosiska +songbird +slipkno +shevchenko +sevenof9 +seahorse +santacru +sandman1 +rt6YTERE +rodent +rktjgfnhf +rjitxrf +riddler +rewind +reeses +raymond1 +ransom +ramstein +radeon +qaz741 +prudence +privat +prestige +planner +pietro +paramore +optima +omegared +nonmembe +nastenka +morozova +moochie +monkey123 +milkyway +michelle1 +marajade +man +m12345 +m0nkey +luigi +lucian +lever +lebanon +lbvjxrf +krasota +kostik +kombat +kenneth1 +kbctyjr +kavkaz +katya +janina +ireland1 +irakli +hulkster +hotmama +headache +halo +gorillaz +goldrush +goatboy +gitara +gamer +fuckthat +fuckm +fraggle +fourteen +four20 +fokker +flipper1 +flavor +fireblade +fhntvrf +feeder +faisal +evildead +everyday +dropkick +drifting +dragrace +doorknob +domenico +dima55 +devious +debora +daytek +daniel12 +cristin +creator +costaric +correct +contests +clerks +clemens +chris2 +chris12 +cecil +caitlyn +bugsbunn +bubblegum +breezy +breathe +boris1 +blondinka +blackbelt +berserk +benedict +belinea +bedrock +baron1 +balrog +babel +avery +asslover +aslan +anna2614 +alla +alessio +adidas1 +Steven +Ranger1 +Porsche +Pepper +NICOLE +Morgan +Monkey1 +MATRIX +Johnny +Garfield +Buster1 +BaBeMaGnEt +959595 +90909 +78787878 +74227422 +74107410 +665544 +43046721 +316316 +31121991 +31101984 +31031989 +31031980 +30101983 +30101982 +300785 +30051980 +30051979 +30041982 +30031991 +30031983 +30011991 +29121990 +29101988 +29091977 +29061983 +29041993 +29011986 +28111983 +28101992 +28091991 +28091981 +28081989 +28071990 +28071978 +28061991 +28041980 +28011983 +27111991 +27111988 +27091990 +27091989 +27061980 +27051983 +27011984 +26111991 +26111982 +260989 +26091990 +26091987 +26071992 +26031983 +26011979 +25101983 +25101978 +25071991 +25051993 +25031994 +25021992 +25011994 +24101983 +24081992 +24071984 +24071983 +23101984 +23101982 +23071991 +23071990 +23071982 +23061984 +23061976 +23051978 +23031992 +2303 +23021981 +23021975 +23011983 +23011981 +222555 +221288 +22111979 +22091989 +22081992 +22081989 +22051981 +22041976 +22011983 +22011975 +213213 +211212 +21091980 +21061984 +21041994 +21041993 +21041978 +21031989 +2101 +20071992 +20071989 +20041989 +1password +1a2b3c4d5e +19111989 +19111981 +19091982 +1909 +19071994 +19051980 +19041981 +19041980 +19011991 +18121980 +181181 +18091988 +18071980 +17111984 +17031990 +17021981 +16161616 +16111988 +16111985 +16091985 +160888 +16081992 +16081983 +16071982 +16071980 +16041991 +16031993 +16021985 +15111981 +15101979 +15091981 +150787 +15061986 +15051980 +15041992 +15041991 +15031975 +15011989 +14785 +1425 +141516 +14121993 +14121980 +14071990 +14071980 +14051979 +14031982 +14021982 +14011992 +13111987 +13091980 +13081981 +13061982 +13041981 +13011992 +123698741 +12345v +12345k +123456789p +121289 +121283 +12101979 +12091992 +12081992 +12081981 +12061994 +12061992 +12051991 +12031992 +12011990 +1116 +11121992 +11111992 +11101983 +11101980 +11071980 +11061993 +11031993 +11021994 +11021989 +1040 +10121992 +10121976 +10101977 +10091993 +10071993 +10061992 +1006 +10051992 +10041993 +10031981 +10021989 +10021981 +10011993 +10011991 +10011984 +0987654 +09091982 +09081987 +09061981 +09041984 +09021982 +09011992 +09011989 +09011980 +08111991 +08111990 +08041981 +08011980 +07121983 +07081980 +07071993 +07071978 +07061984 +07041982 +07041981 +07011987 +07011982 +06121991 +06121985 +06111987 +06111983 +06091990 +06091988 +05101988 +05091984 +05061991 +05041987 +05021981 +05011983 +04121989 +04101985 +04091979 +04071992 +04071984 +04051982 +04021986 +04021984 +04021982 +03081980 +03081979 +03061977 +03041992 +03021978 +02121989 +02121980 +02111986 +01101980 +01061993 +01051974 +01031993 +01011968 +yeshua +xoxoxo +whateve +washer +vtldtlm +victory1 +vancouver +udacha +tricks +toulouse +torrent +tooltime +tonto +tippy +theboys +thatsme +thanos +sunderla +succes +songoku +snowy +snowflake +skynet +skills +singapore +silve +shinigami +shimano +seventeen +sestra +seabass +scoobie +sachin +saab900 +ruben +rowdy +rosita +restless +rerere +rebekah +rb26dett +rawhide +qwerty99 +punjab +pumkin +pronto +porsche911 +plumbing +pizda +piper1 +perkele +pennstat +pendejo +peaceful +patron +partners +paranoia +papapa +ozzie +outlaws +origin +oioioi +niggaz +nigeria +nebula +naught +myspace +motherfu +monkey2 +mjolnir +mike12 +memories +marybeth +marsel +marnie +manue +manuals +manifest +mamont +mahalkita +magoo +machines +locker +llama +libra +liberty1 +leticia +legenda +leeroy +l3tm31n +kumar +kfcnjxrf +kazanova +j3qq4h7h2v +ignatius +icetea +hussain +hfljcnm +heinlein +heathe +halcyon +gretta +google1 +goethe +geibcnbr +gatito +fuckshit +franci +fordf350 +forall +flyguy +fktyeirf +fialka +fakepass +everques +enter123 +dragonz +dortmund +dominate +dmband +discovery +desperado +demon666 +deicide +deepak +darknes +dagobert +corvett +cooki +cochise +citrus +christophe +chopper1 +cheste +chees +chairman +cazzone +candles +bushman +braveheart +boxter +boohoo +bonethug +bolivi +bluenose +bigworm +bigjoe +bettyboop +beebop +avrora +avalanche +austin316 +augustin +asd456 +apteka +apple2 +angel12 +allblack +alisher +alex1234 +aerosmith +adria +admin123 +aabbcc +P@ssw0rd +NASCAR +Melissa +JESSICA +Ginger +Fuck1 +Dallas1 +Christia +777111 +699669 +555333 +362514 +357753 +335577 +31121984 +31101982 +31071977 +31051992 +30111983 +30111979 +30081983 +30041993 +30041989 +30041980 +29111984 +29081991 +29081989 +29071991 +29071989 +29061981 +29051993 +29041994 +29031993 +28121985 +28111991 +28081981 +28071981 +28031987 +28021987 +28021978 +28011992 +28011990 +27121991 +27111987 +27101991 +27091979 +27071994 +26121991 +26101990 +26091981 +26081992 +26081981 +26071991 +26071988 +26071979 +260686 +26061992 +26051983 +26041985 +26021991 +25121980 +251188 +25111980 +2511 +25081993 +25081984 +25071988 +25061990 +250482 +25031979 +25021991 +24121993 +241086 +24091982 +24081989 +240685 +24061991 +240588 +24051993 +24051992 +24031992 +24031982 +24011982 +234234 +23121987 +23121985 +23081980 +230688 +23051982 +23031982 +23011986 +22121990 +22101984 +22101978 +22091977 +22061981 +220583 +22051983 +220488 +22041981 +22041979 +22031983 +22021991 +21111987 +21111982 +211086 +21101985 +21051981 +21031983 +2103 +20101991 +20081993 +20081983 +200788 +20071982 +20031981 +20011982 +1Fuck +197777 +19571957 +19121992 +19101991 +19081978 +19071982 +19051993 +19051984 +1902 +18273645 +18111981 +18101984 +18091982 +18051980 +17121984 +17111992 +17091978 +17081985 +17081982 +17071980 +17061990 +17061984 +17051984 +17041992 +17021984 +16121992 +16101988 +16071992 +16051984 +160490 +160486 +16041983 +16031994 +16031983 +16021994 +159852 +159753a +15121992 +15121988 +15121982 +15121977 +15101990 +15101980 +15091992 +15031993 +15021978 +14091983 +14081983 +14061989 +14051988 +14051984 +14041985 +14021995 +14021977 +14011985 +13241324 +13121991 +13111980 +13081993 +13081980 +1305 +13021988 +123ab +1235813 +12345asd +12345678900 +12345654321 +12111983 +12091981 +12071981 +120583 +120581 +120482 +12031993 +120188 +120187 +1118 +11111990 +11111985 +11111980 +11101991 +11061981 +11041984 +11021982 +101085 +10101978 +100888 +10081992 +10081980 +10071982 +10021991 +10011978 +09101980 +09081982 +09071982 +09041989 +09021993 +09021984 +08121988 +08091982 +08081976 +08021980 +08011990 +08011983 +07121989 +07111984 +07071976 +07021993 +07021983 +06111989 +06091984 +06071991 +06061980 +06021985 +05101982 +05081979 +05071981 +05071977 +05021980 +04081991 +04081984 +04081981 +04061994 +04061989 +04051980 +04021981 +03081982 +03071982 +03041975 +03031985 +03021985 +03011983 +02061993 +01234 +01121979 +01111986 +01101988 +01091983 +01081983 +01071982 +01031978 +007700 +0000000000o +zaxscd +zaq12345 +yello +x72jHhu3Z +wishes +watermelon +vivaldi +vepsrf +vbhevbh +vandal +utahjazz +tyuiop +tonyhawk +theduke +thalia +texans +terriers +taiwan +stripe +stands +staind +space1 +snafu +skulls +skillz +simply +shayla +sexyme +schultz +rugrats +roman1 +rerfhtre +realtor +rbcekz +rammstei +qazxsw123 +porn4me +pompom +phishy +peanu +peaceout +pavlova +pathfinder +partizan +papit +okmijn +not4you +nirvan +negro +navigato +natedog +mypasswo +mutter +molotok +mitchel +mimimi +mikayla +meandyou +maximus1 +maurolarastefy +mastermi +master123 +massey +marymary +marinka +lucent +lotus1 +lorien +lookup +locked +lasttime +lancaster +kokokoko +koala +katten +john12 +jazmin +janna +iphone +ilikesex +hotshit +hotdogs +homo +helphelp +hazel +hattie +gusgus +grime +goodlife +gjhjkm +gender +gbcmrf +fulcrum +fuckmehard +freedom2 +frank123 +forgotten +flashy +flare +firestar +filippo +fhctybq +fghjkl +fedorov +everton1 +domini +domainlock2005 +dolphi +dokken +disabled +dimple +dickweed +devil1 +degree +dating +cxfcnkbdfz +curley +crockett +cricri +creeper +cosmo1 +corazo +cneltyn +chief1 +charming +cerber +casual +cashew +cartier +caralho +carajo +caboose +buller +borges +booter +boarder +blessed1 +bitchs +biscuits +bhbcrf +betty1 +bettis +batma +bastet +bassin +bambino +aurelie +asylum +astonvil +ashtray +arcangel +angeles +ange +anakonda +alonso +alkaline +abcxyz +ab1234 +a4tech +William1 +TIGGER +Pussy +Picturs +Natasha +Marina +JEAdmi +Alexandr +ASHLEY +ANTHONY +9696 +823762 +777000 +555555555 +333333333 +3151020 +31121980 +31101990 +31101978 +31081988 +31081983 +31031984 +31011986 +30121983 +30111985 +30101981 +30091994 +30091982 +30081987 +30061991 +3004 +30011978 +30011977 +29121991 +29091993 +29091981 +29071992 +29041983 +29031985 +29031984 +29021980 +28121983 +28121982 +28121981 +280888 +28081991 +28061982 +28051993 +28031979 +28011981 +27101983 +27051993 +27041984 +27021982 +26121977 +26101992 +26101982 +26061981 +26051984 +26021984 +26011983 +25081991 +25081980 +250789 +250787 +25061994 +25061991 +25061989 +250585 +25051995 +25051982 +25051979 +2505 +25041979 +25031990 +24121981 +24111984 +24091981 +240586 +24031986 +24021994 +24011981 +2356 +23101991 +23101979 +23091990 +23091978 +23081989 +23081987 +23081977 +23061979 +23051992 +23041977 +230289 +23021973 +22101992 +22091982 +22081977 +22071982 +22061986 +22051992 +22031985 +22031978 +22021982 +22021980 +2202 +21121983 +21121981 +21121977 +21111981 +21101992 +21101991 +21091983 +21081981 +21051982 +21031993 +21011983 +20112011 +20111982 +20101989 +20101983 +200888 +20071991 +20051990 +20051980 +20041991 +200383 +20031993 +1qazxc +19591959 +19121984 +19091993 +19091991 +19091978 +19071995 +19061983 +19031989 +19031982 +18121993 +18111979 +18101992 +18101982 +18081983 +18071987 +18021990 +18021981 +18011983 +17121980 +17111980 +17101979 +17081991 +17061979 +17031994 +17011988 +16101982 +16091980 +16081987 +16081979 +16061980 +16031989 +16031980 +16021993 +16011984 +1600 +1596321 +15121979 +15101988 +15091978 +150788 +15061989 +1505 +15031980 +14091979 +14081993 +14041981 +14021980 +14011980 +13121979 +131185 +13101994 +13081992 +13071986 +130585 +13031984 +13011976 +1230123 +12241224 +121278 +12121992 +120985 +12081991 +120783 +12071994 +12071986 +12071976 +120690 +120677 +12061991 +12041976 +12021992 +11122233 +111189 +11021980 +11011981 +11011977 +1080 +101285 +10121980 +10101979 +10061981 +09121990 +09121986 +09091980 +09011988 +09011984 +08121981 +08091992 +08071992 +08071979 +08061981 +08011984 +07111989 +07081991 +07081988 +07081978 +07061982 +07051993 +07051981 +07031987 +07011992 +07011983 +0666 +06121983 +06101988 +06101982 +06051992 +06041980 +06031990 +06021982 +06011985 +05121991 +05091986 +05051975 +05041992 +05041982 +05041981 +04111982 +04071977 +04061981 +04051991 +04051981 +04041993 +04041981 +04041979 +04021992 +04011992 +04011991 +04011985 +04011980 +03121983 +03121982 +03111989 +03101981 +03091985 +03091980 +03061979 +02111984 +02111983 +02111982 +02011992 +02011970 +01121975 +01111991 +01111982 +01101983 +01091991 +01081981 +01081975 +01061981 +01051991 +01031994 +01011958 +yuliya +yngwie +yanks1 +xaxaxa +warsaw +vfkbyf +vasiliy +vangogh +urlaub +twostep +tryagain +trekker +toonces +tomboy +tom123 +theclash +terrence +terrance +taytay +sunbeam +steiner +stefania +stefani +soviet +southside +sonny1 +solnishko +smokedog +smarty +slayers +sk8ordie +singh +shitfuck +sarina +samue +roserose +rosco +rodger +robson +reviews +regional +rebbyt34 +reaver +raketa +radius +r4e3w2q1 +quake3 +qqqqqqqqqq +qazwsxedc1 +qazplm +puma +princ +premiere +porshe +poi098 +pingvin +philipp +pass12 +pamel +optiplex +opopop +omerta +olives +nutella +noreen +nokia5230 +nika +nickolas +nickels +nfy.irf +naples +mystical +mummy +mowgli +movers +monkeyma +momsanaladventure +minimum +miki +meowmix +mensch +matros +maryanne +markiza +marketing +marketin +mark123 +marishka +mamo4ka +mackenzi +lugano +luckie +lovel +linus +lemon1 +leafs +lasalle +laracroft +lampard +lagwagon +krypto +kruger +kjifhf +kevin123 +kerrie +jigsaw +jelena +jaycee +janeway +jackie1 +ironhors +information +hotbabes +hornyguy +homeless +hogwarts +hernande +hehe +headless +hamburger +gravis +grandpri +golfclub +gobigred +glider +garret +gabby1 +fyyeirf +furman +fun4me +fuckedup +fremont +foxcg33 +feniks +eyeball +everquest +evergree +ethan1 +ericeric +ererer +envision +eightbal +ecuador +eatme2 +dumdum +dude123 +druid +doggydog +djkjlz +dhjnvytyjub +detroit1 +delsol +dazzle +database +dangerou +damion +cujo +crafty +corgan +cooker +computers +citibank +choppers +chango +cannonda +callofduty +bunbun +brunette +bravehea +bookcase +blunted +blackcock +biker1 +biggirl +beyond +beyonce +beepbeep +beaks +bdfyjdf +bassbass +badbad +arrakis +armstrong +arman +arielle +antigone +angelok +angele +amnesia +allyson +alex1 +akasha +agatha +ace123 +abstract +Russian7 +Mike +MIKE +MICHELLE +LETMEIN +Jessica1 +Hd764nW5d7E1vb1 +Hannah +Ferrari +BOOMER +BIGDICK +BIGBOY +AMANDA +999111 +987654321q +979797 +929292 +885522 +777vlad +6767 +6565 +500500 +369852147 +3141 +3110 +31081994 +31071981 +31051984 +31031981 +30111984 +30101989 +30081991 +30011976 +29121993 +29111980 +29101993 +29061992 +29051982 +29051980 +29041991 +29031995 +28101987 +28061992 +28021993 +27121987 +27121984 +27101993 +27081983 +27061992 +27061986 +27051982 +27041982 +27021983 +26111979 +26091980 +26071993 +26061988 +26061984 +26051982 +26031981 +25111979 +251086 +25101992 +25101984 +250486 +25041982 +25041981 +25041977 +25021993 +25021982 +25011992 +24121983 +24111980 +24111979 +24091979 +24041982 +24021981 +24011979 +2345678 +23121992 +231189 +23081982 +23071987 +23041981 +23031993 +23031978 +222444 +22111978 +22071993 +22061980 +2206 +220388 +22031994 +22031988 +21111991 +21101978 +210586 +21031994 +20121983 +20101981 +20091995 +20091992 +20081992 +20041993 +20031976 +20021994 +1q2w3 +19531953 +1940 +1939 +1917 +19121994 +19121993 +19121991 +19101977 +19081989 +19051991 +19041991 +19031993 +19031992 +19031988 +19031984 +19021989 +18121991 +18101979 +18091992 +18081980 +18011982 +17171717aa +17111990 +17111983 +170985 +17081994 +170685 +16121977 +161187 +16111993 +16111980 +16061982 +160590 +16051996 +16031984 +15121991 +1512 +15091984 +15081979 +15081978 +15071993 +15051979 +15051978 +15041978 +15031981 +1502 +147896321 +141289 +14101981 +14071981 +14061995 +14051989 +14041983 +14031972 +140289 +14021979 +14021978 +13111981 +13091991 +130684 +13031993 +13031982 +13021983 +130184 +12s3t4p55 +1254 +123qweas +1234569 +122334 +122122 +12121979 +12111979 +120989 +12081980 +120785 +120782 +12071979 +12061983 +1203 +12021979 +12011994 +1119 +11121979 +11121978 +11071992 +11071982 +11071979 +11061990 +11061979 +110588 +110582 +11051977 +110386 +11021986 +11021979 +11011978 +10111980 +101089 +10091990 +10091987 +10091982 +10081979 +10071977 +10061982 +10051991 +10041988 +09121984 +09111986 +09111984 +09101979 +09091981 +09061992 +09061982 +09031983 +09021992 +09021979 +09011986 +08101990 +08101983 +08091991 +08091990 +08081987 +08031978 +08011991 +07121977 +07111992 +070787 +070784 +07071991 +07061987 +07051991 +07031990 +07021982 +07021981 +07011981 +06091983 +06091982 +06081982 +06081981 +06071976 +06061978 +06031993 +06031981 +06021980 +06021979 +05121979 +05111988 +05111987 +05101981 +05081984 +05031993 +05031980 +05011986 +04121983 +04041994 +04041980 +04031993 +04031992 +04031983 +04031980 +04021983 +03121989 +03111980 +03051983 +03021981 +02121991 +02111988 +02101991 +01121978 +01071994 +01021982 +01021981 +01021976 +01011964 +0077 +zzz123 +youandme +yfnfitymrf +woodside +volkodav +vishnu +vfnbkmlf +veteran +twins2 +triplets +timothy1 +timelord +theedge +thebest +tenerife +takamine +sweetass +sunbird +stas +sparkey +spaniel +sokolov +slippy +slicer +skull +skating +sincity +shotokan +shiraz +shayne +shandy +shade +sexyass +sexsexse +seventy +selmer +scrooge +scoote +schmuck +saratov +sanane +sammi +rushrush +royboy +rostov +rosie1 +rosanna +romanov +rocky123 +rockman +rjnzhf +rashid +rabbi +qwerty78 +pyramids +produce +potatoes +pornpass +poppie +pomidor +policy +planeta +pilsner +pfqxbr +patrizia +password11 +passwerd +panorama +oasis1 +nokia5130 +niklas +newjob +newday +nemesis1 +natascha +nastena +mystuff +mypussy +music123 +motorcyc +morbid +montero +money2 +moemoe +misiaczek +mentos +maximilian +mathieu +marriott +marmite +marat +manual +manage +malakas +madonna1 +macintosh +lovem +lovely1 +lothar +lorenz +lololol +lili +league +laure +kristen1 +kodak +killzone +keesha +johan +jesus7 +janet1 +jamesb +jakester +jacko +ivanhoe +impalass +ijrjkflrf +igorek +hunter2 +humble +holdem +hirsch +henning +helpless +hardwork +gumby1 +gulliver +grapeape +goonies +goody +goodwill +ginola +ginge +ghjnjnbg +getmein +genocide +gbyudby +gaijin +fynjybyf +funtik +fragile +flippy +fkbyrf +first1 +fifteen +feetfeet +factor +facefuck +evanescence +ethernet +elvis123 +dragon11 +domestic +doggys +dodges +davidc +cradle +cortina +coolgirl +cluster +citron +cimbom +chronos +chrisb +chelsey +chauncey +cerveza +cedar +ceaser +caterina +cassi +carlotta +carlin +camino +callahan +bruno123 +bribri +braxton +boots1 +bobmarle +bloopers +blindax +bhjxrf +belfast +bedroom +baywatch +baraka +ballard +badguy +asdfjkl; +asas +archangel +antwerp +anthony2 +amo +adeline +acacia +abrupt +ZZ8807zpl +Severin +SAMANTHA +RuleZZZ +Paul +Nikita +Murphy +MERCEDES +Love1 +Harley1 +HAMMER +Gaell +Diablo +Dakota +COWBOY +Angela +Andrey +8PHroWZ622 +8899 +852963 +78963214 +747400 +69213124 +67camaro +622521 +50505050 +4rfv3edc +45612 +4554 +4141 +3838 +357mag +311088 +31101992 +31081992 +31081991 +31071992 +31071978 +31011978 +30121989 +30121982 +30111993 +30091991 +30091990 +30081980 +30071980 +30051990 +30031982 +30011981 +3001 +29111991 +29091994 +29091979 +29081992 +29081984 +29081979 +29071984 +29051976 +28101990 +28101984 +28101981 +28091979 +28081992 +28081987 +28041984 +28021994 +27121980 +27101984 +27101982 +27101980 +270988 +27091981 +27091980 +27061991 +27061987 +27041992 +27041981 +270388 +27021993 +27021989 +27021981 +261288 +261184 +26101979 +26081991 +260789 +26061977 +260285 +26021993 +2506 +25051975 +250484 +25000 +24111978 +240787 +24071985 +24061983 +24051983 +240484 +24041978 +24021982 +24011994 +23121993 +23121981 +231089 +23101989 +23101983 +230888 +23071980 +23061981 +23021980 +224488 +22121980 +22111984 +22101986 +220990 +22081984 +22061983 +220586 +22051979 +22021983 +22011980 +21121993 +21091981 +21071991 +21071981 +21071980 +21061979 +21041982 +21041980 +210388 +21021981 +20111993 +20111980 +201087 +20101979 +20091981 +20091979 +20081998 +20071979 +200688 +20051982 +20021978 +1hxboqg2 +19111983 +19071987 +18121981 +18111980 +180983 +18071985 +18061978 +18031987 +1800 +17111994 +17101984 +17081979 +170787 +17071981 +17061980 +17041978 +17031981 +1660 +16121984 +16121978 +161084 +16091993 +16081982 +16071990 +16071976 +16051992 +16021978 +15111994 +15091979 +15081974 +15061975 +150389 +15021992 +14531453 +14121982 +14101982 +1410 +14091992 +14081995 +14071994 +14071991 +14071982 +14061992 +14061978 +14041990 +14041977 +139139 +131086 +1310 +13091994 +13091981 +130876 +13081989 +13071981 +130689 +130687 +130577 +13031979 +13021980 +130189 +13011980 +123masha +123hfjdk147 +123bbb +123698 +123458 +123456789k +123456789012 +123123z +121286 +12111989 +12101991 +12091994 +12061993 +120285 +12011978 +11121993 +111185 +11101992 +110786 +11051993 +11041977 +11011994 +11011984 +11011983 +110110 +10111992 +101098 +10101968 +100886 +10081994 +10021980 +09121988 +09101987 +09061993 +09061985 +09051992 +09051982 +09051980 +09041993 +09031984 +08101993 +08101991 +08071981 +08061993 +08061980 +08051978 +08041991 +08021981 +08011993 +07071981 +07051979 +07041993 +07041991 +07031980 +07011984 +06121993 +06101984 +06051981 +06051976 +06041983 +05121987 +05071992 +05061992 +05021979 +04051992 +03111982 +03101987 +03071988 +03041979 +03041977 +03031980 +03021983 +02111991 +02021996 +02021995 +02011991 +01230123 +01121983 +01101993 +01061994 +01061980 +01031979 +000069 +zzz111 +zztop +zxcvvcxz +zaqzaq +xxx666 +wilmer +wicket +wendys +volkswagen +vfhbirf +vaughan +vaseline +uzumymw +uhbujhbq +ub6ib9 +torque +tonka +tomservo +timmy1 +thesaint +tessa +taxi +supers +steak +ssssssssss +splatter +spide +sonyvaio +soledad +soleda +soccer13 +sober1 +snowman1 +snowdog +snoopdogg +snakeman +slide +silvi +silly1 +shiznit +shift +sexyred +secre +saunders +satori +samanta +saddam +sabaka +robinhood +repoman +redrock +rayman +rattle +raster +ramzes +ramon +racoon +qwerty2 +qweewq +quarter +pushing +punter +polaroid +pokemon123 +plummer +pfkegf +peter01 +penal +patter +patate +patata +p455w0rd +oralsex +optical +openopen +open1234 +okay +noob +niggas +nhfrnjh +newpass1 +natal +mysecret +munson +mueller +mooner +montecarlo +momomomo +moment +missing +milhouse +mazda1 +mayfield +maybe +matias +masha +marita +mango1 +mailbox +maganda +luciana +loveyou2 +love11 +lorelei +libby +lemmings +learjet +larsson +kseniya +klopik +klaudia +kennwort +katzen +k.jdm +jason123 +jacker +irisha +index +iloveporn +hunters +hotman +hotchick +homer123 +hombre +hilfiger +hercule +hennessy +heather2 +hatchet +handle +greta +greatsex +gotigers +goodguy +gonads +go2hell +getin +ganjaman +gandolf +fuckem +fritz1 +fred1234 +francesca +fordf250 +forces +federica +fabiola +evelina +escher +empire1 +eleven11 +ebony1 +dropdead +doomed +doggystyle +dog +dingo1 +devilmaycry +destroyer +delgado +defcon +deborah1 +dbrecz +dawns +davidoff +darthvader +danilo +dadadada +crunchy +cronic +cristal +crevice +complex +columbo +colossus +cletus +claudine +chili +chicco +cheyanne +chevy2 +ceckbr +cayenne +catholic +catdaddy +cassius +caspe +canon1 +candie +cambridge +buttbutt +butchy +bushel +bryson +brutal +brock +brians +borman +boogaloo +bolero +bobcats +bloods +bigmama +bigboy1 +bernhard +ben123 +belle1 +beers +beeker +batgirl +bassett +barrel +barbara1 +augusto +asss +assclown +archon +arcane +aquarium +anthem +angeline +anechka +andreev +alfalfa +adventur +acetate +abudfv +ZXCVBNM +XXXXXX +Thunder1 +Sigmar +Rulez +RANGERS +Justin +Jasper +Dennis +Corvette +Chelsea +999777 +890890 +7575 +7272 +5tgb6yhn +5hsU75kpoT +345345 +34523452 +3216732167 +3113 +31121989 +31031992 +31031978 +31011980 +302010 +301280 +30121992 +30101992 +30101980 +300588 +30041981 +30031990 +30031981 +30031976 +3003 +30011984 +29111990 +29111977 +29061993 +29051983 +28121992 +28111980 +280886 +28071992 +28041985 +28031992 +28021995 +28021975 +28011993 +28011977 +28011974 +27121983 +27101977 +27091986 +27081979 +27071993 +27071981 +27061982 +27041994 +2611 +26071980 +260586 +26041982 +26041978 +25121993 +251088 +25101982 +250986 +25081992 +25081990 +250688 +25061993 +25061982 +25041993 +25011978 +24111986 +24101982 +2410 +24091992 +24091976 +24081983 +24071978 +24051982 +24031994 +24021978 +2315 +23061994 +23041980 +23031994 +221184 +22091992 +220690 +22051993 +22041980 +220390 +220387 +22031979 +22021978 +220185 +211221 +21091977 +21081984 +21081976 +210787 +210686 +21051992 +210487 +21031977 +21021980 +21011980 +20121991 +20121979 +201190 +20111992 +20111983 +20081980 +200587 +20041982 +20031982 +20031979 +1qazse4 +1Love +19191919 +19111993 +19111991 +19101994 +19071977 +19061981 +19051978 +19041984 +19031981 +19021981 +19011992 +19011983 +18121982 +180986 +18081984 +180786 +18071984 +18071982 +18061979 +18051995 +180483 +18041981 +18041979 +18031990 +18021994 +18021983 +17121982 +17101981 +17091993 +17061981 +170588 +17041993 +17021994 +17011995 +17011993 +16121980 +16121976 +16091994 +16091981 +16081994 +16061993 +16051982 +16051978 +160284 +16021992 +15935 +15121981 +15101993 +15061981 +15051984 +15031978 +15031976 +14101979 +14091993 +14081981 +14071992 +14061979 +140386 +130989 +13081994 +13051984 +13041980 +13011979 +12345c +123456abc +123321z +121277 +12121993 +12121978 +121185 +12111992 +12101992 +12061982 +12061978 +12051995 +120486 +12041975 +12031980 +12031978 +120287 +120283 +12011983 +12011976 +113113 +11121988 +111179 +11111981 +110887 +110780 +11071978 +11061978 +11051994 +11051981 +11041994 +11041979 +11031981 +110184 +10sne1 +101286 +10121983 +101182 +10111984 +101079 +10081978 +10071992 +10071979 +100585 +10051979 +10041980 +100388 +10031975 +100200300 +10011994 +09121976 +09111990 +09101981 +09081991 +09081978 +09041980 +09041975 +09011982 +088011 +08121992 +08111980 +08091979 +08081974 +08021993 +07111981 +07091980 +070788 +07071979 +07061989 +07061977 +07051983 +07041978 +07021978 +07011990 +06111988 +06081978 +06051982 +06031995 +06021990 +06011992 +06011976 +05091989 +05091983 +05081982 +05071979 +05061993 +05051994 +05031982 +05011980 +04101987 +04081990 +04071979 +04061976 +04041977 +04031986 +04021989 +04011982 +03121979 +03111985 +03101992 +03081986 +02121987 +02121984 +020986 +02071992 +01478520 +01101978 +01071979 +01051982 +01051981 +01021993 +0102030405 +zelda1 +yamahar6 +windy +wiggles +wedge +waterpolo +vladvlad +vargas +valentino +ultraman +tylers +topsecre +tittys +tim123 +tigre +tiffan +thrawn +thelast1 +teabag +tater +tatata +tanechka +tandem +supernatural +summertime +squire +sonya +sofiya +social +slainte +shibumi +shelton +sheets +shades +severin +selene +scorpi +santino +salvator +saab9000 +rutgers +router +rooter +romaroma +romanova +rincon +rigger +rickster +revolt +retsam +resume +regent +reborn +raziel +rattler +rastus +raindrop +ragnar +radio1 +qwerty77 +qazwsxedcrfvtgb +qaqaqa +porn69 +poopsie +pochta +penfold +pegasus1 +papaya +panpan +pagan +ovation +osgood +opensesame +open123 +ololol +ohbaby +ocean1 +norma +nigel +niagara +newhouse +nemo +needit +nbuhtyjr +murmur +mosaic +morozov +minnesota +mille +mich +mattingl +mateusz +mariko +mandolin +mamma +major1 +magics +magadan +maddison +louisa +loudog +lotus123 +looloo +letsplay +leroy1 +lenin +lebron23 +langley +lacey +labonte +kthjxrf +kosova +kolibri +kindred +kayla1 +julieann +juli +joyful +jordyn +joaquin +jenni +javie +james2 +jacqui +jackdog +ironman1 +idiots +hippos +henley +hell666 +helen1 +harrys +harpua +hallo1 +halibut +guilty +guevara +guesswho +growler +gfhjkm12 +gfcgjhn +georgia1 +geology +gbgbcmrf +garter +garnett +gardens +funky1 +fuckof +franck +foxhound +fireman1 +ferrar +fastcars +fannie +familia +falstaff +evergreen +essence +escobar +error +ericka +edmund +edmond +dutchman +duckhunt +docdoc +dobber +distance +dickey +dewayne +deathrow +dashka +danil +dakine +daffodil +cvbhyjdf +cumeater +cueball +crowley +crowbar +crocodil +creatine +crayon +corpse +coolone +colombo +cobraya +cntgfy +clara +cipher +christel +checkit +chastity +cesar +cbr600rr +cavalry +calcutta +cadman +bushed +buratino +buffys +buffalos +budget +brigada +briefs +bradshaw +boromir +blueman +bluedevi +blower +blaise +blackboy +blackass +bionic +bigpun +bignasty +belgium +beaumont +baylee +bavaria +barclay +balder +badkarma +babygir +astalavista +argent +anteater +amores +amoremio +allright +alligator +allegra +alanna +academy +Silver +SPARKY +RED123 +RAIDERS +Oliver +Mature +Liverpoo +JUNIOR +Gabriel +Chris +Brandon +Barbara +Austin +939393 +8PHroWZ624 +74185296 +666666a +654321a +515253 +4848 +4563 +44magnum +3465xxx +32165498 +31101975 +310888 +31071993 +31071976 +310589 +310189 +31011991 +31011984 +31011976 +30121980 +30111991 +30091979 +30091978 +300780 +30071984 +30071981 +300590 +30041978 +300300 +291286 +29111981 +291084 +29061980 +29051981 +281185 +28091983 +280884 +280882 +28071976 +280690 +28061993 +28061987 +28051979 +28041975 +28011980 +27121977 +271185 +270886 +27081993 +270787 +27071979 +27071977 +27061981 +27031982 +27031981 +27011991 +26262626 +26121995 +26121992 +26081984 +26071994 +26051991 +26031993 +26011995 +258258258 +255255 +253634 +25111983 +25091978 +25091976 +25081979 +25071982 +25051976 +250383 +24681 +24121979 +24071979 +24061982 +24041979 +24011993 +24011978 +2337 +231183 +23111981 +23111979 +23091993 +23071977 +230588 +2305 +230487 +230486 +23031981 +23021979 +2288 +22121991 +221188 +22111975 +22091978 +22081980 +22061993 +22061977 +220587 +22031992 +22021977 +220187 +211288 +21121979 +2110 +21081983 +21071979 +21061982 +210588 +210386 +21031982 +21021982 +21021976 +20121976 +20111988 +20111978 +20111974 +20101978 +20051994 +200487 +1Letmein +19111992 +1910 +19091989 +19051974 +19031991 +19011984 +19011976 +181089 +18051994 +18051983 +18041993 +18031992 +18021978 +1725782 +17101983 +17081981 +170585 +17051980 +170385 +170383 +17031978 +17011979 +16121994 +16111991 +16091983 +16081993 +16081981 +16081978 +16051983 +160190 +160187 +16011993 +15121980 +15101977 +150790 +150786 +150785 +15021982 +150185 +15011978 +14321432 +14121994 +14091985 +14081979 +14071993 +140689 +14031983 +14031981 +14011993 +13791379 +1357913579 +13121992 +13121981 +131085 +13101981 +13101980 +130790 +13051978 +130487 +13041982 +13041979 +13041978 +13021982 +123rrr +123qwe456 +123456asd +123456ab +12345432 +123258 +1232 +121312 +121280 +12121975 +121212q +121085 +12101980 +120885 +12081982 +12061995 +120588 +120579 +12051994 +120484 +120477 +12041981 +12041979 +120390 +12031995 +12011982 +1192 +111083 +11091981 +11081981 +11071981 +110384 +110288 +101088 +100882 +10061993 +10061979 +10031979 +100288 +10011981 +09071975 +09051979 +09041983 +09031993 +09021983 +09011983 +08121990 +080880 +08081980 +0808 +08051991 +08041987 +08031976 +08021982 +08011992 +08011985 +07121981 +07111990 +07111988 +07091994 +07091977 +07081975 +070782 +07061983 +07031981 +061290 +060686 +06051980 +06041993 +06011995 +06011994 +06011983 +05121980 +05101993 +05101985 +05101979 +05081980 +050584 +05041977 +05021986 +0428 +04111984 +04091982 +04071994 +04061992 +04051976 +04051975 +04031981 +04031977 +04021980 +0320 +03121977 +03111983 +03101980 +0310 +0308 +030778 +03041993 +03041982 +0302 +03011980 +02091992 +020383 +02032009 +01121981 +01111981 +01101981 +01092011 +01081979 +01061977 +01051977 +01051976 +01051970 +01012005 +zxzxzxzx +zolushka +yfafyz +wysiwyg +whoopass +westlife +wellhung +wasdwasd +warehous +waffenss +volkova +voland +voiture +vineyard +vicecity +vfylfhby +vfr750 +vergeten +vegita +vegas123 +usmc0311 +user345 +usausa +ufhvjybz +trucker1 +transfor +tooltool +tkfkdgo +tigress +thornton +thewall +teste +teamwork +taste +tamuna +swanky +swallows +surgeon +summerti +sully +steve123 +stetson +stamford +spartan117 +spade1 +solidsnake +snuggle +snookie +skippy1 +sinsin +sigma1 +shifty +shasha +shabba +sexy12 +service1 +sergej +seraphim +schatzi +satellit +sasasasa +samba +ruffles +ronaldo7 +rome +riddick +rerfhfxf +rerehepf +renat +remington +redwolf +redneck1 +redbeard +raptors +ram1500 +rakkaus +qwerty777 +qaz12345 +puppys +puddle +protoss +professor +process +politics +polarbea +polar +pinguin +pimpster +pigpig +photog +perro +percy +payton34 +patterso +passed +pantyhose +palomino +onepiece +numbers +nugent +nolimits +nippon +ninanina +nielsen +nicknick +newport1 +nectar +naruto1 +myhouse +myboys +muriel +murdock +mothra +morley +monkey11 +mongol +mischa +miamo +metalgear +meltdown +mckenna +mattmatt +masterkey +maripos +marina1 +manhattan +mamita +magnavox +maddy +maciek +lumpy +lucien +ltdjxrf +lovegod +lopas +loglatin +lifeisgood +licorice +lemming +leeds1 +learning +lalaland +lakers24 +ladles +kuwait +konrad +kitty123 +kingsize +kimchi +juanito +jodeci +jimmy123 +jenna1 +jaydee +invictus +intense +ingram +ibill01 +hottub +hot123 +hickory +hermann +harding +h2opolo +grove +gophers +goodness +goodison +goldman +glassman +giacomo +ghjvtntq +georges +genghis +gallery +galaxie +funeral +fuckall +fresh1 +forums +forumWP +fomoco +felicity +feedme +feanor +fathom +failsafe +fabrizio +f15eagle +excellen +evil666 +evgenii +emmitt22 +element1 +dumpster +dogma +djdjxrf +divorced +dillweed +dildos +diamant +dewey +denton +deepblue +davis1 +dart +darnell +dantes +cumonme +couple +counterstrike +cordoba +coolbean +conquer +commerce +colombi +collecti +clyde1 +cloggy +chuchu +chin +chillout +chemistr +centre +caribou +carefree +capital1 +calculus +calamity +caffeine +bucs +buchanan +bowl300 +boilers +bobert +bobbi +blue44 +black123 +bigpussy +bhbyrf +beijing +bastian +basser +barnaby +barlow +barakuda +babushka +assface +assault +asmodeus +asdfg12345 +aquafina +anna123 +angelito +angel7 +anette +ananda +aloha1 +alfons +alexandru +alessia +a1a2a3a4a5 +TAYLOR +Snoopy +SEXY +Rachel +NCC1701 +Matthew1 +Matrix +Lauren +Jackie +Gy3Yt2RGLs +Falcon +FREEDOM +Denise +Chicago +Britney +Boston +Berlin +Alberto +963369 +951951 +911111 +9000 +67890 +55chevy +5410 +52525252 +48151623 +4646 +456258 +333221 +3210 +31081986 +31081981 +31071987 +31071979 +31051981 +31031979 +31011982 +31011979 +300981 +30081993 +29111986 +29101981 +29091992 +29091978 +29071979 +29051979 +28121991 +281183 +28101993 +28101983 +28091994 +28081993 +280786 +280588 +28051978 +28041993 +28041977 +27121992 +27121985 +27101988 +27091994 +27091978 +27081992 +270790 +270789 +270784 +27071992 +270289 +27021979 +27011993 +27011980 +26exkp +26111990 +26101991 +26101978 +26091982 +26081982 +26071981 +26061993 +26051981 +260190 +25111981 +25071993 +25061977 +250386 +25021981 +241286 +24121980 +24081979 +24061977 +24041981 +24021980 +240185 +24011980 +2401 +23121980 +231185 +231088 +231081 +23091980 +23081981 +23071996 +23071978 +230689 +23061993 +23061978 +230584 +23031979 +23021995 +23021994 +230190 +230189 +23011995 +23011993 +221287 +22121993 +22111992 +221090 +22101980 +22081988 +22071976 +22061976 +22051995 +22031980 +220291 +22011981 +21121990 +2111 +21101995 +210990 +21081982 +21081979 +21041981 +21011993 +21011979 +20121980 +20121977 +20111981 +20071980 +20061979 +20061977 +1a2a3a +1Mustang +1Dallas +197 +1932 +1907 +19061979 +19051992 +19031979 +190190 +19011994 +18091981 +18081991 +180784 +18071992 +18041978 +18031984 +18031978 +17931793 +17121981 +171090 +170982 +17091988 +170889 +17081983 +17081976 +17071993 +17061972 +170486 +17031977 +17021995 +17021978 +17021974 +161085 +16101990 +160883 +16071996 +160589 +16051995 +16051980 +16051979 +1605 +16041980 +1604 +16031982 +16011978 +15121978 +15121973 +150984 +150889 +150686 +150483 +150384 +15031979 +15021980 +15011980 +141288 +14101980 +14101975 +140986 +140690 +140586 +140485 +140482 +140285 +14021993 +135799 +13572468 +135135 +1337 +1323 +131290 +1312 +130988 +13091983 +1308 +130788 +130784 +130586 +13051982 +13051981 +1301 +12451245 +12378 +12345678901 +123454 +123321456 +121292 +1212121 +121188 +121182 +121089 +12101981 +12071970 +12041961 +120388 +12031983 +1174 +112345 +112233q +112233a +11091982 +11091977 +11071994 +110580 +110488 +101186 +10101995 +10101994 +10091981 +100884 +100883 +100690 +10061994 +10061978 +100485 +100382 +10021992 +10021977 +10021976 +10011975 +10011970 +09121981 +09111982 +09101992 +09081981 +09061980 +09061977 +09051973 +08520852 +08111978 +0811 +080885 +08081978 +08071993 +08051982 +08011974 +07121990 +07111980 +07101994 +07091991 +070780 +0707 +07061992 +07031995 +07031982 +0690 +06121984 +06121981 +06111992 +06101992 +06091980 +06091979 +06071981 +060690 +06061992 +06051994 +06041985 +06041981 +06031994 +06011981 +05121993 +0512 +05111981 +05091990 +05071980 +05071971 +05041995 +05041979 +05031994 +05021992 +05021983 +05021982 +04121978 +04101994 +04081976 +04071991 +04031987 +04021994 +04021977 +04011983 +031290 +03121981 +03091993 +03091989 +030889 +03071979 +03061995 +03061980 +03032009 +03031976 +03021991 +03021980 +03011993 +02121979 +0212 +02111981 +0211 +020689 +02061994 +02061991 +02022008 +01111980 +01111979 +01071993 +01061978 +01061975 +01021996 +010188 +010187 +01011969 +01011963 +01011955 +0011 +yorktown +yogurt +yfhenj +yesterday +ybrbnjc +yahweh +wrong +worldcup +woodson +winchest +whodat +weapons +vwgolf +viola +victo +universi +unicorn1 +truckin +topless +tobacco +tiller +thunderbird +third +theory +tested +tecumseh +teacher1 +talgat +takashi +swansea +suzie +summer01 +suikoden +steveo +smuggles +smoked +smash +skateboa +silvana +sideways +shyguy +shrike +showboat +shanny +shamil +sexton +sevilla +sebastie +scruffy1 +schastie +sceptre +saphire +sandydog +salad +sailfish +sabian +rundmc +rubbing +roygbiv +rover1 +ronny +rjyjgkz +river1 +rickey +reset +reliant +regal +ratdog +rakesh +rainier +qwezxc +qwaszx12 +qazxsw12 +pussylov +psychnau +psyche +professional +prison +prashant +prancer +powerade +porn123 +pontiac1 +polpol +polk +plague +pipers +pinkpink +peregrin +peoples +pennstate +pattaya +pass99 +parsifal +parker1 +pablito +overload +ortega +omsairam +oilman +october2 +novikova +noriko +nickle +nichola +newnew +never1 +nadezhda +mywife +mymother +myangel +mustang9 +mustang8 +mustang0 +muskie +morlii +moonshine +mindless +mike11 +mike01 +michele1 +miamia +metropol +memnoch +maxfli +mauro +mauricio +matvey +master01 +marusya +martin6 +marlow +marley1 +marigold +manager1 +malaga +mahal +lusty +luscious +lunar +lugnut +luckyman +lovesme +lopata +longlegs +longhorns +lollollol +loll +lol1234 +leah +lancaste +labatt +kostas +killroy +kicksass +khalid +ketchup +kaykay +kayak +just +joshua12 +johndeere +jediknight +jazmine +indy500 +import +imhorny +ilya1992 +illumina +ianian +hotty +hotsauce +hometown +holahola +hitman47 +hermione +hellow +hellome +hellohello +hatteras +gwen +gunsling +gumball +gooddog +goldfinger +goheels +gogeta +glenwood +gisela +ghjcnjghjcnj +gfnhbjn +gfhjkzytn +gazelle +garth +gagaga +fulton +fuckyeah +fucke +freeme +fred123 +frasier +footlove +flapper +fiona +finnegan +fifty +fenton +fenix +felony +favorite8 +favorite7 +fathead +fabienne +erica1 +eragon +endless +emili +elgato +elbereth +dustydog +dupa +ducksoup +drjynfrnt +dragon13 +douglas1 +doodie +dominica +dkflbvbhjdbx +develop +delphin +delivery +dedede +dbnfkz +dawgs1 +davidd +darlin +dapper +dane +culture +crush +crusade +crfprf +crank +cowcow +copper1 +copenhagen +coolboy +control1 +consuelo +clitlick +cliffy +classy +chosen +chipper1 +chesty +champions +celticfc +caseydog +carcar +caramba +car123 +capri +camilo +camelot1 +cadets +cableguy +businka +bugatti +brownies +brenden +boris123 +boober +bonghits +bobbys +bobber +bluebear +blocked +blink18 +blackbel +billiard +bilbo1 +bigbutts +biceps +berkut +bastos +bartek +baldur +backs +bachelor +aztecs +ayrton +avangard +arslan +aria +angelofwar +anduril +andrew12 +andi +amarillo +amador +alphaman +alpha7 +alonzo +alabama1 +aguila +aeynbr +adrian1 +admin18533362 +abdulla +Winston +Thomas1 +Server +Segreto +Samsung +SOCCER +Rebecca +Mickey +MONEY +MATTHEW +LoveMe89 +Jeremy +Fabric +CRYSTAL +CAMARO +Boomer +Bonnie +BIGDOG +89898989 +8585 +7hrdnw23 +789852 +65656565 +654321q +5566 +555556 +555000 +512512 +500000 +4929 +333666999 +3223 +322223 +315920 +311290 +31031983 +31011993 +30111995 +30111992 +301090 +30101978 +30101974 +30091984 +30081994 +30061978 +30051978 +2w3e4r +2943 +29101983 +29031994 +29031992 +29031981 +28282828 +28121993 +28121980 +28101977 +28101974 +27111983 +27111981 +270986 +27081980 +270788 +27071975 +27061975 +27041991 +270386 +26121980 +261088 +260790 +26071978 +26061994 +26051994 +26031976 +26021981 +251289 +25121977 +251080 +25101993 +25101981 +250583 +25041995 +250188 +25011995 +25011980 +24862486 +241091 +24101981 +240889 +24081993 +240784 +24061981 +240590 +24041995 +240388 +240386 +24021992 +240187 +23121977 +23111980 +23091979 +230590 +230586 +23051993 +221177 +221086 +22101993 +22091993 +22091980 +22091979 +220790 +220788 +22071978 +22041994 +22041978 +22041974 +22031982 +211289 +211285 +21111975 +21081992 +210690 +210685 +21061981 +21031979 +21021994 +21021979 +210210 +210188 +21011982 +201283 +200990 +20091994 +20081996 +20061974 +20051977 +200483 +200184 +20011995 +1qaz!QAZ +1a2a3a4a5a +1Shadow +1Basebal +19451945 +1933 +19101981 +19081981 +19081975 +19071992 +19061974 +19031976 +19011995 +19011977 +180985 +18091994 +180883 +18071994 +180687 +18051981 +18041980 +18011995 +18011980 +1801 +17121989 +17121975 +171185 +17111993 +171088 +17101995 +17101978 +17091994 +1709 +17071994 +170584 +17021975 +17011981 +168168 +161190 +16101983 +16101976 +16071981 +16061995 +160585 +16051994 +16041979 +16041977 +16031981 +159753123 +153153 +15121994 +15111978 +15101978 +15091993 +15081977 +15071994 +15051977 +15021972 +1478520 +145632 +14111981 +141082 +14091981 +14091980 +140788 +140787 +14071976 +140688 +140483 +14021975 +140189 +1379 +131415 +131088 +13101979 +13091978 +130884 +130685 +13061980 +13051996 +130484 +130383 +130286 +13011995 +13011994 +12qwerty +124356 +123sas +12346 +121291 +121234 +12121973 +12121970 +12101975 +120988 +120983 +12091978 +12081978 +12061996 +120587 +12051975 +12041992 +120385 +12031977 +12031974 +112200 +111666 +111187 +111183 +11111975 +110988 +11091993 +11091980 +110880 +110490 +110484 +110479 +11031979 +11031975 +11021978 +11021974 +10121981 +101180 +10111995 +10111978 +101092 +101084 +101078 +10061977 +100387 +10031972 +100190 +100185 +10000 +0o9i8u +098098 +09111992 +09101990 +09091977 +09081983 +09071980 +09061978 +09031980 +08101988 +080886 +08061991 +08061982 +08051980 +08021983 +07121986 +07101991 +07101979 +07091992 +07091979 +07061981 +070273 +06121992 +06101994 +06091995 +06091981 +06081980 +06071977 +06061975 +06051984 +06041992 +06041982 +06031982 +05121981 +05091979 +05091977 +05071982 +05071978 +05051995 +05041993 +05031985 +05021984 +05011976 +04200420 +04121990 +04101982 +04081993 +04061983 +04051995 +04041974 +03121991 +03111988 +03071977 +03051977 +030389 +03031979 +03021994 +03011995 +02121993 +02081995 +02071993 +02061995 +01121991 +01111985 +01101992 +01092000 +01081993 +01071992 +0107 +010486 +010485 +01041994 +01041976 +0103 +01011962 +01011957 +000 +!QAZ2wsx +zhenya +zappa1 +yupyup +ytrhjvfyn +yodayoda +yfnfkbz +wtpfhm +wolfwolf +whoami +whatever1 +waves +vthctltc +voyage +vfvfvskfhfve +vfhbyrf +vadimka +useless +tytyty +tyrell +tribes +touchme +touchdow +tomate +toggle +thomas12 +thematrix +theflash +teejay +tactical +tacit +swanson +sven +strannik +stink +stew +stell +starsky +stampede +spinach +sorry +snikers +sneaker +slut69 +slayer666 +skazka +sixtynine +sinjin +sincere +sheltie +shadow2 +shadow01 +serial +searcher +scottt +satriani +satchel +satanas +saopaulo +samhain +salute +salt +sallas +sabrin +ryjgrf +rowena +rockroll +robbins +riker +rhfcfdxbr +rfkbyf +rfhfgep +rexrex +remy +reeder +red12345 +rapid +raoul +rand +ralphy +qwert12 +quack +pyramid1 +prisoner +primera +prime1 +primal +press +posture +pooch +ponyboy +polniypizdec0211 +pluton +pleaseme +playboys +pigdog +pieman +perez +pepsi123 +penn +pedersen +paulus +passions +passage +parasite +overtime +orleans +oriflame +number9 +number6 +nubian +norm +nomar5 +nokian70 +nikko +nikitin +nicki +niceday +nfvfhf +nexus +newage +nevermor +ndirish +natha +nata +nadegda +muttley +muller +mugwump +mousse +mousepad +moonstar +mobbdeep +mill +milenium +michael9 +melon +maymay +masa +maroon +marco1 +mapet123456 +manana +mammamia +magali +mackenzie +machoman +lowdown +lovesexy +lovefeet +lostsoul +longtime +longdick +lolwut +lol5 +lionlion +limpbizkit +liam +level42 +levani +leno4ka +leilani +lehman +legoland +laredo +language +lakings +kurosaki +kirkwood +kingtut +killyou +kilkenny +kiko +kathrin +kasey +juvenile +junkyard +jukebox +joseluis +jewboy +jesuss +jeffro +jbond007 +jared1 +januar +jadzia +jackman +iwantyou +indonesia +iloveu2 +ibilljpf +iaWgk2 +humpty +horus +hollis +hfleuf +henderson +headshot +hawker +hateme +hartman +hands +guigui +gtkmvtym +greyhoun +gramps +gospel +goodtimes +goodone +goldmine +goldgold +gohogs +ghjnjrjk +ghbdtn12 +geisha +gato +gannon +gandon +funnyman +freeland +forklift +floyd1 +flora +flintsto +fkmnthyfnbdf +family1 +fairway +essendon +empires +emachines +elite1 +elisa +eek +dunkin +drink +dragon99 +doodah +dina +dimebag +diddle +diabl +dfghjc +device +denni +darkmoon +damage11 +daisymae +dahlia +crisis +cowman +covert +covenant +corporal +cordelia +convoy +colour +cognac +codeblue +clues +claypool +cisco1 +chucha +china1 +charms +chaplin +cavallo +catalyst +carwash +carthage +carol1 +carissa +bunnys +bumblebe +buggy +buckbuck +broodwar +boswell +boscoe01 +bondarenko +bmw525 +bmw320 +blue69 +bigtoe +biggest +besiktas +bench +becool +bayliner +baraban +baphomet +ballgag +azteca +avengers +atlanta1 +asssss +assassins +asasin +aruba +arsenalfc +arcade +aquila +aqualung +apelsin +anselmo +andover +anatoliy +amyamy +amos +amir +amidala +all4me +algernon +alexei +aleksander +agnes +afrodita +access2 +aa123456 +Sexy1 +Q1w2e3r4 +Phoenix1 +Money1 +Lineage2 +K2TriX +Jordan1 +JOHNNY +EDWARD +COOKIE +BRANDON +Apollo +Andrew1 +Abcd1234 +AUSTIN +90909090 +89600506779 +7555545 +7415963 +61586158 +54545454 +520520 +444777 +33rjhjds +333222 +3263827 +31415 +311286 +31081993 +310784 +30081985 +300688 +30061975 +300585 +30051983 +30051982 +2wsxzaq1 +29121977 +290788 +290785 +290687 +290589 +29051995 +29051978 +29041979 +29041976 +29041974 +290386 +29031980 +29011977 +28121975 +28111994 +2811 +28091977 +28041995 +28041978 +2801 +271286 +27111980 +27091992 +27081991 +27081982 +27081981 +27041995 +27031980 +270290 +270183 +27011995 +27011977 +26121982 +26091983 +26091978 +26071995 +260689 +26061982 +260590 +260585 +260490 +26041993 +26041980 +2603 +260290 +26021978 +25121992 +25111984 +25111977 +250987 +25091996 +25091980 +250884 +25061980 +250292 +250288 +250283 +2502 +250189 +246813579 +24121991 +24111993 +24111976 +241089 +24091983 +2407 +24061993 +24061980 +24051981 +24051980 +240489 +24031977 +233223 +231280 +23101993 +23091975 +23081995 +230791 +230782 +230686 +2306 +230585 +230187 +23011978 +23011975 +22121994 +22111994 +22101979 +22091994 +22071980 +220687 +220686 +22061979 +22061978 +220581 +2203 +22021993 +22011994 +2124 +21091994 +210786 +21071993 +210490 +21041975 +210383 +21031978 +21021978 +210186 +21011995 +201289 +20121993 +20121981 +201085 +20101980 +200989 +20071994 +200689 +20061993 +20051978 +20021976 +200200 +20011993 +20011976 +1Sexy +19561956 +19111982 +19111979 +19091981 +19071981 +19031983 +19011980 +19011975 +181285 +18111993 +18111991 +18111975 +18101994 +18101993 +18081978 +180386 +18031983 +18031977 +18021980 +171189 +170783 +170782 +17051974 +170388 +17021980 +17011996 +17011980 +1611 +16091989 +160882 +16081976 +16071984 +160686 +16051977 +16041981 +16021981 +16021975 +1602 +16011976 +159753852 +15111992 +1511 +150990 +15091982 +15081981 +15061980 +150580 +150488 +150482 +1503 +14921492 +1475963 +1428 +141287 +14121992 +14121981 +14121978 +14101976 +140887 +14081973 +14071979 +14071978 +140686 +14061976 +140486 +14041979 +140383 +14031994 +14031993 +14031979 +14021994 +14011995 +14011981 +14011979 +131286 +13121993 +131191 +131186 +131182 +13111992 +13111983 +13101991 +130990 +130985 +13091992 +130891 +130781 +13071995 +13041975 +13031995 +13031978 +13021981 +1258 +1256 +124816 +12345A +123456qq +123456A +1234432 +123369 +1233211 +123123e +121287 +12111980 +121087 +121084 +12101994 +120883 +120790 +120779 +12071993 +120688 +120686 +12061977 +120585 +120578 +12051978 +120491 +120487 +120387 +12031981 +12031976 +12021977 +12021974 +120185 +120183 +1147 +111285 +111177 +11101994 +11101977 +11101976 +110986 +11081995 +11061977 +110589 +110495 +110284 +1069 +101287 +10101972 +100977 +10091973 +100686 +100581 +100488 +10041977 +10031994 +10021979 +10011977 +100001 +091286 +09121991 +09121980 +0912 +090988 +09091992 +09091983 +09081979 +090807 +09041992 +09041976 +09021981 +08121980 +08111977 +080888 +08081977 +08071975 +08031979 +0721 +07101981 +07101962 +07081979 +070786 +07051982 +07041992 +07031992 +07021992 +06121978 +061172 +06101977 +06091986 +06081976 +060689 +06061974 +06021993 +05101992 +05071994 +05061979 +050585 +05041980 +05021978 +05011982 +04111983 +04111980 +04101983 +04091992 +040881 +04031988 +04031975 +04021991 +04011984 +03121988 +03061993 +03041976 +030383 +03031995 +03031978 +0220 +0214 +02111993 +02051994 +02051993 +0126 +01121992 +01111978 +01111977 +01101975 +010985 +01091993 +01041977 +01022011 +01021975 +0102 +010183 +01012008 +zxcvb12345 +zcxfcnkbdf +z1z1z1 +ytyfdbcnm +yomomma +yecgaa +xterra +wonton +wonderland +wisconsi +william2 +whKZyc +warden +vostok +volodya +volodin +viper123 +violeta +vincen +velcro +valdemar +tuttle +tuffy +trojans1 +tristar +trader12 +torment +timetime +timeless +tigger12 +thissuck +theworld +texass +tenten +tennessee +syrinx +sweet16 +sushi1 +stockings +steel1 +steamer +st0n3 +solrac +soda +soccer2 +sobriety +snoogans +skypilot +sk84life +simcity +sidewind +sharon1 +shari +shady1 +shadow11 +sensual +semen +sega +sector +scoop +schwartz +schnuffi +schneider +sawdust +sandys +sandi +romana +romain +rockydog +rjyatnrf +riviera +rickie +rice80 +reverb +resist +ratfink +randal +ramone +raisin +raffles +qwerfdsa +qazxswedcvfr +qazedc +q1234567890 +pussylover +princessa +popsicle +pops +poohbea +pluto1 +planning +pipiska +picker +phoenix2 +password3 +passfind +pasport +parliament +parking +oscar123 +orange12 +oneton +oleole +oldschool +oldnavy +ocarina +obrien +nvidia +novikov +nonrev67 +nodoubt +nitrous +nikita1 +nikenike +nihongo +nicky1 +nichols +nibbles +nessie +nbvjif +nasdaq +nascar3 +myszka +mycock +murat +mormon +morgen +morga +mommie +milashka +mikki +miamor +mettss +messi10 +memo +megafon +maxman +marx +martino +marietta +manner +makemoney +madiso +mackey +lucky2 +lucas123 +ljrnjh +lisboa +lindsay1 +limpopo +leningrad +lemieux +leahcim +kylie +kratos +kovalenko +kobe08 +klein +kilo +kasumi +karapuz +kakaka +kabuki +juno +jumping +jetson +jesusc +jeepcj7 +jamila +jakers +jackets +iris +investor +imcool +iloveher +iddqd +htubyf +hrvatska +hotbabe +horsey +hommer +haynes +havoc +hammerhe +gypsy1 +guyute +gunsmoke +gulnaz +guide +group +gregg +greeny +greedo +grape +goodwin +goodstuf +gobucs +glove +glock17 +gixxer +gimme +gilmour +giddyup +ghtktcnm +ghbrjkbcn +ghblehrb +gfhfljrc +gfdkbr +germany1 +gangrel +galatasaray +fy.nrf +fuckyou123 +fuckfest +fuck12 +franki +forgiven +flhtyfkby +flapjack +firework +firestor +filimon +fightclub +farcry +fancy +fabia +exploite +embassy +elrond +elisabeth +egorov +ecstasy +driving +dreamers +dove +domenow +doggone +dmitry +discount +derevo +derby +denny +david2 +david12 +darts +dann +danmark +dalejr8 +cynthia1 +cyberonline +cvbhyjd +cubano +critical +cretin +count +corsica +conman +clubber +chocobo +chisox +cheer +charlies +cereal +carney +carly +carlson +c3por2d2 +buttplug +butchie +buckeye1 +bubbaa +brutis +boss302 +booty1 +bones1 +boggie +bloomin +blacksun +bitchin +bigpimpi +biff +beeper +bball1 +barracuda +barracud +banjo +baltika +baloney +babababa +azsxdcfvgb +astroboy +ashes +art131313 +arina +arabella +aquaman +appleton +annabelle +ambition +ally +alex11 +akatsuki +agnieszka +afghan +advocate +adelaida +adamadam +abcdefghi +Welcome +Tight +Rush2112 +MICKEY +Jonathan +Jason +James1 +JAMES +HrfzLZ +Hawaii +Florida +Daniel1 +DICK +DANDFA +CAPA200 +BOOBOO +A123456 +9111 +777888999 +777444 +6363 +5641110 +4266 +36363636 +3456 +3323 +31081984 +310585 +31051994 +310388 +310181 +31011988 +30111978 +30091981 +30091977 +30081981 +30011982 +29121978 +29091976 +29061976 +290388 +29031996 +29031977 +29021992 +28121994 +28081980 +28081979 +28071979 +280585 +28051976 +28021982 +271828 +27111979 +27101981 +270885 +27071980 +27061995 +27061993 +27061979 +27061976 +27051981 +27051980 +27051976 +27051975 +270485 +27041978 +27031978 +27031976 +270283 +27011992 +27011976 +26121994 +26101980 +26081994 +26071976 +26071974 +26061980 +260488 +260381 +26021982 +26021979 +26021977 +26011994 +251286 +2512 +251087 +250981 +250886 +25081982 +250788 +250590 +250586 +250582 +25031981 +25011981 +2442 +241290 +24121992 +241182 +24111975 +240988 +24081981 +240782 +24071980 +24071974 +240684 +24061979 +24061975 +24051977 +240485 +240479 +24041994 +24041980 +240384 +240285 +235711 +23176djivanfros +231286 +231190 +231188 +230986 +23091977 +230785 +230687 +230283 +23011994 +23011976 +2274 +2234562 +22111976 +221089 +221084 +2210 +220986 +22081996 +22081994 +22081982 +22071995 +22071994 +22071979 +22071977 +22061996 +220486 +220485 +22041970 +220391 +22031993 +220292 +220186 +211186 +210984 +21091993 +210890 +21071978 +210684 +21061975 +21051994 +21051980 +210489 +21041979 +210385 +21021993 +20121992 +20121975 +20111979 +201086 +20091980 +20091978 +20081981 +20051975 +20021979 +20011977 +1qwert +1qay2wsx +1Fuckme +198111 +19121979 +19121977 +191191 +19111980 +19111977 +19101976 +19091977 +19081980 +19051995 +19051982 +19021978 +1901 +181085 +18091990 +18091979 +18081981 +180689 +18061977 +18041982 +1804 +180180 +17091990 +17091989 +17091980 +17091976 +17071979 +17071977 +170590 +17041981 +17041974 +170288 +17011978 +16121993 +160890 +16081996 +16071979 +16061978 +16031995 +16011996 +16011995 +1516 +15151 +151289 +151188 +15111983 +15111979 +151084 +150987 +15091991 +150883 +15081982 +15071978 +150684 +15061982 +150487 +15021994 +15021979 +15021977 +15021976 +140890 +14081980 +14081977 +1408 +140681 +14061994 +140589 +1405 +14041980 +140388 +14031992 +140287 +140283 +14021976 +14011974 +13579- +135531 +13121975 +131179 +13111978 +13091976 +13081976 +130789 +13061995 +13061993 +13061978 +13051980 +130489 +13041994 +130289 +13011975 +123xyz +123456p +1234567u +123456789qwerty +123456789n +123321qwe +1233210 +1231231 +12233445 +121290 +121179 +121086 +12091993 +12091979 +120887 +120886 +12081996 +120789 +12071995 +120679 +120586 +12051976 +120480 +120393 +120282 +120281 +12021996 +112263 +111188 +111116 +111111111111 +110983 +11091996 +11091979 +110889 +110689 +110682 +11061975 +110584 +11051992 +11041975 +110290 +11011993 +10121975 +101188 +10101970 +10091975 +100880 +100790 +10071978 +100683 +100586 +10051982 +10051980 +10041994 +100384 +10031995 +10031982 +10021973 +090784 +09071993 +09071976 +09061979 +09061975 +09061972 +09051977 +09031982 +08154711 +08111989 +08111979 +08101982 +08091977 +080889 +08071980 +08061977 +08051988 +08051977 +08041993 +08041977 +08031984 +08031973 +08021987 +08021976 +08011981 +07121980 +07111983 +07111978 +0711 +07051977 +07031996 +07031983 +07011994 +06121990 +06111993 +0611 +06101993 +06101990 +06101983 +06101978 +06091992 +06091976 +06081977 +06071979 +06061977 +06051975 +06031980 +06021991 +05121978 +0510 +05091982 +05091981 +05081993 +05081990 +050786 +050586 +05011991 +05011979 +04091988 +04091984 +04091983 +04091978 +04081988 +04081980 +040786 +04061975 +0321 +0317 +03121993 +03121992 +03091995 +03091994 +030883 +03081981 +03081977 +03081975 +03051992 +021286 +021285 +02121982 +02121977 +02111980 +02111978 +02101992 +02081992 +02051996 +014789 +013579 +01121994 +01091995 +01091981 +01071976 +010688 +01051975 +010488 +0104 +010389 +01031977 +01021979 +01021974 +010184 +010176 +01011959 +001100 +%%passwo +zzzzzzzzzz +zydfhm +zaq1xsw2cde3 +yxcvbn +yukon +yayaya +yana +xfactor +world1 +wooster +wipeout +winkle +whaler +westham1 +westcoast +weedweed +weeble +watashi +warped +wargames +w1w2w3w4 +voltaire +vitaliy +vesper +versus +version +venus1 +venezuel +ultras +tupelo +tugger +tripp +trilogy +toys +toxic +titlover +tired +tillie +three3 +thorsten +thinkpad +thetachi +thejoker +teufel +test11 +teres +tenpin +televizor +tazdevil +tartan +take +sweethea +swat +sure +summer12 +stroller +stinger1 +steelhea +started +stand +sports1 +southsid +sonnyboy +socrate +smurfs +smooth1 +smallville +slurred +sludge +sk8ter +signals +shipping +shana +shakti +seren +semaj +scooby2 +schwinn +sargent +samwise +samson1 +safe +ryanryan +ruthless +runrun +rumple +royale +rosalie +rodina +rocking +rocketman +rocco1 +robinhoo +robert2 +riding +retail +repytwjdf +refresh +redhead1 +redfive +realms +reaction +rasta1 +ranchero +ramazan +raging +qwe789 +quixote +pussylicker +puerto +puckett +psychnaut1 +prospero +primetim +prikol +price +prettygirl +prasad +prakash +polly1 +polgara +playful +pizzapie +pissant +piepie +pheasant +phatty +peter123 +perils +patryk +passing +pass01 +parties +paroll +parish +outcast +ouT3xf +orkiox. +organic +orca +omanko +olivia1 +olgaolga +october1 +oc247ngUcZ +nutsack +nonsense +nomads +nokia5300 +nokia3250 +nikit +nighthaw +newworld +naomi +nacional +mustang3 +mothe +mostwanted +mosquito +mopar1 +moonpie +moonmoon +monique1 +mnmnmn +miranda1 +minotaur +milford +micke +michi +michael8 +micha +mewtwo +metals +metalica +medicina +mcleod +mavericks +marykay +marsik +marlowe +marko +maribel +margosha +marcy +marcie +makoto +main +mage +m0nk3y +lunch +lovegun +looper +liver +lindsey1 +lind +lavender +launch +laracrof +lapdance +ladygaga +kukolka +kodiak1 +kochanie +kochamcie +knockout +killemall +keys +kenya +kawaii +katy +karla +karamelka +kapusta +juggle +jubjub +joyride +jobs +jim123 +jetaime +jerusalem +jerrys +jerryg +jerking +jerem +jedimast +jazzy1 +jamison +jamest +jagr68 +iwantsex +islands +islam +isis +ironmaid +interpol +internat +inform +inflames +indahous +imzadi +ignacio +hotwife +hornyboy +hooch +hondacivic +homies +holley +hellokit +hannover +handcuff +hallmark +halfmoon +gsxr600 +grey +gremlins +goodies +good4u +ghfdlf +gemini1 +ganjubas +galadriel +galactic +futures +fuckup +frontera +freiheit +freezer +freak1 +francis1 +foghorn +flamer +fishnet +faulkner +fantastic +falco +fabiol +excell +evgeniya +epaulson +elisha +eight8 +egorova +edwardss +edith +ducati99 +dogfish +dkflbvbhjdyf +dirtbag +dimasik +dickman +dickface +diane1 +dfghjk +dewitt +desk +desires +decatur +dbrf134 +daytime +dayday +davidj +darker +danielit +damager +dale03 +d12345 +cuties +curly +cumload +cum4me +crossbow +cramer +coyotes +conejo +compa +colgate +closed +clocks +clarion +chump +chocho +chimchim +charm +chantel +champagn +chacal +cfiekz +catalin +career +cancan +camaroz2 +cafe +bypass +buttsex +bungie +bungee +bugsbunny +bublik +britta +bourque +boring +boliva +bodies +bluegill +blondie1 +blingbling +blastoff +blade2 +bingos +billion +bigpapa +biggdogg +big123 +bible +bianchi +bethann +behemoth +batigol +bassist +bareback +bantam +balle +badlands +backspac +aziz +autocad +audis4 +auction +asphalt +asd12345 +arsehole +arioch +argonaut +arfarf +antoshka +antonio1 +anita1 +angie1 +allstars +alexandria +ak1234 +adadad +account1 +abc321 +XyTFU7 +WINSTON +Vampire +Taylor1 +THUNDER +SNOOPY +Raiders +Qq123456 +Nathan +Michigan +Marshall +Magic1 +JYs6WZ +Gfhjkm +Freedom +FUCK +DIAMOND +Crystal +CHELSEA +Babylon5 +987412365 +96969696 +968574 +8787 +7979 +748159263 +7171 +555444 +5550666 +524645 +4567890 +3e2w1q +335533 +326159487 +3214 +31313131 +311288 +31121993 +31121981 +31101979 +310889 +31081980 +310785 +31051980 +31031993 +31031991 +310185 +30121979 +30121978 +301184 +301087 +30101975 +30091980 +30081978 +30071977 +30061994 +30061976 +30051995 +300490 +30041977 +30031994 +30011995 +2cool4u +29121983 +29121979 +291085 +29101987 +29101979 +29101976 +290981 +29081994 +290786 +290585 +290484 +29031979 +29031976 +28121977 +281184 +28111993 +28111981 +28111978 +28111975 +281086 +280988 +28071974 +2805 +280490 +28041981 +280388 +28031993 +28031978 +280289 +280285 +28021980 +28021973 +28011982 +271184 +270985 +270282 +27021996 +27021976 +261090 +26091994 +260793 +26051976 +26041973 +2604 +26031979 +26021983 +26021975 +2552 +251283 +25121979 +251181 +25111975 +251085 +251084 +25091993 +25091981 +25081981 +250785 +250685 +250589 +250587 +25041976 +25031977 +25021980 +25011976 +25011973 +241285 +241281 +241085 +24091980 +24081991 +240690 +240680 +24061978 +240487 +24041974 +240385 +240383 +23121976 +231182 +23111992 +231090 +2310 +230987 +23091981 +230883 +230882 +230789 +230788 +23071993 +23071983 +230690 +230491 +230485 +23041978 +23041975 +23031995 +230291 +230284 +230185 +23011997 +22121979 +22111981 +221087 +220883 +22081975 +220787 +22061994 +22051994 +22031976 +220188 +22011978 +2201 +212223 +21111980 +21101976 +210988 +21081994 +210591 +210488 +210384 +210290 +210191 +201088 +20101994 +20101977 +20091982 +200882 +20081977 +200789 +20061973 +200590 +200588 +20051993 +20051979 +200488 +200385 +20021977 +1qw23e +1q2q3q4q5q +1Monkey +1Jennife +19581958 +1937 +1936 +19091975 +19071980 +19061976 +19051994 +19051973 +19041994 +19041982 +19041979 +181289 +181187 +18101980 +180980 +180584 +18051978 +1805 +18031979 +180292 +180285 +1802 +18011979 +18011978 +18011976 +18011974 +17121979 +17111981 +171085 +17081978 +170785 +170692 +17061977 +17061976 +17051994 +1705 +17041982 +17041975 +17031995 +17031982 +17021977 +17011982 +17011975 +161285 +16121981 +16101979 +160985 +16091979 +160687 +16041973 +160395 +160384 +160290 +16021977 +16021976 +16011981 +15963 +151286 +151189 +151185 +15111993 +15111982 +151089 +15101994 +15101974 +15091977 +1508 +150783 +15071976 +15041976 +150290 +15011979 +145145 +140988 +140984 +14091978 +140789 +140781 +14071970 +140687 +140685 +14051978 +140490 +140290 +13691369 +1357911q +131190 +13101978 +1309 +130893 +13061992 +13061973 +13051976 +13051974 +1303 +1302 +130190 +123qweASD +12369 +123456zxc +123456o +123456h +123456789abc +121285 +12121994 +121184 +12101993 +12101978 +12091975 +120890 +120889 +12081976 +120784 +12061981 +120590 +120584 +12031996 +12031994 +12021981 +120000 +1178 +111444 +11121982 +111190 +11111994 +11111977 +1111111111zz +110989 +110987 +110981 +110980 +11091978 +110893 +110884 +11081977 +110784 +11071995 +11071977 +11071972 +110691 +110683 +11051995 +11051978 +11051976 +110486 +11041981 +110390 +11021977 +101276 +10121996 +10121012 +101190 +101185 +10111977 +100990 +100988 +10081977 +10081975 +100783 +100687 +10051977 +100486 +100480 +10041995 +10041981 +100386 +10021995 +10021978 +10011995 +0wnsyo0 +09121977 +09101989 +090989 +09091993 +09081992 +09081980 +09071994 +09071989 +090587 +09041981 +09041978 +09031976 +09021978 +08091993 +08091983 +08071989 +08061978 +08041978 +08041976 +080386 +08031975 +08021973 +07121991 +07121982 +07121979 +07111993 +07091981 +07021974 +07011993 +07011991 +06111991 +06111980 +06101979 +06071978 +06061979 +06051995 +06041978 +06031977 +0602 +05111980 +05091994 +050888 +05061973 +050583 +05051978 +05021996 +04121991 +04121981 +0412 +04101981 +04101979 +040985 +04091993 +04091980 +04051978 +040486 +04041975 +04031996 +04021993 +03101994 +03101993 +03101978 +03081978 +03071981 +03051974 +03021977 +03011981 +02121978 +02111977 +020890 +02081993 +02071996 +02051995 +020288 +01111976 +01091970 +01081994 +01061974 +01061973 +010490 +01041978 +01031996 +01031995 +01021978 +01021970 +010171 +000000a +zoezoe +zepplin +zaxscdvf +yxcvbnm +yjdsqujl +woodward +wonkette +windstar +wicked1 +whosyourdaddy +whopper +whatthefuck +weirdo +warcraft1 +wantit +walkman +vulture +virtua +vfvfvfvf +vfnhbwf +vertical +verify +venezia +vbkbwbz +vasya +ukraina +ubnfhf +twodogs +tuborg +trolls +trippin +trashman +toyota1 +totally +toobad +titus +titan1 +tinatina +tigger01 +tide +thinker +therion +thebes +thatcher +tess +terrible +terminus +telecast +tele +taratara +talent +tables +system32 +sysadmin +sylvester +sydney1 +sydne +swede +susann +surfin +supper +stlouis +steward +steves +step +starks +squish +sport1 +spanks +snotty +smarties +slydog +slayer66 +skyblue +skittle +sitruc +siberian +showcase +shining +sexslave +seven77 +sensatio +seller +sdsdsd +scooters +schoo +sarahs +sandeep +samolet +salamandra +rosette +rosebud1 +roodypoo +roderick +rocketma +ricochet +reporter +relax +reklama +reddog1 +rebirth +razzle +rave +ramair +rajesh +ragman +rafae +qwertyasdfgh +qwerty22 +qwertasdfg +q1q1q1q1 +pusher +pulamea +proteus +priscill +print +poppet +poopy1 +polka +polinka +poiupoiu +plover +piramide +petey +peterose +pelikan +parade +papapapa +panchito +paige1 +oneshot +olivetti +olechka +odysseus +numlock +notredame +nosferat +njdevils +nikitina +newstyle +networks +neogeo +natalka +mysterio +mymoney +mutabor +munchie +mulberry +muaddib +moosey +moneymoney +mojomojo +minister +minion +millerli +michael3 +meyer +mexic +memorial +mclean +mazinger +matvei +mathilde +matches +match +marmar +marduk +march13 +mara +mansur +mania +man123 +mamedov +makarov +mailmail +mahalko +lynne +lucky777 +lucinda +loveyou1 +lockheed +lineman +lfybkrf +lfhbyf +levi +leralera +leone +laxman +lauras +lasher +landscap +lance1 +lakeview +kosher +knowledge +kingair +kilgore +kevins +kban667 +kalle +k123456 +justin12 +johnn +jessie1 +jemoeder +jaws +jasper1 +janus +january1 +jamaica1 +jakedog +jacque +jackso +jack123 +izzicam +itworks +itachi +isgreat +invader +indica +income +illegal +idiom +ibill123 +hubbard +hotwheel +hotcock +hondo +hoddle +hiroshi +hibernia +hershey1 +hermit +herald +hello2u +hayes +haribo +hansel +halflife2 +haley1 +habana +gunter +guillaum +grizli +grifter +gravel +grassy +grainger +gjgeufq +give +girlfriend +ginger12 +gibbons +ghostman +ghbrjkmyj +gfhkfvtyn +gemstone +garry +funn +funguy +fuck777 +fresca +freetime +fnkfynblf +flyaway +flossy +flossie +feyenoord +femmes +felice +fedcba +fatpussy +famili +evenflow +etnies +erfolg +erasmus +elite11 +elissa +elise +elena1 +echo45 +easypay +dwarf +duranduran +dune +dtythf +dream1 +dragon88 +dopey +donny +dominator +derrick1 +denisa +dawggy +dave123 +darkknight +cvzefh1gkc +current +cuntlick +cstrike +cristiano +crimson1 +creep +creativ +coop +conker +commodor +colocolo +coffin +coffee1 +cnthdf +cnfcbr +cleaning +cinders +chrissy1 +chrism +chocolate1 +chicas +chewbacca +chevyman +cheche +chatte +charlie3 +charles2 +catscats +catlover +catfish1 +cashman +casa +canseco +canad +camill +camaro69 +calvary +caddis +cabinet +bungalow +bullets +bugbug +budda +buckie +brutus1 +browneye +browne +brianna1 +brian123 +bretagne +brentfor +brat +brasilia +brandie +brabus +booby +boggle +blueline +blue45 +blue33 +bling +blaster1 +billing +biggin +bigdogg +bigdave +bettie +bereza +begood +bateman +bartlett +baile +bagger +badnaamhere +avgust +author +aurelia +audi100 +asslick +ashlyn +ashish +asecret +asd1234 +artofwar +arabic +angle +angeleye +andros +andrej +anatomy +amherst +aman +aluminum +alpha12 +allure +all4u8 +airborn +adonai +acura1 +acoustic +aces +a123321 +Thunder +Sophie +Soccer1 +Scooter +SMOKEY +Qwerty12 +Packers +PORSCHE +Metallic +Madison +MAVERICK +Lucky1 +Letmein +ILOVEYOU +Hello1 +Hamburg +DtE4UW +Brittany +Blink182 +Billy +Bandit +BRANDY +Angel +9669 +96385274 +951159 +89015173454 +852654 +789123456 +741236 +68camaro +56835683 +555888 +554455 +5404 +4r3e2w1q +4SNz9g +4904s677075 +479373 +4556 +451236 +4510 +4422 +4313 +3663 +3283 +311083 +31101973 +31081995 +3108 +310790 +310586 +31051976 +31031994 +310184 +31011977 +31011974 +30303030 +30121993 +30121991 +30101994 +300zx +30071993 +300586 +300583 +300487 +30041994 +30011979 +291296 +290989 +290688 +290681 +29061995 +29061994 +290584 +29041978 +29011976 +281283 +28121979 +28091995 +28091978 +280885 +28081983 +28081982 +280686 +280586 +280487 +28041982 +280391 +28021996 +28011975 +271189 +2711 +27101979 +27091982 +27071978 +270684 +270585 +27051972 +270187 +261183 +261083 +26101993 +26071996 +26071977 +260681 +26061976 +26051980 +260390 +260280 +26021980 +2601 +258741 +251280 +25121981 +251182 +251089 +25091979 +25091977 +250790 +25071994 +25071979 +2507 +250686 +250681 +25061976 +25051977 +25041994 +25031996 +24601 +241282 +240985 +240789 +240786 +24071977 +24051994 +24051974 +24041977 +240286 +240183 +24011975 +2332 +2324 +231288 +23121994 +231187 +231186 +23111971 +231082 +23101980 +23091974 +230889 +230792 +230780 +230591 +23051995 +23051979 +23051977 +23051975 +23041979 +23011970 +2301 +222222222 +221289 +221283 +22121995 +22121981 +22111993 +22101982 +22091970 +220886 +220884 +22081993 +220791 +220789 +2207 +220685 +220683 +220677 +220585 +220386 +220385 +22021981 +2112rush +21121994 +21121982 +21121973 +210987 +21081996 +21081995 +21081975 +210695 +210689 +210589 +210395 +210381 +21031980 +21011994 +201286 +20121978 +201186 +20111996 +200993 +20091977 +200889 +200886 +200784 +20061994 +20041975 +200386 +20031995 +20021974 +20021967 +1934 +19141914 +19121981 +19091994 +19081993 +19071979 +19051979 +1881 +1856 +181186 +181088 +18101981 +18091977 +180790 +18071977 +180588 +180587 +18051996 +18051977 +18051975 +18051974 +180485 +18041994 +180388 +18021985 +18011994 +171285 +171280 +17111978 +171083 +17101982 +170989 +17071982 +17061978 +170582 +170492 +170488 +170485 +170392 +17011971 +161288 +161287 +161281 +161184 +16111981 +16101993 +16101980 +160989 +16071995 +160682 +16061994 +1606 +16051974 +16031978 +1603 +16021980 +16011992 +159875321 +15101975 +150978 +15091994 +15071995 +150689 +150681 +15061976 +15051975 +150388 +15031996 +15031995 +15021995 +150187 +1488 +141285 +141281 +1412 +14111992 +141088 +141087 +141084 +14101994 +140886 +14081996 +14081976 +14071995 +14071977 +1407 +14061977 +14051980 +140489 +14041994 +140385 +140188 +14011997 +14011978 +13579246 +13421342 +131289 +131287 +13111993 +131089 +13091979 +130886 +130785 +13071977 +130589 +130583 +13031981 +13031977 +13031973 +130287 +13021975 +130188 +1300 +1253 +1248 +123q123q +123QWE +1234567z +12332112 +123123123q +12251225 +1223334444 +121268 +121178 +121176 +12111978 +121090 +121079 +120987 +120984 +12081975 +12071977 +120687 +120683 +120680 +12061976 +120589 +120490 +12021975 +12011981 +111276 +1111999 +111178 +111089 +111088 +11101993 +11101974 +11091994 +110892 +110890 +11081976 +11081975 +110778 +110586 +110581 +110482 +110391 +110385 +110282 +1090 +101295 +101289 +10121995 +101187 +10111993 +10111979 +10111974 +101087 +101076 +10081974 +10071994 +10071975 +10051981 +10051978 +100490 +10041974 +10021997 +10021975 +09121974 +09111981 +09111972 +090978 +09091974 +09071983 +08091976 +08071994 +08031995 +08031994 +08031971 +08031970 +08021995 +08021978 +071182 +07111991 +07111979 +07101995 +0708 +07061980 +07061976 +07051978 +07041976 +07041975 +07031978 +06111975 +06101980 +060990 +060882 +06081993 +060782 +06071992 +06051993 +06051978 +06041976 +06031974 +06011993 +05111978 +05091993 +05091980 +05081978 +05061978 +050580 +05051976 +050387 +05031974 +05011996 +05011995 +05011977 +04111993 +04091981 +04071996 +04071974 +04041978 +04011993 +0401 +0315 +03121984 +0312 +03111991 +03111978 +03101975 +03101974 +03081994 +03071993 +030688 +03061994 +030478 +03041994 +03041981 +030393 +03011978 +02121994 +020990 +020791 +020686 +0205 +02041995 +020384 +02031994 +02011995 +01121973 +01111992 +010988 +010586 +01041997 +01041968 +010285 +01021973 +010175 +010169 +zxcvb1 +yoohoo +yingyang +yeryer +yannick +xsw21qaz +xrp23q +xboxlive +wsxqaz +winky +whitman +wetwet +westie +warpten +warhol +warhawk +walden +w4g8aT +w12345 +vsijyjr +voetbal +vlad1996 +violent +vbkfyf +utvols +twiztid +tweet +trustn01 +trust1 +trouts +trinket +tooshort +tookie +tities +tiramisu +tinker1 +thunders +thug +thomas01 +thirdeye +thebomb +terrie +temporar +temper +teetee +teacup +tavern +tashkent +tarantul +tamtam +tagheuer +t34vfrc1991 +szevasz +svetka +sunnie +sunita +sunderland +stussy +stringer +sting1 +stewie +stephy +stargaze +staple +stanger +stamps +stairway +spartacu +sorcerer +solid +smarts +slacking +skyline1 +skeletor +singing +shelia +sharik +shake +sexybaby +sexbomb +seagate +scott123 +scotia +scoob +schweiz +saturn5 +satan1 +sassie +sashok +sanjuan +samantha1 +samael +sable1 +rubbish +rostik +rororo +ronron +roland1 +rodriguez +rodrig +rob123 +rjcnbr +rhapsody +reward +reverend +rediska +reddragon +random1 +raccoon +qwaszx123 +queer +puravida +pringle +prefect +practice +pounder +polska1 +police22 +player69 +playbo +piranha +pinewood +pickett +pi314159 +phuket +phantasm +petter +petersen +peterbilt +pervasive +pepsicola +pennst +peaches2 +payne +paula1 +pats +patricio +passion1 +parolparol +parole +pandora1 +panacea +palmetto +oven +orland +oriole +oriental +order +oops +onclick +omega2 +olivi +olds442 +oldham +oktober +odette +oceans11 +oEMdLG +notice +noonan +niunia +nino +nikolaev +nickname +negrit +natashka +naresh +nada +muncher +multisyn +muffi +muenchen +mollys +miss +minako +mika +midwest +mickie +metalman +metal666 +merrick +maverick1 +matthew2 +master11 +mashina +maryjo +mansion +mansell +manish +malvina +maksik +makarova +madsen +mZepAb +luckyboy +louis1 +lollol1 +lolit +lolalola +littlebi +lisa69 +linsey +lingling +lina +lemond +legal +lbvflbvf +layla +laugh +later +landry +krasnodar +kona +knarf +kindness +katina +kassie +kallie +kakaroto +kakakaka +kailua +juventu +junfan +juancarlo +joyce1 +joking +john1234 +jimmy2 +jigger +jessika +jeeves +jeanie +japan1 +jamal +jailbird +jacks +ironhead +internet1 +interex +indiglo +images +ilovepor +ilovemyself +ilove69 +hot2trot +hosted +horny69 +hondacrx +holeinon +hobbs +hiro +hellothe +healey +harlan +gunner1 +gunman +guderian +griffon +grandprix +goodnews +godwin +gillette +gfhnbpfy +germaine +gerardo +genesi +gearhead +gaysex +gamers +gail +gaffer +fyutkjr +fuckslut +fuck0ff +friday1 +freight +fred12 +forty +fonzie +focus1 +fistfuck +figment +farter +epiphone +enkeli +enfield +energize +empress +emachine +eltoro +elohim +eightball +effect +eatmee +dzxtckfd +dthjxrf +drinking +dress +dreamy +dorsey +doremi +doorman +dollface +dimension +didi +deutschland +detail +destroye +democrat +delores +deere +debate +davidm +dasdas +darkwing +dannon4 +dahc1 +culo +cuckoo +crysta +crybaby +cristi +creek +crazy8 +crappie +cranky +connection +conflict +comicbook +collette +cogito +coast +cnhtktw +circuit +cinderella +chobits +chisel +chico1 +chicke +chevron +cheval +chatter +charl +chanda +cathy1 +catch +cashcash +carioca +capt +candi +callme +caitlin1 +cachorro +buster01 +burnley +burgers +buldog +bugsy +bubu +bubby +bronte +bronco1 +brianjo +bound +borg +bootneck +bonnie1 +bonito +bonfire +bones69 +bonefish +bogie +bluenote +blowjobs +blanket +bizarre +billyb +bigg +beluga +bebop +beaut +bear12 +bassfish +barsuk +barret +baldy +bakers +bagwell +babycakes +azerty123 +azer +axel +auralo +atdhfkm +astoria +astonvilla +ashman +asdasdas +armitage +ariadne +architect +ararat +apathy +aol999 +annual +annemari +anklet +anjali +anime1 +alias +alfaromeo +alex22 +albert1 +albania +alaina +airwalk +aguilera +adrianne +adrenali +adfadf +adelphia +ababab +a123123 +Tigger1 +Sydney +Sharon +STALKER +Redskins +Phantom +Patricia +Paladin +Nicole1 +MOTHER +MILLER +Knight +Iceman +Golden +GATEWAY +Elvira26 +Eagles +Darkness +DHip6A +Cowboy1 +Chester +CASPER +BADBOY +Arthur +Alex +ALEX +ALBERT +AL9aGD +98989898 +98745632 +976431 +963741 +8balls +7UFTyX +789321 +753753 +6262 +567765 +55555a +555555a +541233432442 +4wheel +4free +47474747 +4637324 +4428 +4000 +3edcvfr4 +3369 +3344 +3333333333 +31122008 +31121977 +311090 +311079 +31101976 +31081979 +310787 +310386 +310385 +301288 +301188 +30111981 +300888 +30031995 +30031993 +2wsxcde3 +29121980 +29111976 +29111973 +291092 +291080 +290988 +29091972 +29081980 +290787 +29071975 +290689 +29061974 +290488 +29041975 +290383 +281290 +28121976 +28111995 +28071980 +28071975 +280689 +280592 +28051977 +280488 +280390 +280386 +280384 +28031995 +28031994 +28031980 +28031974 +28021977 +280188 +271287 +27121979 +27101978 +27101976 +270991 +270987 +270785 +27051994 +27051979 +270487 +27031994 +27021995 +270189 +270184 +27011979 +27011978 +261187 +26111983 +26111981 +261082 +26091995 +26061979 +26051977 +26041996 +260384 +26031977 +260289 +26011980 +25111993 +251083 +25091994 +25081995 +25071976 +25061995 +250584 +25051978 +250286 +250190 +25011979 +25011975 +243462536 +241289 +24121976 +241190 +241189 +24111995 +241088 +24101977 +240984 +240887 +24081980 +240688 +24051996 +24051971 +24031978 +2402 +231191 +231184 +23111993 +231086 +230680 +23061982 +230578 +23041995 +2304 +230390 +230288 +23021976 +230191 +224422 +221286 +221281 +220692 +220588 +220578 +220484 +22041973 +2204 +220389 +220281 +220184 +22011972 +21125150 +21121976 +211190 +211188 +21111979 +211087 +21101993 +210989 +210981 +21071976 +210688 +21061976 +210483 +210190 +210184 +210183 +2100 +201184 +20101993 +20081979 +20081978 +20071975 +200690 +200586 +20051995 +200489 +200484 +20041996 +20041994 +20031975 +20031970 +200285 +20011978 +20011972 +1George +19844891 +19121995 +19101980 +19091979 +19081979 +19071996 +19071993 +19061995 +18121972 +18111995 +181090 +18091980 +18091972 +180886 +18081977 +18071976 +180688 +180686 +18061972 +180590 +180490 +180293 +180284 +18021972 +180188 +1793 +17761776 +17111991 +17111973 +17101993 +170986 +17091995 +17081973 +17071995 +170683 +17051996 +17051975 +17041995 +17041994 +1704 +17031979 +17031975 +170186 +170183 +169169 +161280 +161179 +161171 +16111975 +16101981 +16091977 +16081975 +1608 +160788 +160786 +160688 +16061977 +160586 +160487 +16031976 +160289 +16011980 +16011973 +151287 +15121975 +151183 +15111974 +151086 +15101996 +1510 +150890 +150888 +150885 +15081995 +150784 +15061977 +15051970 +150489 +15041972 +15021975 +15021974 +150190 +141975 +14121973 +141186 +14111973 +141083 +14091995 +14081994 +140792 +140791 +140680 +14061973 +14051995 +140487 +14021997 +140185 +14011994 +13311331 +132465798 +13121978 +131189 +130991 +130984 +130889 +130780 +13041993 +1304 +130386 +13031976 +13021979 +130191 +1289 +1286 +128128 +1243 +123666 +1234qwerty +12345i +123456j +123456789w +123456789qaz +12344321q +123333 +123123qwe +121272 +121271 +121078 +120893 +12081977 +12061979 +12051979 +12041974 +12041972 +120290 +12021978 +1190 +111282 +11121976 +11121975 +11121314 +1111aaaa +11111993 +111086 +110985 +110885 +11081979 +110790 +110789 +110782 +110688 +11061982 +11061976 +110489 +11041976 +110388 +110383 +1099 +1050 +103177 +102102 +10121978 +101083 +100887 +100786 +100785 +10071995 +100688 +100685 +100680 +100587 +10051994 +100484 +100476 +10031971 +100187 +10011997 +10011979 +0918 +09121993 +09101993 +09101983 +09091976 +09061973 +09041979 +09021976 +0812 +08111992 +08101981 +08101977 +08091980 +080884 +08071995 +08071978 +08051993 +08051971 +08041983 +08031981 +08021994 +08011982 +071289 +07121994 +0712 +07101978 +070988 +07081977 +070809 +070783 +070584 +07041973 +07031993 +07031979 +07021995 +07021994 +061288 +06121979 +06111981 +06091993 +06071975 +06051977 +06051974 +06041979 +06031991 +06031975 +06021975 +051190 +05111979 +05091978 +05081975 +050588 +05051996 +0505 +05031996 +05021994 +05021976 +04111981 +04081979 +04071980 +04061977 +040588 +04051994 +04051973 +040484 +04021979 +031286 +03121994 +03121978 +03111981 +03101977 +03091992 +030584 +03041995 +03011982 +02121975 +021089 +02051992 +020284 +0187 +01121976 +01091982 +010878 +01051978 +01041974 +010384 +01032000 +01031974 +01031972 +01021977 +010189 +010186 +010174 +010160 +007007007 +00112233 +000006 +zxcvbn1 +zorglub +zamboni +yuiop +yendor +yasmine +yardbird +xNgWoj +wowser +woogie +winston2 +windex +winchester +winamp +wilso +willow1 +whatisit +westgate +wesson +weedman +webb +watermel +waterfall +water123 +warfare +walley +walker1 +walk +vjhrjdrf +vfiekz +vfhvtkfl +vfhrbp +verity +varsity +vander +vampyre +utility +underworld +twingo +trustnoone +truckers +trina +tremere +treacle +trashy +toughguy +tough +toolshed +tobago +tippy1 +tightass +tigerlil +theraven +theman1 +texas2 +testes +terrace +teri +terence +temp1234 +teddyb +tease +tahoe1 +tZPVaw +t123456 +sylvania +sycamore +swindon +superdup +sunsun +stump +strings +strategy +stomper +stepanov +steady +startac +starla +squishy +spandex +sound1 +soraya +solosolo +soccer15 +soccer14 +sistema +single1 +silicone +shorts +shocking +shizzle +shaw +shadow69 +shadow13 +sexboy +sex6969 +serebro +seattle1 +schwanz +schlong +sc00ter +satanic +santo +samsara +sameer +salvation +sallie +salamand +sabotage +roxie +rouge +rodion +rocheste +robby +rfpfynbg +rfnthbyrf +rfgbnfy +retep +region +redtruck +ready1 +razdvatri +ravage +ratchet +rahasia +r12345 +qwer4321 +qpwoeiruty +qazxswed +q8zo8wzq +pussyeater +purgen +purchase +proverbs +problems +problem +princeton +primrose +primo +ppspankp +popular +pootie +polkmn +pokey1 +pogo +plant +pirata +pioneer1 +phipsi +petra1 +perico +pepper12 +pedro1 +pawpaw +pato +patit +pamela1 +ostrich +osborne +orlando1 +one +nyknicks +nounou +northsta +nokia3310 +nodrog +neuken +nelly +natash +natas +nananana +nagrom +nafets +mustangg +multimedia +mullins +morrisse +morkovka +montauk +monica2 +moneyy +moneymaker +moneybag +mobil +mitsubishi +milagro +miko +mikaela +memyself +memento +mellons +mclane +matthew7 +mark22 +marisha +marimba +maricon +marbella +manitou +mambo +malishka +maldini +makemone +mack10 +macho +lover69 +lovepussy +loveme2 +loveme1 +love23 +love13 +loredana +longbeac +lollo +lol12 +logical +location +lizaveta +limerick +letitrid +lesbo +leo123 +lenalena +lebron +lawdog +laughter +latvia +lanman +landlord +lana +kusanagi +konfetka +kohler +kitty2 +kirill123 +kingsley +king123 +kidd +kevlar +kellys +kbytqrf +kaya +katharin +katenok +kardon +kaneda +kamil +kamehame +junction +juarez +jonathan1 +joints +joachim +jledfyxbr +jana +jake12 +jackson2 +jacki +iwantin +ismael +interests +inches +ilona +ihateu +human +hottie1 +homebase +hollydog +hernandez +hereford +henderso +hemicuda +helpme1 +helloyou +hellion +halfpint +haha123 +gump +guitarra +grimlock +green12 +grant1 +gordon1 +gonefish +golfing1 +godofwar +glamur +gifted +gibbon +ghbdtnghbdtn +ghbdtnbrb +gfhreh +gfhfif +getalife +geraldin +georgi +ganesha +gaga +gaetano +futura +fun123 +frenzy +fredderf +fredd +frantic +fordman +fordford +foolio +flyhigh +flogger +finalfan +fidelis +fermat +fellowes +favre4 +favour +fartripper +fartfart +explode +etoile +eros +elnino +edinburg +eater +eWtosi +dryden +dron +dragon22 +dothedew +doraemon +dobson +divx +discreet +disco1 +diogenes +dimarik +dick69 +denden +deimos +deadeye +deaddead +davida +dalila +daddy123 +cuthbert +cummings +croatia +crewcom +crabby +coopers +conan1 +colette +coconuts +cnjvfnjkju +ckfdbr +cheeta +checks +characte +char +champagne +cfhfnjd +cerfcerf +carmex +carmelo +carcass +capitol +candid +camara +calcio +cadence +buzzsaw +buttocks +bulldog2 +buddy12 +bubber +bubbadog +brayden +bosworth +bored +booties +bolivar +bocephus +bobbo +bob +blue21 +blondi +blazin +bladerunner +blackrose +blablabl +biteme69 +billys +bigstick +bigshot +bigdee +bianco +bethan +bestfriend +bells +belarus +beckett +bebebe +bayview +batter +batman99 +barnett +banderas +bandera +baldrick +babygurl +aztec +atlas1 +asteroid +asdfjk +asdewq +asd123asd +arschloch +arrow1 +armenia +arisha +arena +angel13 +andre1 +anasazi +anamaria +amormi +alvarez +aleksa +aida +agustin +adida +acosta +aceracer +accounts +accent +[start] +Wizard +TYvuGQ +Starwars +Slayer +Scott1 +Sabine +SUMMER +Rocks +Patrick1 +Midnight +MORGAN +LONDON +KswbDU +Joshua1 +JUSTIN +JOSEPH +Hunter1 +HR3Ytm +HOTDOG +Guillaum +George1 +Gemini +Fabienn +DoqVQ3 +DEBBIE +Claudia +COMPAQ +CHARLES +Batman1 +BITEME +August +Aaaaaaa1 +ARSENAL +ANDREA +8ball +876543 +8762 +8484 +8181 +7667 +6060 +5437 +475869 +47114711 +44445555 +3stooges +3girls +3783 +3366 +3355 +330330 +31101977 +310885 +31081978 +310783 +31051996 +310387 +31031975 +31011995 +31011994 +301286 +301186 +301183 +30111994 +30101977 +300982 +30091974 +300770 +30071976 +300687 +30061977 +300486 +2FcHbG +29292929 +29101978 +290991 +290990 +29091975 +290789 +29071976 +29051977 +290487 +290483 +29031975 +29011981 +29011978 +281288 +28121978 +281191 +281189 +281182 +281089 +28101978 +280984 +28091980 +28081978 +280788 +28071977 +280688 +28061976 +2806 +28051994 +28041994 +280385 +28021979 +28011979 +28011976 +27121994 +271188 +271180 +27111993 +271092 +27101975 +270888 +270884 +27081994 +270782 +270777 +270690 +270689 +27061996 +27061978 +270583 +27041974 +270389 +270385 +270288 +270284 +27021994 +27021977 +27011975 +261286 +261189 +261181 +26111976 +261081 +26091996 +26091992 +26091974 +260888 +260883 +26081979 +260688 +260587 +2605 +26041981 +26041979 +260386 +260385 +26021994 +26021976 +26011982 +25121978 +251186 +2509 +250577 +250483 +250481 +250385 +250382 +25031995 +25031976 +25021997 +250184 +242526 +241192 +241084 +241078 +240982 +24081977 +240788 +240691 +240682 +240591 +240585 +24051978 +24051976 +240490 +240486 +24041993 +240387 +24011977 +23111975 +23101976 +230990 +230988 +23071976 +23071975 +23071974 +230692 +230685 +230681 +230583 +230391 +230388 +230290 +23011996 +222888 +221186 +221183 +221078 +22101996 +22101972 +220988 +220887 +22081978 +220784 +220590 +220589 +220290 +220289 +220288 +220279 +22021974 +22021973 +22011974 +2122 +21111995 +210790 +21071995 +21071975 +2106 +21051972 +210485 +21041977 +210382 +210283 +21021977 +210185 +21011976 +21011974 +20111975 +201083 +201020 +200991 +200986 +20091975 +200887 +20071976 +200684 +20061997 +20061995 +20061978 +200592 +200589 +200584 +200494 +20041978 +20041977 +20041976 +20041973 +20031974 +200288 +200284 +1Ranger +19933991 +1928 +1920 +19121983 +19121980 +19101992 +19081996 +19081994 +19081976 +19061980 +190587 +19051976 +19041973 +19021975 +18111994 +18111976 +180987 +1808 +18071975 +18061975 +18061974 +180385 +180377 +18031994 +18031976 +18011981 +1789 +171286 +171183 +17111995 +17111976 +1710 +17091996 +170888 +170788 +17071975 +170688 +170686 +17061995 +17061994 +17061973 +17051976 +170489 +17041980 +17041979 +170387 +170287 +17021976 +170181 +17011994 +17011977 +161282 +16121975 +16111976 +16091975 +160885 +160884 +160683 +16061976 +16061975 +16061972 +16061971 +160584 +16051993 +16041996 +160288 +160286 +16011994 +158158 +151184 +150989 +15091973 +15081998 +15081994 +150792 +150782 +15071975 +15061978 +150590 +150589 +150585 +150480 +150289 +1472 +1453 +1441 +14121974 +14111994 +14111976 +140987 +14091974 +14081978 +14081971 +14061996 +14061981 +14061980 +140588 +140488 +140484 +14041972 +14031996 +14031977 +140291 +140282 +14021996 +1402 +1397 +135797531 +133113 +13121976 +13081996 +130783 +130782 +13071980 +13071978 +13071971 +130688 +13051993 +130486 +130388 +13031994 +130187 +13011978 +13011972 +12457 +123qaz123 +123555 +1234rmvb +12347890 +12345g +12345e +123456789A +12345678900987654321 +12345671 +123123123123 +12311231 +12231223 +121284 +12121995 +121213 +12111977 +12111976 +12101982 +12101977 +12091980 +120882 +120875 +120741 +12071978 +120685 +120684 +120391 +120389 +120386 +120378 +12031975 +12001200 +1163 +1155 +1144 +111290 +111288 +11121996 +111186 +111176 +11112000 +11111970 +1111122222 +110982 +11091976 +110888 +110783 +110590 +110583 +110481 +110382 +11031995 +110285 +11021995 +11021973 +11021969 +110183 +108108 +10661066 +101169 +101072 +100991 +100781 +10061960 +100590 +100487 +10041976 +10041972 +100192 +09121975 +09111991 +09111989 +09111980 +09111979 +09091996 +09081994 +09081977 +09061994 +09051994 +09031978 +09011993 +09011979 +08522580 +08121977 +08111985 +08111982 +08091972 +080883 +08081995 +08081994 +08061979 +08061976 +08051996 +08051979 +0803 +07831505 +07121978 +07091995 +070777 +07071995 +07061995 +07051976 +070483 +07021979 +07021977 +07011979 +0626 +06111978 +06061994 +06041995 +06011979 +06011978 +05101978 +050989 +05081994 +05081976 +05071976 +050689 +050686 +05051971 +05041972 +05011993 +0424 +04121992 +04121979 +04121977 +041090 +04091976 +040888 +04081974 +04071981 +040583 +04011977 +04011974 +03121980 +03071996 +03071995 +03071974 +030690 +03061981 +03051994 +03051975 +03031996 +03031974 +03031971 +03021976 +03011979 +03011976 +0223 +021978 +021189 +021187 +02111992 +02111979 +020782 +020388 +0203 +020292 +020282 +02011993 +0147896325 +013cpfza +01101974 +01081977 +010787 +010687 +010589 +01051995 +01051994 +010482 +010388 +010385 +01031975 +010179 +010178 +01011956 +009900 +007james +zigazaga +yorkshir +yamah +xcountry +wrxsti +workshop +works +woodys +wizkid +winning +winifred +willys +wildrose +wilcox +whistle +wewewe +wetlands +wertwert +weronika +wellington +welles +webhompass +wash +warzone +waVPZt +vova123 +vittorio +vibrator +vfvf123 +vfrcbvec +venom121293 +vacuum +turkish +trusting +truffle +tron +tristen +trafford +totototo +toronto1 +toptop +toosweet +tommygun +tomm +tmoney +titsnass +tititi +timing +timbo +tigerwoo +thunde +thomas2 +thisisme +thales +testy +tercel +taylor12 +taekwond +tackle +syncmast +sweeper +swan +superson +sunrise1 +sundin +stuttgart +strelec +starts +stars1 +starflee +stallone +squonk +squids +squeaky +sprinkle +sportste +spoonman +sossos +sonnet +soldier1 +sogood +smokeweed +slipknot1 +skytommy +skoal +skaska +silverfo +silver12 +silva +sideshow +shooting +shock5 +shingo +shank +shakey +shaka +seven11 +serene +sepultura +selen +seafood +scribe +scribble +scooby12 +scimitar +scenic +scamp +saturn1 +sarah123 +sailormoon +sadsad +rudedog +roxana +roxan +rooster1 +ronaldo1 +roma123 +rjynfrn +rfrltkf +rfntyjr +reviewpa +reverse +render +rellik +regret +reddrago +redbirds +rebecc +ready2go +razorbac +rasengan +r2d2c3p0 +qw123456 +quetzal +qqqq1111 +q55555 +pwxd5X +promethe +powerpc +powerboo +positivo +portman +porker +poli +plopplop +pinecone +pike +piglets +piedmont +phillip1 +phenix +pflybwf +percival +pepsione +pepit +penner +patrick2 +password0 +paroli +paramedic +papichul +papercut +paper1 +pampers +paleale +pacifica +pablo1 +ou812ic +otters +orange8 +open4me +omega3 +oddjob +octavian +nutz +nurse1 +nowhere +nolove +nolimit8 +nikolaus +nikolaeva +nikita123 +nicholas1 +newmoon +newguy +nelso +nbvcxw +navarro +nashvill +nails +mylord +muaythai +mrhappy +mozzer +moses1 +morrigan +mormor +montan +mofo +miracles +minidisc +micros +meyers +merry +mercy +melville +melonie +mello +melbourn +meddle +meaghan +mauser +mattman +marisol +marcopol +mamasita +malcom +maid +mahoney +madhouse +macros +mP8o6d +lottery +london12 +limaperu +letitbe +leiceste +laverne +lausanne +lamesa +ladydog +kukushka +kukuruza +kosovo +knocker +knives +klootzak +klklkl +kirby1 +kings1 +kindbud +khalil +khaled +kfvgjxrf +kenyon +kelly123 +kelly001 +katusha +kasia1 +kakadu +kadett +juster +juggs +joselui +josef +joness +joeyjoey +joann +jeter +jesuschrist +jeronimo +jelly1 +jeanine +jazzjazz +jansen +jamies +jabba +iuytrewq +irvine +intelligence +indiana1 +iluvsex +iceice +hotline +hoss +hooked +homersim +home123 +hoihoi +hockey12 +hillman +herons +hellbent +heinz +heathers +header +haters +harrypot +hanover +hangman +hakeem +haircut +hahah +guess1 +grubber +grogan +griff +greasy +graeme +gr8ful +gorgon +good2go +golf12 +godson +gnusmas +gnaget +glorious +girdle +giovann +gibsonsg +gianna +ghjkju +ghjghj +ghandi +george12 +gentry +gemin +garten +ganster +gandhi +galahad +gabriella +g3ujWG +future1 +fussbal +funhouse +fuckina +from +frolova +friendship +freelove +franz +framer +force1 +folder +flyers1 +flipside +flavia +firetruc +fightclu +fencer +fatim +fatcock +farting +fairview +faceoff +fabregas +f00bar +ellen1 +elaine22 +edinburgh +duffbeer +dribble +dragon7 +dragon23 +doritos +donkey1 +donald1 +dominos +doma77ns +dolfan +document +dockers +dixon +direwolf +dima1996 +dididi +dfdfdf +destro +desperad +delorean +delano +defjam +deepsea +declan +death123 +dashadasha +darkjedi +darien +dagwood +cycle +cup2006 +cuntsoup +ctdfcnjgjkm +crossfire +cristia +craps +couscous +costa +cornholi +concert +commie +com2 +college1 +colby +coffe +cocococo +cleric +cleaver +chilidog +cheesecake +checking +centrino +celtics1 +cellular +catarina +cassie1 +casablan +carrier +carmela +carguy +carbine +caps +canadien +camell +cadr14nu +caballo +c6h12o6 +burke +bulldogg +budice +bububu +brother1 +britneys +brindle +bridgett +brewers +brandt +bosstone +boondock +bonham +bobby123 +bmw123 +blue13 +blowme1 +birthday21 +birdy +binger +biggy +bigboi +beto +benning +becket +bates +barman +barbarian +bagpipes +backlash +audia3 +astra1 +ashley12 +arigato +aqswdefr +apples1 +aolaol +anderso +ancient +amtrak +amanda18 +alvar +allan1 +alhambra +alexis1 +aldo +alastair +agosto +adrien +adjust +actor +abrams +aassddff +a1a1a1a1 +UpnFMc +Tiger +TIGERS +Summer1 +Slipknot +Samson +Rjw7x4 +QBG26i +Prince +PURPLE +Nec3520 +Monkey +MUFFIN +Kristina +Killer1 +Jasmine +JOHNSON +Indian +HuFMqw +Hockey1 +Hhhhhhh1 +Hammer1 +HEATHER +Green1 +Generic +FuckYou +Evelyn +Dawg1 +DAD2OWNu +CraCkSeVi +Chris1 +Chelsea1 +Basebal1 +BLOWME +BARNEY +Alexande +99887766 +8DiHC6 +838383 +78N3s5Af +777777777 +714714 +557744 +555111 +5413 +5225 +51051051051 +4rfv5tgb +4477 +43211234 +4250 +333888 +311285 +3112 +311080 +31101995 +31101981 +310887 +310882 +310880 +31081973 +31051979 +310380 +310187 +301283 +30121981 +30111977 +30101995 +300990 +300886 +30081979 +300788 +300778 +300686 +30061993 +30061974 +300584 +300581 +30051993 +300380 +30031974 +30011996 +30011973 +2girls +291284 +291282 +2911 +29101980 +290985 +29091995 +290888 +29081995 +29081981 +29071995 +290682 +29061979 +29061972 +290581 +29041977 +290390 +290387 +290380 +290188 +290187 +281190 +28111992 +28101996 +28101982 +280889 +28071994 +280691 +28061978 +280590 +280584 +280492 +28041979 +28031976 +280280 +280184 +28011978 +27121993 +271181 +270983 +27091973 +270890 +270889 +270873_ +27081976 +27071974 +27051977 +270486 +270483 +270482 +27041980 +27041979 +27041977 +27041975 +27021978 +27021975 +27011994 +26121993 +261186 +26111977 +261087 +261084 +260986 +26081996 +26081980 +260786 +260785 +260683 +26061995 +260589 +260493 +260482 +260477 +26041994 +260188 +260187 +2583458 +251284 +25121997 +25121994 +25121974 +251184 +25111976 +250990 +25091995 +25091972 +250891 +250890 +250883 +250882 +25081978 +250783 +250780 +25061979 +25061978 +250595 +250485 +250480 +25041997 +25041974 +250380 +2503 +25021979 +25021976 +241291 +24121973 +241183 +24101992 +24101978 +2409 +240890 +24081974 +240790 +240783 +240779 +24071981 +240689 +24061994 +24061976 +24041975 +24031975 +24021976 +231291 +231290 +231281 +23111994 +23111973 +230887 +23081979 +23071979 +230684 +230589 +230386 +230384 +230287 +23021974 +23021970 +23011979 +23011977 +23011972 +2227 +221285 +221191 +22112211 +22101994 +220890 +22081979 +220786 +220785 +220777 +220584 +220487 +22041977 +220383 +22021996 +22011998 +22011979 +22011976 +2134 +211286 +211283 +21121974 +211211 +211187 +211181 +211085 +21101977 +210985 +210982 +21091992 +21091971 +210879 +210783 +210687 +21061978 +21061974 +21051976 +210495 +210387 +21031975 +21011977 +21011973 +201282 +20121994 +20121973 +201182 +201089 +20091974 +200881 +20082009 +20081994 +20071978 +200685 +20051996 +20041979 +20041970 +20001 +1Killer +1Jordan +1Footbal +1Dawg +1Buster +1Batman +19877891 +1930 +192168 +1918 +19111978 +19111973 +19101978 +190788 +190687 +19051975 +19041974 +1904 +19011978 +181290 +181286 +181282 +18121994 +18121974 +18111973 +181087 +18091996 +18091993 +18091975 +180887 +18081979 +18081976 +180690 +18061976 +18041972 +180391 +18031995 +180186 +17121997 +17121973 +17121971 +171084 +170983 +170981 +17081993 +170790 +17071976 +17071973 +170689 +170687 +170583 +17051977 +170480 +17021993 +17021979 +170166 +17011976 +16111978 +161090 +161083 +16101995 +16101975 +160980 +16091995 +16091982 +1609 +160891 +160784 +160685 +160680 +160587 +16051981 +160488 +16041994 +16041982 +16031977 +16031973 +16011997 +159159159 +151180 +150986 +150985 +150887 +150886 +15081993 +150789 +150687 +15061996 +150586 +15051995 +15051994 +15051973 +150486 +150477 +15041994 +15041979 +15041977 +15041975 +150390 +15031982 +150283 +150182 +15011977 +1501 +141283 +14121977 +14121972 +141182 +14111993 +14111979 +14111975 +141085 +14101977 +140982 +14091994 +14091973 +14051994 +14041995 +140387 +140288 +140284 +140186 +14011973 +137137 +135792 +1346 +1321 +1317 +13121974 +131180 +13111977 +1311 +131081 +13101975 +130982 +130887 +130885 +13081979 +13071974 +13061979 +130591 +130490 +130483 +130385 +13031974 +13021993 +13021978 +12qwasz +1278 +1268 +12345trewq +12345f +123456789g +1234567890s +12345666 +123234 +123123321 +1212123 +121189 +120981 +12091974 +120879 +12081972 +12071974 +120691 +12061974 +120580 +12051974 +12051970 +120478 +120473 +12041973 +120382 +12031979 +120280 +12021997 +12021994 +12011977 +11924704 +1153 +113322 +11211121 +111275 +111075 +110984 +11091975 +110687 +110680 +11051980 +11041982 +11031994 +110291 +110283 +11021971 +11011976 +1041 +103103 +102010 +101282 +101275 +10121994 +10121977 +10121974 +101179 +101177 +10101996 +10101974 +10091979 +10081973 +100782 +10071981 +10071973 +10061974 +100577 +100576 +100483 +10041975 +100389 +10031976 +100286 +10011971 +1001001 +09101978 +0910 +090983 +09081993 +09081972 +09071979 +090545 +09051976 +090481 +09031979 +09021980 +09011996 +09011978 +081289 +08121978 +08111981 +08101992 +080995 +08091978 +08081973 +08071972 +08051994 +08041994 +08041979 +07101982 +07091976 +07091973 +07091970 +07081976 +07081974 +07081973 +070781 +07071975 +07061994 +07041977 +07031974 +070291 +070284 +07011978 +061087 +06091977 +06081975 +06071993 +060691 +06041975 +0521 +051284 +051281 +05101975 +050986 +05071993 +05061994 +05051977 +05041976 +05021974 +0423 +04121980 +041187 +04111972 +0411 +0410 +04091995 +04081994 +04081977 +04071993 +04071976 +04061996 +04061978 +04061973 +040586 +040585 +04051971 +04011973 +0331 +0325 +0324 +0316 +03111979 +031078 +03091979 +03081974 +030783 +0307 +030685 +030680 +030674 +03061978 +03031977 +03031973 +03021970 +0224 +021287 +02101993 +0210 +020786 +020286 +020285 +019283 +0154 +0147 +012007 +011284 +011281 +01111975 +011080 +01091978 +01091977 +01091976 +010885 +01081966 +0108 +01071975 +01071974 +010690 +010680 +010484 +01022000 +01021999 +010203040506 +01012007 +0024 +001001 +zealots +yummy1 +ytcnjh +yakuza +xxxxxxxxx +xtkjdtr +woodduck +woaini +winter12 +whiskey1 +westport +wester +westcoas +wembley +well +weights +weber +watkins +wander +w0rm1 +vonnegut +voltage +voices +vodoley +vjkjltw +vika123 +vicente +vestax +vaz21099 +vasilii +vanyarespekt +usmc1775 +ulysse +troopers +trigger1 +trex +tretre +treat +travelle +tratata +trap +transport +transpor +trails +towing +topfuel +tony1 +tommys +titanic1 +tincup +timoha +timmie +timeport +tiedup +thrill +thisone +thetick +thelema +testme2 +tenni +tenchu +television +televisi +teddie +teache +tatian +taras +tangerine +t26gN4 +symphony +symbol +syclone +sxhQ65 +suresh +superboy +superbee +sunny123 +sumner +suicidal +submarine +stratos +strange1 +stepanova +stalker1 +stadium +srilanka +sqrunch +spenser +spawn1 +sparco +soloman +soccer7 +soccer22 +snowsnow +smiler +smile123 +slinger +slimer +slaves +sissy1 +simeon +shiny +sherwin +sharo +shannara +shankar +shadow123 +session +sergeev +seraph +sensor +secreto +sebastien +seansean +seagrave +scranton +scores +scooter2 +schule +schooner +schnee +scales +saywhat +saruman +sanjeev +sandee +sammyboy +salem1 +saber +s1107d +rotterda +rope +romina +rollie +rolando +rimshot +richard2 +rfvtgb +rfhjkbyf +review69 +resource +rerjkrf +repytwjd +replay +regis +redsox04 +red1234 +rebelde +rarara +rankin +rainbo +racine +qwerzxcv +qwerty00 +qqaazz +qq123456789 +qazxsw21 +q1w2e3r4t +q1a2z3 +purity +pullings +probe +priscilla +powerup +powermac +power2 +postov10 +pookie1 +poohpooh +pompier +police1 +poiu0987 +playe +playas +pittbull +pipo +pionee +pimppimp +pimple +pidaras +piazza31 +pharaoh +petrol +perfecto +pepino +pendrago +paul123 +patent +password69 +password4 +passe +pascale +party1 +parol1 +parke +paprika +paperboy +panty +pakistani +paints +packman +package +ottootto +osbourne +orlova +orange44 +operation +opensesa +onyx +oliveira +oldies +oklick +oinkoink +ohiostat +official +octavia +nylon +nx74205 +numark +notagain +nordic +niceone +neuron +network1 +neptun +nbnfybr +nariman +nakita +nacho +mythos +mylene +mustdie +munkey +mullin +muddy +mozilla +moss +moremore +montague +montagne +monkee +molina +miria +mint +mine2306 +mina +mills +million1 +milagros +mikhail +mickeymouse +mets86 +medieval +meatman +meadows +mcgwire +mcguire +marks +marios +marillio +margit +manzana +manwhore +manunite +manchu +mall +magyar +luzern +luckey +lthgfhjkm +loyalty +love22 +love2 +loplop +logan5 +littleton +lilili +likeit +lifelife +liberta +lfiekz +lexicon +lexi +lera +lbfyjxrf +latitude +larry123 +kremlin +kozlov +kozerog +knowledg +kinky1 +kimberle +killing +kickit +kennet +keaton +kasparov +karmen +karlos +kaplan +kailey +jujuju +joeboy +joanie +jmoney +jizz +jerrylee +jennys +jay123 +jaspe +jasonb +jamjam +jamesd +jajajaja +jackel +jack12 +itstime +its420 +ishtar +isabe +intell +incognito +imissyou +iloveamy +howard1 +hopefull +hoopster +hoopstar +homehome +holiday1 +holder +hoho +hfgcjlbz +heybaby +hellya +hellou +hehehehe +hecate +hawkeye1 +hatfield +hatcher +hardhead +haggard +guessit +guatemal +gtxtymrf +gtkmvtyb +grigio +grenade +greenwoo +greeneye +greenbud +green2 +gotlove +goodgood +goodfood +goobers +gohawks +gogreen +godfrey +gnosis +gnbxrf +glist +gizmo123 +ghbdtn1 +gfgjxrf +geordie +genuine +geniu +gemma +gateways +gasgas +gargamel +garfiel +gaming +gamera +gallardo +galena +fylhtqrf +funsex +frien +frieda +freedom7 +free4all +franny +ford150 +foosball +fontaine +florid +fleet +flaming +fktrcfylhjdbx +fixit +fido +fiat +fgjrfkbgcbc +ferrari3 +felixx +feedback +favorite5 +fall +f9LMwD +eyecandy +ewelina +eugen +etienne +egor +education +dustoff +durand +dummies +driver8 +dragons1 +drag +doroga +dont +dominus +dogbite +dickless +diceman +diablo1 +dfvdfvdfv +denis123 +den123 +demonic +davi +darken +daniel123 +dance1 +dagestan +cyber1 +curran +cupcake1 +cumface +cuda +cuba +crowes +cris +crime +crack1 +covers +countach +cortland +corrie +cordell +consume +connect1 +congress +confuse +commodore +colon +climb7 +clear +chucho +christ1 +chicca +chicago2 +chester2 +chelseafc +chelsea2 +cheeze +chasey +charged +chapin +chapel +chaotic +changeit +chalupa +chain +cfvjktn +cerbera +censor +cbhbec +caspar +carter1 +cart +caro +cards1 +capitan +canes +candycan +canabis +cambodia +cain +bugaga +buckey +browser +bronx +broncos7 +bringit +brew +braden +bowhunt +bourne +bosnia +boobs1 +bonjou +boness +bolivia +boing +bogey1 +bobdog +bobbins +blythe +bluerose +blue01 +blacksta +blackie1 +black2 +black12 +biscuit1 +biotech +bigsky +biggs +bigfoot1 +bethel +batman69 +barnsley +ballz +ballbag +baguvix +badone +babyboo +autobahn +atlant +astana +asnaeb +ashanti +asakura +arsenalf +arrowhea +arhangel +ar3yuk3 +anuradha +anton123 +antioch +antigua +annett +annamari +annabel +angelin +amanda12 +alphaone +almera +allover +aliska +alexan +alamo +aenima +adolf +adam1 +acrobat +accessno +abbie +Year2005 +Xxxxxx1 +XqgAnN +Trinity +Secret +SCxaKV +Rabbit +PlanoT +Pepper1 +PEANUT +November +Maximus +Marvin +MAXWELL +MADISON +M5WKQf +Logitech +Jimmy +Jesus +Jennife1 +Jaguar +JACKSON +Indianali +HCLeEb +Genius +GLdMEo +Fyfcnfcbz +Fuckme1 +Footbal1 +FISHING +Einstein +Dick1 +DENNIS +CidKid86 +Caroline +Bond007 +Bbbbbb1 +BAILEY +Arsenal +Albert +999333 +9452 +78girl +7373 +700700 +6977 +6942 +6666666666 +666 +654987 +6288 +55832811 +5445 +4r5t6y +4life +4568 +45645 +4119 +3CuDjZ +321ewq +321456987 +314159265 +311283 +311281 +31121974 +311086 +31101993 +310886 +31071997 +31031974 +310190 +3012 +301190 +301187 +30111980 +301086 +30101973 +300975 +30091995 +300889 +300789 +300691 +300690 +300689 +30051994 +30051972 +300492 +300482 +30041995 +30041975 +300390 +300388 +30031977 +30031975 +300190 +2w3e4r5t +2sexy2ho +291291 +29111993 +29101977 +2910 +290987 +290790 +29071994 +29071978 +29071974 +290590 +290588 +290486 +29041996 +29041995 +290180 +281192 +281085 +280990 +280987 +280880 +28081995 +28081973 +280687 +28041971 +280389 +28031975 +2802 +280187 +271288 +271090 +271087 +271081 +270989 +27091996 +270685 +270683 +270589 +270586 +270490 +270488 +27031974 +27031973 +261284 +26121996 +26121979 +26121978 +261192 +261188 +261178 +26111973 +261089 +26101977 +26091979 +26081995 +26081993 +26081977 +260788 +26071972 +26061975 +26051995 +26051978 +26051975 +260489 +26041992 +26041970 +26031974 +260279 +26021996 +26021995 +260185 +26011975 +2580456 +25121975 +251185 +25101994 +25101977 +25101975 +250989 +250988 +250984 +25091975 +25081997 +250784 +25071975 +250687 +250684 +25061973 +250592 +25051994 +250489 +25041978 +250390 +25031978 +250287 +25021972 +250187 +250186 +241284 +24121970 +241186 +241181 +241079 +24101993 +240990 +24091995 +24091978 +24091977 +24091973 +240884 +24081978 +2406 +240583 +24051975 +2405 +240389 +24031995 +24031976 +240290 +24011976 +231289 +230982 +230981 +230980 +230885 +23081976 +230790 +230679 +230577 +23051994 +23021996 +23021972 +230188 +2223 +221284 +22121977 +221193 +221190 +22111995 +22111973 +220984 +22081976 +22081971 +22071972 +220691 +220688 +220678 +22061974 +22051978 +22031977 +22021995 +22011995 +211287 +211269 +21111976 +21111974 +210992 +210983 +21091979 +21091975 +210882 +21081974 +21061995 +210590 +210587 +21051996 +21051975 +21051973 +210486 +21041973 +210282 +21021972 +210182 +21011998 +21011975 +21011970 +201285 +201081 +20101975 +20091993 +20091976 +20091973 +200791 +200787 +20071974 +200582 +200384 +20021970 +20011994 +1Pillow +1Nicole +19541954 +1929 +1913 +19111974 +19111911 +19101979 +19101974 +190691 +19061978 +19051996 +19031973 +19021995 +190185 +18121995 +18121978 +18121976 +1811 +181094 +1810 +180988 +18091978 +180884 +180789 +18071993 +18061995 +18041977 +18041976 +180387 +180381 +178500 +171287 +171279 +17121978 +17111977 +171087 +17091973 +170884 +170791 +170786 +170784 +17071978 +170589 +170586 +17051978 +17041973 +170289 +17011974 +16121997 +16121979 +161188 +16111994 +16111970 +161086 +160984 +16091978 +16091974 +16071994 +16071977 +16061979 +160583 +16041995 +160388 +160386 +160385 +160383 +160382 +16031975 +160186 +157157 +15121995 +151182 +15111980 +15101995 +15101976 +150988 +150983 +150981 +15071977 +15071974 +150688 +150582 +150476 +1504 +150386 +150280 +15011976 +14201420 +14141 +141181 +14111977 +141090 +141086 +14101996 +140990 +140985 +140983 +140883 +140881 +140786 +14061974 +140585 +14051975 +14041978 +14041974 +14041970 +1404 +14021981 +14021972 +14021970 +140192 +140187 +140182 +131285 +131283 +131188 +131187 +131087 +130890 +130888 +13071976 +1307 +130683 +13061976 +130587 +130488 +130291 +13021977 +13011996 +13011982 +13011971 +12qw34 +124578963 +123zzz +123qwe321 +123kat +123asd123 +12345678901234567890 +123444 +123432 +122222 +12141214 +121279 +12121976 +121186 +121082 +12101974 +120979 +12091977 +12091976 +12081979 +120788 +120777 +12071975 +120591 +120483 +12041995 +120396 +120381 +12021973 +12021972 +12011975 +1199 +1197 +1152 +113355 +11121995 +11111976 +11111974 +11110000 +110990 +11091995 +110883 +11081970 +110777 +11071993 +11071973 +11071971 +110678 +110585 +11051975 +11041996 +11031978 +110287 +110286 +110280 +11021996 +11021975 +110191 +11011992 +11001100 +10inches +1078 +1057 +102030405060 +10201020 +101293 +101291 +10121993 +10121970 +101081 +101075 +101073 +100987 +100985 +10091994 +10091977 +10081976 +10081972 +100787 +100777 +10071976 +100677 +100578 +100489 +100475 +100385 +10031978 +100278 +100189 +100182 +100179 +09111994 +09111993 +09111976 +09091994 +09091975 +09071995 +09071992 +09051971 +09041994 +09021977 +09011981 +08121991 +08121975 +08111988 +08101979 +0810 +08091994 +08081996 +08081972 +080785 +08041974 +08031966 +0729 +07111976 +071085 +07101974 +07081993 +07071997 +07061975 +070588 +07041972 +07041971 +07031975 +070289 +07011977 +07011975 +06121980 +06111976 +061089 +06101976 +06091975 +060789 +06071980 +06071973 +06061995 +06031972 +06021996 +06021994 +06021976 +06011980 +06011972 +05101995 +050985 +05091995 +05091976 +050879 +05081972 +050788 +05071995 +050690 +05061975 +05051997 +05031979 +05031976 +050290 +05021970 +05011997 +05011978 +0425 +0417 +041287 +04111994 +04101978 +04081975 +040784 +040782 +04071975 +040580 +040578 +04051974 +04031978 +04031970 +04021978 +04011996 +031282 +03111993 +03111990 +03101976 +03091981 +03071994 +03071973 +030588 +03051976 +03051971 +030481 +03041978 +03041972 +030388 +03031975 +03021995 +021282 +02121976 +02111995 +021087 +020886 +020885 +020883 +02071994 +020590 +02041997 +02041962 +0204 +020280 +02012010 +01121977 +010983 +01092007 +01091974 +01091973 +01091965 +010879 +01081995 +01081974 +01081972 +010689 +010483 +01041972 +01041971 +010284 +01021960 +010192 +009988 +zujlrf +yssup +yokohama +yhntgb +yesiam +xthtgfirf +xena +xaccess2 +wwewwe +wtpmjgda +wolf666 +withyou +wins +wheat +wendel +wellcome +waterpol +wallis +waller +wabbit +vologda +visions +virtue +viking1 +victoria1 +vfvfvf +vfvfbgfgf +vbktyf +vatoloco +vandam +unlimited +uniden +uhbyuj +tweeter +tucker1 +trotsky +trogdor +trespass +totem +toshiba1 +tori +tommy2 +tolstoy +tolik +timers +thurston +thurman +that +thaddeus +telemark +teiubesc +tania +tallman +take8422 +taggart +suzenet +surround +sugarbea +sturgis +strangle +stoops +steph1 +stella1 +steely +steelers1 +startup +starion +sssssssss +spyglass +speedy1 +speeds +spectra +sososo +sodium +snooks +slipknot666 +simran +simmer +silky +siempre +sheri +shepard +shemales +shayna +shahid +shadowfa +sexyguy +sexy1234 +sexme +sexmachine +sevenup +seven777 +scubadiv +scottish +scot +schwarz +sayangku +save +savant +saturno +saracen +sandrock +salina +ronaldo9 +rockit +roberto1 +robert12 +rizwan +rhbcnbyjxrf +rfnhby +respekt +relisys +reliable +reksio +redhawk +redblue +red321 +recycle +rebeca +realdeal +rayden +rama +radish +qwerty6 +qwerty21 +qwe123asd +quixtar +qsdfgh +puller +pucara +powered +portuga +porno69 +poppin +pollock +pollito +pollard +poilkj +platoon +platform +planetx +pipi +piotrek +pimp69 +pikapika +picolo +phidelt +phantoms +pepsis +pepsimax +pepsicol +pentax +pennywise +pennie +pembroke +pegaso +peache +payment +patsy +patrick9 +patel +password7 +password6 +packard1 +ozzie1 +override +oneeye +odie +octagon +oconnor +obvious +obelisk +numbnuts +number2 +noof +nolimit9 +nokids +nokia6303 +niknik +ness +naveen +myhome +myass +muskrat +multisync +mule +moving +moss84 +morphine +morons +mooseman +moore1 +moonie +montes +monkey13 +moldova +mnbvcxz1 +mitten +missile +miroslav +mira +michael7 +metro1 +merli +merhaba +mazdarx8 +maximal +maxie +maus +matte +mask +masaki +marta1 +marjan +mariano +maria6 +mama1234 +makers +magazin +madonn +madoka +macarena +lyudmila +lynch +luvfur +lunaluna +lthtdj +lovin +loveyo +lovetits +love21 +loulo +looklook +lookatme +lockwood +lilly1 +liberal +level +lenore +lena123 +leila +leglover +leandro +lbyfvj +landing +lamar +ladybug1 +kriste +kozlova +korea +kongen +kocham +kmfdm +kjgfnf +kitana +kisska +kira +kipling +kingme +keyser +kewl +kevi +katies +karpov +kanada +kamala +kama +kaitlin +juninho +jumpman +jumble +julies +judas +jordan12 +joonas +jimbos +jiji +jesuit +jesucrist +jenny69 +jeepman +jazzbo +jake123 +jake01 +jailbait +iwanna +iskander +interact +inkjet +imperator +ilovemom +ilovekim +iddqdidkfa +ichiro +ichabod +howler +hotpants +hoopla +honeyb +holstein +hogan1 +hjvfyjdf +hillbilly +hermos +hellraiser +hellomoto +hellcat +harvick +happydays +happyboy +hankhank +hammers1 +h4x3d +gungho +guerra +gudrun +gtfullam +gremio +greeks +greed +graffiti +gracey +gorman +gordito +google123 +gomer +golf18 +godislove +gobrowns +gigolo +ghzybr +ghghgh +ghbynth +ghbhjlf +gfgfgf +gecko1 +gazza +gatech +garrett1 +gardenia +ganymede +gametime +gameon +gallop +gabbie +frigid +frehley +freestyl +freenet +frdfhbev +frankfur +fourfour +fortytwo +forensic +fore +floria +fktrcfylhjdyf +firefighter +finley +findme +files +filbert +fidget +ferari +felip +favorit +farmall +fantasy1 +fabienn +excel +evely +erick +erhfbyf +engel +eggs +eatmeraw +easy123 +eadgbe +dunk +duckling +dthyjcnm +drumline +dreamon +dread +drdoom +dragon66 +dragon2 +downey +donger +docto +dmitrii +dispatch +disc +dingus +dimensio +dfczdfcz +dexter1 +devilmaycry4 +devildriver +deusex +desade +derfderf +deneme +demian +defiant1 +defence +deamon +deadlift +dcpugh +dbrekz +dbnfkbq +davey +darla +danni1 +d6o8Pm +d123456 +cxfcnmttcnm +cthuttdyf +cristo +crazyZil +craig1 +cozumel +cover +cosita +coronado +coolie +cool99 +controls +connery +concha +compusa +combat123654 +colibri +cnhjqrf +clones +climb +claudius +cjrjkjdf +christy1 +choclate +chipie +chic +chevyz71 +cherish +cheeto +checkmate +charmed1 +cdtnrf +cdtnjxrf +caviar +castaway +cashmere +candy2 +campos +calhoun +cachondo +cH5Nmk +bysunsu +bulldo +budge +bud420 +buckster +britain +brit +brave +booyaa +boobo +bonds +bommel +bmw325i +blueyes +bluefin +blue55 +blister +blacktop +blackshe +blackber +binkie +billyjoe +bigbuck +bibibi +bharat +beszoptad +bess +berenice +bennet +bellevue +bella123 +beasts +bear123 +bathroom +bassline +basics +bartende +barnet +bark +bare +barca +barbie1 +ballss +ballgame +baller1 +bakery +baikal +badger1 +atybrc +attica +asterios +assmaste +assa +asdfas +as1234 +arsen +archive +aqswde +apocalypse +anonim +ameli +alpacino +alma +alligato +alici +alex99 +alex13 +african +adagio +aceshigh +acUn3t1x +abpbrf +abigail1 +abdul +ZXCVBN +X24ik3 +Winston1 +UDbwsK +Travis +Thumper +Stanley +Shannon +Sarah +SILVER +Russia +Russell +QqH92R +Peter1 +Peter +Panther1 +Packers1 +Nintendo +Nastya +NIKITA +MrBrownX +Monster +Martin1 +Markus +MURPHY +MELISSA +MARTIN +Lakers +Ireland +Horny1 +Girls1 +Fuckyou1 +Front242 +FUCKER +FUAqZ4 +Edward1 +Edward +Eagle1 +EFBCAPA201 +Douglas +Diver +Dbrnjhbz +DENIS1 +Captain +Calgary +COWBOYS +CHRIS +Blizzard +BULLDOG +Asdfghjkl +Angels +ANGEL +9inches +9191 +89231243658s +852147 +7BGiQK +7625 +75395 +747747 +7070 +6string +69a20a +6868 +654456 +5rxyPN +55556666 +5550123 +5544 +5472 +4z34l0ts +4564 +4539 +4356 +4223 +41414141 +4114 +3939 +38253825 +333111 +325325 +311287 +311089 +311077 +310879 +31081971 +31071995 +3107 +310590 +310392 +310389 +310186 +310182 +31011975 +301284 +301084 +30101976 +30091993 +300884 +3008 +300791 +300787 +30071978 +300680 +30061995 +30051977 +30051975 +30051963 +300484 +30041974 +300383 +30031972 +300186 +30011998 +30011994 +30011975 +291290 +29121973 +291185 +29111979 +290986 +29091974 +29081993 +290777 +29071977 +290684 +29051972 +290489 +29041972 +29031978 +29011979 +282860 +281287 +28121974 +281188 +281186 +280983 +28091976 +280789 +28061994 +28061980 +28051982 +28051974 +2804 +280387 +271282 +271190 +27111977 +27101994 +27101974 +2710 +270990 +27091977 +27061994 +270588 +270587 +270581 +270578 +27051978 +27051974 +2705 +27041976 +270375 +27031997 +27031977 +27021980 +2627 +261291 +261282 +261190 +26111974 +26101994 +260984 +26091993 +26091972 +260784 +260782 +26071975 +260690 +260581 +26051973 +260484 +26041995 +260389 +26031995 +260291 +25962596 +251183 +251179 +251090 +25081996 +250791 +250683 +25051973 +25051972 +250479 +25041996 +25041973 +250291 +250285 +250180 +241280 +241087 +24101997 +24101971 +240981 +24091974 +240888 +24081975 +24071993 +24071972 +240483 +2404 +24031979 +240192 +240188 +232629 +2326 +231282 +23121979 +23121978 +231192 +231087 +23101977 +230994 +230991 +230984 +23091972 +2309 +23081994 +230784 +23071971 +230683 +23061977 +23049307 +23041974 +230387 +23031977 +23031976 +230293 +230285 +230280 +23011974 +225522 +2235 +221282 +22101995 +22101977 +22101976 +22101973 +220980 +220885 +220881 +220879 +22081997 +220693 +220684 +22051977 +22051971 +220491 +22031972 +220293 +220272 +2114 +211282 +211189 +211092 +21101979 +21101975 +21091978 +21091976 +21071977 +21061994 +2105 +210484 +210482 +210389 +210289 +210181 +203040 +2020327 +201179 +20111995 +201082 +201079 +200984 +200982 +200883 +200879 +20081969 +20071995 +20071972 +200686 +200683 +200485 +200482 +200390 +200387 +20031996 +20021996 +20021971 +200181 +20011975 +20011970 +20011968 +1z2z3z +1Aaaaa +198200 +198000 +19551955 +19501950 +19481948 +19371937 +19111975 +19101975 +19091972 +19081971 +19071976 +19071971 +19051971 +19031975 +19021994 +19011974 +18821221 +181288 +18121975 +181192 +181191 +181188 +181183 +18111978 +18101978 +18101977 +180880 +18081995 +18081994 +18081993 +180589 +18051979 +180488 +180482 +18041973 +180191 +18011997 +1777 +171288 +17121996 +17121994 +17121976 +171190 +17111974 +17101994 +17101975 +170979 +17071996 +17051973 +170490 +170487 +17041976 +17031972 +1701d +161291 +161286 +1612 +160986 +160879 +16081972 +160791 +160783 +160689 +160581 +160484 +160479 +16031971 +16021995 +160185 +16011974 +152535 +151290 +151284 +151186 +151151 +15111975 +15111972 +151076 +150980 +15091980 +150891 +150690 +150587 +15041996 +15041995 +15041974 +150387 +150380 +15031977 +15031972 +150285 +150186 +15001500 +1437 +141286 +14121970 +141188 +141187 +14111996 +14101971 +140892 +140785 +140782 +140779 +14071972 +140590 +140584 +140580 +140480 +140390 +140384 +14031974 +140180 +14011977 +13571357 +134679258 +1314 +13121994 +13121973 +13111975 +13111974 +13111973 +13101977 +13101976 +13101974 +13101972 +130992 +130881 +13081970 +130787 +130776 +13071970 +130691 +130678 +13061994 +13061975 +1306 +130590 +130582 +13051977 +130481 +13041995 +13041977 +13041976 +130391 +130384 +130288 +13021996 +13021973 +12monkey +12e3E456 +127127 +12345zxcvb +123456qaz +12345678z +12345678c +123456789x +123345 +12312345 +12134 +121275 +121269 +121081 +121080 +120881 +120880 +120781 +120780 +120681 +120384 +120377 +120289 +120189 +120182 +12011973 +1169 +1133 +11223344q +111888 +111286 +111283 +11121977 +111191 +11101978 +11081994 +110791 +11071996 +110692 +110480 +11041978 +110292 +110185 +11011979 +101292 +101288 +10111994 +1010810108 +100889 +10081995 +10051996 +10051995 +10041978 +100392 +091281 +09091978 +090890 +09081996 +09081976 +09081975 +09081974 +090787 +090684 +09061974 +09041974 +090383 +08121979 +08121973 +081086 +08101978 +08101976 +08101974 +080988 +08082008 +08071977 +080688 +080687 +080585 +08051981 +08041975 +080380 +08011979 +071284 +07121993 +07121976 +071186 +07111975 +07111973 +07111972 +07101993 +07101976 +07091993 +07072007 +070690 +070682 +070189 +07011976 +06121995 +06121974 +06101995 +06091994 +06091974 +060888 +060885 +06061996 +06061993 +06061976 +06051979 +060485 +06031978 +06031973 +06011974 +05121982 +05121977 +05121976 +051183 +05111977 +051084 +05101991 +05101972 +05081974 +050683 +0506 +05041996 +05041975 +0504 +05031995 +05031978 +05021977 +05011994 +04121994 +041179 +04111974 +041089 +04101993 +040989 +04091994 +040890 +040783 +040780 +04071978 +04061995 +04051979 +040485 +040482 +040480 +04031997 +04031995 +04021973 +040188 +04011975 +031184 +03111994 +03091978 +03091976 +030877 +030786 +03051973 +030385 +03021974 +021290 +02121974 +021184 +021181 +021084 +021065 +02091994 +020784 +0206 +020484 +02032010 +02022011 +0201 +011286 +0112 +01111993 +01101977 +01092008 +01071977 +01041973 +010195 +010177 +010172 +010168 +0070 +0044 +zxcvbnmm +zealot +zaza +zanoza +zSMJ2V +ytreza +xsw23edc +xerox +xavier1 +xakep1234 +wulfgar +wrest666 +wotan +wish +winslow +wexford +wetone +westwind +westbrom +wells +weiser +weener +walt +wall +vredina +volition +vitalya +violence +vikavika +vfrfhjys +vermin +verizon1 +veritech +venkat +vehpbkrf +vavilon +uwrL7c +utyyflbq +umberto +ukflbjkec +uGEJvp +tyler2 +tweeker +tribe1 +treetops +travesti +tranmere +train1 +tragic +tooter +toodles +tomoko +tino +timex +tiesto +thrash +thorn +thatsit +tgbyhn +testing123 +tempus +teleport +teetime +teenager +teddy2 +teddy123 +tatanka +tanstaaf +tampa +talon1 +svetlanka +suzy +super8 +sunstar +sunghile +suka123 +suchka +studio54 +stromb +strokes +straycat +steinway +stefa +stealth1 +sparkie +spacey +southend +souris +sorrento +sonechka +soap +smiling +smallvil +sleepers +slade +skyking +skates +sinfonia +simson +simbas +silvio +sigmanu +siemen +sickan +sicily +shotgun1 +shorty1 +shootme +shlong +shipyard +shimmy +sherpa +sherman1 +sharkey +shagger +shadows1 +sex666 +serendip +serdar +senha123 +seldom +section +seagulls +seagrams +screwed +schlampe +saveme +savana +satana666 +santosh +sandy123 +samsung2 +sami +sallad +salamat +saitek +saint1 +sailor1 +ruffryde +rudi +rudder +rubyruby +rottweil +rottie +rosebowl +roofing +romanroman +robbie1 +robbi +ritchie +ripcurl +riker1 +ribbon +rfn.irf +rfhfufylf +rerecz +regiment +reese +redondo +redford +recoil +reaper1 +realtime +ratpack +ratbag +rapids +ranger99 +rammer +rahman +radios +radiator +r123456 +qweqwe123 +qwedcxzas +qw12er34 +qw1234 +quint +quiet +quark +qqq123 +qazxs +punkie +psalms +programmer +prizrak +primer +possible +porsch +poplar +pongo +pollen +polaris1 +pokemon12 +podaria +plumper +plplpl +pingping +pigs +piggy1 +piano1 +phydeaux +phred +phoeni +phiphi +phaser +persia +pershing +perros +pentium4 +penney +peeker +pedigree +paypal +payback +patriot1 +passw0r +passss +passmaster +painkiller +packrat +p3WQaw +p12345 +p00kie +orion2 +opened +opel +oneway +onelove1 +olya +olga123 +offsprin +note1234 +nokia5310 +nochance +nigga1 +nick123 +nick12 +newyor +newports +nazareth +nataliya +natacha +nastyboy +nascar88 +nalgas +nail +nafnaf +naciona +myriam +my3kids +muster +mustang7 +mpower +montego +monstr +monaro +mof6681 +moby +mobius +mitch1 +misskitt +misato +minnow +minni +millennium +milkbone +milesd +midian +michelin +mica +mgoblue +mexicano +megamanx +mavrick +maverik +maui +matman +matlock +math +matematika +master99 +martin12 +mark1234 +mark12 +maritime +maribe +maria123 +marcus1 +marconi +marci +marcell +manisha +mamuka +mamit +mallet +malik +majere +mainman +madzia +madras +madona +madball +mabel +m6cJy69u35 +lynx +lyle +lustful +luebri +lucydog +lsutiger +lowlife +lower +loveu2 +lostone +lonsdale +lolly +lizard1 +liverune +lions1 +lifter +lifesuck +lickem +letmeinnow +leisure +lastochka +lasting +larrys +larry33 +lancers +lada +kuleshov +koufax +kolyan +kinsey +killer7 +killer2 +killall +kickme +kfylsi +kfgekz +kenton +keebler +katie123 +kati +kasandra +karups +kariya +kari +kamran +kacper +just4you +july23 +juicer +juice2 +juergen +jordans +joker69 +john11 +johanne +jody +jobber +jlaudio +jkmuf +jiujitsu +jimmyd +jeroen +jenova +jellyfis +jedijedi +jdeere +jarred +james23 +ishikawa +irontree +intranet +intheass +independent +imperium +ikarus +idaho +iamgay +hyper +huskies1 +humper +humboldt +hugecock +huey +howdy1 +hotrod1 +hotguy +hoseman +horsesho +horns +hoop +history1 +hicks +hendrix1 +helpdesk +helloworld +hellhell +hellen +heavyd +heath +heart1 +hayward +haunted +harry123 +happy69 +handler +hamradio +halohalo +hadrian +hadoken +guita +griffen +gretel +green5 +green3 +grasso +grasshop +grady +goterps +gossip +goshen +gordo1 +google12 +goodfellas +good12345 +golova +golf69 +golde +go1234 +globe +giulio +gitler +gipper +ghostrid +gfnhbr +getty +gert +gehrig +garvey +gander +gabi +g00ber +fuckmenow +fuckmeha +fucklove +fruits +fromage +friendste +freebie +foxtrot1 +foucault +followme +flush +fluffy1 +flowers1 +flore +flatline +flakes +findout +filipp +fighters +fiddler +fenster +farrah +farhan +falcon16 +failure +fabrice +f3gh65 +f150 +external +eugenia +essex +esmeralda +enable +emmaemma +elmore +egoist +edelweis +easier +eagleone +dzdzdzdz +durden +dummy1 +dumber +drummers +drgonzo +dragon76 +douglass +doudo +doozer +doorway +dominic1 +dolly1 +dogstar +dogbreat +dog1 +dmoney +dmitri +dixiedog +disciple +dilshod +digiview +dicanio +diaz +dianka +dgl70460 +depechemode +dennis1 +denise1 +deliver +defamer +deck +deacons +deHpYE +darthmau +darkwolf +dannie +damia +daisy123 +d1i2m3a4 +cumulus +cummin +cumalot +crypto +crossing +crocodile +creamer +crazy123 +crackhea +country1 +costarica +corvus +coronet +cornbrea +coope +coolest +cool1 +concerto +coldfire +coffey +cochon +claus +clarity +clare +clair +ckjybr +cichlid +churchill +chubbs +chrystal +christof +choose +chinaman +chinacat +chicky +chicken2 +chevy454 +cherr +cheer1 +cheap +chaucer +charger1 +charcoal +chaoss +change1 +chamonix +centurion +centaur +celia +cdjkjxm +catt +cass +casey123 +caruso +carousel +carmen1 +cannot +canela +candy123 +cabowabo +cabbie +buzzers +burbank +bullhead +buddha1 +britney1 +bridges +brethart +breakers +bratan +bozobozo +bookmark +bono +bongos +bochum +bobbyy +bluemax +blazed +blackbea +biotch +bigdeal +bigbill +beware +beryl +berries +bennett1 +benjie +belochka +bello +bedtime +bedpan +bauer +batterse +bateau +baranov +bangers +ballen +babette +bEeLCH +awaken +austin12 +aurelius +asroma +asq321 +asdfg1 +arian +apple12 +antman +antilles +anguss +andone +anabolic +amanda69 +alyssa1 +almost +ajem +airhead +airforce1 +agenda +adrenaline +aditya +acerview +abulafia +abracada +abel +aa1234 +Yankees1 +YELLOW +Xavier +Tiffany +Silver1 +Richard1 +Raistlin +Rainbow +Raiders1 +QcFMtz +Q9uMoz +Pa55word +October +OMAR10 +NISSAN +MrBrownXX +MARINE +Lvbnhbq +Lestat +JOHN +JACK +Hercules +Frank +Fishing +Fffffff1 +Ferrari1 +Fantasy +FIREMAN +EAGLES +DOLPHINS +D6wNRo +Courtney +Cooper +Chgobndg +Campbell +CARLOS +Brian1 +Beatles +Austin1 +Ashley1 +Anderson +Alpha1 +ANGELS +999111999q +9788960 +9638v +852741 +852123 +82468246 +774411 +7550055 +6CHiD8 +69966996 +667788 +56Qhxs +555999 +54132442 +4rkpkt +4ZqAUF +4Wwvte +4660 +456789123 +456123789 +4488 +43434343 +4071 +3sYqo15hiL +3ki42X +3MPz4R +335533aa +326598 +321987 +3141592654 +31121978 +311085 +310789 +310780 +31071996 +310591 +310584 +3105 +31031977 +31031970 +310191 +31011981 +3101 +30121976 +30121971 +301191 +301081 +30101993 +3010 +300986 +30091971 +30081977 +30071973 +30061998 +30061973 +300589 +300491 +300488 +300485 +300384 +30031980 +300189 +300188 +300000 +2n6Wvq +2hot +291188 +291183 +291182 +29111978 +29101995 +29101994 +290982 +290891 +290881 +29081978 +29071970 +290691 +29061978 +29061971 +290586 +29051994 +29051975 +290490 +29011994 +29011972 +281289 +2812 +281092 +281084 +28091975 +28081997 +28081996 +28081974 +28071995 +280587 +28051975 +28051973 +280489 +280381 +280290 +280288 +280284 +28021997 +28021976 +28011994 +28011972 +27121976 +27121975 +271178 +27111975 +271086 +27091993 +27091974 +27091971 +27081978 +27081975 +270783 +27071976 +270686 +270682 +27061977 +270584 +270489 +270484 +270384 +270292 +27021973 +261185 +26101975 +260982 +26081978 +2608 +260783 +260779 +26061978 +26061974 +260486 +260481 +26041976 +26031978 +26031973 +26031970 +260288 +260282 +260182 +2600 +256256 +2536 +252627 +251287 +251190 +251081 +25101980 +25101979 +25101976 +25101974 +250892 +250888 +250885 +250869 +25081976 +25081975 +25071995 +250574 +25041971 +25021977 +25021974 +25011974 +24121994 +24121977 +24121975 +241184 +241178 +24111994 +24101976 +240991 +24091975 +240882 +24081994 +24081976 +24071975 +24061995 +240592 +240589 +24051995 +24041996 +24031974 +2403 +24021996 +240184 +24011996 +2366 +2355 +231285 +23121997 +23121975 +231181 +23111972 +231092 +231084 +231079 +23101978 +230985 +230786 +230781 +23071994 +23071972 +230587 +230575 +23051972 +23051971 +230489 +23041994 +23021966 +230186 +22442244 +2232 +22121976 +221181 +221176 +221088 +221081 +220983 +22091995 +22091975 +220889 +220783 +22071997 +220681 +220641 +22051996 +22051973 +22041975 +220393 +220283 +220278 +22021979 +22021975 +22021971 +22011996 +21252125 +211183 +21111993 +21111977 +211084 +210993 +21091995 +21091970 +210892 +210889 +210887 +210886 +210880 +21081993 +2108 +2107 +210683 +21061996 +21061977 +210584 +21051977 +210492 +21041976 +21031968 +210285 +21021997 +201294 +201288 +20122012 +201183 +20101971 +200981 +20091996 +200885 +20081976 +20081974 +200779 +20071998 +200687 +20061972 +20051997 +20051968 +200490 +200388 +20031998 +20031994 +20031977 +2002tii +200189 +1Harley +199 +197979 +1972chev +197000 +19411941 +19391945 +1938 +1921 +191283 +191186 +19101995 +19101972 +190991 +19081977 +190791 +19071978 +19061998 +19061993 +19041995 +19031978 +1903 +19021974 +18811881 +18101976 +18091976 +180881 +18081974 +180783 +180782 +180682 +18061973 +180585 +180583 +180486 +180479 +18041975 +18031998 +18031975 +18021995 +18021970 +180182 +180181 +18011996 +1750 +171819 +171283 +17111975 +171081 +17101997 +17091975 +170890 +17071974 +170591 +170580 +170396 +170389 +17031980 +17031974 +1703 +170282 +17021972 +1702 +170180 +161273 +16121972 +161185 +161183 +16111995 +161091 +161088 +161082 +16101977 +160988 +160987 +160894 +160889 +160785 +16071975 +160690 +160684 +160677 +160591 +16051975 +160485 +16041976 +160389 +16031979 +160295 +160283 +16011979 +159874 +1580 +153426 +151285 +151282 +15121976 +151181 +15101973 +15091976 +15081975 +15081973 +15081972 +15071996 +15071972 +150691 +150680 +15061979 +150492 +150391 +150293 +150286 +15021973 +150188 +150184 +15011975 +1421 +14121976 +141196 +141185 +14111980 +14101972 +140989 +140882 +140679 +140474 +140389 +140382 +14031973 +140278 +14021973 +1401 +1340 +13091993 +130791 +130690 +130592 +130584 +13051994 +130485 +130480 +130479 +13041971 +130393 +13031970 +130186 +130182 +1280 +1260 +12541254 +1250 +123dan +12345as +123459876 +123456i +123456789qqq +1233214 +121181 +121180 +12111993 +12111975 +121076 +12101969 +120894 +120891 +120787 +120773 +12071972 +120692 +120592 +12051977 +12041996 +120380 +120376 +12021976 +120184 +120179 +120174 +1175 +1170 +1145 +114411 +111284 +1112131415 +11111972 +11111971 +110881 +110879 +11081974 +11071976 +110690 +110681 +11061971 +110492 +110491 +110483 +110377 +110187 +110186 +1075 +1066ad +1063 +1044 +101290 +101281 +10121973 +10121972 +101184 +10111976 +101094 +101069 +100989 +100983 +10091971 +100789 +10071974 +100684 +10061996 +10051976 +10051975 +10051973 +100492 +10041971 +100383 +10031977 +100280 +100275 +10021971 +10012000 +10011976 +098123 +0916 +09121971 +091083 +09101996 +09101975 +09091973 +09091972 +090909t +090887 +09081971 +09061995 +09061971 +09051972 +09041977 +09031977 +081285 +081281 +081090 +080890 +08081975 +08061994 +08051976 +0805 +08011998 +08011994 +08011973 +07121972 +071181 +07111996 +0710 +07081972 +07081963 +070688 +07061979 +07061978 +07061973 +07061972 +07051994 +07041994 +07031994 +07031973 +0624 +0623 +061286 +061282 +06121976 +06121975 +06111994 +061079 +06071995 +060692 +060688 +060684 +06061969 +0606 +060482 +060479 +06041977 +06021978 +06021977 +05121992 +0511 +05101994 +05101977 +05101976 +05091996 +0509 +050891 +050880 +050589 +050370 +05031998 +050283 +050183 +05011975 +043aaa +041083 +04101971 +04071995 +0407 +040686 +04051993 +04031976 +0330 +0323 +031285 +03111976 +03111974 +03111971 +031081 +03101996 +030982 +03091977 +030894 +03081970 +030784 +03071976 +030689 +03051968 +030487 +03041998 +03041973 +030394 +03032008 +021288 +021190 +02111976 +021088 +021086 +021083 +021078 +02101994 +020884 +020783 +020687 +020587 +020379 +02032008 +020290 +020274 +02011994 +01121993 +011089 +011086 +01101976 +0110 +010990 +01092006 +01092005 +010890 +010883 +010788 +010786 +01071996 +010683 +01061995 +01061971 +010584 +01051967 +01051965 +01041998 +01041970 +01031970 +01031966 +010290 +010280 +01021998 +01021972 +010182 +010173 +01011997 +00133 +zvbxrpl +zinedine +zemfira +zaskar +zaq1zaq1 +zaharov +yuki +yoyoyoyo +youwish +year2000 +wrecker +wpF8eU +wormwood +woobie +witches +winsto +winkie +willing +whatnot +westlake +welcome123 +weaponx +watchmen +wantsome +walter1 +wallace1 +vyjujnjxbt +vlad1997 +viviana +vitali +virgo1 +ville +vfkmdbyf +vermont1 +vcRaDq +vaz2109 +vasileva +uyxnYd +updown +update +unholy +underpar +ulisse +ukflbfnjh +uiop +type40 +tyler123 +tutu +turing +tropic +trivial +tripping +triforce +trickle +treeman +transformers +transam1 +tombston +tishka +tigger69 +tigerman +tiger69 +thorpe +thor5200 +therese +theboy +test01 +temptemp +techie +tbone1 +tatung +taters +tarheel1 +tanja +talons +talking +takeshi +tajmahal +t4NVp7 +synapse +sweetie1 +sweep +surfers +supervisor +superduper +super7 +stuffy +strummer +strekoza +stomp +stewar1 +stephie +stephe +starlet +star11 +stacy1 +sr20det +squiggy +springst +spoon1 +spinning +spicey +spaz +spade +solitari +society +snowy1 +snoogins +snipe +snail +smoothy +smith123 +slyfox +slurpee +slowride +sleaze +slaveboy +skye +skunky +skipjack +skate1 +simon123 +siemens1 +shirak +shani +sexyfeet +sexse +sexlover +sevilia1 +semprini +sellout +secret12 +scruff +scramble +scarecro +sassas +sasha1996 +sarasota +sansan +sanity729 +sanibel +sampras +sammy12 +salvatio +salut +salty +saleem +salavat +sadist +rubies +rossia +rossi +rosetta +rootroot +roman123 +rolan +rodeo1 +rockport +rockbott +rjnjgtc +rjdfktyrj +riverside +ricflair +rfvbrflpt +rfnzrfnz +rfhfntkm +rfhfcm +rexona +repmvf +redwing1 +redriver +redrider +redcat +recent +raymon +ratrat +ramesh +raffaele +radioman +rache +r3ady41t +qwerty66 +qweasdzxc1 +quicksan +quake2 +pynchon +purple12 +pupuce +pulley +protein +protege +professo +precious1 +prairie +pradeep +pornsite +porche +ponies +polecat +pole +pledge +phuong +phelps +pfchfytw +perv +peoria +pennys +pendragon +peaces +paulette +paulchen +paul12 +paterson +pasquale +panties1 +pallino +packers4 +pN5jvW +owned +outlook +outlawz +ouch +only4me +onkelz +omegas +ollie1 +oakwood +oZlQ6QWm +oRNw6D +novartis +nosaj +nortel +nomad1 +njnets +njkcnsq +njQcW4 +nikkie +nikiniki +nietzsch +nfyufh +neveragain +nervous +nelson1 +negras +necron +nbvjirf +nanny +nadin +nabeel +myfamily +myers +mugsy +moveon +moren +morehead +moody +monet +mom4u4mm +molotov +moleman +mode +modano +mocha1 +miramar +mimi92139 +milwauke +milleniu +mikey123 +mike13 +mihaela +mierd +michaelj +merkin +melnik +melkor +mehmet +megabyte +mechta +mcdonalds +mcardle +maxwel +maxim1 +maumau +mateo +masterlo +mass +marvin1 +marusia +marmot +marlen +mariso +march1 +maplelea +manger +malcolm1 +malamute +makita +makelove +mailto +maggie2 +maddox +m69fg2w +loveporn +lovell +lovegirl +loveboat +lovebird +love143 +louie1 +lookie +london22 +lollone +lkjhgfd +lisa123 +lindas +limabean +lhepmz +less +lepton +leonora +lebedeva +leanna +layout +lawless +lars +landrover +lakers32 +lakeland +lagoon +labrat +kroshka +kristjan +korona +koolio +koffie +kobe24 +kiwikiwi +kinger +kimmy1 +kemper +kelsie +kellyb +keines +kazbek +kaufman +katrina1 +kamehameha +kaizen +kaikai +k12345 +julianna +juices +jugs +josefina +joint +johns +johnpaul +jodi +jimenez +jiggle +jetset +jessica0 +jeanna +jazzer +jadakiss +jacqueli +jackdani +jack1234 +izabella +issue43 +israe +ironpony +infinit +indians1 +inTj3a +ilya +ilovehim +ikilz083 +iceman69 +hutton +hunting1 +hunger +hotmom +hotdamn +hosehead +horny2 +hoops1 +honeypot +homey +hoboken +hobo +hitomi +hikaru +heyman +herzog +herb +henry14 +hendrik +helicopt +heel +hecnfv +heave +hax0red +harvey1 +harrie +happys +hansolo1 +hammarby +halley +hPk2Qc +guster +gussie +gthtcnhjqrf +gsxr1100 +gsxr11 +grunge +grouch +greddy +gravy +grange +goodtogo +gonzale +golgo13 +golf72 +gold123 +goggles +godgod +gobills +glock22 +giselle +girlss +girlgirl +ginuwine +gino +gfccdjhl +gblfhfcs +gavrik +garci +gangstar +gala +gabriel2 +gabe +g9zNS4 +fynjif +fyfrjylf +fullsail +fuckass +froggies +fritter +freeride +fred1 +foxbat +forgotte +forest11 +florin +flicka +flair +fighton +fhntvbq +fhntv1998 +fgntrf +ferdinand +federic +feb2000 +fcporto +fastback +familyguy +evolve +evidence +evgesha +estella +esperanz +esoteric +ernie1 +erickson +enzo +englan +eljefe +elfquest +elektro +elegance +elanor +eistee +eieio +edwar +echelon +earnhardt +eagleeye +ePVjb6 +durango1 +dupont24 +dunamis +driver1 +dragon21 +dozer +dongle +dogfight +doc123 +djdxbr +didit +diciembr +dfcmrf +devlin +derek1 +deerhunter +deathsta +deadmeat +dbrnjhjdbx +darrin +danuta +danthema +dano +danil8098 +daniela1 +daddio +daboss +curve +curtis1 +cthulu +crushed +corran +copycat +coonass +cookie12 +contrast +connie1 +compaq12 +comic +colt1911 +cologne +colleen1 +colin1 +colder +cocoloco +clambake +cjcbcrf +cities +cirque +christos +chrisp +chrisc +chris22 +chosen1 +chop +chochoz +chesterfield +cherub +chelsie +check1 +chairs +cfifcfif +cellphon +casey2 +carolcox +carey +canes1 +caller +caliber +cakes +cabin +cab4ma99 +butte +buster11 +bulova +bulgaria +bueno +budbud +buckle +bruin +brianne +brass +brandon2 +boxer1 +borris +booner +boogie1 +bonebone +bollock +bobbijo +boards +bluegras +bluearmy +blue25 +bless +bjorn +bitch69 +bitch123 +birdbird +bigwilly +bigtymer +bigbass +bent +benji1 +beethoven +beasty +bayside +battlefield +batman2 +baseba11 +barking +barbos +banking +bangor +ballon +badminton +badgirls +babaloo +awards +avenger1 +august1 +atrain +atlantida +assist +asfnhg66 +asdfgh12 +arches +aquinas +aq1sw2de3 +april12 +apostle +anutka +anus +anselm +anonymou +anna1987 +anna12 +anjing +angler +andriy +andreeva +amylee +ambush +ambulanc +ambassador +alpha06 +alfa156 +alex32 +airline +ahmad +agony +aeiou +acdcacdc +access12 +abfkrf +abcdabcd +a987654321 +a123456a +YAMAHA +XXXXXXXX +Vladimir +VKaxCS +TrS8F7 +Tiger1 +Tiffany1 +TIGER +Sparky1 +Security +STEELERS +RuleZzz +PzaiU8 +Peanut +PLAYER +PANTIES +NnAgqX +NEWYORK +Mother +Marcus +Lover1 +Kenneth +Karina +Justin1 +Jesus1 +Jackson1 +JAGUAR +ICEMAN +Heather1 +HANNAH +Golfer +Ginger1 +Gateway1 +GWju3g +Fktrctq +FDM7ed +Dolphins +December +Ddddd1 +DAKOTA +D1lakiss +CountyLi +Casper +Canada +COOPER +Bubbles +BROOKLYN +Asshole1 +Assa1234 +Alexis +Airborne +A12345 +9801 +95175 +9292 +90125 +900000 +889988 +87t5hdf +85245 +8282 +811pahc +7896 +789520 +775533 +74123 +678678 +669966 +6661 +62717315 +5959 +57nP39 +56785678 +557711 +555666777 +5411 +5398 +5254 +5115 +50505 +4money +49527843 +4544 +4506802a +4268 +42042042 +4112 +4071505 +3QVqoD +3334 +3332 +315315 +3111 +311087 +31101994 +31101980 +310881 +31081974 +310781 +31051995 +310188 +31011973 +301185 +301182 +301179 +30111976 +30111975 +30111970 +301080 +301078 +30101979 +30091972 +3009 +300885 +30081975 +30081971 +30071997 +300682 +300580 +3005 +300483 +30041979 +30041973 +30041972 +300389 +300382 +300183 +300182 +300180 +300179 +2w2w2w +2good4u +2bad4u +29121994 +29121975 +2912 +291087 +290979 +29091971 +29081976 +290783 +2907 +290683 +29051969 +29041981 +290389 +290385 +290186 +290181 +281286 +28111977 +28111976 +28111973 +28111972 +281088 +281087 +281082 +28101980 +280985 +28081976 +280783 +28061973 +28051995 +280292 +280286 +280193 +280183 +280181 +27121996 +27121978 +27121972 +271195 +271187 +271186 +27101995 +27091995 +27081977 +270779 +270778 +27071973 +270691 +270688 +270680 +27061974 +270593 +270582 +270481 +270479 +27041970 +27031998 +27031979 +270182 +261290 +261283 +261278 +26101974 +2610 +260987 +260887 +260886 +260878 +260791 +26071973 +260584 +26051979 +26051974 +260383 +260283 +26011978 +26011977 +26011976 +258025 +25101995 +250983 +25091970 +250895 +250881 +25081971 +250779 +25071974 +25061975 +250575 +250487 +250391 +25031997 +25031972 +25031971 +25031959 +25021996 +25011977 +24692469 +241179 +24111977 +241090 +241083 +24101979 +240979 +24091994 +24091971 +240883 +240877 +2408 +240780 +24071995 +24071976 +240694 +24061971 +24061969 +240582 +240580 +240494 +240488 +240482 +24041976 +24031993 +24031972 +24021977 +24011995 +23121974 +231179 +23111978 +23111977 +23111976 +231085 +230992 +230989 +23091995 +23081975 +23071973 +23061995 +23061975 +230579 +23051976 +230484 +230480 +23041972 +23031975 +230286 +230184 +230182 +230176 +221292 +221189 +22111977 +221091 +22101997 +22091974 +22081995 +220793 +220782 +220680 +220477 +22041995 +22041966 +22021976 +220193 +22011997 +22011973 +22011971 +211191 +211184 +21111978 +211088 +21081978 +21081977 +21081971 +21071973 +210691 +210572 +210491 +21041972 +2104 +210380 +21021996 +21021995 +21011978 +20142014 +201287 +201281 +20121996 +20121971 +201180 +201177 +20111977 +201090 +200876 +20071973 +200679 +200581 +20051976 +20051973 +200481 +200480 +20031978 +20011996 +200100 +1q2a3z +1pass1page +1daddy +1Thomas +1Soccer +1Martin +1Dick +19922991 +197500 +196666 +19521952 +1935 +1923 +1922 +19121974 +19061994 +19061977 +19061972 +190488 +19041977 +19041971 +19031977 +190288 +19021979 +190152 +19011979 +187211 +181920 +181287 +18121977 +18101995 +18101975 +180989 +180889 +180878 +18081973 +180793 +18071974 +180692 +180685 +180683 +180581 +18051976 +18041995 +18041974 +180288 +180286 +180283 +180183 +18011975 +171289 +17121977 +171187 +171089 +17101972 +17101971 +17081980 +17081975 +17071997 +17061971 +170581 +170481 +170478 +17041970 +170283 +170191 +170188 +17011997 +17011963 +161289 +16111971 +161089 +160983 +160886 +160781 +160693 +16061970 +16051976 +16051972 +160481 +16041974 +160387 +160379 +160183 +159963 +15987532 +159487 +1551 +151288 +15121969 +15121968 +151187 +15111995 +151087 +151083 +151081 +151080 +151078 +15101972 +15101962 +15091995 +15091974 +15081996 +15081976 +150685 +150682 +150593 +150577 +150484 +150481 +15041973 +150377 +15031973 +150292 +150284 +150189 +15011995 +15011994 +141282 +14121975 +141183 +141180 +14111972 +141077 +14101973 +14101970 +140991 +140981 +140979 +14091977 +14091971 +140889 +14071997 +14071975 +140683 +140577 +140494 +140381 +140286 +140280 +13371337 +131291 +131279 +13121312 +131181 +13111996 +13111979 +131083 +13101995 +130981 +130978 +13091971 +130892 +13081977 +13081974 +130775 +130682 +13061996 +130596 +130581 +13031997 +13031975 +130292 +13011998 +13011973 +1281 +1264 +12481632 +12431243 +123fuck +123a123 +1234ab +12345ta +12345689 +1234567d +123456789t +12345678912 +123123qweqwe +121266 +121233 +121183 +12111994 +12111971 +121095 +121077 +12101971 +120980 +12091973 +12091209 +120876 +12081970 +120694 +120682 +120678 +12061975 +120593 +120494 +120493 +120476 +120475 +120474 +12041999 +12041970 +120392 +120379 +12031973 +12021998 +120186 +12011997 +119119 +1156 +11341134 +1122112211 +111280 +111223 +11122 +11121970 +111171 +11111z +111085 +11101995 +110882 +11081998 +11081971 +110677 +11061994 +11061974 +11061973 +110595 +110576 +110569 +11051974 +11041973 +110393 +110177 +1020304 +101271 +10121971 +101189 +101181 +10111975 +10111973 +101020 +100978 +10091995 +10091976 +10091969 +100890 +100878 +100784 +100780 +100678 +10061971 +100477 +10041973 +10041970 +100375 +100287 +100285 +10021972 +100184 +100177 +10011969 +098890 +09121970 +09111977 +091089 +09101995 +090981 +090979 +09091999 +09081997 +090792 +090785 +09071996 +09071974 +090688 +090593 +090580 +09041972 +09031972 +090284 +09021994 +09021973 +09021971 +09021970 +090185 +0818 +081089 +0809 +080892 +080887 +08051998 +08041996 +08041995 +07121975 +071087 +07101992 +07101980 +07101975 +070990 +070987 +070984 +070889 +070884 +07071972 +07051980 +07041969 +0704 +070384 +07021976 +07021975 +07011998 +07011974 +0665 +0616 +06121994 +0612 +061194 +06111979 +061082 +06101973 +060984 +060892 +060879 +060775 +06071996 +06061973 +06051997 +060490 +06041974 +06041970 +060283 +06011977 +051283 +05121972 +051184 +05111993 +050988 +050883 +050782 +050684 +050680 +05051979 +05041994 +050389 +05021997 +05021975 +05021971 +0502 +05011974 +05011973 +0416 +041292 +04121975 +04111995 +04111979 +04111978 +041082 +040790 +04071972 +040680 +040582 +04051997 +04051977 +040487 +040483 +04041973 +04031979 +040290 +04011981 +0319 +0313 +031284 +03121975 +03121973 +03121972 +031183 +03101982 +030985 +030981 +03091973 +030886 +03081972 +030791 +030782 +030687 +03061996 +03061975 +03061973 +03051978 +03051972 +03051970 +030490 +03041969 +030382 +030375 +030373 +03011997 +0301 +02121996 +02121973 +02091995 +020888 +020789 +020780 +02071969 +020679 +020583 +020485 +02041996 +02041994 +020189 +02011964 +0137485 +01121972 +01101995 +01101973 +010984 +01091994 +01081973 +01081970 +010684 +01062000 +01061976 +01061970 +010581 +01051969 +010493 +010492 +010489 +010480 +01041975 +010292 +01021969 +01021964 +010166 +01010 +00096462 +00007 +0000001 +.ktxrf +zxcvbnm12 +zxc321 +zombies +zoltan +zinaida +zaq12ws +zamora +zafira +yours +ybrjkftdbx +yanochka +xwing +xcvbnm +x35v8L +x123456 +wonder1 +wiseman +wired +wings1 +wilton +wildthin +wildcat1 +wiking +wiggins +whitney1 +whitepower +whipped +wenger +welldone +wc18c2 +watts +wardog +wanger +waldorf +w123456 +vjybnjh +vittoria +vista +vigilant +vicky1 +vfvfgfgfz +vfrfhjdf +vfkbyrf +vfhctkm +verdun +veravera +vbrjkf +vaz2107 +vatech +vasquez +vasilek +vanovano +uytrewq +urchin +unable +turbine +tubitzen +trustee +trials +trial1 +trekkie +trajan +trade +toro +torana +topman +topeka +tonino +tommy123 +tobytoby +tinkerbel +timepass +timebomb +tigrenok +tigran +thomas123 +thirsty +thermal +theone1 +thehulk +teodor +temporary +telnet +teflon +teaseme +tazzzz +tawnee +tarasova +tanman +tamila +taltos +tallinn +taipei +taffy1 +sylvain +swank +suzuk +sussex +susi +surrey +supergir +superdog +sunray +sundrop +summer06 +summer05 +sumerki +sugarray +subwoofer +submissi +suave +stymie +stripclub +stoke +sticker +stein +steff +steamboa +stamp +stage +squeaker +spruce +spirit1 +speedrac +specops +spawn2 +soso +sosa21 +sony123 +sonic2 +solei +sokrates +socket +sochi2014 +snowing +snooze +snoops +snooky +snider +snap +smell +slutwife +sleuth +slash1 +skeet +sing +sigsauer +sidorov +shygirl1 +shrooms +shiver +shivan +shithole +shirin +shifter +sherrie +shaven +shaner +shadow99 +setter +sesam +sense +semenov +seaways +sdsadEE23 +schwein +schneide +schnapps +scatman +scampi +sayana +saxon +sandal +sampson1 +sammy2 +samapi +sadness +sabbat +rustem +ruslana +runner1 +ruckus +rosey +rosalind +romantik +rock123 +robroy +roaddogg +rkfdbfnehf +rjntyjxtr +rjcntyrj +rhfcysq +rfnfcnhjaf +revilo +remark +redmond +redhouse +redgreen +rebrov +realm +read +ratt +raspberr +rashad +ranger2 +rancho +raja +railway +ragdoll +radman +qwertyytrewq +qwerty5 +qwerty321 +qwerty123456789 +qwepoi +quicksilver +quick1 +quality1 +qqqwwweee +qazxcvbn +qapmoc +q1w2e3r4t5y6u7 +pupper +pulse +pudge +prufrock +provider +proper +promote +proctor +principe +primetime +primary +postit +pornogra +poppa +pope +poopies +poop12 +poolpool +ponce +pockets +plokijuh +pitstop +pinner +pickles1 +photoman +phenom +pericles +people1 +payroll +paul1 +password1234 +passer +parrish +parris +parkway +parabola +pankaj +pallas +painless +pain4me +p@ssw0rd +osaka +orange77 +omega123 +oliveoil +olaola +okidoki +ohiostate +ocean11 +nothin +nomercy +nokias +nokian95 +nohack04 +nogood +nitwit +nissa +nicole2 +newlife1 +newfie +newell +new123 +nemesi +nashville +naruto12 +nala +naked1 +nakamura +nailer +mynewpas +mymusic +mybitch +musi +murzilka +mullen +mujeres +muggsy +mudder +mrpink +mrclean +motmot +motivate +mosdef +moremone +moogle +monty123 +montess +monkey77 +monkey7 +monkey10 +mongo1 +mole +mjordan +mixail +misty123 +mirela +mineral +mine12 +milli +mila +mikeys +mike22 +metros +merritt +merkur +medium +mech +mecca +mcnabb +mattia +master22 +masons +mase +masahiro +marky +marissa1 +marcopolo +marcio +manta +mancheste +maltese +malibog +malena +male +mahesh +magomed +magister +magica +magda1 +magda +madeira +macduff +mWQ6QlZo +m1234567 +luvbug +lupita +lucky3 +lovestory +lovecraf +love4u +love4ever +louise1 +lolitas +locoman0 +locke +littlee +liteon +lindaa +limpbizk +lima +lilred +like +lifesucks +lexingto +leviatha +lettuce +letmein7 +letmein6 +leopoldo +lbvekz +lbhtrnjh +lazer +langer +lama +ladylady +kumquat +ktjybl +kryten +kristinka +kristal +kookoo +koetsu13 +kodaira52 +kmg365 +klimenko +kitten1 +kitte +kissss +kissarmy +kettle +kenny123 +karinka +kami +kala +junker +jq24Nc +journal +jonson +jojo12 +jeff24 +jeanluc +jazzie +jaybee +james11 +jaja +jaclyn +itdxtyrj +intrigue +indeed +imogen +ias100 +hyacinth +hurtme +hurdle +hunter01 +hugh +hotwater +hotspot +hotels +hotboys +hostile +horst +hopkig +hockey99 +hisashi +hinton +himera +heythere +heyheyhey +herson +hermosa +herbal +hellspawn +heller +hedwig +healthy +hazzard +hazelnut +hawkmoon +hatesyou +harley01 +hamburge +haddock +hackme +gznybwf13 +guillaume +guerrero +guatemala +gtnhjdf +grommit +grind +green11 +gr8one +gourmet +goto +goober1 +gonoles +golfer23 +gogetit +gocanes +gobble +gnomes +glock21 +gjkbyjxrf +giuliano +gilberto +giggs11 +gibby +ghtpbltyn +gfhjkmm +getsmart +getiton +gerrity1 +george2 +geirby +gear +gardener +gangst +gandalf2 +gagger +gaby +fuji +fuckhole +fucker69 +front +fridays +freitag +fredi +freddie1 +frannie +franca +forte +footlong +flights +flavio +fishfood +filipino +filibert +fiction7 +feynman +fernandez +feliks +fcbayern +fatjoe +fatdog +fastlane +farside1 +farmers +farhad +fargo +facesit +fabien +exposure +evad +erika1 +emyeuanh +eminem1 +emanuele +elric +ellie1 +echoes +eagle3 +dutch1 +dumper +drumset +draper +drahcir +dragos +dragon10 +doris1 +donnas +doggysty +dman +djljktq +district +disk +dirtyboy +dime +dima12 +diese +dibble +dflbvrf +dfcbkmtdf +devils1 +developer +della +defcon1 +dcunited +davros +davidl +datnigga +dasha123 +dantist +dank420 +danimal +dalla +daily +cvtifhbrb +cvetok +cutegirl +cumshots +culver +cuisine +cuckold +cruzazul +crownvic +crotch +cronos +crm114 +critters +crapper +coupe +count0 +cortes +cops +coorslig +consense +connecti +cojones +cohen +cobblers +cnhtrjpf +clinton1 +clemson1 +cingular +cigar1 +cicci +chumley +chopchop +chomper +chiron +chimaera +chigger +chicos +chessman +cheese12 +cheerios +charlie7 +charlie6 +cfvfhf +cfvehfq +celestia +celest +catwalk +careful +cardiac +canoe +cane +campion +calvert +caballer +cN42qj +cMFnpU +buttmunc +bubblegu +buba +brussels +brujah +brody +briand +breaks +brazzers +bradpitt +bradly +bowden +bovine +boone +boodog +bombom +bodyshop +bodine +bob1 +boatman +bnmbnm +bmw540 +bluecat +blue56 +blowme69 +blood1 +blackbox +birthday54 +billy123 +bigdogs +bigcocks +bigbaby +bigb +bh90210 +berserker +berserke +berg +bentley1 +bellbell +behind +becks +beatit +bears85 +basses +barbaria +banned +bane +bailee +backer +azwebitalia +awsome +autopass +aurore +auntie +atrium +atreyu +asslicker +asdlkj +asdfg12 +asd12 +asasa +arthur1 +arsch +armadill +ariadna +argento +arachnid +aq1sw2 +april10 +antonius +animal1 +angola +andy123 +andreas1 +andre123 +andrade +andi03 +anatol +amber123 +alyss +alskdjfhg +alpha3 +alpha2 +aloysius +allalone +allah1 +all4you +alicante +alfie +alan12 +africa1 +affair +aero +adler +adgjmpt +adams1 +adamant +acidrain +aarons +a55555 +ZLzfrH +Yamaha +WildBlue +Whatever +Walter +Voyager +Vlad7788 +Vanessa +VICTOR +Trfnthbyf +Tracey +Tigers +Ta8g4w +Smokey +Simone +SiMHRq +Shannon1 +Scotty +Sarah1 +SaUn24865709 +SOPHIE +SCORPIO +RxMtKp +R29HqQ +Qwer1234 +Qn632o +Purple +Polina +Player +PRINCE +PASS +NDeYL5 +Mozart +Montana +Mexico +Metallica +MEDLOCK +LzBs2TwZ +LOVEME +LAUREN +LAKERS +KNIGHT +Junior +Hardcore +Ha8Fyp +Golfer1 +Godzilla +Germany +GErYFe +Frederic +Freddy +FUCK_INSIDE +FERRARI +Explorer +Cowboys1 +Cowboys +Coffee +Calvin +CHICKEN +CAROLINA +Brooklyn +Basketball +Arsenal1 +Angel1 +Andreas +Aaaaaa1 +Aaaaa1 +ACLS2H +9990 +989244342a +9797 +88keys +808state +8008 +78678 +7788 +777Angel +74747474 +72727272 +71717171 +708090a +6bjVPe +666666q +666111 +619619 +6161 +5455 +5420 +4z3al0ts +4WcQjn +444222 +4326 +430799 +4211 +3699 +3624 +3579 +3456789 +3377 +3364068 +33223322 +313313 +31121994 +31121979 +31121976 +311095 +311075 +310883 +31081975 +310788 +310782 +31071973 +310588 +310581 +310393 +3103 +302302 +301291 +30121975 +30111974 +30101971 +30091975 +30091973 +30091970 +30081976 +30081965 +300782 +30071972 +300582 +300476 +300184 +2kgWai +2bigtits +2b8riEDT +291289 +291288 +291285 +291186 +291178 +29111994 +291089 +291086 +29101975 +2909 +29081975 +290775 +29071973 +29061973 +29051996 +290481 +290185 +281282 +281271 +28121995 +28121971 +28111979 +281091 +281083 +28101995 +28101976 +280989 +280979 +280971 +28091973 +280881 +280879 +28081975 +28071972 +28071971 +28071970 +280683 +28031977 +280287 +28021970 +280191 +280189 +280180 +28011970 +271290 +271285 +271283 +271271 +27111973 +271088 +271080 +27081968 +270792 +27071996 +27071995 +270681 +270382 +270381 +270291 +27011974 +261180 +261085 +261080 +26101995 +26101972 +260882 +26081970 +260691 +260685 +260678 +260592 +26051971 +260387 +260292 +260189 +2514 +251291 +251282 +25121996 +25111973 +25111971 +250982 +250979 +25091973 +250889 +250887 +25081977 +2508 +250786 +250692 +250691 +250690 +250679 +25051974 +25041969 +250393 +250387 +250384 +25031974 +250191 +250183 +2486 +247365 +241292 +241188 +24111971 +240995 +240986 +24091993 +24081995 +240781 +24071994 +240686 +240287 +24021975 +240189 +240182 +23dp4x +237081a +231292 +231284 +231180 +231091 +231083 +231080 +23101974 +23091970 +23081978 +230691 +230594 +230582 +23051996 +230479 +23041997 +23041976 +230393 +230389 +230373 +23031973 +23031972 +230282 +23021971 +2302 +230180 +2248 +2236 +221280 +22122000 +221185 +221133 +22111974 +221085 +22101974 +2209 +220880 +220781 +22071975 +22061972 +220579 +22041997 +220378 +22031995 +22031974 +22031963 +220287 +220286 +22021997 +220182 +22011970 +211284 +211278 +21121971 +211176 +21111994 +211083 +211080 +21101973 +21091974 +21091973 +21091972 +210888 +21081973 +21081970 +210789 +210788 +210782 +210682 +210681 +210585 +21041997 +210391 +21031995 +210288 +210287 +21011971 +201192 +201187 +201181 +20102000 +20101995 +200880 +200780 +200682 +20061976 +20051974 +20051972 +20041995 +20041971 +200291 +200290 +200289 +200286 +200280 +200277 +20021998 +20021973 +200187 +200180 +1qa2ws3e +1pionee +1Test +1Sexyred +1Money +1Hammer +1Fuckyou +1Cowboy +19812 +19550624 +1925 +19121970 +190985 +190889 +19081972 +190785 +19071974 +19071973 +19061975 +19041976 +19031996 +19031995 +19021998 +19021997 +19021996 +19021977 +19021976 +190187 +19011996 +181283 +18121973 +18121969 +181182 +181179 +18111969 +180990 +1809 +180875 +180788 +18071978 +18071970 +18061994 +180591 +180577 +180476 +180380 +18031996 +180282 +18021979 +18021974 +1785 +1769 +17171 +171282 +17121974 +1712 +171086 +171082 +17101976 +170887 +170876 +17081974 +1708 +170777 +170678 +17041977 +17041965 +170390 +170386 +17021996 +170192 +170189 +170185 +161718 +161284 +161274 +16121996 +16121971 +16111977 +16111974 +16111973 +161087 +16101974 +160979 +16091976 +16081977 +16081968 +16071978 +160679 +16061996 +16061968 +160582 +160579 +160491 +160482 +16041975 +16021970 +160191 +159753258 +15975321 +159357258 +1523 +151190 +15111970 +15091971 +15081969 +150693 +150692 +15061974 +150592 +150591 +150588 +150579 +15051976 +15051974 +15051969 +15041971 +150392 +150382 +150379 +15021996 +150191 +150181 +150179 +15011974 +14vbqk9p +147123 +1456 +141292 +14121971 +141192 +14111995 +141089 +141080 +14101995 +1409 +140876 +14081974 +140691 +140677 +14061993 +140595 +140587 +140579 +14051973 +14051972 +140479 +140292 +140279 +14021998 +14021969 +140190 +140183 +14011976 +14011975 +138138 +1377 +1357997531 +1325 +13231323 +13111994 +13111976 +131076 +13091996 +13091974 +13081973 +130795 +130786 +130579 +130476 +13041998 +130285 +130281 +130279 +13021994 +13021974 +130195 +130193 +13011977 +13011974 +1279 +1277 +1274 +1247 +123www +123qwe456rty +12361236 +123580 +12351235 +12346789 +123456x +123456e +123456789b +1234567890qw +121212a +121187 +12111972 +12101976 +120992 +12091997 +12091995 +120888 +120884 +120878 +12051997 +12011996 +12011974 +1188 +1181 +1172 +1167 +1143 +11231123 +111278 +11121997 +111192 +111184 +111169 +11111996 +11111995 +11111111111 +11101975 +11101971 +111 +110979 +110978 +110787 +11061972 +110591 +110578 +11051973 +110487 +11041971 +110394 +110371 +11031977 +11031970 +110194 +11011999 +11011975 +1079 +1033 +101277 +101178 +10102010 +10101976 +100986 +100984 +100982 +10091978 +100788 +100778 +10071972 +10071971 +10061973 +100592 +100583 +100580 +100579 +10051974 +100481 +100479 +100478 +10041997 +10041996 +100381 +10031996 +10031974 +100292 +100289 +100284 +100282 +100279 +100272 +100188 +100186 +100183 +10011972 +0raziel0 +098765432 +091187 +090885 +09081973 +09071978 +09061969 +090388 +09031995 +09021997 +09021995 +09021968 +090184 +09011994 +09011976 +0831 +0828 +0823 +0822 +0817 +08121994 +08111993 +08101995 +08101972 +080979 +08091995 +080879 +08081993 +08081969 +080783 +08071996 +08071973 +08071971 +080583 +08051995 +08051975 +08041971 +080391 +080387 +08021974 +08021967 +071282 +071187 +071178 +071088 +071076 +07101977 +07101972 +070983 +07091972 +070888 +070883 +07081997 +07081996 +07081995 +07081994 +070590 +070589 +07051974 +07041974 +070383 +06121977 +061092 +061088 +06091978 +060891 +060786 +06071994 +06071971 +060687 +06061970 +060391 +06031979 +060287 +060285 +06021995 +060189 +060179 +06011975 +0520 +0515 +051289 +05121975 +05111976 +05101980 +050886 +050881 +0508 +05071973 +050688 +05061977 +050590 +05052000 +05041997 +05041978 +05041974 +05031997 +05021973 +050186 +041280 +041178 +041087 +041085 +04101974 +040983 +04091977 +040892 +040889 +040884 +040879 +04081995 +040789 +040787 +040681 +04061997 +04061971 +040488 +040476 +04041996 +04041976 +04031998 +0403 +040285 +04021976 +04011978 +0322 +0314 +031291 +031287 +03121976 +031085 +03101973 +03101971 +030882 +03081973 +030785 +030686 +030679 +030482 +030479 +03041974 +030392 +03031972 +030289 +030189 +030185 +03011977 +03011972 +021284 +021191 +02101995 +020973 +020877 +020788 +020787 +02071997 +0207 +020691 +020677 +020486 +020283 +02022000 +02012011 +02011997 +0120 +01121971 +01111994 +010980 +01091972 +0109 +01081963 +01072000 +010679 +01041995 +01041961 +010289 +01021971 +01012012 +0013 +000420 +000333 +.ktymrf +zxcv12 +zx123456789 +ztMFcQ +zonker +zoloft +zoinks +zaratustra +zaragoza +zQjphsyf6ctifgu +z123456789 +yxkck878 +yfnecbr +yes90125 +yeager +ybhdfyf +yasmina +yamamoto +yadayada +xxxxxxxxxx +xpress +xjZNQ5 +xholes +workit +woodruff +womens +woland +wladimir +wizar +wishmaster +wise +wiggly +whippet +whacko +westwest +wessonnn +wesley1 +wer123 +wenef45313 +wawawa +warszawa +warrio +ware +wankers +vw198m2n +vpmfSz +vjzgjxnf +vjhjpjdf +vitaly +viscount +viper2 +vinny +vicki1 +viceroy +vfhnbyb +vfhcbr +vfhbif +vespa +verygoodbot +vertex +vern +verga +vball +vanille +vance +vampiro +valerka +valerie1 +valenti +v123456 +users +united1 +unite +undies +twice +tuscan +turbo2 +tumble +tujazopi +trustnoo +tristan1 +traci +toyot +torsten +torre +torrance +topflite +toonporn +tommyt +tomatoes +tissue +tinytim +timon +tilly +thunder5 +thunder2 +through +theway +theroc +thebeach +thames +testit +testicle +temporal +teeth +tecate +tbirds +tarasov +tallguy +tacotaco +tabbycat +tabby +sylvan +swimmer1 +sweat +surfing1 +supergirl +superd +super2 +summer20 +suffer +sudden +stupi +student1 +stryder +stiff +starling +starfuck +star99 +stanly +stabilo +spooks +splunge +spin +spider12 +spicer +spanked +spacer +soroka +solstice +solnze +soccer9 +soccer3 +snakeeye +smudger +smedley +slither +slick50 +slice +skydog +skully +sixnine +simpson1 +sideout +shooters +shitbird +sherbert +sheppard +shelley1 +sheffield +sheffiel +shaver +sharps +sharkman +shaggy1 +shadowma +sexnow +sexdog +setup +sergik +semenova +sellers +seconds +scythe +screwbal +scratchy +sc00by +savatage +sashimi +sasha2010 +sasha1995 +sartre +sarge1 +santacruz +sandler +samurai1 +sambuca +saltanat +salma +salaam +sakic19 +said +sagitari +sadler +sacramen +saab93 +sPjFeT +rusty123 +rusrap +rusalka +rule +ruff +roxette +ronal +rockys +robo +rival +rings +ringo1 +ridley +richman +ricardo1 +rfnfgekmnf +rfkmrekznjh +rfhfvtkm +rfghbp +revival +response +rescue1 +redbarch +red456 +rebell +ranger21 +rainger +rafiki +radagast +qwer12345 +qweas +qwasz +quickly +quickie +quicken +quercus +queenbee +quake1 +qpwoei +qDaRcv +qCActW +q1w2e +q12345678 +pussypussy +pussylic +puccini +ptktysq +pthrfkj +proceed +pridurok +pounds +pottery +porthos +poppies +popolo +poopface +poonam +pooki +pooker +ponder +polarbear +poiuytr +poiu1234 +poi123 +playgirl +plastic1 +pittsburgh +piter +pinggolf +pillar +pikapp +pieter +pierced +pieces +phobos +peterj +pervert1 +perfume +peniss +peluche +pekpek +paulo +patrycja +patchy +password5 +paska +parallax +paradoxx +pappas +papero +papercli +paol +paloalto +palestine +pajaro +paganini +pKtMxR +ozzman +ownsu +outdoors +ottoman +other +oscar2 +organ +orbit +online1 +omega7 +olorin +olamide +obscure +nurbek +nt5D27 +novice +noonoo +noggin +nitro1 +nikusha +nikitka +nightwolf +nighthawk +nicenice +nfvthkfy +nfbcbz +newpassword +neutrino +netware +natusik +naruto123 +nairobi +myshit +mymymy +mylov +myXworld4 +mutual +muppets +mumbles +mudhoney +mouton +motoko +moosehea +mookie1 +monmouth +monker +mongolia +mommom +mom123 +mmouse +mixer +misha1 +mironova +mireille +minstrel +mindy1 +millenni +millard +milkmilk +milen +mifune +michaelc +michae1 +miata +mexico1 +methodman +meteora +mercury7 +mercure +mercur +mendez +mendel +mellie +meemee +medford +me1234 +maxtor +maxim1935 +matrix3 +matrix2 +mather +masturba +master2 +martins +martel +marle +mark69 +mariachi +marek +manny1 +maniak +maman +maldives +malaika +makeup +makeksa11 +mahalkit +maggie11 +magdalen +mafalda +mackay +m1sf1t +luojianhua +lucylucy +ltleirf +lovesporn +love777 +lotte +loqse +longview +longone +longcut +lonely1 +logitec +logic +lochness +lkjhgfdsaz +lizaliza +lisette +lisbon +liquor +lightsab +lifting +libby1 +levin +lenusik +lenovo +legsex +ledzeppelin +laundry +lasvega +larinso +lalal +ladyluck +lacey1 +labatts +kwan +kokakola +klep +klem1 +kjhgfdsa +kitkit +kissass +kinkos +kindbuds +kimchee +kidder +kennedy1 +kelly2 +kayaker +kayak1 +kato +katmandu +katkat +katja +kath +kaskad +karaganda +kaos +kafka +kUgM7B +justyna +justina +jurgen +june22 +jumpin +julieta +jude +joshua2 +jocker +jesu +jerico +javaman +janell +jamesc +jamesbond007 +jambo +jacky +island1 +ishot +iseedeadpeople +invasion +invalidp +international +integra1 +ingram01 +independ +iluvporn +ilaria +ikaika +igromania +iggy +idontcare +ichbins +ibill +husky1 +hurricanes +hump +house123 +hot +hornyone +hornie +hoppy +hoot +holymoly +holden1 +holbrook +hobiecat +hobby +hjlbyf +hinata +hikari +highball +herrera +heroin +henson +hellothere +helloman +heatwave +heathrow +hbxfhl +hase +harve +hardtime +hardcor +happyme +hanter +hanna1 +handy +hamham +half +hadley +habitat +gusher +guinnes +guinea +gsgba368 +gross +grimes +gretsch +greeting +grave +gracelan +gosia +goodhead +gonzalo +gonzaga +golakers +gojira +gobama +gmctruck +glitch +gladston +gjyxbr +girlz +gimlet +gilgames +giblet +ghostdog +ghost123 +ghjcnj123 +gfdkjdf +getnaked +getlaid +gerasim +geraldine +geoff +generation +gbpacker +gandal +games1 +gallaghe +gaell +g12345 +fx3Tuo +fvthbrf +fuzz +fumanchu +fuente +fuel +fuckyou7 +fuckhard +freeman1 +freelancer +franko +fourth +fordham +foothill +focker +fnord +flynn +flutie +flamenco +fishy1 +fire777 +finished +filler +fierce +ferrets +fernandes +fenerbahce +fedorova +favre +fatty1 +fartface +fairmont +fairfax +fabolous +exit +exercise +excalibe +evets +everything +evening +etvwW4 +eternal1 +estela +ernst +erebus +enemy +elvin +elephan +elefante +edwina +eae21157 +dutchy +dunn +dukedog +ducker +dtlmvf +drexel +drakes +draken +doromich +dont4get +dolomite +dolittle +dmitriev +djhjyf +discgolf +dima2010 +digest +dietrich +dictiona +dickies +dfktyjr +dfcbkmtd +devo2706 +devin1 +denial +dbjktnnf +davidkin +david69 +dauren +darrian +darock +darkknig +dantheman +daniel2 +dallastx +curt +cupid +cubbie +cubase +cthuttdbx +croucher +crapola +cranberr +cowbo +counchac +cottages +corrine +corrina +corey1 +coolkid +coocoo +consul +config +condo +concepts +computador +compound +comcast1 +collier +cochran +cobrajet +cntgfirf +cnhjbntkm +client +clark1 +christen +chrissi +choppy +chimpy +chilton +chile +chiapet +charlie5 +chantell +chBJun +cccp +caspian +casimir +carvin +carnal +carlos2 +canibus +canberra +cambria +calais +cacacaca +cabibble +buzzbuzz +buttons1 +buttlove +bustanut +burunduk +burgundy +bumblebee +bullride +bujhtr +buckwheat +buckskin +buckfast +brooking +brooke1 +brianb +brett1 +brend +braces +boyscout +booze +boost +boome +bonou2 +bonobo +bonk +bonit +bomba +bogus1 +boeing74 +bob1234 +boaz +bmwm3 +bmw325is +bluered +blenheim +blasen +bladerun +blader +biteme2 +birds +birdies +biochem +binky1 +billyd +bikerboy +bigpimpin +bighurt +bigal1 +bibles +bette +bethany1 +belles +beehive +becca1 +beaver1 +beasley +bearshare +beard +bbbbbbbbbb +batboy +bastard1 +bassmast +bashful +bartjek +barely +bannana +baltimore +badkitty +badcat +babs +babe23 +azimut +azathoth +axlrose +atlast +asshole2 +asshat +aspen1 +asd123456 +asbestos +artistic +aron +arkham +areyukesc +archana +apostol +anyway +antonell +antivirus +anti +another1 +annie2 +annalisa +angel11 +anelka +andyman +andree +anabel +amiga1 +amadeo +altoid +alohomora +allthat +alien1 +alex2000 +alesis +aleks +aldric +albatross +alana +akira1 +aikoaiko +adele +abyss +absurd +abcde123 +aaaaaas +aaaaaaaaaaaa +Zaq12wsx +YwVxPZ +XirT2K +WALKER +Veronika +VDLxUC +Type +TOPGUN +SuperManBoy +Subaru +Spirit +Spider1 +Scooby +Samuel +Sabrina +SANDRA +SAMSUNG +Rocky1 +RABBIT +QHXbij +Parker +Pa55w0rd +Orange +NPyxr5 +Ms6NuD +Mike1 +Melissa1 +Maxwell1 +Marathon +Lucifer +London1 +Letmein2 +L8v53x +Kimberly +Jjjjjjj1 +Jennyff +HONDA +HACKERZ +Genesis +Freedom1 +FORD +EwYUZA +EYpHed +Domino +Diesel +Denver +Charles1 +Cccccc1 +Cameron +Bullshit +Bulldog +Brandon1 +Bradley +Bbbbb1 +BOSTON +BIGTITS +Antonio +America +ASDFGH +ABCDEF +9sKw5g +9988aa +996699 +987987987 +98741236 +9119 +8WoMys +8765 +80070633pc +7kbe9D +7862 +77777778 +686xqxfg +666888 +5674 +565hlgqo +55667788 +5525 +543216 +52678677 +5005 +4_LiFe +495rus19 +4815162342lost +4678 +46464646 +4621 +4535 +4430 +440440 +4190 +4053 +3mta3 +3782 +331234 +3311 +314314 +313233 +311291 +311284 +311282 +31121910 +311091 +31101996 +31051973 +31031996 +31031995 +31031972 +301285 +301282 +30121998 +30121974 +30121969 +301085 +301083 +300994 +300991 +30091976 +300887 +300883 +30081992 +30081974 +300792 +30051996 +30051976 +30051969 +300480 +300387 +30011972 +29111995 +29101971 +29101962 +290890 +29081996 +290776 +290680 +290592 +290576 +29051997 +29051971 +29051970 +290482 +29041998 +290379 +29031968 +290288 +29021976 +290191 +290184 +28121973 +28111974 +280992 +280986 +280892 +28081994 +280791 +280790 +280784 +280782 +280781 +280675 +28061979 +280581 +280579 +280578 +28051996 +280486 +28041973 +280377 +280376 +28031996 +280282 +280182 +28011973 +2741001 +271289 +271284 +271183 +271179 +27111994 +27111970 +270981 +270891 +27081974 +27071972 +27071969 +2706 +270387 +2703 +270285 +2702 +270193 +270190 +270186 +27011996 +27011973 +2701 +2662 +261289 +261287 +261285 +261281 +26121975 +26121972 +26121971 +26111993 +26111975 +260991 +260983 +26091976 +26091969 +2609 +26081975 +260687 +260684 +260676 +26061973 +260588 +260583 +260492 +260491 +26041972 +26041971 +260392 +260388 +260382 +260380 +26031997 +26031994 +260192 +26011972 +25262526 +251290 +251288 +251274 +251177 +251078 +250880 +250876 +25081974 +25081972 +25071970 +250693 +250689 +250581 +25052005 +250488 +250477 +25041972 +250389 +25031998 +250289 +25021975 +25021973 +250182 +25011972 +2448 +2447 +241288 +241287 +241077 +24101968 +240989 +240879 +24061974 +240594 +24051966 +240491 +24041969 +240289 +240288 +24021979 +240191 +240178 +240174 +24011973 +23452345 +231278 +23121973 +23101971 +23091976 +230890 +230879 +230857z +23081996 +23081973 +23081969 +23081968 +230787 +230776 +23071968 +230682 +23061974 +23061973 +230580 +23051973 +230482 +230481 +23041971 +230382 +230380 +230276 +230192 +23011973 +23011966 +2275 +2234 +2215 +221279 +221122 +22111972 +221083 +220989 +22091973 +22071974 +22071973 +22061995 +220596 +22051972 +220483 +22041996 +22041969 +22031970 +220285 +220190 +220181 +2130 +211222 +21111969 +21101994 +21101971 +210986 +210975 +210891 +210793 +210791 +210781 +21071971 +210679 +21061970 +21061969 +210581 +210580 +21051998 +21051997 +210379 +210284 +21021975 +21021974 +210192 +210189 +21011996 +210000 +20121995 +201189 +20111994 +20111973 +201084 +20102011 +20101973 +200988 +200983 +20091968 +200884 +200792 +200790 +200783 +200782 +20072008 +20071977 +20061996 +200583 +200579 +20051971 +200389 +200380 +20031971 +200292 +200282 +20021995 +20021969 +200190 +20011967 +1um83z +1qaz2w +1qa2ws3ed4rf +1William +1Summer +1Girls +1Daniel +19966991 +198500 +191292 +19121975 +191182 +19111994 +191087 +19101970 +19091976 +19091974 +190888 +190884 +190784 +19061996 +190590 +190489 +19041996 +19041972 +19031997 +19021973 +18281828 +182182 +181278 +181276 +181190 +18111977 +181077 +180982 +180882 +18081975 +18071973 +18071971 +180684 +180681 +180586 +18051972 +180383 +18031969 +180291 +18021976 +18021975 +18021962 +180190 +180179 +1771 +171291 +171281 +171184 +1711 +17101996 +170993 +17091977 +17091974 +17081995 +17081977 +17081972 +170789 +17061970 +170594 +170587 +17051995 +17051972 +170491 +170483 +170384 +170281 +17021997 +170190 +161283 +161279 +16121973 +16101994 +16101973 +160887 +160880 +160876 +160780 +160776 +16071974 +16071972 +16041998 +160393 +16021979 +16021973 +160189 +160180 +1598741 +151291 +151280 +151278 +15121997 +15121974 +151194 +15111976 +151088 +15091970 +1509 +150683 +150677 +15051997 +150485 +150479 +150373 +15031974 +150287 +150282 +150174 +150000 +1452 +14253 +1422 +141191 +141190 +141189 +141184 +14111978 +14101998 +140978 +140974 +14091972 +140783 +140777 +140692 +14061975 +140593 +140592 +140582 +140575 +14051976 +14051969 +140378 +140181 +140178 +1375 +1355 +131288 +13121996 +13111965 +131082 +130987 +130986 +130880 +130879 +130778 +13071973 +13071963 +130681 +13041972 +13031969 +130283 +130282 +130192 +13011997 +13011963 +1290 +1275 +126126 +125678 +123xxx +123red +123q321 +123as123 +123a321 +123963 +1236987z +12354 +12345zxc +1234576 +123456789f +123456781 +1234565 +12345600 +123123123a +12123 +12121996 +12121968 +121175 +121094 +121092 +121083 +121072 +12101995 +12101973 +12101210 +120990 +12091996 +120866 +12081995 +12081964 +120791 +120661 +12061973 +12061971 +12061963 +120577 +12051973 +12051968 +12041971 +12041967 +120395 +120374 +120370 +120284 +120202 +12011970 +11qq22ww +11qq11 +11c645df +1183 +1179 +117117 +1159 +11235 +1123456 +111181 +111180 +111167 +111087 +11101981 +11091973 +11091970 +110891 +110878 +110788 +11071975 +11061995 +110593 +110577 +110392 +110381 +11031973 +110297 +110277 +110188 +11011969 +11011101 +101283 +101274 +10121997 +101192 +101191 +1010101010 +1010101 +10091974 +100691 +100681 +100679 +10051969 +100495 +100380 +100379 +100290 +10021994 +10021974 +100178 +09877890 +0929 +0927 +091292 +091284 +091282 +09121973 +09121969 +091185 +091080 +09101976 +09101972 +090990 +090980 +090808qwe +09061976 +090589 +090586 +090583 +09051995 +09051993 +0905 +090393 +090386 +09031994 +090288 +081288 +08121993 +08121974 +08111976 +081087 +08091996 +08091974 +080787 +080786 +08061975 +08061974 +08061973 +08051974 +080480 +0804 +080381 +08031972 +080283 +08011995 +08011977 +0801 +0723 +071290 +07111977 +07111974 +07091974 +070890 +070878 +07082000 +070797 +070775 +07071974 +07071973 +07031977 +07011995 +061294 +06111972 +06101967 +060987 +060977 +060897 +060886 +06081997 +06081995 +060693 +06061997 +060481 +06041972 +060390 +060387 +06031976 +06021974 +06021971 +060191 +051285 +051188 +051186 +05111975 +05111974 +05111973 +051083 +051081 +05101974 +05101971 +05091974 +05091973 +05091970 +05081995 +05081973 +050783 +05071975 +05071972 +0507 +05061998 +05061996 +05061995 +05061976 +050591 +050581 +050575 +050477 +05041970 +05031977 +050278 +05011981 +05011965 +04975756 +041281 +041189 +041188 +04101976 +04101973 +040980 +040979 +0409 +04081998 +040791 +04071973 +040687 +04061979 +04061974 +040591 +040590 +040584 +040579 +04051996 +040492 +04041970 +04041969 +040288 +040180 +04011979 +04011976 +04011972 +031180 +031086 +03091974 +0309 +030881 +03081995 +03081976 +030790 +030789 +030590 +030587 +030586 +030577 +03051995 +030484 +030390 +030386 +030384 +03031997 +03031970 +030273 +03021973 +03011994 +03011974 +021188 +021179 +020988 +02061965 +020589 +020586 +020585 +020581 +020580 +02051969 +020490 +020483 +020482 +020481 +020387 +02032007 +02031997 +02031996 +020275 +020187 +0128 +011288 +011287 +01121995 +01121970 +011189 +01111995 +01101994 +01101971 +01101968 +010982 +010979 +01091996 +01091975 +01091966 +010790 +010785 +01071971 +010576 +010574 +01051971 +01051963 +01051960 +010475 +01041960 +010386 +01031971 +01022009 +01020102 +010199 +010163 +010150 +01011951 +000555 +0003 +.adgjm +zsazsa +zidane10 +zeta +zebulon +zazazaza +zaxxon +zambia +yourself +yeehaw +xzibit +xxxsex +xxxman +www111 +wwfwcw +wuschel +wswsws +words +woodsink +woodcock +wolfgar +wolfer +wolf1 +wizz +wire +winni +willo +wildwest +wiggum +where +werty1 +welcome12 +weight +watches +warrant +wanker1 +waddle +vvvbbb +vsevolod +volvos +vivien +vivahate +vitesse +vitara +virgini +viktori +vfylfhbyrf +vfrfrf +vfrcbr +vfhecmrf +veggie +veedub +vecmrf +variety +variant +vanman +valter +uzumaki +utjvtnhbz +uthvfy +upgrade +underwoo +undercover +tycobb +twocats +turismo +tujheirf +tuczno18 +trstno1 +trippy +trinity3 +tribute +tribbles +trevor1 +transformer +tralfaz +touchdown +toucan +torey +toosexy +tonic +tm371855 +tivoli +titanik +tissot +tinhorse +timoxa +timofey +tiktak +tiki +ticker +tibet +tiberium +thuggin +thisis +therat +themaster +test99 +teresita +tequila1 +tennis12 +tekila +technolo +technic +teatime +teamo +taylor2 +tatatata +tassie +tantan +tamika +sylwia +sweet69 +suze +suspect +supra1 +supersex +sunfish +suckthis +studmuff +strutter +stronger +striker1 +stratoca +strat1 +stonewall +sti2000 +steroids +steels +starfury +stamina +stalingrad +squad +spycams +spooky1 +spokane +spinal +sparky12 +spammy +south1 +soulman +soon +solange +snuff +sn00py +smasher +slowly +sloopy +slicker +slava1 +skyhigh +skorpion39 +skiman +skaven +skater1 +skank +siouxsie +simonsay +sieben +shutdown +shots +shooter1 +sheshe +shellie +shelli +shell1 +shay +sharp1 +shanks +shakir +shadow7 +sexybeast +sexmeup +sex12345 +sex1234 +seventee +serpico +seniors +seaton +scoubidou +scotti +scott2 +scotsman +scorch +schumacher +schorsch +scheme +sauber +satsuma +satan66 +sarit +sargon +sardor +sarahb +sanya +sandhya +saltlake +salam +sade +sachas +sabin +saab95 +s456123789 +ryno23 +ryan11 +ruger1 +rubyred +roxane +rossi46 +rosemari +roman222 +roflmao +roflcopter +rodents +rocket88 +rochdale +rjktcj +riot +rimbaud +rfhectkm +rfhbyjxrf +retlaw +retarded +reshma +regular +redtail +redrover +redhook +red5 +recruit +recon1 +rastafari +rashmi +ranma +ranger01 +rally +raintree +raider1 +ragtop +qwqw +qweszxc +qw12qw12 +putz +putnam +pussylip +punky +psswrd +psalm23 +proust +primavera +primaver +prettybo +preston1 +pravda +pound +potomac +portos +pornoman +pornografia +poppen +popmart +pop123 +ponchik +poly +polo1234 +poke +poiu123 +pmdmscts +plop +plenty +plato1 +pirat +pipper +pipopipo +pionex +pinkpuss +pimpshit +picard1 +phillesh +phatass +phantom2 +petey1 +pernille +period +pereira +peartree +pear +patch1 +pass1word +pass11 +pashka +parol123 +pargolf +para +pappa +panocha +oxnard +ownz +overland +ov3aJy +oreooreo +oqglh565 +operatio +onfire +oneill +one4all +omega5 +olimpia +olegoleg +oldtimer +okokokok +nowayout +notyou +notoriou +noshit +nokia8800 +nokia7610 +nokia6120 +nofx +nocode +nitsuj +nite +nisse +nikole +nightman +nicolai +newt +newpoint +nester +nelli +natnat +nameless +mydream +mycroft +mybuddy +mtY3RH +mowerman +mouche +mortar +mort +moroni +morebeer +moomin +mookie12 +monster2 +monkey99 +monger +mondo +monami +mollycat +moises +mmm666 +mitzi +mithril +minimal +minamina +milf +micro1 +mick7278 +michaeld +michael6 +messer +merda +mercurio +mellissa +melissa2 +megapolis +medellin +mckinley +mcbride +mayamaya +matt123 +matt11 +matahari +masyanya +masterca +master69 +master23 +masmas +masher +marylou +martyr +martyn +marmelad +maritza +marias +mariann +marciano +mannie +mandela +management +mamabear +mama12 +maloney +malaya +maksimus +makeme +magnetic +made +maddy1 +maddie1 +mach1 +mace +lyndon +luv2fuck +lucky5 +loveu +lovergir +love77 +lotus7 +loser123 +lorrie +lora +loopy +looploop +loophole +loislane +lobito +liveevil +littleon +littleman +linger +lime +lilkim +lickher +liberte +lewis1 +levelone +leslie1 +lerochka +leipzig +leicester +lehigh +lawton +latter +lasombra +laramie +lambrett +lambada +lakers34 +kzkzkz +kuku +krueger +kramer1 +kornkorn +komarova +kind +kin +killie +khorne +kerri +kenyatta +kenshiro +kendrick +kender +keeley +kayaking +kawasak +katana1 +kassandra +kartal +karman +karens +kamil1 +kali +kakka +kagome +justforfun +june29 +jujitsu +josejose +jordan11 +jonnie +jolie +johnny69 +joWgNx +jlhanes +jimmyg +jimmer +jiggy +jello1 +jeffer +jeepcj5 +jeannine +jazzbass +jason2 +jamielee +jamesr +jaime1 +jacqueline +jacob6 +jackryan +jack22 +jack11 +j12345 +ironroad +insuranc +impossible +imhere +ilovejen +iggypop +idkfa +ideas +ibragim +iamtheone +iaapptfcor +iBxNSM +huston +hungary +humberto +hubby +hubble +house2 +hotbod +hood +honda2 +homer2 +holen1 +holding +holas +hitech +hiram +highwind +hibees +hiawatha +heyjoe +herpes +hellrais +hello5 +healing +heVnm4 +hawking +hawkdog79 +hater +hash +harley12 +hardline +hardin +hardhat +hardcore1 +handbags +halogen +hakkinen +guzzi +guyguy +guyana +gunslinger +guido1 +guards +guadalup +griffins +griffin1 +grenada +greenwood +green7 +grand1 +gowings +gowest +gotit +goomba +googl +goleafs +goldsink +gogirl +godisgood +goddog +goddamn +gjrtvjy +gjhjctyjr +giorgia +giggsy +ghbphfr +ghbdt +gfif1991 +gfhjkmxbr +getbent +gertie +genova +genevieve +genera +geforce +geek +gatto +gasoline +gardiner +gangsta1 +gambino +galactus +gaelle +gadzooks +fylhjvtlf +fwsAdN +froggy1 +friction +freud +freelanc +fraud +francais +forfree +fordtruck +ford9402 +folsom +flushing +florenc +fleury +fkbyf001 +fishbait +fireworks +filters +filipe +file +fiji +fett +ferdinan +fedor +fausto +fQKW5M +f123456 +eyespy +extasy +extacy +explicit +everythi +evertonf +espanol +esmerald +endymion +emotion +emery +elysium +elli +elias +elenka +eldar +eggbert +edward12 +economic +eagles05 +eFYrEG +dynastar +duke3d +duff +drives +drawing +drakula +drakkar +draconis +doyle +downlow +dorina +doober +domani +dolphin2 +dodododo +djohn11 +djhvbrc +dizzy1 +disturbe +diosesamo +dionne +dinesh +dima1997 +diggity +digger1 +digdug +diesel1 +diego1 +dictionary +dickson +dice +dfkthbq +destruct +desoto +denver1 +demigod +demeter +demented +deluge +deltaforce +delasoul +deaddog +dcba +dbrnjhjdyf +dbityrf +davido +dave12 +datalore +datalife +darter +darre +danadana +damon1 +dallas21 +dakot +cyjdsvujljv +cyZKhw +cutie1 +customs +curtain +cumnow +cuddle +cubfan +cruzer +crooked +cresta +creaven +crayola +crawler +costas +corvair +corset +cornet +cordless +copter +copeland +cooley +coolbeans +cookies1 +console +condition +community +comments +comet1 +colole57 +collingw +cokecoke +codydog +cocorico +cocoon +cocodog +cocky +cobaka +cleavage +clayton1 +cigarett +cierra +chunk +chubby1 +chris21 +choco +chiller +chaz +cayuga +catty +catmando +carpenter +carly1 +carla1 +carine +cara +cantrell +candela +camar +californi +caleb1 +cable1 +c7Lrwu +bvgthfnjh +butter1 +burnett +bullitt +buffie +brookie +broke +brendan1 +breakfas +brando1 +brady12 +bozeman +bowling1 +bosto +boscoe +bongbong +boner1 +bojangle +boeder +bobbyd +bobble +bmw330 +bluess +blue77 +blue66 +blue2 +bloom +bladder +blackhol +blackadd +biscayne +birthday299 +birdie1 +birdhouse +bingbong +bimini +bigrob +bignose +bigload +bigdog69 +bigdan +bigboob +berliner +bennyboy +beertje +bebebebe +beaufort +bearshar +beachboy +baxter1 +bastion +bassboat +bassale +bartbart +barne +barkley1 +barkbark +barclays +barbi +balzac +ballpark +balefire +bakugan +bakayaro +bagel +babycat +azbuka +azalea +autobot +austi +asscrack +asdjkl +asdfghjkl123 +asdfasd +asbury +artwork +arthu +artart +arseniy +argentum +arakis +aqua +applemac +apokalipsis +antosha +antoha +anon +andrey123 +andrew2 +ammo +amandine +amalgam +almaz +allstar1 +allanon +alistair +alinochka +alfie1 +alfalf +albundy +alarm +alameda +ajtdmw +airedale +aidana +agency +advantag +admiral1 +actors +access20 +academia +abigai +abcd12 +a1b2c +ZW6sYJ +Wilson +WasHere +WU4EtD +WHDBtP +Vp6y38 +Veronica +TRUSTNO1 +TIFFANY +Svetlana +Sniper +Scorpio +STEVE +SECRET +SCOTT +Ronald +RcLAKi +Rangers +QGuvYT +QAZWSX +Panther +PATRICK +PANTHER +PACKERS +P3e85tr +Norman +NdAswf +NATASHA +Miller1 +MidCon +MeveFalkcakk +MSNxBi +Lincoln +Kirill +Kevin +Kerstin +KAZANTIP +Johnny1 +John1 +Jessie +JONATHAN +JASPER +Impala +HshFD4n279 +HORSES +Guitar +GOLDEN +Florence +FLIGHT +Diamond1 +Dale +DOUGLAS +CaLiGuLa +Bulldogs +Bulldog1 +Buddy +Brooke +Black1 +Bbbbbbb1 +Baxter +AjcuiVd289 +Aalborg +ANGELA +AIRBORNE +9991 +9899 +96321478 +87878787 +794613852 +78963 +7777755102q +7558795 +74185 +741236985 +69dude +640xwfkv +5t6y7u8i +5t4r3e2w1q +5963 +55555q +5440 +5416 +4all +4TLVeD +4DwvJj +492529 +4653 +4570 +4551 +45454 +4411 +4012 +40028922 +38972091 +3809 +3787 +3698 +34524815 +3436 +343104ky +3356 +333z333 +333222111 +3300 +31217221027711 +311269 +31121996 +31121972 +31121970 +31121969 +311084 +310892 +310791 +310786 +31071975 +31071972 +310579 +310382 +310376 +31011996 +31011970 +301281 +301275 +301181 +30111972 +301088 +300989 +300976 +30091996 +300879 +300790 +30071994 +30071974 +3007 +300685 +300679 +30061970 +300576 +300489 +30031970 +300192 +2pac +291287 +291281 +291189 +29111972 +29111966 +291091 +29101997 +290984 +290889 +290887 +29081977 +290779 +29071997 +29071972 +290685 +290679 +29061977 +290591 +290587 +290583 +290580 +29052000 +290485 +290480 +29031972 +29031971 +2903 +29011974 +281281 +2810 +28091970 +280878 +28081977 +28081965 +280785 +28071997 +280682 +280680 +28061995 +28061974 +280575 +28051971 +28051970 +280493 +280484 +280483 +28041970 +28031997 +2803 +280291 +28021966 +280190 +280185 +28011995 +271182 +271085 +271082 +2709 +27081997 +27071971 +27071961 +27061997 +270579 +270495 +270493 +270480 +27041996 +270390 +27031995 +27031975 +270286 +270281 +270192 +270188 +270181 +27011972 +26121976 +26111980 +261086 +261079 +26101976 +26101973 +260zntpc +260990 +26091977 +26091970 +260893 +260679 +26061996 +260582 +26051972 +26051969 +260483 +26041977 +260373 +26021974 +260183 +26011974 +2554 +2531 +2526 +251285 +251275 +251192 +251187 +251178 +25111997 +250985 +25081973 +250781 +250777 +250776 +25061974 +25051971 +250379 +250377 +25031975 +25031973 +250290 +25021970 +25021969 +25012501 +25011998 +25011971 +24PnZ6kc +248248 +24681357 +246800 +2455 +24121995 +24121978 +241187 +241185 +24101975 +240983 +240687 +240681 +24061973 +240578 +24051997 +240395 +240283 +240282 +240281 +240181 +24011971 +24011970 +235235 +2333 +2325 +23121998 +23101999 +230891 +230886 +23081971 +2308 +230778 +230777 +23071997 +230592 +23051974 +230483 +230477 +23041969 +230378 +23031996 +230281 +23021998 +23021968 +23011998 +2221 +22121975 +221179 +221172 +22111980 +22111969 +221082 +220993 +220987 +220985 +220982 +22091996 +22081970 +220780 +22071971 +220676 +220595 +22051975 +220490 +220394 +220380 +22031996 +220282 +220277 +22021969 +220192 +220191 +220189 +220180 +2154 +21312131 +2127 +2112yyz +211294 +211271 +21121995 +21111996 +21111972 +211076 +2109 +210885 +210883 +21081998 +21081997 +210778 +21071969 +210583 +210582 +210577 +210575 +21051978 +210480 +210393 +21031971 +21031966 +210292 +210176 +201284 +20111976 +201078 +200992 +20091972 +200785 +200691 +200681 +200680 +20061975 +200580 +200493 +200486 +200475 +20041974 +200382 +20031997 +200283 +20022004 +200193 +200191 +200186 +20011998 +20011974 +1qwerty1 +1hxboqg2s +1Tigger +1Superma +1Samanth +1Robert +1John +1Horny +1Diamond +1Bubba +19mtpgam19 +19992000 +199000 +198989 +198585 +197222 +1931 +19121996 +19121973 +19111996 +191085 +190989 +190988 +190986 +19081974 +19081973 +190787 +19071969 +19061997 +19061960 +190592 +190589 +190588 +190585 +190578 +190576 +190482 +19031903 +190189 +18121971 +18111972 +18111970 +18101972 +18091974 +18091970 +180874 +18081967 +180785 +180691 +18061971 +1806 +180578 +18051970 +180491 +180489 +18041996 +180382 +18031974 +180278 +18021973 +180189 +18011977 +171290 +171278 +171180 +171179 +17101960 +170988 +17091971 +170885 +170882 +170880 +170793 +170792 +17071971 +170671 +17061997 +17061996 +1706 +170579 +17051971 +17051970 +170482 +17041996 +17041963 +170376 +17031970 +17021973 +170187 +170178 +170173 +17011970 +161278 +16121970 +161186 +161180 +161081 +161077 +16101970 +1610 +160992 +16091997 +16091972 +16081997 +16071973 +160595 +160577 +16051973 +160489 +160483 +16041968 +16031969 +160294 +160287 +160280 +16021998 +16021965 +160179 +1601 +15995 +159753159753 +151617 +15121970 +15121965 +15111973 +151090 +151085 +15101966 +150982 +15091997 +15091972 +150881 +15081970 +150791 +15071979 +15071968 +150694 +150679 +1506 +150578 +150575 +150393 +150378 +15022000 +15021970 +150193 +15011970 +1445 +14344 +1433 +1424 +1418 +141284 +141277 +14101978 +14091997 +14091976 +140885 +140884 +140790 +140583 +140570 +140569 +14051974 +14041973 +14041968 +140391 +140359 +14031995 +14031976 +14031975 +1403 +140281 +140193 +1362 +13579a +1357900 +1333 +1326 +131284 +131278 +13121977 +13121972 +13121971 +13121970 +131184 +131183 +13091977 +13071998 +130679 +130578 +13051997 +13051979 +13051968 +130478 +13041996 +130389 +130380 +13031972 +13031968 +130280 +13021971 +13021302 +130185 +130171 +12pack +1265 +123zxc123 +123654q +123654a +12345b +1234567t +123456789qw +12345678987654321 +123147 +1212qq +121276 +12121963 +121194 +12111997 +12111995 +121098 +121068 +12101972 +120895 +120877 +12081997 +12081973 +12081971 +12071971 +120672 +120596 +120570 +120569 +120555 +120470 +120383 +120375 +12031997 +12031972 +12031971 +120286 +120191 +120177 +120176 +11bravo +1173 +1151 +11251125 +111279 +11121994 +11111111a +111090 +111080 +111078 +11102000 +110886 +11081972 +11081969 +110781 +110776 +110694 +110598 +110594 +110592 +11041995 +110378 +110376 +110294 +110275 +110181 +11011997 +11011995 +1071 +10251025 +101974 +10191019 +101284 +101272 +101183 +10111213 +10101997 +10101971 +10091967 +100892 +10081996 +100793 +10071007 +100695 +100689 +100682 +100674 +10061999 +10061995 +10061976 +10061966 +100588 +10051972 +10051970 +100491 +100482 +100377 +10031997 +10031970 +100291 +100283 +10021959 +100191 +100180 +100174 +100172 +10011968 +10001000 +0okm9ijn +0928 +091283 +091277 +09111978 +091088 +091084 +09101969 +09091970 +09081995 +090790 +09071972 +090687 +090686 +090578 +090487 +09041996 +0903 +09021972 +0902 +09011997 +0813 +081284 +081280 +08101994 +080986 +080898 +08081971 +08061996 +080590 +080578 +08051972 +080484 +08041972 +080388 +08031996 +08031974 +08031963 +08021977 +08021975 +08021970 +0722 +071287 +071188 +07111995 +071086 +07101973 +07091978 +070882 +070881 +07081969 +070779 +07051997 +07051995 +07051975 +07051961 +070492 +070487 +070486 +070385 +07031997 +07031976 +070290 +06225930 +0614 +061293 +061291 +061285 +06111977 +06111970 +061086 +061077 +06101981 +060981 +06091969 +06081998 +060787 +060785 +060779 +06071974 +060666 +06061971 +06061966 +060590 +060588 +060388 +060288 +060183 +06011973 +0587 +0518 +051290 +051282 +051272 +05121994 +05121974 +05111995 +05111970 +05101996 +050983 +050884 +05081997 +05081967 +050790 +050787 +050781 +05071996 +050687 +050587 +050577 +05051970 +050487 +050478 +05031973 +05031972 +050285 +050282 +0429 +04121970 +04111975 +041092 +041076 +04091972 +040880 +04081973 +04081967 +040689 +04061998 +04051972 +040474 +04041972 +040388 +040382 +04031974 +04031972 +04021999 +04021975 +040182 +04011994 +0326 +0318 +031187 +03111972 +031084 +031080 +03101970 +030986 +03091997 +03091972 +03091971 +030891 +030887 +030872 +03081971 +030792 +030681 +03061974 +030585 +030486 +030485 +030483 +030387 +030380 +030379 +03031963 +03021975 +030201 +030191 +030188 +030184 +03011996 +03011960 +0291 +0225 +02121997 +021183 +021182 +02111994 +021085 +02091968 +0209 +02081996 +020785 +020690 +020685 +020681 +02061996 +020496 +020488 +020487 +020392 +02032000 +02031967 +020289 +020278 +020276 +02021998 +011290 +011289 +011180 +01111971 +01111969 +011085 +011083 +010987 +01092009 +010889 +010887 +01081998 +01081976 +010783 +01071963 +010694 +010691 +010681 +01061996 +01061972 +010591 +010590 +010585 +01051973 +010491 +01041999 +010391 +01032011 +01032010 +01032009 +010277 +01021997 +010165 +010161 +01012004 +01011954 +01011952 +01011901 +0071 +006969 +00197400 +00001 +******* +zxcvfdsa +zxcvbnm. +zorros +znbvjd +zipzip +zenit2011 +zara +zaqqaz +zagreb +younger +yojimbo +yfgjktjy +yessss +yeah11 +yank +xzsawq21 +xyzxyz +xakepy +wwwwwwwwww +wp2005 +wolf69 +wojtek +william3 +wiener +wichita +whyme +whattheh +westwing +werwolf +weldon +webster1 +wayland +waste +washing +warwar +waQW3p +w8gkz2x1 +vwjetta +vovchik +volt +viviane +vitoria +vision1 +vfvektxrf +vfhrbpf +vetteman +verde +vega +vbnvbn +variable +v12345 +usmc69 +uruguay +unity +uniform +unforgiven +tyrik123 +twotwo +twitch +twinz +twinky +tvxtjk7r +trunk +trump +trinit +trainman +trading +townsend +totalwar +torrie +torben +topdevice +tomat +toenail +tk421 +titotito +tink +tingting +tinfloor +timofei +timeline +tijger +tiffani +tickleme +thermo +thegame1 +tensor +teddys +teardrop +teachers +tazzie +tasmania +tascam +target1 +tanzania +tallyho +tally +talley +talker +takagi +taboo +tAMwsN3sja +t3fkVKMJ +syphon +syntax +swerve +sweetp +sweetgirl +sureshot +superpuper +supermen +supermar +supercar +suntan +summer10 +sukasuka +sugarbear +suffolk +stunt +stuff1 +students +strapon +stiffler +steve69 +starry +sseexx +squid1 +squeek +spots3 +speeding +specials +spear +sparticu +spankit +spaces +sonic123 +sonali +sometimes +soldiers +solar1 +soccer4 +soccer17 +snorkel +snipes +smurfy +smiley1 +slutslut +slk230 +slime +slaye +sky123 +skoal1 +sivart +sitting +sister1 +sirena +sigmund +sid123 +sicnarf +siamese +shotguns +shortsto +shitass +sherif +shea +sharing +shaitan +shadow1212 +sexylegs +sexisfun +seventh +servant +sergeevna +serg +serenade +serafim +senna1 +seminoles +seed +section8 +searock6 +scull +scubapro +screws +screech +scotty1 +score1 +scipio +scarface1 +scar +satoshi +sass +sasha2 +sasha12 +sanpedro +sangria +sandor +sandbox +samsung123 +sams +salt55 +saints1 +saba +ryan1 +rutland +rulezzz +rulesyou +rtynfdh +royston +roxbury +rowdy1 +rotterdam +rosemarie +rolex1 +rola +rodolfo +rockfish +robert3 +rjpzdrf +ripoff +ringring +rincewind +right1 +riggs +rhjirf +rfpfym +retro +required +replica +replace +renton +redstone +redroses +redknapp +redfred +redeemed +redcloud +raygun +ravi +randi +radost +qzwxecrv +qwertyuiop123 +qwertyu8 +qwerty666 +qwerty10 +qwe123rty +qw12qw +qsefth +qsawbbs +qazedctgb +qaswed +qRHMiS +q111111 +pyF8aH +putang +purzel +puertorico +ptybnxtvgbjy +psycho1 +pseudo +prono1 +profesor +probert +priority +pppppppppp +potatoe +porpoise +popol +pomona +pollo +pollit +pokesmot +poet +plazma +playaz +plate +pitufo +pittsbur +pioneers +pimmel +pilar +piggys +pi3141 +phone1 +philmont +phase1 +pharoh +pfeiffer +petros +petro +permit +perky +pepperoni +pepepe +pennies +penalty +pegleg +peedee +pavell +paulina1 +paste +pasta1 +password23 +password13 +passio +pass69 +parol999 +parker12 +paris123 +pariah +papi +pablos +p4ssword +p4ss +overture +overdose +ou8124me +ostrov +oshkosh +osborn +origami +orange3 +opie +onlyyou +oneday +omegaman +oldsmobi +olddog +ogre +oakridge +nurik +number7 +number5 +nowwowtg +novembe +nottingh +notime +norcal +nora +nopasswo +noone +noncapa0 +nolimit5 +noaccess +nitehawk +ninnin +nikanika +nfnfhby +nesterov +negril +nbViBt +naughtyboy +nascar20 +nantes +nando +namibia +nagual +myopia +my3girls +my2kids +mutt +musique +musics +munchies +muhtar +muffie +muerte +mtndew +mrbungle +mrbean +mopars +moosie +monkey22 +money7 +money01 +mist +mimoza +milosc +milomilo +millers +milehigh +mikel +mike77 +mighty1 +midnight1 +midnigh +miche +michael5 +merle +merde +medvedev +mcmahon +mckinney +maynard1 +matt1234 +matt1 +mastiff +masterch +masha123 +mash +martini1 +marlena +marked +mariajos +marce +maples +manyak +manpower +manic +managua +mamulya +majors +majesty +maitre +maitai +maine1 +magi +maggiema +madison2 +maddog1 +macsan26 +mac123 +m1911a1 +m0rn3 +lyndsay +lurch +luntik +lunker +lunita +ludovic +luckycat +lover2 +lostlove +lopas123 +logistic +litter +lilleke +lightsaber +lietuva +lhbjkjubz2957704 +letmein9 +letitia +lefthand +lecture +leapfrog +lbyfhf +lawrun +lavinia +laura123 +latoya +larryb +lament +kzueirf +kroger +koshechka +komatsu +kolya +kola +kokanee +klop +kjkbnf +kitt +kishore +kingsx +king1234 +kimiko +kimberl +killerbe +killabee +killa1 +kiefer +keno +kenney +kendal +kelsey1 +keifer +kbnthfnehf +kbcbxrf +kaycee +kavitha +kavita +katze +katt +karolina1 +karma1 +karamel +kannan +kamasutr +kalinka +kalel +kalani +kaffee +k9dls02a +junkjunk +junejune +juillet +juicey +juehtw +joy123 +joojoo +jonny5 +joker123 +join +johnso +joesakic +jodie +jobsearc +jman +jimmyb +jimjam +jiminy +jesus12 +jerusale +jeffre +jeep95 +jasonm +janitor +james7 +james69 +james01 +jame +jalal123 +jagua +jada +jack01 +iwantit +ivory +italy1 +irvin +irondoor +invisible +inuyash +integer +inspire +inspecto +innow +inkognito +initial +inhouse +ingeborg +informat +inessa +imhotep +ilovelife +ignatz +ichigo +iamhappy +i62GBQ +hyper1 +hutchins +hundred +howling +hornydog +horne +hopehope +hooch1 +hondo1 +homegrow +homedepo +holy +holler +hogs +hoagie +hiphop1 +himmel +hideaway +herpderp +hemi +heman +hello99 +hedimaptfcor +heaven1 +headcase +hazel1 +hayastan +hass +harlow +hardman +happyone +happy12 +hapkido +hamsters +halo123 +hackman +habs +guzman +gunn +gulmira +gtivr6 +gsxr +grunts +grouper +grizzly1 +gripper +greggy +greener +greendog +green99 +greats +granted +grandad +grades +gotti +gordie +golfers +golf11 +gogiants +godzila +godisgoo +goddess1 +gobuffs +gobbler +global1 +glide +gjvbljh +ginger11 +ghhh47hj764 +gfyfcjybr +getpaid +gethigh +gestapo +gerry1 +geniusnet +genie +gena +geelong +geegee +gaurav +gauntlet +garand +gaines +g00gle +fudge1 +fuckyou69 +fucktheworld +friskie +friedman +frida +frfltvbz +freya +freestuff +freemail +freddy12 +freddd +frank2 +fractal +forster +footer +foggy +flyer1 +flotsam +flawless +fktyjxrf +firetruck +firestarter +fire911 +finch +fifth +fetch +fellini +feelme +fastfood +farkle +fantomen +fanfan +fallout2 +fake +fabiana +extreme1 +executiv +excellent +evermore +euskadi +euro +etower +esposito +erbol +enter2 +emiliano +emanuela +email +elizabeth1 +elfstone +el546218 +eden +ecstacy +echoecho +eatcum +eagle5 +eagle123 +ePWR49 +dvorak +dusty197 +durant +duran +dumbass1 +duke11 +dudelove +ducky1 +dually +drunk1 +dropzone +drivers +dreyfus +drexler +drake1 +dragula +dragon5 +dragon0 +dragnet +dragan +draft +dover1 +dora +domin +dollie +dogsdogs +dogday +docker +dnstuff +dlanod +djkrjlfd +djghjc +djembe +dirtyd +dinkle +dima2000 +dima12345 +diggers +dfkmrbhbz +denisov +denis1 +demand +deltaone +delta4 +delta2 +delrio +delicious +dekker +deadwood +de7MDF +davion +davidlee +daveyboy +davex +dastan +daryl +danny2 +dali +daimler +daddie +cyberman +cvbncvbn +cuntcunt +cubby +crippler +cricke +creosote +crasher +crafts +crab +courtney1 +counting +cougar1 +cossie +cosmopolitan +corpsman +corbett +copy +cookie59 +convict +convert +conrail +conehead +collar +coleslaw +codeman +cockring +clubpenguin +clarice +civics +cinzia +chutney +chrissie +chris69 +chris11 +chicubs +chica +chessmaster +cheri +cheerio +chazz +chaton +charmin +charlieb +charlie9 +charlie4 +chaka +cfrehf +cfdtkbq +celtic88 +celestin +cegthgfhjkm +cecelia +cbcmrb +caveman1 +catsdogs +cat222 +castello +casper2 +carte +carla10 +care +cardigan +caramelo +cannes +candybar +camelia +camcam +calvi +callan +byajhvfnbrf +bvcxz +buttface +burnside +bucky1 +brush +bruckner +bruce2 +browns1 +brittan +brendon +brehznev +bree +branson +brahms +bowhunte +bowers +boutit +boston12 +bootcamp +bmw520 +bmw323 +blueduck +blueballs +blitz1 +blanc +blackmen +bittle +bingo123 +bilder +biking +bigtitts +bigten +bigpig +bigman2 +bigfun +bigdic +bier +bhbyf +beulah +berezuckiy +berber +berbatov +benhur +beefy +beauty1 +beatri +bcnjhbz +bayadera +baum +batman01 +batavia +bassman1 +bassingw +barty +barrys +bandaid +bancroft +banana12 +bamba +baltic +ballball +bakabaka +bailey12 +backpack +backhoe +babble +b1afra +azertyu +axolotl +awatar +avilla +atkins +atilla +atheist +asterix1 +aster +asdf1 +artman +art123 +arroyo +arriva +arnhem +ariel1 +arcturus +archibald +aprils +april17 +applesauce +apache1 +antiques +anthea +annelies +aniston +angelo4ek +angel777 +angel22 +angel01 +amsterdam1 +amina +amekpass +alvarado +alternative +already +alphonse +alona +alizee +aliyah +alisa1 +alex2112 +alessandra +albacore +ahfywbz +aguilar +aggie1 +aerial +addams +accident +acces +academic +abercrom +abcdefghij +abcdef123 +abc456 +abarth +aabbccdd +a123 +Zzzzzzz1 +Yyyyyyy1 +Yellow1 +Xxxxx1 +Winter +WINNER +Vincent +Viking +TENNIS +Stephani +Stefan +Starbuck +Spartak +Sommer +Simpson +Shock123 +Sherlock +Scooter1 +STARTREK +Rosebud +Riverside +Rattolo58 +Rangers1 +Qw123456 +PtBDHW +Pookie +Please1 +Patches +POOKIE +POLICE +PHOENIX +OU812 +Nirvana +Muffin +Moscow +Monster1 +Microsoft +Merlin1 +Mercury +Madonna +MATrix +Leonardo +Kramer +KQiGB7 +Jupiter +Jjjjj1 +Iiiii1 +Houston +Gggggg1 +Ggggg1 +General +GbHcF2 +Fuckme +Fucker1 +Family +FALCON +EXPLORER +Dunce1 +Dolphin1 +Ddddddd1 +DAVID +DANIELLE +D9uNgL +D9ebk7 +Cookie +Carolina +Carmen +COMPUTER +Buffalo +Bruce +Broncos +Biteme1 +Bigdog1 +Beavis +BIGMAN +ArwPLS4U +Arizona +Anthony1 +Angelina +Amanda1 +Alfred +Aleksandr +Adgjmptw +Access1 +AMERICA +99941 +998899 +975310 +97531 +911911911 +8letters +87654 +8318131 +7xM5RQ +7seven +7f4df451 +7894561 +778811 +7666 +7447 +72D5tn +711711 +666000 +6591 +6275 +556655 +555551 +5552555 +5433 +54321q +5369 +5366 +526452 +51842543 +4893 +4815162342a +481516234 +481516 +4578 +4566 +4500455 +4444444444 +4416 +427cobra +42069 +4118 +369147 +3666 +34533453 +33ds5x +332332 +3313 +3133 +311289 +311277 +31121975 +31121973 +310792 +31071974 +31071971 +310583 +310574 +31051971 +310391 +310384 +31031969 +310192 +310177 +31011997 +31011972 +31011967 +301289 +301279 +30121994 +301194 +301189 +301178 +300985 +300984 +300980 +300786 +300781 +30071975 +300683 +30061972 +300595 +300481 +30041997 +30041996 +300393 +300381 +30031998 +30031978 +2wsx1qaz +2kasH6Zq +291280 +29111975 +29111971 +291088 +29101974 +290976 +29091998 +29091973 +290879 +2908 +290686 +29061997 +290582 +29041969 +29041968 +290284 +29021972 +290189 +290183 +29011973 +281291 +281285 +281280 +28111961 +280974 +28091974 +28091972 +280891 +280887 +280883 +2808 +280792 +280787 +28071969 +280679 +280677 +28061977 +28061972 +280591 +280583 +280577 +280485 +28041974 +280281 +280186 +28011997 +28011971 +2747 +272829 +271294 +271291 +27121970 +27101971 +270996 +27091976 +27091975 +270881 +27081973 +27071967 +270696 +27061972 +270594 +270590 +27051970 +27051961 +27051960 +270491 +27041973 +27041972 +27041965 +270392 +270279 +27021997 +27021970 +27021967 +270185 +27011970 +27011967 +2612 +261193 +261177 +26111997 +26111972 +26091975 +260884 +260781 +26071969 +2607 +260692 +260670 +26061972 +260591 +26051996 +26051968 +260485 +26041974 +26031975 +260284 +26021971 +26021970 +260193 +260186 +26011996 +26011966 +2582 +251279 +251096 +251095 +251093 +251079 +25101972 +25091971 +25081970 +25081962 +250782 +25071997 +25071977 +25071972 +250682 +25061996 +25061971 +250580 +250576 +250491 +25041975 +25031968 +250284 +250192 +250175 +25011996 +2423 +24121996 +24121974 +241177 +24111973 +24101996 +240987 +240894 +240893 +240892 +240873 +24081971 +240785 +240775 +24071996 +24061967 +24051973 +240493 +24041973 +240381 +240379 +240378 +240293 +24021995 +24021973 +24021972 +24011997 +24011972 +24011968 +234523 +2327 +231295 +231283 +231279 +231231 +23121996 +23101996 +23101972 +230983 +23091971 +23091969 +230876 +23081993 +230772 +2307 +230677 +230392 +230379 +23031971 +230193 +230183 +23011969 +2300 +2262 +2245 +221992 +221290 +22121974 +22121962 +221187 +221096 +220994 +220981 +22091976 +220877 +220792 +220779 +220778 +220776 +22061971 +220582 +220580 +220493 +220381 +220376 +22031975 +220179 +21crack +215487 +2142 +2131 +211290 +21121998 +211200 +211178 +211093 +211091 +21101972 +210795 +210785 +210784 +210780 +21071996 +210674 +21051974 +210494 +210396 +21031996 +21031976 +21031974 +21031973 +21031970 +210293 +210281 +21021998 +21021973 +2022 +201290 +201280 +201279 +20121972 +20111971 +201092 +201076 +200793 +200768 +20071971 +20071968 +200692 +2004rj +20042000 +200375 +20031969 +200281 +200272 +20021975 +20011971 +20011969 +1qazwsx +1jesus +1grand +1Zzzzz +1Taylor +1Johnny +1James +1Iiiii +1Hunter +1Bigdog +1Bear +1Andrew +1Aaaaaaa +1999ar +198484 +197373 +197272 +1916 +191279 +191184 +19111997 +19101971 +19091973 +190885 +19081997 +19081970 +190690 +190583 +190581 +19051972 +19051905 +190485 +19021970 +1861 +1822 +181275 +18121968 +181209 +181189 +181084 +181083 +181082 +181079 +180984 +180981 +18091969 +18081969 +180780 +18071995 +180592 +180582 +180579 +180560 +18051973 +180492 +180487 +180472 +18041997 +18041971 +18041966 +180392 +180389 +18031966 +180280 +18021971 +18021966 +1775 +17121970 +171193 +17111972 +17111967 +171079 +17101977 +17101973 +17101970 +170990 +170987 +170895 +170886 +170883 +170780 +170779 +170690 +170681 +170672 +17061975 +17061974 +170577 +170493 +170477 +170472 +170380 +17031996 +17031976 +170293 +170292 +170286 +170285 +17021966 +170194 +16121995 +16121974 +161193 +161181 +161177 +16111972 +16101996 +160990 +160982 +160978 +16091973 +160874 +160787 +16071970 +16061973 +16061966 +160580 +160478 +16041970 +160390 +16031972 +16021996 +16021974 +160192 +16011998 +16011975 +16011970 +15975346 +159123 +156156 +152152 +151276 +15121972 +15121971 +151178 +151176 +15111977 +15101970 +150979 +150976 +150895 +150882 +150879 +150777 +150667 +15061971 +150594 +150581 +15051972 +150493 +15041967 +15031997 +150279 +15021968 +150175 +15011996 +14938685 +14781478 +1471 +1458 +144000 +141291 +14121995 +14101974 +14101968 +140993 +14091975 +14091969 +14091964 +140894 +140888 +140880 +14081998 +14081972 +14061971 +14061963 +140581 +140576 +140573 +14051997 +140493 +14041971 +140380 +14031968 +14021965 +133159 +1327 +1313666 +13121995 +131078 +13101996 +13101971 +130983 +13091995 +130878 +130870 +130777 +13071975 +13071969 +130677 +130575 +13051973 +13051972 +13051970 +130491 +130482 +13041973 +13041964 +130382 +130381 +13031996 +13031965 +130290 +13021976 +12901290 +1257 +125478 +1244 +12435687 +123QWEasd +123777 +123645 +12356 +1234asd +1234QWER +12345x +12345n +123456789zxc +1234567890w +1234567890qwe +123456780 +123455432 +123452000 +12332145 +123159 +123121 +121980 +121295 +12121971 +12121966 +12111999 +1211123a +12102000 +120982 +120892 +120871 +12081965 +120770 +12072000 +120582 +12051963 +12051962 +12051205 +120495 +120481 +120471 +12041969 +12031969 +120279 +12021966 +12021202 +120181 +120180 +120178 +120175 +119911 +1198 +1180 +111678 +111287 +111265 +111222333a +11121971 +111175 +11101969 +110992 +110976 +11091971 +110679 +110579 +11052000 +110485 +110478 +110389 +110379 +11031976 +110276 +110189 +10inch +1089 +1084 +1068 +1064 +1062 +1055 +10112000 +10111996 +10111972 +10111970 +10111011 +101096 +101074 +101070 +10101973 +100992 +10091997 +100885 +100875 +10081970 +10071969 +10061975 +100596 +100589 +100575 +10031962 +10021970 +10011963 +10011962 +0range +0p9o8i7u +0930 +0923 +0917 +091289 +091287 +09121994 +09121978 +09111975 +091091 +091087 +090974 +090881 +09071977 +0907 +090681 +090588 +090584 +090575 +09051974 +09051969 +090490 +090384 +09031996 +09021996 +09021974 +09011974 +09011973 +081283 +08121995 +08121971 +081177 +08111975 +08111973 +081080 +08101973 +08101970 +08091975 +08071997 +08071976 +08071968 +08061970 +080581 +080571 +080287 +08021979 +080185 +08011975 +0776 +0719 +071286 +071285 +071281 +07121995 +07121973 +071185 +071179 +071083 +070982 +070980 +07091999 +07091975 +07091971 +0709 +070793 +070789 +07071967 +070687 +070683 +0706 +070580 +070489 +070389 +070288 +070286 +070285 +07011972 +0701 +06121973 +061191 +061187 +061180 +06111973 +061083 +061081 +06101974 +060989 +060985 +060979 +06091996 +060890 +060887 +060877 +06081994 +06081974 +060795 +06071970 +060696 +060683 +060676 +060644 +06061998 +06060 +060581 +06051973 +060492 +06041994 +06041973 +060384 +06031996 +06021973 +06021968 +060186 +060184 +0531 +051291 +051278 +05121995 +051182 +051178 +051077 +050979 +05091975 +050877 +050789 +050685 +050676 +05061972 +050595 +050572 +050490 +050483 +05031975 +05031971 +050297 +05021999 +05021995 +05021972 +050187 +05011998 +0501 +0426 +0421 +0418 +041283 +04121997 +041190 +041185 +041183 +04111976 +041086 +040975 +04091973 +04081972 +04081970 +0408 +040788 +040781 +04071971 +04071970 +040690 +04061970 +04051970 +0405 +040479 +040478 +040477 +04041998 +04041997 +040391 +04021969 +040171 +0327 +03121971 +031188 +03111995 +031088 +031082 +030983 +030977 +030885 +030879 +03081997 +030788 +030781 +030780 +030779 +03071998 +03061997 +03061972 +030594 +030581 +030579 +03041971 +03031966 +030290 +030286 +03021997 +03011975 +03011969 +0227 +0222 +0221 +0219 +0216 +021279 +021278 +02121972 +02121971 +021186 +021090 +020984 +020982 +020894 +020880 +02071995 +020478 +02041969 +020385 +020382 +020294 +020281 +02021964 +011283 +011282 +011194 +011182 +01112000 +01111996 +01111962 +0111 +011090 +01101959 +010895 +01081967 +010685 +010678 +01061967 +010588 +010582 +01051997 +01051964 +010494 +01041996 +01041966 +010387 +010377 +01031973 +010295 +010281 +01012003 +01012002 +01011953 +01011911 +010110 +007jr +zzr1100 +zxGdqn +zorba +zombie1 +zmxncbv +zaq11qaz +zaebali +zackary +z1z2z3 +z1234567 +yuo67 +yippee +yhWnQc +yfcnzyfcnz +yfcnz123 +yanshi1982 +yankeemp +yakman +yJa3vo +xtvgbjy +xthysq +xenocide +wsxwsx +wow123 +wooddoor +wong +wolfram +winter11 +winter01 +willia1 +wiley +wildside +wild1 +whittier +whip +werthvfy +werthrf +welcome8 +wedgie +websters +weather1 +watchdog +warrior2 +warchild +war3demo +vovochka +vovavova +voodoo2 +volgograd +vlad1998 +vlad1995 +vixens +vitae +virgins +viktoriy +viktorija +victim +vgfun4 +vettes +vero +vaz2106 +vanquish +valjean +valheru +valeriy +utah +usmcusmc +user1 +urban +unlimite +undergro +ultra1 +uiegu451 +twisted1 +twain +turtoise +turkey1 +tuktuk +travolta +travi +trapdoor +trademan +tracker1 +tower1 +tort02 +tornike +tornado1 +topgun1 +toots +tony123 +tonedup +tommi +timmer +timber1 +tiger99 +tifosi +thunder7 +threesome +threat +thief +theron +thered +thedevil +thankgod +texmex +tempGod +tellme +tbones +tbilisi +taz123 +tayson +tayler +tauchen +tattoos +tatooine +tate +tamia1 +taliesin +taker +taka +tacos +tUSymo +sylvia1 +sweethear +swampfox +sveta123 +suzanna +surreal +surfboar +supertra +superman2 +superbad +sunnysid +sunnyboy +summer2 +sumatra +suckmeoff +succubus +sturgeon +stuntman +studley +strumpf +strippers +strike1 +strider1 +strauss +stratton +strand +stores +stjames +steelman +stavros +stasya +stargazer +stardog +stanle +standart +squadron +springfield +spring99 +spray +spotter +splooge +splat +sperry +spelling +speeder +spector +spatula +spankey +spacebar +sophie12 +sony1234 +sonnen +sonia1 +sondra +sock +sociald +soccer99 +soccer20 +soccer16 +socball +sobeit +snooper +snoop1 +snook +sneak +snakey +snaker +slowpoke +slippers +slage33 +skimmer +sinead +silvestr +silverst +silver7 +silky1 +silencer +sidorova +shortie +shore +shitball +shirt +shilpa +shearer9 +shayshay +shanice +shammy +shame +shaheen +seymore +sexy11 +sexxes +sexosexo +sevastopol +sessions +serval +septembr +seiko +seasons +seaking +scholar +schnecke +schmoe +scared +sc0tland +sangeeta +sandokan +samual +sample +sally123 +sales1 +salama +sachem +sabre1 +s4114d +ryder +rustys +rude +rubens +rrrrrrrrrr +rowland +rounders +rosebuds +rosari +room112 +romeos +rogues +rogue2 +roger123 +rocky6 +rocky3 +rocko +rock1 +robrob +roadstar +rjpthju +rivaldo +rimjob +rileydog +rihanna +rider1 +richrich +richer +rfj422 +rfcgth +renoir +rennie +renard +religion +reliance +reggie1 +reese1 +redsky +redmoon +redfire +reddy +red1 +red +reba +realty +readme +razors +razor1 +rawiswar +raven123 +ratrace +rangers9 +ranger11 +rancher +ramram +rajeev +rahrah +radiance +racecars +qzwxec +qwertyu1 +qwerty88 +qwerty111 +qwerta +quicksil +quagmire +qazx +q1w2e3r4t5y6u7i8 +putas +putaria +pussyy +pussylick +pusser +puckpuck +psylocke +providen +prostock +prometheus +principa +primax +prettyboy +prentice +pounce +pot420 +portsmou +porn1 +popov +popimp +poopers +pontoon +pololo +poll +plumber1 +plucky +playa1 +planters +planets +pizza123 +pitbul +pipipi +pink123 +pingzing +pimps +pimpi +piligrim +pikachu1 +pigtails +piehonkii +phish420 +philly1 +pfhfpf +peternor +perrier +performa +peppy +pepper123 +pepita +pentium1 +pearce +peapod +pdtpljxrf +pavlenko +pavel1 +paulaner +paul1234 +pattern +patrick8 +pastel +password00 +pass2 +pasha123 +pascha +pasca +partytim +parachut +pantry +panther2 +ozzyozzy +owens +oscardog +orbita +opopop11 +openwide +oooooooooo +onlyOne4 +omgomg +ololo +olegnaruto +ole4ka +oldspice +oldschoo +octane +obsolete +oakland1 +nutty +nurgle +numberon +nuke +nuJBhc +nremtp +novembre +nougat +norcross +nononono +nokia5228 +noise +nofxnofx +noble +nnssnn +nivram +nikolaj +nikki2 +newzealand +newman1 +newhaven +neverland +neverdie +nevaeh +netzwerk +netvideo +netgear +neruda +neenee +necromancer +nazira +navyblue +navidad +natedawg +natanata +nastja +nascar2 +narayan +nabokov +myword +mustang4 +mummy1 +multi +mulch +muirhead +mrskin +mossimo +moremoney +moose123 +moonunit +monorail +monolit +monkey5 +monkey3 +monkey21 +monkey01 +moneymak +money4me +monamour +monaliza +momma +mojoman +mojo69 +modified +modesto +mizredhe +mission1 +missed +mirjam +mircea +minus +minou +minimini +minette +milkshak +mikola +mike2 +michael0 +micah +metro2033 +mesa +merc +ment +melodie +megat +meditate +media1 +mechanical +md2020 +mcgregor +mcgrath +matthieu +matthew9 +masterof +mastercard +master3 +masonry +martyna +martin7 +martesana +marlbor +markova +marit +mario123 +marilyn1 +marija +maricela +margo1 +marge +manics +mangas +mana +malkav +malboro +malawi +mako +maintain +magnat +magna +maggy +maduro +madri +madera +madeleine +mackdadd +lyndsey +luvpussy +luisito +lsdlsd12 +lovelov +loveislife +loveable +love33 +love2000 +lost4815162342 +longwood +longlife +longball +lombardi +logos +loading +lkjlkj +lipinski +lines +lilia +lildevil +lennie +lekbyxxx +lefty1 +lawnboy +lastone +laputaxx +lalo +lakers8 +ladyffesta +lacy +ktyxbr +ktyecbr +ktutylf +kstate +krazy +kovalev +kotopes +kondor +knuckle +knobby +knob +kjiflrf +kitsune +kiran +kinetic +kimber45 +kimba +kim123 +killians +killer66 +kikker +kenner +kattie +katerinka +kaspar +kashif +karthik +karsten +karina1 +karan +kappas +kapitan +kanker +kalinina +junjun +julianne +jujube +juice1 +juggernaut +josie1 +joseph12 +jorgen +joplin +joni +jona +jolanda +johnson2 +johanna1 +jimmyc +jetsjets +jessica7 +jeopardy +jennyb +jenny123 +jenner +jeffie +jcnhjd +jbaby +jasont +jaso +jarod +jaredleto +jardin +janette +jameson1 +james99 +james5 +jalisco +jake11 +jaimatadi +jahjah +ivanna +isobel +islanders +iseeyou +irland +iridium +ipanema +intel1 +ilovepus +idiota +icecrea +ibmibm +hysteria +hunter11 +htlbcrf +hotwheels +horny123 +hopkins1 +honeybea +hondaciv +homeland +hollyb +hogger +hodges +hightime +hide +hfccdtn +heskey +herschel +herkules +henrique +hello1234 +hellhole +hej123 +hebrew +hbhlair +haywood +hayduke +hateyou +haslo1 +hashish +harley11 +haring +hard4u +happy7 +handbook +hamme +hallow +hajime +hacksaw +hacienda +guppy +gunship +gues +grosse +griffy +gridlock +green22 +greaser +granger +grandmaster +governor +gorilla1 +googgoog +goodwood +goodbeer +gondor +golfvr6 +golfin +gojets +going +goduke +gocards +goatman +go4it +gnatsum +glori +glavine +girl78 +ginger2 +gilly +ghjhjr +ghjcnjrdfibyj +ghjcnb +ghbdtngjrf +gfhjkm2 +gfhjkm007 +gfhfyjz +geyser +getdown +gertrud +geronto +germania +georgiy +george01 +geneve +generator +geeman +gearbox +gaydar +gangste +gSEwfmCK +fyabcf +futur +fury +fuck1234 +fruitcak +froglegs +frnhbcf +freedoms +frederi +fred99 +fred01 +freakshow +freakout +fragment +foxglove +fourier +forty2 +fornow +foley +flutter +flood +flipyou +flemming +flash123 +flameboy +flame1 +flagship +fkg7h4f3v6 +fishboy +fish1234 +fish1 +firewood +firehous +finest +fidel +ficktjuv +fghj +fgfgfg +fetish01 +ferrer +ferreira +fende +fencing +fdfnfh +fatdaddy +fatbob +fasted +farted +farout +fanta +falcons1 +falcon2 +facile +fabi +extrem +exbntkm +examiner +ewing +evgeny +eugeni +ethel +ester +espace +ertert +erlan +erinerin +enriqu +energie +empty +emerica +elocin +elloco +eliston +elementa +electronic +edvard +edcba +eastwest +dzakuni +duluth +dukester +ducks1 +drill +dressage +dreads +dracon +doria +domdom +doherty +dohcvtec +doglover +dodgeviper +dodger1 +djkrjdf +dirtball +dionysus +dinmamma +dimsum +dill +digita +dicksuck +dick12 +diabolo +diablo66 +dfcbktr +dexte +dessert +desperados +denman85 +demond +deleted +delbert +deftone +deckard +ddddddddd +dcowboys +daytona1 +davidruiz +dauphin +datadata +darknight +dario +danville +danube +danny123 +danica +damascus +dalmatio +daking +dagny +curves +curious1 +cure +cunt69 +cuddles1 +cucciolo +ctcnhf +crossfir +croft +crocus +crocker +cripple +crichton +crazyboy +crackhead +council +cortney +cortex +cornholio +cornflak +cornbread +construc +connor1 +comicsans +comeback +comcom +combine +colonia +codename +cocteau +cocopuff +coca +coates +clumsy +clive +cleodog +classic1 +clarks +civicex +ciscokid +cisco123 +circles +chrisd +chris99 +chris01 +chomsky +choctaw +chihuahu +chew +chennai +cheney +chelseaf +chelios +cheburashka +chatty +chato +chaney +chach +cfytxrf +centauri +celti +ceejay +cavern +catsmeow +cathouse +caterham +cat +cascades +carriage +carrera4 +carmella +carlie +cannondale +canard +cameleon +camaroz28 +calli +calderon +calder +calamari +cajun1 +caio +caesar1 +cadaver +cQ2kPh +buzzy +buxton +buthead +buster2 +bunny123 +bump +buffy123 +budwiser +britten +briley2 +brides +briann +brazil1 +brasi +brandon0 +br5499 +boy +bossboss +bosley +borneo +bootsman +bootay +boop +boobman +boobis +boobies1 +boobboob +bondar +bolt +boloto +bobbyg +bobbin +bob666 +bob12345 +bob101 +blunt420 +blumen +blueice +bluecar +blue88 +blucher +blinds +blackpoo +blackmag +blackeye +black13 +biteme12 +bitchedup +bishop1 +birthday5 +birdland +bipolar +biohazar +binary +billings +bill123 +biggirls +bigfella +bernard1 +bently +belial +begin +beercan +beerbong +beep +bear69 +beandip +beanbean +baseline +baseball2 +bartender +barolo +banjo1 +bangladesh +bangkok1 +bangbus +bandung +bagpipe +bagheera +badboy69 +bad123 +backspace +baby2000 +azsxdcf +azalia +aynrand +awacs +avondale +avensis +autechre +austen +atkinson +astrovan +ashlie +ashland +asdfghjkl1 +asdasd1 +artie +artemon +aretha +ardvark +arclight +apples12 +apolon +apollon +antonella +antler +antique +anniedog +annette1 +ankles +angels1 +angel5 +andrewjackie +andretti +anathema +anamari +anaheim +amylynn +amy123 +amrita +amista +ambient +alphabeta +all4u +alina1 +alfabeta +alexsandr +alex777 +alex77 +alex1996 +alevtina +alessandr +alemania +alegria +albcaz +ajhneyf +airbag +agbdlcid +affinity +adriana1 +adena +adam123 +acuari +activate +ackerman +acer123 +acadia +abkbvjy +abcdef1 +ab123456 +aaron123 +a654321 +ZPxVwY +ZIADMA +YANKEES +Y9Enkj +Wvj5Np +Winner1 +Virgini +VG08K714 +TrustNo1 +Tri5A3 +Toyota +Tommy1 +Test1 +THEMAN +Stephen +Sssssss1 +Spider +Speedy +Soccer +Sergey +STARWARS +SMOKE +SHANNON +SCOOTER +SAMUEL +Porsche1 +Pegasus +Panties +PNP0C08 +PIRRELLO +PIMPIN +Orange1 +Oliver1 +OlCRackMaster +OLIVER +Natalie +NICHOLAS +Miller +Maxwell +Mark +MONICA +MERLIN +Love +Liberty +Lawrence +Lacrosse +LOVERS +KicksAss +Jones1 +Jester +Iiiiii1 +INSTALLDEVIC +House1 +Hockey +Hobbes +Hello +Hastings +H2SLCA +Gloria +Gateway +Gambit +GUITAR +Friend +Fire1 +Fffff1 +Fender +FAMILY +Excalibu +Enigma +Elizabeth +Eeeeeee1 +Eeeeee1 +E5PFtu +Dominic +Dodgers1 +DigitalProdu +Destiny +Debbie +Dddddd1 +David1 +Crystal1 +Cjkysirj +Chicken1 +Cassie +Carlos1 +Carlos +Bubba1 +Brian +Blondie +BjHgFi +Beavis1 +BUTTER +BTnJey +BLACK +BANDIT +Arthur1 +American +Alicia +ACCESS +999998 +9969 +98769876 +9632147 +8UiazP +89172735872 +88889999 +88351132 +86mets +86753099 +8512 +81726354 +800800 +7xswzaq +7oVTGiMC +77778888 +7771 +7721 +7711 +747bbb +7355608 +71177117 +6988 +67676767 +666425 +654654654 +6453 +6000 +5LYeDN +58585858 +5544332211 +554433 +5482 +545ettvy +5421 +5377 +5334 +48484848 +4599 +4217 +3xbobobo +3A5irT +379379 +3791 +375125 +3733 +36460341 +360360 +32503250 +31413141 +312312 +31122000 +310884 +31081977 +310793 +310593 +310580 +310378 +31031976 +310195 +310174 +3035 +30303 +301292 +30121995 +301092 +30101972 +300890 +30081995 +30081973 +30081961 +300777 +300684 +30061968 +300587 +30051998 +300386 +30031971 +300187 +300178 +30011968 +2wj2k9oj +299792458 +291294 +291283 +29121999 +29121976 +291192 +291179 +29111996 +29111992 +291090 +291079 +290995 +290983 +29091969 +290884 +290883 +290882 +29081974 +29081973 +290792 +290784 +29061996 +29061975 +290569 +29051973 +2905 +290478 +290476 +290475 +29041973 +290382 +290377 +29031974 +29031973 +290178 +29011975 +281278 +281181 +281180 +28111997 +281090 +281072 +280991 +280982 +280976 +28081972 +28071973 +28061975 +280589 +280580 +28051962 +280479 +280477 +28041996 +28041976 +28041972 +28041965 +28041962 +280395 +280383 +280380 +280378 +28031971 +28031970 +28031960 +28021998 +27121973 +27111974 +27111972 +271084 +271083 +27101972 +270894 +270887 +270883 +270878 +27081970 +270794 +270791 +270786 +27061973 +270591 +270580 +27051995 +27051971 +270494 +27041971 +270383 +270380 +27031972 +270278 +27011999 +26121970 +26111994 +26111971 +261093 +26101971 +260985 +26091968 +26091961 +260885 +260877 +260875 +26081997 +26081976 +26081974 +26081972 +26071970 +26061970 +260594 +260593 +260580 +26051970 +26051967 +260487 +26042000 +26041969 +260391 +26031999 +26031972 +26031971 +260286 +260260 +26021997 +260194 +260191 +260184 +260178 +260176 +26011999 +26011971 +26011970 +258789 +2575 +2541 +25121995 +25121976 +25121972 +25121971 +251180 +251092 +251091 +25101971 +2509mmh +250977 +25091974 +25081969 +25071996 +25071973 +25061967 +250593 +250571 +250494 +250492 +25041960 +25031965 +250282 +250278 +250179 +2481632 +241271 +24121997 +241191 +24101970 +240977 +24091996 +240891 +240886 +240885 +24071997 +240678 +240587 +240584 +240574 +240573 +240390 +24031971 +24031970 +240278 +24021970 +240195 +240193 +240186 +2357 +233391 +233233 +23322332 +2314 +231276 +23101994 +23101973 +230977 +23091996 +230892 +230884 +230880 +230861 +23081972 +230794 +230793 +230571 +23051997 +23031974 +230294 +230277 +23021999 +230196 +2287 +227722 +2266 +22332233 +223311 +223223 +221278 +22121998 +22121973 +22121970 +221180 +221100 +220979 +220978 +220977 +220974 +220891 +220888 +220594 +220577 +22051974 +22051969 +220481 +22041968 +220382 +22031973 +22031971 +220284 +220280 +220195 +220194 +220176 +22011977 +22011966 +22011964 +2158 +2147 +213qwe879 +2129 +21242124 +2123 +211293 +21121959 +211185 +211182 +211075 +21101970 +21101968 +210884 +21081969 +21071970 +210693 +210678 +210676 +21061972 +210574 +21051970 +21041995 +21041969 +210394 +21031972 +2102 +210194 +210177 +21011972 +2040 +201292 +201194 +20111972 +201077 +200977 +200976 +20091971 +20091969 +200892 +200891 +200878 +20081995 +200781 +200778 +200693 +20061971 +200591 +200585 +200379 +200275 +1qazxsw23edcvfr4 +1qazxcvb +1qasw2 +1adam12 +1a2b3c4 +1Thunder +1Patrick +1Lover +1Ccccc +1Blue +1Austin +1Access +198400 +198012 +19511951 +19491949 +19421942 +1926 +191288 +191281 +19121976 +19121968 +191192 +191181 +19101996 +190990 +190984 +19091997 +190886 +190688 +190683 +190682 +19051997 +190490 +190484 +190470 +19041964 +190382 +19031994 +190287 +19021971 +19011972 +19011971 +1865 +1855 +183461 +1821 +18191819 +18181 +181292 +181291 +181279 +18121996 +181185 +18111974 +181086 +180991 +18091971 +180795 +18071968 +18071967 +1807 +180694 +180679 +180594 +180580 +18051969 +18031973 +180290 +18021996 +180195 +18011971 +18011969 +1791 +171188 +171178 +17111970 +171080 +170891 +170878 +170877 +17081968 +170774 +17071972 +1707 +17061998 +17051966 +170474 +170290 +17021967 +17021963 +170184 +1688 +1661 +161293 +161161 +16111979 +161094 +161080 +16101971 +16091971 +160873 +16081995 +16081974 +16081973 +160782 +160692 +160681 +160676 +16061997 +16061964 +160588 +16051961 +160495 +16041999 +160392 +16031970 +16031966 +160282 +16021969 +160184 +160182 +160181 +16011972 +1598 +159753q +159753456852 +1596357 +1596 +1590 +151292 +151283 +15121996 +151179 +15111996 +15101964 +15091969 +150884 +15081968 +150796 +15071973 +15071971 +1507 +150584 +150574 +150491 +15031969 +15031963 +150291 +150277 +15021981 +15011999 +15011972 +15011971 +1477 +14521452 +1430 +1415 +141276 +14122000 +141195 +141177 +141176 +14111971 +14111970 +141094 +141092 +141081 +14101997 +14101969 +140977 +14091970 +140879 +14081975 +140793 +140776 +140772 +14071999 +14051996 +14051971 +140492 +140478 +140475 +14041998 +14041975 +140395 +140379 +140377 +140275 +14021974 +14011972 +14011967 +135711 +134kzbip +1345 +1342 +1341 +13324124 +1316 +1314520 +131293 +131280 +13121969 +13111997 +13111972 +131084 +131080 +131079 +131072 +130967 +13091973 +130883 +130882 +130871 +13081972 +130779 +13052000 +13051971 +130492 +130477 +130469 +130379 +13021969 +13021964 +13021960 +130180 +130179 +12qw34er56ty +1293 +1267 +124124 +123wer +1238 +1237 +1236547 +1234qwerasdf +12345l +123456@ +1234567r +1234567b +12345678s +12345678qwe +123456789qq +123456782000 +123423 +1232123 +123123456 +123100 +121983 +121273 +121190 +12111996 +12111974 +121093 +121091 +121069 +12101968 +120995 +120994 +120991 +120976 +120969 +120968 +12091961 +12071969 +12071962 +12061968 +12061967 +12061206 +120575 +12051996 +12041968 +12041963 +12031970 +12031203 +120294 +120292 +120195 +120193 +1171 +1165 +1150 +1141 +11241124 +112255 +112212 +11121963 +111197 +111122 +1111111q +111091 +111084 +110995 +11091998 +11091972 +110874 +110864 +11081996 +11071997 +110684 +110675 +110673 +11061996 +11061965 +11051972 +11041997 +110399 +110380 +11031998 +11031971 +11031967 +110293 +110289 +110279 +11021997 +110182 +11011998 +11011972 +11011962 +10z10z +1088 +1077 +1070 +10291029 +10271027 +10181018 +101279 +101278 +101266 +10121957 +101193 +101173 +101163 +101095 +10108 +101071 +10102000 +101011 +100994 +100981 +100894 +100876 +100874 +100870 +100776 +10071997 +10071970 +100692 +10061998 +10061997 +10061969 +100472 +100397 +100393 +100378 +100371 +10031969 +100277 +100269 +100196 +10011973 +10011960 +091290 +091190 +09111973 +09111966 +091101 +091081 +09101994 +090999 +090986 +090985 +09091995 +09091971 +090888 +09071969 +090690 +090685 +090683 +09061967 +090483 +090480 +09041970 +09041966 +090291 +090281 +09011975 +0829 +081293 +081282 +081277 +081191 +081178 +08111996 +08111972 +08101996 +08101975 +080891 +080877 +080872 +08081970 +080788 +08071974 +08071970 +080694 +080685 +080683 +080589 +08051973 +080390 +080378 +08031967 +080292 +080291 +080282 +08021971 +080172 +08011978 +0728 +0714 +071288 +071280 +07121971 +07101996 +070986 +070966 +070886 +070880 +070791 +07070 +070691 +070681 +07061993 +07061974 +070592 +070585 +07051967 +070482 +07041995 +07041961 +070390 +070382 +07031968 +070282 +07021970 +070188 +070184 +07011997 +07011973 +061289 +061188 +061181 +061174 +06101996 +0610 +060991 +060982 +060978 +060976 +0609 +06081973 +06081969 +0608 +06071972 +06061972 +06061968 +06060606 +060584 +060582 +06051972 +060493 +06041971 +0604 +060383 +060374 +06031971 +06031969 +06021997 +06021970 +051286 +051280 +051279 +051187 +051185 +051181 +05111996 +05111972 +051082 +051078 +050995 +050981 +05091997 +05091971 +050890 +050889 +050794 +050785 +050784 +050774 +050696 +050682 +050679 +050593 +05050505 +050491 +050476 +050397 +050388 +050385 +050384 +050383 +05031960 +050281 +05021998 +05021968 +050190 +050176 +0422 +0415 +041286 +041282 +04121976 +04121972 +041173 +04111971 +04101972 +04101967 +040986 +04091998 +04091975 +04091974 +04081965 +040691 +040589 +04051998 +040495 +040392 +040387 +040380 +04031966 +04021996 +04021974 +040191 +040190 +040183 +0343 +031280 +031179 +03111975 +031089 +03101995 +03101972 +030984 +03091975 +030892 +03081996 +030787 +03071975 +03071972 +030692 +030676 +03061976 +0306 +030582 +030574 +030492 +03031968 +030287 +03022010 +03021998 +030182 +03011971 +024680 +0228 +021291 +021289 +021185 +02111975 +02111974 +02111972 +021082 +021079 +021074 +02101996 +020989 +020684 +02061997 +020588 +02041966 +02041959 +020393 +020380 +02031966 +020287 +020273 +02021967 +02011958 +0125 +0122 +011285 +01121969 +01121967 +011177 +01111974 +010981 +01091971 +010884 +010882 +010870 +01081997 +010789 +010779 +01071995 +01071965 +010695 +01061999 +010583 +01051966 +01041965 +010383 +010382 +010379 +01031998 +010283 +007911 +007 +0055 +0009 +000777fffa +.adgjmptw +******** +zxcvbn123 +zxcvbn12 +zxc12345 +zx123456 +zsxdcf +zoidberg +zermatt +zerkalo +zasranec +zaqwsx123 +zaq123wsx +zadrot +zachery +yummie +you +yensid +ybrbnrf +yard +yQMBevGK +xeon +wwe123 +wutang36 +woodlawn +wonders +wolfi +wolf12 +wm00022 +withlove +wisconsin +winte +winnipeg261 +windsong +willwill +wilfred +wilco +wiggin +wide +whywhy +whytesha +whoareyou +whitedog +whatthehell +whatnow +whatif +wellness +weezie +weedhead +wcKSDYpk +wavmanuk +watch1 +warpath +wargod +wallst +wallaby +wahoos +wagon +w00t +volvos40 +volvo850 +volcom1 +vogel +vodolei +vjzctvmz +vita +vishenka +violette +vika2010 +victoire +vfrcbv123 +verynice +veryhot +verdi +verbal +vekmnbr +vbhjckfdf +vanechka +vandamme +utjuhfabz +univers +unicorns +ulster +ulises +ugly +ufyljy +ucla +tyghbn +twopac +twogirls +twisty +twinboys +twice2 +turk +tunatuna +tuffy1 +truls +trudy +troyboy +troutman +trololo +trolley +trimmer +trillian +treehouse +trail +toyboy +torch +tootoo +toot +toogood +tomwaits +tome +tombstone +tombraider +togo +todays +tippmann +timoth +timewarp +tigris +tickles +thunder3 +thrice +thissucks +theology +thema +thebull +theblues +thayer +thaman +tesoro +terrys +tequilla +tension +tenshi +tenor +telekom +teenteen +tawny +tarkan +tape +tanith +takeoff +takeit +taint +syMoW8 +sword1 +swetlana +sweeter +svarog +suzette +suspende +support1 +sunmoon +summer11 +summer00 +suisse +sucram +sucksuck +suarez +studboy +stucco +streetball +stone32 +steve01 +steffie +steeler1 +steal +starss +star22 +squirter +spuds +spudman +spoony +splodge +spk666 +speaker1 +speak +spaghetti +sonson +soccer21 +snowdrop +snoopy12 +smolensk +smite +smells +smacker +slovakia +slicks +slayer69 +skylin +skipp +skeets +sk2000 +simplex +sigtau +sicilia +shylock +shuffle +shrike01 +showgirl +showers +shortys +shoppin +shooby +shlomo +shinobu +shilo +shetland +shelb +sheela +sharks1 +shares +shami +sham +shack +sh4d0w3d +sexylove +sexsite +seven1 +sergey1 +sepultur +septic +seifer +seeyou +seesaw +secret123 +seanjohn +scouter +schools +schmoo +schism +schiffer +schick +schalk +scarlet1 +scarecrow +scammer +sawmill +sashas +sashaa +sarang +sarajane +santa1 +sanjar +sanger +sanek94 +sandrin +saluki +saliva +salinger +sailer +safina +sadiedog +sacrifice +sD3Lpgdr +s7fhs127 +rvd420 +russland +runway +royal1 +roshan +rose123 +ronin +romuald +romeo123 +roksana +rofl +rocky13 +rockss +rocks1 +rockhead +robyn1 +roar +rlzwp503 +rjhjkmbien +rizzo +rights +rifleman +riesling +rickrick +richland +rhfdxtyrj +rfvbkkf +rfnz90 +rfnmrf +rfhfynby +rezeda +revelation +remus +redso +redshoes +redsea +redcross +redapple +rectum +realgood +rawks +rawdog +raspberry +rasheed +rascal1 +ranjan +rainy +rainbow2 +rags +racheal +qwerty3 +qwert54321 +qweasdqwe +qweasd12 +qwaszx1 +qvW6n2 +quovadis +quattro6 +quant4307 +qqwweerr +qpful542 +qazwsxe +qaz1wsx2 +pyramide +putamadre +pussyfuck +pusspuss +puppie +puntang +pugsly +pueblo +provence +protools +propane +pronger +promo +proline +producti +prodigy1 +prince12 +pretty1 +pozitiv +pourquoi +porno123 +poppy123 +poorboy +pooka +ponpon +polymer +pokerface +plump +plug +playhard +plankton +pjcgujrat +pirelli +pinpin +pinga +pimpin1 +pilatus +pierrot +pierr +pi31415 +phunky +phisig +phikap +petrovna +petr +peter12 +pescado +pepsico +pepsi2 +pentium3 +pentium2 +penmouse +pelota +peewee1 +pebbles1 +peanutbutter +pattie +patric1 +passward +parool +parkside +parents +paparoach +panthe +panic1 +paiste +pagoda +padilla +paddy1 +packet +pacifico +p00p00 +ozone +oxymoron +overlook +outdoor +otello +oswego +oskar +orville +orions +orange2 +optimum +opium +opelastra +ontime +ontheroc +oneman +olesia +oldsmobile +oktober7 +ohwell +offset +offense +ofelia +octopuss +oceane +nyquist +nutshell +nozzle +novanova +north1 +nooner +noneya +nokia3230 +noidea +noclue +nirmala +niner +nilrem +nikeair +nick1234 +nezabudka +newjerse +nerd +nefertiti +neener +needsex +nederland +navarre +natura +nations +natasa +natalia1 +nasser +namron +nadroj +nadezda +mytruck +mylove1 +mybutt +myballs +my2girls +murmansk +murder1 +murakami +muffler +mudman +mst3000 +moxie +mouse123 +mount +motorol +motorhead +motherfuck +moreland +moogie +monkies +monday12 +moinmoin +mobster +mobil1 +mitsubis +mistydog +misawa +misa +miro +minivan +miners +minchia +mimimimi +miked +mike18 +mika00 +mickey12 +michelob +michael4 +micasa +mhorgan +metropolis +mermaids +merlin12 +memphis1 +membrane +melton +melmel +melmac +melange +meanone +mcintosh +mcgee +mcfarland +mcfadden +mccoy +mayfly +mayberry +maxxx +mausi +matthew8 +matrix12 +mathews +mathew1 +mateus +masterchief +master10 +martina1 +marsbar +mariusz +marina123 +mariela +manolito +mano +manners +manley +mangust6403 +mandy123 +mander +malvern +maks +make +majortom +majinbuu +maiden1 +maggie12 +madhuri +madcap +machine1 +machin +m69fg1w +lysander +lvjdp383 +ludlow +lucylu +lthtdyz +lsIA9Dnb9y +lovelovelove +loveher +loshara +loreal +london99 +locksmit +llcoolj +lizards +littlebit +lisa01 +liljon +lightbul +lifeson +lifeline +licked +lfdbl11 +lena2010 +len2ski1 +leighton +leetch +lee123 +ledzeppe +leave +larrywn +larger +lampoon +lajolla +lagrange +lagarto +kwiatek +kumar1 +kukareku +ktr1996 +krokus +kristel +krause +koks888 +klipsch +klausi +kiska +kirstin +kingfisher +king69 +king12 +killer69 +kill666 +kikikiki +kidman +kibble +kiara +keyhole +kellym +kellyann +kelly69 +keekee +kazakova +kazakov +kaylie +kayley +katelynn +karoline +karol +kappasig +juve +justfun +junior2 +june17 +julie456 +julia123 +juicy1 +judson +judoka +juancho +jsmith +joshua01 +joshie +joseph10 +jordan22 +jordan01 +jor23dan +johnny99 +johnathan +john31 +jmZAcF +jjjkkk +jinx +jimmyboy +jimm +jhgfdsa +jewelry +jetta1 +jetbalance +jessica8 +jericho1 +jeffy +jeanpaul +jayman1 +jasonx +jasonr +jansson +james12 +jamaal +jam123 +jacob123 +jackyl +jackdaniels +jacinta +izzy +ivan123 +itsmine +isgood +ironbird +irochka +intimate +innuendo +inline +ingodwetrust +inferno1 +incubus1 +incredible +iloveu1 +iloveass +ikoiko +ikke +ichiban +icewind +iFgHjB +iDtEuL +i81u812 +hxp4life +hullcity +huhu +hugedick +hotmale +hotdog1 +hookah +honeybear +homeworld +homes +hologram +holly123 +holloway +holland1 +holida +hol +hockey10 +hiroko +hipster +hipho +hip-hop +hingis +hines +hfcgbplzq +hfccbz +heslo +herve +hepcat +henrys +hellspaw +helloween +hearse +headers +hea666 +hawkman +hates +hasbro +harpo +harp +harleyd +hardbody +hanshans +hannah01 +hangover +hangout +handjob +hairy1 +hades +habari +habanero +gungun +guitar12 +grunt1 +growth +grouse +grimsby +gotika +gorodok +gorams +goosey +gooners +goodrich +golfer12 +golfe +golfcart +golf99 +goldorak +gokart +gohabsgo +godslove +godloves +gobruins +goatgoat +gnarly +glock23 +giusepp +gisele +ginny +gimp +gilman +gigigi +gift +giant1 +ghostly +ghjrehfnehf +ghfplybr +gfhjk +gfdsa +getrich +gerda +generic1 +geek01d +gaygay +gatekeep +gamer1 +galaxy1 +gagher +fyfyfc +furry +funkster +fuckyou! +fucknut +fuchs +frolic +frequenc +freeport +freek +freehand +fredrik +fredo +fred69 +fred11 +francy +frames +foxx +fosgate +forgotit +forgive +forest1 +focused +flute +fluke +florida2 +flor +floflo +flimflam +flick +fleetwoo +fk8bhydb +fivefive +firstone +firewire +firecat +finbar +fihDFv +fighter1 +fern +fence +feldman +fedora +fdsafdsa +fdfdfd +fcbarcelona +fathe +fatcat1 +farris +fallout3 +fafafa +fUhRFzGc +f00b4r +evol +evgeni +everyone +eumesmo +escorpion +ertyu +erkina +eric1234 +erevan +equity +epoch +episode +enzyme +ender1 +emilee +elviss +elton +elsinore +elle +elektrik +elder +elbows +eintrach +egypt +egon +edoardo +eatit +earwig +ea53g5 +duplicate +duncan1 +duke01 +duffel +duende +drunken +drummond +druids +drlove +drama +dragon00 +dovetail +doppler +dooker +dontask +donegal +domina +domenic +dolemit1 +dole +dogstyle +dogbreath +doedel +dobbin +djgabbab +disease +dinodino +dimwit +dimon +dima1993 +dima1234 +digweed +dignity7 +dickme +diabolic +diabetes +devotion +devilboy +deviant +deposit +demi +delta9 +delta123 +delia +deion21 +defeat +deepdive +deadlock +deadbeat +dbacks +daycare +dawndawn +davina +davidp +davidk +davidh +davidg +david01 +danial +damngood +damned69 +dakota12 +dakota01 +dairy +daftpunk +daddyy +daboys +d78unhxq +d2000lb +cxfcnm +curry +cujo31 +cubswin1 +crushme +crisco +crickett +crickets +crest +crespo +creed1 +crayfish +cowpie +cowboys2 +course +couch +cordero +cooool +coondog +confiden +concordi +composer +comander +collants +codfish +coco123 +cock69 +clough +clooney +clone +clicker +clemence +civil +chucks +chucker +christer +chrisk +chiva +chipster +chingy +chilling +childre +chiken +chev +chelsea6 +cheetos +checkout +chase123 +charvel +charlee +channing +chameleo +challenger +chakra +chablis +cfvlehfr +celtic67 +cellar +celebs +cavscout +catdog1 +casper99 +casper12 +cash12 +casey22 +casandra +carton +carlton1 +carlos12 +carley +captiva +capella +cape +cantik +cand +campeon +camillo +callas +caeser +cableman +cQnWhy +c43qpul5RZ +busch +burnburn +buns +bunko18 +bunches +bunch +builders +buddylee +buddy7 +buccanee +bubby1 +bruce10 +bronco2 +brittany1 +brillig +bridget1 +briant +brewski +brenner +braves10 +brakes +bradman +boy123 +bottoms +borland +borisov +bootyman +boopie +bongo1 +bombo +bodyhamm +bobbyboy +bobbyb +bobby2 +bmw535 +bmw330ci +bluejean +bluefox +blue52 +bloomer +blood123 +blocker +blinker +blingbli +blind1 +blessme +blesse +blazer1 +blarney +blackbur +bitchedu +biskit +birmingham +biomed +bintang +bimota +billions +bighorn +bigdaddy1 +bigdadd +bigboy12 +bigair +biffer +bianc +benfic +befree +bebit +beaver69 +beatnik +bearman +beam +bazzzz +bayshore +bavarian +batman123 +batata +basenji +barons +barnyard +barbwire +baobab +banyan +bandito +bambush +ballers +bald +baird +bahrain +baerchen +badbo +bacon1 +backside +baby1 +babu +babes1 +babe69 +az123456 +aw96b6 +austintx +auror +august2 +august16 +auditor +auckland2010 +atari +asturias +assassass +asparagus +asleep +asenna +asdf12345 +arturik +armagedo +aristotle +arie +area +antone +annies +annick +anneke +anjana +anima +angles +angeliqu +angela12 +angel9 +andrzej +anchorag +amega +amaterasu +altitude +alphas +allo +alladin +all4u2c +all4u2 +alianza +ali123 +alexand +alex21 +alex1990 +alcapone +ajay +aisha +airsoft +agent99 +afdjhbn +aezakmi1 +adolph +adastra +acuransx +ackack +ace1210 +abuse +abramova +able +aaa +a9387670a +a7777777 +a19l1980 +a12345a +ZesyRmvu +Yyyyy1 +WILSON +WILLIE +WARRIOR +VICTORIA +V2JMSz +Ue8Fpw +Tyler +TokenBad +Thompson +TROUBLE +TITANIC +THX1138 +Syracuse +Spencer1 +Shelby +Service01 +SUZUKI +SMOOTH +SEXSEX +SCOTTY +Rosebud1 +Roland +Roberto +Rachel1 +Rabbit1 +Qwerty12345 +Qqqqqqq1 +Player1 +Pantera +PLEASE +PJFLkorK +Nfnmzyf +Natali +Mountain +Melanie +METALLIC +MARCUS +MANUTD +Lucky +LIVERPOO +L8g3bKdE +Juventus +Joseph1 +Jeffrey +JEnmT3 +JESUS +JASON +Infinity +IRONMAN +HypnoDanny +Harry +Happy +GIANTS +GEMINI +Fylhtq +Francis +Fluffy +Fisher +Fireball +Fender1 +FUNTIME +FRED +FOREVER +FISH +FAR7766 +English +England +Elizabet +Eeeee1 +DwML9f +Diablo1 +Dave +DGa9LA +Corvett1 +Christian +Children +Ccccc1 +Camaro +CUxLDV +COUGAR +CHERRY +Buddy1 +Bubba +Braves1 +Blue +Bear1 +BUDDY +BLUE +BILL +BEER +BEAVER +Andrea1 +Adonis +A1234567 +???? +999888777 +9981 +990099 +951753852 +9379992a +89211375759 +889900 +88002000600 +852369 +842105 +83y6pV +7pVN4t +78907890 +7879 +786786786 +777win +7677 +7500 +741852kk +7412 +7117 +711111 +6911 +669E53E1 +6667 +66669999 +66221 +6458zn7a +6319 +625vrobg +5QNZjx +5782790 +5775 +557799 +5533 +5490 +5396 +5355 +5325 +525525 +5253 +4freedom +4cranker +48624862 +4828 +4734 +4569 +4560 +4508 +444555666 +442244 +4412 +4408 +4321rewq +4310 +4201 +4111 +4002 +3TmnEJ +3891576 +3739 +36987412 +369369369 +3693 +35353535 +3410 +332233 +3322 +32165 +32103210 +3200 +31337 +311292 +31121995 +31121971 +31101968 +310891 +310876 +310775 +31071994 +31071969 +310595 +310587 +310577 +31051974 +310194 +310179 +302731 +30121977 +301180 +30111996 +301089 +300987 +30091997 +300882 +300881 +300872 +30081972 +300783 +300779 +30071971 +300695 +300677 +300670 +30061997 +300592 +300591 +300578 +300494 +30041999 +30041971 +30041970 +300378 +300173 +30011969 +30003000 +2bornot2 +2b4dNvSX +291292 +29121972 +29121964 +29111999 +29111970 +291082 +291077 +29101972 +290880 +290781 +29071996 +29071971 +290694 +29061998 +290574 +29051998 +290479 +290477 +29041962 +29021996 +290192 +290190 +29011971 +2829 +281292 +28121970 +281175 +28111970 +281077 +28101998 +28101973 +280794 +280684 +28061996 +28061959 +280593 +280582 +280557 +28051997 +28051969 +280482 +28031966 +280279 +28021974 +28021972 +280194 +28011996 +28011968 +28011962 +2772 +27121974 +27121967 +271192 +271191 +27111976 +271094 +271089 +27101996 +270982 +27081971 +270781 +2707 +270676 +270592 +27051998 +27031996 +27021974 +27021972 +27021971 +27021969 +27021966 +27021961 +26121998 +26121974 +261182 +26111995 +261078 +26101998 +260994 +26091973 +260890 +260881 +260787 +260680 +26061971 +26051997 +260494 +26041966 +260393 +260281 +260276 +26021973 +26021964 +260199 +26012601 +26012000 +26011973 +254xtpss +2524 +251278 +251189 +25111972 +25101996 +25101973 +25101964 +250978 +250893 +250879 +250875 +250860 +25081968 +250773 +250680 +250677 +250672 +25051969 +250474 +250394 +250373 +250279 +25021995 +250194 +246246 +2444 +2436 +2416 +241283 +241278 +241277 +24121998 +24121971 +241193 +24111972 +24111967 +24111961 +241082 +241072 +24101995 +24101974 +24101972 +240992 +240978 +24091998 +24091972 +240881 +240878 +24081973 +24061999 +24061972 +240577 +240492 +240481 +240480 +24041964 +240391 +240382 +240377 +24031969 +240291 +24021998 +240190 +2400 +23wesdxc +2375 +23142314 +231275 +231269 +23121971 +231176 +23111969 +231096 +231074 +230972 +23091973 +230897 +23081970 +23071995 +230669 +23061972 +230488 +230374 +23031967 +23031966 +230292 +230271 +23021969 +23021962 +230179 +23011971 +22882288 +2267 +22552255 +2252 +2230 +2225 +2224 +2213 +221276 +221195ws +221195 +22111970 +221094 +221080 +221079 +220973 +22091997 +22091972 +220878 +22081973 +22081965 +220770 +22071970 +22071969 +220694 +220682 +220679 +220675 +220674 +22061967 +22061962 +220593 +220592 +220489 +220478 +22041972 +220379 +220377 +22032000 +220295 +220276 +22021972 +220174 +22011969 +21436587 +214214 +21121972 +21121968 +211193 +211180 +211089 +211077 +21101966 +210979 +210978 +21081958 +21071998 +21071974 +21051995 +210496 +210493 +210479 +210392 +210390 +21021969 +210175 +21012000 +2024 +201293 +201291 +201278 +201276 +201275 +201185 +20111970 +20101974 +200987 +200985 +20091960 +20081975 +20081972 +200786 +200774 +20071996 +20071970 +200578 +200572 +20051998 +20051963 +20041972 +200391 +200287 +200270 +20021972 +20021960 +200188 +200182 +200178 +20011963 +20000 +200 +1shot2 +1qasw23ed +1money +1asshole +1abc2 +1Yyyyy +1Xxxxxx +1Silver +1Rocks +1Panther +1Orange +1Melissa +1Hello +1Ginger +1Fire +1Charlie +1Boomer +1Biteme +1Bitch +1Beavis +1Andrea +1993199 +198900 +197878 +197346 +195000 +19221922 +191278 +191177 +19111976 +19111971 +19111970 +19111962 +191081 +19101968 +19091996 +19091995 +190877 +190692 +190689 +19061973 +19061970 +190582 +19051998 +190487 +190477 +19041998 +19031974 +19031972 +19031971 +19031966 +19031962 +19021972 +190191 +1880 +1824 +18121970 +18121962 +18111971 +18101971 +180979 +180978 +180974 +18091995 +18091973 +180893 +18081998 +18081996 +180791 +180675 +18061999 +18061997 +18061996 +18061970 +180480 +180470 +180394 +180379 +180374 +18031972 +18031970 +18031960 +180294 +180289 +180194 +180187 +180185 +18011973 +18011972 +18011966 +171293 +171292 +171284 +171171 +171091 +171077 +17101974 +170881 +170879 +17081966 +170775 +17071969 +170691 +170684 +170682 +170576 +17051997 +170495 +170479 +17041968 +17041964 +170373 +17031973 +170275 +170205 +170195 +170182 +170170 +17011973 +17011965 +16309 +16121998 +161182 +161176 +161172 +161093 +16101972 +160991 +16091998 +16091996 +160792 +160790 +1607 +16061974 +16051970 +160480 +160476 +16041997 +16031963 +160292 +160291 +160281 +16021971 +160174 +16011963 +1574 +154154 +151270 +151191 +151174 +151094 +151079 +15101971 +15101963 +15091999 +15091975 +150876 +15081971 +15081966 +150794 +15071998 +15071960 +15061972 +150576 +150573 +150494 +15041970 +150383 +15021997 +150150 +148888 +1420 +141269 +141179 +141178 +141079 +140980 +140795 +140780 +140778 +140682 +14052000 +14051999 +140393 +14032000 +140295 +140294 +140277 +14021968 +14021960 +140184 +140170 +14011998 +14011970 +13971397 +1378 +1357246 +13467 +13251325 +1319 +131177 +131172 +131131 +13111970 +13111969 +131094 +131092 +131090 +131077 +131070 +130896 +130793 +130792 +130697 +130693 +130674 +130670 +13061968 +13061963 +130574 +13051995 +130493 +13041960 +13031971 +130295 +130284 +130278 +130194 +130181 +13012000 +13011968 +12qw +1298 +1292 +128mo +1287 +1284 +1276 +1255 +123sex +123kid +123654987 +1236547890 +1234as +1234a +12345zx +12345abcde +1234578 +123456zx +1234567w +123456789aa +123456789101 +1234567890zzz +12342000 +12341 +123400 +123321qq +1232323 +123123s +121966 +12151215 +121416 +12131 +121270 +121267 +121265 +121258 +12121972 +12111958 +121074 +121071 +120978 +120975 +12092000 +12091963 +120872 +12081998 +12081969 +12081960 +12071973 +120675 +12061997 +120595 +120594 +120479 +120468 +120461 +12042000 +120372 +120371 +12031961 +12021999 +12021995 +12021970 +120192 +1186 +1176 +1123581 +112288 +112176 +112001 +11199 +111983 +111294 +111274 +11121972 +11121960 +111193 +111182 +111156 +111123 +11111111111111111111 +111081 +11101972 +110996 +11092001 +110895 +11081973 +110795 +110792 +110785 +110771 +110693 +110685 +110674 +11061997 +110596 +110587 +110572 +11041965 +11031999 +110278 +110270 +11021970 +110193 +110190 +110180 +110173 +11011996 +11011973 +11011966 +1086 +107107 +106666 +1060 +1058 +1043 +1032 +10231023 +101986 +101978 +101296 +101280 +10121969 +101196 +101176 +101175 +10111966 +101091 +101066 +101061 +10102020 +100976 +100975 +10091998 +10091996 +100891 +100881 +100791 +10071996 +10071966 +10071965 +10061972 +100574 +100567 +10051997 +100376 +100374 +10032000 +10031961 +100274 +100273 +10021996 +100181 +09121979 +091189 +091183 +091182 +09111996 +091066 +09101963 +09090 +090889 +090879 +090782 +09071973 +090692 +090682 +090677 +09061998 +090581 +090491 +090486 +090484 +09041999 +090392 +090389 +09032000 +09031975 +090290 +090280 +090180 +09011995 +09011977 +0887 +0852 +081278 +08122000 +08121972 +08111994 +081082 +08101971 +080989 +080985 +08091998 +08091973 +080882 +080878 +080780 +080778 +08061998 +08061971 +080582 +080576 +08051997 +08051962 +080486 +080483 +080379 +080290 +08021965 +080189 +080182 +08011972 +08011970 +0788 +074401 +0724 +071283 +071190 +071184 +071177 +07111965 +071082 +07101970 +070989 +07081998 +070778 +070770 +07071996 +07061968 +07051996 +07051969 +070490 +07041998 +07041997 +07041968 +070387 +070371 +07031972 +07021996 +07021973 +07021972 +07021971 +070193 +070190 +070179 +07011965 +0691 +0628 +0627 +0625 +0622 +0615 +061279 +061277 +061273 +06121996 +061192 +06111995 +06111974 +061075 +06101970 +06091972 +06091970 +06081996 +06081968 +060793 +06071998 +060677 +060586 +060585 +06052000 +06051996 +06051969 +06051968 +06051965 +060487 +06041964 +06031970 +060276 +06021998 +06021966 +060190 +060175 +06011998 +0599 +0519 +051288 +051274 +05121996 +05121973 +051180 +05111994 +05111971 +051080 +050990 +050977 +05091972 +05082000 +05081998 +050780 +050775 +050592 +050579 +050578 +05031964 +050274 +05021966 +05011971 +05011968 +0427 +0414 +041290 +041273 +04121993 +04121973 +04121969 +041186 +04111973 +041088 +041078 +040990 +040984 +040977 +04091996 +040886 +040883 +040882 +04081971 +040785 +04071969 +040688 +040679 +040577 +04041971 +040390 +04031971 +04031967 +040296 +040282 +040273 +04021995 +04021972 +04021966 +040187 +040185 +04011970 +0369 +031274 +03121974 +031194 +031174 +03111996 +031090 +031083 +03101964 +030990 +030980 +03091969 +03071971 +030683 +030669 +03061971 +030583 +03052000 +030480 +03042007 +030405 +030391 +030381 +03031999 +03031964 +030288 +030285 +030284 +03021996 +030190 +030186 +03011968 +0213 +021276 +02121962 +02111970 +021076 +02101960 +020987 +020985 +020981 +02091962 +020893 +020875 +020781 +020696 +020683 +020678 +020672 +02061961 +020369 +02031998 +02020202 +020190 +020185 +02012009 +02011998 +02011963 +01470147 +01440144 +011280 +011191 +011082 +011081 +01101996 +01081988m +01081969 +01081959 +010791 +010784 +010781 +01071973 +01071969 +010677 +010594 +010592 +010572 +01052000 +01051972 +01051961 +010476 +010474 +010380 +010376 +01032008 +01031967 +01031962 +010291 +010282 +010269 +010193 +007008 +005500 +0022 +000222 +0002 +000013 +000012 +000009 +****me +zzzzxxxx +zyltrc +zxcqweasd +zxc123zxc +zhanna +zenit +zcegth +zaq12w +zachar +zSfmpv +yzerman1 +yt1300 +yourname +yonkers +yellow12 +ybrjkftd +yasmi +xswzaq +xswqaz +xfqybr +xenon +xcalibur +wqMFuH +workhard +wordlife +woodford +womersle +wolfdog +winthrop +winnipeg +wildthing +wigwam +wicker +wheaties +wetass +westward +wesdxc +welshman +welkom01 +wehttam +weegee +waynes +waverly +wapiti +wanton +waheguru +waffen +w2dlWw3v5P +vulgar +vtufgjkbc +vtkrbq +vortec +vorpal +vlasova +vlasov +vivienne +viper9 +vinter +vintelok +vinograd +vfhbfyyf +vessel +veronique +ventrue +vbnmrf +vaz2108 +vanish +valium +vagner +uvmRyseZ +upright +univer +unicor +underwor +ujkjdjkjvrf +uhfvjnf +uconn +tyty +tylerb +twisters +twinss +turbodog +tuck +tttttttttt +tsubasa +trythis +trying +trumpets +trujillo +truck2 +trevo +trench +tragedy +tractors +toystory +toutou +tops +tool69 +toobig +tone +tomkat +tomas1 +toasted +toadie +tinner +tigerwoods +tiger12 +tiger01 +tianna +three11 +thorns +theta +theresa1 +thegirls +theghost +theclown +tgwDvu +texas123 +tetons +testuser +testing2 +terry2 +teremok +tempest1 +telstar +telefono +teengirl +tecktonik +teaparty +teaching +tbontb +tarkin +tantrum +tandy +takedown +tailor +tBiVbn +symmetry +sylvi +sweetpe +sweet123 +suzuki1 +susanb +summer0 +sumitomo +sugaree +suckmycock +suckit69 +sucess +subito +study +structur +streaker +straw +strats +strait +strain +str8edge +stout +stormy1 +stoopid +stiles +steeda +steaks +staten +stanky +spurrier +spring1 +sprewell +sportster +spooker +spirou +spiked +spike123 +spiegel +spices +speech +spawn666 +spanis +spaced +spaceboy +sosa +soriano +sonicx +solara +softbal +soccer5 +soccer18 +snowfall +sniper12 +sneeze +snaiper +smoky +smitty1 +sm9934 +sloneczko +skyhook +sirene +sioux +sintra +sintesi07 +simba123 +silverfox +sillyboy +sikici +sidewinder +sibelius +shutter +shushu +shoelace +shoebox +shitbag +shit123 +shinto +shines +shin +sherzod +sheila1 +shecky +shaun1 +sharingan +shar +shama +shallow +shakespe +shaina +shad0w +seventy7 +serser +serkan +seemore +seat +seashore +scum +scuderia +scraps +scout2 +scouser +scoreland +scorelan +scoots +scooter7 +scoot +scoops +schumach +schiller +schaefer +schaap +scandal +saxons +savina +satnam +satans +sasha1234 +sasa123 +sarenna +sarahm +sappho +santeria +sands +sanche +sanborn +sanandreas +sammie1 +sam138989 +salazar +saddie +sack +ruthann +rtyui +roxydog +roxann +rovnogod +rose12 +rooroo +ronnie1 +rollout +roger2 +rockyboy +rocke +roadtrip +roadie +roaddog +ripken8 +ripazha +rincewin +ridden +ricker +richi +rhett32 +rfvxfnrf +rfgtkmrf +renwod +renner +remedy +redrum1 +redlegs +reddawg +redbull1 +red12 +realmadri +rbhgbx +rastas +rassvet +rare +rapala +rani +ramos +rambo123 +radley +radial9 +rabbitt +qwertyuiop1 +qwerty69 +qwerty33 +qwert6 +qwert1234 +qwasqwas +quince +quiksilver +qazxsw1 +qazsedcft +qaz123456 +qawsedrftgyh +qawsedr +pypsik +putain +pussyboy +pushit +punheta +punched +psycholo +pron +programm +products +printer1 +prett +precios +pratt +powerpower +porto +popstar +popkorn +poolman +polic +pokemon2 +poiuytrew +pogiako +plonker +plmokn +pleaser +plapla +plan +pixie1 +pitbulls +pirate1 +pinto1 +pinche +pimpdad +pilot123 +piknik +pigman +picasso1 +phlegm +phitau +pflhjn +petty +peterb +perkman +percy1 +pepper76 +pepper01 +penpen +pelusa +pelus +pelle +peejay +pedro123 +pazzword +pavlusha +patty1 +patt +patche +patagoni +pastas +passwrd +parrothe +papyrus +panama1 +pampam +palom +painted +pacific1 +osvaldo +oscarr +ontherocks +onering +omgkremidia +omega9 +olive1 +olav +ola123 +okok +offer +oddworld +o236nQ +nurbol +nugget1 +nudelamb +nqdGxz +novgorod +northwes +nokia6230 +nokia3110 +nobby +nitrogen +nirmal +ninonino +ninjaman +nilknarf +nikon1 +nikkii +nikhil +nicosnn +nicklaus +nichol1 +nicegirl +nexus1 +next +newspaper +newshoes +newjersey +newhope +neuman +nessa +nephilim +neoneo +nemisis +nella +necnec +naynay +navigate +natwest +nathan12 +nascar99 +narkoman +napoleo +nanonano +nagasaki +nBU3cd +n123456 +n12345 +mystere +mydog +mxAiGtg5 +mutton +muscat +mumbai +multimed +multik +mudcat +mrsmith +mrjones +movement +movado +mouseman +mossad +moresex +mooooo +moonglow +mookey +monkfish +monkey23 +monito +monica69 +moneymon +moikka +moguls +mochaj +mmcm19 +mkmkmk +mixing +mittens1 +missy2 +misskitty +missey +mishima +mishanya +minolta +minnette +minecraft123 +minded +minami +millionaire +milligan +miller31 +milkdud +mike24 +mike00 +mightymo +metatron +metart +messy +mesquite +merton +merson +merlino +merida +melissa6 +megumi +mean +meagain +mazahaka +mayor +maxmaxmax +max777 +mavrik +maurice1 +matthe1 +matild +mason123 +mascot +masami +martial +marryher +marquez +marques +markhegarty +mariella +maria2 +mare +mardi +marcu +marceau +manso +mandie +manda +mancow +mancini +mammal +malik1 +malibu1 +maisie +madelein +madagascar +macro +mackdad +macanudo +lying +lusting +lustig +lupine +lukasz +lucky69 +lucifer1 +loxlox +loverr +lovehurts +loveee +lovecock +love2011 +lorene +looksee +longbeach +loner +lolpop +lollipo +lois +lodoss +lobsters +littlejo +lisamari +linwood +linda123 +limpdick +likemike +lift +liefde +license +libert +liberate +leviathan +letmein3 +letmein0 +lerxst +leppard +lenny1 +legendary +lauryn +lasagna +lapper +lapin +lamp +lammas +lamers +lagers +ladydi +lactate +label +labamba +kurosawa +kucing +ktybyuhfl +ktrcec +kswiss +krasavica +kotkot +koteczek +korvin +korsar +konijn +konami +kolovrat +knotty +knigh +klapaucius +kisser +kisakisa +kipelov +kinney +kils123 +killer99 +kilian +kidding +kickass1 +kevin12 +kessler +kerry1 +kentavr +kennyg +kellogg +kellen +kell +kcuf +katia +kata +kassidy +kasimir +kartoshka +karishma +karat +karandash +kalyani +kalima +kaleka +kakawka +kahn +junojuno +junkies +junglist +jumpman23 +julieb +julian1 +juiceman +juanma +joselito +joker7 +joker666 +johnnyb +john99 +joey1 +joeman +joedog +jock +jochen +job314 +jimmyjam +jimmyj +jigei743ks +jibXHQ +jgthfnjh +jetman +jetlag +jesusis +jessicas +jenny2 +jelszo +jblaze +jayjay1 +javabean +jasonc +jason5 +jason12 +jasmine2 +jarule +january2 +jalapeno +jail +jagged +iyaayas +ivanivan +itchy +isakov +ironsink +ironside +ironman2 +iraida +iowa +invalid +intheend +insure +insect +indies +important +impaler +imesh +ilovegirls +ilikeyou +ikkeikke +idlewild +icculus +iamthema +iamsexy +iamhorny +iamhere +iKALcR +huxley +hutch +husker1 +hunter99 +hunter69 +hunted +hund +hummer1 +hugger +huffman +huevos +housepen +housecat +hound1 +hotti +hotshots +hotmove +hotfeet +hotcum +hotbody +hot4you +hookedup +honeymoon +hone +honcho +hollys +holliste +hogwash +hockey2 +hockey19 +hockey11 +hobie +hjklhjkl +hippy +hilly +highfive +hickey +hgfedcba +hfrtnf +hernan +henriett +henri +hemp +hemmelig +hello9 +hedonist +haylee +have +hashem +harley2 +hardass +happyy +habit +h00ters +guys +gunners1 +guildwars +guido8 +gshock +grundy +greenie +green6 +green23 +greater +grasshopper +grappler +graikos +graceful +govinda +gotoit +gossamer +goonie +goober12 +gondolin +golf56 +gods +godpasi +goddard +gobuffs2 +goblues +goblue1 +gnomik +gnocca +glock19 +glencoe +gjmptw +giles +gigigigi +gifford +giants56 +ghosty +ghost16 +ghjgecr +ghjcnjqgfhjkm +ghbdfn +gfkmvf +gfhjkbot +gfgekz +getaway +geolog +genius1 +gemma1 +geilesau +geddylee +geckos +gatita +garcia1 +galloway +fulle +fuckwit +fuck11 +frolov +frogger1 +fritos +friedric +friars +freshman +fresher +frenchfr +freiburg +freedom5 +freedom3 +free123 +frankfurt +foundati +foufou +fortis +football12 +flyrod +fizzle +fittan +fishka +fish123 +fisch +finster +finney +finance1 +fifi +ficker +fhbirf +fghfgh +fetish69 +ferrari5 +ferrari2 +ferndale +feli +favorite3 +fatrat +fatal +fantik +false +falcor +fakefake +fabrizi +f1f2f3 +extras +exposed +exploiter +evgenia +everlong +estonia +eric123 +eric12 +enigma1 +engines +emory +ellobo +eliana +elenberg +elemental +elbarto +eknock +ekaterina20 +egbert +edgewood +edgard +eddies +eclipse9 +earn381 +e55e55 +e3w2q1 +dvddvd +dupadupa +dunham +duncan21 +dump +duhast +duffy1 +dtnfkm +dsdsds +drumss +drowning +drewman +dreday +dragonfire +dragon77 +dragon25 +drache +downing +dough +doroth +dorkus +doomdoom +doogle +dontae +donato +domino1 +dome69 +dolls +dolfin +doghot +doctor1 +djkujuhfl +djdjdj +disorder +diskette +direktor +dink +dima1999 +dima1992 +dilligas +digge +dfhtymt +devices +detlef +desant +dementia +deltasig +deltachi +deli +deidre +defiance +dedhed +deathstar +deano +deagle +deadman1 +deadline +dbyjuhfl +dblock +dayana +dayan +dawidek +david7 +daveman +date +dashenka +dash +dartmout +darksoul +darkmanx +dark123 +dapimp +dante123 +danilov +dances +damir +daisys +daisy2 +daisuke +daisie +dYnxyu +cyrus1 +cyril +cyfqgth +cyclops1 +cycling +cutting +curly1 +cuban +ctvtyjd +crystals +cryptic +crying +cruz +crutch +critic +crazed +crawfish +cracker1 +cr250r +costume +copier +cooling +constance +congo +condoms +commish +collant +codycody +cockman +cobra2 +cobber +closet +cleocleo +clarkson +clarets +clapton1 +civic1 +cindys +cindylou +cinderel +chyna +chung +chrisx +christal +chris23 +chow +chippers +chilango +chicano +chevy350 +chevell +chester7 +cherise +cheat +charme +charles3 +charis +chameleon +challenge +ch33s3 +celula +celtic1 +cellphone +celin +celery +catinhat +caterpillar +cassey +carter15 +carlsberg +cardenas +capita +candycane +cance +canal +campeo +cameo +camaleon +calient +caliban +cacapipi +cabinboy +cabaret +c123456 +buzzed +buttmunch +buterfly +burr +burley +burberry +bulle +bujhm +buick1 +buddycat +bubble1 +bubbie +brunel +browns99 +brownie1 +browncow +bromley +broccoli +britt1 +brimston +brilliant +brigade +brenton +breezer +bran +bracelet +bornfree +boredom +boon +boomtown +booga +booboo12 +bonus +bonds25 +bonded +bondage1 +bnfkbz +bmw530 +bmw316 +blue2000 +blue02 +blotto +blimey +blah123 +blackstar +blacksex +blackdic +blabl +bitem +bissjop +birthday3 +birillo +bingbing +billybo +billgates +billgate +billard +bill99 +bigstuff +biglove +bighouse +biggreen +biggins +biffbiff +bichon +bhutan +bhbyjxrf +beverage +betrayed +bethesda +bester +berty75 +bernar +bergerac +benladen +benetton +benefits +benedikt +belova +bellsout +belladon +believer +beholder +beernuts +beer30 +beautiful1 +bear11 +bats +batman7 +bath +batch +bassie +baseball3 +barrow +barnum +barbaros +bangalore +bandit12 +baloo +balling +balla +baha +badnews +badfish +babcia +b00mer +aziza +ayesha +avocado +avery1 +aventura +avemaria +austin123 +atletico +astaroth +asshead +asdflkjh +asdfgh123 +asdcxz +ascona +ascend +artiller +artem1 +arrest +armpit +armond +aristotl +aristo +aries1 +ares +ardent +aragorn1 +approved +appels +apogee +apeman +anywhere +anvils +anthon1 +antani +annushka +anna21 +anna2010 +anna2000 +ankita +angeli +angel6 +anfield1 +andrew13 +anai +an83546921an13 +ampere +amonte +amoeba +amar +alpine1 +alphaomega +alpha5 +aloalo +all4u3 +alicat +alfa147 +alex69 +alex00 +alesya +alba +alakazam +ak47 +airmax +agents +agent1 +agamemno +afric +aerostar +aeiouy +aegis +adxel187 +adv12775 +adolfo +addiction +achille +ace1 +abused +abhishek +abc123456789 +abc +abaddon +aaaabbbb +aaa555 +aaa12345 +a1l2e3x4 +Zzzzzz1 +Zzzzz1 +Zxcvbnm1 +ZjDuC3 +Zealots +YR8WdxcQ +Xxxxxxx1 +WIZARD +Tigers1 +Thailand +Tennis +TUCKER +TRUCKS +TRAVIS +Steve1 +Stephen1 +Stella +Spiderma +Spanky +Smith1 +Sierra +Sidney +Seattle +Scorpion +Savage +SUCKME +SHARON +Rhbcnbyf +Rebecca1 +RULEZ +ROCKET +RACHEL +Q1w2e3r4t5 +Power +Please +PRIVATE +Oksana +ORANGE +OCTOBER +Nnnnn1 +NELSON +Morgan1 +Monika +Monica +Marley +Marines +MIDNIGHT +MARLBORO +Lizard +Liberty1 +Josephin +Jearly +Jasmine1 +JIMMY +Isabella +HELLO +Ggggggg1 +Gfhjkm123 +Genesis1 +Gary +Gabriell +Fucker11 +Fucker +Formula1 +Florida1 +Ffffff1 +Fe126fd +FcAZmj +Falcon1 +FROINLAVEN +FATBOY +Eclipse +E6Z8jh +Ducati +DuN6sM +Dreamer +Donald +Doctor +Dkflbvbh +Design +DeVLT4 +DUKE +Cobra1 +Claudia1 +Claire +Chicken +Chester1 +Carter +Cameron1 +COOL +Boy4u2OwnNYC +Bitch1 +Banana +Atlantis +Arctic +Alexandra +Alaska +Aa123321 +AZUYwE +AZERTY +ADIDAS +ABCDEFG +9988 +995511 +987410 +9711 +963214785 +949494 +908070 +8902792 +888111 +8669 +808808 +7u8i9o0p +78787 +7873 +7653ajl1 +755dfx +742617000027 +741147 +7399 +7337 +7277 +7224763 +708090 +707707 +703751 +700007 +7000 +6Xe8J2z4 +697769 +6820055 +6677 +666999666 +6666667 +654852 +654789 +616879 +6031769 +6012 +600000 +56565 +5646 +556699 +546546546 +54321a +526282 +5260 +5258 +5116 +4play +4me2no +4Ng62t +4989 +4916 +4809594Q +464811 +4600 +4580 +454dfmcq +4511 +4503 +446655 +444666 +44448888 +444333 +4426 +4421 +42qwerty42 +41d8cd98f00b +41614161 +4011 +392781 +3773 +3750 +3721 +36936 +3690 +362412 +3600 +355355 +34567 +345543 +3412 +339311 +33593359 +3334444 +3327 +32615948worms +3234 +3233 +3211 +320320 +31313 +3124 +311music +311279 +310895 +310874 +31081970 +31081969 +31071966 +31071962 +310592 +31051997 +31051978 +31051975 +31051972 +31051970 +310395 +310394 +310390 +31031963 +31031960 +31011998 +31011971 +305pwzlr +303303 +301290 +30121996 +30121973 +30121970 +301192 +301093 +30101996 +300995 +300983 +300979 +300973 +300892 +300877 +300675 +300575 +30051970 +300478 +30041976 +30041961 +300385 +30031963 +300196 +300194 +30011974 +30011971 +30011966 +291293 +291275 +29121974 +29121971 +291184 +290992 +29091970 +29091964 +290886 +290780 +29071969 +29071960 +290677 +29062000 +29061967 +29061963 +290393 +290374 +29031970 +290193 +290182 +29012901 +2888 +284655 +28462846 +2835493 +28322832 +281276 +28121959 +28111971 +281081 +281076 +28101971 +28101969 +28101965 +280995 +280898 +280877 +28081964 +28081960 +280780 +2807 +280694 +28061970 +28061968 +28051999 +280480 +280475 +280393 +280392 +280382 +28031967 +28021968 +280173 +28011998 +28011969 +2712 +271177 +27111971 +27101970 +27101966 +270994 +270984 +27091972 +270882 +27081996 +270795 +270780 +270687 +27061967 +27051973 +27041998 +27041967 +27041962 +270378 +270376 +27031971 +27031968 +27031966 +270270 +27021998 +27012000 +27011997 +27011969 +267605 +2639 +26121973 +26111998 +261091 +260981 +260979 +260972 +26091997 +26091971 +26091966 +26081973 +26081971 +26081968 +260794 +260792 +260777 +260776 +26071999 +26071997 +26071971 +260682 +260674 +26061997 +260579 +260578 +260577 +260575 +260573 +260495 +260479 +26041975 +260379 +26031996 +260287 +260273 +26021999 +260180 +26011964 +25452545 +2522 +251292 +251281 +251273 +25121973 +251191 +251176 +25111995 +25111994 +251082 +251074 +250991 +250980 +250976 +25081964 +250778 +250774 +25071999 +25061972 +25061963 +250594 +25051998 +250490 +250476 +25042000 +25041966 +250392 +25021962 +250193 +250173 +25011970 +250000 +2498 +2449 +2427 +2425 +241272 +241176 +24111974 +24111968 +241092 +241081 +241080 +24081970 +240791 +24071969 +240671 +24061996 +240579 +24051972 +24041972 +24041971 +240397 +24032000 +240295 +240194 +24011974 +23jordan +2378 +236236 +234432 +2341 +231271 +23121972 +23121970 +23121960 +231195 +231194 +231174 +23111996 +23111974 +23102310 +23101975 +23101970 +230979 +23091998 +23091968 +23091966 +230881 +230796 +230676 +230675 +230674 +23061970 +23061969 +23052000 +23051999 +23051970 +23051967 +23051962 +230471 +23041967 +230394 +230372 +230279 +230272 +23021967 +23021961 +230181 +2278 +2269 +2243 +222999 +222666 +22223333 +22221111 +221295 +221293 +221272 +221221 +221199 +221194 +221192 +221166 +22111996 +22111971 +22101975 +22101965 +22091971 +220895 +220882 +220874 +22071996 +22061973 +220591 +22051964 +220495 +220480 +220475 +22041967 +220392 +220371 +22031998 +22021961 +220177 +22011963 +2169 +2148 +2132 +213141 +2126 +2115 +211291 +211277 +21122012 +21121996 +21121975 +211172 +21111998 +21111971 +21111970 +21111965 +211094 +211090 +211078 +21101969 +210991 +210877 +210777 +210696 +210692 +210672 +210669 +21061973 +21061963 +210594 +210592 +210576 +210571 +210378 +21031997 +21031969 +210278 +21021971 +21011968 +2028 +2013 +20111965 +20111958 +201095 +201093 +20101976 +20101972 +200979 +200972 +20092010 +200893 +200777 +200694 +20061965 +20061962 +20061961 +200595 +20051966 +20051958 +200477 +200476 +20041967 +2004-10- +200381 +200377 +20031973 +20031972 +20031968 +20031960 +20021997 +20021963 +200192 +200179 +200175 +20012000 +1w2w3w4w +1qaz3edc +1p2o3i +1j9e7f6f +1Xxxxx +1Winner +1Pepper +1Golfer +1Ggggg +1Fffff +1Eeeee +1Ddddd +1Bulldog +1Bailey +1Ashley +1Arthur +19977991 +199200 +19899891 +198611 +198300 +198215 +197800 +19733791 +1958proman +195555 +19391939 +19371ayj +1927 +19216801 +191286 +19121997 +19121972 +191188 +191083 +19091971 +190887 +190783 +19071975 +19071972 +19071966 +19071907 +190685 +19061969 +190584 +190483 +190481 +19041975 +19041967 +19041965 +190384 +190289 +190279 +1879 +1820 +181284 +181281 +181195 +181184 +18111962 +181091 +18102000 +18101974 +18101969 +18081972 +18081970 +18071969 +18051962 +180477 +180269 +18021977 +180193 +180184 +180177 +18011999 +18011970 +179355 +171276 +171273 +171177 +171175 +171174 +17111997 +17111971 +170984 +170976 +17091997 +17091969 +170872 +170871 +17081999 +170693 +170596 +170593 +170476 +170471 +17041972 +17041967 +170395 +170277 +17021969 +17021961 +1666 +1654321 +16191619 +161290 +161192 +161189 +161178 +161095 +16101955 +160977 +16061969 +160597 +160594 +160578 +16051969 +16051965 +16041971 +160381 +160378 +16031967 +160278 +16021972 +16011959 +159753z +15975300 +159357456 +15851 +158272 +1557 +1521 +1518 +151279 +15121998 +151196 +150995 +150977 +150897 +150892 +150675 +15061998 +15061969 +150595 +150583 +15051998 +15051996 +15051971 +15051965 +150474 +15041969 +15041962 +150381 +150288 +150281 +150278 +150196 +150183 +150180 +15011998 +15011997 +15011964 +1453145 +1440 +14231423 +1417 +14121969 +141175 +14112000 +14111974 +141078 +14101966 +140992 +140763 +14071996 +14071973 +14071971 +140684 +14061969 +140591 +140481 +14041997 +140374 +14031970 +14031961 +14012000 +1366 +136136 +1322 +1320 +131281 +131277 +13121962 +131211 +131174 +131171 +131091 +131074 +13101970 +130980 +130977 +13091972 +13091969 +130877 +13081975 +130794 +13071962 +130696 +130695 +130675 +13061969 +130593 +130472 +130395 +130263 +13011964 +1288 +1285 +1272 +1263 +1259 +1242 +1234qq +12345qq +12345ab +12345aa +123456ss +12345698 +1234567v +1234567k +123452345 +1234512 +123321qweewq +12332100 +123213 +1232000 +122976 +122500 +122436 +122369 +121994 +121991 +121986 +121972 +12171217 +121296 +121294 +121293 +121274 +121262 +121255 +12123434 +12122000 +12121969 +12121967 +12121962 +121173 +12111965 +12111211 +121075 +121070 +120993 +120973 +12091966 +120874 +12081961 +120792 +120776 +12071998 +12071996 +12071959 +120695 +120673 +12061970 +12051972 +12051967 +12041962 +12041204 +120373 +120368 +12031998 +120291 +120277 +120274 +12021968 +12021967 +120196 +120190 +120170 +120161 +12012000 +12011967 +12011966 +12011965 +1194 +1184 +1168 +1149 +113311 +112311 +112000 +11121974 +11121973 +111199 +111170 +11111973 +11111960 +111094 +11101973 +110991 +110975 +110897 +110876 +110872 +110869 +11081963 +110775 +110770 +11071974 +110676 +11051966 +11051965 +11051962 +110475 +110465 +11041972 +110387 +110360 +11031996 +11021976 +11021972 +11021968 +11021966 +110196 +110192 +110179 +11011974 +11011971 +1085 +1073 +1067 +1059 +1054 +1029384756q +101270 +101269 +10121965 +101067 +100980 +100979 +10092000 +10091968 +100879 +10082000 +10081967 +100779 +10071960 +100697 +100696 +10051966 +10041004 +10031967 +10031003 +10022000 +10021998 +100197 +100175 +100171 +10011967 +100101 +0p9o8i +09870987 +0986 +0978 +0919 +0913 +09121995 +091188 +091180 +091179 +09111974 +090991 +090977 +090880 +090872 +090788 +090780 +090679 +09061996 +090585 +090566 +09051998 +09051996 +09051970 +09051965 +090488 +090479 +090472 +09041971 +09041967 +090385 +090381 +09031974 +09031971 +090293 +090283 +090191 +090186 +090177 +0819 +0816 +081287 +08121970 +08121969 +081196 +08111995 +08111969 +081081 +080876 +08081967 +080774 +08061995 +0806 +080580 +080491 +080485 +080479 +08041968 +08041967 +080385 +080376 +080371 +080286 +080275 +08021999 +08021996 +080180 +08011976 +08011971 +0716 +0715 +071279 +071183 +07111998 +07111969 +07101964 +070979 +07081970 +070795 +070790 +070776 +07071998 +07071971 +070689 +070686 +070684 +07062000 +070583 +070582 +07051973 +070488 +070480 +070380 +070283 +070280 +070186 +07011971 +0620 +0619 +061185 +061183 +06111996 +061095 +06101975 +06101972 +06101965 +06091973 +060889 +060883 +060875 +06081972 +06081967 +060784 +060695 +060679 +060678 +060589 +060587 +060486 +060484 +060378 +060292 +060290 +060281 +060280 +060278 +060198 +060188 +06011969 +0569 +0528 +051177 +051176 +051092 +051090 +051087 +051070 +05101965 +050973 +05091966 +05081965 +05071974 +05071969 +050694 +050691 +050677 +05062000 +05061974 +05061971 +05061968 +05051974 +05051973 +05051972 +050489 +050482 +050480 +05042000 +05031962 +050289 +050284 +050280 +050188 +050184 +050172 +05011999 +05011963 +0486 +04325956 +041291 +041289 +04121971 +041182 +04111977 +04111966 +041096 +04102000 +040966 +04091971 +040893 +040885 +04071966 +040685 +040684 +040682 +040675 +040574 +04051965 +040491 +040481 +040468 +040383 +04031973 +04031961 +04031959 +04021971 +0402 +040189 +040186 +040179 +040175 +0383 +0357 +033028Pw +031293 +031289 +031195 +031178 +031177 +03111977 +031092 +031074 +03102000 +03101997 +030991 +030988 +030893 +030890 +030878 +03081998 +03081962 +03071966 +030684 +030682 +03061970 +030595 +030589 +030572 +030571 +03051961 +0305 +030488 +03041997 +03041970 +03041968 +03041966 +030371 +030187 +030178 +03011973 +0289 +021292 +021192 +021178 +02111973 +021095 +020992 +020983 +020979 +020978 +020977 +020882 +02081969 +02081959 +0208 +020776 +02071999 +020596 +020584 +020579 +020575 +02051962 +02041998 +02041967 +02031968 +020295 +02021997 +02021961 +020188 +020180 +020176 +02011965 +01telemike01 +0147258369 +0124 +0117 +011292 +011190 +011084 +010993 +010986 +01091968 +01091960 +010894 +010888 +010877 +01081996 +01081971 +010793 +010782 +01071972 +01071967 +01071966 +010686 +010676 +01061963 +01061962 +01061960 +010595 +010578 +010577 +01051962 +0105 +010481 +010470 +010381 +010378 +010375 +01031969 +01031960 +01022008 +01021967 +01021962 +010164 +001002 +zydeco +zxcvbnmz +zippy123 +ziggy123 +ziff +zhukov +zamira +yumiko +yujyd360 +yoyo123 +york +yoland +yfltymrf +yesman +yelnats +yell +yeayea +yeJnTB +yankees0 +yakumo +xxx111 +xplorer +x1x2x3 +wweraw +wouter +worksuck +wookie1 +wooglin +woodbird +wolverines +witch1 +winter00 +winnie1 +winne +winery +windows9 +willa +wilkins +wideglid +wicca +whoops +whiting +whitetai +whiteman +whipit +wharton +westsid +westin +werewere +were +weeman +weeded +webstar +wc4fun +way2go +warior +warehouse +warbird +walte +waleed +waldemar +waitron +waikiki +wafer +vtufajy +voyager2 +vorobey +volvov70 +volvo240 +volker +vito +vishal +virus1 +virtuagirl +viper99 +vip123 +villa1 +viggen +vidadi1 +vida +vialli +vgfun8 +vfuyjkbz +vfnhjcrby +vfktymrfz +vfhnby +verysexy +very1 +veracruz +vehicle +vbitymrf +vaz2110 +vassar +vasili +varadero +vampyr +vakantie +uvDwgt +utFP5E +useruser +urlacher +upupa68 +ulugbek +ultimo +uganda +ufkfrnbrf +ubvyfpbz +tyutyu +tweedy +tull +tuffguy +trueno +trix +triniti +trillion +trevoga +treess +travels +trashcan +tramps +tos8217 +tortue +tooling +tommaso +tomjones +tombraid +togepi +toering +toenails +tkachenko +titova +tipsy +tincouch +tincan +timberla +timati +tiktonik +tigers12 +tiger11 +tiern +tidbit +tickets +ticketmaster +thunder9 +thump +throttle +thomas19 +thekiller +thebeatles +terras +terps +terorist +termin +tentacle +tenore +tempo +temitope +teeny +technology +techno1 +tdutif +tbbucs +taylorma +taxicab +tatertot +tarkus +tardis1 +tarbaby +tarantino +tanne +tanisha +tango2 +tammys +tamere +sybil +swell +sweater +swatteam +swamp +suzi +suzanne1 +susans +survive +superfre +sunsh1ne +sunil +summer04 +sukram +sucker1 +stufff +studs +studioworks +stubbs +stronghold +straus +strata +stormie +stjohn +sticky1 +stever +stef +stapler +stang1 +staley +staci +stace +spots +sportin +spoiler +split +spiro +spicy +spender +spells +spanner1 +spaniard +spammer +spagetti +sp1der +sp00ky +sousou +sonntag +sonnie +sonar +soccer123 +soapy +snowwhit +snowshoe +snake123 +smoove +smoochie +smokey01 +smokeit +smartie +slut543 +slurp +slug +sloth +sloane +slickric +slicko +slack +skynyrd +skunks +skorpio +skippe +skins1 +sketch +sk8board +sixsix6 +sirens +siren +sinnet +simpso +silversi +shyster +shonuff +shkola +shirts +shinigam +shenlong +shazbot +shawshan +shape +shanty +shantel +shakal +shah +sexywife +sexysex +sexybitc +sexxy1 +sexkitte +sexiest +sexfun +sexdrive +sex2000 +seward +severus +sevendus +sesamo +servus +serenit +sereda +ser123 +sequoia +sephan +senses +sensation +sender +selwyn +selma +selfish +securit +secretar +secret2 +sebora64 +sebastian1 +sears +sdpass +scrap +scoubidou2 +schuyler +schulz +schott +schmitt +schmidt1 +schlumpf +schach +scat +scan +saveliy +savag +saudan +saturne +satch +satan6 +sasha1997 +sasha12345 +sasami +sardar +saphir +sandown +sandmann +sanan +samuri +samarkand +sam1 +salzburg +sallys +salisbur +sacramento +sabbath1 +s1lver +s1234567 +ryjgjxrf +russians +rules1 +rugged +ruffian +rubina +rostislav +rossella +roselyn +rosco1 +ronni +rockland +robber +rjyatnf +rjvgm.nth +ritarita +rikimaru +rifle +richard7 +rhtfnbd +rhenjq +rfpzdrf +rfkbybyf +rexx +rexdog +revere +retrieve +retina +rererere +repvtyrj +rent +remembe +rembrand +reinhard +registr +reform +redwood1 +redskin1 +redeemer +redding +redbud +redboy +red111 +red007 +reccos +rccola +raylene +rastafar +rapido +ranger12 +random123 +randers +ramsay +ramiro +rainmake +raid +rahul +rachid +racefan +r2d2r2d2 +r1chard +qwertyasd +qwerty23 +qwert5 +qwerasd +quigley +quatro +qqqqqqqqq +qqqqqq1 +qq123456 +qazxcvbnm +qaz1234 +q1234 +pwnage +pweepwee +pvJEGu +pussy7 +pussy11 +puschel +pure +punkrawk +pumpki +pugwash +psych +provista +protos +priora +primo1 +presari +prado +ppppp1 +power7 +pouncer +poulet +potion +portillo +portable +porsches +pornography +pornman +poppys +pooder +pond +pon32029 +poltava +polopolo09 +polopol +policema +pokers +pleas +playstation2 +pizzaboy +pizdets +pittman +pitbull1 +pita +pistols +pistache +piramid +pipetka +piolin +pimpjuice +pigboy +pico +pickle1 +phoneman +phoenix7 +phishing +phatboy +pharoah +pfqxjyjr +peterc +petepete +perr +performance +perfection +peralta +peppermint +penthouse +pension +penis123 +pendulum +peep +pearly +pauli +patman +password8 +pascual +partyboy +parton +parovoz +parkview +parkave +parisien +parcells +paradiso +panties2 +palantir +p123456 +oxcart +owner +other1 +osca +orioles1 +orange99 +once +omgwtf +omalley +olympics +oleander +offline +oddball +octobe +oaxaca +o4iZdMXu +nutcase +nudge +noway1 +now +novastar +novass +notyours +notorious +nostra +noreaga +nonrev +nivek +nintendo64 +nintendo1 +nifty +nicnic +nicerack +nhfdvfnjkju123 +nfyrbcn +newton1 +newmexic +newdelhi +newburgh +netcom +nena +nemonemo +neighbor +nedved +ncc170 +nbvfnb +nautique +natas666 +nata123 +nastyman +nascar03 +narayana +napolean +nannie +nallepuh +nEMvXyHeqDd5OQxyXYZI +mystique +mydogs +muzzle +mustanggt +murad +mumumu +mumdad +mukesh +muffdiver +mudshark +mrspock +mrmagoo +mpetroff +mozart1 +mott +motorolla +motdepas +mossberg +moriarty +morgane +morgan12 +moppel +moosejaw +moon123 +mook +monterre +mont +money777 +momentum +molly12 +moldir +mohican +mmmmmmmmmm +mjujuj +mixture +mitsu +missle +minouche +minor +minka +miniskir +millie1 +millertime +millenia +milla +milion +mikimiki +mikeee +mike25 +mike21 +midtown +midgard +microwav +michaelb +methane +mester +merlin69 +merkel +merete +mercutio +meoff +menudo +mellisa +melinda1 +melchior +megans +meatmeat +mcgowan +mcdowell +maytag +maximili +max33484 +maul +matveeva +matt12 +matrix69 +matrix13 +matata +masters1 +masterb +master77 +massacre +maser +marysia +marvi +martusia +martin11 +martie +marth +marla +markos +mariupol +margare +maradon +maps +mapper +mantas +manol +manning1 +manna +manitoba +manilow +mama2010 +mainer +magma +madone +madhatte +maddmaxx +maarten +lurker +lupus +lukeluke +luke1 +luisa +luckycharm +lucky8 +ltcnhjth +lowboy +lovesick +loverbo +loveforever +love14 +lostboy +losenord +lorenzo1 +lone +london20 +lololyo123 +lol123456 +lol123123 +lokoloko +lockhart +local +lmao +llib +ljcneg +liverp00l +littlebo +lithium1 +limit +limbo +likewhoa +lifeboat +liebe +lickme69 +lesnik +lesbia +leopards +leonel +leonard1 +lennart +legrand +leclair +leblanc +leann +leafs1 +leachim +lazyacres +lawntrax +lasagne +lapdog +lame +lakeshow +laika +lady12 +ladonna +lace +labelle +kurwamac +kudos +ktnj2010 +krondor +kristopher +krishn +kringle +kr9z40sy +kotek1 +kostyan +kononenko +kolya1 +kline +klaudia1 +kissy +kisa +kiril +kimble +kimberly1 +killemal +khushi +kevink +keving +kerrigan +kerala +kenwood1 +kenpo +kennys +keli_14 +keeper1 +kazumi +kayaks +kaulitz +katieh +karimov +karim +karen2 +karen123 +kardinal +kappa1 +kameron +kalinin +kalamazo +kaktys +kairos +kairat +justinbiebe +justin11 +jupiler +junkman +junior12 +june27 +june21 +jumpjump +jugger +juanit +juanas +jrcfyjxrf +josh1 +josefin +john69 +john22 +john01 +joey123 +joes +joeboo +jmh1978 +jlbyjxrf +jknE9Y +jimboo +jigga1 +jewel1 +jetblack +jesusislord +jesus3 +jessy +jertoot +jejeje +jeff1234 +jeff123 +jeff1 +jeans +jbird +jb007 +jazzzz +javajava +jasper12 +jasonn +jasond +jason22 +jasmine5 +jarman +janvier +jansport +jannie +janejane +janeiro +jakob +jakeman +jake1 +jager +jackin +jack10 +jabbar +jTuac3MY +j123456 +izumrud +iyaoyas +itout +isotWe +isgay +isaeva +is_a_bot +iownyou +iopiop +ioioio +invent +intent +ingo +infernal +indoor +india1 +incognit +include +importan +imes +imajica +imagine1 +iloveme2 +iloveme1 +igorigor +iforgot1 +ibiza +hydra +hustler1 +hunter123 +hunnie +hubbahub +hovepark +hotsex69 +hoschi +horses1 +hoping +honkey +honey123 +honda250 +homicide +homewood +homesick +homerjay +holliday +hodge +hockey21 +hjvjxrf +hjcnjd +hjcnbckfd +hiroyuki +himitsu +hihihihi +hihi +hickman +hibiscus +hevonen +hertha +hemi426 +hellyes +hello69 +hello3 +helix +heckler +heat7777 +heartless +heads +hawaii1 +haven +harrydog +harryb +harris1 +harri +harmonic +harley99 +hariom +hardtail +hard1 +happy100 +happier +hang10 +handel +hamster1 +hairpie +hahaha1 +hagen +habib +gwbush1 +gunther1 +gunny +gulnur +guelph +gucci1 +gtnhjd +grumble +grizz +gritty +grimmy +grendel1 +gregorio +greengreen +green69 +granit +granP +graffix +gracia +grace123 +gr00vy +gottlieb +gostoso +gostosa +gordolee85 +goomie +googie +goodgod +golions +goleafsg +goeagles +godislov +gococks +gmcz71 +glenn1 +gkfytnf +gjytltkmybr +gjkbyrf +gjikbdctyf +gizmo69 +ginsberg +gillie +gill +gilbert1 +gilber +gigante +giantess +ghjuhtcc +ghjcnjrdfif +ghjcnjnf +ghjcnbvtyz +gggggggggg +gfhfdjp +geujdrf +gettysburg +getreal +gerrard8 +geraldo +george3 +george11 +geolog323 +gen0303 +gembird +gellar +geemoney +gblfhfcbyf +gbjyth +gattone +gatorman +garuda +gansta +galax +gaetan +fvcnthlfv +funkey +funfunfun +fullmetal +fucknuts +frosty1 +fridolin +freedom9 +free4me +fred22 +freaky1 +francisca +franchis +found +fotograf +fortun +forsythe +forman +ford1 +footsie +football2 +fonseca +flyfishi +flintstone +flatus +flatland +flatbush +flashg +fj1200 +fishie +fisher1 +fische +finite +filth +fififi +fielding +fhifdby +fgdfgdfg +ffej +ferry +fatality +fantasy7 +fantasma +fallenangel +fairfiel +faerie +facials +eyeballs +executive +exclusive +ewq321 +evelin +evaeva +eudora +ettore +esteba +essayons +escada +ersatz +ericson +episode1 +epic +enjoyit +endzone +enamorad +emily2 +emily123 +elinor +elguapo +elgin +elendil +elbow +egroeg +edouard +eatshit1 +easyride +easyeasy +dwell +dupa123 +dummie +dumass +dukes +duke1 +dsadsa +drwho +druuna +drumnbass +drawde +drastic +drains +dragon9 +dragon3 +dozer1 +downfall +dovajb +dorsai +dorota +doomer +dontcare +domination +dominati +dominant +dollarbi +dolina +dogballs +dodson +dmb2010 +dirkpitt +dion +dinky +dingos +dingding +dimochka +digit +dieg +diddy +diana123 +dialer +diablo11 +dfnheirf +deniss +demetria +dembel +deltic +deleon +degauss +deerpark +decipher +deanne +deadsexy +ddgirls +dctktyyfz +dbrown +david26 +dave99 +dave69 +dave13 +darrow +danone +dannon +danika +damocles +dalglish +dale88 +daddy2 +cyecvevhbr +cyberia +cxcxcx +cutler +curitiba +cumsucker +cubbies1 +cubalibr +crypt +cruella +crouton +cristy +crista +crist +crfnbyf +crf450 +crevette +creole +crazyfrog +crazycat +crawdad +crabtree +crabcake +counters +counter1 +corvet +corsa +corny +corky1 +corkey +cordova +coorslight +containe +contacts +conor +concon +collins1 +coleta +codyman +cnhfcnm +cloclo +clio +clint1 +clarkken +claret +clara1 +cjlove +cinco +chuckie1 +chrisl +chris3 +chops +chitarra +chino1 +chich +chicago7 +chicag +chibears +chianti +cheung +chesney +cher +chelsea8 +cheez +charmaine +charmain +charlie8 +charlie0 +charlest +chapter +chapstic +chap +chancey +chamois +chadchad +cfif123 +cerise +cello +cegthgegth +cecily +cdfoli +cde34rfv +cdavis +cbr929 +cbr1000 +cave +cavalo +catlin +catalan +cat1 +caseys +carrie1 +carr +cardio +caraca +camille1 +camaro67 +calvin69 +calliope +call911 +cahek0980 +cagney +caddie +cadbury +cables +c00li0 +byabybnb +buttnut +buster22 +bust +burt +burg +bureau +bunny2 +bunky +bullshi +bulldog7 +bulbul +buda +buck1 +bubba22 +bruins1 +brucewayne +browny +brodeur +breanne +breadman +bravos +brahma +br00klyn +bowhunter +bouchard +bosses +bosox +borntorun +boriqua +booya +boonie +booman +bonoedge +bombshel +bomber1 +bohemian +bogies +bodger +bobbbb +bluefire +blowjo +blouse +blondin +blargh +blakey +blackhawks +blackburn +black22 +bizarro +bitchboy +bistro +birmingh +bingham +binbin +billbo +bilbao +bigwill +bigtop +bigstud +bigpappa +bigjay +bigchief +big +betsy1 +bethie +bestia +bertha1 +bernadet +berman +beograd +benson1 +benjamin1 +beirut +begonia +beetle1 +beavis69 +bear101 +bear01 +beachs +beach69 +bcgfybz +batcave +baston +bastardo +bassplay +basso +basque +barcode +barbra +barbell +baranova +bankone +bankai +bananna +balbes +balalaika +bait +badge +badass1 +bachman +babyhuey +babyboy1 +baby01 +b0n3 +b0ll0cks +a +azazazaz +avocat +austin11 +august31 +augsburg +atombomb +athlete +at4gfTLw +astra123 +asseater +ass1 +asian1 +ashwin +ashford +asdfjkl1 +asdf11 +asd321 +asd +arundel +artisan +arnster55 +arne +armenian +armagedd +aristote +ariston +archives +archi +arcana +arbeit +ara123 +aq12ws +april13 +applebee +anyuta +anneanne +anna1989 +anna1988 +animator +animation +animate +anhnhoem +anguilla +andy12 +andrew88 +aminor +amanda11 +alyona +alukard +alternat +alter +almira +allout +alliso +allblacks +allay +alibek +alfred1 +alex95 +alex1959 +alenushka +aldrin +alaskan +alalal +alabala +aksarben +ak470000 +ajnjuhfabz +airjordan +aircrew +aiko +ahjkjd +agape +ag764ks +advokat +adam1234 +acurarsx +acorn +access22 +access123 +abramov +abdula +abbaabba +aaronb +aaa777 +aaa123a +a54321 +a3eilm2s2y +a32tv8ls +Yyyyyy1 +XxXxXxX +Wolverin +WmeGrFux +Winnie +Warrior +Vvvvv1 +Viper1 +Video1 +Vfrcbv +Verbatim +Unknown +UfgynDmv +UTO29321 +U4SLPwrA +Tucker +Testing1 +TOYOTA +SuzjV8 +Steve +Stargate +Sssss1 +Spike +Sophia +Snickers +Slayer1 +SUCKIT +STELLA +STANLEY +SPEEDY +SPANKY +SNIPER +SIMONE +SCOOBY +Rocks1 +Robbie +Raptor +Rammstein +Rainbow1 +RONALD +REDSOX +RAINBOW +RAIDER +Qwerty +Qwert123 +QmPq39zR +QR5Mx7 +Pokemon +Philip +Ownzyou +Nelson +Nascar1 +MrBrown +Moritz +Mm111qm +Mitchell +Marion +Maggie1 +Madison1 +Maddie +MONEY1 +LuEtDi +Linda +Leslie +Laura +LP2568cskt +LOVELY +LJB4Dt7N +LICKME +Kkkkk1 +Kitty1 +Kathleen +KITTEN +Jimmy1 +Jake +Jacob1 +JACKIE +Immortal +Henry +Harvey +Happy1 +Hannibal +HORNY +HAPPY +Griffin +Green +Glueck +Ghbdtn +Galina +GENERAL +GATORS +FromV +Fred1 +Foxs14 +Elvis +Dudley +Driver +Donkey +Detroit +DerrickH +Daisy1 +DRIVER +DIABLO +DENISE +DADDY +Crazy1 +Christop +Chevy1 +Chevelle +Catch22 +Casey +Cardinal +Californ +Cadillac +CMGANG1 +CMC09 +CAPTAIN +Boston1 +Boomer1 +Bollocks +Blue1 +BUBBLES +BONNIE +BOBBY +BITCH +B7MgUk +Azamat +Autumn +Astrid +Anne +Anastasia +Alan +Airbus +AUGUST +ASDFGHJKL +AA1111aa +A123456a +9noize9 +9lives +9KYQ6FGe +987654321z +94RWPe +93Pn75 +92702689 +890098 +8889 +8848 +878kckxy +86868686 +867530 +85928592 +84268426 +824655 +7gorwell +7F8SrT +7ERtu3Ds +789632 +789551 +777777a +777771 +775577 +76767676 +765765 +7644 +753951852 +744744z +7018 +7001 +6jhwMqkU +682regkh +678910 +66699 +651960 +64646464 +63636363 +6345789 +6339cndh +62626262 +6226 +6060842 +5t6y7u +579300 +57575757 +5681392 +567rntvm +555123 +5477 +5432112345 +5333 +5321 +5286 +5268 +5191 +5003 +4x7wjR +4sex +4mnVeh +4meonly +4g3izhox +4fun +4GXrzEMq +4911 +4854 +4616 +4582 +456838 +4523 +452073t +4400 +4311111q +4258 +4255 +4231 +4213 +4212 +4209 +4152 +405060 +38383838 +3742 +37373737 +3711 +343343 +3330 +33233323 +3321 +3247562 +3221 +3201 +316769 +31121967 +311093 +311082 +31101972 +310877 +31081976 +310778 +31071967 +310582 +310383 +310374 +31031967 +31031964 +310176 +31012000 +305305 +301177 +301172 +30111973 +30111962 +301082 +301079 +30091964 +30081967 +300793 +300692 +300681 +30061996 +300594 +300579 +300577 +30051973 +30051965 +300477 +300470 +30043004 +30041964 +30041963 +300375 +30031973 +300191 +300175 +30011970 +30011965 +2wsx +29202920 +29121995 +29121965 +291177 +291081 +29101996 +290994 +290978 +29081969 +290793 +290782 +29071999 +290690 +29061969 +290579 +29051974 +290473 +290471 +29041970 +29041967 +29041961 +290391 +290371 +29031962 +290272 +290179 +290171 +29011996 +2901 +281284 +281279 +281274 +28121968 +28121962 +281178 +281177 +28111969 +281079 +28101997 +28101994 +28101966 +28091999 +28091971 +28091969 +280872 +28081968 +280695 +280678 +280576 +28051960 +280495 +28041969 +28041964 +28041959 +28031972 +280295 +280192 +28011967 +28011963 +2770 +276115 +2728 +2723 +271280 +271172 +271169 +27101998 +27101997 +27101969 +27091958 +270880 +27081964 +270775 +27071956 +270678 +27051997 +27051968 +270492 +270470 +270391 +270371 +270370 +270198 +270191 +270174 +2695 +2691 +26842684 +2668 +2667 +2665 +2652 +26429vadim +26351 +2622 +261280 +261279 +261276 +261175 +261174 +26111996 +261077 +26101969 +260996 +260988 +260976 +260895 +260874 +260780 +260693 +26041997 +26041967 +260377 +2602 +260179 +26011968 +26011963 +2581 +255225 +2539 +2527 +25222522 +2521659 +251295 +25121963 +251193 +25112000 +25111968 +251075 +251071 +25101966 +25101965 +25101960 +250995 +25091997 +25091968 +25091967 +250797 +250793 +250770 +25071962 +25061970 +250578 +250573 +250478 +250472 +250461 +25041970 +25041967 +25041963 +250374 +25032000 +25031969 +250295 +250277 +250275 +2502557i +25021971 +25021968 +25021966 +250169 +2466 +241293 +24121972 +241180 +24111970 +241076 +241061 +24101966 +240980 +240976 +240876 +24081996 +24081969 +24071960 +240677 +24061997 +240581 +240567 +24051970 +240476 +240474 +24041998 +24031997 +24031996 +24021974 +24021971 +240180 +24011967 +24011960 +24011959 +2377 +2363 +23562356 +2322 +2321 +231111 +231094 +231076 +23101997 +230878 +230877 +23081967 +23071998 +230694 +230673 +230593 +230492 +230490 +230475 +23041970 +23041966 +230385 +23031962 +230269 +230261 +23022000 +230197 +230195 +2273 +2265 +2259 +2242 +22334 +2220 +2214 +221291 +22121972 +22121965 +221097 +221093 +221074 +22101964 +22101961 +220995 +220976 +220975 +22091965 +22081974 +22081972 +22071968 +220673 +22061998 +22061966 +22061963 +22051963 +220496 +220494 +220482 +220476 +220474 +220463 +22041998 +22041964 +220384 +220373 +22031968 +22031960 +22021967 +220196 +2196dc +2145 +2141 +21232123 +212121qaz +2119 +211292 +211281 +211275 +21121967 +211171 +21112000 +211079 +211074 +211073 +21101999 +21101998 +21101974 +210976 +21092000 +21091967 +21091966 +21081972 +21081961 +210779 +21071972 +210677 +21061997 +21061971 +210573 +210570 +21051971 +21051967 +210477 +210474 +210472 +21041998 +21041996 +21041974 +21041967 +21041960 +210375 +210374 +21021970 +21021967 +21021966 +21021965 +2021 +20121974 +20121968 +20121962 +201188 +201172 +201169 +20111964 +20101996 +201000 +20091970 +200894 +20081973 +20081963 +20072000 +20071969 +20071966 +200678 +200677 +200593 +200575 +20052006 +200496 +200478 +20041964 +20041963 +200396 +200393 +200374 +20032000 +20031966 +200185 +200183 +1q2s3c +1lovers +1clutch +1big +1angel +1Tits +1Spider +1Slayer +1Scott +1Scooter +1Please +1Mike +1Merlin +1Matt +1Jessica +1Jack +1Hockey +1Fred +1Ferrari +1Eagle +1Chevy +1Chelsea +1Ccccccc +1Butthea +1Braves +1Bbbbb +19952009sa +199199 +198912 +19891 +198811 +198777 +198700 +1986irachka +19866891 +1982198 +197411 +196 +19171917 +191193 +191090 +190983 +19091967 +19091963 +19091961 +190890 +19081995 +19071970 +19071968 +190684 +19061971 +19061967 +19041970 +19031999 +19031970 +190292 +190283 +19021968 +19021960 +190181 +19011997 +19011967 +1877 +1836 +181270 +18121965 +18101962 +180992 +180975 +180895 +180891 +180890 +180862 +18081971 +18081808 +180792 +180777 +18071996 +18071972 +180693 +18061968 +180593 +180576 +180575 +18051999 +180484 +180474 +18041963 +180397 +18031997 +1803 +180287 +180275 +18021997 +18021968 +180196 +180173 +18011998 +17891789 +177177 +1726354 +1724 +1721 +1719 +1718 +17121998 +17121972 +17121968 +171173 +171064 +170994 +170991 +170978 +170975 +17091970 +17091966 +170892 +17081997 +17081964 +17081962 +170781 +17071970 +17071966 +17042000 +17041969 +170391 +170382 +170381 +170377 +170370 +17031999 +17031971 +17031967 +17031964 +17031957 +170291 +170193 +17011972 +17011966 +1680 +167943 +16641664 +164379 +1620 +16121969 +161196 +16111996 +16111967 +161079 +16101997 +16101961 +160993 +160969 +160892 +160878 +16082000 +16081971 +160779 +16071998 +16071997 +160691 +160678 +160675 +160598 +16052000 +160493 +160492 +16031965 +16021997 +160178 +15s9pu03 +159789 +1597530 +1582 +157953 +15121963 +15121958 +151192 +151171 +151077 +15101998 +150993 +150992 +150974 +15091965 +150877 +150874 +15081997 +15081965 +150779 +15071967 +15071959 +150678 +15062000 +150478 +150472 +150470 +15041997 +15031967 +15021971 +15021962 +150192 +1472583 +1443 +144144 +1434 +14251425 +1423 +141280 +141278 +141275 +14111998 +14111969 +141074 +14091962 +140878 +140874 +14081969 +14081965 +140773 +14072000 +14071998 +140676 +14061997 +14061970 +14061406 +140498 +140477 +140476 +140459 +14041962 +14031971 +14031964 +140273 +140272 +14021999 +14021971 +14021963 +14011971 +14011969 +1400 +137946 +13661366 +135795 +13579135 +135135ab +13301330 +13245678 +131275 +131178 +13111995 +131071 +13101969 +130996 +13091964 +130874 +130873 +13081997 +13081995 +13081966 +13071997 +13061977 +13061974 +130598 +130580 +13051975 +13051963 +13041974 +13041968 +130387 +130376 +130275 +130255 +13021972 +130178 +13011999 +13011962 +130000 +12q12q +1296 +1294 +1251 +123abcd +123ABC +123578951 +12345asdfg +12345Q +1234599 +123456qwert +123456aaa +123456aA +123456Z +123456798 +123456789zx +123456789. +123456788 +12345611 +123321s +123321az +12321232 +123211 +122000 +121987 +121979 +12181218 +12121974 +12121965 +12111970 +12111964 +12111962 +12108 +12101996 +120999 +120974 +12091969 +12091967 +120897 +120896 +120873 +120870 +120868 +12081962 +120798 +120775 +120774 +12071997 +12061972 +12061969 +12061961 +120573 +120568 +12052000 +12051998 +12051964 +120472 +12041998 +12041960 +120369 +12031965 +12021963 +12021961 +120169 +12011972 +1185 +1162 +1133557799 +11335577 +11301130 +112299 +112234 +111981 +111976 +111293 +111273 +11117 +111111aA +111093 +111074 +111072 +11101997 +110993 +110967 +11091974 +11091968 +110875 +110871 +110868 +11081960 +110797 +110772 +110769 +11071959 +110696 +110574 +11051970 +11051967 +110477 +110476 +110468 +110369 +110363 +110359 +11031972 +11031965 +110281 +11021967 +11021962 +110171 +11012000 +11011970 +110101 +1094 +1092 +109109 +1083 +1065 +1056 +1051 +1049 +10311031 +10301030 +1020315 +101998 +101380 +10121964 +101171 +101170 +10111965 +101093 +101064 +101055 +10101966 +10101963 +100996 +100967 +10091965 +100897 +100774 +100770 +10072000 +10071962 +100661 +10061970 +100595 +100593 +100582 +100573 +100566 +10051960 +100496 +100474 +100464 +10041969 +10041963 +10041960 +10031998 +100299 +10021969 +0990 +0915 +091279 +091275 +091272 +09111995 +09111970 +09101977 +09101974 +09101971 +090982 +090972 +090971 +09092000 +09091997 +090891 +090883 +09081970 +09081966 +09081962 +090793 +090786 +090781 +09071966 +090680 +09061970 +0906 +090582 +090577 +090576 +09051967 +09051964 +09041973 +09031973 +090295 +090294 +090289 +090286 +090278 +090190 +09011998 +09011971 +09011970 +0883 +0880 +0821 +081279 +081188 +08111971 +08111970 +081088 +081070 +08101969 +080987 +080983 +08091971 +08091967 +080871 +08081997 +080779 +080777 +080681 +080678 +08061972 +08061966 +080591 +08051964 +080490 +080489 +080472 +08041969 +080382 +080374 +080372 +080284 +080281 +08021969 +080187 +080186 +080175 +080174 +08011997 +07931505 +0791 +0786 +0777 +0770 +07111997 +07111994 +07111963 +071081 +071069 +070981 +070978 +070887 +070873 +07081971 +07081961 +070792 +070785 +07071969 +07071968 +07070707 +07061970 +07061961 +070593 +070578 +070577 +070576 +07051972 +070465 +07041999 +07041967 +07041960 +070392 +070391 +0703 +070293 +0702 +070187 +070182 +07011969 +07011966 +0664 +0650 +0629 +061284 +061280 +061177 +061084 +061080 +06101969 +060986 +06091967 +06091961 +060874 +06081966 +060788 +060781 +06071967 +0607 +060685 +060670 +06061964 +060593 +060583 +060469 +06041967 +060395 +060385 +06031997 +06031968 +0603 +060289 +060279 +060275 +060273 +06021972 +060192 +060187 +060185 +06011999 +06011970 +0580 +0517 +051277 +051271 +05121960 +051191 +051091 +050980 +050896 +05081996 +05081969 +050792 +050777 +05071964 +050674 +050582 +050574 +050569 +05051964 +050488 +05041965 +050391 +050386 +050376 +05031999 +050277 +050276 +05021969 +050194 +050193 +05011970 +05011960 +041272 +04121995 +04121967 +041181 +041180 +04111968 +041091 +041081 +040976 +04091997 +04091961 +040887 +040878 +040866 +040795 +040778 +040776 +04071997 +040696 +040676 +040581 +040506 +040475 +04042000 +04041962 +040379 +040291 +040284 +04021968 +04011968 +0329 +031283 +031277 +03121995 +031190 +031182 +03110311 +031079 +030987 +030979 +03091999 +03091996 +030884 +03081999 +030795 +030768 +03072000 +030691 +030677 +030578 +030560 +03051964 +03041967 +0304 +030378 +03032003 +03031998 +03031969 +03030303 +030280 +03022009 +03022000 +03021972 +03021971 +03021969 +03021967 +021281 +021273 +02121968 +021195 +021174 +020991 +020980 +020971 +02091998 +020896 +02081998 +02081968 +02081967 +020796 +020777 +020692 +020674 +02061998 +020493 +020491 +020480 +020479 +02041968 +020395 +020394 +020390 +020386 +02031999 +02021999 +02020 +020192 +020184 +020183 +020182 +02012000 +02011969 +02011968 +0199 +0156 +0131 +013013 +012345678910 +0115 +0113 +011195 +011193 +011184 +01111973 +01101969 +01091969 +010886 +010880 +010875 +01082000 +010776 +010682 +0106 +010579 +010570 +010569 +01051996 +010473 +01041969 +01031963 +010288 +010286 +01021966 +010194 +010162 +010159 +0072563 +006900 +0033 +0023 +0012 +000005 +00000007 +00000001 +0000000000d +****you +zzxxccvv +zz6319 +zverev +zues +zrjdktdf +zoulou +zodiak +zoMu9Q +zimmerma +zhjckfdf +zero00 +zealand +zaq1234 +zaq1 +zapped +zanuda +zaharova +zagadka +yyz2112 +yukon1 +yousuck1 +yourmom1 +yomamma +yfdbufnjh +yfcnz1 +yfcnz +yfcnfcmz +yelena +yankees7 +yakyak +yCWVrxXH +xohzi3g4 +xexeylhf +xcat +x12345 +wxyz +wright1 +wpoolejr +worms +wormhole +worldwid +wooten +woodwind +wonka +wombat1 +womack +wolves1 +wizard12 +withnail +within +winxclub +wilshire +willie12 +william7 +willi1 +wildman1 +wiktoria +wifey200 +widespre +whitewolf +whitaker +whirling +whatthef +wewe +wendall +welding +webman +weasle +wayout +waylon +waterbed +waswas +warcraf +wank +walleye1 +waderh +wabash +w1w2w3 +volvos80 +voluntee +vodka1 +vladimi +vlad777 +viperman +vinny1 +vinbyLrJ +vika2011 +vid2600 +vhou812 +vfvfktyf +vfvekbxrf +vfrcbvjdf +vfrcbvev +vfnehsv +vfifvfif +vfhufhbnrf +veterok +verna +vergesse +vaz2101 +vasily +vanilla1 +vangar +valves +valve +vallejo +valenci +upper +unknown1 +unforgiv +undertake +ujujkm +ujnbrf +ujhijr +ufhhbgjnnth +uekmyfhf +typical +type +twizzler +twista +tweety1 +tututu +turnb +turd +tura +tujhjdf +tubby +tuba +ttocs +ttam +tsv1860 +trytry +truckman +trot +trivium +triumph1 +triste +tripoli +trew +trapped +transits +tranquil +traffic1 +trader1 +towson +toutoune +tourist +touche +toront +tornados +toratora +toplay +topcop +tony_t +tompkins +tommylee +tommyd +tomek1 +tomcat1 +tom1 +tobia +toast1 +tman +tkachuk +tiziana +titstits +titani +tire +tintable +tinkle +timberwolf +timberlake +tightend +tigger99 +tigger11 +tigerboy +tiger22 +tiger200 +tiffy +tick +thorthor +thomas11 +thinner +thesnake +thesis +themoon +thehip +thebears +thd1shr +tgo4466 +terps1 +terces +tennis11 +temp01 +telecaster +teach +tea4two +tatoo +tapper +tapout +tanya123 +tangent +tane4ka +talonesi +tallulah +talisker +takayuki +tadmichaels +syrup +swollen +switzer +sweetpussy +swanny +swami +svetasveta +suzyq +suzieq +surfcity +surface +superted +supermax +superjet +super5 +sunghi +suit +suggest +suger +suerte +sudhakar +sucker69 +stunna +stuffit +stuart1 +stryke +strikes +stressed +strela +stoneman +stomatolog +stitches +stimpy1 +stgeorge +stevo +stevek +steve121 +sterne +stephany +stellina +steamy +stason +stasia +starrr +starline +starik +starburs +stacks +stack +ssecca +sr20dett +squealer +spurs123 +sprint1 +sprin +spit +spiritus +spiri +spencer2 +spam967888 +sovereign +soundman +soreilly +sophia1 +songohan +somers +sombra +soloyo +solomon1 +soloma +solnyshko +solidus +socks1 +soccer69 +soboleva +soaring +snowmass +snowie +snoppy +snookums +snippy +snapper1 +smythe +smooches +smokey12 +smokepot +smallfry +smacky +slutty3 +sliders +sleepy1 +skylane +skyblues +skelly +skate123 +sixgun +sitges +sissyboy +simone1 +simo +silvers +silver2 +sillyme +signup +siberia +shweta +shred +shoulder +shorter +shortdog +shokolad +shiva1 +shields +shelly1 +shaq +shanda +shamanking +shalimar +shagme +shaft1 +shadow3 +shadow22 +shaddy +shack1 +sexsells +sexisgood +sevisgur +severine +settlers +settle +servo +serve +sergey123 +sergeeva +serega123 +serdce +serbia +sentinal +senegal +segredo +seether +security1 +secured +sebast +sdfghjkl +scrubs +scram +scouse +scorpio7 +scarfac +scare +sayonara +saviola +savage1 +satelite +sasquatch +sasquatc +sashadog +sasha1988 +sarahc +sanches +samvel +samso +sammycat +samesame +samedi +sameas +salty1 +sailaway +sadies +sad123 +sabers +s5r8ed67s +rutabega +russo +russ120 +running1 +runfast +runescape1 +rummy +rulezz +ruffneck +rudiger +rubin +rrrrrrrrr +roundup +rounds +roulette +rosit +rosina +rosales +rolsen +rolls +rollo +rolf +roflrofl +rodney1 +rodgers +robertso +robbin +rjrfrjkf +rjcnzy +riven +richardson +richard3 +rhianna +rfhfrfnbwf +rfgecnfcerf +rey619 +revenant +rev2000 +reuters +reunion +residentevil +repytxbr +reptiles +renaud +remrem +relish +relayer +rehnrf +reef +redvette +redrocke +rednecks +redhair +red911 +reape +reanimator +realmadr +ravers +ravens1 +raven69 +raven3 +rattlesn +rapeme +rape +ranman +ranger02 +rando +rana +ramil +ralphs +rainrain +rainbow7 +radical1 +rachael1 +r1234567 +qwerty89 +qwerty2010 +qwaszxqw +quiver +qazxcdews +qazqwe +qazokm +q2w3e4r +putney +pussyca +pussy3 +pussy21 +pussy101 +pursuit +purpose +punt0IT +punksnotdead +punjabi +puneet +pumpum +puhpuh +psw333333 +proof +prong +project1 +production +prober +prism +pretende +pressman +premiumcash +preciou +preciosa +prapor +positiv +porkypig +poptarts +poppydog +poopee +ponytail +pondscum +pompon +polygon +politic +poligon +poker123 +pointe +poetic +pmdmsctsk +pleomax +playstation3 +planet1 +pippa1 +pippa +pinkpant +pikach +piglett +pickel +picass +photosho +phoebus +phil413 +phase +phanto +phantasy +peterman +perry1 +perrito +pepper2 +penelopa +pelmen +peggy1 +peek +peanut12 +peace123 +pavlin +pause +patrick7 +path13 +pastry +password21 +password10 +passwo +passw0rd1 +pass10 +partys +partyon +particle +partagas +parfilev +parazit +paquito +paperclip +pantss +panget +pander +palenque +paintball1 +painful +padre +p1234567 +owen10 +overton +osipov +orthodox +orgasmic +orchids +ooooooooo +onemore +oneluv +omgwtfbbq +omg123 +omega13 +omaha +olsen +olli +oleg1995 +okie +odinthor +odense +odelay +number20 +nukem +note +noonie +nomar +nomames +nolan1 +nokiaa +nokia6630 +nokia5320 +noisette +nofate +nofags +noddy +nissan350z +nini +ninety +nimda +nikki123 +nightime +night1 +nigge +nicklas +nicetry +nibble +nfymrf +neworlea +newhome +newera +nestea +nescafe +neronero +nermin +nenit +nemrac +negrito +needsome +necroman +ncstate +nccpl25282 +nathan0 +natale +natala +nara +napol +napier +nanotech +namtab +nadia1 +nadege +n8skfSwa +mystikal +myron +mynuts +mylady +mxyzptlk +mwss474 +mutiny +mustard1 +multiplelog +mulder1 +muggins +muffy1 +muffin12 +mufc +mtwapa1a +msdn +mrlover +mrkitty +motorcycle +motoman +mordred +morbius +moomoo1 +moom4242 +montgome +monte1 +montagna +monsta +monopoli +mono +monkeys1 +monkey66 +mongrel +money111 +monet1 +monda +moll +moline +module +modest +miyamoto +mithrand +misty2 +misterio +mishel +minogue +minnie1 +minimax +minhasenha +mingming +miner +mineonly +milwaukee +miller2 +milky +milkshake +mile +mikes +mike44 +mike26 +miguelit +mignon +midas +mickeymo +michaell +mets69 +merlin99 +merl1n +merckx +mercenar +mensuck +melvins +melone +melena +mekong +megryan +megaman1 +meeeee +meee +medvedeva +medics +mcgill +mcduff +mayflowe +max007 +mattress +matia +matheus +mashenka +mashed +marykate +maryjoy +marwan +marusa +martin2 +marry +married1 +maroon5 +marlin1 +marlee +markov +mark01 +mariska +mario64 +marilena +marica +margaret1 +marcin1 +marcelle +maral +maomao +mantle7 +manstein +manni +manga1 +mandys +mandragora +mandarinka +mancity1 +mammy +mallard1 +making +majick +maiyeuem +maimai +mahimahi +magistr +madison9 +madison3 +madam +macker +machado +macdonal +m1chael +lyubov +lyrics +lynda +luxury +luthien +lumberjack +lucretia +lucky6 +lucky12 +lubbock +luap +lowe +lovey +loveone +loveman +lovebugs +love01 +losfix16 +lorna +lordsoth +lordik +loosee123 +lool +longboar +lolnoob +lokiju +logica +logan123 +lodge +locate +loca +lmfao +lloyds +lloyd1 +llama1 +liverpoolfc +liveoak +lisichka +lisabeth +lipper +lionsden +linus1 +linksys +lindeman +limo +likesit +lighters +lifetec +lifeguar +lieben +licklick +libras +liana +lewie622 +leverage +leto2010 +leolion +length +legola +legioner +legalize +leftover +left4dead2 +leduc +lebedev +laurab +latour +latics +lateralus +laster +larrybir +lardass +langston +landis +lala123 +lakers12 +laforge +ladybu +labels +l0swf9gX +kzsfj874 +kwiettie +kurupt +kurtcobain +kurgan +kukuku +kubota +krayzie +komlos +kolesnik +koala1 +knight12 +klubnika +klinker +kimota +kilokilo +killer23 +killer11 +kikiriki +kierra +kickbutt +kfnju842 +kensai +kendall1 +kekskek1 +keiths +keithb +keith123 +keen +kcaj +kbdthgekm +kazu +kats +katrine +kathrine +katekate +karting +karabas +kangoo +kamal +kaliningrad +k1ller +k1234567 +junky +jungfrau +julius1 +juggler +juggalo1 +jtjtjt +jose98 +joschi +jordan99 +joop +jonnyboy +jonnyb +joiner +joey21 +jocko +jmol01 +jkl123 +jjones +jijiji +jgordon +jetblue +jesus2 +jerrod +jerom +jeremia +jens +jeepin +jeanjean +jaydog +jasong +jason25 +jasmina +janbam +jamming +jamie123 +jami +jamesk +james3 +jamal1 +jake99 +jacob2 +jacked +jackas +jaba +j0nathan +ivanka +ivan2010 +isabel1 +irwin +ironmike +ironic +ironfist +irocz28 +irock +irina1 +irie +iop890 +intoit +intersta +insignia +inhere +infrared +incoming +inbed +iloveyou123 +ilovejesus +iloveboobies +illuminati +igor123 +igloo +iglesias +ifufkbyf +iecnhbr +idea +icepick +iamtheman +hydrant +hussein +hurst +hunter22 +hungwell +hummerh2 +humbert +huligan +hornball +hoppers +hooligans +hoodoo +honky +honker +homer69 +holsten +holman +hollister +holera +hohohoho +hobbes1 +hj8Z6E +hillcres +hideout +hhhhhhhhhh +hfvbkm +heyjude +hexagon +heron +hendrick +hen3ry +hemligt +helpme2 +helpful +helloall +hello22 +heckfyxbr +heckfyf +hebert +headhunt +haus +harrow +harmony1 +harddriv +harami +hangten +handsoff +hana +hammered +haloreach +halima +hairdo +guppie +gumshoe +gumper +gulf +guernsey +grundle +grim +grillo +grill +greer +greentre +greeneyes +grandorgue +grandma1 +graci +graceland +grace17 +gosling +goose2 +gooner1 +goodgame +gooch +gold12 +gogosox +godswill +godeep +gnorman +gnome +glock9mm +glock40 +given +giuli +girly +ginseng +gillian1 +gigant +giga +ghgh +gfhfcjkmrf +gfgf1234 +gfgf +gfedcba +gfccgjhn +gevorg +gevaudan +getsum +gerrit +germa +geri +georgin +gcheckout +gbrfxe +gazza1 +gazeta +gawker1 +gauss +gatogato +gatlin +gary123 +garfield1 +gammas +gamma1 +gamlet +gamess +gallon +fylh.irf +fy.njxrf +futuro +funboy +fumble +fugitive +fuckyouguys +fuckyoubitch +fuckyou12 +fuckoff2 +fuckmyass +fucklife +fubu +fritzy +friend1 +freeee +freedom4 +freed +fraise +foxwoods +fox123 +forzima +forsure +forever21 +ford22 +forbidde +footboy +foodie +foodfood +fontana +foiegras +flooring +flog +flippers +flicker +flea +fldjrfn +flblfc +flavour +flashbac +flap +fktdnbyf +fitte +fishlips +firstson +firehose +firefly1 +fire69 +fiona1 +finesse +find +fighting54 +fifty50 +fifa2008 +fhnehxbr +fghbjhb +fetter +festina +ferrum +ferrell +ferraris +fermer +fenrir +felder +fedex +februar +fdhjhf +fatkid +fatback +farmer1 +fanny1 +fancy1 +family5 +fallen1 +fajita +fairy +fairlady +fair +fahbrf +facade +fabiano +eyedoc +eybdthcbntn +eveli +eurocard +eugene1 +estefan +esteem +espada +eshort +eruption +erotik +ern3sto +erich +ensign +engine1 +engaged +endure +encarta +empathy +emmanue +emilys +emerald1 +elvis69 +elmer251 +ellison +elegant +electra1 +election +eldridge +ekilpool +egyptian +educatio +edmundo +economics +eagles20 +duvall +dutton +durban +dunca +dumpling +dummys +dumbshit +dumbo +dumbdumb +duisburg +dududu +dubai +drums1 +drumer +drogba +dredre +drawer +dragon64 +downunde +downtime +dorset +doormat +doofer +doodad +doneit +donal +domi +dochka +dmxdmx +dmh415 +dkflbdjcnjr +djljgfl +divinity +diversio +disneyland +diplom +dionis +dinamite +dimon4ik +dimedrol +dima1994 +diller +dignity +diablos +dgthtl +dfcz123 +devon1 +devilish +despair +denzel +denison +demolay +deliciou +delfi +delacruz +deflep27 +deez +deeppurple +deep111 +debbie69 +deangelo +deandre +de1987ma +dddddddddd +dctvghbdtn +dctvghbdf +daybreak +davidw +davidr +david3 +daulet +dasha1 +daruma +dark666 +darion +darin +darcy1 +dannyb +danielle1 +daniel01 +dallas12 +dallas11 +daffyduc +dado +dabble +czar +cytujdbr +cybernet +cxzdsaewq +cums +cumlover +cum123 +crumpet +cruiser1 +cronaldo +croco +crjhjcnm +cristopher +cribbage +creative1 +crass +crashed +cracked +cptnz062 +costco +cossack +cornel +cornball +corinth +cooney +cool11 +conni +conley +condon +concac +conair +comrade +compress +completed +compaq3 +coleman1 +cokeisit +cocoa1 +cobweb +cobra123 +coachman +co2000 +cnhfyybr +cmoney +clinic +climbon +cliff1 +clementi +clarisse +claims +cjytxrj +cjhjrf +cire +cious +chupa +chunli +chum +chubba +christian1 +chorus +chorizo +choices +chloe123 +chivalry +chinna +chinita +chihuahua +chiar +chet +cherri +chelsea0 +cheerleader +cheek +checked +charro +charmer +charlot +charle1 +chariot +character +changepa +champio +chalmers +chalky +chaise +chacho +cessna17 +cerulean +cerro +ceramic +ceisi123 +cecili +cbrown +cbr600f4 +cazzo1 +cateye +catering +catbert +caseih +carrillo +carolyn1 +carnegie +carlyle +carlit +carin +caracol +caper +candlebo +candide +camshaft +camron +callista +calculator +calbears +calabria +cahill +cadet +cachou +cabinets +cabible +bvgthbz +buzzman +butterfly1 +bushes +busdrive +burrows +bundas +bumerang +bulls123 +bullpen +bugsbugs +bugged +bugeye +bugaboo +buffy16 +buffaloe +buenos +buddy23 +buckwild +bsheep75 +bryce1 +brunswic +bruno12 +brunner +bruder +broadband +brianm +brian2 +brentford +braves95 +boutique +bottles +botswana +bossdog +bosco123 +borisova +boriska +bootycal +booo +boognish +boog +boodle +booboo69 +bonethugs +boneman +boludo +bologna1 +bollix +bokbok +bogos +bodega +bobster +bobbym +bob2000 +bmw320i +bmw318i +bluetick +bluesea +bluedevils +blub +blowup +blown +bloembol +blitzen +blasters +blade123 +blackpool +blackone +blacker +blackdick +blac +bitche +birthday6 +birthday10 +billy2 +billiam +bill2 +bigwig +bigwave +bigtom +bigtime1 +bigsur +bigjon +biggi +bigfan +bigdo +bigbro +bibble +beverl +betabeta +berta +benidorm +bengals1 +bellaboo +belgorod +belgario +behave +begemotik +beegee +beatles4 +bearing +beardown +bearclaw +bearcat1 +beagles +bball23 +batman11 +bathtub +basspro +basile +bartolo +bartek1 +barsoom +barrynov +barrera +barrakuda +barney12 +barney11 +barnaul +barbosa +barbecue +barbaris +banter +banshee1 +baltazar +baller23 +baksik +bakker +bajskorv +bailey2 +bahram +bagdad +badmojo +badbob +backward +bacardi1 +baby69 +babcock +bApeZm +b00bies +b00b00 +azzurra +azonic +ayacdc +axelle +avocet +avalon1 +available +automatic +aurinko +august25 +august12 +august11 +audio1 +assembler +asilas +ashton1 +asel +asdfrewq +asdf67nm +asdf4321 +arun +artyom +arsenic +arsenal2 +arschloc +arnie +armour +armadillo +archmage +arcanum +arbiter +araceli +applied +apple13 +appel +aolcom +ants +antoxa +antero +antalya +ant123 +annann +anjela +aninha +anglia +angi +angelique +angel99 +angel69 +andy11 +andreea +andrea11 +anastasiy +analslut +amistad +amigo1 +amadeus1 +altosax +altavista +alone1 +almaz666 +almas +allan123 +aliya +alison1 +alexa1 +alex23 +alex02 +alesia +alena2010 +alekseev +aleksand +alberto1 +alber +albator +alaska1 +alanfahy +akitas +aircav +aileron +aidan +agricola +afhfjy +advisor +admin2 +adjkadjk +adel +actress +acting +acorns +acmilan1 +acme34 +acdeehan +abundance +abroad +abcde1 +abc125 +abc123abc +abacabb +aamaax +aaa12 +a3jTni +a1234b +a1234567890 +a121212 +Zidane +Zeppelin +Yellow +X5dxwp +Wizard1 +Warrior1 +Warcraft +WILLIAMS +Vikings +Viking1 +Victory +UP9X8RWw +UNITED +Tristan +Tiberius +TeFjPs +THUMPER +TAURUS +System +Superma1 +Success1 +Strider +Steven1 +Starwar1 +Stalker +Snowball +Smokey1 +Skippy +Services +Sending +Scott +Scotland +Schalke +SLIPKNOT +SIERRA +SCORPION +SCARFACE +Ruslan +Rommel +Raven1 +Rascal +ROBERTA +REGGIE +REDSKINS +Qwerty02 +Qqqqqq1 +Qqqqq1 +Qazwsx123 +Q1W2E3 +Pppppp1 +Platinum +Peaches +Pass1234 +Paris +P030710P$E4O +Ooooo1 +ONLINE +None +Nissan +NdsHnx4S +Nathan1 +NICK +NEMESIS +NATHAN +Mobile +Mickey1 +MOUNTAIN +MARINA +M0b1l3 +Ludwig +Lindsey +Lieve27 +Larry +Kingdom +King +Kevin1 +Kermit +Johnson1 +Jimandanne +Jeremy1 +Jamie +JASMINE +InstallSqlSt +Information +Iiiiiii1 +Hooters1 +Hhhhh1 +Harrison +Hansen +HXxrVWCy +HUMMER +Gilbert +GREGORY +GORDON +Fuckoff +Freddie +Franklin +Francoi +Fireman +Fantasy1 +FUCKOFF +FLORIDA +FBi11213 +F8YruXoJ +Enterpri +Enter1 +Eddie1 +EAGLE1 +EAGLE +Disney +Digger +Death1 +DOCTOR +DERRICK +Cv141ab +Creative +Co437at +Cmu9GgZH +Christ +Cheese +Cdtnkfyf +Cb207sl +Catherine +Carla51 +CHESTER +CELTIC +CATS +CADILLAC +Butthead +Brutus +Bo243ns +Blazer +Bettina +Berlit +Ber02 +Bailey1 +Baggins +BRITTANY +BIGONE +BEAR +BABYGIRL +Avatar +Avalon +Atlantic +Assword1 +Arlington +Annette +America1 +Ac2zXDtY +ALEXIS +9989 +98798798 +9811020 +9595 +944turbo +9379992q +926337 +9009 +8XUuoBE4 +8VjzuS +8928190a +888555 +8823 +8686 +8651 +85852008 +80637852730 +7inches +7elephants +785612 +779977 +7778 +7700 +7669 +76543210 +7476 +7467 +7452tr +7418529630 +709394 +705499fh +6900 +6869 +68686868 +678901 +6768 +667766 +666420 +6543 +60606 +5tgbnhy6 +57392632 +564564 +5622 +5612 +5598 +5577 +5556 +5551298 +550722 +5505 +54775477 +546546 +5422 +5411pimo +5400 +531879fiz +5263 +5262 +5255 +5200 +51094didi +4iter +49ers1 +4976 +48774877 +4808 +4807 +4712 +46775575 +4666 +45auto +45685 +456123a +455445 +4546 +4541 +4520 +4507 +450000 +4469 +4434 +443322 +442200 +4377 +4294967296 +425425 +4233 +4225 +4126 +4123 +411411 +4077mash +4034407 +4013 +4001 +3techsrl +3f3fphT7oP +38gjgeuftd +369874125 +3657549 +3630000 +3615 +3578951 +3578 +34778 +3388 +337733 +33693369 +33334444 +321cba +3215 +3194 +316497 +31323132 +311280 +311278 +31121997 +311092 +311078 +31101969 +310894 +31082000 +31081996 +310594 +310576 +310381 +310379 +310373 +31031971 +310197 +310183 +310180 +31011965 +3100 +3052 +301073 +301072 +301070 +30101968 +30091969 +300893 +30081970 +30081969 +30081968 +300775 +30071995 +300693 +30063006 +30061969 +300574 +300572 +30052008 +300392 +30032002 +30031968 +300185 +30012000 +30011999 +30011967 +2gether +291276 +29121996 +291190 +291187 +291181 +291173 +291078 +29101973 +290975 +29091999 +29091997 +29091960 +290897 +290896 +290892 +29081998 +290794 +290772 +290695 +290678 +290674 +29061962 +290595 +290578 +29051963 +29051959 +290492 +29042000 +290394 +290392 +290381 +29031998 +29031964 +290280 +290195 +290194 +29011997 +281268 +28121997 +28121969 +281187 +281169 +28111967 +281073 +28101970 +2809 +280895 +280875 +28081971 +28081970 +280778 +280773 +28071960 +280707 +280692 +280685 +280673 +28061961 +28051968 +28051967 +28051966 +280481 +280464 +280396 +28031973 +28031964 +280294 +280283 +280274 +28011999 +28011966 +2766 +2715 +271295 +271279 +271278 +27121995 +27121969 +27121961 +271170 +27111998 +271095 +271091 +27101973 +27101967 +270992 +270980 +270978 +270895 +270879 +27081998 +27081972 +27081969 +27081966 +270776 +270768 +27072000 +27071963 +27071962 +270677 +27061970 +270572 +270475 +27041966 +270395 +270379 +270374 +270362 +270295 +270280 +27021965 +270196 +270195 +270177 +27011998 +27011968 +267ksyjf +26121997 +26121966 +261095 +26101966 +260978 +260977 +260894 +260889 +260879 +26081967 +26081962 +260795 +260774 +26071965 +260695 +260673 +26062000 +26061960 +2606 +260574 +260475 +26041963 +260395 +260394 +26031968 +26031963 +260293 +26021969 +26021966 +260181 +260175 +26011969 +2589 +2587 +258654 +2570 +2564 +2562 +2521 +251293 +251277 +25121998 +25121969 +251173 +25111974 +25111966 +251094 +250996 +250970 +25081999 +250794 +250775 +250771 +25071971 +25071969 +25071964 +25071960 +25061969 +25051967 +25051959 +250505 +250496 +250495 +25041999 +250375 +25031967 +25031962 +25031956 +250294 +25022000 +25021961 +250196 +250195 +250172 +25011968 +25011965 +25011962 +25011961 +250100 +248ujnfk +2477 +246890 +246824 +2465 +2456 +2453 +2433 +24111998 +241094 +24091970 +24091968 +24091960 +240896 +24081961 +240794 +240792 +24071973 +24071967 +240692 +240675 +24061970 +240570 +240562 +24051961 +24041962 +240380 +24031999 +24031998 +240294 +240275 +240197 +240179 +240173 +2359 +232232 +2313 +231294 +231273 +231178 +231177 +23111998 +23111995 +23111958 +231077 +23101998 +230976 +230970 +230896 +230874 +230783 +230779 +23071965 +230671 +230670 +23061996 +230596 +230595 +23051968 +230396 +230377 +23031998 +23031969 +23031964 +23031961 +230278 +23021965 +23021964 +230194 +23011965 +2272 +2264 +2257 +2254 +2217 +2216 +221264 +22122212 +22121968 +22111958 +221092 +22101969 +22101967 +22092000 +22091969 +22091964 +22091960 +220896 +220893 +220868 +220866 +22082000 +22081969 +22081967 +22071960 +22061960 +22051970 +220479 +220470 +220374 +22031969 +22031962 +220263 +22021966 +220183 +22011956 +220022 +2187 +2183rm +2176 +216216 +2151 +2150 +211276 +211268 +21121965 +211174 +211112 +211082 +211081 +21101997 +21101996 +210996 +210995 +210980 +210973 +21091968 +210881 +210878 +210876 +210794 +21071997 +21061999 +210593 +21051969 +21051968 +21041968 +21041966 +21041963 +210370 +21032103 +210294 +210280 +210277 +210276 +210273 +21021956 +21011997 +21011969 +21011966 +2052 +2031 +2025 +2014 +201295 +20121969 +201201 +201198 +201191 +20111963 +201091 +201080 +201062 +20101997 +200994 +200978 +20091998 +20081997 +20081964 +20081961 +20071997 +20071963 +20071957 +200673 +20061970 +20061967 +20061960 +200495 +200376 +20031961 +20022003 +20021968 +20021964 +20021962 +20011966 +20011961 +1z1z1z +1qwertyuiop +1qaz@WSX +1qayxsw2 +1q3e5t7u +1grizzly +1chris +1a2s3d4f5g6h +1Morgan +1Mickey +1Maggie +1Joshua +1Jjjjj +1Fucker +1Compute +1Chris +1Asshole +1Aaaaaa +19955991 +199423 +199412 +198919 +198787 +198600 +198555 +198519 +197600 +197430 +197197 +197100 +19441944 +1924 +19181918 +191291 +191290 +19121960 +191189 +191185 +19111958 +191091 +19101969 +19101965 +19091970 +190892 +19081969 +19081964 +190789 +190681 +190676 +19051961 +190491 +190480 +19041969 +190387 +190381 +190377 +190374 +19031965 +19031959 +190291 +190286 +190285 +190277 +190186 +190180 +19011964 +19011959 +1814 +181293 +18128 +181277 +181271 +18121963 +18111998 +181093 +18101966 +18091997 +18091968 +180879 +18082000 +18081957 +180794 +180787 +180778 +18071997 +18071963 +180678 +18061963 +18061959 +180595 +180495 +180481 +18041969 +180395 +180393 +180390 +180375 +18031971 +180295 +180274 +18021998 +18021969 +18021965 +180192 +18011964 +1723 +171277 +171182 +17112000 +171076 +17101998 +17101969 +17101966 +170992 +170980 +17091961 +170873 +17082000 +17081998 +17071994a +17071961 +170695 +170679 +170674 +17061969 +17061966 +17041971 +170393 +170284 +17022000 +17021970 +17021968 +17011957 +16911691 +166666 +16473a +1640 +1625 +1623 +1618 +1614 +161294 +161271 +16121968 +161195 +161170 +16111968 +161096 +161092 +161075 +16101978 +160995 +160994 +16091970 +16091959 +160893 +160881 +160877 +160870 +16081967 +16081966 +160794 +160789 +160775 +16071961 +160671 +160575 +160572 +16051997 +16051958 +16041969 +16041963 +16041962 +160391 +160376 +16031999 +16031962 +16031959 +160293 +16021961 +16021959 +160197 +160195 +160194 +160193 +16012000 +16011977 +16011969 +16011968 +15915 +1573 +1565 +155555 +15362 +1533 +1531 +15261526 +151500 +151281 +151273 +15111969 +15111966 +15101969 +15101965 +150994 +150991 +150975 +15091998 +15091958 +150893 +150864 +15081961 +150793 +150774 +15071970 +150672 +15061995 +15051967 +15051963 +150496 +150490 +15041966 +150375 +150371 +15031970 +15021964 +15021502 +150178 +15012000 +15011968 +1479 +147789 +1474 +1470 +1447 +1429 +142536789 +14151415 +141290 +141273 +14121996 +14111968 +14081970 +140798 +14071968 +14071964 +14071789 +140696 +140678 +14061961 +140578 +14051970 +14051965 +14051960 +140491 +140461 +14041969 +14041966 +14041963 +140396 +140392 +14031997 +140297 +140268 +140176 +14011996 +1385 +13601360 +1357642 +1347 +13141314 +13121997 +13121968 +13111971 +13101999 +13101966 +130993 +130974 +13091999 +13091975 +13091959 +130875 +130770 +13071972 +13071968 +130694 +130692 +130676 +13061971 +13061970 +130576 +130572 +130563 +130495 +130475 +130377 +130373 +13031964 +13031957 +13031956 +130271 +13011970 +1299 +1295 +1291 +1282 +1261 +125412 +124365 +123ert +123edc +12399 +123678 +12345rewq +12345qqq +123456zz +123456qwer +1234567qw +1234567m +123456789i +123456789e +123456789c +123456789as +12345670 +123456654 +1234554321q +12345$ +123445 +12343412 +123123f +123123123123123 +12300 +12281228 +122448 +121970 +121298 +12128 +121259 +12121997 +121193 +12111963 +121066 +121063 +12101999 +12101970 +12101966 +120997 +120996 +120970 +120965 +12091999 +12091970 +12082000 +120795 +12071965 +120697 +120674 +120598 +120597 +120571 +12051969 +120496 +12041966 +120394 +120299 +120278 +120276 +120270 +120269 +12021971 +120163 +12011971 +1195 +1191 +118a105b +1182 +118118 +11661166 +1166 +1158 +115511 +115115 +11281128 +112482 +112244 +112233445 +11223311 +11201120 +111a111 +111987 +111870 +111568 +111292 +111281 +111222q +111194 +111173 +111172 +111163 +11111999 +11111118 +111100 +111082 +111077 +11098 +110969 +110894 +110877 +11081968 +11081959 +110695 +110671 +11061970 +11061964 +110491g +110474 +110473 +11042001 +11041957 +11031966 +110299 +110271 +11021998 +110176 +11011967 +11011963 +10987654321 +1048 +1042 +102878 +102575 +102030405 +101297 +101273 +101264 +101195 +10111971 +10111960 +1011111 +10111 +101099 +101097 +1010220 +10101961 +101001 +100years +100999 +100974 +10091970 +10082001 +10081997 +10081968 +100773 +10071968 +10071967 +100672 +100667 +100571 +10051968 +10051962 +10041998 +10041968 +10031968 +10031964 +10031960 +100295 +100281 +100265 +10021967 +100193 +100176 +100168 +0u812 +0cDh0v99uE +0925 +091288 +091276 +09121972 +091186 +091184 +091178 +09111969 +091092 +091086 +091079 +091071 +09101968 +090993 +090992 +090987 +09091968 +090871 +09081969 +0908 +090791 +09071999 +090691 +090678 +090670 +09061968 +09051966 +09051958 +090485 +090473 +09041962 +090387 +090380 +09031997 +09031964 +09021998 +090189 +09012000 +09011964 +0889 +0825 +082288 +081286 +08121976 +08121964 +081190 +081182 +081174 +081083 +081074 +080992 +080984 +08091970 +08091966 +080894 +080875 +080873 +08081961 +080789 +080784 +080775 +080689 +080684 +080679 +080588 +080586 +080584 +08051968 +08041966 +08041965 +08041961 +080394 +08032000 +080289 +080288 +080285 +08021964 +080184 +08011996 +08011963 +0790 +0773417k +0718 +0713 +071292 +07121974 +071194 +071191 +071180 +071170 +07110711 +071084 +07101971 +07101969 +070994 +070985 +070975 +07091997 +07091968 +070893 +070885 +07081966 +07081959 +07061996 +07051964 +070481 +07041996 +07041962 +07021997 +07021967 +07011970 +07011962 +0630 +061292 +061287 +061283 +061271 +061184 +061179 +06111964 +061069 +060975 +06091971 +060876 +060873 +06081961 +060783 +060778 +060694 +060682 +060680 +060675 +06062000 +06061962 +06051998 +06051971 +0605 +060480 +060477 +06041996 +06041969 +06041961 +060382 +060381 +060295 +060286 +060197 +060194 +06011967 +0529 +0527 +0525 +0523 +0516 +051276 +051275 +05121971 +051189 +051175 +05111998 +051095 +051089 +051086 +051073 +05101968 +05101963 +050992 +050991 +050975 +05091958 +050892 +050887 +050885 +050872 +05081999 +05081963 +05071968 +050693 +050692 +050678 +05061960 +050594 +05051960 +050485 +050470 +05041998 +05041973 +05041969 +05041966 +05041963 +050395 +050392 +050390 +050378 +05031965 +050291 +050273 +05021965 +05021964 +050191 +050189 +050180 +05011972 +0494 +04121974 +04121966 +041184 +041171 +04111999 +04101996 +04101995 +04101970 +040987 +040981 +04091965 +04081962 +04081960 +040779 +040777 +040694 +040692 +040677 +040587 +04051967 +04051963 +040494 +040489 +04041965 +04041960 +040385 +040374 +040364 +04031963 +040281 +040196 +040184 +040181 +04011971 +04011965 +0390 +0385 +0328 +03121964 +031192 +031181 +031176 +031077 +03101968 +030978 +030888 +030870 +03081969 +03081968 +03071967 +03071965 +03071959 +030694 +030575 +03051997 +03051965 +03051960 +030493 +03042008 +03032007 +03032005 +03032000 +030296 +030283 +030282 +030279 +030278 +03022008 +030180 +030177 +030175 +030172 +03011967 +03011963 +0284 +0226 +0218 +021275 +021270 +02121967 +021177 +02111965 +021091 +021073 +02101997 +02101968 +02101963 +02091996 +02091958 +02081957 +020773 +02071998 +020693 +020680 +020676 +020675 +02061969 +020576 +020569 +020489 +020477 +020473 +02041999 +020389 +020362 +02031964 +020279 +02021969 +02021968 +020191 +020186 +020179 +02011966 +0188 +01478963 +0147852369 +0129 +0128um +01234567890 +01213 +0121 +0118 +011279 +01122010 +01122000 +01121966 +011183 +01111972 +01111967 +01111961 +011088 +01102010 +01102000 +01101998 +01101970 +01101965 +010978 +010974 +010971 +01091999 +010881 +01081964 +01071997 +010692 +010672 +01061966 +010587 +010573 +01051998 +01051968 +01051955 +01042011 +01041964 +01041958 +010399 +010392 +010371 +010287 +010276 +01021965 +01021963 +01021959 +01021955 +010196 +010156 +010153 +00998877 +0083 +0025 +0017 +0010 +00070007 +0006 +00009999 +000099 +000021 +00000a +zygote +zxcasdqw +zwezda +zldej102 +zircon +zippo1 +zimmerman +zidan +zenzen +zarema +zaqwer +zane +zakzak +z123456z +yuyuyu +ytnhjufnm +yourass +youare +yjdjcnbf +yfl.irf +yesenia +yankees9 +yankees3 +yanina +yamakasi +y4kuz4 +ximen +xenogear +xbox36 +x4wW5qdr +www333 +wrexham +wqwqwq +worth +worf +woody123 +woodpony +wolfman1 +wolfe +wm2006 +witness +without +winstons +wink +windward +windsor1 +wills +willows +williamm +wilkie +wichsen +whowho +whitesta +whine +whateva +whalers +wetworks +wetwilly +wetcunt +western1 +westend +west123 +welch +week +webguy +wayfarer +washear +warlords +waring +waratsea +walther +walsh +walsall +wack +wLTfg4ta +voldemar +vladimir1 +viva +virgilio +viper12 +vinyl +villevalo +villas +villain +vijay +vibes +vfvjyn +vfvfgfgf123 +vfvf2011 +vfrcbvvfrcbv +vfr800 +vfiekmrf +vfhvtkflrf +vetalik +verochka +verlaat +venom1 +veloce +vasilisk +vasilina +vasco +vFDhif +usopen +usethis1 +uranium +upsman +unhappy +unclesam +unB4g9tY +ulyana +ultra123 +uliana +ujkjdf +ubique +twoone +twins1 +twink +tweaker +turtl +turkiye +turandot +tunisia +tumtum +tumadre +tulsa +tuff +truth1 +troop +tristram +trento +trendy +treats +travel1 +trantor +trailer1 +towtruck +towncar +touring +topdawg +topaz1 +tootall +toolong +tony88 +toltec +todiefor +toby1 +tobi +toadtoad +tlbyjhju +titmouse +tiribon12 +tingle +timt42 +timmy123 +timberland +tillman +tijuana +tigres +tigerpaw +tiffany2 +thx113 +throw +thrall +thorny +thordog +thoradin +thomas13 +thomas10 +thingy +thicluv +thiago +theodor +themaste +theking1 +thekids +thehun +thefox +thedead +thechamp +texan +testin +teodoro +tekken3 +teh012 +teepee +teenslut +teens1 +teenlove +teddies +tedbear +tears +tazzer +taucher +tass +tasman +tashas +tapioca +tanusha +tampon +talula +tall +talktome +taitai +taison +tails +sydney12 +swissair +sweety1 +sweett +sweet2 +sweeet +suzann +surfsurf +supermario +supercoo +superbowl +sunnyd +sunny7 +sundaypunch +sun123 +summer07 +sukkel +suite +sucka +stumps +studen +struggle +stool +stockcar +stingers +stick1 +sthgrtst +stevenso +steve2 +staticx +starz +starwood +startnow +starr1 +stark +stanza +standup +stalker123 +stakan +stain +stagger +st1100 +ssvegeta +ssap +squeeky +spurss +spork +spookie +sponsor +spirits +speedie +speculum +speciali +specboot +spank1 +spaghett +spackle +southbay +sorted +sorokina +sophie2 +sooty +somalia +solutions +solus +solovey +solitair +solidsna +sokada +sofaking +soccer33 +snusmumrik +snowey +snowball1 +sneaks +smokey2 +smokers +smokeone +smokee +slon +slip +slicky +slick123 +sleipnir +sleigh +skywalk +skripka +skinner1 +skidmark +skelton +sirocco +singe11 +singe +simpleplan +simpl +simba2 +silver11 +silke +silkcut +silenthill +signon +sign +siegel +shyanne +shrek +shoeman +shockers +shivani +shithappens +shirley1 +sher +sheikh +sheet +sheen +shdwlnds +shawn41 +shave +shashi +shash +sharona +sharon69 +sharky7 +sharkie +shark01 +sharif +share +shanon +shane123 +shalo +shaken +shahrukh +shafted +shaffer +shader +shabby +sexmania +sewanee +servis +serrano +serina +serik +sergio1 +serendipity +serenada +sequel +send +semsem +selfok2013 +selector +sektor +seeme +seattle2 +seashell +searchin +scsa316 +scrumpy +scrub +scoubidou6 +scotto +scorpio2 +scooter6 +scooba +schecter +scene +scarlets +scale1 +scabby +sausage1 +satire +sassy123 +sasha1994 +sarkis +sarah69 +sarah2 +sanman +sanek +sandy69 +sandy2 +sandoval +sanctuar +sanchez1 +samy +samadhi +sam +salosalo +salguod +sakur +saimon +sailing1 +safeu851 +sada +saber1 +s12345678 +s0ccer +ryslan +rustler +rushfan +rugburn +ruffruff +rse2540 +royce +rottweiler +rotor +rotciv +rossignol +rosen +roots +roosevel +roof +ronjon +romawka +rockme +rock69 +rock12 +rocawear +roby +robinh +robi +robert99 +robert11 +riverplate +ripcord +riobravo +rifraf +rifles +rhode +rhodan +rhind101 +rfyfgkz +rfnfhbyf +rfktylfhm +rfhnbyf +resolute +requin +repmvbx +repeat +renren +reneee +remove +rekbrjdf +rehjgfnrf +reece +redwings1 +redsand +redoak +redemption +reddawn +redbird1 +rebound +rebenok +rebel2 +rebecca2 +realman +rdgpL3Ds +ravshan +ratty +ranma12 +ranger69 +randy2 +rampant +ralston +rakker +raju +rainfall +raincoat +rail +raiders2 +rafter +raffael +radiatio +racquel +rachele +qwertyz +qwerty789 +qwertgfdsa +qwer1209 +qweqaz +quinton +quintana +quimby +queeny +qbert +qaz12 +qawsed123 +qaqaqaqa +qantas +q1w1e1 +q12345q +puttana +puszek +pussybitch +purple2 +puppets +pumpkin2 +pumbaa +pullup +pullman +pukpuk +pudge1 +puddy +publish +pub113 +prosperity +promises +prisca +preteen +premier1 +preeti +precise +powwow +powerstr +poussin +poupou +potty +potter1 +postcard +position +portsmouth +popp +poo_ +pompano +polonia +polkaudi +polizei +pokemons +pointers +poidog +pocono +plethora +playme +playgolf +plates +pipes +pinokio +pilsbury +piloto +piggie +pica +phish123 +phineas +philips1 +philadelphia +pewter +petit +petal +pepsiman +pepluv +peopl +pentagram +penske +penny123 +pengui +pender +peggysue +peggy12 +peerless +peepshow +paws +pawel1 +patrick0 +passout +pass999 +parkland +pariss +paravoz +panman +pandor +pandabear +pancreas +panasonik +palmeiras +painter1 +pager +pacpac +packer1 +pacheco +p3nnywiz +p0o9i8u7y6 +ozzy666 +overmars +overdriv +oranges1 +oou812 +oooppp +ones +oneida +omomom +omnibus +ololo123 +oleary +oldguy +okmnji +oiseau +oink +ohrana +october8 +oceanic +observer +oboy +nyyanks +number3 +notmine +northstar +noon +nomoney +nomis +nomarg +nolife +nola +noknok +nokian +nnmaster +njkmrjz +njhyflj +njhvjp +ninja9 +ninini +niles +nikita95 +nike23 +nightwing +nightcrawler +niger +niewiem +nicotine +nicolett +nicole11 +nick11 +niblick +nhoj +nhfnfnf +nextdoor +neworleans +newbaby +neuspeed +netman +neopets +nekkid +negros +ned467 +nectarin +ncc1864 +nazarova +naveed +natasha2 +nastya1995 +nashua +nascar8 +naomi1 +nano +nanette +nalini +nafanya +n.kmgfy +mysite +mymy +mymail +myhero +myheart +mydaddy +muttly +mustang69 +musick +mushka +mushin +muselman +murphys +murphy01 +murena +murdoch +murderer +murcielago +mungo +muneca +multiple +mrgreen +movieman +mousie +mourning +mountains +motorhea +motorbike +motorbik +mother2 +mosley +morrissey +morris1 +morri +morgan2 +morgan01 +mooser +mooki +monument +montgomery +montez +monkeybu +monkey6 +monkey20 +monika1 +monica12 +money23 +mommy123 +molokai +moloch +mollymoo +mollyb +moebius +modify +modems +modeling +mistys +missy123 +misfits1 +miroslava +mink +miniclip +mindgame +minden +minddoc +milly +millerti +milenko +mikeyg +mikeyb +mikehunt +mike34 +mikamika +micmac +michela +michail +metoyou +methodma +method1 +metadata +messiah1 +messi +mess +merlin01 +merit +merger +melissa7 +melbourne +mein +megastar +meet +medman +medicin +medici +mdmaiwa3 +mclarenf1 +mclaren1 +mcknight +mccann +max2000 +mauritius +matulino +matt21 +matrix01 +matkhau +matilda1 +mathilda +mathematics +matematica +masterb8 +master5 +master21 +master00 +marzena +maryjan +maruni +marrow +marquise +marlo +marlboro1 +markp +mark11 +maris +mario5 +marihuana +maries +marie2 +margin +maremma +marcmarc +marchenko +march2 +maranell +maranda +marakesh +manuel1 +manoman +maniek +manhunt +mangoes +mandreki +manchild +mancha +manamana +mamon +mammoth1 +mama1963 +mama12345 +mama11 +malvin +malinois +maldonado +maktub +maks123 +makarenko +majik +maitland +mailliw +maier +mahone +magilla +magical123 +maggio +mafioso +madmike +madhu +madelyn +maddo +madalina +mackdaddy +machina +mac1 +mLesp31 +lytdybr +luzifer +luvsex +lulululu +luggage +ludmilla +luckies +lowkey +love99 +love88 +love269 +love2010 +louder +lory +lordlord +loranthos +lopi +longtong +london2 +london11 +lombardo +loller +loko +loginova +logging7 +lobster1 +llllllllll +ljhjuf +lizottes +lizette +littlegirl +littledo +littlebitch +listopad +lisa1234 +lisa12 +lingus +lindros8 +limp +limits +lila +lifeless +liebling +licks +lichen +libtech +liberty2 +lfplhfgthvf +lexmark1 +letici +lesson +leona +lena1982 +leigh1 +lego +lecter +lease +leadfoot +lbpfqyth +layton +lawncare +lavigne +lavanda +lateralu +larkspur +largo +lancer1 +lamb +ladygirl +lacross +kzinti +kyliem +kylie1 +kuzmina +kumiko +kumari +kuma +kryptoni +kreator +kramit +kpYDSKcw +kozanostra +korolev +koresh +konovalov +konica +kompas +kolia123 +koldun +koenig +kobold +kobebryant +know +knight99 +knicks1 +kluivert +klara +kitcat +kissthis +kissa +kiskis +kirakira +killer13 +kilbosik +keyman +kesha +kenya1 +kensingt +kenaidog +keanu +kd189nLciH +kazak +kawika +katydid +katya123 +katiedog +katieb +kathie +katenka +karolinka +karin1 +karimova +karel +karate1 +kallisti +kalleanka +kaligula +kaitlynn +kahala +kafedra +k1200rs +juris01 +junkfood +junior01 +june28 +june26 +june24 +jump23 +july16 +juliya +julio1 +juhani +judges +juanjose +juancarlos +jtkirk +joshua11 +joshman +joshjosh +josefa +jose1 +jordan123 +jonny1 +jong +joker12 +johnwayn +john23 +joesmith +joakim +jndfkb +jlbyjxtcndj +jimdavis +jimboy +jimbo123 +jester1 +jesse123 +jerry2 +jerbear +jerald +jemima +jellyfish +jehova +jbruton +jaysoncj +jaylen +jasonp +jason3 +janis +jams +jamesp +james00 +jamboree +jake5253 +jake1234 +jaimie +jaihind +jagman +jaco +jackmeof +jackaroo +j1234567 +iwojima +ivonne +ivana +ivan1985 +ithaca +italian1 +itali +isengard +isaiah1 +isabela +isaac1 +ironchef +irock. +irina123 +iraira +invisibl +intercom +integrit +inspector +insane1 +inertia +inandout +imran +immune +iluvtits +ilovemylife +ilovecock +idontno +idiot1 +ididit +icema +icecube1 +icebox +iamsam +iampurehaha2 +iamfree +i81b4u +hyde +hussar +huntress +hunk +hubbell +hoyasaxa +hownow +howitzer +howdie +housebed +hour +hotspurs +horney1 +horndog1 +hopalong +hoodlum +honor1 +honeypie +honey2 +hondacrv +hondacar +honda99 +homero +homefree +home77 +home12 +holiness +hokie +hoghead +hjvfynbrf +hiromi +himself +hilda +hihohiho +highgate +hiccup +hfnfneq +herohero +hero63 +hereiam +herbert1 +helter +helpm +hellyea +hejmeddig +heisman +heimer +heidis +heffer +hebron +heavy1 +heating +heartbre +healer +hdbiker +hawai +havvoc +hatelove +hastur +haslo +hasher +harwood +harley69 +harlee +harbour +happy99 +happy5 +happens +hankster +hangers +hanger +hammertime +hallway +hallo12 +hale +hakan +hairless +haileris +hackerz +h2oski +gxLMXBeWYm +gwbush +gutentag +guruguru +gurkan +gunblade +guilherme +guild +gthtrhtcnjr +gruber +grubby +growing +grolsch +grizzy +grizzley +grissom +grip +grinders +gridiron +gribble +greyhound +gregori +greenway +greentree +greenn +greenlantern +green8 +green77 +greatwhi +gracie1 +gracias +graces +gotrice +gostate +gordit +gopokes +gooses +goon +goodpussy +good1 +gonzos +gonzal +goldtree +gold1 +goducks +godogs +godess +godard +goahead +glimmer +glenn74 +gladbach +glad +giuliana +giordano +giogio +gintonic +ginagina +gijoe +giggalo +gigantor +ghjrehjh +ghjcnjnfr1 +ghjcnjgbpltw +gfvznm +gfhjkm135 +german1 +georgy +georgetown +genial +gcheckou +gblfhfc +gb15kv99 +gavgav +gauloise +gator2 +gatewa +gatekeeper +gasser +gaspar +gartner +garibald +garfild +garena +gallus +gallo +galatea +galatasara +gaeta +fynjybj +funbags +fullred +fullhous +fuentes +fuckmeno +frostbit +frogg +fritzz +freund +freeones +freddi +freckle +freaker +frdfkfyu +frank12 +foxyroxy +fotball +forum1 +ford4x4 +foofight +fodase +flyman +flvbhfk +flower12 +florian1 +florent +floors +floor +flibble +flexscan +flashes +fktrcfylhjd +fitzer +fitta +fishhook +fishers +fishe +fishbowl +firsttim +fireboy +finnland +filomena +fietsbel +fffffffff +feyenoor +feuerweh +felixxxx +felina +felicidad +felicida +fefolico +faye +fats +fatone +fatgirls +fatgirl +fastone +fastdraw +farfalla +famine +family01 +falcon12 +falcon11 +faktor +faith123 +fairless +failte +failed +fahjlbnf +fafnir +fackyou +fabrika +fabfive +extra1 +expediti +executor +evita +everest1 +eveline +eus1sue1 +european +estrela +estefani +espero +esperanza +erty +erer +epiphany +engine3 +engine2 +energizer +enduro +employee +emilyb +emblem +emb377 +elvis77 +elsa +elmers +ellis1 +elland +eliza +elina +elena123 +eldritch +efremov +eddie123 +eclips +eclectic +eccles +easygo +early +eXcesS +dwdrums +dwarf1 +dutches +dusty123 +dustin23 +dumbfuck +dukenukem +dukeblue +duke123 +dude12 +dude11 +duane1 +druss +dripik +drewdrew +drdrdrdr +dragon6 +dposton +dowjones +dorsett +dooper +donthate +donkeys +don123 +domodo +doggie1 +dobie +divine5 +dirtyman +dinsdale +dinamit +dimitris +dillard +diego123 +dicklick +diapason +diamond3 +dial +diablo666 +dezember +dextur +dewey1 +dewdrop +devochka +devils2 +devil123 +deskpro +designs +depot +deploy +depaul +dent +dennys +demise +demetrio +dell123 +delhi +deirdre +def456 +dedalus +decembre +decembe +deadend +dctulf +dcp500 +dc3UBn +dbrbyu +dazed +dawkins +david77 +david5 +dave1234 +dashit +dasboot +darthmaul +darby +daniel21 +damaris +dallas01 +dalejr88 +daisymay +daddymac +daddad +dad123 +dM6TZsGp +czekolada +cytuehjxrf +cycles +cyanide +currie +cumsuck +cum +culito +culero +crystal2 +cruel +crows +crossroa +croaker +crenshaw +creamyou +crazzy +crazy4u +cowabung +courts +counsel +cools +coolman1 +coolfool +cool69 +cookin +contrera +contessa +constantine +conchita +computadora +cometh +comando +colfax +cokeman +coastal +cnhtkjr +clubs +clown1 +clothes +clocker +clem +clean1 +claybird +classact +clam +claire1 +clahay +ck6ZnP42 +cjkysir +cjfrf +cjdthitycndj +civilian +cinta +cindy69 +cindy2 +cincinnati +chummy +chumly +chronic1 +chrisj +chrisbrown +chrisa +choucho +chongo +cholera +chiro +chiquit +chinese1 +chinchil +chinatow +chimay +chicken123 +chicco22 +cheating +chatting +chatchat +charissa +chaos666 +channels +chand +chanchan +ch1tt1ck +cfkfvfylhf +ceres +celular +cell +celebrit +cdexswzaq +cbcntvf +caterpil +castles +carter12 +caroline1 +carlo1 +carla123 +cari +cargo +carded +caramon +caraj +caption +canucks1 +cantona1 +cannonba +cams +camp0017 +camera1 +camaleun +camacho +calender +caiman +caffreys +cabo +cabana +c3po +c12345 +buttnutt +butterba +busters +buster21 +busen +burton1 +bunns +bunkie +bullet1 +bulgakov +buffett1 +buddyy +buddy01 +bubluk +bubbabub +bsmith +brun +bruces +browni +brooks1 +brookly +bronx1 +brondby +broncos2 +briank +breton +breitlin +breakfast +brattax +branden1 +brainiac +braddock +boyle +bosshogg +boss1 +boro +borisenko +bootycall +booom +boomers +bookert +boobless +bonzo1 +bonny +bonni +bonjour1 +boner69 +bond00 +bombadil +bohemia +bogeys +boeing77 +bodiroga +bobby12 +boats1 +boarding +bmw750il +bluetooth +blue15 +blue14 +blue10 +blowme2 +blowjob1 +bloomberg +bliss7 +blindman +bleeding +blanka +blacksab +bkmlfh +birthday100 +birder +bioshock +binkley +bingoo +bimbos +bimbo38 +billi +bilbobag +bikes +bigtits1 +bigmaxxx +biglou +bigloser +bigeasy +bigbroth +bigbo +bigball +bigal37 +bhavani +bettylou +bestbest +bergman +bennevis +benita +benhogan +belous +beloit +belladog +beer4me +beer12 +beejay +beauties +beaudog +beast666 +beantown +beaner1 +bdylan +bdfyeirf +bckhere +bb334 +baybay +batty +batterie +baton +batistuta +bathory +bastille +bassss +baskin +basia1 +bashir +bash +barter +bartend +barrie +barone +barn +barmaley +bargain +barada +baptiste +banging +bandy +bammer +bambou +balsam +balmoral +balla007 +balkan +bali +baldhead +bailey11 +bailey10 +bahama +baghdad +baggins1 +baggie +bagel1 +backhand +babilon +azerty1 +ayanna +awsedr +award +avrillavigne +autumn1 +automag +autogod +austin01 +aurelio +august15 +augus +atwork +atkbrc +assfucke +assembly +ashok +ashlynn +ashley2 +ashley11 +asdfghjkl; +asdasd12 +asda +asap +arkangel +arista +arisia +argo +archie1 +aqwzsxedc +aquamann +april7 +april6 +april21 +appletre +appleseed +applegat +apple3 +apple22 +appelsin +apocalyp +aphrodite +apa195 +anyone +anvil +anusha +antonova +antlers +antihero +antietam +anthony3 +antenna +annie123 +annarbor +anissa +angrick +angelochek +angelbab +ane4ka +andy69 +andron +andreyka +andreia +andr +ancella2 +anatole +anastasija +analyst +anallove +analfuck +amber69 +amber2 +amarill +amanda01 +alway +alsscan +alpha01 +alot +almaty +almat +allen123 +alle +alinaalina +alicja +alianz +algeria +alfaro +alfa155 +alexis01 +alex007 +aleman +alekseeva +ale +alderaan +aldebara +alanalan +alabaste +akbar +ajnjuhfa +aimee1 +ahmet +ahead +agshar +aggarwal +agentx +agapov58 +agamemnon +aftermat +after +advantage +adult1 +adamo +achmed +accord1 +absinthe +absent +abm1224 +a7nz8546 +a131313 +a000000 +YtDXz2cA +XSvNd4b2 +WtcACq +Wolfgang +Willow +WNMAz7sD +WINTER +Valentin +TwisT +Tttttt1 +Torres +Test +TRINITY +Sweet1 +Sophie1 +Service +Serg +Scooby1 +Sandy1 +Sally1 +SUCCESS +STUPID +SPIDER +S62i93 +Rrrrrrr1 +Rrrrr1 +Roxanne +Ronaldo +Rocky +Rocket1 +Regina +Raymond +R7112S +QWASZX +Purple1 +Private +Predator +Ppppp1 +Porsche9 +PornLo +Peanut1 +Passwort +Pass1 +Panties1 +Packard +PUMPKIN +PAUL +PARKER +PANTERA +Naruto +Molly1 +Mmmmmm1 +Mm259up +Melanie1 +Marvin1 +Martina +Martha +Marine1 +Marcel +Maksim +MEXICO +Louise +Lisa +Lg2wMGvR +Kristen +Kelly +KCmfwESg +Johann +Jjjjjj1 +Jason1 +JVTUEPip +JORDAN23 +JEFF +InstallUtil +Hello123 +Hellfire +Heaven +Hawkeye +HITMAN +Graham +Gordon +Giovanna +Gibson +Giants +Gfhjkm22 +Georgia +General1 +Gateway2 +Gabriel1 +GUNNER +GREEN +GOLDIE +FylhtQ95 +Frankie +France +Flowers1 +Felix +FKoJn6GB +FIRE +Explore1 +Elvis1 +Eagles1 +Durham +Devil +Description +DOGGIE +DFADAN +DENVER +Cricket +Cowboy +Columbus +Chicago1 +Cheyenne +Ccccccc1 +CHEVY +Burton +Buffalo1 +Browns +Biteme +Baller +Badger +BULLSHIT +BRIANNA +BOND007 +BLOWJOB +BITCHES +BIGFOOT +Atlanta +Alexis1 +Abcdefg1 +ANTONIO +ANDRE +ABCDEFGH +??????? +9930 +9800 +963147 +9494 +9110 +8i9o0p +888888888 +888777 +8884 +87e5nclizry +8546404 +85200258 +84848484 +8426 +8383 +8363eddy +8266 +8111 +80988218126 +80088008 +800500 +7jokx7b9DU +79137913 +789632147 +786110 +777555333 +7749 +7733 +757757 +754740g0 +754321 +753951456 +7475 +7448 +7273 +7085506 +69er +6975 +69420 +690000 +66chevy +666satan +6662 +6660 +65pjv22 +6463 +6264 +61808861 +6116 +5W76RNqp +58565254 +57055705 +5639 +5591 +5578 +5569 +556644 +5464 +543543 +5309 +52345 +52255225 +5152 +513513 +5112 +5058 +505505 +5055 +4pussy +4jjcho +4fa82hyx +493949 +4833 +4809 +477041 +46doris +4663 +45colt +456asd +4548 +4532 +4502 +4474 +44556 +444000 +4386 +428054 +4280 +4235 +4224 +4204 +4160 +413276191q +412412 +4007 +382436 +3812 +3732 +3720 +369874 +36363 +35793579 +3555 +3553 +3440172 +33st33 +336633 +334433 +333000 +3316 +3301 +327327 +32715 +3265 +32323 +321ret32 +32132 +320033 +3185 +3166 +311294 +31121966 +311073 +31101974 +31101960 +31081972 +31081968 +31081966 +310777 +31051968 +310377 +310371 +31031973 +31031962 +31012001 +3032 +301294 +301287 +30121999 +30121967 +301196 +301176 +30111967 +30111965 +301091 +301076 +300971 +30091968 +300895 +300880 +30071966 +300696 +300678 +300671 +30061967 +30052000 +30051997 +30051974 +30051968 +30041969 +30041967 +30041962 +300379 +300377 +30031997 +30031964 +30031959 +300174 +30013001 +30011997 +30011963 +30011961 +2twins +2enter +2bornot2b +29121998 +29121969 +291193 +291191 +291176 +29111965 +29111963 +29101963 +290980 +29092000 +290885 +29081971 +29081967 +290795 +290778 +29072000 +290692 +290676 +290675 +290670 +29061970 +29061968 +290572 +290571 +29051967 +290472 +29041997 +290384 +29031997 +29031969 +29031961 +290177 +29011966 +288288 +281293 +281277 +281173 +281080 +28101972 +280978 +28091965 +280896 +280874 +28081967 +28081961 +280798 +280772 +280693 +280681 +280674 +28061998 +28061971 +28061969 +28061966 +280573 +28051972 +28051961 +28041967 +28041966 +280397 +280379 +28031961 +280276 +280270 +28021960 +28021956 +280175 +28011964 +28011961 +2800 +2791 +271296 +271277 +27122000 +27121966 +271193 +27111996 +27111967 +27111961 +271093 +271071 +271069 +27102710 +270995 +27092000 +27091970 +27091969 +270897 +270793 +270770 +27071997 +27071970 +27071965 +27071955 +270694 +270693 +270672 +270577 +27051996 +270496 +27041969 +2704 +270394 +27031963 +27031960 +270297 +270294 +270275 +270180 +27011962 +269269 +2669 +264264 +2628 +261397 +26121964 +261179 +26111970 +26111966 +261096 +260992 +26091998 +260892 +260872 +26081965 +260773 +26071966 +26071959 +260675 +26061969 +26061968 +260572 +26051998 +26051964 +26051963 +26051959 +260480 +260478 +260476 +26041999 +26041960 +26041958 +260396 +26031998 +26031961 +260296 +260294 +260277 +260270 +26021972 +26011967 +258147 +2572 +2569 +25563o +25522552 +2549 +2532 +2517 +251271 +25121970 +251197 +251195 +251171 +25111970 +25111961 +251077 +251076 +25101997 +250994 +250975 +250972 +250971 +25091998 +250870 +25082000 +25081965 +250792 +25071968 +25071965 +25071958 +25051996 +25051964 +25042001 +25041968 +250395 +250378 +25031999 +25031964 +250280 +250250 +25021967 +250178 +24lover +2488 +2485 +2475 +245lufpq +243122 +241455 +241276 +24121969 +24121968 +24121964 +241093 +24101967 +24091961 +240880 +240875 +24081997 +240793 +240679 +240672 +24061964 +24061960 +240595 +240593 +24052001 +240495 +24041970 +24041966 +240394 +240371 +24031964 +24031959 +240284 +240272 +24022000 +24021997 +24021969 +24021963 +240172 +240162 +24012004 +24012001 +237237 +2358 +23572357 +2347 +2331 +2328 +231274 +23121969 +231196 +23112311 +231123 +231095 +231093 +23101995 +23101965 +230995 +23081974 +23081964 +230795 +23071963 +23071962 +23071961 +230693 +230678 +23061971 +23061966 +23061960 +230581 +230576 +23051998 +23051959 +230494 +230476 +23041973 +23041961 +230395 +230275 +230274 +23021997 +23021960 +230178 +230171 +23011999 +23011961 +22q04w90e +22742274 +2256 +2246 +2240 +2229 +222000 +221268 +22121971 +22121969 +22121964 +221168 +221164 +22111998 +22111967 +221095 +221070 +22101970 +22101966 +22101960 +220991 +220967 +22091999 +22091998 +22091968 +220795 +220766 +22071999 +22071965 +220696 +22061975 +22061970 +22061961 +220569 +22051997 +22051968 +22051965 +220465 +22041971 +22041960 +22031999 +220220 +220162 +22011965 +22011962 +2125 +2116 +211272 +211179 +21111973 +21111967 +21111963 +210977 +21091998 +21091969 +210895 +210894 +21081967 +210798 +210792 +210775 +210773 +21071999 +21071967 +21071964 +210671 +21061967 +210596 +210579 +21052105 +210478 +210475 +21041971 +21031998 +21031963 +210286 +210179 +21012101 +21011964 +21011962 +208208 +2030 +201274 +201269 +20121998 +201193 +20111998 +20111969 +201070 +20101998 +20101969 +20101968 +20101962 +201 +200995 +200980 +200974 +200890 +200865 +20081971 +20081970 +20081966 +200796 +200772 +20071964 +20051965 +20051964 +20051957 +200491 +20041965 +20041889 +200392 +200378 +20031965 +20031962 +200274 +200169 +20012002 +20011959 +200001 +1w2w3w +1w2q3r4e +1w2q1w2q +1herbier +1for +1blood +1Zzzzzzz +1Yellow +1XrG4kCq +1Starwar +1Sparky +1Rosebud +1Porsche +1Phoenix +1Nnnnn +1Miller +1Member +1Matthew +1Matrix +1Hhhhh +1Guitar +1Fender +1Falcon +1Edward +1Corvett +1Bbbbbbb +1Assword +199595 +199430 +199321 +19922801 +199212 +19911992 +199111 +1989cc +198920 +198910 +198800 +198721 +198627 +198622 +198621 +198522 +198207 +198181 +197619 +197300 +19719870 +197111 +196800 +196400 +191293 +191289 +19121969 +191190 +191082 +19101960 +19101910 +190987 +190979 +19091999 +190891 +190880 +19081966 +190786 +190781 +190777 +19071964 +190686 +190567 +19051970 +190486 +190479 +190474 +19042000 +19041997 +19041966 +190386 +190385 +190383 +190296 +190282 +19021963 +190182 +19011998 +19011969 +1891 +1869 +1848 +1825 +18121959 +181177 +18111996 +18111966 +181080 +181061 +18101997 +18101968 +18101967 +180993 +18091998 +180779 +18071999 +18071998 +18071964 +180670 +18061967 +180572 +180569 +18051998 +180494 +180475 +18041967 +180384 +18031965 +18031963 +18031962 +18031959 +18031958 +180279 +180277 +180175 +180167 +18011960 +1765 +1732 +172839456 +1720 +1715 +171204j +171194 +17111969 +17111961 +171094 +17101965 +170977 +17091959 +17082001 +17081971 +17081967 +17081958 +17071968 +170677 +170673 +17061964 +170578 +17051967 +17051965 +17051963 +17051959 +170496 +170473 +170379 +17031997 +17031965 +170278 +170174 +17011967 +170000 +1677 +1669 +1626 +1619 +161277 +161272 +161173 +161072 +16101998 +16101968 +160975 +16091968 +16091966 +16091965 +16091963 +16091961 +16081961 +160793 +160773 +16071971 +160697 +16061998 +160596 +16051971 +16051967 +16041965 +16041964 +160380 +160372 +16031974 +160285 +160188 +160173 +160160 +16011961 +160000 +1599 +1597532486 +1593570 +1558 +1550 +154263 +1535 +153351 +1532 +151277 +151193 +151167 +15112000 +15111971 +151092 +151091 +15101968 +150966 +15092000 +15091996 +150873 +150871 +15081962 +150797 +15072000 +15071964 +150696 +150695 +150674 +15041964 +15041963 +15041959 +15031971 +15031961 +150275 +15021969 +15021967 +15021965 +15021961 +15011973 +15011963 +15011962 +1472583690 +146969 +1438 +1431 +141270 +14121964 +14121961 +141168 +14111961 +141072 +140994 +14082000 +14081966 +140794 +14071962 +14071961 +14071957 +140694 +14061998 +14051964 +14051959 +14042000 +14041996 +14041958 +140366 +14031965 +14031960 +140269 +140196 +140194 +140179 +1372 +1367 +1362840 +13524 +13521352 +1348 +132333 +131986 +131517 +13121998 +13121964 +13121963 +131213 +131195 +131175 +13111964 +131069 +13101998 +130995 +130972 +13092000 +13091967 +130895 +130772 +130672 +13051998 +13041969 +13041965 +130397 +130375 +130370 +130362 +13031967 +130296 +130270 +13021998 +13021966 +130183 +12step +1273 +1271 +125689 +125521 +1246 +1240 +123qw123 +123qazwsx +123abc123 +123852 +123579 +12356789 +1234qwert +12345789 +1234567s +1234567l +1234567A +123456789aaa +12344321a +12341234q +12331233 +123199 +123123qq +123-123 +122789 +122686 +12221222 +122133 +12199 +121977 +121975 +121974 +121480 +121263 +121261 +121245 +12121964 +12121959 +121191 +121172 +121162 +121157 +12111973 +12111960 +12111956 +12101964 +12091998 +12091972 +12081974 +12081967 +120794 +120778 +12071963 +120699 +120693 +120671 +12061998 +120574 +120560 +12051999 +12051966 +120498 +120492 +12041965 +120367 +12031964 +12031957 +120296 +120295 +120272 +12021969 +12021960 +12021957 +12021954 +120173 +12011998 +12011968 +120021 +11aa11 +1193 +1164 +116116 +1161 +1154 +114114 +1140 +1131 +112433 +112266 +11223355 +11223300 +111Luzer +111969 +111295 +111291 +111270 +11121968 +11121967 +11121962 +1111qq +111198 +11112007 +11111aaaaa +11111964 +111111z +1111111a +111076 +11101963 +11091964 +11091962 +11091958 +110870 +11081997 +11081967 +110796 +110779 +110774 +11072001 +11071998 +11071969 +110697 +110670 +110669 +110665 +11061968 +11061967 +11061960 +11061956 +11051998 +11051997 +11051971 +11051968 +11051964 +110494 +110472 +110471 +110464 +11041970 +11041963 +11041955 +11041104 +11031974 +11031969 +11031968 +110295 +110272 +110269 +11022000 +11021964 +110198 +110172 +11011959 +110022 +109876 +1091 +1074 +10321032 +102800 +102777 +10261026 +102090 +101981 +101798 +10161016 +101262 +10121998 +10121968 +10121961 +10121959 +101198 +101197 +101174 +101167 +10111963 +10111962 +101060 +100993 +100972 +100970 +10091999 +10091961 +100877 +100860 +10081964 +100795 +100772 +10061967 +10061961 +100570 +100568 +10051964 +10051963 +100498 +100465 +10042001 +10041959 +100398 +10031973 +100294 +100268 +100267 +0sister0 +0o9i8u7y6t +091285 +09122000 +09111958 +091082 +091072 +09101973 +09101967 +090965 +09091964 +09071998 +09071997 +09071970 +090689 +09061999 +090597 +090590 +09051997 +09051961 +090493 +090489 +090482 +090477 +090476 +09041995 +0904 +090396 +09021975 +09021964 +09021960 +090176 +09011972 +0888 +08150815 +081295 +08121996 +08121968 +08121967 +08121965 +081189 +081176 +08101998 +08101962 +080977 +080881 +080781 +0807 +080693 +080686 +080680 +08062000 +08061997 +08061968 +08061967 +080596 +080568 +08051970 +080488 +080481 +080475 +08041998 +080383 +08031969 +08031968 +08031957 +080296 +080280 +080279 +080276 +08021997 +08021972 +08021968 +08021963 +080171 +080170 +08011968 +0731 +0720 +071295 +071274 +07121997 +07121970 +07121963 +071189 +071175 +07111966 +071092 +071089 +071077 +07101999 +070992 +070991 +07091962 +070891 +07081964 +070794 +070772 +07072000 +07071999 +07071970 +070676 +070674 +07061997 +07061960 +070591 +07051971 +07051963 +07051959 +070494 +070484 +070479 +070393 +070269 +07021969 +070192 +070178 +0686 +0676 +0621 +061296 +06121971 +06121970 +06121969 +061186 +061175 +06111971 +06111967 +061076 +06101998 +06101971 +060970 +060896 +060884 +06081964 +060792 +060791 +06071963 +060681 +060671 +06062006 +060576 +06051999 +06051961 +06051960 +060489 +060483 +06042001 +06041968 +06041960 +06041957 +060386 +060380 +060291 +060178 +06011997 +06011971 +06011964 +0581 +0550 +0524 +0522 +0513 +051294 +051270 +05121970 +051179 +051169 +05111997 +051085 +05101970 +050987 +050978 +05091969 +050875 +05081971 +050791 +050778 +05071998 +05071997 +05071970 +05071965 +050671 +050670 +05061964 +05061963 +05052006 +05051998 +05051967 +05051962 +050486 +050474 +050465 +05041968 +050382 +050380 +050374 +0503 +050271 +05022003 +050196 +050182 +05012000 +05011969 +05011966 +0480 +0469 +0419 +041288 +041285 +041279 +041277 +041274 +041271 +04121998 +04121968 +041192 +041175 +04111970 +04111959 +041094 +041080 +04101969 +040992 +040982 +040978 +04091960 +040875 +04081964 +040673 +04061999 +04061962 +040576 +040575 +040566 +04051969 +04051966 +04051958 +040496 +040493 +040490 +04032008 +04031956 +040279 +040278 +04021997 +040169 +04011997 +0388 +0373 +031276 +031273 +03121996 +03111997 +03111969 +031094 +031076 +031069 +031068 +03101962 +030976 +03091968 +03091960 +030880 +030876 +03082000 +03071968 +030693 +030675 +03061999 +03061965 +03061959 +030597 +030593 +030580 +030507 +030491 +030489 +030470 +03042000 +030376 +030366 +03031959 +030281 +03021963 +03021960 +030181 +03011959 +0288 +0215 +021280 +02121998 +02121970 +02121964 +021168 +02111958 +021081 +021062 +02101967 +020994 +020970 +02091969 +020892 +020887 +020879 +020790 +020774 +02071966 +02071964 +02071959 +020695 +020688 +02061968 +020591 +020582 +020578 +020574 +020568 +02051997 +02051967 +02051958 +020495 +020475 +020474 +020377 +02031969 +020291 +020256 +02021959 +02021954 +020177 +020173 +02011996 +02011960 +0190 +0147852 +011278 +011277 +011276 +01121999 +01121974 +01121965 +011186 +01112010 +01111997 +01111970 +011093 +011074 +011072 +011070 +01101997 +01101972 +01101958 +010991 +01091998 +01091997 +01091958 +010900 +010892 +010866 +01081968 +01081962 +01081960 +010792 +010777 +010774 +01071999 +010696 +010669 +010666 +01061968 +01061958 +010596 +010580 +01051959 +010479 +010478 +01042010 +010393 +010372 +01031999 +010278 +010270 +01021961 +010198 +01011945 +001969 +0015 +zzzxxxccc +zxcvbn3215 +zxcdsa +zxc1234 +zxc12 +zwilling +zvfrfcb +zucker +zse4xdr5 +zoedog +zjses9evpa +zip100 +zilla +ziffle +zeratul +zebra3 +zebedee +zastava +zaqwsxcderfv +zaqwsx1 +zaq12qaz +zaphod42 +zalina +zaire +zadnica +z1z2z3z4 +z11111 +yukiko +yrrim7 +youngone +yomismo +yoghurt +yfz450 +yfcnhjtybt +yeehaa +yeahrigh +ybrbnf_25 +yarrak +yarddog +yams7 +xyzzy1 +xyh28af4 +xxxjay +xuFrGemW +xenophon +xavie +wyatt1 +wwwww1 +wrote +writerspace +wretched +wreck +wow12345 +worldcom +world123 +woodwood +wonderwo +wonderwall +wonderbo +wolve +wolf01 +wizardry +wisper +wishing +wintermu +win123 +willow01 +williamj +william0 +wilkes +wildwild +wildroid +wilber +wigger +whome +whoa +whitewol +whisper1 +whipper +whipme +wharfrat +wert1234 +weezer1 +weekly +weJRpfPu +wayner +watt +watchout +watchman +wapwap +wallop +walkman555 +wales +wWR8X9PU +w8woord +w1234567 +vtkmybr +voronin +vladislava +vlada +vlad1994 +vlad1234 +vjkjnjr +vitalina +visit +vinogradov +vino +villan +viktory +videogam +vickers +vfif123 +vesta +very +veronda +venomous +vengence +venezuela +velosiped +vbnhjafy +vbkkbjy +vaz2114 +vaz21093 +vassago +varvar +vanya +vanill +vanesa +valmont +valkiria +valerio +vale +va2001 +uvwxyz +user123 +usaf +upload +uplink +untitled +underwat +ukfveh +ufdibyjd +uaeuaeman +tysons +tylerj +tylerd +tylenol +twolves +twinkles +twincam +twiddle +twenty20 +turn +turbot +turambar +tupper +tuppence +tupacshakur +tulipan +ttttttttt +tset +trompete +troika +triplet +trillium +trigger2 +tricolor +tricky1 +tribune +triada +trev +tremor +trees1 +trebla +traxxas +tranzit +track1 +tr1993 +toyota91 +toto99 +torrid +torrents +torrente +topten +toonami +tonite +tonchin +tommycat +tomjerry +tomcat14 +toma +tnttnt +tktyf +titans1 +tirana +tipton +tippie +tinti +timoth1 +till +tiggers +tigers11 +tigers01 +tigerfan +tigereye +tiger25 +tiedomi +tiara +thunder0 +thruster +threepio +thread +thoughts +thinkbig +theworm +thesame +thepower +thekiwi1 +thedream +thedoc +th0mas +teufelo7 +tetas +testdrive +test3 +tessa1 +tesla +terrill +terri1 +terminato +tekkon +tedted +teatro +teamster +team3x +teal +tdfyutkbjy +tazzman +taylor01 +tavasz +tarelka +tarbit +tarado +tanuki +tankers +tangle +tana +tampico +tami +tallest +taller +taliban +tacitus +table54781 +tabaluga +tabaco +t66hks +swiss1 +swisher +swinger1 +sweeti +sweetdream +sweden1 +sveiks +sux2bu +sutter +surrende +surfside +sureno13 +surabaya +supras +superx +sunking +summoner +summer98 +suki +sujatha +sugardog +suckmydi +suckmyco +sucesso +styx +stuttgar +stumper +studio1 +stronzo +stripped +stratman +stormin +stoli +stokrotka +stocker +stivone +stillher +stifler +stickboy +station2 +station1 +stater +stat +stash +startre +starting +star1234 +stanley2 +stalke +stable +ssgoku +spycam +spooty +splatt +spinoza +spine +spindle +spawns +soxfan +souppp +sorento +soren +sordfish +sony12 +sonshine +sonofsam +sonofgod +songs +sommer1 +sommar +solsol +sokol +sofun +sofia1 +sodoff +socorro +soccer19 +soccer09 +socal +snowhite +snowdon +snoopy69 +sniffy +snickers1 +snakeeyes +snake2 +snails +snaggle +snack +smurph +smurf1 +smile4me +smeagol +slonko +slides +slava2 +slava123 +slacker1 +sl1200 +skipping +size +sissie +sina +silverma +silverfi +silver99 +silver33 +silmaril +silas +sigurd +signature +sigmapi +siesta +sidewalk +sickle +shuriken +shortcut +shores +shmuck +shishi +shipmate +shiney +shiela +sherry1 +sheraton +shep +sheeps +shasta1 +sharyn +sharron +shapiro +shannon2 +shannan +shania1 +shanahan +shana1 +shamroc +shamen +shameless +sham69 +shakespeare +shadowfax +shadow10 +sexytime +sexygirls +sexy01 +sexxxxxx +sexwax +sexpistols +sexfiend +severe +sever +service321 +sergei1 +seemee +seau55 +searock +seamless +scylla +scripto +screwu +screwme +scottm +scottie1 +scott12 +scorpio6 +scooper +schwab +schuey +schoolgirlie +schenker +scheiss +scc1975 +sayan +saxophone +saudade +sat321321 +sashenka +sashasasha +sasha2000 +sasha1992 +sasafras +sarvar +saqartvelo +santacla +sandia +sandan +sammy69 +sammmy +samat +sam2000 +salvage +salerno +saisha +saisg002 +saipan +sailormo +sahalin +safety1 +sadman +sadie123 +sabbeth +s123456789 +ryan22 +ryan123 +rutter +rust +rush211 +runvs +rumpole +rul3z +ruggles +roy123 +roxie1 +rowley +route +rouges +rothmans +roth +rossco +roslyn +rosedale +rosebu +roscoe1 +rory +roro +rook +romantika +romanenko +roman777 +rolodex +roller1 +roli +rodman91 +rodders +rockz +rocky5 +rocky4 +rocket69 +rockandr +roboto +robinho +robin123 +roberta1 +robert01 +robbob +roanoke +roadrash +river123 +ritual +rito +ringwood +righty +ridges +richar1 +ribeye +rhfcyjlfh +rhfcbdfz +rfycthdf +rfvtgbyhn +rfvbkf +rfhkcjy +rf6666 +reynard +reynaldo +rewster +reviewpass +retired1 +restaura +respublika +repmvbyf +repent +remorse +regis1 +reggin +reggi +regatta +regan +reeb +redwhite +redman1 +redhorse +redder +redcard +red222 +recover +recoba +rebeld +raver +ratten +rataros +raprap +rapid1 +rangers2 +rambone +rallye +rainman1 +rafferty +raerae +radmir +racin +racecar1 +rabies +qwsazx +qwsaqwsa +qwertzu +qwertyuiop10 +qwertyas +qweqwe12 +qwe123456 +quincunx +quietkey +quiet1 +quelle +queenb +quarks +quad +qscwdv +qazxswedc123 +qazxsw2 +qazxdr +qazxcdew +qazwsxqazwsx +qazwsx1234 +qaz12wsx +qMEzrXG4 +q22222 +q1a1z1 +putt +pussykat +purple01 +punish +pumping +pulp +pukimak +psych0 +psalm69 +ps253535 +proxima +protected +propro +promopas +projects +prisma +prints +princesse +pretoria +pretender +prestigio +presence +prescott +preggo +predators +precisio +powerr +powerhou +power5 +poutine +potpot +postbank +posse +portvale +pornostar +pornosta +porn1234 +porkpie +popcor +poopoo1 +poolside +poochy +polock +polo12 +polkaudio +polito +poker2 +poker0 +poekie +pngfilt +ploplo +playground +platin +pixel +pitter +pistons1 +pistol1 +pirates1 +pinoy +pinky123 +pinkpussy +pinkey +pinkerto +pinguino +pingu +pineda +pincher +pinarell +pimper +pill +pilipenko +pika +piesek +physical +phoenix8 +phoenix3 +phobia +phishin +phinupi +philosophy +philo +phelge +phatfarm +phalanx +peyote +peterp +peterg +peter22 +pest +perseus +persepho +perrit +pepper11 +pepote +pensacola +pens +penman +penhorse +pelvis +pele10 +peekab00 +pedal +pecos +peanuts1 +pbyfblf +paycheck1 +paycheck +pawnee +pawelek +paully +paul01 +patpat +path +pater +past +passwordstandard +passthief +passking +pass88 +pass22 +parts +parolamea +parman +parent +pappnase +papasmurf +papa123 +panthers1 +panther5 +pangaea +pandoras +pandora2 +palmeira +palm +paladine +pagedown +pacopaco +pacer +pace +pGsZT6Md +p2ssw0rd +ownage123 +outhouse +outbreak +ou812345 +otter1 +osceola +oriana +optiquest +oneputt +okocha +oinker +ohyeah1 +ohlala +ohboy +office1 +october6 +october3 +octavius +obsession +obsessio +oakville +nynyny +numpty +nufc +nthtvjr +nowayman +nouveau +notlob +nothanks +notes +nosenose +nosaints +norseman +noodle1 +nokiax2 +nokia6500 +nokia2700 +noir +noentry +nitemare +nintend +nimble +nikkis +nikita99 +nike1234 +nigger123 +nicolas2 +nicolas1 +nicksfun +nicki1 +nickey +nick01 +nichol +nhfycajhvths +nhecsyfujkjdt +nfqcjy +nexxus +newzeala +newpassw +newlove +newcar +nephew +nepal +neophyte +nene +nemezida +negra +neelam +needed +nedkelly +necro +nbuhbwf +nbibyf +nausicaa +naughtya +naturals +natty +nastik +napkin +nadano +nUADdN9561 +mypass1 +myles +mykiss +myhoney +mycats +mvtnr765 +muskan +musik +museum +munchen +multipas +muledeer +mudslide +mudbone +mucker +mtnman +mtgox +msouthwa +msconfig +mrblonde +mozar +move +moulin +motox +motorman +moschino +morocco +moriah +morgaine +moonrake +moonlite +moom4261 +mooch +montenegro +montage +monmon +monkey24 +monkey00 +monitor1 +money99 +money4 +molly2 +molley +moimeme +moeman +mobility +mmxxmm +mmmmm1 +mkvdari +mjollnir +mixers +mistie +mistic +mistery +missyou +missoula +misiek1 +misha1111 +mirumir +mirella +minty +minot +milo17 +milliona +milkman1 +miledi +mikmik +mike99 +mike007 +mikasa +midge +microbe +micky1 +micki +mickey7 +mickey22 +mickey11 +mickey01 +michiko +miata1 +miami305 +messina +messages +mesohorny +merman +merengue +mercedes1 +meloman +melnikova +melin +melanie2 +megha +medin +meatwad +mcgraw +mcclure +mccain +maxwell2 +maxthedo +max1998 +mavis +maude +mattias +matthew3 +matthew0 +matters +matt22 +matrix99 +matrix7 +matmat +mathis +materia +masturbate +masterma +masterba +massimiliano +mashoutq +mashamasha +masha1998 +masha1 +marzipan +marv +marthe +marryme +marley12 +marleen +marimari +mariami +mariamar +maria12 +margret +margera +marge1 +mardigra +marcelit +maranello +mapleleafs +mansour +manon +manimal +mandi +manageme +mamusia +mamula +mamasboy +maltby +malcolmx +malabar +makenzie +makavel +mahatma +magpies1 +magoo1 +magnu +magic7 +madma +mada +maandag +m7hsqstm +lytghjgtnhjdcr +lynsey +lyalya +lvbnhbq1 +luthor +luners +lund +lumpy1 +lui +luger +ludic +lucozade +lucky99 +lucifer666 +luci +lucero +lowlow +lowery +lovethem +lovesuck +lovespor +lovesong +lovergirl +loveline +lovehina +loved +love4me +love20 +louisian +lou1988 +lotrfotr34 +loser2 +losbravo +loraine +lomonosov +lolopc +lollol123 +loftus +locura +locos +livestrong +littleone +littlegi +littlebear +litebeer +listing +linnea +linkinpark +lineback +lillo +lill +liljoe +liliput +lightfoo +ligeti +lifestyle +liebherr +lida +liarliar +leyton +levine +letmeino +letmego +lesbian1 +lesabre +lero4ka +lenora +leighann +legoman +lechef +lead +laz2937 +laverda +latrice +laotzu +lanzarot +landers +lamppost +lamour +laluna +lalala1 +lakerfan +ladeda +l123456 +kzktxrf +kyocera +kwiatuszek +kuzmich +kronik +krillin +kourniko +kot123 +koskesh +koolhaas +komarov +kolort +kokain +kohsamui +kodeord +koalas +knudsen +knuddel +kmN5Hc +kloster +klinger +kkk666 +kittykit +kingman +kingdom1 +king99 +king1 +kimo +kimmer +kimbo +killin +killerbee +killer666 +killem +kiler +keywest1 +keylargo +kevind +kevinb +kevin69 +kevin11 +kernow +kellie1 +kees +kcng +kcid +kazama +kaylin +katyusha +katharina +katerin +katebush +kasia +karlmasc +karla1 +karima +karakara +kanmax1994 +kangol +kanat +kanako +kamilek +kaluga +kalo +kalman +kakosja +kailayu +jxfhjdfirf +juvis123 +jutta +jupite +junior24 +junior123 +jumpjet +july20 +julija +juggerna +jossie +jorge1 +jordana +jordan7 +jonah +johnson4 +johnsmith +johnnyd +johnd +john77 +john44 +john33 +joeblack +joe +joaquim +jkz123 +jjjjjjjjjj +jjjdsl +jinjin +jimmyp +jimmy69 +jimmy12 +jillian1 +jibber +jesusis1 +jersey1 +jerkyboy +jegr2d2 +jeffhardy +jdog +jazzmin +jazmyn +jaydog472 +jarhead1 +januari +jamshid +james22 +jamdown +jamaic +jaden +jacobsen +jacklyn +jackhamm +jackass2 +jabba1 +jJvwD4 +iverso +italien +isthebes +isbest +ironhorse +iro4ka +irma +intermilan +intelinside +insurance +inspect +ingersol +inga +infidel +industry +indigo1 +indi +image1 +im2cool +iluvu +iluvme +iluv69 +ilusha +iloveyou12 +ilovemusic +ilovejes +ilonka +iforgotit +ifiksr +idinahui +identity +icefire +icandoit +iago +hygge +huskie +husain +humme +humans +humanoid +huggies +hubcap +html +htcnjhfy +houser +hotstuf +hotlove +hotcunt +hotbot +hotboi +hoser1 +horacio +hopeful1 +hondaman +hondacr +homie +hollyy +holeshot +hoddling +hockey22 +hkger286 +hits +hidalgo +hfcnfvfy +hextall +herman1 +hergood +herbst +herber +heracles +hellgate +helge +heihei +heidie +hefner +headhunter +hball +hatehate +hassle +harsingh +harriso +hardup +hardpack +hardguy +hardest +hardaway +hannelor +hannah11 +hamzah +hammock +hammerhead +hammer99 +hamlin +hambone1 +halt +halloo +hallodu +halford +hal2000 +hacke +gutierrez +gutierre +gustavo1 +gusman +gunfight +gumdrop +guille +gtogto43 +gtnhjdyf +grumman +groundho +groover +grog +grits +grigoryan +grifon +greshnik +greenlee +greenegg +greenday1 +greenda +green55 +green4 +greekgod +greek1 +greatnes +greatdan +grazia +grandson +grabber +gould +goshawk +gordy +gordon2 +gopnik +goofus +goof +good4you +goobe +golfer01 +golf1234 +goldi +godsgift +godisgreat +goddes +goathead +goater +glory1 +glasss +glassjaw +glasnost +glance +glamis +gjlfhjr +gjkrjdybr +gjhjlfcjqrb +gizmodo2 +gismo +ginogino +ginnie +gillis +giancarlo +giampaolo +ghtlfntkm +ghjtrn +ghjcnjz +ghjcnjabkz +ghjcgtrn +ghbjhbntn +gfhjkm13 +gfhfyjbr +gfhfvgfvgfv +gfghbrf +gfgfrfhkj +gfg65h7 +gettysbu +getfucked +geroin +geometry +gennaro +gennadiy +gefest +geetha +gbljhfcs +gbljhfc +gbfcnhs +gavin1 +gavaec +gautam +gaudeamus +gattaca +gass +garik +gamgee +galleries +gallego +galinka +g5wKs9 +g123456 +fyutk +fylhttdf +fylhtq1 +fvfnjhb +futebol +furka +fuhrer +fuels +fuckyou8 +fuckyou6 +fuckyou0 +fuckuall +fuckgirl +fsunoles +fsd9shtyu +fromhell +freezing +fredy +freddo +freaksho +franken +franke +franka +france98 +fourstar +fortunat +forest99 +ford123 +ford11 +fondle +folly +foda +flyingv +flyfly +fltkbyf +flight1 +fleur +flashnet +flappy +flaco1 +flabby +fkbcrf +fjnq8915 +fizika +fiveiron +fish99 +firstone123 +ffggyyo +fevral +fest +ferrara +fenwick +feldspar +feeble +feature +favorite4 +fatbitch +fastman +farts +farrier +fanboy +falconer +faith2 +faber +fCc5NKy2 +f12345 +eyebrow +extra300 +exocet +exile +exclusiv +excited +example +everclea +event +euro2000 +estrellit +espinosa +escrow +erwin1 +erreway +eroero +ernies +ermine +entertai +ensemble +endgame +emma22 +eminem12 +emilka +emely +embrace +ember +eman +elvina +elusive +elroy +ellada +eliot +electr +elain +einstei +eiffel +eggroll +effects +edibey +eatass +easy1234 +ears +eagle99 +eager +eKLhiGcz +dynomite +dwl610 +durandal +dunno +dunedin +dumont +dummer +dukies +dukers +dude69 +dude1998 +dude1234 +dude1 +ducttape +duckey +duchess1 +duce +ducat +dthjybxrf +dsds +drum66 +drugs +drizzit +driscoll +drain +dragonfi +dragon20 +dracul +dowling +dougla +douchebag +doubles +dorothy1 +dori +dopeman +dopehead +dopamine +doohan +donttell +donsdad +donn +dolphins1 +doller +dolce +dogma1 +dobbs +dlanor +dkalis +djtiesto +ditka +distant +disne +dishes +discord +dirtygirl +dirtybir +dirt49 +dippy +dima1989 +diavolo +diann +diamond7 +diagonal +diadora +dhtlbyf +dfyjdf846 +dfktynbyrf +devilmay +deutsche +deskjet1 +desirae +design1 +dervish +derosa +depp +department +denwer +dennis2 +deni +demon123 +dell50 +deles +delerium +delenn +delay +deidara +decade +debussy +dearborn +dear +ddd123 +david4 +david11 +dave55 +dascha +darth1 +darren1 +dark1 +dare +dardar +darcy +darcey +darby1 +darb +danidani +dancers +damnyou +damilola +dameon +dame +daledale +dalamar +cvbn123 +cuzz +curiva +culebra +cuddly +cthuttdf +cruises +cross1 +criss +crisp +crimea +creek1 +cram +cowd00d +cowboy22 +cowboy12 +courtne +counte +coulter +cosmo123 +coronas +corona1 +cornhusk +cormac +cork +corgi +coppers +copland +coolguy1 +cool1234 +cooking1 +converge +control2 +conor1 +conduit +comrades +communit +commandos +command1 +come2me +comatose +comand +color1 +colacola +coincoin +cognit +coco11 +cockgobbler +cocacola1 +cobra12 +cnthdjxrf +cntgfyjdf +clownboy +cloud1 +clothing +cleocat +clements +cleary +cleanup +claws +classi +clash +cjymrf +cjkjdtq +cindee +cincinna +cimbo +ciccione +chynna +chulo +chulita +chuchi +chubb +christopher1 +chrisrey +chris25 +chris10 +chomp +chode +chitty +chips1 +chink +chinito +chilis +chile1 +chia +cheyenn +chewbaca +chevy69 +chest +chessy +cheroke +cheops +cheezit +cheese2 +cheerlea +cheechee +checkito +cheats +chasmo +chargers1 +changer +chanelle +chane +chanc +champ123 +cgtwbfkbcn +cestmoi +cessna15 +cer980 +cepseoun +celtic1888 +cdtnkfyrf +cbufhtnf +cbr600f3 +cbhtym +caustic +catboy +caso +cascada +carvalho +cartma +carrion +carp +carolann +carnaval +carlos123 +carleton +caribe +capture +capstan +capital5 +canvas +canopy +canoneos +cannibus +canman +canesfan +cando +canbeef +canalc +camry +campari +cammie +camaron +calves +calumet +calpoly +caldera +calbear +cairo +cagliari +cacique +cabezon +c43dae874d +c0rvette +byron1 +byrjuybnj +bykemo +bycnbnen +buzzzz +butthea +butterbean +busman +bushwick +bushbush +burnt +bunnyman +bunky1 +bundle +bullyboy +bullwinkle +bugsy1 +bugmenot +buffy2 +buddy3 +buddog +buckets +bubba11 +brunos +bruins77 +brucew +brownlov +broken1 +britton +britches +brisco +brillo +brigit +brielle +bridgette +bridge1 +brick1 +bria +brewery +brewcrew +breed +breaking +breaker1 +brandon3 +brandi1 +brandan +brampton +brainy +brain1 +bpgjldsgjldthnf +boywonde +boyd +boycott +bowen +bouvier +boundary +bouncy +botafogo +boss429 +borodina +born +borden +bootmort +boomerang +boombox +bookman +boobys +boobss +bonscott +bonobono +bondbond +bolita +bogomol +bogdana +bob2 +bnm123 +blueone +bluedragon +blue28 +blue00 +blood666 +blonde1 +blogger +blob +blink1 +blessings +blankman +blanch +blakes +blair1 +blahblahblah +blackros +blackmetal +blackhole +blackhat +blackfly +black9 +black666 +black3 +bitten +birdman1 +birdcage +birch +biplane +billyray +billyk +bills1 +billet +billbob +bill1234 +bilbos +bikman +bijoux +bigun +bigted +bigsexy1 +bigrod +bigmack +bigjuggs +bigfeet +bigears +bigdong +bigbrother +bigboner +bigals +biddy +bicep +bibigon +biarritz +betrayal +bestboy +bespin +berwick +bern +berlin1 +berkley +benzene +benwin +bensam +benn +benelli +benefit +bendog +bend +below +bellows +bellas +beginner +beerss +beer69 +beer1234 +beefbeef +beckie +bechtel +bebita +beatoff +beatbox +bears34 +bearcub +bear2327 +beanhead +bdr529 +bcnbyf +bbonds +bbbbbbbbb +bbbbbb99 +bb123456 +bazuka +bazaar +bayer +battle1 +batman13 +basta +basshead +basilisk +basel +baseball12 +basalt +baroque +barge +bard +baptist +bankshot +bandit01 +bandido +banderos +bandana +bananza +balin +baldman +baldie +balata +baklan +badseed +badminto +badluck +badaboom +bad11bad +babyruth +baby1234 +babochka +babalu +b1234567 +b00ger +azucar +aztec1 +azfpc310 +azerty12 +ayi000 +awdrgyjilp +awdawd +avr7000 +avon +average +avenge +avatar1 +avata +aura +august22 +atwood +atwater +ataris +astron +astonmartin +aston +assss +asssex +assmaster +asshole3 +assets +assa123 +ashley01 +ashash +ashaman +asdfasdf1 +asd123qwe +asaasa +as12345 +artimus +artem2010 +artem123 +arshavin +arrowhead +arowana +arnie1 +armor +arminia +armine +armen +areyuke +areyou +aquemini +april26 +april22 +appollo +apple5 +apology +aphrodit +apartment +antrim +antonio2 +anthro +anneli +annamaria +anna1985 +anna1984 +anja +anisimov +anisha +aniram +ania +angelita +angel10 +andy1 +andrew22 +andrew11 +andrew01 +andreika +andie +anders1 +anderlecht +and123 +anadrol +anabelle +amparo +amberlee +amazonas +amazed +amaranth +am4h39d8nh +alston +alskdjfh +alphaome +allochka +allianz +aliso +alieva +alices +alias1 +alfredo1 +alfaalfa +alex12345 +alerts +alecia +alabama123 +alabam +aiwa +aishiteru +airmail +agile1 +aerobics +aekdb +adnama +adilet +adidas11 +adding +adapters +adaptec +adamski +acuario +actros +ace1062 +acdc123 +accounting +accountbloc +access16 +about +abigale +abcde12345 +abcd12345 +abc1 +abbydog +abbyabby +abby123 +abbas +ab12cd34 +a666666 +a23456 +ZZZZZZ +ZAQ!2wsx +YM3cauTj +XXX +XAVIER +WannaBe +Wally +WOLF +WESTSIDE +WELCOME +Vladislav +Viper +Vfhbyf +VeryCool +VURDf5i2 +VIPER +Uuuuuuu1 +Uuuuu1 +Tv612se +Ttttttt1 +Ttttt1 +Trouble1 +Titanic +Thursday +Thumper1 +Tennis1 +Stupid1 +Sterling +Spencer +Smith +Sluts1 +Slut1 +Simon1 +Shithead +Sf161pn +Scarlett +Savannah +Samuel1 +Samsung1 +Sammy1 +Sailor +STORMY +STEPHEN +SKIPPY +SKIPPER +SECURITY +SATURN +SABRINA +Rz93qPmQ +RvGMw2gL +Rulezzz +Rrrrrr1 +Radiance +ROSEBUD +ROBBIE +RICK +REDDOG +RASCAL +RADEON +R4zPM3 +QAgsuD +Pride +Precious +Picard +Peaches1 +Peace +Password01 +Paraklast1974 +Panasonic +Pamela +PLAYBOY +PIMP +PEOPLE +PATRICIA +OUTLAW +OSCAR +Nnnnnnn1 +Newyork1 +Napoleon +NUNZIO +Motorola +Missy +Michaela +Member1 +Matt1 +MICHIGAN +MBKuGEgs +MADDOG +Lllll1 +Light1 +Legend +Larisa +Lantern +Kristin +Knight1 +Kkkkkk1 +Kennedy +Karen +KLEANER +KING +KGveBMQy +KATANA +Jenny1 +Jasper1 +Jake1 +Jack +JEREMY +JABell +Irish1 +Indiana +Iceman1 +INTERNET +IMaccess +Hudson +Honda +Homer +Hollage +Hobbit +Highland +Herman +Hector +Harry1 +Harold +HardwareId +Hamilton +HOTROD +HOOTERS +HOME +HARDCORE +Guinness +Grenden +GreatzYo +Great1 +Geronimo +GREG +GIBSON +Fuckyou2 +Frank1 +Forever +Forest +Flash +Fishing1 +Fann +FUCKING +FRIEND +FREE +FREDDY +Eugene +EUGENE +Ds7zAMNW +Dro8SmWQ +Dolphin +Deniska +Danny +Danijela +Daisy +DEXTER +DAVE +Cuddles +Connie +Compaq +Colorado +Clayton +Champion +Catherin +Calavera +COURTNEY +CHICAGO +CARMEN +CAMERON +Butter +Butler +Budlight +Buddha +Bryan +Brenda +Bremen +Bobby1 +Blood +BiteMe +Bill +Bentley +Basketba +Banana1 +Balls1 +BUTTHEAD +BUBBA +BIGMAC +BARBARA +Av473dv +Audrey +Assassin +Aoi856 +Angela1 +Alyssa +Allison +Alexey +Aberdeen +ARENRONE +APPLES +ALEJANDR +ABCD1234 +9ball +9Z5ve9rrcZ +999666333 +9955 +9837 +9638527410 +963214 +9393 +9333 +91919191 +9085603566 +9051945 +9004 +8vfhnf +89876065093rax +88998899 +887788 +880888 +8778 +87654321q +870621345 +87062134 +85218521 +8481068 +8302 +8123 +7seven7 +7ofnine +7mary3 +7eleven +789963 +7899 +78978 +78965 +78917891 +78621323 +785001 +777222 +777 +7718 +750750 +7477 +7300 +72chevy +7274 +718293 +70707 +70077007 +6987 +6969696 +687887 +6874 +6846kg3r +67stang +67390436 +66996699 +6699 +666222 +665566 +6655 +665259 +6633 +66005918 +65mustan +6556 +64256425 +6424 +6279 +6263 +6169 +5string +5nizza +5C92V5H6 +5916 +5792076 +5574 +5556633 +555555d +5535 +552233 +5513 +5512 +5510 +54725472 +5458 +54545 +5449 +5434 +542001 +5417 +5415 +536536 +5288 +527952 +52545856 +523523 +5220 +521521 +515515 +51525354 +515069 +5125 +5118 +5049 +4real +4me2know +4cancel +4EBouUX8 +4901 +4823 +47ds8x +471111 +4701 +4664 +4648 +4610 +456rty +4565 +45645645 +4562 +4506 +44556677 +4454 +4433 +4404 +4366 +4300 +42684268 +4254 +424365 +4206969 +420666 +420024 +4159 +4153 +41514151 +414243 +4125 +4100 +3e4r5t +39533953 +37913791 +37583867 +3722 +369741 +36925814 +3639 +3611jcmg +3574 +3570 +3469 +3422 +3374 +33553355 +33221 +3292 +3278 +3275 +3247 +3242 +316271 +3151 +31415927 +3123 +31122010 +31121999 +311094 +311076 +31101970 +31101965 +310893 +310890 +310872 +31081997 +31072002 +31071998 +31071965 +31071961 +31051965 +31011969 +31011966 +31011959 +306306 +30624700 +301278 +301277 +301274 +30121972 +301171 +30111997 +30111961 +30111958 +3011 +301095 +301094 +30101970 +30101969 +30101964 +30101961 +30101960 +300993 +300988 +30091967 +30091962 +300896 +30081997 +300771 +30072001 +30071996 +300694 +30061971 +30061960 +300493 +300475 +30041957 +300394 +300374 +300371 +30031969 +30031960 +30031957 +300172 +300161 +2much4u +2i5fDRUV +2big4u +2913 +29121997 +29121960 +291172 +29111974 +29111969 +29111968 +29111960 +291083 +291075 +291074 +29101970 +29101961 +290993 +290977 +290875 +29081962 +29071958 +290693 +2906 +290575 +29051966 +29051965 +29051961 +29051960 +290493 +290491 +29041999 +29041960 +2904 +290372 +290292 +290276 +29021960 +290172 +290161 +29011970 +29011959 +28infern +287Hf71H +281297 +281294 +28121972 +28121963 +281195 +281179 +28111996 +28101975 +28101967 +28101963 +280994 +280981 +280893 +280876 +28081999 +280779 +280776 +28071968 +28071966 +28062000 +28061964 +280596 +280570 +280476 +28041963 +28031998 +28022000 +28021967 +28021955 +280177 +280174 +2763 +27262726 +2718 +271293 +271267 +27121971 +271194 +271173 +27111995 +271077 +271074 +270964 +27091999 +27091962 +27091959 +27081995 +2708 +27071998 +27071968 +270707 +270679 +270673 +27062000 +270595 +270571 +27051959 +270476 +270473 +270465 +27041999 +27041968 +27041961 +27041960 +270393 +270368 +27031970 +270293 +270277 +27021999 +27021963 +27021962 +27021960 +270179 +270178 +270172 +2677 +2666 +2651 +2643 +261298 +261277 +261271 +261269 +26122000 +261195 +261194 +261170 +26111964 +26101965 +26091967 +26081969 +26071998 +26071962 +26071960 +260696 +260672 +26061998 +26061964 +26041998 +260376 +260263 +26021959 +26011997 +2597174 +2583 +2578 +2566 +255ooo +255555 +2550 +2523 +25212521 +2520 +2515 +25128 +251272 +25111958 +251065 +25101967 +25101958 +25101954 +250973 +25091969 +25091966 +25091958 +250878 +250872 +25081998 +250796 +250795 +250676 +25061999 +25061968 +25052505 +25041964 +250370 +25031961 +25031960 +250281 +25021998 +25021964 +250177 +25011966 +25011960 +25011959 +2482 +2468013579 +2464 +241296 +241279 +24121967 +24121966 +241199 +241073 +24102410 +24101973 +24101969 +24101962 +24101958 +240996 +240993 +240975 +240970 +24091997 +240773 +240771 +24071971 +24061998 +24051967 +24051958 +24042000 +24041997 +240396 +240372 +240367 +24031967 +24031961 +24031957 +240280 +240279 +240277 +240276 +24021964 +24021962 +240177 +240171 +240169 +24011965 +24011962 +240000 +2371 +2350 +2342 +23372337 +231297 +231293 +231270 +23121967 +23121962 +231169 +231161 +23111968 +23111964 +231072 +231067 +231064 +23101957 +230996 +230975 +23091967 +230893 +23081966 +230774 +23068 +23061998 +23061968 +23061964 +2305822q +230574 +230573 +23051969 +23051966 +23051965 +230497 +230478 +23041968 +23032303 +23031968 +23031965 +230295 +230175 +230169 +23011967 +23011963 +23011960 +230023 +2299 +2292 +228822 +22856 +2279 +2270 +226622 +2263 +2250 +2241 +22362236 +223366 +223107 +2228 +2226 +221987 +22132213 +221297 +221274 +221270 +221175 +22111968 +22111959 +221075 +220996 +220992 +220968 +220892 +220872 +220871 +220794 +220775 +220774 +220769 +220767 +22071966 +22071963 +22061969 +220599 +220575 +220573 +22051967 +22051961 +22051960 +220498 +220472 +220462 +22041956 +220372 +220368 +22031997 +22031966 +220294 +22021970 +22021963 +22021962 +220202 +220178 +220175 +220160 +22011999 +22011958 +2200 +2133 +212212 +2121212 +212009164 +211279 +21121969 +211192 +211175 +21111968 +211069 +211068 +21091996 +210875 +210694 +210675 +21061966 +21061960 +210568 +21051963 +210481 +21041962 +21041956 +210376 +210373 +210371 +21031967 +210195 +210193 +210180 +210178 +21011967 +202202 +20121964 +20121959 +201175 +201174 +20111997 +201075 +201073 +20091989q +20091966 +20091962 +200877 +20082000 +200795 +200771 +20071999 +20071959 +200707 +20061964 +200576 +200573 +20051969 +200492 +200474 +200472 +20041999 +20041968 +20031967 +20031964 +200298 +200279 +200278 +200263 +20021956 +200174 +200172 +20011965 +20011962 +20011957 +200111 +200101 +200007 +1qazxdr5 +1qazxcv +1qa2ws3ed4rf5tg +1q2345 +1golfer +1derful +1david +1chance +1andonly +1Wwwww +1Sunshin +1Player +1Pass +1Murphy +1Mmmmm +1Lllll +1Iceman +1Heather +1Green +1Gggggg +1Diablo +1Bigmac +1Amanda +1996gta +19944991 +199411 +199103 +198821 +1987198 +198711 +198701 +198686 +198625 +19852 +19851985p +198512 +198425 +1984198 +198321 +19822891 +198206 +1980198 +197926 +1978197 +197676 +197575 +19755791 +197225 +197200 +196820 +19461946 +193728 +1928374655 +19281928 +191287 +191284 +191282 +191277 +19121967 +19121959 +191183 +191180 +191179 +191168 +19111995 +19111969 +191086 +191078 +19101998 +19101973 +19101961 +19091969 +19091964 +19091962 +19091958 +19081998 +19071999 +190679 +19061965 +190594 +190586 +190575 +190566 +19051967 +19051965 +19051962 +19041959 +190389 +190379 +19031998 +19031969 +19031964 +19022001 +19021966 +19021959 +19021956 +190188 +190166 +19012001 +19011973 +19011968 +19011960 +1870 +1860 +182838 +18254288 +181295 +181280 +18121998 +18121961 +18121960 +181193 +181176 +181169 +18112000 +18111965 +181081 +181078 +181075 +181070 +18101999 +18101998 +18101973 +180994 +180885 +180876 +180870 +18081997 +18081961 +180774 +18072000 +18071966 +180698 +180696 +180695 +180680 +180676 +180672 +180669 +18061969 +180570 +18041962 +180373 +180371 +180364 +180360 +18031964 +18021963 +180172 +18011968 +18011963 +1774 +1772 +17711771s +1760 +1725 +1722 +17151715 +171275 +171269 +17121995 +17121966 +171181 +17111996 +17111968 +171071 +17102001 +17101968 +17101967 +170995 +17091998 +17091968 +170894 +17081969 +170798 +170795 +170770 +170680 +17061967 +17061959 +17061706 +17052000 +17051998 +17051969 +170497 +170494 +170475 +17041998 +17041960 +170394 +170378 +170366 +17031966 +170294 +170272 +17021999 +170171 +17011964 +1671 +1646 +1633 +1617 +161276 +161191 +161175 +16111998 +16111961 +161078 +161074 +16081965 +16071960 +160698 +160694 +160669 +160659 +16061965 +160566 +160477 +160471 +16042000 +16041967 +160377 +160374 +16032000 +16031998 +16031996 +160277 +160264 +16022000 +16021968 +16021966 +160177 +16011967 +16011962 +16011960 +159951159 +15975391 +1597535 +1597532 +159456 +1592 +158uefas +1575 +1569 +1563 +155155 +1540 +1537 +1527 +1522 +1517 +151295 +151294 +151293 +151275 +151271 +151269 +15121999 +151215 +151177 +15111997 +15111963 +15111960 +151093 +151082 +151065 +15101967 +150896 +150894 +150880 +150878 +150872 +150772 +150770 +15071969 +150596 +150569 +15051966 +150475 +150466 +150464 +15041999 +15041965 +150396 +15031964 +150299 +150298 +15021960 +150197 +15011966 +15011960 +149521 +1476 +1475 +1473 +147147147 +1468 +1454 +1450 +1435 +14159265 +14142135 +141312190296q +141296 +141295 +141279 +141271 +141097 +141075 +141071 +140995 +14092000 +140775 +140766 +14061972 +14061968 +140597 +14051963 +14051954 +14041957 +140397 +140394 +140372 +140293 +140262 +14021967 +140191 +14011962 +14011961 +1384 +1381 +1376 +1370 +136900 +1357913 +134679q +1346795 +133133 +1330 +132Forever +132000 +1313131313 +1313131 +131296 +131292 +131271 +131270 +13121999 +131075 +13102000 +13101964 +13101963 +13101961 +130975 +130969 +13091997 +130861 +13081965 +13081959 +13071996 +13071966 +130673 +13062001 +13062000 +13061972 +13051999 +130471 +130462 +13041970 +13041966 +13041963 +130378 +13031966 +130277 +130274 +130262 +13021970 +13021963 +130198 +130197 +130177 +130176 +130174 +13011961 +13011960 +1283 +1270 +12481248 +12457896 +123qweqwe +123qqq +123lol123 +123jlb +123four +123978 +123654z +123589 +12350 +1234qwerasdfzxcv +12345y +12345j +123456rrr +12345699 +1234567qwertyu +12345678m +123456789y +123456789Q +123452 +1234512i +123451234 +123412341234 +123342 +123321w +123321qaz +1233215 +1232580 +123212 +123181 +123174 +123111 +122778 +122381 +12201220 +121973 +121380 +121299 +121257 +121214 +121200 +121196 +121195 +121170 +121163 +12111969 +12111967 +12111961 +121096 +121067 +121061 +120998 +120977 +120966 +12091968 +12088 +12081208 +12071999 +12071967 +12071960 +12071207 +120698 +120696 +12068 +12067 +12061964 +12058 +12051971 +12051961 +120499 +12041997 +120398 +12031960 +120273 +120199 +120166 +12012001 +120004 +1196 +1189 +1187 +1160 +1157 +1148 +11381138 +11251422 +112279 +112233aa +11221 +11211 +111lox +111984 +111980 +111978 +111973 +111964 +111558 +111299 +111289 +111271 +111269 +111222333000 +11121999 +11121969 +11121 +111195 +111174 +111166 +111161 +11112002 +11111998 +11111997 +11111969 +11111911 +1111112 +111068 +111067 +11101967 +11101964 +110977 +110972 +11091999 +11091969 +11091961 +11081966 +110798 +110759 +110667 +11061999 +11061998 +110597 +110575 +110563 +11051961 +11051960 +11041968 +11041964 +11041956 +11038 +110375 +110373 +11032001 +11031997 +11031963 +11031961 +11031960 +110274 +11021960 +110195 +110178 +110175 +11011961 +1081 +10801080 +104328q +104104 +1037 +102181 +102100 +102000 +101991 +101671 +10121999 +10121966 +101210 +10111998 +10111968 +101068 +101065 +10101967 +10101964 +10101960 +100997 +100969 +10091963 +100893 +100866 +10081969 +10081966 +10081962 +10081960 +100796 +100794 +100775 +100768 +10071998 +100675 +100673 +100669 +100665 +10061968 +100584 +100572 +100562 +10052000 +10051998 +10051967 +10051965 +100493 +10048 +100470 +100466 +100458 +10041965 +10041964 +10041961 +100396 +100391 +100368 +100367 +100366 +100261 +10022001 +10021960 +1001sin +100194 +100169 +10011999 +10011996 +10011966 +1-Oct +0973 +0968 +091294 +091280 +09121999 +09121998 +09121997 +09121962 +091196 +091191 +09111971 +091096 +091077 +09101998 +09101962 +090996 +090994 +090969 +09091959 +090878 +090877 +090876 +09081963 +09080706 +090777 +090694 +090675 +09061997 +09061966 +09061962 +09061961 +090592 +090471 +09042000 +09041958 +090390 +09032001 +090287 +090285 +09022000 +09021966 +09021965 +09011968 +09011967 +09011961 +09011960 +0892 +0820 +081291 +081276 +081272 +081194 +081170 +08111997 +08111974 +081092 +081084 +081072 +08101958 +080990 +080981 +08092000 +08091965 +08091956 +080895 +08081962 +08081960 +08080808 +08080 +080794 +08071966 +08070807 +080692 +080682 +080675 +08061965 +080565 +08051967 +08051966 +08051961 +080478 +08041970 +08041958 +080389 +080377 +080375 +08031965 +08031962 +080297 +080294 +080277 +08021962 +08021960 +080188 +080179 +08011969 +08011962 +0781 +0730 +0717 +071275 +071272 +07121998 +07121968 +07121966 +071198 +071192 +071169 +07111971 +07111962 +07111960 +071080 +071078 +071073 +071070 +07101997 +070895 +070892 +070799 +070771 +07071959 +070697 +070685 +070678 +07061963 +07061962 +070587 +070581 +07052000 +07051998 +07051970 +070476 +07041965 +070396 +070379 +070358 +07031998 +07031971 +07031965 +070296 +070294 +070277 +07022001 +07021998 +07021963 +07011967 +0682 +0659 +061278 +061276 +061262 +061195 +061182 +061085 +061071 +06101968 +06101961 +060994 +060980 +06091998 +060881 +06081971 +06081970 +060798 +060790 +060776 +060774 +060773 +06071968 +06071966 +06071962 +060668 +060662 +06061963 +060599 +060595 +060495 +060488 +060476 +06041963 +06031965 +06031955 +060294 +06021965 +06021960 +060176 +060166 +06011963 +0584 +052677 +051982 +051970 +0514 +051293 +051259 +05121965 +05121959 +051192 +05111961 +051088 +050984 +050976 +050893 +050882 +050878 +050876 +050862 +05081970 +05081968 +050793 +050779 +050776 +050772 +050573 +05052001 +05051968 +05051963 +05051959 +050496 +050493 +050479 +05041971 +050396 +050393 +05031970 +05031969 +050296 +050293 +050292 +050287 +050286 +050279 +050275 +050269 +05021967 +05021962 +050178 +050175 +05011967 +048ro +0488 +0483 +0478 +041284 +04121996 +04121964 +041191 +041176 +041169 +04111964 +041084 +041079 +04101962 +040996 +040988 +04091970 +04091969 +04091968 +04091962 +040894 +040891 +040872 +04082000 +04081997 +04081966 +04081959 +040773 +04072000 +04071998 +04071967 +04071959 +040683 +04061969 +0406 +040594 +04051999 +04051968 +040473 +040471 +040470 +04041967 +04041955 +040384 +040373 +040368 +040366 +04032007 +04031999 +04031968 +04031964 +040287 +040277 +04022000 +04021970 +04021965 +04021963 +040192 +04011962 +031281 +031275 +03121999 +03121998 +03121969 +031198 +031169 +03111973 +03111970 +031075 +03101966 +03101961 +03092000 +03081966 +03081963 +030796 +030794 +030776 +030771 +03061960 +030591 +030569 +030568 +030564 +03051996 +03051966 +030469 +030367 +030365 +03032010 +03031960 +030291 +030277 +030197 +03012000 +03011970 +02551670 +021283 +021277 +021272 +021271 +02121995 +02121969 +021194 +021180 +021170 +021096 +02101966 +02101958 +02101957 +020975 +020881 +020876 +02081997 +020798 +020795 +020779 +02071967 +02071963 +02071961 +020699 +020682 +02061966 +020597 +020593 +02051999 +02051963 +02042006 +02041965 +02041964 +02041958 +020381 +020376 +020375 +020374 +020297 +020277 +020270 +020269 +02022007 +02022002 +02021966 +02021963 +020193 +020178 +02011999 +02011967 +02011961 +02011955 +0191 +0162 +011270 +011263 +0112358 +01121998 +01121996 +01111965 +011091 +01101967 +01101964 +010994 +010977 +01091967 +01091964 +01091959 +01081965 +010778 +010775 +01062010 +01061998 +01061965 +01061961 +010564 +01051957 +01041967 +01041963 +010368 +01032004 +01022002 +0101dd +010158 +010157 +0088 +00700 +00198 +001978 +0014 +0008 +0005 +000011 +00000ty +000002 +000000z +(null +!QAZxsw2 +zzaaqq +zuluzulu +zsecyus56 +zse4rfv +zoozoo +zlozlo +zippos +zgjybz +zebra123 +zcxfcnkbdfz +zavilov +zapidoo +zanardi +zachar1 +yvonne1 +yuitre12 +ytpyf. +youngs +yodude +yjhbkmcr +yjdujhjl +yjdbrjdf +yhnujm +ygfxBkGT +yfcnzvjz +yeti +yellow5 +yellow22 +yeahright +yasacrac +xzxzxz +xxxp455w0rd5 +xoxoxoxo +xiaoyuA123 +xfhkbr +xcat_xca +wycombe +wrongway +write +wowlook1 +worldwide +worldwar +wolley +wolfee +wodahs +wkmcpmn +witcher +wireman +winner12 +winam +willyboy +william8 +willey +wilkinso +wiley1 +wildon +widder +whynotme +whitehea +whit +wheaton +whatluck +whatis +whalen +werule +wert12 +welcomes +weinberg +weihnachten +weihnachte +webtvs +websolutionssu +weasels +water12 +wartburg +warp +warm +warlord1 +warlock1 +warhammer40k +waltrip +waltham +walnuts +wallstre +walls +wallpape +walhalla +walera +wakeboar +wake +wakawaka +waiter +wahwah +wagoneer +wacko +vwpassat +vovan +vova12345 +voronina +vonnie +volvofh12 +volunteer +volodja +voivod +vladlena +vlad123 +vjnjhjkf +vivia +visigoth +virgos +vipvip +viper7 +viper69 +viper01 +violet1 +vikin +vika1998 +vika1996 +videoman +vfyxtcnth +vfvf12 +vfuflfy +vfubcnh +vfrcbvjd +vfhbyfvfhbyf +vfcmrf +vester +veruca +veroniqu +veronik +ventura1 +venetian +vending +vehxbr +vbitkm +vaz2115 +vasile +varsha +varela +vanhorn +vanes +validate +valerik +valerian +valenok +v123456789 +uuuuuuuuuu +uuuuuuuuu +uthvfybz +usmc01 +unseen +unison +uncles +uhtqneyu +ufkjxrf +udders +tyson123 +twelve12 +tuvieja +tusk +turin +tupac1 +tummy +tuesday1 +tubaman +tttttt99 +tsmith +trusty +truskawka +truelov +truegrit +truant +trouble2 +troubl +trotters +trooper2 +tronic +trixi +trim7gun +tribunal +triad +tresor +trekbike +treehous +traxdata +travieso +traveller +trash1 +tram +tracy123 +tplate +toyman +toxicity +toscana +torquay +toppdogg +topnotch +toontoon +tony45 +tony44 +tony12 +tommyb +tomb +tomass +tom204 +tom +tokyo1 +toke +toddler +today2 +toccata +titti +titone +titania +tirpitz +tiptoe +timote +timm +time2go +timberwo +tima +tiikeri +tight1 +tiger8 +tiger21 +tiger13 +tiffanie +tierra +tiddles +tiburo +thurber +throne +throatfuck +thoth +thomas22 +thom +thicknes +theword +thewolf +thetaxi +thestone +thespian +thesims2 +thereds +theodora +themis +thefrog +thefly +thecount +thebeatl +thanku +thank +tgbxtcrbq +tester1 +testament +tereza +teresa1 +teratera +tequil +tenor1 +template +temp1 +telus01 +telefoon +telefone +teeter +tbear +taylorc +taylor11 +tautt1 +tassadar +tart +targa1 +tarawa +taratata +taproot +tanushka +tantric +tannenbau +tankist +tanis +tangsoo +tango123 +talk87 +talented +takeme +takako +tabletop +sys64738 +sympathy +symantec +swifts +sweeties +swee +swansong +suspend +susan123 +surgut +surge +surfe +superm +superdude +superdav +supercop +supera +sunnys +sungod +sundog +sundial +summer08 +suffering +suckfuck +success2 +subscriber +stupor +stunts +stuffs +stuffing +stuffed +studmuffin +strikers +strike3 +strelka +stratocaster +strateg +stpaul +stonie +stoker +stoked +stockhol +stinkyfinger +stimorol +still +steveh +steve22 +steroid +steph123 +steffan +stanstan +stangs +standrew +standing +stall +stainless +stabbin +sssss1 +ssbt8ae2 +squires +spuddy +spritzer +splitter +spinners +spinnake +spike2 +speedy2 +speck +spawn7 +sparrow1 +sparky99 +sparky11 +sparky01 +spankme1 +spammm +space199 +soybean +sovereig +southwes +soundwav +sosexy +sort +sophieh6 +solder +sofiko +soccer8 +sobolev +soarer +snowwhite +snowstor +snowcat +snowbal +snoopy2 +sniper123 +sniffles +snazzy +smoot +smith22 +smeg +smalltit +smalldog +slutfuck +sloeber +slobber +sloan +sling +slender +sleeve +sleddog +sleazy +slavko +skylight +skyfir +skyeseth +sklave +skiller +skidrow +sketchy +skanky +sixer3 +sito +sissy123 +sisisi +sirrom +sinnfein +simbacat +silvia1 +silver5 +silver01 +siffredi +sierr +sidney1 +siddhart +shumaher +showbiz +shocks +shockey +shmily +shivers +shithead1 +ships +shineon +shinchan +shilling +sheree +shenmue +shemp +shellac +sheetal +sheena1 +shedevil +shebadog +shavkat +shatter +sharper +shant +shango +shameles +shalini +shadowru +shadowman +sexybo +sextime +sexmad +sexi +sexfreak +serjik +sergiy +sergant +seppel +semaj1 +sell +selecta +seabass1 +sdfsdfsdf +sdbaker +scubas +scubaman +scrapy +scrapp +scrapland +scorpian +scorp +scooter3 +scoopy +scoop1 +schwing +schuster +school12 +scholes +schalke04 +scanner1 +scanman +sayuri +saved +saurus +saucer +satish +satine +sassy2 +sasha777 +sasha1991 +sargsyan +saralee +sarahh +saraann +sapporo +sanyco +santorin +sanson +sanna +sanctuary +sanction +sananton +samuel12 +samson12 +sammyy +sammy11 +samfox +sambo1 +samar +sama +salvado +salima +salim +sale +saladin +sakic +safrane +safado +sactown +sacha +sD3utRE7 +s1s2s3s4 +ryder1 +ryan01 +rustyboy +rusty5 +russia1 +ruskin +rushman +rupert1 +runnin +runne +rumba +rugbyman +rufuss +ruffus +rueben +rudenko +ruddy +rubberdu +rstlne +roxyroxy +rotter +rossiya +rossigno +rosies +rosebush +rosalia +roos +rookie1 +rondo +romer +roma1993 +rollrock +rollover +rollers +roisin +rockyy +rocksta +rockshox +rocket21 +rock1234 +robotic +robotec +robert22 +robb +roadhog +rkbvtyrj +rjycnbnewbz +rjhjyf +riptide1 +rinker +rimini +rigid +ridgeway +rick1 +richy +rich123 +rhfvfnjhcr +rhett +rfpfyjdf +rfntyf +rfhbyrf +rfghjy +reviewer +revelati +retter +retsub +retrac +retnuh +restore +remmus +remi +rellim +relic +reiter +rehman +regine +regin +regedit +refer +redsox20 +redsox11 +redshirt +redlion +redlands +redhill +redcar27 +redbank +redarmy +recipe +rebate +reamer +rbhjxrf +rbgtkjd +razvan +ray123 +rawr +rasul +raque +rank +ranita +ranger75 +ranger6 +ranger5 +ranetka +randie +rammstein1 +ramina +rambos +rambo2 +ramana +raman +ramadan +ram123 +rakas +raissa +rahul123 +rafale +racism +rachel69 +racecar02 +rabbit12 +qwest123 +qwertyy +qwertyu123 +qwerty32 +qwerty100 +qwerttrewq +qweqw +qweasd1 +qwe123qwe123 +qwas +quixotic +queens1 +queenas8151 +quart +quaresma +quantum1 +quantex +quail +qscesz +qqqaaa +qqq11 +qazxswe +qazxcvb +qazxc +q12we3 +putangina +pussylips +pussy12 +push +purple69 +purple13 +punchy +pumba +pugdog +ptichka +psychic +prout +prototyp +protection +prostreet +prostotak +prolog +processor +probably +prisonbreak +priscila +prince11 +primes +presidente +pray +praveen +ppppppppp +powerpla +poulette +pouch +potte +pothole +postie +postage +porno2 +porn11 +poppi +popi +poopypan +poopi +pools +poohbear1 +polkilo +polkadot +polin +policeman +poiulkjh +pointman +pogoda +pocus +poacher +plywood +playstatio +playgrou +platonic +platinu +platini +plaisir +plain +pkunzip +pjkeirf +pizzle +pistola +piotr +pills +pilchard +pietje +pie123 +picket +piccolo1 +piPEUTVJ +photowiz +philos +philippines +phili +philbert +pfobnf +pfizer +peugeo +peterm +peterburg +petera +peter69 +peter5 +peter2 +perverts +perrine +penquin +penpal +peni +penguin6 +pendej +penchair +pedrito +peanutbu +peacock1 +pd25 +pcgamer +paula123 +paul10 +patterson +patrick4 +patrick3 +patient +patch123 +paswoord +pasture +passwordpassword +passwo1 +pass1wor +pasha1 +parviz +partyman +partridg +parsley +pardon +parapet +paranoya +paraiso +paraguay +paradox1 +parachute +papichulo +paolo1 +paolit +pantyman +pants1 +pansy +pangit +panda123 +pancake1 +panam +pamplona +pampa +palpatin +palpal +pallina +pallet +pakalolo +pageup +pages +padova +pachanga +p3orion +ox3ford +overflow +overcome +outpost +outland +ou81269 +ottom +osipova +ortezza +orion7 +orenburg +opossum +opopopop +opelgt +opelagila +oooooo99 +ooicu812 +onlin +onetwo34 +one2one +omnislash +oliver2 +oleg123 +oldpussy +ohmy +ofcourse +ofclr278 +odt4p6sv8 +odonnell +octobre +octavio +octave +oaktown +o123456 +nymph +nurgul +nudegirl +novosibirsk +notme +nothere +not4u2no +not4u2c +nospam +norton1 +norma1 +noremac +nord +noodles1 +nondriversig +noller +nokiadermo +nokia7070 +nokia6230i +nokia5200 +noahnoah +nn527hp +njkmznnb +nixon1 +nitsua +nissen +ninjutsu +ninja123 +ninenine +nina123 +nikita2000 +nikita1998 +nightfal +nigel1 +nicole23 +nicole12 +nicola1 +nicks +nickers +nhfkbdfkb +ngc4565 +nfyz +nfkbcvfy +nextgen +newto +newspape +newcomer +neveraga +netsnip +netnwlnk +nesta +neptune1 +neo123 +nell +nekoneko +neeraj +neel21 +needajob +navyman +naturist +natural1 +nathalia +nascar08 +naruto010 +nargiza +narfnarf +napster1 +nairda +myturn +mystery1 +mynewbots +mymoney1 +mylake +my_pass +mustang67 +mustaine +musket +musiclover +music2 +music101 +muse +muscle1 +munson15 +munkee +munchy +muncho +muleman +muhammed +mugen +muchacho +much +mst3k +mrpibb +mrbig +movie1 +mould +motoxxx +motorrad +mother12 +motel +motdepass +mostafa +moskwa +morse +morganstanley +morelia +morefun +moose69 +moores +moonwalk +mooman +moody1 +mood +montydog +monster9 +monster7 +monkey9 +mongini +money8 +money5 +moms +mommy2 +momanddad +moman +molodec +molly13 +molecule +moishe +moise +mohan +modular +modesty +mobila +mnbmnb +mkonji +mjbnbna1 +miyvarxar +mitzie +mitzi1 +misterme +missys +mishutka +mishra +miruvor79 +mirinda +minutes +minority +minnesota_hp +minimo +minicoop +mini14 +mingle +mine69 +minarets +millie11 +millerlite +miller12 +milkmaid +milka +milan1 +mikejone +mike10 +micmic +mickmick +mickey69 +mickey2 +michou +michel1 +mets1986 +meteoro +metalhead +metalgea +messenge +merlin21 +merlin11 +merced +mercator +melvin69 +melt +melony +melon1 +melkiy +melissa3 +melis +mel123 +megamon +meesha +meeker +meduza +medtech +medley +medias +mcmcmc +mcintyre +mchale +mcgrady +mcdaniel +mcclain +mazepa +mazatlan +mayhew +maxine1 +maximu +maxcat +maureen1 +matveev +matty1 +matti +matt01 +matilde +master7 +master55 +master13 +massie +maslov +masiania +mascha +maryann1 +mary11 +marten +marque +marocas +marmalade +mark3434 +mark13 +marinochka +mariner1 +manut +mansikka +mansfiel +mannix +mani +mandel +man1 +mamma123 +mamapap +mamaliga +mamadou +mamada +malyshka +malysh +malaria +malacon +maksmaks +makeit +maja +mailer +mahina +mahendra +maguire +magnit +maggie10 +maga +maestro1 +maersk +maemae +madrox +madnes +madmax11 +madison0 +maddi +macross1 +maasikas +mAsTeR +m1garand +luxor +luvbekki +lutscher +lunacy +lukas123 +luisfigo +luigi1 +lucycat +lucky9 +lubimka +luansantana +ltybcjdf +lozano +lovezp1314 +lovesyou +lovess +lovedick +love5683 +love24 +love15 +love12345 +love0 +lovable +lostlost +loreli +loploprock +lopez1 +loonie +looking4 +longman +london123 +lolz +lollie +lol1 +logcabin +logans +loc +lllooottt +llbean +llabesab +ljkkfh +lizzy1 +lizbeth +lizabeth +livefree +littlewhore +littleslut +littlefuck +lisaann +linlin +lindy +lindam +lindac +lilylily +lilmama +lilli +like123 +lightspe +lifestyl +lidiya +libertin +liar +lialia +lfytxrf +lexxus +lexus300 +letterma +letmein4 +lesmis +leonleon +lemmon +lektor +leica +leia +legs11 +legolas1 +leet +lebaron +leander +leaf +lbvfcbr +lazareva +layer +lawnmowe +lawina +lavrik +lava +lauri +latexx +latenite +laszlo +lasse +larryg +lark +larionov +larina +laralara +laptop1 +lapo4ka +lani +lando +lalit +lafayett +ladylove +lacrosse1 +lacroix +lacrimos +l12345 +kumar123 +kulikov +ksyusha +ksmith +kruemel +kristall +krist +krishnan +krimml +krille +krieger +krebsen +kravchenko +kramkram +krakatoa +kracker +kowloon +kotton +kotova +kosssss +konnichi +kolpino +kolosov +kolonka +koller +kolawole +kokot +koichi +knows +knowles +knight7 +kmfdm1 +klmklm +klingon1 +klimova +klesko +klepto +kkkkkkkkkk +kita +kissit +kissed +kiss123 +kiselev +kirbys +kiokio +kinkin +kink +kingss +kinglear +king11 +kimm +kimbo1 +kilmer +killswit +killer77 +killer01 +kiersten +kicker1 +kiborg +kiba1z +khankhan +khalif +keyword +kevinm +kevin2 +kershaw +kerberos +kenn +kenji +kendo +kelloggs +kegger +keating +kd5396b +kbpjxrf +kayla123 +kaunas +katlyn +katinka +kathmandu +kat123 +karter +karlmarx +karizma +kamaz +kalyan +kalimera +kaka22 +kajlas +kahless +kabuto +k9vVos0a +k123456789 +justlook +justin123 +justin10 +justin01 +justice2 +justic +justforf +junta +junior8 +junaid +jumpshot +jumbos +july27 +julias +juliane +julemand +jpthjdf +joyous +joshua3 +joshua19 +joshua10 +josh12 +jose12 +jorel +jorden +jordan45 +jordan18 +jordan00 +jokerr +jokerjoker +joker13 +jojo123 +johnnybo +johnatha +joaqui +joanna1 +jlettier +jkmxbr +jkbvgbflf +jjjjjjjjj +jitterbu +jinxed +jimmy99 +jimbo69 +jimbo2 +jhrl0821 +jhonny +jhonatan +jhereg +jesuschris +jesuschr +jessicam +jessica6 +jesica +jerryb +jerry123 +jerome1 +jerky1 +jerkin +jeniffer +jenelle +jekyll +jeff12 +jedimaster +jazzman1 +jayne +jayhawk1 +jayboy +jawbreak +jasonk +jason11 +jasmi +janne +janie +janessa +janeair +jammers +jamesm +jamesh +jaiden +jackster +jackpot3 +jackme +jackfrost +jackfros +jack99 +jack23 +jabroni1 +ja0000 +jG3h4HFn +j0shua +izzard +itsme2 +itsasecret +itdoes +istina +issmall +isabella1 +is3yeusc +ironlung +ironfish +irish123 +ioanna +invest1 +inverse +interior +inter1 +insulin +inout +innate +infotech +informer +indig +indian1 +imperia +imissu +imhome +imfree +imac +iloveyou143 +ilovemar +ilovelucy +iloveluc +ilikepussy +ikmvw103 +ifoptfcor +ideal +ichbin +icewater +iced +icam4usb +ibragimov +iberia +iamgreat +iambigal +hydepark +huskerdu +hurryup +huntsman +hunny +humtum +humpin +humanity +houndog +hottuna +hots +hotfun +hotdo +hotdick +hotchkis +hot1 +hornier +hophop +hoothoot +hoople +hoohoo +honey69 +hondavfr +hondas2000 +holyholy +holycrap +holde +hogtie +hockey9 +hockey77 +hobbes12 +hjvfhjvf +hjlbjy +hitmen +hirsute +himmler +hilde +highjump +hifive +hideki +heywood +hesse +hesoyam1 +hershe +henry8 +henry123 +help123 +hello6 +hello23 +helicopter +heli +heike +heehee +hedJ2n4q +heather6 +heathen +hcir +haze +hayman +havok +hatman +hasting +hasan +haruka +hartmann +hartland +harryp +harry2 +harlock +harley13 +harlequi +haribol +hardtoon +harada +happytim +happyness +happyjoy +happiest +happie +hanse +hannah12 +hanley +hanibal +handily +handicap +hanako +hampster +hammett +hammer69 +hammer22 +hammer12 +hamada +halftime +hagrid +hagakure +hackett +hacker1 +gznybwf +gwendoli +guthrie +gusto +gustaf +gunny1 +gunite +gunit +gulnar +gullit +guitarman +guitarma +guitarhero +guinness1 +guillermo +guenter +guano +gtnhjczy +gti16v +grossman +grinding +grind1 +grimm +greyhawk +gretzky9 +gresham +grendal +greese +greenlan +greenhouse +greenery +green45 +green33 +green17 +gre69kik +gravy1 +grapple +graphix +graphite +granat +gram +gotyou +gotime +goskins +gosha +gorge +gordan +goodmorning +goodboss +good123 +gonzo123 +gonchar +gomango +golfer11 +golf123 +golf01 +goleta +golding +goldenboy +gokugoku +godown +godhead +gocart +gobulls +gnasher +glowworm +gladiolus +gjkzrjdf +gjkysqgbpltw +girls69 +girasole +gimpy +gimmesum +gigemags +gibb +ghjuhfvvbcn +ghjrjgtyrj +ghjkl +ghjk +ghbdtnbr1 +gfhtym +gfhjkm11 +gfhfpbn +gervais +germain +gerald1 +gepard +genoveva +genetics +genesis2 +gemini69 +geekboy +gedeon +gbplf123 +gborv526 +gawain +gators96 +gatinho +gathering +gasto +gash +garnier +gangan +gameday +galvesto +galatasa +galaktika +gagagaga +gaffney +gable +g0dz1ll4 +fylhsq +further +funnycar +funkie +funfunfu +fulhamfc +fuerte +fuckya +fucky +fucktoy +fuckitall +fruitcake +frontosa +frodo2 +freyfvfnfnf +fresco +french1 +fregat +freedom0 +freeclus +freecell +free30 +fredrau +fredonia +fredie +frances1 +france1 +fractals +foxmulder +fourx4 +fourkids +foster1 +forrest1 +forreal +foreign +fordfocus +ford01 +forbin +footslav +folgore +fodder +flyvholm +flynavy +flute1 +flori +florenci +flirt +flipoff +flinders +fleece +flash2 +flameon +flagman +flag +fktrcfyl +fktirf +fjfjfj +fjdksl +fitz +fitnes +firema +fireice +firedept +firebug +fiorentina +fiocco +fine1 +finale +filmstar +filles +filip +figa +fifafifa +fifa2011 +fiend +fica +fhutynbyf +ffff1 +feuerwehr +ferrina +fernie +ferarri +fenomeno +fellows +felix123 +felipe1 +felicidade +felici +fefefe +feeds +fearme +fdfyufhl +fckfck +faustus +fatso +fatmike +fatima753357 +fatfat +fate +farmland +farmhous +farfar +fantas +familie +falls +falken +fahayek +fabius +f56307 +ezmoney +ezequiel +execute +exceed +ewing33 +ev700 +etketk +estes +espn +escrima +erererer +ereiamjh +ercole +erathia +equate +epervier +enormous +enlighte +enigm +engineering +emporium +emokid +emmajane +emma01 +emerson1 +emanue +elvisliv +elvir +elspeth +elsie +elliott1 +ellehcim +elixir +elites +elise1 +ekbnrf +eire +eight888 +egoregor +eetfuk +eduardo1 +edgar1 +edcwsxqaz +ecosse +economist +eclipse2 +ebenezer +eatmyass +eather +easypass +eastbay +earlgrey +eagle7 +dylans +dyanna +dwells +dutchie +dupree +duper +dune2000 +dukey +duke12 +duhduh +dugan1 +dugan +dufus +dudder +ducati74 +dubois +duarte +dtybfvby +dsmith +drumandbass +drongo +drilling +dredd +dreamgirl +dreame +drawoh +drachen +dr8350 +dover +doublet +dorman +dorkdork +dorcas +doom12 +doody +dood +dontgotm +dontforg +donnelly +donnell +donkeykong +donke +donatello +doming +dolphin9 +dolore +dollar1 +dolla +dogpile +dogphil3650 +dogfuck +dogbert1 +dog2 +doda99 +doctorwh +doctorj +dock +dnevnik +dmb2011 +dkjfghdk +divedeep +disable +diploma +dimon95 +dimo4ka +dimes +diman +dimaggio +dima2009 +dima1998 +dima1990 +dildo1 +dilara +difference +diet +diem +dickens1 +dick123 +dianas +diana2 +diamondd +diamond8 +diamond6 +diamond2 +di7771212 +dgoins +dewar +deuce22 +deuce1 +detour +destinee +derren +dermot +derby1 +denhaag +demolition +demarco +delta7 +delta5 +delray +dell11 +delite +dei008 +deflep +defect +defcon4 +deedlit +dededede +debby +deathblo +death6 +deadfish +daywalker +dawid1 +davids1 +david777 +david21 +david13 +dav123 +darksun +darksta +darknigh +darkhors +dany +dannym88 +daniel11 +dangit +danger1 +dangel +dandelion +dancer2 +danbury +danang +damsel +damiano +daleks +dakota2 +daggers +d50gnN +d1234567 +cynthi +cyklone +cvtnfyf +cvbn +curzon +curlew +cuntfinger +cumin +cumhard +cudacuda +cube +cubby1 +cubana +cubalibre +ctvtyjdf +cthlwt +cthdbc +cstock +crue +cronus +crispin +cressida +creams +crazyd +cranes +craig123 +cracky +coven +countr +cosimo +corvette1 +corp +cornish +cornfed +cornell1 +corneliu +corn191 +coralie +cora +copernic +cope +cootie +coors1 +coolwhip +cookie2 +cookbook +construction +constantin +connor11 +connelly +connecte +congas +confidence +confetti +compaq123 +comicbooks +colts1 +coloring +collection +colbert +coimbra +cody123 +coco12 +cock22 +cobbler +cobb +cntkkf +cnfnbcnbrf +clusters +clove +clockwor +clitty +cleo123 +claw +clarkkent +cjhjrbyf +cityboy +chuluthu +chula +chucko +chuckle +chuck123 +christiaan +christa1 +chrish +chrisg +chris13 +chri +choker +chitra +chippewa +chinni +chinchilla +chiffon +chiefs1 +chico123 +chevyy +chevytru +chevyss +chevy3 +chevalier +chesters +chessmas +chelsi +chelsea4 +chelsea3 +charliem +charlie111 +charit +chappie +chaplain +chante +changeme1 +chancy +chances +chamberl +chaching +cezanne +cessna172 +celicagt +cecilia1 +cdznjckfd +cdtnkzxjr +cccccccccc +cbvjyf +cbr929rr +cbarkley +cba321 +cathryn +cathleen +cathay +casting +castill +cassis +cassidy1 +casio1 +cartmen +cartagen +carolina1 +carlsber +caring +cardss +carbone +capo +canto +cantina +cannon1 +candyeater +candance +canaries +camneely +camelo +calla +calimer +caine +cachero +cache +cabledog +caball +c32649135 +c00kie +byteme1 +byrne +bypop +bvlgari +buzzword +buzzkill +butane +busybee +buster99 +buster88 +busines +burton12 +burltree +bunyan +bums +bumhole +bullrun +bulat1996 +buhjvfybz +bugg +buffon +bueller +budster +bucks1 +buckman +buck123 +bubbl +bubb +brussel +brushy +brucey +brooksie +brooklyn1 +brood +brogan +brody1 +brittani +britni +britanni +brinkley +brillian +brigham +bridger +brianw +brett123 +brescia +brennan1 +bren +brazen +bravado +brasco +brandon6 +brandon00 +brandnew +branco +branca +brady1 +brace +bpvtyf +bozo123 +bowmore +bounder +botanik +bot2010 +bosch +borgia +borealis +bordello +boogiema +boofer +boochie +boobs69 +booboo11 +bonn +boneyard +bond9007 +bombero +bold +bogdanova +bodie +bodean +boca +boby +bobrov +bobrik +bobolink +bobo123 +bob111 +bmw528 +bmw328 +bmvm3e46gtr +blurry +blunder +blumpkin +blue92 +blue30 +blue135 +bltynbabrfwbz +bloomers +bloodlus +blome +blight +bleu +blessyou +blasted +blass +blademan +blade55 +blackwhite +blackhorse +blackfin +blackboo +blackadder +black5 +black23 +bjbjbj +bisous +bison +birthday2 +birthday133 +birdsong +bipbip +billygoa +billyg +billly +billa +bilbob +bigtitty +bigsmall +bigmouth +biggus +biggio +biged +bigboy11 +bigbone +bigblue1 +bigberth +bigballa +biedronka +biafra +bhfbhf +bhecbr +berner +berlioz +berli +ben1234 +beltran +belt +belo4ka +belmar +bellybut +belluno +beer1 +beeman +beefer +bebert +beb +beaver12 +beatty +beatme +bearss +bear13 +bdaddy +bballs +bautista +batmonh +batman21 +baseball9 +bartman1 +barstow +barsch +barnard +barnacle +barnabas +barabbas +barabash +bantha +bankrupt +bandman +bandits +bandband +bambi1 +bambam1 +bama1 +baloo1 +balls2 +balls123 +ballroom +baja +baily +baileys +baer +badiman28200 +badder +backwood +backhome +backd00r +babyphat +babo +babie +ba25547 +b0hica +azimuth +az12345 +axiom +awesom +awake +avtoritet +avril +autocar +austin2 +aust1n +aurelien +aureli +auburn1 +athene +athena1 +atep1 +atease +ataman +astonv +astonmar +assert +aspect +asmodean +asiaasia +ashraf +ashley69 +ashley19 +asguard +asdzxc123 +asdflkj +asasasasas +arzen +artur1 +artem777 +armyof1 +armastus +aregdone +archibal +archer1 +aracel +arabia +apples123 +apex +apeshit +anupam +anthony5 +anthony0 +antananarivu +answers +anna1997 +anna1990 +anna1986 +anna1982 +anna13 +anit +animals1 +animal2000 +anil +anger +angeleyes +angeldog +angel77 +angel3 +angel21 +anetka +anemone +andzia +andrew123 +andrew10 +andress +andorra +andiamo +anchorat +anastas +anamika +analysis +ametist +amersham +americas +amberr +amberdog +amazonka +alysha +alskdj +alphadog +alons +alondra +almeria +almanac +allways +allston +allister +allard +alino4ka +alina1995 +alice123 +alia +alford +alexandra1 +alex92 +alex2010 +alex1987 +alex1981 +alex1973 +alex1971 +alemap +alcoholi +albright +albertjr +ajax01 +airbrush +aidan1 +ahmed1 +aguilas +agnes1 +aftermath +aekara +advice +advert +adroit +adpass +adios +adidas69 +adidas12 +adamson +adama +adadadad +activation +acme +acheron +acess +acer12 +acehigh +accobra +abkbgg +abiodun +abcdefghijk +abcdef12 +abandon +aachen +aaazzz +aaaassss +aaa123456 +a8kd47v5 +a333444 +a1b2c3d +a1b1c1 +a123654 +a123456z +Zz123456 +Yfnfif +YaGLASph +YANKEE +Wwwwwww1 +Wicked +Webmaste +Walker +WINDOWS +Vincent1 +Viktor +Victor +Valerie +Valentina +VAMPIRE +VALENTIN +United1 +United +Travis1 +Tobias +ToNNa +Titten +Tinker +Texas1 +TcglyuEd +Taurus +Tatiana +Tanner +TONY +TGkBxfgy +Sweets +Susanne +Susan1 +Surfer1 +Super +Stones +Stella1 +Startrek +Stardust +Star1 +Stanley1 +Spooky +Spitfire +Simon +Shooter1 +Septembe +Secret1 +Saving +Samurai +Samanth1 +Sailing1 +SUNDANCE +SNAKE +SHARK +SAMSON +Robinson +Richmond +Richie +Rfnthbyf1988 +Renegade +RUSSELL +ROLAND +ROCK +RAIDERS1 +Qweasd123 +QWERTYUIOP +QAZwsx123 +Prelude +Portland +PolniyPizdec110211 +Phillip +Phezc419hV +Passes +Pantera1 +Packard1 +PUSSYS +PAMELA +Omega1 +Oblivion +OLIVIA +Nemesis +Natalia +Nadine +N7tD4BJL +Music1 +Murphy1 +Munchkin +Mulder +Mouse1 +Moose1 +Mookie +Monitor +Miranda +MICHELE +MARK +MAGIC +Lzhan16889 +Louise1 +Lizard1 +Lifehack +LgNu9D +Legacy +Leaving +Leather +LOVER +LOUISE +Kkkkkkk1 +Katie1 +Kathy +Katerina +KIMBERLY +Justice +Julian +Jrcfyf +JoXurY8F +Jhnjgtl12 +Jenny +Jack1 +Ironman +Inferno +Ibanez +ISABEL +Howard +Homer1 +Hhhhhh1 +Heineken +Hannah1 +HONEY +HELP +HARD +Guitar1 +GreatGoo +Gracie +Garrett +Gabrie +GODZILLA +GENESIS +GABRIEL +Fussball +Fuckyou +Frances +Formatters +Fm12Mn12 +Flower1 +Flipper +Fktrcfylhf +Falco02 +Faith +FRIENDS +FRANKIE +FERNAND +Express1 +Eternity +Emily1 +Ekaterina +EMINEM +ELEPHANT +Dwayne +Dusty +Digital +Diana +Dexter +Daniil +Dakota1 +DEKAL +DECEMBER +Cthutq +Coyote +Compute1 +Colt45 +Cnfybckfd +Christy +Cheryl +Cheese1 +Charlotte +Charlott +CHEESE +CHANCE +CASSIE +CAROLINE +Butterfl +Brigitte +Bondage +Blacky +Bitch +Birgit +Beagle +Bastard1 +Barney1 +Barcelona +Banshee +BUDLIGHT +BUCETA +BUBBLE +BRONCO +BLUE22 +BLAZER +BBBBBB +Awesome +Av626ss +Authcode +Athena +Arnold +Angels1 +Andrei +Allison1 +Alison +Account +Access +Ab55484 +ASSMAN +ARTHUR +ANDERSON +ALEXANDR +A6piHD +A12345678 +9HMLpyJD +99ford +9988776655 +9966 +9933162 +98766789 +987654123 +98745 +9874 +9821 +9691 +963210 +9556035 +9293709 +9288 +9141 +91328378 +9124852 +9085084232 +902101 +9012 +900900 +88mike +88887777 +887766 +8855 +8822 +880088 +8788 +86chevyx +8642 +8633 +85bears +85858585 +8456 +8454 +8421 +8244 +8215 +8096468644q +8088 +80808080 +8055 +801010 +7iMjFSTw +794613258 +789qwe +789456123a +789056 +7825 +7779777 +777123 +7759 +7747 +7730 +770129ji +7654321q +7557 +7506751 +747200 +7411 +7377 +7255 +7210 +7111 +70707070 +6gcf636i +69pussy +6999 +6970 +6942987 +6913 +68stang +67vette +6769 +666444 +6650 +663366 +6573 +654321z +6532 +6485 +645202 +6440 +636322 +628628 +6218 +611611 +6070 +6061 +6011 +6001 +5speed +5alive +59382113kevinp +5884 +5878 +5864 +5791 +57699434 +5678ytr +5677 +5588 +55665566 +55555r +55555d +5554 +55495746 +5543 +552861 +552255 +5502 +550000 +5478 +5469 +545645 +54354 +5435 +54343 +5431 +5337 +5299 +5278 +5226 +5211 +5210 +51502112 +50325 +50000 +4RzP8aB7 +4987 +4930321 +4900 +486486 +486255 +483422 +478jfszk +4748 +4673 +4651 +46466452 +4638 +4590 +458458 +45678912 +45654565 +45632 +4553 +4552 +4542 +4524 +4500 +444888 +444444444 +4443 +4440 +441232 +4357 +4350 +4290 +4264 +4253 +4246 +4227 +4222 +421421 +420smoke +41526300 +4144 +41424142 +41234123 +4110 +4108 +4101 +4060 +40404040 +382563 +3822 +3816778 +3777 +3691 +3669 +36633663 +3659 +365365 +365214 +36169544 +3611 +358hkyp +3575 +3536 +3461 +3459 +3440 +3434245 +3401 +3370 +33213321 +3318 +330000 +32633263 +3260 +3254 +3245 +3236 +3226 +3222 +321qaz +32123 +3212 +3182 +3181 +3150 +3146 +3142 +311420 +311296 +311293 +311273 +311270 +311265 +31123112 +311113 +311081 +311074 +31102000 +31101964 +31101961 +310875 +31081998 +31081965 +310794 +310776 +310597 +310596 +31051999 +31051967 +31051962 +31032000 +31031998 +31031997 +31031965 +310178 +31011968 +31011961 +3055 +3050 +3040 +301293 +301276 +301273 +30121997 +301195 +301193 +301170 +30102001 +30101998 +30101966 +30101962 +300969 +30091958 +30091956 +30082008 +30081959 +300797 +30071970 +30071965 +30071964 +300676 +30061961 +30051966 +300479 +300474 +30041960 +30041955 +30031996 +300197 +30011964 +30011960 +2h0t4me +2dumb2live +29palms +2941 +29121967 +291195 +29111962 +291072 +290996 +290970 +290963 +29091996 +29091968 +290893 +290878 +290874 +290872 +29081972 +29081964 +290797 +29071968 +29071962 +29061999 +29061964 +29061960 +290597 +29051968 +29051962 +290495 +29041971 +29041965 +29041963 +290375 +29031965 +290175 +29011999 +29011998 +29011995 +29011967 +2870 +2869 +28292829 +281273 +28121966 +281176 +281174 +281172 +281168 +28111960 +28111958 +281094 +281093 +281078 +28102000 +28101964 +28101959 +280980 +280977 +280975 +280969 +28091996 +28091966 +28091959 +280867 +28081998 +28081966 +28081962 +28081953 +280777 +280762 +28072000 +28071996 +28071965 +280670 +28061962 +280473 +280469 +28041997 +28041960 +280375 +280374 +28031968 +280278 +28021964 +280178 +280176 +280172 +28012000 +2797349 +27282728 +27272 +271292 +27121999 +27121968 +271171 +27112000 +271060 +27102000 +27101961 +27091964 +270892 +270876 +270875 +270874 +27081961 +270773 +270767 +27071999 +27071964 +270674 +27061969 +27061964 +27061962 +270596 +270564 +27051967 +27051964 +270477 +27041997 +27031969 +270273 +27021964 +27021957 +270199 +270176 +27011971 +27011963 +2660 +261274 +26121969 +26121967 +261171 +26111968 +26111965 +26111956 +261094 +261076 +26101963 +260995 +260971 +26091958 +260898 +260891 +260880 +26081998 +26081966 +260765 +26071964 +260698 +260694 +260651 +26061966 +26061961 +260570 +26052000 +26051999 +26048 +26041961 +260274 +26021998 +26021968 +26021965 +26021960 +26021956 +260177 +260170 +26011998 +26011962 +26011960 +25892589 +2586 +2568 +2544 +254254 +25412541 +25362536 +2534 +2533 +2528 +2525252 +25202520 +2519 +251297 +251269 +251265 +251251 +251200 +251194 +251175 +251174 +25111998 +25111996 +25111967 +25111960 +251099 +251069 +25101968 +250992 +250969 +25091999 +250894 +250866 +25081963 +25071961 +25071959 +250694 +25061997 +25061957 +25061954 +250569 +25051966 +25051955 +250473 +250470 +250467 +250381 +250371 +250363 +25031963 +250274 +25021999 +250197 +250181 +250174 +250166 +25011954 +2499 +2480 +2476 +247247 +24242 +2421 +24121963 +241194 +241161 +24111996 +24111969 +24111964 +241075 +240973 +240961 +240899 +240871 +240870 +240868 +24081999 +24081972 +24081966 +24081956 +240778 +24072000 +24071970 +24071968 +24071961 +240674 +240666 +24061966 +240576 +240575 +240571 +240563 +24051999 +24051969 +24051962 +240475 +240469 +240464 +240366 +24031973 +240292 +24021968 +24021960 +240176 +2389 +2354 +2351 +23342334 +23242324 +231456 +231266 +23121995 +23121968 +23121961 +231199 +23111997 +23111970 +23111965 +23111962 +231078 +231073 +231069 +231068 +23101963 +23098 +230978 +230974 +230967 +230964 +23091997 +23091965 +23091964 +230894 +23081997 +23081960 +23071970 +23071964 +230695 +23062002 +23061999 +23061965 +23061963 +230493 +230376 +230368 +23031999 +23031955 +230270 +23022302 +23021963 +23021955 +230167 +230160 +23011962 +227227 +2261 +224455 +22121996 +22121966 +22121961 +22121957 +221170 +22111966 +22111961 +22111954 +221077 +221076 +221059 +22102000 +22101962 +220969 +220961 +22091967 +220876 +22081966 +22081962 +220797 +220772 +22071961 +220670 +22062206 +22061999 +22061997 +22061965 +22061964 +220597 +220576 +220567 +22051966 +220499 +220492 +220473 +22041999 +220395 +220375 +220370 +22031967 +220271 +22021965 +22021959 +22021955 +220199 +220172 +220171 +22011961 +2170 +2156 +2140 +212325 +2120 +2113 +21128 +21121964 +21121963 +211197 +211196 +211168 +21111960 +211111 +21100 +21092109 +21091965 +210774 +210768 +21072006 +21072001 +21071966 +210707 +210689n +210680 +21061964 +21061962 +21061961 +210578 +210499 +21042104 +21042000 +21041970 +210377 +21032001 +21031959 +210295 +210291 +210272 +21022000 +21021962 +210171 +210167 +204060 +2023 +2022958 +201272 +201199 +201195 +201173 +201170 +20111966 +20111962 +20111960 +201067 +20101999 +20101958 +200973 +20091967 +200895 +20081957 +200775 +200773 +200676 +20061968 +200577 +20051962 +20051959 +20042005 +20041966 +200395 +200264 +200166 +20011997 +20011973 +1w1w1w +1s1h1e1f1 +1qwertyu +1q1q1q1 +1ladybug +1a1a1a1a +1Xxxxxxx +1Wildcat +1Tommy +1Tiger +1Tiffany +1Star +1Snoopy +1Rangers +1Rabbit +1Qqqqq +1Nascar +1King +1Jones +1Jjjjjjj +1Jackson +1Inside +1House +1Gandalf +1Eeeeeee +1Creativ +1Camaro +1Black +1Beer +1Bbbbbb +1Baby +199613 +199515 +199410 +199226 +19921993 +199117 +199112 +199017 +198921 +198719 +198624 +1986198 +198619 +198618 +19855891 +198523 +198520 +198516 +198511 +198413 +198411 +19833891 +198325 +198324 +198311 +198222 +198219 +19821 +198020 +197929 +197901 +197474 +197419 +197010 +19471947 +19380018 +19372846 +192837465q +19216811 +1915 +191296 +191285 +191280 +19121962 +191187 +19111972 +19111966 +19111964 +19111961 +191089 +190982 +190981 +190980 +190972 +190968 +19081968 +19081957 +190792 +190772 +19071997 +19071963 +190678 +19061999 +19061968 +190593 +190580 +190579 +19051963 +19041962 +19041958 +190395 +190393 +190281 +19011963 +1895 +1892 +1888 +1885 +186186 +1827 +181212 +181196 +181174 +181173 +181172 +18111968 +181095 +181076 +18102001 +18101996 +180971 +180968 +18092000 +18091966 +18091964 +18091960 +180892 +18081968 +180797 +180796 +180781 +180776 +180772 +18071965 +18071960 +18061998 +18061965 +18061962 +180574 +18052000 +18051971 +18051966 +18051958 +180478 +18041999 +18041998 +18041968 +180365 +180276 +180268 +18021967 +18021961 +18021959 +180171 +18011954 +1778 +1739 +1726 +171297 +17128 +171191 +171169 +171161 +171072 +171070 +17098 +170972 +17091999 +17091972 +170875 +170874 +170866 +17081996 +17081970 +17081960 +170794 +170776 +17071999 +170675 +170668 +17061965 +17061962 +17061960 +170575 +170565 +170375 +17031963 +170296 +170280 +170276 +17021964 +17021962 +170196 +170172 +17012000 +17011998 +17011969 +17011960 +165432 +1627 +1613 +16121966 +16121961 +16121957 +161168 +16112000 +161071 +16101966 +160868 +16081998 +16081964 +160798 +160778 +16071964 +16071962 +16071959 +160663 +16061967 +160569 +16051999 +16051998 +16051968 +16051960 +160497 +160470 +160394 +160375 +160370 +16032001 +16021999 +160171 +16012001 +159357123 +1590753 +157359 +1560 +1559 +1554 +1552 +1546 +1539 +1525 +1513 +151263 +15122000 +1512198 +15121967 +15121960 +151172 +151170 +15111968 +15111965 +151096 +151095 +15101959 +150996 +150968 +15091964 +15081967 +15081960 +150778 +150775 +15071963 +15061999 +15061997 +15061973 +15061970 +15061964 +15061960 +15061953 +15058 +15051960 +15051959 +150497 +15041998 +15041960 +15041954 +150395 +150394 +150374 +150372 +150369 +150367 +15031962 +150296 +150294 +15021998 +15021959 +15021957 +150176 +150170 +15011969 +15011967 +15011959 +1481 +147258369a +1459 +144444 +143000 +141592 +141294 +141293 +14121962 +14111965 +14111963 +141111 +141095 +141076 +14101410 +140968 +14091998 +14091968 +140875 +140872 +140864 +140863 +140857 +14081962 +14081960 +14081958 +14081957 +14081408 +14071974 +14071960 +140675 +140673 +140670 +14062000 +14061966 +14061960 +140572 +14051998 +14051968 +14051962 +140473 +140472 +140467 +140465 +14041999 +140370 +14032001 +14031966 +14031962 +14028 +140270 +14021964 +140198 +140171 +140166 +14011964 +137955 +136913 +136666 +1361 +1359 +1358 +1356 +1350 +1349 +1346798520 +13467985 +13467982 +134134 +13261326 +132546 +13201320 +131282 +131276 +13122001 +13121967 +13111968 +131097 +131073 +13101968 +13101965 +13101310 +130994 +130971 +13091998 +13091965 +130869 +13082000 +13081968 +13081967 +13081961 +13061998 +13061997 +130595 +130565 +13051957 +130494 +13041999 +13041997 +13041967 +13041962 +130374 +130364 +13031998 +130294 +130276 +13021968 +13021962 +130172 +13011959 +12play +12inches +1297 +12891289 +12758698 +125wm +1258963 +125690 +12569 +1249 +12456 +1241 +123xyi2 +123vika +123test +123qweasdzx +123qwe12 +123qwe1 +123boots1 +123a456 +123888 +123699 +1236951 +123592 +1234qw1234qw +123456Aa +1234567f +12345678i +1234567890qwerty +1234567890qaz +1234567890p +1234567890o +1234567890987654321 +1234556 +12334 +123321456654 +123124 +123103 +122863 +122345 +122333444455555 +12222 +121ebay +121989 +121984 +121978 +121961 +121458 +121412 +121297 +12120 +121177 +121174 +121171 +121168 +121121121 +12111998 +12111968 +121111 +121097 +121060 +12101965 +12101959 +120898 +12081968 +120799 +120761 +12072001 +12071968 +12071966 +120670 +120669 +120666 +12062001 +120576 +120563 +12048 +120469 +120466 +120361 +12031963 +12031959 +12021958 +120168 +12011999 +12011969 +12011963 +12011955 +119966 +11881188 +118200 +117711 +1146 +1142 +1139 +11311131 +113096 +111993 +111988 +11198 +11142 +111260 +111222333444555 +11121998 +11119999 +111196 +11118 +11114444 +11111967 +11111966 +11111962 +111115 +111114 +111096 +111064 +11101965 +11101961 +110994 +110974 +11091967 +110898 +11081954 +110793 +11071957 +110668 +11061954 +110573 +110570 +11057 +110564 +110561 +11051957 +110496 +110470 +110466 +11041999 +11041966 +110374 +11032000 +11031959 +110273 +110262 +110259 +11021963 +110202 +110174 +11011965 +11011958 +1098 +1097 +1096 +1076 +1072 +106106 +105105 +10501050 +1039 +1036 +1035 +1034 +103190 +10304 +102775 +102398 +102375 +102030q +101996 +101987 +101979 +10151015 +10131013 +101268 +101265 +101202 +10111997 +101062 +1010321 +10101959 +10101957 +10101955 +101 +100973 +100869 +100867 +100865 +10081971 +10078 +100767 +100698 +100694 +100693 +100663 +10062000 +100594 +100591 +100569 +100555 +10051999 +100471 +100469 +100461 +100395 +100390 +100372 +10031966 +10031963 +100276 +10021999 +10021966 +10021962 +10021957 +10020 +100162 +10011965 +10011964 +0987654321a +0977 +0924 +0921 +091985 +091298 +091270 +091263 +09120912 +091198 +091193 +091181 +091173 +091171 +091076 +090976 +090968 +090963 +09091965 +090874 +090869 +090778 +090774 +09071967 +09071964 +090594 +090565 +09051968 +09051963 +090495 +090463 +09041969 +09041963 +090394 +090391 +090379 +090375 +090372 +09031967 +090273 +090272 +090266 +09021962 +090188 +090187 +0901 +0886 +0872 +0824 +081294 +081274 +081259 +081255 +081186 +081180 +081179 +08111998 +08111963 +08111960 +081085 +081076 +08101966 +08101961 +08091997 +08091962 +08091960 +080893 +080874 +080870 +080869 +08082000 +080790 +080773 +08071999 +08071998 +08071969 +08071964 +080699 +080691 +080690 +080676 +08061969 +08061962 +080595 +080593 +080494 +080482 +08041997 +08041973 +080384 +08031997 +08031960 +08031959 +08031953 +08021961 +080190 +08011960 +08011959 +072777 +0726 +071294 +071293 +071291 +071278 +071276 +07121960 +071173 +071172 +07111999 +07111961 +07111959 +07111917 +071079 +071071 +07101998 +07101963 +07101958 +070970 +07092000 +07091963 +070898 +070876 +070875 +070869 +07081999 +07078 +070774 +07071965 +07071960 +070695 +070693 +070680 +070677 +07062001 +07061969 +070574 +07051965 +0705 +070478 +070388 +070378 +070372 +07031960 +070295 +070287 +070271 +07021966 +07021962 +07021960 +07021956 +070194 +070180 +070176 +070173 +07012000 +07011999 +07011960 +0688 +0661 +0613 +061274 +06121966 +061193 +061190 +061176 +061171 +06111968 +061090 +06101959 +060992 +060971 +06091955 +060864 +06081965 +06081963 +060768 +06071955 +060592 +060577 +06051967 +06051955 +060494 +060396 +060377 +060370 +06031960 +060271 +060269 +060266 +06021969 +06021962 +060182 +06011996 +0585 +0565 +0526 +05121966 +05121964 +051166 +05111959 +051094 +051079 +051076 +05101964 +050982 +05091963 +050895 +050874 +050873 +05071999 +05071962 +05062002 +05061997 +05061958 +05052005 +05051969 +05051966 +050492 +05041999 +05041960 +050381 +050372 +050365 +05031967 +050305 +050288 +05022000 +05021961 +05021957 +050195 +050185 +050181 +050173 +05011961 +0477 +0466 +041957 +041294 +04121962 +041174 +041170 +04111996 +04111956 +041075 +041067 +04101975 +04101965 +04101960 +04091963 +040895 +040876 +04081969 +04081963 +04081958 +04081955 +040793 +040772 +04072001 +04071960 +040698 +04061972 +04061966 +040593 +040564 +04052008 +04051957 +040497 +040462 +040461 +040460 +04042007 +04041968 +04041966 +040396 +040376 +040375 +040371 +04032009 +04031965 +04031962 +040283 +04022009 +04021962 +04021960 +04012001 +04012000 +04011995 +04011964 +04011961 +0393 +0387 +0377 +032678 +031279 +031278 +03121961 +031193 +031186 +031185 +03111998 +031095 +031073 +031072 +03101998 +030993 +030992 +030989 +030967 +03091998 +03091961 +030863 +030775 +030770 +03071956 +030670 +030668 +03062000 +03061961 +030609 +030576 +03052005 +03051962 +030497 +030494 +03041963 +03038 +03031961 +030293 +030292 +030276 +03021964 +03021962 +030194 +030183 +030176 +030171 +03011999 +0292 +0256 +02121966 +02121961 +02121960 +02112000 +02111971 +021080 +021068 +02102001 +02092000 +02091960 +020891 +02081964 +02081962 +02081961 +020794 +020792 +02071956 +020673 +020670 +02061999 +020595 +020594 +020577 +020562 +02051965 +020494 +020396 +02031962 +02031959 +020299 +020296 +02021960 +02021956 +020181 +02011962 +02011959 +0186 +0185 +0182 +0164 +0144 +0143 +0130 +0127 +012369 +0123654789 +0116 +0114 +011295 +011272 +01121968 +01121960 +01121959 +01121957 +01120112 +011187 +011181 +01112011 +01111966 +01111964 +011079 +011073 +01101960 +010992 +010975 +01091957 +010876 +010797 +01071961 +010711 +010693 +01061969 +010593 +010571 +010556 +010487 +010457 +01042005 +01042004 +01041962 +01041954 +01031997 +01031968 +01031965 +010294 +010279 +010275 +010274 +010268 +01022006 +01022001 +010201 +010167 +0101198 +01011948 +007000 +002200 +000888 +000023 +000008 +.kzirf +zzz777 +zymurgy +zxzx +zxcvbnmzxcvbnm +zxcvbnma +zuzuzu +zugang +zrx1100 +zpflhjn1 +zorro123 +zontik +zola +zkexifz +zipdrive +zipcode +zion +zimmer483 +zhipo +zeynep +zeuszeus +zero000 +zcfvfzkexifz +zaq12wsxcde3 +zapato +zantac +zafhjdf +zacharia +yyyy1 +youth +youngman +yoshio +yoshiko +yoshi1 +yorkshire +yolande +yokosuka +yodaddy +yjdbrjd +yfnecz +yfhrjnbrb +yfeiybrb +yfcntyrf +yesican +yelhsa +ybrjkftdf +ybrbnjcbr +ybrbnbyf +yardman +yannis +yanni +yankees4 +yamoon6 +yamahar +yamaha12 +yagodka +yacht +xzsawq +xxxyyy +xxxx1 +xwing1 +xtr451 +xsw2zaq1 +xoxo +xjy6721 +xiomara +xela +xanth +wutang1 +wu9942 +wspanic +wroclaw +writing +wrist +wrinkle +wrestling1 +wpass +wowsers +worldnet +workwork +wordz +wooody +wonderwa +wonderla +wolfone +woking +wlafiga +wisteria +wiseass +winner69 +winder +wilmar +wilma1 +william6 +wildchil +wiggy +whore1 +whoosh +wholesale +whizzer +whitetail +whitecat +whassup +weymouth +weyfvb +wewiz +wetsex +wetlips +wetdog +werken +wendigo +weetabix +ween +weeds +webweb +webhead +weave +weasel1 +wear +wazoo +waters1 +waster +wasp +wasdwasd1 +warranty +warhorse +warhamer +wantsex +walstib +wallstreet +walker2 +wahooo +wahine +wachovia +w74156900 +vtlbwbyf +vthrehbq +vsajyjr +vova1992 +voshod +voronov +voorhees +volvos60 +volante +void +vladivostok +vlad2000 +vkfwx046 +vjqvbh +vitamine +vitalogy +vitalik1 +virgin1 +violett +violentj +viole +vinicius +vikings2 +vika1234 +vijaya +vigor +victor12 +vicious1 +vgfun2 +vfrfhjd +vfkmxbr +vfieyz +vfhfnbr +vfctxrf +vesuvius +vespucci +verymuch +vert +vernost +verner +verne +veritas1 +verboten +veget +vbhjh123 +vbhjckfd +vaz21083 +vaz21074 +vatican +varenik +vardann +vardan +vannasx +vangelis +value +valmet +valid +valeron +valent +valakas +vaffanculo +vaders +vader123 +utmost +uthfcbv +usermane +urgent +uptheass +upland +upinya +unlucky +unicron +undone +undernet +underhil +unclebob +uiuiui +uhfdbwfgf +ufufhby +ufdhbr +ubvyfcnbrf +tzeentch +tyrese +typhon +tybalt +twotone +twothree +twoods +twinturb +twinks +twenty2 +twats +turntabl +turga +turbo911 +tulpan +tuller +tudor +tubular +tubgtn +tubbie +tu190022 +tsalagi +tryout +tryit +truelies +truc +trrim777 +tropico +tropicana +trill +trident1 +triathlo +trever +tremblay +treker +trek5200 +trashed +transcend +trafalga +trabant +trabajo +toybox +towser +totosha +toshiro +toshib +tosca +tory +tortilla +tort +torrey +torock +toritori +torito +toreador +topside +topshelf +tooting +toonsex +toolfan +tony69 +tontos +tonka1 +tomomi +tommyy +tomatoe +tomasz +todd12 +toby22 +tobasco +toasters +toadman +toad24 +tnvols +tnt123 +tlaloc +tiziano +titititi +titian +titan2 +tinroof +tine +tinchair +timothy2 +timer +time123 +tilley +tileman +tigger3 +tigertig +tigers2 +tigerr +tiger77 +tiger6 +tiger3 +tidwell +tickled +tiburon1 +thwack +thvfrjdf +thunderc +thuglove +thor99 +thommy +thomasd +thomas21 +thinline +thing1 +thicker +thibault +thenet +thedark +thecure1 +thebus +theband +thaipron +texastec +tetley +terry123 +terrorist +terris +terrific +terrell1 +terrano +tense +tenorsax +tenn +temujin +templer +telescop +telegrap +telefon1 +tehran +tedesco +teddybeer +tedd +technica +techman +techdeck +teamlosi +teagan +teacher2 +tdavis +tazman1 +taylor9 +taunton +tatyo +tatiana1 +tatarstan +tash +targa +tapestry +taoist +tanyshka +tanita +tanguy +tangos +tampa1 +tamera +tallboy +takeout +tailhook +tahira +tagada +tafkap +tabby1 +systemofadown +system12 +syste +syoung +syndicate +syndicat +sybase +sword123 +swetik +sweetu70 +svetochka +svenska +suzie1 +susie1 +susan69 +surfer69 +supratt +supert +supermom +superme +superman123 +superhero +supafly +sunshine69 +sunshine2 +sunse +sunny2 +sunitha +sungam +sunburst +sunburn +sumter +sumo +summer22 +summer13 +summer03 +sultry +sultana +sugarman +sueann +suckmy1k +suckem +sturm +stupid12 +stud69 +stthomas +struppi +strong1 +strip4me +streeter +stratcat +storm7 +stork +storey +stopstop +stopper +stoppedb +stockpor +stjohns +stiefel +stickers +stickdaddy77 +stevie1 +steven2 +steve12 +stephi +steamforums +steamboat +steam181 +stayrude +stargat +starbase +star77 +star6767 +stang50 +stacker +ssssss1 +sss123 +srikanth +squidly +squats +squat +squad51 +sputnik1 +sprunt +spring12 +spotligh +sportage +spook1 +spittle +spinne +spill +spiff +spieng +spider10 +sperme +speedster +spec +spazzz +spasm +spartak1922 +spartacus +sparrows +sparky69 +spare +sparda +spandau +spacejam +spaceace +souschef +sou812 +sorpresa +sophie01 +sookie +sony1 +sonoio +sonic593 +songline +sone4ka +something1 +sombrero +somali +soma +soloy +solid1 +soho +softcore +softball1 +sofi +socool +soccer01 +snuffles +snow123 +snot +snooch +snitch +sniff +snarf +snappy1 +snakebit +smutsmut +smukke +smokewee +smitten +smile4u +smile2 +smd123 +slushy +slevin +sleepyhollow +sleeps +slayers1 +slavery +slang +slammin +skytel +skyman +skylinegtr +skinnass +sixflags +sisyphus +siskin +singer1 +singapur +sindhu +simon12 +simens +silverdo +silverch +silver77 +silence1 +sigge1 +sigchi +sig229 +siena +siding +shwing +shutout +short1 +shockwav +shitty1 +shitman +shit12 +shit1 +shire +sheppy +sheer +sheep1 +shazaam +shavon +shaunc +shatner +sharipov +shaolin1 +shante +shanta +shandi +shamal +shaky +shakers +shadow9 +shadow88 +shadow14 +shadow00 +shabazz +sexybeas +sexy4me +sexy22 +sexy101 +sexxybj +sexstuff +sexking +sexiness +sevenn +servic +sergserg +sergey7 +serafima +senorita +seminar +selur +selrahc +selassie +sekirarr +segundo +segovia +seemnemaailm +secure1 +sebring1 +seasea +scurlock +scudder +scubad +scuba10 +screamin +scrappy1 +scottb +scott11 +scotlan +scooby11 +schnell +schloss +schlange +schedule +schalke0 +scary +scape +scally +sayaka +sawtooth +sawadee +saving +savchenko +satur +satisfaction +satcom +satchel1 +sassydog +sassycat +saskatoo +sasha1998 +sasha11 +sascha1 +sarmat +sarahw +saraht +saraha +sara123 +sapo +sapfir +saoirse +santini +santi +santana5 +santaclaus +santa234 +sanja +sane4ek +sandy12 +sandlot +sanders2 +sanders1 +sanchin +sana +san123 +samo +sammy7 +sammons +sambuka +sambora +samatron +samant +salsas +salsa1 +salom +sallyann +salle +salgar +salford +salas +sakina +saki +sahar +sadomaso +sacrific +sachiko +rynner +ryan12 +rusty21 +rustik +russell2 +rururu +runners +run4fun +rugby8 +rugby123 +rudyrudy +rudie +rubyrose +rtyuio +roza +rousseau +roselle +roseline +rosehill +rosebudd +rosarosa +roofus +ronson +rona +romann +roman12 +rolltide1 +roenick +rodder +rocky11 +rockwood +rockhopper +rockcity +rocinant +robot1 +robby1 +roast +roamer +roadrage +roaches +rmracing +rmfidd +rkelly +rjkjrjkmxbr +rjirf +rjdfkmxer +riordan +ridered +rideme +rick69 +richey +richard0 +ribs +rhtyltkm +rfnz123 +rfhfnt +rfdrfp +reyna +reyes +revel +resort +reset1 +rere +renfield +removed +rekmubyf +reina +reid +regula +regina1 +reggio +reggie31 +regency +reeper +redtop +redsox19 +redryder +rednose +redhawks +redhat50 +redddd +redbul +redball +red666 +red333 +recluse +recife +recess +rebel12 +rebeka +readynow +rdflhfn +rcfhlfc +razer +rayner +rayban +ravinder +rattrace +ratmir +rashley198 +rangersf +ranger98 +randee +ramse +ramire +ramir +rami +rambler1 +ralliart +rajput +rajkumar +rajendra +rajah +rainmaker +rainforest +raff +radium +radist +radio123 +radiant +racket +rachell +racer2 +rabbit66 +qwertzuiop +qwerty999 +qwerty8 +qwerty4 +qwerty09 +qwerty01 +qwertasdfgzxcvb +qwertasd +qweras +qwer11 +qwe456 +qwe234 +qwe1234 +qwaszxerdfcv +qwaszxedc +qwaser +quique +quinten +quintain +quinta +quietman +questor +quell +queequeg +quarters +quacker +qqqqwwww +qpqpqp +qewret +qazwsxc +qazwsx12345 +qazwsx11 +qazsew +q1w2e3r4t5y6u7i8o9p0 +q123q123 +pyro +pyramid7 +pygmy +putty +puttputt +puto +purple11 +purge +pureevil +purdy +punter12 +pumpk1n +pumapuma +puffy1 +puffdadd +puertori +pudding1 +puckhead +publix +prunes +providian +promo1 +prolong +prolinea +proghouse +profits +proekt +prodojo +process1 +privet123 +private5 +privado +priss +printers +princesit +prince2 +primas +price1 +prevert +prevail +preppy +preludes +prank +praline +pqNR67W5 +poznan +power666 +power12 +power01 +powe +poutana +potvin +potsmoke +potsdam +potpie +potapov +posh +porosenok +porol777 +pornlover +pornlove +pornclub +poppers +popochka +popeye1 +popart +poopo +poopie1 +pooped +poop1 +poole +pooky1 +pongo1 +pondus +polpolpol +polo99 +polina2009 +polimer +pol123456 +pokpok +pokerman +pokemon00 +poise +pointblank +point1 +poes +podiatry +plhy6hql +plextsofttm +playhouse +player21 +playboy6 +platina +plat1num +plastik +plasticp +planter +plant1 +pizarro +pivkoo +pitboss +pissword +piroca +pippolo +pippo1 +piper2 +pipeman +piopio +pinpon +pinoyako +pinkfl +pimpjuic +pimphard +pimaou +pilote +piet +pidoras +pickens +philou +philip1 +phenmarr +phase2 +phaedra +pfunk +pfhbyf +petty43 +petticoa +petshop +petert +peter7 +pete14 +perth +percussion +percussi +perch +peppino +peppie +pepepepe +pentable +pensacol +penny2 +penguin8 +penfloor +pencil1 +peludo +pelepele +peking +pegas +peewee51 +peck +pecan +peach1 +pauly +pauljr +paulinka +paul11 +patti1 +patten +patatina +patat +password22 +passwd1 +passw +passsword +passssap +passpage +passover +passive +passit +passin +passat99 +passa +pass111 +pasion +parvin +part +parsec +parma +parlay +parks +parkhead +parcel +parasha +paramount +paradoks +papageno +paolino +pammy +palladin +palevo +palace22 +paki +painters +painkill +paigow +padrino +pabst +pablo123 +pa55wd +p1nkb178 +owns +ow8jtcs8t +oussama +ousooner +otisotis +otherside +othello1 +oslo +osito +orphan +orion123 +orange11 +opusone +optimus1 +optics +opinion +opening +opaopa +oompah +onward +ontheoutside +onetwo12 +onelov +omni +olson +olliedog +ollieb +oliver99 +oligarh +olesica +oleg1996 +oleg1994 +oldskool +oksanka +ojp123456 +oi812 +ohotnik +ohiost +ogoshi +oglala +obvious1 +oDgez8J3 +o0o0o0 +nyyankees +nytimes +nymets1 +nutsac +nusrat +nurich +nunzio +number10 +numb +ntktdbpjh1994 +nthvbyfnjh2 +nsync +now0new +novato +nounour +nottoday +nottingham +notgood +nosredna +nosorog +nosmas +norwalk +northside +normand +norman1 +normal1 +nona +nomore2 +nomi +nokia6131 +nodnarb +nitros +nirvana9 +nine09 +nimajneb +nikolay9 +nikolaevna +nikkita +nihaoma +nicole18 +nicole01 +nicelegs +ngentot +nfyznfyz +nfyz123 +nfhtkrf +newyorke +newpass3 +newblood +nevins +neverwinter +neverman +neurosis +neumann +network2 +netpass +nepenthe +nelly1 +neko +ne_e_pod_chehyl +nazi +nazarov +nazaret +nazarenko +naumova +natron +nathan22 +nataxa +nastyanastya +nasca +nailed +nahtan +nahlik +nagoya +naenae +nadya +nacho1 +nabisco +n0th1ng +mythic +myth +myriad +mylover +mykitty +myjdxtcxks +mygal +mustek +mushrooms +murphydo +mundell +multiscan +muffinman +muffer +mudhen +mudbug +muchacha +msvcr71 +mrmojo +movies23 +moviebuf +mouse2 +moumou +motzart +motto +motoguzz +motaro +mostro +moshe +mortalkombat +morrowin +morphius +morgue +moparman +mooose +moonshot +moondanc +moo123 +montesa +monteiro +montee +monoxide +monkey4 +monitor2 +money77 +money21 +monarchs +momoney1 +mommys +molten +mollusk +molli +moller +moist +mogul +mogli +mockba +mmmnnn +miyuki +mistral1 +misti +mistered +misia1 +mishmash +misha123 +mironov +minotavr +minmin +minina +minim +minicooper +minfd +mine11 +milner +millan +mildew +milburn +milaya +mikey2 +mike31 +mike12345 +mihael +miguelito +midiland +mickey99 +michal1 +michaelm +michael12 +mice +mibbes +miasma +mhl1974 +mexicali +method7 +metal123 +mestre +mervin +mermaid1 +mendoz +mendes +menards +melly +melany +meister1 +megaton +megan123 +megamega +meetoo +meester +meeko +meditation +medicus +medical1 +medeiros +meat1492 +measure +me2you +mdmgatew +mccool24 +mccall +mazdarx +mazdamx5 +mayo +maxsim +maximus2 +maximize +maxie1 +max1 +max +mattylad10 +matthewj +matthew6 +matsui +matrix123 +matic +mathie +matchbox20 +mastery +mastert +master66 +massive1 +massim +maslova +masked +mascitti +mary123 +mary12 +mary1 +martin01 +martijn +martha1 +marston +marsmars +markers +marist +marisela +mario12 +marinus +marijke +marielle +marie123 +mariana1 +marial +marcus2 +march15 +march11 +maratik +marantz +maraca +mar123 +manzey20 +manteca +mansfield +manor +manly +manifold +manassas +mamma1 +mami +mama22 +mama1965 +mama1964 +mama1 +malutka +mallards +mala +maks5843 +maks2010 +makenna +makcim +majic +maintenance +maint +mainstre +mail123 +mahogany +mags +magicone +magic2 +maggie01 +mafia1 +maestr +madrigal +madinina +maddog69 +maddawg +madarchod +macross7 +mackin +machone +macedonia +macdog +macbook +mable +ma123123123 +m_roesel +m7N56xO +luv269 +lupe +lukas1 +luis1 +ludvig +lucy11 +lucious +lucie +lucidity +lucciano +lubimaya +lozinka +lovinit +lovepuss +loveland +lovelady +lovelace +lovehurt +love55 +love4you +love4eve +love3 +love10 +louis123 +lostboys +lore +lopesk +looping +looking1 +longlong +longboard +lompoc +lommerse +lollol12 +lolkin09 +lolki123 +loli +lokit +logout +logitech1 +logging +lobzik +lobolobo +lkjhgfdsazx +liziko +lizardki +livid +lively +livelive +littleminge +littleguy +littleb +lissalissa +lise +linette +lincoln7 +lincol +limbaugh +lilone +lilmike +lillys +liliane +lilacs +likeme +lightbulb +lifesux +lifeis +lickme2 +lickin +lexlex +letssee +leto +lester1 +lesli +leshka +leonov +leones +leon123 +lenchik +lenard +lena2011 +lena12 +legshow +leghorn +leggy +legend1 +leftie +leftee +leedsuni +leedsu +lee +ledger +leandra +leader1 +le33px +lcrastes +lbc999 +lazarev +lawn +lawler +lavonne +laura2 +laufen +latte +latrobe +latisha +latinus +latinos +latin1 +latham +lately +late +latching +larousse +lankford +lanfear +lances +lampar +lamina +lamerz +lamborgini +lambo1 +lalala123 +laketaho +lakers08 +lainth88 +ladle +labour +kzkmrf +kyle123 +kyle1 +kyla +kyjelly +kvartira +kurwa +kuolema +kungen +kulikova +kuken +krystle +krystal1 +krysta +kryptonite +kreker +kraft +kpcofgs +kovacs +kosta1 +kornet +koontz +koolkid +kook +konfeta +kondom25 +kolesnikov +koketka +kociak +koblenz +kobayash +knopfler +kneel +kleiner +klaipeda +kkkddd +kki177hk +kite +kisulya +kissme1 +kissfan +kirpich +kirova +kips +kinsella +kinkysex +kingshit +kingrat +king13 +kimono +killit +killerman +killerb +killer6 +killer00 +killed +killas +kiddie +kickin +kickbox +khongbiet +kfgeirf +kevinr +kevinn +kevinl +kevinh +kevinc +keri +kensington +kenshin1 +kennyb +kennel +kenned +kenmore +kemp +kelton +kelly12 +kelebek +keksa2 +keiser +keats +kdkdkd +kazuya +kaylynn +katyakatya +katushka +katiebug +katie2 +kathi +kasperok +kasey1 +karuna +karpova +karolin +karmann +karavan +kansas1 +kamelia2011 +kamel +kallis +kalleank +kalender +kalambur +kakdela +kaioken +kacie +kablam +jyothi +justonce +juntas +junior13 +june1503 +june1 +jumpup +july22 +julietta +juanch +jscott +josiew +joshua0 +josepha +joseph11 +jordan20 +jones2 +joliet +joker777 +jojoba +johny +johnnn +johnjr +john10 +johansen +joesph +jobsearch +jnrhjqcz +jkelly +jimb +jiggas +jetboy +jesus33 +jessica3 +jessee +jergens +jeremi +jenson +jennyk +jennyc +jennjenn +jennan +jeffery1 +jeep99 +jeebus +jed1054 +jdavis +jc05595 +jblpro +jazzed +jazz1234 +jazman +jaytee +jawbone +jawa350 +jasmine9 +jasmine3 +jas4an +jarret +janus1 +janssen +janets +jan123 +jamjar +jamesw +jamesl +jamesjames +jamese +james19 +jakeyboy +jakes +jahbless +jaffa +jadejade +jaded +jacuzzi +jacopo +jackoff1 +jacko1 +jackiech +jackie69 +jack5225 +jabberwo +jZf7qF2E +ivan1996 +iubire +istanbu +isolde +islamabad +isidor +isdead +isaia +irusik +irongoat +irondesk +ironcity +irnbru +irisiris +irishlad +iraffert +invoice +invite +into +instruct +institut +innova +ingres +infix +inetcfg +indonesi +indien +indianer +indeep +impossib +implant +imladris +imelda +imbored +imani +imaloser +imagination +iloveyou11 +ilovetits +ilovetit +ilovemyfamily +ilkaev +ilikeporn +il2fw2 +ihateyou1 +igor1234 +ignaci +icon +icicle +ichwill +ichliebe +icequeen +ibpjahtybz +iamthe1 +hunt0802 +hunnybun +hunglow +hunden +huckle +huck +hubba +htyfnf +howlin +howl +howies +howhigh +howareyo +houghton +hotshot1 +hotrods +hothothot +hothead +hotel1 +hotcat +horosho +hornet1 +horndogg +hoppie +hooray +honeydog +honda450 +honda01 +homyak +holly2 +hollister1 +holio +hold +hokuto +hogg +hogfan +hockey69 +hockey4 +hockey14 +hobnob +hoangen +hjvfy +hitch +hiroki +hippies +himura +himalaya +hilliard +hijodeputa +hijinx +hijack +highway1 +highspee +highheels +highest +higgins1 +higashi +hfpldfnhb +hfpdjl +hewson +hesoyam123 +hershil +heroine +hermine +heresy +herbert0 +hepburn +hemant +helping +hellbound +hellboun +helens +hektor +hejsan123 +heinz57 +heimdall +heiko +heehaw +hedge +hecto +hecmax +hecfkrf +heavymetal +heavymet +hawkey +hawaiiguy +hauser +hatrick +hatebree +hassel +harveys +harsha +harrison1 +harr +harmless +harlot +harley88 +harem +hardwick +hardee +hard69 +harakiri +happyhappy +happyface +happycat +happy13 +happen +hanford +handy1 +hammie +hammer11 +hamm +hamburg1 +halsted +hallelujah +hakuna +hakaone +hackedit +h4ck3d +h397pnvr +h200svrm +gxtkrf +gvanca +guss +gusev +gurumayi +gunsmith +gunnison +gundog +gundamwing +gundam00 +gulla +guitare +guenther +guapo +guadalupe +gtynfujy +gtnhjpfdjlcr +gruppa +grumpy1 +grudge +grow +gromova +groin +grizzlie +greygrey +greyfox +greta1 +grepw +grenoble +grego +greg78 +greetings +greengre +green42 +gree +grayfox +gravedig +grass1 +granvill +grammar +graham1 +gottago +goteam +gorila +gorges +gorden +gorbunova +gopinath +googly +goodlove +good4me +goniners +gomez1 +gomer1 +golos1 +goldone +goldie1 +goldenbo +gohogsgo +gogolf +gogetter +gogagoga +godsend +godless +god123 +glue +glossy +glock1 +gleb +gladius +glacius +gkfdfybt +gjpbnbd +gizzy +gizmo2 +giveit +gingin +ginger123 +gineok +gimmie +gilgamesh +gilead +gigio +gigantic +gibso +ghjuhfvbcn +ghjatccbjyfk +ghfgjh +ggggggggg +gggg1 +gfitymrf +gfhjkm1234 +gfhfyjqz +gfhfdjpbr +gfgfif +gfgfgfgf +getajob +gestalt +gerlinde +gerd +gerbera +gerasimova +gerar +geral +georgia2 +george13 +genetic +generale +gendalf +gems +gemini11 +gemeni +gehenna +geeque +gbgtnrf +gayman +gaylor +gayathri +gavrilov +gauthier +gateway3 +ganteng +ganges +gandalf3 +gandalf0 +gandako +gamer123 +gameplay +gamecocks +gambit1 +gallen +gage +gadina +gabriel12 +g1234567 +g0away +fynjyjdf +fynfyfyfhbde +fyfnjkmtdyf +fuzzie +fusilier +furnace +funnel +funker +fun4all +fujimo +fufnfrhbcnb +fuckthem +fuck99 +fuck666 +fubared +fubar123 +frown +frogman1 +fritze +frigate +fries +freyja +freema +freedom8 +freda +fred20 +freakme +freakboy +fre_ak8yj +frasse +frank69 +fozzy +fourty +fourplay +foundation +fotze +forzaroma +forward1 +foru +fortune1 +fort +forplay +forgetme +fords +fordgt40 +ford50 +forced +footsy +footie +fooey +foo123 +folio +folgers +fofofo +flywheel +flyers99 +flyboy1 +flowing +flopsy +flippe +fleshbot +fleabag +flavi +flat +flake +fktrcttdf +fkrjujkbr +fizban +fiver +five55 +fitzgerald +fishstic +fishfinger +fisheye +fireplug +firegod +fire13 +finding +fincher +filipina +filial +filatova +figure8 +figona +fifa2010 +fifa +fiero +fidodido +fiction6 +fibonacci +fiasco +fhrflbq +fetus +festiva +ferret1 +ferrero +fergis +ferdie +ferdi +fengshui +fenerbahc +fences +feets +federov +feather1 +fcgbhby +faucet +fathead1 +fatdick +fastfast +fastest +farming +fargus +faramir +faqfaq +fangio +fanatik +fallengun +fall99 +falcon69 +fairchil +faceman +f0cus1 +expresso +expos +expired +excellence +evropa +evh5150 +every +everto +events +evenpar +euclid90 +esthe +essen +espoir +esenin +escaflowne +ervin +ertyuiop +eriksson +ericcc +eric99 +eric11 +erdfcv +equine +epstein +entrar +entrada +enron714 +enolagay +enkidu +english1 +engels +enfant +energ +ending +endeavor +encounter +enchante +empire11 +emotions +emergency +emergenc +elves +elmoelmo +elmer1 +elliemae +elgordo +elevation +elessar +eleonor +elbert +el345612 +egoiste +eeeeeeeee +edward2 +edward11 +eduard1 +edmonds +ededed +eddie2 +eatmeat +easy1 +earnest +eagles12 +eagleman +dylandog +dweezil +dweeb +duty +dustin1 +dustbin +dunwoody +dulce +dukeman +duke33 +dugway +dudu +duckhead +dubesor +dtheyxbr +dtcyeirf +drumdrum +druhill +drucker +drool +drift +dream2 +drea +dre3dre +drakcap +dragstar +dragoon1 +dragon666 +dragon33 +dragon18 +doulos +doug1 +dott +dotdot +doss +dorothee +dorothea +dorene +doors1 +doog +doodlebu +donna123 +donking +dogleg +doggy123 +doggdogg +dogdays +dogbutt +dmitrij +dkfcntkby +djkxbwf +djctvm +djamaal +dizzle +divina +divin +divider +divad +discordi +discman +disarm +dinah +dimitry +dima1985 +diggit +dietpeps +diesirae +diario +diamond4 +dfhrhfan +dfhdfh +dfdfdfdf +dfdf +devotee +devil69 +devastator +deuce2 +destiny2 +destini +desi +deshawn +desember +derrek +dereks +denture +denny1 +denis1988 +demoman +demetriu +delta6 +delonge +delirium +deisel +deepsix +deeman +deebee +dedham +decline +decibel +decent +debeers +death2 +deandean +deadzone +deadmoin +deadmau5 +deadfred +dead13 +dbzdbz +dbnfkbyf +daystar +daxter +daxdax +davinchi +davin +david22 +dave41 +dave2 +dave01 +datho +dasein +dartmouth +dannyd +danny001 +danno +danna +daniel3 +dange +dandie +dance123 +damian1 +dale3 +dakota99 +dak001 +daisuki +dagobah +daffyduck +dabdab +d41d8c +d1d2d3 +czarny +cymru +cyclone1 +cybrthc +cuyahoga +cutoff +curtains +currahee +cunningh +cumquat +cumberla +cum2me +culoculo +cubsfan +ctrhtnyj +csm101 +cscscs +crystal0 +crock +crip +crhbgrf +crazyj +cranston +craiger +crackpot +cqub6553 +coyote1 +cowdog +coupon +cougars1 +cottage1 +cosmodog +cosette +cosenza +corsano +corrado1 +coron +cornelius +cornelis +corine +corecore +coorslit +cooper2 +cooper11 +coon +coolio1 +coolbree +cool-ca +cookie13 +cookie123 +convair +controller +contro +contrasena +contax +consulta +constanc +conny +conno +connell +connard +conklin +confed +conducto +conditio +compost +compac +combs +coma +com +colucci +colo +colleg +colin123 +coin +coffee2 +coffee12 +cody11 +cocotte +cocomo +cock1 +cochrane +coal +clubcapt +clk430 +clitring +clique +clickit +clearwat +classe +cisco69 +cintaku +cinque +ciccia +cia123 +chuvak +chumpy +chris999 +chris6 +chris5 +chris33 +chris200 +chopsuey +chlorine +chippie +chipmonk +chiphi +chinnu +chingada +chinadol +chimp +chileno +chicony +chicken0 +chicc +chicago0 +chevy01 +chester3 +chesss +chess1 +cheryl1 +cherry12 +chelsea7 +cheetahs +cheesey +checkm8 +chart +charlus +charlize +charchar +chaparra +changing +change12 +changa +chanel5 +chaika +chacha1 +cfif +cfiekmrf +cfdbyf +cesa +cerebro +ceramics +central1 +centra +celos1 +celeste1 +cdtnkfy +cdtnf +cbljhjdf +cbcmrf +caverns +caveat +cavalla +cause +catolica +cathrine +cathie +catchme +catch2 +catapult +catania +castle1 +cassie12 +casper123 +casita +carro +carri +carreras +carper +carmina +carlsbad +caritas +carame +capri50 +capitano +canter +cant +cannelle +canfield +candyfinger +candoo +camster +campus100 +cameron7 +call06 +cakewalk +cairn +cagiva +cage +cactus1 +cabin1 +c7e4f8EzqH +byoung +buyer +buttss +buster69 +buster3 +buster123 +bushmast +burzum +burundi +burro +burrfoot +burden +bung +bundy1 +bumsen +bultaco +bullnuts +buldozer +bujhmbujhm +bugssgub +buffy1ma +buffs +buffal +budman1 +buddy4 +buck01 +bubbly +bubbles2 +bubba7 +bubba12 +bryan123 +brutu +brunob +bruce123 +brownn +brother2 +brooze +brooms +bronc +broadban +brittni +britania +brillo021 +brille +bricky +brice +brianp +briang +briane +brianc +bri5kev6 +breeder +breakout +breakdance +breads +breach +brea +brave1 +braun +brandon8 +br5490 +boyfriend +boxxer +boxman +bouche +bouboule +bossss +bosslady +boscos +borracho +borodin +born2run +boris2 +boredboi4u +booty69 +booster1 +boomer22 +boolean +boogyman +booboo2 +bonnies +bonker +bongwater +bondra12 +bond0007 +bolbol +bolat +bokser +boing747 +bogger +bogdan123 +bodybuil +bodo +bodhi +bobi +bobcat12 +bobbyt +bobbyjoe +bobbybob +bobby18 +bob69 +bmw635 +bmw328i +bman +blur +bluewave +bluesky1 +blues2 +blueroom +bluejay1 +bluegreen +blowpop +blowj +bloodred +blitzkrieg +bliss1 +bleed +bleacher +blanks +blackpus +blackmor +blackgir +blackfoo +black10 +blaat +bkmifn +bjork +bjarne +bitches1 +birthday28 +birthday27 +birthday26 +bioman +binker +bink +bine +bimbo1 +bimbim +billee +bigwaves +bigtuna +bigtee +bigrig +bigmax +bigman1 +biglips +bigkev +bigjake +biggums +biggame +bigfoo +bige +bigdon +bigbubba +bigboys +bieber +bidule +bicho +bibibibi +bftest +betty123 +bettis36 +betsie +betsey +betmen +bertuzzi +bertus +berti +bernie51 +bernie1 +berna +berlingo +bergen09 +beppe +benny2 +bendis +belly1 +bellend +bela +bedbug +beckys +beckman +beckham23 +bebeto +beaulieu +beardog1 +bear99 +beano002 +beachy +beaches1 +bdfysx +bcrich +bboy +battery1 +basura +bassey +basse +baskets +basketball1 +basia +baseball7 +baseball11 +barth +bart316 +barsic +barney01 +barmalei +barf +bardak +barbel +baobab6 +banglade +bangalor +bandicoot +bandar +banaan123 +bammbamm +bama12 +ballad +baldeagl +bakesale +bakerman +baka +bailie +bahia +bahbah +bags +bagman +baddog1 +bacteria +bacons +babyfac +babyblu +baby22 +baby12 +babuin +babebabe +babare +b26354 +azzurro +azure +azat +awo8rx3wa8t +avion +avalon11 +autum +australia1 +auntjudy +august9 +august29 +audia8 +atom +athlon64 +astronomy +astroman +assman1 +asslicke +asshole123 +asmodey +asmara +ashley24 +ashes1 +asher +ash123 +asdasd22 +asad +arvind +artichok +artemis1 +artema +artem1995 +artem1992 +artcast2 +arsenii +arsenal14 +arsenal0 +arrive +arnold1 +armchair +arlingto +arlen +arkasha +arkady +arjuna +arianna1 +arequipa +arenas +ardmore +arashi +arab +april24 +april14 +appliance +applejuice +appeal +apollo8 +aperture +apache64 +anytimetoday +anya +antonioj +antonio3 +antiflag +antichrist +anthony8 +anthony4 +anonymer +anointed +annoy +annerice +annelise +anitha +animes +anime123 +animalsex +angora +angelz +angelo1 +angelia +angelangel +angel20 +angel17 +ang238 +andy76 +andrey1 +andrew99 +andrei123 +ander +anatoli +anar +analanal +anais +amours +amoroso +amizade +amit +amin +america2 +amenra +amenamen +amen +amberly +amanda10 +amamam +amadeusptfcor +alydar +always1 +alvin1 +alton +altman +altezza +alphasig +alltheway +allies +allie1 +allen34 +allen3 +alla98 +alisaaa +alina2006 +alina123 +alfonzo +alexx +alex97 +alex74 +alex2 +alex1998 +alex1995 +alex1982 +alex1975 +alex10 +aleshka +aleksi +alegna +alchemist +albert12 +albatro +alaric +alan1 +al123456 +akvarium +akuma +akshay +akita +akinfeev +akakak +airways +airjorda +aiden1 +agatka +agate +agahaja +afroman +afrodite +afrika2002 +affe +aessedai +aerith +aerdna +aeneas +adriane +adkins +adjuster +adilbek +adi7id5 +adelante +adebayo +addpass +adalbert +acuracl +acumen +action1 +access88 +abuela +abra +abihsot +abeille +abcabc55 +aassaa +aass +aaron12 +aaa123aaa +a22222 +a1s2d3f4g5h6 +a123456b +Zorro1 +Z3Cn2eRV +Yamaha1 +Wwwww1 +Woody1 +Wolves +Winter1 +WilDroid +White1 +WebUIValidat +WaPBBs +WUTANG +WILLOW +WESLEY +WEASEL +WAS.HERE +WANKER +Volume +Virginia +VIKING +UkqMwhj6 +USA123 +UNICORN +Trouble +Toronto +Tommy +Tits1 +Theresa +Texas +Teddy1 +Tarzan +TREBOR +TDEir8b2 +Storm1 +Stinger1 +StarWars +Star +Stallion +Stacey +Ssssss1 +Spring +SpecialInsta +Special +Snake +Skorpion +Siemens +SiDDiS +Shirley +Sherwood +Service1 +Select +Scorpio1 +Sb211st +Sataniv1993 +Saratoga +SUBROSA +SPIRIT +SHORTY +SERGIO +Rusty +Runner +Ronnie +Rocket +Ricardo +Remember +Rapunzel +RUSH2112 +RICARDO +REGISTER +R3Vi3Wpass +QAZWSXEDC +Police +Playboy +Pauline +Paradise +PaloAlt +Pa437tu +PUSSY1 +PPPPPP +POOHBEAR +PONTIAC +PLUMBER +PLATINUM +PEEWEE +PASSPORT +PANZER +Orosie1 +Orlando +Ophelia +Ooooooo1 +Olivia +Network +Natalie1 +NATALIE +NATALI +Mustangs +Moonstafa +Montana1 +Mmmmm1 +Mistress +Megafon77 +Matrix1 +Mario +Marines1 +Marie +Manager +Malibu +MacMac +MONTANA +MONSTER +MEMPHIS +MARYJANE +MARIA +MAGNUM +Lover +Longhorn +LockingServi +Lllllll1 +Llllll1 +Lights1 +Leonard +Legend1 +LITTLE +LINCOLN +LASVEGAS +Kudos4Ever +Kristen1 +Krauss +Kolding +KissMyAss +Kingston +Kenny1 +Just4Fun +Jeff +JOANNE +JGTxzbHR +JEFFREY +JAVIER +Ireland1 +Hover +Houston1 +Hooters +Holly +HOUSES +HORNEY +HELPME +HARDON +H9iyMXmC +Gunner +Guardian +Grateful +Gothic +Goober +Golf1 +Giants1 +Ghbdtnbr1 +Georgia1 +Geoffrey +Gemini1 +Gators +Friday +FreeSpace +Flyers +Farmer +FUCKIT +FRANK +FRANCE +FLOWER +Express +Esther +Elaine +Eclipse1 +Eagle +Dvdcom +Dreams +Douglas1 +Dortmund +Doctor1 +DmfxHkju +Dima123 +Dieter +Devils +Daddy +DUDLEY +DUDE +DOLPHIN +DOLLAR +DISNEY +DIGGER +Crusader +Creativ1 +Cooper1 +Cookie1 +Classic1 +Cherry +Chandler +Chance +Cdznjckfd +Cassie1 +Carmen1 +Captain1 +CARLO +CANDY +CALVIN +Butthea1 +Bunny +Braves +Brandi +Boobies +Bishop +Birdie1 +Billyboy +BigDaddy +Bianca +Beverly +Beauty +Beach1 +Bayern +Bastard +Barnes +Barbie +BUDDY1 +BRAZIL +BOWLING +BOOBS +BOLLOCKS +BG6nJoKF +BENSON +BEETLE +BAZongaz +BABYLON +Atlanta1 +Andre +Amber1 +Alex1 +Adrianna1 +Adrian +Action +AVALON +ASDFG +A1B2C3D4 +A1B2C3 +A123456789 +99ranger +999999999999 +999555 +98xa29 +989989 +987654321g +9875321 +97979797 +96ford +9632 +9311 +9310002 +92856 +9199 +9173 +917190qq +911119 +8995 +8969 +8910 +89032073168 +8900 +888889 +8885 +8877 +8811 +8807031 +8800 +8687 +8668 +8541 +8538622 +8523 +8521 +8520456 +82828282 +824358553 +8218yxfz +7997 +7911 +789512 +7895 +7883 +78789898 +7791 +7789 +77879 +7781 +7777777z +7777777s +7776 +7767 +776655 +7755 +76689295 +7652 +7591 +7576 +7532 +7456 +7444 +741123 +740000 +73997399 +737737 +7374 +727727 +7227 +7221 +7212 +7201 +7195 +717717 +7177 +7173 +7159 +713713 +70sguy +6yhn7ujm +6inches +6997 +6963 +6943 +6910 +686686 +6833 +6741314 +671fsa75yt +6688 +6663 +6644 +6600 +6575 +65656 +650000 +6500 +64chevy +6375 +6369 +6364 +636332 +6266 +6215mila6215 +6043dkf +5unshine +5gtGiAxm +5f68t9 +5element +5969 +5880 +5853 +5844 +5837 +5747 +5692 +56836803 +5654 +5565 +55555N +5545 +55443322 +55378008 +5521 +5515 +5487 +5465 +5463 +5446 +543211 +5430 +5427 +5412 +5335 +5318008 +5280 +5272 +52415241 +5222 +5163 +51515151 +5150vh +511647 +50cen +500600 +5001 +4speed +4seasons +4nick8 +4ever4 +4950 +49494949 +4921 +48n25rcC +4874 +4862 +4840 +4815162342lf +4801 +4756 +4754 +4717 +46and2 +4682 +4588 +45674567 +4561 +45544554 +4521 +4512 +4509 +45014501 +44e3ebda +44884488 +4447 +444455 +444111 +4425 +4410 +4387 +43724372 +4344 +4331 +4312 +4279 +427287 +4265 +4247 +4237 +4229 +422422 +420420420 +4187 +4143 +41214121 +4117 +4115 +4077 +4061994 +4030 +388388 +3845 +3824 +37Kazoo +3710 +36dd +36987 +36985214 +3655 +3654 +3633 +3625 +3599 +357357357 +350350 +3481 +34773477 +3457 +3443 +342500 +3376 +3358 +334334 +3339 +3335 +3331 +3326 +3315 +3314 +3309 +3303 +3296 +328328 +3269 +323323 +3213 +32113211 +32023202 +318318 +3161 +31359092 +312mas +3126 +3121 +311295 +311271 +31121965 +31101997 +31101963 +31101958 +310878 +310873 +31081961 +31071970 +31071964 +310575 +310573 +310568 +310558 +31053105 +31051998 +31051961 +310375 +310367 +31031959 +310310 +31021364 +31011963 +310000 +308win +301271 +301197 +301175 +301167 +30111971 +301075 +301071 +301068 +301060 +300zxtt +300977 +300968 +30091966 +300894 +300891 +300878 +300875 +300868 +30081996 +30081955 +300784 +300776 +300772 +30071968 +30071963 +300672 +300668 +300570 +30051964 +30051962 +30051961 +30051957 +300460 +30041958 +300391 +300376 +30032001 +30031961 +30031937 +300177 +300170 +30011955 +2yKN5cCf +2vRd6 +2legit +2hot4you +2hot4me +2boobs +2balls +2991 +2975 +29622962 +2951 +29292 +291279 +291277 +29121970 +291175 +29111964 +29111958 +29111955 +291093 +29101964 +29092001 +290877 +29081997 +29081970 +290773 +29071965 +29071964 +29071963 +290594 +290593 +290570 +29051999 +29051958 +290469 +290373 +29031967 +29031966 +29031963 +29031960 +29022000 +2900 +28822882 +2878 +2875 +2868 +2866 +2855 +28121996 +281166 +28101999 +280993 +28091997 +28091968 +28091960 +280890 +28081963 +28081958 +280795 +280774 +280763 +280697 +280672 +28061967 +280574 +280572 +280569 +280496 +280491 +280478 +280474 +28042000 +28041968 +28041961 +28041958 +28032000 +28031958 +280272 +28021971 +28021959 +280197 +28011965 +28011960 +2737 +2730 +27128 +271275 +271273 +271270 +27122005 +27121997 +271197 +271176 +271174 +27111964 +27111962 +27111960 +27111958 +27111957 +271097 +271079 +271075 +271068 +27101968 +270979 +270976 +27091997 +27091960 +270873 +270869 +27081967 +270796 +270771 +27061966 +27061960 +270576 +270573 +270568 +27051966 +27051958 +27051957 +270498 +270478 +270474 +270468 +27041964 +27041959 +27041956 +270399 +270396 +27031967 +27031964 +27031962 +270287 +270271 +27022000 +27021958 +270194 +270173 +270167 +27011965 +2654 +26262 +2613 +261292 +26121960 +261191 +261173 +26111963 +26101997 +26101996 +26101970 +26101960 +260975 +260970 +260965 +26091963 +26081957 +260778 +260697 +260665 +2606642yra +26062001 +26058 +26051965 +260473 +260469 +26041968 +26041962 +260397 +260372 +260371 +26031966 +26031965 +26031964 +26031955 +26028 +260278 +260275 +26021963 +260174 +260168 +26012001 +26011965 +26011961 +2599 +258046 +2580258 +257257 +2559 +2558 +2557 +2529 +2513 +251276 +25122001 +25122000 +251169 +251168 +25111999 +25111962 +25111954 +251098 +251073 +251066 +25101970 +25101962 +250993 +250967 +250965 +25091962 +250877 +250873 +250871 +250767 +250759 +25071998 +25071956 +250675 +25061966 +250591 +250579 +25051997 +25051962 +25051961 +25051960 +250493 +25041958 +25031970 +25031966 +250276 +250273 +25021960 +250176 +250171 +25011997 +25011964 +2500hd +2500aa +2491 +24861793 +24688642 +246801 +2462 +2454 +2441 +24282428 +2426 +2422 +241978 +241275 +241269 +241264 +241241 +24121961 +241174 +241169 +241162 +24111963 +241097 +241095 +241066 +24101998 +240967 +24091969 +24091964 +24091962 +24091954 +240898 +240872 +24082408 +24081965 +24081963 +24081958 +240795 +240776 +240770 +240769 +24071963 +240697 +240696 +240662 +24061962 +240572 +240566 +240499 +240478 +240471 +24041999 +24041965 +24041960 +240392 +240376 +240360 +24031968 +24031963 +240296 +240273 +240263 +24021965 +2401pedro +240170 +24012000 +24011969 +24011964 +23WKoa0FP78dk +2380 +2367 +2361 +234561 +2336 +23252325 +2319 +2316 +23121965 +23121963 +23121958 +23118 +231170 +23112000 +23111961 +231098 +231097 +23102001 +23101968 +23101967 +23101961 +230993 +230968 +23091960 +230875 +23081999 +23081998 +23081965 +23081963 +23081962 +230797 +230768 +230767 +23071969 +23071966 +23061997 +230597 +23058 +230570 +230567 +23051964 +23051963 +230496 +230474 +230463 +23042304 +23041963 +23041960 +23041958 +230381 +230369 +230367 +230363 +23031970 +23031957 +230296 +230273 +230265 +230230 +230198 +230177 +230172 +230159 +23011964 +230101 +2282 +2281 +2278124q +22422242 +2238 +223355 +22224444 +221980 +221976 +221969 +221294 +221277 +221263 +22121997 +221196 +221182 +221178 +221174 +221173 +22112000 +22111964 +22111962 +221061 +22101971 +220997 +220894 +220873 +220863 +22081968 +220796 +220763 +220697 +220671 +220668 +22062000 +220574 +220557 +22051998 +220497 +220454 +22041965 +22041961 +220363 +22031961 +220296 +220274 +220268 +22021968 +220169 +219219 +2188 +2185 +2180 +2178 +2177 +2157 +213546879 +2128 +211273 +21122001 +211194 +211169 +21111962 +2110se +211095 +21108 +211072 +21101962 +21101961 +210969 +21091999 +21091997 +21091963 +21091962 +21091959 +210896 +21088 +210873 +210872 +210862 +21082000 +21081963 +210766 +21071968 +21071965 +210673 +210666 +21061968 +210569 +210563 +21051966 +21051960 +210476 +210459 +21041965 +21041964 +210372 +210369 +210365 +21031961 +210296 +21021960 +210198 +210168 +21011959 +21011954 +2075 +201980 +20121999 +20121963 +20121961 +20121960 +20120 +201196 +20112000 +20101967 +20101966 +20101964 +20101961 +20101959 +20092000 +20091997 +20091963 +20091961 +200899 +20081968 +20081954 +200794 +200776 +200770 +20071961 +200698 +200697 +200672 +200668 +200661 +20062001 +20062000 +20061998 +20061969 +200597 +20058 +200570 +20052007 +20051999 +20051970 +20051960 +20041997 +2004-11- +200394 +20031963 +200297 +200271 +20021966 +20021965 +200195 +200190ru +200176 +200170 +200161 +20011958 +1zxcvbnm +1qwe2 +1qaz2WSX +1q3e5t7u9o +1q21q2 +1pizza +1newlife +1mustang +1month +1lover +1escobar2 +1chicken +1bigdick +1a2b3 +1Winter +1Video +1Surfer +1Steeler +1Spanky +1Sexsex +1Rrrrr +1Richard +1Panties +1Packers +1Ooooo +1Oliver +1Mouse +1Monster +1Michell +1Magic +1Legend +1Kkkkk +1Iiiiiii +1Golf +1Gateway +1Freedom +1Flowers +1Ffffff +1Doctor +1Crazy +1Cowboys +1Celtic +1Carolin +1Bill +1Bigdick +1Banana +1Badger +1Arsenal +1Angels +1Abcdefg +199619 +19952009 +199511 +199422 +199415 +19932916 +199315 +199311 +199224 +199216 +199129 +199020 +198922 +198917 +198913 +198911 +1988198 +198803 +198712 +19871 +19861987 +19851986 +198505 +198326 +19832 +19831985 +198282 +19821984 +19821983 +19820 +19811983 +19801982 +197919 +197811 +19780 +197700 +19761977 +197611 +19735 +197325 +197119 +197101 +196869 +196565 +196100 +19211921 +191987 +191276 +19122000 +19121961 +19121958 +191176 +191170 +19111956 +191061 +19101966 +19101959 +190970 +19091960 +190893 +190881 +190870 +19081967 +19081965 +190794 +190793 +190790 +190782 +190774 +19072000 +19071998 +190693 +190673 +19062001 +19061956 +190591 +19051969 +190476 +190390 +190376 +19031961 +190280 +190275 +190274 +19021967 +19021965 +19021958 +19021902 +190192 +190183 +19011970 +19011951 +1868 +1863 +1861brr +1850 +1833 +1819 +181272 +18122000 +18121966 +181194 +18118 +181170 +18111967 +18111963 +18111961 +18111960 +181066 +18101957 +18101956 +18091963 +18091961 +18091955 +180677 +180671 +180573 +18051961 +180496 +180493 +180468 +18041970 +180396 +180378 +180367 +18032000 +180281 +180273 +180272 +18021953 +180178 +18012001 +18011961 +18011958 +1779 +1773 +1770 +1768 +1754 +1749 +173173 +1727 +171296 +17121969 +17121961 +171197 +17111963 +17111959 +171095 +17101961 +170968 +17091955 +17081961 +170797 +170796 +170772 +170768 +170760 +17072000 +17071960 +17071707 +170694 +170573 +170566 +17051968 +17051964 +17051960 +170460 +170374 +170369 +17031998 +17031961 +170279 +170270 +17021998 +170169 +17011999 +17011962 +1700 +1678 +164164 +1632 +163163 +1631 +1630 +16128 +161275 +161270 +161266 +161262 +16121964 +16121960 +161174 +161159 +16111999 +161076 +16101969 +16101967 +16101962 +16101957 +160981 +160976 +160974 +16091967 +16091962 +160896 +160872 +160869 +160867 +16072001 +16071999 +16071958 +16071957 +160674 +16061963 +160574 +160568 +16051964 +16041972 +16041966 +16041961 +16041959 +16031961 +16031958 +16031955 +160297 +160279 +160271 +16021967 +16021964 +16021958 +160176 +160175 +16011971 +16011966 +15975312 +159357q +159357852 +1593575 +1591 +159000 +1571 +1553 +1542 +1530 +1529 +15253545 +1524 +15128 +15121962 +15121957 +15121955 +151163 +15111998 +15111964 +151073 +151071 +151066 +15101961 +15101960 +15101510 +15091968 +15091966 +15091954 +150780 +150773 +15071999 +150697 +15061961 +150597 +150571 +15051968 +15051962 +15051961 +150495 +150465 +15042000 +150376 +150370 +15031998 +15031960 +15031959 +15031956 +150300 +15028 +150276 +15021966 +150177 +150172 +15011965 +15011961 +1488ss +147852963 +147456 +147369258 +14691469 +1462 +145678 +14371437 +14331433 +14314 +1427 +1426 +142500 +1419 +1413 +14121956 +14111411 +141093 +141091 +14108 +14102001 +140976 +140975 +140966 +14091996 +14091965 +14091963 +14091960 +14091959 +140897 +140896 +140891 +140871 +140868 +140865 +14081997 +14081967 +14081961 +140784 +14078 +140760 +14071969 +14071967 +14071966 +140695 +140674 +140596 +14051967 +140505 +140373 +14031998 +140296 +14021961 +14021959 +140197 +140175 +140174 +140173 +140140 +14011999 +14011965 +1399 +1391 +138500 +1382 +136479 +1357924 +135789 +135642 +1354 +13481348 +134679a +134652 +133andre +13221322 +13191319 +131274 +13122000 +13121966 +131198 +131193 +131192 +13118 +131166 +13111961 +13111960 +13111958 +131095 +13101997 +13101960 +13101959 +130976 +130973 +130966 +13091970 +13091961 +130898 +130894 +130872 +130868 +13081969 +13081951 +13071961 +13061966 +130594 +13051966 +13051965 +13051964 +130473 +13042000 +130392 +13031962 +13031961 +130293 +130272 +13021997 +13021965 +130166 +13011956 +12qwer +12monkeys +12QWaszx +1266 +12581258 +125267 +125000 +124c41 +124536 +123max +123ewqasdcxz +123b321 +123as +123a123a +123987456 +12398 +12389 +1237654 +1236798 +12358 +12345tgb +12345abcd +123456zzz +12345678w +12345678d +123456789qwer +123456789j +123456789asd +1234567892000 +1234567890m +123456789000 +1234567887654321 +1234562000 +12345543 +123321qw +123180 +123123asd +123123789 +1231230 +1230987 +123007 +12261226 +122183 +122177 +122173 +12213443 +122012 +121996 +121990 +121988 +121985 +121968 +121957 +121883 +121882 +121477 +121256 +1212312121 +12121998 +12121960 +121166 +121073 +12101997 +121012 +12092008 +12091964 +12091959 +12091958 +120862 +120772 +12077 +120765 +120665 +120656 +12061962 +120600 +12060 +120572 +120567 +120565 +120564 +12051958 +120505 +120497 +12049 +12041959 +12038 +12031999 +12031966 +12021964 +12018 +120158 +12000 +11king +119955 +118801 +1169900 +11551155 +11471147 +11432006 +113078 +112971 +112375 +112358132 +112175 +112172 +112111 +111990 +111986 +111972 +111965 +111962 +111298 +111277 +111268 +11121966 +11121961 +11121112 +1111988 +111168 +111164 +111160 +11111965 +11111963 +1111111111a +111111111111111 +111098 +111092 +110960 +11091960 +11091956 +110867 +110866 +11081965 +11081956 +110767 +110763 +110761 +11072000 +11071970 +11071964 +110699 +110662 +11061969 +11061966 +11061963 +11061962 +11061961 +11061958 +11051996 +11051958 +110506 +110460 +11041969 +11041959 +110366 +110364 +110361 +11031962 +11021959 +110197 +110165 +110159 +11012566 +11012008 +11011968 +11011960 +1093 +108888 +1087 +1061 +1053 +1052 +103082 +103069 +10293847qp +102938475 +10287 +102498 +102466 +102288 +102282 +102276 +101988 +10198 +101970 +10197 +1012NW +101294 +10121967 +10121958 +101199 +101194 +101168 +101160 +101158 +10111959 +101057 +101054yy +10101998 +10101965 +100966 +100963 +100958 +10091972 +10081998 +10081965 +10081963 +10081959 +10081953 +100800 +100771 +10071999 +10071963 +10071957 +100671 +10061964 +10051961 +10051005 +100467 +10041967 +10041962 +10041958 +100394 +100293 +10021002 +100165 +10011974 +100110 +0994 +0920 +091293 +09121967 +091177 +091175 +091174 +09112000 +09111999 +09111968 +09111961 +09110911 +091094 +091090 +091085 +09101964 +090995 +09091998 +09091967 +09091962 +09091961 +09091958 +09091957 +090892 +090886 +090884 +090796 +09071971 +09071963 +09071961 +090660 +09061964 +09061963 +090579 +090564 +09051960 +090492 +090478 +090466 +09041998 +09041997 +09041956 +090399 +090395 +09031998 +09031970 +09031963 +09022001 +09021999 +090183 +090181 +09011999 +09011966 +09011959 +0830 +081292 +081290 +08121963 +081193 +081184 +081181 +081171 +08111958 +081098 +081091 +081077 +08101965 +08101959 +080997 +080994 +080993 +080991 +080982 +08091958 +080896 +08081966 +08081964 +08081963 +08081959 +080799 +080792 +080791 +080782 +08071963 +080697 +080666 +08061958 +080572 +080570 +08052000 +08051969 +08051965 +08041964 +08041963 +080398 +080395 +08031958 +080295 +080293 +080274 +080199 +080193 +080192 +080183 +08011965 +08011964 +0795 +0773 +071277 +071270 +07122001 +07121954 +071174 +071168 +071161 +07111970 +07111968 +07111964 +07111958 +071098 +07101968 +070976 +07091996 +07091969 +07091967 +070879 +07081968 +07081967 +07081960 +070773 +07071966 +070673 +07061971 +07061967 +07061965 +07061958 +070497 +070496 +070493 +070491 +070474 +070472 +070469 +070386 +070375 +070374 +07031963 +07021999 +07021968 +070185 +070183 +07011959 +0694 +0689 +0669 +061982 +0617 +061299 +061275 +061270 +061266 +061170 +06111998 +06111997 +06111969 +06111966 +061078 +061072 +06101999 +06101966 +060988 +060983 +06091999 +06091997 +06091965 +06091962 +06091960 +06091959 +060880 +06071997 +06071965 +060698 +06061961 +06061960 +060570 +06051970 +06051958 +060506 +060498 +060491 +06042000 +06041998 +060392 +060389 +060379 +060373 +060372 +060369 +06031964 +06031961 +06021999 +06021967 +06021964 +06021956 +060195 +06012000 +0594 +0592 +0590 +0589 +0582 +052098 +051292 +05121958 +05121956 +051198 +051196 +051168 +05111969 +05111964 +051072 +05101973 +050966 +05091968 +050894 +05081964 +05081961 +050795 +050771 +050765 +05071960 +050681 +05061967 +050570 +050484 +050473 +050462 +05042001 +05041959 +05041957 +050399 +050394 +05031968 +05031966 +05031953 +05022002 +050174 +050168 +05011964 +0490 +0489 +0487 +0485 +0481 +0479 +042000 +0413 +041293 +041265 +04121965 +04111997 +04111960 +041093 +041069 +041062 +04101963 +04101955 +040993 +04088 +040877 +040869 +04081996 +040796 +040792 +040693 +040678 +040571 +040569 +04041964 +04041961 +04041959 +04041956 +040393 +040381 +040378 +04032010 +040286 +040276 +040274 +040269 +04021998 +04021967 +04021961 +040195 +04011967 +04011960 +0378 +031975 +031268 +031172 +03112001 +03111966 +03111964 +03111962 +031087 +03101967 +03091967 +03091958 +030874 +030873 +03081965 +03081964 +03081957 +03071970 +030678 +03062001 +03061968 +03061967 +030592 +03051999 +030475 +030472 +03041996 +03041965 +03041961 +030395 +030374 +030363 +03031967 +030295 +030274 +030270 +03021968 +030196 +030195 +030169 +03012001 +03011965 +03011956 +03011955 +0295 +028526 +0285 +0272 +0258 +0252 +021983 +021982 +0217 +021495 +021298 +021295 +021293 +02121965 +021193 +021175 +02111969 +02111968 +02111957 +021077 +021072 +021071 +021056 +021021 +02101998 +02101969 +02101961 +020976 +020968 +020962 +02091997 +02091959 +020878 +020874 +020872 +020869 +02081960 +020799 +020797 +020778 +02072000 +02071968 +02071965 +020698 +020694 +020663 +02061967 +020573 +020571 +020492 +020462 +020460 +02042009 +02042007 +02042002 +02041963 +020368 +020363 +02031961 +020304 +020298 +020268 +020265 +02021965 +02021957 +020171 +02011956 +02011952 +02011949 +0192 +0179 +0159 +0153 +0148 +014702580369 +012012 +011299 +01121964 +01121961 +01121950 +011196 +011188 +011174 +01112001 +011097 +011069 +01101999 +010970 +010968 +01091939 +010899 +010872 +010869 +010798 +010794 +010780 +010771 +010770 +01071998 +01071968 +01071962 +01071960 +01071957 +010668 +01061997 +01061959 +010598 +010575 +010568 +010567 +01051958 +010497 +010477 +01042002 +01041959 +010407 +010397 +010396 +010293 +010273 +010272 +01021968 +010197 +010108 +008800 +0080 +0072 +0065 +0049 +003842 +0034 +0018 +****er +%E2%82%AC +zzztop +zxcvbnm123456789 +zxcvbn123456 +zxcvbasdfg +zxcvb12 +zxcvb09876 +zugzug +zucchero +zsxdcfv +zsnes1 +zsexdr +zsergn +zoso +zorrope +zootsuit +zolushka2 +zoltar +zoey +zlatan +zipzap +zippo123 +ziggydog +ziggie +zhv84kv +zhongguo +zemanova +zeeshan +zeek +zasxcd +zarazara +zaqwerty +zapp +zachman +z1x2c3v4b5n6m7 +z1x2c3v4b5n6 +yuyuyuyu +yummies +ytpfdbcbvjcnm +youknowi +yougotit +yoshimitsu +yoshimi +yonder +yoman +yocrack +yield +yfxfkmybr +yfifhfif +yesyesye +yeoman +yelrah +year +yeahman +ybrjkftdyf +ybrecz +yawetag +yasmeen +yankee23 +yamyam +yakima +y2k +xz33333 +xxxwow +xxx12345 +xtvjlfy +xtcnth +xs4all +xfiles1 +xenon1 +xenia +xcvxcv +x1y2z3 +x123456x +x002tp00 +wynter +wxcvb +wxc123 +wwwww77 +wwww1 +wwwooo1234 +wwjd +wurst +wunder +wtfwtf +wsx123 +wrestle1 +wrapper +wool +woodfish +woodbury +woodall +wonderbr +wombats +wolf123 +wolf100 +wjc200 +witchy +wiskers +wisdom1 +winter98 +winter0 +winstonone +winston6 +winsome +winged +windows2 +windfall +winbig +wimbledon +wimbledo +willy123 +williams1 +willer +widow +widew +wideopen +wicke +whyme2 +whole +whodaman +wheelman +wheeling +wheelie +wham +whack +wett +wethepeople +westerns +west1234 +wesker +werty123 +wert21 +werrew +wend +welcome7 +welcome5 +welcome4 +welcome0 +weiss +weiland +weider +weeks +webby +wealthy +wazzkaprivet +wawa +waves1 +watson0 +watso +waterdog +water5 +wasd1234 +warspite +warman +wapku1 +wapbbs_1 +wanting +wankher +wanadoo +walter34 +wallie +wallace2 +walkers +w3e4r5t6 +w00tw00t +vtldtltd +vthokies +vovan_lt +vova2010 +voronova +vonsclan +volga +voice +vocals +vmDnygfU +vjhjpjd +vivace +vitalik123 +vital +viruss +violine +vintage1 +villegas +vikes +vika2001 +vika1995 +vika12 +viglen +vigil +victoriya +vicelord +viborg +vgfun +vgbh12 +vfvfyz +vfvfnfyz +vfvfif +vfvekmrf +vfuybnjajy +vfufpby +vfkzdrf +vfif1986 +vfhnsyjdf +vfhmzyf +vfhbegjkm +vetter +vespa123 +vermeer +verbier +verbati +vepsrfyn +venom123 +venger +vbvbvb +vbhjyjdf +vbhjndjhtw +vault +varken +vans +vanina +vandy +vandread +vanburen +valusha +vallarta +valetudo +v55555 +v00d00 +utrecht +userpass +user1122 +useful +urbana +uragan +upskirt +upiter +universidad +union1 +underwea +underage +ultracash +uiorew +uhtvkby17 +uhfyfn +ufptkm +ufkxjyjr +ucht36 +ubnkthrfgen +u812 +u23456 +tyui +tytytyty +tylerca310 +tyler12 +twiste +twinstar +twine +twentyon +twenty1 +tvmarcia +tuscany +turke +tupacs +tummybed +tulip1 +tuffgong +tucke +tucano +tubby1 +tsadmin +truths +truly +truitt +trueman +trottel +tropez +trontron +trolo +trixter +triston +tristin +tris +trips +trieste +trickster +trickste +trfnthby +trevino +tressa +tremendo +treech +tree123 +tray +travka +transalp +trannies +traitor +traills +tracey1 +towel +tour +touareg +totti10 +totti +totenkopf +toshka +toshi +torres9 +torotoro +topsy +tootle +toothpic +toontown +tools1 +toofast +tony22 +tomuch +tommyk +tommy55 +tomch +toluca +tolkein +token +tocool +tobyto +toby12 +toby11 +toblerone +toadfrog +tktyrf +tittie +tish +tiptip +tinsel +tinmouse +timpani +timoteo +timoshka +timmys +timmay +timexx +timdog +timbuktu +tile +tijean +tighthole +tigger13 +tigerz +tigersha +tiger23 +tiger00 +tico +thundercat +thugstools +thresher +threee +thousand +thorne +thimble +thetford +thesun +thesimpsons +thepro +theme +theman22 +thejam +thegoat +thegirl +thecakeisalie +thebrain +thebitch +thc420 +thankful +than +textbook +test22 +terter +termit +tennis22 +tennis01 +tempo1 +temp12 +tejano +teenfuck +teendrea +technik +teamase +tdm850 +tazzy +taunt +tatonka +tati +tater1 +tatarka +tastee +tasker +tasha123 +tarragon +taro +tanner1 +tankdog +tanelorn +tanager +tamplier +tamar +tamada +tallis +tallica +tallen +talavera +takethat +takefive +takecare +tailspin +taganrog +taff +taekwon +tactics +tachyon +taburetka +t5r4e3w2q1 +t12345 +syssec +sysman +sydnee +swizzle +sweetman +sweet987 +sweet666 +sweaty +swearer +swapna +svtcobra +svoloch +suvorov +sutvsc5ysaa +sustanon +surfboard +sureno +superstr +superr +superpower +superj +superdan +supercat +supercal +superbob +super99 +suomi +sunspot +sunsets +suns +sunder +sumsung +sumsum +summer02 +suleiman +sulaco +sukisuki +suka +suitcase +sugar2 +sudhir +suckass +suck69 +subzero1 +subspace +subrosa +stylist +studstud +studly1 +studentka +stuck +stryper +strstr +strongbo +streams +streamer +stpiliot +storm123 +stooges3 +stony +stomach +stokecit +stjude +stixstix +stix +stings +stillers +stigma +stiffie +stickit +stewar +stevesmojo +steven6 +stevem +stepashka +sten +stella12 +stelios +steer +steen +stblow +stayout1 +stauffer +starzz +startrek1 +stars2 +starkey +starchil +star21 +stanthem +stalker2 +stacked +sssata +sslazio +sridhar +squirtle +sqloledb +spy007 +sprit +springfi +spotted +spotify +sportsca +spore +splits +splicer +spitz +spionkop +spiffy1 +spiderman3 +spider8 +spider7 +spider2 +spider16 +speed2 +specter +specialp +specialized +specialist +spazz +spam69 +spacebal +soylent +southbea +souleater +sorrel +sorokin +sooner1 +sonnys +sondheim +solly735 +soller +soledad32 +solana +sodomy +socken +soccer77 +soccer6 +soccer23 +snoopydo +sniper01 +snh4life +sneezy +snares +snafu2 +snafu1 +smurfett +smuggler +smooth15 +smokey22 +smoke20 +smellyfe +smelly1 +smallvill +smaller +sluts1 +sluggy +slot2009 +sloop +slocum +slingsho +slickone +slayer123 +slavka +slavic +slaphead +slalom +skywalk1 +skyline3 +skyclad +skunk1 +skotina +skiski +skirts +skillzz +skidmore +sizinici +sixtysix +sixpence +sitepass +sistem +sissinit +sissi +sisko +singles +singl +sinatra1 +simonsays +silvermo +silvergo +silver69 +silver22 +silvan +sigp229 +signs +signin +signatur +sigma2 +sight +sierra01 +siegheil +sicilian +sicher +si711ne +shumway +shrine +shrdlu +showoff +shortman +shortcake +shopping1 +shopmenu +shoots +shootist +shitt +shit1234 +shinning +shinjuku +shihan +shibuya +shianne +sherr +shergar +shelle +shel +shazza +shazia +shawty +shauns +sharinga +sharan +shaq34 +shann +shankly +shampoo1 +shambala +shaikh +shagg +shadrach +shabnam +sfgsfg +seymur +sexy21 +sexsites +sexsex1 +sexs +sexpics +sexforme +sexesexe +sex777 +sex4free +sex101 +severn +setting +servette +sergiu +sergey12 +sergeevich +serafina +sequence +septiembr +seniseviyor +semperfi1 +semperf +selhurst +segasega +seek +seeing +secreta +secret99 +seaver +seatleon +sean123 +sdh686drth +scurvy +scuba123 +scratch1 +scorpius +scope +scooter5 +science1 +schreibe +schokk +schnitzel +schlitz +scatter +scarpa +sazd +saxo +sawsaw +savings +savannah1 +saul +satyam +saturnin +sato +satisfy +sathya +sasuke1 +sasuk +sasitare +sasha2011 +sasha1993 +sasha13 +sasha111 +sasha007 +sarita2 +sargeant +saretta +saravana +saransk +sarakawa +sarahd +sarah7 +sarah13 +santas +santafe1 +sanremo +sanjos +sanguine +sanfrancisco +sanek123 +sandra11 +sandi1172 +sanderso +samuraix +samura +samuele +samsa +samogon +samina +samia +samcat +samba1 +samara63 +salter +salomo +salo +sallydog +saline +salamanc +sakura1 +sahtm080 +sahtm069 +sagittarius +saginaw +safronova +sadie2 +sabrosa +s9te949f +s1s2s3 +ryryry +rutherfo +rutabaga +rustic +russi +russel1 +rushhour +runrig +runner12 +rulesu +ruggiero +rugby2 +rufus2 +rufina +ruffin +rube +rubarb +rsturbo +rs2000 +royroy +roykeane +royjones +roxanne1 +rowboat +rounder +roskilde +rosi +roses1 +roseanne +rosalina +rosalba +roper +rooney10 +ronster +ronaldo99 +ronaldo123 +romance1 +roma2010 +roma1996 +roma1990 +rolyat +rolo +roleplay +roleguy +roflol +rodeos +rockster +rockstar1 +rocko1 +rockbottom +robust +robles +robinb +robertos +robert6 +robert19 +roads +rjvgjn +rjpkjdf +rjnjatq +rjhjdf777 +rjgtqrf +riverat +risky1 +risky +ripley1 +riorio +rinker1 +ringbuch +riki +riggins +riff +ricorico +rickshaw +richelle +richboy +richardo +richard8 +ricci +riccard +rhh8319 +rhbcnbyrf +rfybreks +rfrfitxrf +rfhvfyftd +rfhfdfy +reynald +reymysterio +revers +revenue +revell +retype +returns +retry123 +retraite +reston +resin +reserved +reptymrf +repooc +renrut +renown +renob +renfrew +renaldo +remmah +relaxweb +rejoice +reinhold +reiko +reglisse +regime +refinnej +redwoods +redsox99 +redsox3 +redsox24 +redsox12 +redsox01 +redskins1 +redrobin +redpoint +rednex +redial +redhed +redheart +redfield +redeyes +reddick +reddevils +reddead +redass +red789 +red1sox +rebon +rebellio +realsex +reality3 +realhard +reach +raven11 +raunchy +rauf123 +rattrap +ratliff +ratface +rate +ratcat +raptors1 +rapide +rangy +randle +rampart +ramon1 +ramman +ramin +ramble +rakkasan +raiser +raindog +raiders0 +raide +ragers +rafaela +radion +radial +radar123 +rada +qwsxza +qwertyuiop12345 +qwertyuiop12 +qwertys +qwerty555 +qwerty1992 +qwerty0 +qwedcxza +quincey +quiksilv +quicksand +queball +quasi +qualcomm +quadra +quackers +qsefthuko +qqqqqqw +qqq777 +qaz26101778 +q777777 +q4n2Jdeh +q1w2 +q1234q +q123456q +q123123 +pussy24 +pushistik +purple7 +purple3 +purgator +purdey +purcell +puppylov +punto +pundai +punany +pumice +pumas +puki +puissant +puffpuff +pucker +publius +psycho78 +psiholog +psa6400 +prune +prozak +proverka +proud +protozoa +protecti +prosser +pronin +promote3 +prokuror +prohor +progressive +progon +profiles +profil +problemas +probegt +privetik +prive +privates +priroda +priory +preserve +pratibha +pr1ncess +ppooii +pp00pp00 +powert +powerof3 +potters +potenza +potapova +positron +positano +posaune +portishead +porsche8 +porridge +porndog +popey +poot +poopster +poolboy +pookster +pook +poohead +poochie1 +pony76 +pontia +pomme +polyakova +polopo +polo123 +polly123 +pollon +polkpolk +politika +polis +policia +poli10 +pol123 +poirot +poesje +poepoe +poep +podonok +podarok +pmedic +plushka +plumpy +plumpers +plumb +pluck +plowboy +playlife +platonov +plains +pjkmabhz +pixels +pivopivo +pitpit +pisello +pippone +pippi +pipa +pino +pinkys +pinky2 +pingi3 +pineapple1 +pimpdady +pimp13 +pilsung +pillage +piledriv +pigglet +pigface +pies +picaso +picapica +picabo +pianino +physic +photoshop +photogra +phoeb +phipps +philemon +phil1234 +phigam +pharma +phantom3 +pfuflrf +pfqxtyjr +pfqwtd27121988 +pfhfnecnhf +peugeot406 +pets +petrik +petras +peterd +peter3 +perviz +peruan +peru +persist +permanent +permanen +peresvet +pepperon +pepper14 +pens66 +penile +penelop +pene +peluch +peligro +pelham +pelado +peiper +peeps +peeler +peanut11 +peachfuz +peaceman +peacemaker +payaso +paul99 +patino +passwordd +password88 +passtrader +pass3s +pass28 +pass1821 +pass13 +paspas +party01 +parliame +parkur +parker01 +parallel +papote +papirus +papier +papasha +papas +papa12 +paopao +panzer1 +pangolin +pandemonium +palmyra +palla +palani +palacios +palacio +pakistan1 +pajarito +paint1 +pagans +padron +padlock +padawan +packer4 +packages +ozzmosis +ozwald +ozoju7 +oxford1 +owen11 +ovaltine +outbound +ouachita +ou812a +ottokar +osmosis +oskar123 +ortho +organs +orestes +oregano +orange88 +orange6 +orange22 +orange10 +opusxx +operate +open12 +open1 +opal +oohrah +onspeed +onlygod +online12 +onizuka +onetwothree +onetwo3 +onestep +omega12 +olle +olivie +oliphant +olioli +olietjoc +olga1976 +olemiss1 +olegdivov +oldno7 +oldmans +oldboy +olaf +okaykk +oilcan +ohyes +october7 +oct2888 +obsessed +object +oaken +o1l2e3g4 +nursery +nunya +number8 +nulife +ntktgepbr +noviembr +novak +notrub +nothing0 +noser +norwegen +northpole +nopasaran +noob123 +nomadic +nolose +nollie +nokian82 +nokiae51 +nokia5610 +nobunaga +nobull +njqjnf +nitrate +ninth +nils +nikopol +nikonf5 +nikko1 +nikkin +nikegolf +nightshade +nightmare1 +nietzsche +niconico +nicolette +nicole3 +nicole123 +nicely +niccolo +nibiru +nhfycajhvth +nhfrnjhbcn +nhfkzkz +nfnmzyrf +neyland +newyork2 +newport2 +newpass2 +newmoney +newmexico +newmedia +newborn +netware1 +nether +net +nesterova +nerone +neron +nepbr2009 +nemiroff +nekrasova +negrita +negr +necron99 +nbvehrf +navisite +nautical +nautica1 +naumov +naumenko +natasha123 +natalie2 +nata1980 +nastya2010 +nastya1997 +nasa +naruto99 +narsil +narine +narf +narendra +nantucket +nantucke +nanner +namor +nadnerb +nadler +nabila +mystic1 +myst +myspace2 +mypuppy +myosin +myemail +mybaby1 +mybabe +mutate +mustkill +mustikka +music7 +murph1 +murmel +murciela +murasaki +muppet1 +mung +mundo +multisca +mukkula +muffin11 +mudpie +muadib +msoracle32re +msdasc +mrwhite +mrmike +mrcool +mrblue +mover +mountai +mouloud +motilda +mother01 +moth +mosias98 +morty +morte +mortars +morrisey +moroz +mornings +morello +morale +mora +mor_pass +mopar440 +moose23 +mooo +moons +moon69 +moon1234 +moolah +moocher +montse +montero1 +montblanc +monkeybutt +monkey14 +monk3y +monik +moni +moneysho +moneybags +money69 +money13 +monamona +molars +molar +mojo11 +mohamma +mogilny +moggie +moderator +modem1 +modaddy +mocelot +mocajo +mobile1 +moNDay2 +mmmmmmmmm +mko09ijn +mj2345 +mj1234 +mixmaster +miumiu +mitsou +mister2 +missydog +missions +minntwin +minin +minimax1 +minger +mines +mindspri +mindfuck +militar +milfhunter +mikie +mike88 +mike33 +mike1969 +mike19 +middleto +mickeys +mickael +michiga +michaelp +michaeljackson +michaelg +michael123 +micaela +micael +miatamx5 +mgmgmg +mexica +metlife +methanol +metaxa +metaphor +merrill1 +merlin2 +merdes +mercury2 +menow +menard +memem +member1 +melod +mello1 +melita +meiling +megan2 +megama +megabass +meetme +mecano +mdxpain +mdmgl004 +mcmaster +mayurs +mayumi +maxsam +maxmotives +maxmax1 +maxin +max1992 +max12345 +mauric +maudit +matthewd +matthew4 +matt23 +matt10 +matrixxx +matrixx +matrim +matelot +master666 +master32 +masson +massi +masser +masque +masonic +mashmash +masha2010 +marusy +marsala +marmeladka +marmaris +marmalad +markus1 +mariss +marimar +marillion +maria3 +margherita +marco123 +marche +march23 +march17 +march14 +marcelin +maranath +mantha +mantaray +manoj +manny24 +mankind1 +maniacs +manhole +mangus +mandog +mandalay +mandala +manchester1 +managers +mamour +mamou +mamiya +mamatata +mama777 +mama1970 +mama1961 +malo +malloy +malishi +mali +maksimov +maki +makena +makaron +makalu +maisuradze +maiso +mailman1 +mahoomar +mahmud +maha +magritte +magnum1 +magnoli +magmag +magik +magichat +maelstro +madruga2 +madlen +madi +maddog01 +madara +madalena +macys +macy +macondo +maclaren +mackmack +maccom +m1m2m3m4 +m1m2m3 +lzlzdfcz +lynyrd +lynnlynn +lvbnhbtdf +lutz +lupo +lunar2 +lumpkin +lullaby +luka +luisit +ludo +lucy123 +luckyy +luckystr +lucky4 +lucius +lucass +lucas12 +ltybc +lth1108 +loxpidr +lowers +lover123 +loveme12 +lovegirls +lovegame +loveall +love777321777 +love4 +love200 +lotto +loserkid +lorna1 +lorie +lords +loppol +lopotok01 +loopie +lookat +lonley +longtail +longford +longfell +longest +lomond +lolman +lollero +lokomoti +loklok +loki2496 +lohotron +logon +logoff +logjam +logan2 +lofton +locutus1 +lockedup +lloo999 +llewelly +lk9slwGh3x +ljcnfkb +lizar +liza2000 +livre +livia +liudmila +liten +lisica +lipps +lipid +lingam +linear +lindalou +lilcrowe +lilac +likesdick +lightman +lifted +lifeguard +lies +lidia +licku +lick69 +lichking +libertas +liane +lgkp500 +lfiflfif +lexx +lexusis +lexus11 +lexington +lexa +level1 +letmeout +letmeon +letmein123 +letizia +lespaul1 +leslie12 +lera2000 +lera123 +leonor +lennon1 +lenina +lemuel +lekmcbytz +legolego +leee +leather9 +leather1 +lealea +lbvekmrf +lazer1 +lawsons +lavern +lauretta +lauren12 +lastcall +lassiter +laser123 +lariat +laranja +laplace +lanlan +lanky +lanesra +landau +lamer1 +lambo +lakes +laid +laden +ladder1 +lachesis +lachen +labs +labrado +kyleregn +kursant +kurgn01 +kurama +kungsan +kukuruku +kukaracha +ktjynsq40147 +kss2773 +kriss +krazyk +kravitz +kravin +krauss +krasavchik +krakow +koukla +kotik +koston +koss +kornkid +kopa1994 +koolman +koolkool +kontiki +konovalova +konoplya +kondrat +kolomna +kokopell +kokaine +kobebrya +kobe6666 +knute +knopo4ka +knights1 +knick +kneecap +knee +kmdbwf +kman +klovn +kjkjkj +kizzie +kissmy +kishan +kiseleva +kirusha +kirsten1 +kirill1 +kippy +kippers +kingwood +kingring +kingkon +kindle +kimmi +kimber1 +killer9 +killer21 +killeen +kiley +kikowu +kickers +khmer +kfgecbr +keyblade +kewell +kevin7 +kessel +keroppi +keren +kentaro +kenseth +kenpo1 +kenneth2 +kennedy12 +kenichi +keneand +kemo +kemerovo +kelse +kelly5 +keepsake +keener +keefer +kebab +kearney +ke12fe13 +kazoo +kazman +kazakhstan +kaytee +kayle +kaylab +katuha +katinas +katemoss +katanga +katalina +kaspersky +kasi +kashyyyk +karupspc +karola +karol1 +karloff +karibu +kareta +karenw +karelia +kareena +karasik +kapriz +kantot +kankan +kanabis +kamina +kamilka +kamikazi +kamelot +kamakazi +kalpana +kalle123 +kalle1 +kaline +kalifornia +kalash +kalahari +kakaha +kaisar +kahlan +kafka1 +kabouter +k1k2k3 +jwest +justinb +justin2 +just4u +juni +junebug1 +june16 +july21 +july14 +july12 +julie123 +juke +jujujuju +juice5 +juanjuan +juanjo +jtmoney +jr1234 +journey1 +jourdan +joshua99 +joshua23 +joseph2 +joselon69 +joselit +jose123 +jordy +jordan9 +jordan10 +jonny123 +jonass +jollymon +jolien +jokerman +johnna +johnmc +johncen +john55 +john21 +john2 +johan1 +joeload +joe2000 +joe1 +jndthnrf +jkzjkz +jjohnson +jizzeater +jive +jitter +jitendra +jism +jimmyz +jimmypag +jimmy6 +jimmmy +jimkirk +jimbob1 +jilly +jiggles +jigaboo +jiffy +jhbufvb +jg3h4hfn +jettas +jett +jeter1 +jeter02 +jetboat +jesussaves +jesus4me +jessup +jessejames +jerry69 +jerkface +jeremias +jenna123 +jembut +jelway +jeffwsb1 +jeffrey4 +jeffgord +jeffers +jeffbeck +jeannett +jaykay +jayde +jaycob +jaxson +javier1 +jasonw +jasonlee +jasonj +jasonh +jasona +jason13 +jason01 +jasmine123 +jasjas +japan2 +janos +janin +janice1 +janeen +jammygirl +jamie2 +jamesy +jamesdea +james777 +james6 +james4 +james10 +jameel +jambos +jama +jake69 +jake13 +jaguarxj +jagr +jacobson +jacobb +jacksons +jackfrui +jackdaw +jack2 +jack13 +jabo +jabari +jaan +j1964 +ivycold +ivette +itsmylife +itsmee +italie +italia1 +issue +isisisis +ishard +isgod +isaacs +ironwood +irena +iraq +irairaa +ira123 +inventor +intrude +inter1908 +inna123 +inheat +indiana7 +inca +imjakie123 +imbue +imawesome +ilyas +iluvit +ilshat +illwill +illicit +illest +ilike69 +ilford +igor1994 +iforgoti +ifkfdf +idontcar +iddqdiddqd +iddqdd +ichiro51 +iceman11 +iceman01 +icebaby +ibelieve +iamsocool +iamme +iamking +iaminlove +iamawesome +i12345 +hyrule +hyperlit +hyman +hyderabad +hush +hurzhurz +huntin +hujhuj +hugues +hubris +hubertus +htrkfvf +htmlctl +hrothgar +hpesoj +hpSALGaY +howie1 +houra +hotty1 +hotstud +hotporn +hotness +hotcakes +hotboy1 +hotbitch +host +hoskins +hosiery +hosers +horse123 +hornys +hormone +horizon1 +hopping +hooks +honey12 +hondo17 +hondaa +honda200 +honda123 +holton +hollan +holeinone +holdon +holcomb +hogwild +hogans +hoffmann +hockey33 +hockey13 +hobson +hjvfyjd +hjpjxrf23062007 +hjpjxrf +hjlbntkb +hitme +hitman1 +hispanic +hindustan +hiller +hiker +hightide +hightech +hibernian +hhhhhhhhh +hhhh1 +heydude +hertz +herc +herbs +henry5 +henry12 +henrie +henr +henkie +helpme96 +hellokitt +hello1995 +hello11 +hellhoun +hedonism +heccrbq +heather9 +heather4 +heartles +heady +headroom +headhead +hawkwood +hasty +hassagjs +harumi +harrypotte +harold1 +harness +harish +harhar +hardy1 +hardhard +hardfuck +happylife +happyhap +happyguy +happy8 +happy6 +happy200 +happy11 +happy10 +hanswurst +hannah22 +hand2000 +halle +halfway +halberd +hal2001 +hakim +haider +haha12 +haguenau +hague +hackney +h1d2b3 +gznfxjr +gyozo +guybrush +guy123 +gurken +gurami +gunsnroses +gunsguns +gunne +gulfstre +guitarist +guitar69 +guitar11 +guesss +gtnheirf +gthtrfnbgjkt +gtgtgt +grunt999 +grump +groupie +groucho1 +groovin +groom +gromov +grocery +grocer +gripe +greggreg +greggg +greger +greg13 +greenwav +green420 +green15 +greekboy +great123 +graycat +grave1 +grappa +grandmas +grandam1 +grail +grafton +grafix +grace2 +gozo +goyanks +govikes +gothi +gospurs +gorillas +gorilla9 +goredsox +gordeeva +gorbunov +goran +goose5 +gooliner +google10 +goofy123 +goodstuff +goodnigh +goodlord +goodjob +goodfella +goodby +good4now +goobie +gonduras +gondola +gomes +golive +golfboy +golf50 +goldstei +goirish1 +goin +goherd +gohabs +goggle +goga +gofaster +godzill +godflesh +god666 +gobraves +goatmilk +go4itnow +gmac +gloomy +glock9 +globes +glenny +glasha +glasgow1 +gkfnjy +gjlcnfdf +gjgjdf +gjdtkbntkm +gizmoe +gitano +girish +gipsy +giotto +ginny1 +ginger01 +gimli +gillespi +gilgit +giampi +giallo +ghtpthdfnbd +ghoti +ghoster +ghjnbdjcnjzybt +ghjgfufylf +ghbcnfd +ghana +gfhjkm777 +gfhjkm666 +gfdkjd +gfcdjhl +getitnow +gershwin +gerryber +gerri1 +gericom +ger2man +georgio +george123 +gentleman +genesee +generati +gemgem +geiger +gefccga +gearsofwar +ge0rge +gdansk +gbkbuhbv +gayle +gayguy +gay +gaviota +gaura +gauhar +gateway9 +gateee +gasper +garvin +garchadas +garbo +ganibal +gangsters +gangster1 +gandalf7 +gammel +gamepro +gamefreak +gallup +galleon +galen +galan +gadfly +gabbana +fzr600 +fynjy +fylhttdyf +futbo +futball +furniture +furnitur +furelise +furby +funtime1 +funnyguy +fun +fukoff +fuct +fuckzoey +fucku1 +fuckthroat +fuckthemall +fuckstick +fuckstic +fuckoff666 +fuckmylife +fuckman +fuckintits +fucker12 +fubar69 +frugal +frozenfish +frost1996 +frontline +frogss +frogface +fried +freewin +freeuse +freesex1 +freemont +freeky +freeaccess +free12 +freder +fred28 +freakin +freakdog +frdfvfhby +frankzap +franky1 +franklyn +frankly +frankli +frank51 +francis2 +frack +foxmulde +foxes +foxdie +fox12345 +fourtrax +fostex +forzainter +fortran +fortknox +forsale +formel1 +form +forestman +forecast +fordgt +ford98 +forbidden +footloos +foolish1 +foofer +foods +folders +foamy +floods +floger +fliege +fletch1 +fleck +flattop +flatron1 +flatboat +flash5 +flanker7 +flagpole +fktrcttd +fktrcfylth +fktif6115 +fjysk762 +fixxxer +fixitman +fivekids +fitzroy +fitness1 +fishfry +fishey +fishead +fish22 +fish12 +firewate +firewalk +firetrap +fires +firehouse +firedawg +fire123 +fire12 +firdaus +finlay +financia +fillmeup +file4 +fights +fight1 +fifty5 +fidofido +fiction9 +fickdich +fianna +fgtkmcbyrf +fgjkbyfhbz +fghghgh +ferre +ferrarif +ferrari4 +fermi +ferien12 +feller +felix2 +felicita +feeney +fedotov +federer +feast +fdnjvfn +fdcnhfkbz +faustino +faulty +fatbo +fastfun +farzana +farme +farina +farber +fantazy +fantasy8 +fannies +fanclub +falloutboy +falcon3 +falcon04 +faithy +faiths +fafyfcbq +faces +facelift +f67342 +f1f2f3f4 +f14tomcat +ezra +eyesonly +exxon +extra330 +exciter +ewqewqewq +ewqewq +ewq123 +evilevil +ever +evamaria +ev7000 +eusebio +europ +euroline +ethiopia +ethics +ether +ethan123 +estoppel +estefania +espinoza +espagne +esmith +escort1 +escola +ertyui +ershov +errata +eroica +ernes +epson1 +epatb1 +entre +entering +enigma2 +enfuego +energy12 +energy1 +energia +emmarose +emma123 +emirates +emilyann +embalm +elway07 +elvis99 +elric1 +elmwood +ellwood +elke +eliezer +elevatio +elephant1 +elenor +elena2010 +elena1971 +elemen +electronics +eldora +eldon +eldest +elayne +elates_y +elastic +elantra +elaina +ekimekim +eintritt +ehidkbd +egor123 +edit +eddings +eddie3 +ecwecw +ecurb +economy +economia +eckerd +ebonee +eatpie +eaton +eatadick +eastern1 +earnhart +eagles22 +eagles2 +eagle21 +e6pz84qfCJ +e12345 +dynamics +duval +dusted +durex +durdom +duramax +duplex +dundas +duffie +duetto +dudley1 +duder +dude22 +duckpond +ducati1 +dtrain +dsobwick +dsnine +drumming +drumme +druhay17 +droop +drones +drills +dressing +dresser +dreamteam +dreams1 +dreamer2 +dreadful +drdre +drdeath +dranreb +dragonman +dragonforce +dragon44 +dragon05 +dracos +dozzer +doubt +doublej +dotson +dotnet +dorkboy +domodomo +dominik1 +dolphin6 +dolby +doh111 +dognuts +dogmatic +doghead +doggy2 +doggod +dogggy +dogdogdog +doesit +dodobird +docter +doc_0815 +dmarink +djkrjd +djg4bb4b +djfpass +djeter +divine2 +divine1 +ditty +dispute +display +dirtywhore +dirtycunt +dipascuc +dinodog +dinochka +dinky1 +dimka +dimidrol +dima3452 +digi +differen +dietmar +diebitch +dictator +dickster +dianochka +diamondp +diamondb +diamond9 +diamand +diabolik +dfymrf +dfrgui +dfktyrb +dfkmltvfh +dfhtybr +dfgdfg +dewdew +dewars +devries +deviate +devante +dessar +despina +desdemon +derty +dert +derfla +derelict +dentista +dennie +denn +denis1984 +demonik +deltafor +delta88 +delta3 +delong +delila +delights +delfino +dejesus +deivis +deering +deepika +deeann +dee123 +decoy +decoder +decision +december1 +decay +debi +debbi +debaser +death13 +deadsoul +dctvgbplf +dctdjkjl +dclxvi +dbm123dm +dazzler +dawnie +david99 +david9 +david10 +dass +darwin1 +darvin +darkseed +darkmage +darkie +darkfire +darkdark +daria +danziger +dantheman123 +danniash +daniel69 +daniel5 +daniel26 +daniel10 +danechka +damp +damirka +damdam +daman1 +dalton1 +dalto +dale38 +dale33 +dakotas +dakotah +dakary +daisy3112 +daisies +daishi +dailey +daidai +dago +daddysgirl +dadd +dabl1125 +dabear +cvbnm +cvbcvb +cuteako +cushion +currency +cupcakes +cunthole +cumboy +cucciol +csyekmrf +cscomp +cruzan +crust +cruising +crown1 +crossman +crosby87 +crm0624 +crazyc +crazy2 +craxxxs +crate +cranberry +craigs +cowboys8 +cowboys0 +cousteau +cousins +countryb +countess +couger +couga +corrupt +correa +corpus +corporat +coroner +corone +corkie +corcoran +coppe +cool23 +cool22 +cooky +cookie11 +cooke +constanta +conroy +connors +connex +conej +concise +concern +compatible +communic +commercial +cometa +column +colts18 +colins +colegiata +cole12 +coldgin +cochino +cobra99 +cobra777 +cobra69 +cntgfyjd +cnfhsq +cnfc35762209 +clubmed +clubbing +cloud69 +cloak +clk320 +clipper1 +clermont +cleaners +clave +clausen +clause +claudiu +clansman +ckflrbq +ckfdrf +cjxb2014 +cjkytxyfz +civic97 +cium +cipolla +cincy +cincin +ciara +chunks +chuckd +chuck2 +chrisbl +chris8 +chris77 +chris26 +chris24 +chris198 +chris100 +choppe +choirboy +chodu +chloes +chivas1 +chispa +chipotle +chinky +chinga +chinaski +chimaira +chills +chikara +chika +chieftai +chief2 +chidori +chicho +chicago23 +chica1 +chez +chevy11 +chevette +chester9 +chem +chello +cheezy +cheeser +cheeseca +cheeseburger +chech +cheburek +cheaters +chauncy +chases +chaser1 +charless +charles4 +charisse +chantal1 +channel1 +chandle +champo +cfymrf +cfvfzrhfcbdfz +cft6yhn +cexfhf +cessna1 +cesare5 +certclas +celtic33 +celt29 +ceilidh +cdjkjxb +cdgirls +cdbymz +cccdemo +ccccccccc +cbreeze +cbljhtyrj +cavid +cataract +castell +casta +casper13 +caseyboy +cascas +casbah +carwash1 +carter80 +carrick +carpe +carokann +carlos6 +carino +cardman +carbon14 +car12345 +capulet +capucine +canno +canis +cancun09 +canario +canada99 +canada12 +camus1 +cammy +cammer +camilla1 +camilit +cameroon +cameron2 +cameron0 +camaro2 +calipso +calif +calida +calgary1 +caleb123 +caladan +cadmus +cadenza +cade +cabot +cabins +cabeza +cabbages +c00per +byyjrtynbq +byers +bydand +bwana +bvncnbnvvbn +butttt +buttock +butterbe +butter11 +butkis +bushwack +bushmaster +bushka +burritos +burrito1 +burrell +burp +burned +burmese +burlsink +burlpony +burgos +burford +bunter +bunia3 +bundao +bumfuck +bullshit1 +bulldozer +bulldoze +bulldogs1 +bulldog3 +bullbull +bullard +bulbs +buicks +buggie +buffy44 +budz +buck13 +bubblebox +bubbaman +bubba99 +bubba8 +bryony +bryana +bryan2 +brune +bruiser1 +bruise +bruce69 +brown123 +broward +brothel +bronwyn +brockton +britne +bringiton +briano +brenda69 +breizh +break1 +bravo7 +bravada +brannon +brandy69 +brandy2 +brandy12 +brandon7 +brandon5 +bradle +bradbury +br1ttany +boy1cool23 +boxsters +bowling3 +bowl36 +bowbow +bouboune +bother +botbot +boston11 +bore +booyeah +boots123 +boopboop +boop4 +boomba +booking +bookbook +boogle +boogi +boogey +boogers1 +boodles +boodie +boobies2 +boobear1 +bonkers1 +bongtoke +boney +bondone +bonafont +bombs +bomberman +bollen +boilerma +boggy +boffin +boeing1 +bocman +bobsmith +bobob +bobo1 +bobjones +bobbyj +bobbobbob +bobbobbo +bobbob1 +boating1 +bmwk75s +bmw740 +bluntman +blunt1 +blume +blueskie +bluelight +blueeye +bluedot +blueboys +bluebook +blue72 +blue20 +blue16 +blowjob69 +blofeld +blockbus +bleh +bldass +blcktrn +blazing +blarg +blah1234 +blah12 +blackwid +blackheart +blackhea +blacke +blackdragon +blackdra +black11 +bkmyeh +bixler +bitwise +bismilah +birthday36 +birdbath +biolog +binford +billy69 +billionaire +billards +bill2455 +bill063 +bigtim +bigtex +bigslick +bigsam +bigpimpn +bigo +bigmac1 +bigelow +bigdik +bigbull +bigbug +bigbud +bigbri +bigbird1 +bigapple +bicycles +bible1 +biabia +bhatti +beyblade +bettyp +beth69 +beta1 +bertone +bertbert +berrie +berni +bernadette +bermuda1 +beotch +benz12 +benner +bendix +bemine +belveder +beloved1 +bellum +bellini +belinda1 +belfour +beegees +bedas1 +bebop1 +beaversx +beatrix +beatles6 +beastman +beasties +beast123 +beagle1 +beadle +bdfyjdbx +bbwlover +bbb111 +bayonne +bayley +bayard +bathgate +batfink +batcat +baster +bass11 +baske +bashar +barrier +barrabas +barnhart +barbarossa +barbaro +barata +baobao +banzay +bantik +banjoman +bangme +bangbros +bananana +bambina +balou +ballzz +balloon1 +ball123 +balerina +balaton +balana +balaji +baker3 +bailey99 +bailey01 +baggy +baggio10 +badmofo +badboyz +backyard +backspin +backdraf +babylon1 +babe1987 +babalola +babaji +baba123 +azul +azreal +azores +azerbaijan +az09az09 +axaxax +awesome2 +awesome123 +avtomat +avogadro +avenged +avdeev +auguste +august30 +august24 +august20 +august17 +auger +audra +audia +atljhjdf +atlanti +atalanta +astronom +astronaut +astra334566 +asteria +assmonke +asshole5 +assfucker +assass1 +assasins +assaassa +ashole +ashley123 +ashley10 +ashlea +ashe +ashcroft +ashburn +ashat +asha +asem +asdzx +asdfgh123456 +asdfg1234 +asdf0987 +ascent +asante +asa123 +as5ffz17i +arxangel +artic +artful +artemartem +artefact +artanis +arson +arsenal9 +arriba +argus +arenda +ardennes +araujo +aramat +aram +aquatic +aquariu +aqaqaq +april27 +april16 +april15 +applejui +apple11 +apos +apollo17 +apollo12 +aolsux +anxiety +anupama +antona +antoin +anto +anthony9 +ansel +annina +annapoli +anna2002 +anna12345 +anka +anitas +anicka +angus123 +angel8 +angel18 +angel007 +andrews1 +andrew69 +andrei1 +andrea99 +andrea12 +andand +anastacia +anarchy1 +anakin1 +anahit +amoremi +amman +amitech +amira +amigas +amicus +amex +ameritec +amerik +amdamd +ambulance +amazing1 +amarant +amanda96 +amanda123 +am56789 +alumni +alto +altera +alon +aloevera +almonds +almeida +allycat +allofit +alli +allana +allah786 +all4u9 +alkanaft123 +aliona +aline +alina2011 +alina2010 +alina1998 +alina1994 +alina12 +aliev +alic +algore +algerie +alex86 +alex26 +alex1985 +alex1976 +alex111 +alena1 +aldrich +aldavis +alastor +al1916w +al1916 +al1716 +aksjdlasdakj89879 +aksana +akmaral +akinom +akimova +akimov +akademia +ajtgjm +ajaxajax +ajajaj +aishwarya +airlines +aikman08 +aiden +ahjkjdf +ahahah +ahab +agusti +agusta +agree +agnostic +afynjvfc +afhvfwtdn +affirm +aeroplane +adv0927 +adumas +adriano23 +adore +adobe +admirer +admira +admins +adman +adept +addidas +adder +adapter +adam01 +actuary +acts238 +acolyte +ace111 +access01 +acca3344 +absalom +above +abner +abc123A +abby12 +abadan +a789456123 +a2a2a2 +a1s2d3f +a159753 +a1234a +a1111111 +ZwT2sBzL +Zildjian +ZAQ12WSX +ZACHARY +Wwwwww1 +Wolves1 +Willie +Wildcat1 +Wanker +WMINet +Vvvvvv1 +Voodoo1 +ViewSonic +Vfitymrf +Vf279sm +VRe2nC3Z +VANESSA +Uuuuuu1 +Ussy1 +Ultimate +Turbo1 +Tr2Amp25 +Tina +TheSpot +Thanatos +Tarheels +TITS +Super1 +Sunshin1 +Summer +Strosek +Stewart1 +Stephanie +Stephan +Springer +Spartan1 +Sony678 +Socrates +Snoopy1 +Slave1 +Skipper +Sirius +Sergei +Seattle1 +Seamus +Sauron +Saturn +Sascha +Sandy +Sandra1 +Sandman +SYSTEM +STERLING +STAR +SMITTY +SHERRY +SHELBY +SEXX +SEVEN +SAVAGE +Rustam +Rules1 +Rjycnfynby +Redwing1 +Randy +Raider1 +RUSLAN +ROOSTER +RONNIE +RENEGADE +Queen1 +QcxdW8RY +QWEasdZXC +Q12345 +Psycho1 +Prince1 +Presario +Ppppppp1 +Pookie1 +Pm209mt +Pirate +Pillow1 +Performing +Patton +Password2 +Passw0r +Passion +Pass +Pandora +Paladin1 +PRECIOUS +PPj22WE +PMTGJnbL +PLAYTIME +PITBULL +PATCHES +Oooooo1 +OICU812 +Nnnnnn1 +Nikey63 +Nihao123 +Nicola +NewYork +NewYear +NetworkingPe +Nature +NIRVANA +NICK1234-rem936 +NCC1701E +Muskrat +Mother1 +Morris +Monica1 +Money +Mobil1 +Mick +Memphis +Mayhem +Maurice +Mason1 +Mariners +Manuela +Manager1 +MONDAY +MISTY +MEMEME +Loading +Linda1 +Lincoln1 +LetMeIn +LbnJGTMP +Laura1 +Lancelot +Lakota +LUCKY +LOVEYOU +LONEWOLF +LIVERPOOL +LEONARDO +LEGACY +LARRY +Kleopatra +Kirsten +King1 +Kaiser +KRISTINA +KITTY +JwHw6N1742 +Jones +Jerry +Jeremiah +January +Jamie1 +Jackass +JOJO +JIGGY +JESSIE +JAKE +Istanbul +Island +Infalicall +Hyperion +Hp189dn +Hollywood +Hollywoo +Henrik +Hendrix +Hawkeye1 +Hard1 +HackAren +HZgG9umC +HOWARD +HERCULES +HARRISON +Gregor +Greg +Golf +Gizmo +Gfhjkm1 +Garcia +GLORIA +GENIUS +GANDALF +Fuck +Forever1 +Ford1 +Flower +Felix1 +Extreme +Empire +Emili +EVERTON +E2Fq7fZj +Duke +Drizzt +Directory +Dick +Devil666 +Deepwate +Deborah +Daytona +Davis +Darkstar +Daniela +Daddy1 +DICKHEAD +Curtis +Cristina +Cool1 +Consumer +Compaq1 +Columbia +Claire1 +Christopher +Christi1 +Chloe1 +Cherokee +Charley +Celtic1 +Celtic +Casey1 +Cartman +CORPerfMonSy +CONNIE +CLASSIC +CINEMAX +CHUCK +CHRIST +CAROLE +Bunny1 +Bulls1 +Buckeye +Brendan +Bradford +Boys +Boogie +Bonnie1 +Bogdan +Birthday +Billy1 +Bernie +Bernard1 +Bernard +Bennett +Bella +Beethove +Beatrice +Beatles1 +Bandit1 +BUTTERFL +BUTLER +BUTCH +BERNARD +BENJAMIN +BARBIE +BANANA +BADGER +BABY +Autopas1 +Aurora +Asshole +Apple1 +Annika +Angelica +Amsterda +Amber +Amadeus +Alice +Alexand1 +Alex8899 +Alex1234 +Albuquerq +Adult1 +Admin1 +Adidas +Aaron1 +AaAa1122 +Aa123123 +AMERICAN +ALISON +9Hotpoin +99strenght +99669966 +9953RB +9871 +985632 +98256518 +96328i +96206 +9598 +951623 +9512369 +9347167 +929370913 +9222 +911rsr +9104587 +9103 +90609 +901234 +9007 +9001668 +9001 +8seconds +89semtsriuty +8998 +899445527 +89614774181 +8937 +89132664230 +89063032220m +8869 +8863 +87654321vv +8756 +872rlcfo +8616 +8555 +8522003 +852000 +84878487 +8487 +8428ld +826248s +8255 +8231 +8228 +813813 +8090 +7somba +7samurai +7elephant +7988 +79797979 +78978978 +78951236 +789451 +78791 +7854 +7823 +7773 +7772 +776677 +7766 +7762 +774477 +773400 +7715 +770905 +7707 +76ers +7654321a +7654 +75757575 +7503 +744637 +7424 +741776 +741741741 +7417 +7414 +7369 +7295 +7266 +725725 +7256 +72305z +7223 +7140 +7123 +7114 +7099474 +69stang +69chevy +6974 +696977 +691111 +690069 +6891 +6886 +6811 +67chevy +67975502 +67899876 +67896789 +6776 +6711 +668899 +66776677 +667667 +6668 +66667777 +6665 +666123 +6657684 +6656 +6628 +6622 +6596 +6574 +6555 +6554 +6541 +6537 +6510 +6469 +6351 +6336 +62826282 +62336233 +6198 +6165 +61386138 +612345 +6121 +6105 +600600 +5daxb +5ThGBQI +59635963 +5958 +5811 +5712 +5665 +5663 +565758 +5634 +5631 +56259090 +5575 +5557940 +5557 +5551 +5546 +554466 +5523 +5522 +54gv768 +5481 +5476 +5466 +54645464 +5455555 +54335433 +542678 +540540 +5393 +53755375 +5362 +5345321aa +5340 +5270 +526549 +5256 +524524 +5239 +523252 +5228 +5189 +5188 +51501984 +5124 +5120 +510510 +5101 +5067 +5051 +5012 +4teens +4peace +4973 +4855 +4852 +4824 +4815162342q +4800 +4782 +4755 +4707570 +4665 +4633 +4579 +4531 +4522 +451451 +45123 +44mag +4489 +4479 +44774477 +446688 +4456 +4432 +4332 +4328 +432100 +4293 +4274 +4258195 +4256 +4252 +423956 +4236 +420842084208555 +4205 +42014201 +42004200 +4166 +4158 +415415 +41513042 +4132 +4130 +4116 +400000 +3times +3kings +3bears +3968 +396396 +3900 +3836 +3731 +3727 +3662 +360moden +3588 +35783578 +351351 +3478 +3462 +34567890 +3455 +3454 +3447 +343536 +3433 +340340 +3399 +3387 +3373 +33669 +3365 +3362 +3345 +333555777 +33351962 +333333q +3325 +3317 +33143314 +32823282 +32566842 +3251 +3250 +3246 +324324 +3240 +321671 +3216 +3214789 +3202 +3171 +3125 +31233123 +31133113 +311298 +311276 +311275 +311272 +311200 +311071 +31101971 +310898 +310864 +31081964 +31081960 +310799 +310796 +310774 +310771 +31058 +310572 +310569 +310565 +31051969 +31051964 +31051958 +310372 +310369 +31031968 +310173 +31011964 +30astic29 +3078 +3051 +3037 +3031 +3028 +3020 +301301 +30123012 +30121968 +30121966 +30121964 +30111969 +30111968 +30111963 +30111959 +301097 +30102000 +30101957 +301000 +30092000 +30091998 +300876 +300874 +300871 +300867 +30081962 +30071967 +30071960 +30071959 +300669 +300666 +30061963 +30061962 +300573 +300568 +300564 +30051971 +300497 +300495 +300472 +30041998 +300367 +300364 +300361 +30032000 +30031999 +30031962 +300193 +300181 +30012001 +30011962 +30011956 +2wsxxsw2 +2wsx4rfv +2times +2short +2letmein +2children +2992 +291278 +291274 +29121961 +291194 +291180 +291170 +29111957 +291069 +29101999 +29101968 +29101967 +29101960 +290968 +290966 +29091967 +29091965 +29091963 +29091959 +29091954 +290894 +29081968 +29081966 +29081965 +290791 +290771 +290764 +29071998 +29068 +290673 +29062001 +29061961 +29061958 +29061956 +290596 +290566 +29052002 +29048 +29041964 +290396 +29032001 +29032000 +29031999 +29024 +29021964 +290166 +29011968 +29011965 +2886 +28642864 +2864 +286286 +2854 +2820 +281990 +281296 +281295 +28128 +281272 +281260 +28121998 +28121965 +28121957 +281196 +281193 +281170 +28112001 +28112000 +28111998 +28111965 +281096 +280973 +280970 +28092000 +28091998 +280894 +280871 +280858 +28081969 +28071962 +28071959 +280676 +280664 +28061999 +28061997 +280559 +28051964 +280456 +280367 +28031963 +280293 +280273 +28021999 +28021969 +28021965 +28021963 +280198 +280179 +280168 +28011959 +280102 +27912791 +2773 +2754 +2749 +2739 +2733 +2713 +271272 +27121998 +27121965 +27121962 +27111968 +27111956 +27111955 +271072 +271062 +27102010 +27101964 +27101963 +270975 +270971 +270969 +270877 +27081965 +27081963 +270766 +27071954 +270695 +270692 +27061998 +27061971 +27061965 +270597 +270561 +27051969 +27051965 +27051962 +270471 +27042000 +27041963 +270398 +270372 +270361 +27032000 +27031961 +270276 +27021968 +270197 +27011966 +27011960 +2672 +266643 +26532653 +2621 +261988 +261979 +2615 +26132613 +261296 +261295 +26128 +261275 +261172 +261092 +261075 +261072 +261070 +261065 +26101961 +26101959 +26101958 +260980 +260969 +26092000 +26091999 +26091965 +26091954 +260873 +260869 +260797 +26071961 +26071958 +260677 +26061965 +260595 +260576 +260571 +260561 +26041965 +26041964 +260378 +260368 +26031969 +26031956 +260268 +26021967 +260196 +260173 +260166 +258012 +25800 +2563 +2555 +2542 +2535 +2518 +251298 +251266 +25122002 +25121968 +25121965 +25111963 +251072 +25101999 +250998 +250974 +250966 +25092000 +25091965 +25091964 +250874 +250868 +25081967 +25071967 +25071966 +250695 +250678 +250624 +25062000 +25061961 +250568 +250561 +25052000 +25051999 +2505198 +25051968 +25051954 +250497 +250465 +25041998 +25041962 +25041961 +250376 +250372 +250369 +250365 +250364 +250297 +250272 +25021963 +25021959 +250161 +25011999 +25011969 +25011967 +24gordon +2487 +248624 +2479 +2473 +2463 +246011 +2460 +2457 +2439 +24252425 +241974 +2419 +2418 +2415 +24132413 +241297 +241295 +241294 +241268 +24121962 +241197 +241195 +241175 +241172 +241163 +241096 +241069 +241062 +24101963 +24101961 +24101960 +24101954 +240974 +240971 +240969 +24091967 +24091966 +24091965 +240867 +24081998 +2408198 +24081968 +24081967 +24081964 +240798 +24072001 +24071999 +24071965 +240695 +240693 +240676 +240673 +240659 +24061965 +240596 +24052000 +240473 +240470 +24041968 +240393 +240374 +240368 +24031966 +24031962 +24031958 +240271 +24021967 +240175 +240168 +24012002 +24011961 +2376 +23692369 +2365 +235555 +23542354 +2353 +23522352 +2348 +2347172123 +2344 +23412341 +2334 +233307 +2330 +2323232 +232222 +23212321 +2320 +231991 +23122000 +23121999 +231193 +231171 +231168 +231163 +231075 +23101964 +23101962 +23101956 +230969 +23091962 +23082000 +230775 +23072000 +23071967 +230696 +23062000 +23061956 +230569 +230498 +23048 +230473 +230466 +23041998 +23041965 +23032000 +23031997 +23031959 +23027 +230264 +23011968 +22tango +2296 +2290 +22772277 +2276 +2260 +224224 +22412241 +22352235 +222222a +221995 +221986 +221984 +221983 +221298 +221273 +221271 +221262 +22121963 +22121960 +221163 +221133z +22111997 +221101 +22108 +221073 +221062 +22101963 +22101959 +220970 +220963 +22091963 +22091962 +220897 +220875 +220870 +220869 +220861 +22081963 +22081960 +220773 +220771 +22071998 +22071967 +22071964 +220698 +220695 +22061968 +220572 +220570 +220566 +22052205 +22052001 +22052000 +22051999 +22047 +22041962 +220398 +220396 +220369 +22032001 +22031965 +22031959 +22031958 +220275 +220270 +22022002 +22021999 +22021960 +22021958 +220165 +22012000 +22011968 +2195 +2193 +2186 +2164 +2155 +2143658709 +2143 +2139 +2137 +213456 +21142114 +211299 +211295 +211280 +21122000 +21121970 +21121962 +211195 +211164 +21111997 +21111966 +21111959 +21111957 +211065 +21102000 +21101967 +21101964 +210974 +210972 +210971 +210968 +21091961 +210870 +210869 +210776 +210772 +21071961 +210697 +210667 +21062106 +21062000 +21061958 +21058 +210561 +21052000 +21051965 +21051964 +21051956 +21051955 +210497 +210473 +210468 +210467 +21041999 +210368 +210367 +21032000 +21031999 +21031964 +210297 +210274 +210199 +210197 +210174 +210172 +210169 +210164 +21012001 +21011963 +21011961 +21011956 +21002100 +2099 +2086 +2079 +2069 +205gti +2053 +2048 +20462046 +2042 +2020202 +2019 +2018 +2012qw +201298 +201271 +20121967 +20121966 +20111999 +20111967 +20111961 +20111951 +201094 +201066 +2010201 +20101970 +200970 +200969 +2009200 +20091999 +2008m2009 +200897 +200874 +200870 +20082010 +2008200 +20081965 +200800 +20071967 +200696 +20068 +200675 +200669 +20061966 +200569 +20051967 +200498 +200470 +20041969 +20041960 +20038 +200363 +200300 +200276 +200269 +200268 +20022009 +20022008 +20021999 +20021959 +200199 +200177 +200171 +20011964 +2000jeep +1world +1rus27540102 +1qwerty7 +1qwerty2 +1qazxs +1power +1nstant +1loveyou +1faith +1byday +1bigdog +1Ussy +1Ttttt +1Tigers +1Therock +1Steve +1Startre +1Speedy +1Sophie +1Smith +1Sluts +1Rock +1Rainbow +1Prince +1Ppppp +1Pookie +1Mercede +1Maveric +1Marvin +1Maddog +1Junior +1Johnson +1Jjjjjj +1Jackie +1Hardon +1Hardcor +1Golden +1Giants +1Ggggggg +1Explore +1Eagles +1Dolphin +1Dakota +1Cherry +1Charles +1Carlos +1Brian +1Bastard +1Barney +1Balls +1Autopas +1Apple +1Angela +199812 +199624 +199610 +199523 +199520 +199508 +199500 +199414 +199404 +199393 +19932008 +199308 +1992199 +199219 +199218 +199011 +199003 +19891959 +198826 +198818 +198810 +19880502 +198724 +198722 +198702 +1986mets +198623 +19861988 +198603 +198521 +198424 +19841989 +19831987 +1983198 +198305 +198202 +198123 +198121 +198100 +198024 +198022 +19801984 +198004 +19788791 +197521 +197506 +1967gto +196419 +195959 +195 +19401940 +193570356033 +19251925 +19231923 +191985 +191984 +19191 +19161916 +191294 +191273 +19121971 +19121965 +19121964 +19111999 +191094 +191072 +19101997 +19101964 +19101963 +19101962 +190996 +190995 +190993 +190978 +19091966 +19091953 +19091909 +190883 +190882 +19081960 +19081958 +190795 +190780 +190779 +190778 +19071965 +19071960 +19062000 +19061963 +19052000 +19051959 +190475 +19041968 +19041904 +190391 +190388 +190378 +190368 +190293 +190290 +190278 +190276 +19021969 +190195 +190184 +190178 +19012000 +19011999 +19011966 +19011965 +19011957 +19011956 +18n28n24a +188118 +18791879 +187420 +1874 +1864 +183729 +1830 +18121997 +18121964 +18121958 +181197 +181175 +18112003 +18111997 +181098 +181074 +18102002 +18101970 +18101964 +180977 +18091967 +18091959 +180873 +180863 +180769 +18071962 +18071954 +18068 +18062000 +18061966 +180568 +18051997 +18051963 +18051960 +180469 +18041960 +180368 +180361 +180357 +18031968 +18031967 +18031956 +180263 +18022000 +18021999 +18021958 +180176 +180169 +18011967 +18011965 +17831783 +1766734 +1764 +1763 +1742 +171980 +171274 +171266 +171265 +171176 +17111999 +17111998 +17111711 +171093 +17102000 +17101999 +17101964 +170997 +170974 +17091964 +17091962 +17091957 +17091956 +170899 +170898 +170773 +17071998 +17071967 +17071963 +170696 +17061999 +17061968 +170597 +170574 +170569 +17052001 +17051961 +17051956 +170470 +17041966 +170360 +17031958 +17031956 +170274 +17021971 +170197 +170176 +170168 +170164 +16fretb +1668 +1667 +1654 +1636 +1634 +1622 +161295 +161292 +161269 +16121963 +16121612 +16111966 +16111964 +16111963 +161073 +161070 +16101960 +160973 +16091969 +160897 +160871 +16081970 +160795 +160777 +160772 +160761 +16072000 +16071966 +160695 +16061999 +160593 +160592 +160576 +160570 +16051962 +160499 +160498 +160475 +160459 +16041955 +160397 +160396 +16031957 +16031956 +160275 +160273 +16021963 +160168 +160165 +160164 +16012002 +16011964 +159630 +15935746 +1587 +1583 +1579 +15531553 +1545 +153246 +152geczn +15241524 +1520 +151994 +151985 +151272 +151173 +151164 +15111999 +15111967 +15111958 +15111957 +150998 +150997 +150972 +15092007 +15092001 +15091963 +15091956 +150859 +15082008 +15081963 +15081959 +15081508 +150798 +15071997 +15071966 +15071961 +15071958 +150676 +150670 +15052000 +15051955 +15049 +150469 +150467 +15041504 +15032001 +15031968 +15031965 +150295 +150274 +150273 +150271 +150266 +150262 +15021999 +150169 +150167 +14ss88 +1499 +149200 +1491 +1490 +1489 +147963258 +1478523 +147000 +1463 +1451 +14411441 +1436 +143333 +14314314 +14241424 +14221422 +141980 +141261 +14121997 +14121968 +14121959 +14121412 +141194 +141193 +14118 +141160 +14101967 +14101958 +140999 +140965 +140963 +14091961 +140893 +140873 +14081959 +140796 +140767 +14071963 +14071950 +14061964 +14061962 +14061959 +140594 +14058 +140571 +140495 +140469 +140468 +14041964 +14038 +140357 +14031999 +14031963 +14031958 +14031403 +140298 +140274 +14022006 +140209 +140207 +140200 +140172 +140169 +14001400 +1396 +1394 +1392 +13854 +1383 +13795 +13751375 +1371280 +136611gt +1363 +1360 +135798 +13571113 +13561356 +1338 +1332 +132613 +13245 +1318 +131295 +13128 +131273 +131269 +131268 +131199 +131197 +131173 +131169 +13111962 +13111959 +131060 +131058 +13102001 +13101973 +13101967 +13098 +130979 +130962 +13092001 +13091962 +130867 +130866 +13081956 +13081955 +130768 +13072001 +13071965 +130698 +130671 +130669 +130664 +130659 +13062002 +13061999 +13061964 +13061962 +13061958 +130597 +13058 +130573 +130571 +130569 +130568 +13051960 +13051959 +130470 +130468 +13041958 +13041304 +130396 +130394 +130372 +13032001 +13032000 +13031955 +13021967 +130167 +130163 +130130 +13011969 +13011966 +13011965 +13011301 +12q34w56e +12inch +129834 +12981298 +129129 +12771277 +127266 +12601196 +125896 +123vv123 +123qwerty123 +123qwaszx +123qwa +123mmm +123llll +123joker +123asdf +123abv +1239056 +1239 +12378945 +123654789a +123637 +123569 +123546 +1234vfvf +1234aa +12345u +12345ss +12345qwert7 +12345p +12345o +1234567i +123456789zz +1234567890v +1234567890d +12345672000 +12345656 +123456321 +123451234512345 +12341231 +123321i +123321d +123321aa +123258789 +123234345 +12323 +1231233 +1231231234 +12309 +123077 +12271227 +122574 +122555 +122473 +1223456 +122083 +121998 +121995 +121981 +121976 +121965 +121964 +121960 +12196 +121894 +121663 +121580 +121473 +121260 +121244 +121221 +12122012 +12121952 +12121947 +121212z +121211 +121167 +12112001 +12112000 +12107 +12101967 +12101958 +12101492 +120972 +12091965 +120869 +12081959 +120796 +120769 +120768 +12071964 +12071941 +120700 +12061965 +12052003 +12041964 +120397 +120359 +12031962 +120297 +120293 +120275 +120268 +120267 +12022001 +12022000 +120198 +12011959 +12011201 +11jack +11991199 +118811 +11501150 +11411141 +113411 +11271127 +112364 +11234567 +1122qqww +112280 +112233qq +11223344a +112121 +112099 +111zzzzz +111975 +111970 +111961 +111769 +111222a +1112223 +11122001 +11117777 +111162 +11112011 +111111w +11111112 +111103 +111073 +11101968 +110973 +110970 +11097 +11091997 +11091966 +11091965 +110896 +110865 +110863 +110861 +110854 +11082000 +11081964 +11081957 +110794 +110773 +11077 +110766 +110760 +11071966 +11071962 +11068 +110571 +11051999 +11051969 +11051105 +110497 +11048 +11042000 +11041998 +11041952 +110398 +110368 +110367 +110356 +11031964 +11027 +110264 +11021961 +11018 +110169 +110167 +110160 +11012001 +1045 +102973 +102769 +102481 +10242048 +102400 +102273 +102030a +102001 +101881 +101699 +101378 +10128 +101263 +101258 +101254 +10121v +101166 +10111999 +10111969 +10111964 +10111958 +10111955 +101063 +101050 +10102008 +10102002 +10101969 +10101958 +100968 +100962 +10091957 +100864 +100862 +10081957 +100797 +100792 +100766 +10072001 +10071964 +100699 +100676 +100597 +10051971 +10051958 +100494 +100473 +10041966 +100373 +100359 +10031999 +10028 +100271 +100266 +100258 +10021968 +10021965 +10021961 +10021958 +10021952 +100173 +100167 +100166 +10012001 +10011998 +10011961 +100007 +0L8KCHeK +09apr15 +098poi +0974 +0926 +0922 +0914 +091291 +091267 +09121996 +09121959 +091194 +091192 +091172 +091163 +091095 +091093 +091078 +091063 +09101997 +09101961 +090975 +09092009 +09091963 +090882 +090873 +090863 +09082002 +09081998 +09081965 +09081964 +09081961 +09081957 +090783 +090779 +090773 +090762 +09071965 +09071960 +090697 +090693 +090672 +090671 +09062000 +09061965 +090591 +090572 +090571 +09051962 +09051957 +09051956 +090498 +090460 +09041968 +090373 +090365 +09031999 +09031966 +090271 +09021969 +09021967 +09021961 +09021959 +090194 +090178 +090173 +09011962 +09011958 +090100 +0895 +0884 +0873 +086421 +0827 +081500 +081268 +08121998 +08121997 +08121966 +08121962 +08121960 +081197 +081183 +081162 +08111966 +08111961 +081093 +081071 +081069 +081060 +08101968 +08101963 +08101960 +08101957 +080998 +080980 +080976 +080975 +080974 +080973 +08091959 +08091957 +080907 +080899 +080897 +08081999 +080793 +080771 +080762 +08072000 +08071961 +080677 +080672 +080669 +08061999 +08061964 +08061961 +080592 +080587 +080573 +08051963 +08051959 +080496 +080495 +080492 +080487 +080470 +080467 +08041957 +080397 +080396 +08031999 +08031998 +08031961 +08031955 +08031952 +08022000 +08021998 +080196 +080191 +08011956 +0785 +0783 +0778 +0725 +071269 +07122000 +07121969 +071090 +071075 +071072 +071065 +07101967 +07101966 +07101960 +070993 +070968 +07091998 +07091958 +070894 +070877 +070870 +07081955 +070807 +070768 +070767 +07071964 +07071963 +07071961 +07071957 +070699 +07061966 +070595 +07052001 +070475 +07041964 +07041959 +070394 +070377 +070373 +07031970 +07031961 +07031958 +070292 +070281 +070279 +070276 +070274 +070196 +070195 +07011968 +07011958 +07011953 +0699 +0692 +0687 +0684 +0683 +061980 +061281 +061272 +06122000 +06121997 +06121968 +06112001 +06111962 +06111959 +061061 +06101997 +06101962 +06101957 +06091963 +060901 +060895 +060878 +060870 +060868 +06081999 +06081960 +06081958 +06081955 +060794 +060777 +060771 +060763 +06072001 +06072000 +06071969 +060708 +060699 +06068 +060674 +060672 +060663 +060591 +060575 +060573 +060572 +060569 +06051959 +060461 +060455 +06041999 +06041997 +06041955 +060375 +06032000 +06031999 +06031962 +06031957 +060282 +060270 +06021963 +06021961 +060181 +060177 +060172 +06011968 +06011966 +06011965 +0601 +05870587 +0586 +0583 +05530553 +052385 +051966 +051273 +051263 +05122001 +05121997 +05121961 +051194 +05111962 +05102001 +05101999 +05101998 +05091998 +05091964 +05091961 +05091957 +050897 +050868 +050863 +050854 +05081958 +05072000 +05071961 +050700 +050673 +050664 +05062006 +05061969 +05061965 +05061961 +050576 +050560 +05051965 +05051961 +050501 +050475 +05041967 +05031959 +05022001 +05021963 +050177 +05011962 +05011958 +0484 +0482 +0442 +0430 +041275 +041267 +04118 +041177 +04112002 +04111965 +04111961 +041099 +041074 +04101968 +040991 +040971 +04091967 +040873 +04082006 +040697 +040674 +040670 +04062006 +04062001 +040595 +040592 +040567 +04052001 +04051962 +040469 +04042006 +04042004 +0404198 +04041963 +04041952 +04040404 +040386 +040372 +040367 +04031954 +040293 +040292 +04022010 +04021956 +04021954 +040194 +040178 +040177 +040170 +04011998 +04011969 +04011959 +0389 +0386 +0333 +031995 +031264 +03121997 +03121970 +03121963 +03121962 +03120312 +031189 +031173 +031171 +031166 +03111959 +031098 +031096 +031000 +030997 +030973 +030972 +030969 +03091965 +030898 +030895 +030871 +03082002 +03081967 +03081961 +03071969 +030699 +030696 +03061998 +03061963 +03061962 +030573 +030567 +03051998 +03051969 +03051967 +030496 +030495 +030477 +030476 +030471 +03042009 +03041964 +030398 +030372 +030370 +030369 +030359 +03031955 +03022007 +03021999 +03021966 +03021965 +030192 +030174 +03011964 +0268 +02588520 +02580258 +021268 +021266 +021259 +02121958 +021171 +02112001 +02111998 +02111997 +02111963 +02111962 +021100 +021097 +020993 +020963 +02091999 +02091961 +020895 +020889 +020871 +02082000 +02081963 +02081958 +020793 +020772 +02062000 +02061964 +02061962 +02061960 +020570 +020561 +02051968 +02051961 +020468 +020465 +02042008 +02042000 +02041957 +02040204 +020378 +020372 +020370 +02031963 +02021962 +020169 +020158 +02011957 +02011950 +020103 +01870187 +0181 +0157 +0151 +01470258 +0123698745 +011268 +011185 +011178 +011173 +011171 +01111999 +01111957 +011095 +011077 +01102011 +01101955 +010996 +010995 +010976 +010969 +01091961 +010897 +010873 +010871 +01081999 +010795 +010772 +010767 +010766 +01072006 +01071964 +010675 +010667 +010661 +01062011 +01061964 +01061954 +010607 +010597 +010566 +01052009 +01052005 +01052001 +01051999 +01051956 +01051952 +010496 +010472 +01041950 +010356 +01031961 +01031956 +01022005 +01021957 +01021954 +010203a +010102 +00948230 +008008 +00770077 +0057 +0053 +0032 +0020 +0019 +0016 +00110011 +001007 +000000000000 +.hjxrf +zzzzzzzzz +zzzz1 +zxcvqwer +zxcvbzxcvb +zxcvbnmmnbvcxz +zse45rdx +zrt600 +zozo +zosozoso +zorro2 +zoro +zork +zoopark +zombi +zippie +zip123 +ziomek +zimina +ziegler +zheng2568 +zexts364325 +zerohour +zcfvfzrhfcbdfz +zcGihLKe +zasxcdfv +zargon +zaqxsw123 +zamzam +zakaria +zagnut +zaczac +zackzack +zackery +zabava +z1z1z1z1 +z12345z +yusuke +yuppie +yukari +ytpyfrjvrf +ytgjvy. +youssef +yourmomma +youpi +youbitch +yodaman +yocack +yoass +yllek +yk2602 +yfhrjvfy +yesyesyes +yessongs +yesplease +yes123 +yepyep +yellow7 +year2001 +yavin4 +yatyas +yasser +yasemin +yaroslavl +yancey +yanayana +yamazaki +yamaha01 +yama +yakudza +yabloko +xxPa33bq.aDNA +xtutdfhf +xtkjdtrgfer +xtcxtc +xpcrew +ximena +xerox1 +xehrf2011 +xcxc +xbox +wwwxxx +www777 +www222 +wutangclan +wtpmjg +wtiger +wsx22wsx22 +wrong1 +writer1 +wren +wrangle +worr3619 +wormy +workman +working1 +workers +wordpas +wootwoot +woodrose +woodroof +woodpeck +woodman1 +woodgoat +woodchuc +woodbine +wolford +wolf99 +wolf13 +wofford +wizard2 +witter +wirenut +winter2 +winter13 +winner2 +winkler +wingtsun +wingtip +wings19 +windows7 +willson +willis1 +willie23 +william4 +will22 +wildsex +wildfir +wildchild +wilbur1 +wikus16 +wifey1 +widmer +widespread +widescreen +wick +wichser +whoppers +whoareyo +whitlock +whenever +wfa4150 +wewizcom +wewewewe +wetpuss +weterok +westpac +westies +west12 +wertyui +werty12345 +wert123 +werewol +werd +wer234 +wer138 +welcome3 +weed123 +wedges +wedge1 +webpass +web2age +web123 +weazel +weare1 +weakness +wbemoc +wayne0 +waycool +washingto +wasdqe +warwick1 +warrior3 +warren1 +warpig +warhead +war123 +want +wannasee +wanda1 +walter2 +wales1 +walentina +wakacje +waimea +wahoo1 +wTSFjMi7 +w1w2w3w4w5 +vytautas +vulkan +vtvtvt +vtr1000 +vtec +voyager6 +voxstrange +vova1995 +vova1994 +voron +voodoo69 +voodoo22 +vomit +volodia +volkswagon +volk +volfan +voldemor +volare +vladlen +vladimirovna +vlad2011 +vlad12 +vjqfyutk +vivi +vitebsk +visionar +visavisa +virtus +virtuoso +viper23 +violin1 +vinson +vinegar +vindiesel +villian +vika1999 +viggen37 +vieira +vidaloka +vidaloca +victory7 +victor123 +vicenza +vibe +vgirls +vfyzif +vfvfxrf +vfvfcdtnf +vfnhtirf +vett +vestal +vergil +verdes +verbena +ventana +vent +venise +vengeance +vehvfycr +vegetabl +vegavega +vegasman +vecnfyu +vcxz +vbybcnthcndj +vbrbvfec +vbkzdrf +vazelin +vasser +vasilev +vandelay +valiant1 +valet +valeria1 +valera123 +valer +vagrant +vaduz +vadim1996 +vEf6g55frZ +utyyflmtdyf +utythfk +usual +ustinov +usmc1 +userexecute +usbhub +usagi +urracco +urlmon +urine +upyachka +updrop +upchuck +unleashed +unix +universo +united99 +united123 +unit +uniqueness +unions +unicum +undne +understand +under1 +uncut +uncled +uncle1 +ummagumma +umisushi +umbra +ultimatum +ulrika +ukcats +ujyobr +ujhjl312 +uhoh +uhjpysq +ufdhbkjdf +ueptkm +udinese +uchimata +uXMdZi4o +tyra +twister1 +twinsen +twinpeaks +twain1 +tuttut +tutti +tutor +turntable +turnpike +turning +turist +turbo6 +tural +tunin +tungdom6 +tunes +tune +tulley +tujhsx +tucker2 +tucan +tube +ttt123 +tsunami1 +tspeter1 +truong +trunks1 +troutbum +tropics +trish1 +trio +trinity2 +trimner +trick1 +tribeca +triathlon +triade +trevon +trektrek +trekstar +tree1 +travail +trans1 +tran +tractor1 +tracksta +tracking +trace1 +towanda +tounge +tothetop +tothemax +tosh +tortor +toroto +topazz +topanga +toottoot +tootsie1 +toomany +toolband +tony99 +tony25 +tonto1 +tonnie +tonitoni +tomto +tommyg +tommyboy1 +tommy999 +tomcruis +tombrady +tomasa +tolkie +tofuck +tofu +tobias1 +tobbie +tl1000 +tittit +titikaka +tiraspol +tioga +tinotino +tindoor +timid +timezone +tima123 +tilleie +tikitiki +tika +tigre1 +tigger22 +tigertiger +tigers7 +tiger86 +tiger5 +tiger10 +ticktick +tibia +tiagans97 +thx138 +throng +threeday +thomasj +thomas99 +thissite +this4now +thetaz +thesmith +theshow +therocks +therams +theonly1 +theon +theman2 +themack +thekin +thekey +thehouse +thegreek +thegod +thecult +theboss1 +theborg +thebends +thebean +theand +thea +thatguy +thanh +thailan +thai +tgacb +textex +text +texasboy +texas22 +texan1 +testo12 +test12345 +terranova +terra1 +terayon +tenors +tennis2 +tendulkar +telecom1 +telaviv +teenies +tee0s +technician +technical +teamomuch +tdutirf +tboner +taylors +taylormade +taylor10 +taurus1 +tatum +tattoo1 +tassen +tarza +tarrant +tarot +tarmac +tarantula +taran +taptap +tapis +tapeworm +tanzen +tanlines +tanks +tani +tangled +tamu +tamper +tamiya +tame +tamarack +talus +talontsi +tallon +talbert +taktak +tahoes +tagman +tabryant +taarna +t1234567 +syndrome +synchro +sylviahans +sykes +sxsxsx +swivel +switcher +swimmin +swift1 +sweetpus +sweetboy +swanlake +swain +sveto4ka +sveta1 +sverre +svensk +svenja +suzan +sutherland +susubaby +sussie +suspects +sushis +suprise +supersuper +superman12 +supermac +superg +superdut +superdave +superbir +superbik +super69 +super21 +supa +sunset1 +sunoco +sunn +sunglasses +suman +sulaiman +sugardad +suckmydic +suckmine +suckme69 +subskin +submission +subaru1 +suave1 +stutt +stupid11 +stup1d +stucker +str|ct9 +struck +stroud +strom +strohs +stride +street1 +stratus1 +stratp +stratford +strasse +strahd +storme +stormbri +storm2 +storm12 +stoney1 +stoneros +stogie +stoffel +stockholm +stlucia +stinson +stinker1 +stills +stevey +steven12 +steve3 +stefanescu +steeple +statue +statistika +static1 +state1 +stasstas +stasha +stas1992 +starwars3 +starwars123 +starshin +starosta +stargirl +starfleet +starcraft2 +starbug1 +star33 +star23 +stanlee +stanisla +stalion +stainles +ssss1 +ssnake +sregit +srbija +squeegee +squawk +squares +spyros +spunker +spumoni +sprint99 +spring77 +spring01 +spring00 +sporto +sport123 +spongy +splice +splendor +spitzer +spitfire1 +spiller +spike69 +spidey1 +spesional +sperling +spencer5 +speedy12 +speedste +specia +spastic +spartan11 +sparkplu +spares +spanners +spanky69 +southwest +southman +southie +southamp +soulja +soulfood +soslite +sosa66 +sorbet +sophie3 +sooty1 +sonja1 +soltero +solovei +solo44 +solly +solitario +soldie +sokolik +sohail +soggy +sofie +sofa +sockeye +soccerba +soares +snyper +snuggles1 +snowden +snow11 +snooty +snoopy123 +snoopy01 +snipper +snipers +snark +snapple1 +snappers +snakepit +snake69 +snake12 +smyrna +smoothe +smoopy +smokie1 +smoki +smoken +smoke123 +smit +smilie +smarter +small1 +slysly +slutz +slut1 +slushslush +slurpy +slothrop +sloogy +slaine +sladkaya +slackers +skunk2 +skoals +skiers +skidog +skidder +skeeter2 +skater12 +skarlett +skapunk +sizzlin +sixstrin +sixsixsix +sitter +siren1 +sinaloa +simonova +simonov +simonn +simferopol +simbadog +simbad +silver21 +sillyman +silkie +silentium +silentbo +signed +sickfuck +shuhrat +showit +shout +shouby +shoshana +shoeless +shivam +shirow +shirle +shippo +shipper +shelbygt +sheffwed +sheehan +shawns +shashank +sharpy +sharpie1 +sharpei +sharon12 +sharlene +shara +shanker +shaney +shanee +shane2 +shamu +shakeel +shakazul +shaka1 +shaila +shafty +shadow19 +shadoe +shad +sh1thead +sgEGuKBM +seyila +sexystud +sexypass +sexymf +sexy23 +sexy2 +sexx69 +sexo69 +sewing +sewers +severian +seve +settings +sesso +serova +sergun +serena1 +serda +serafin +sept +sensible +senhas +semtex +sempre +seltzer +sellit +selling +seledka +select1 +selanne +seen +secret69 +secret00 +secbasic +sebas +seaview +seaquest +seadoo96 +sdswgh +sdsdsdsd +sdicmt7seytn +scuba2 +scrubber +scouting +scoutdog +scottsda +scotter +scott7 +scott3 +scooby69 +scofield +schumann +schroede +schoen +schnitze +schmid +scarred +scapegl +scamper1 +scamp1 +scammell +scale +scaffold +sazonov +sawblade +sawasawa +sawa212 +savoy +saverio +savanah +saufen +sauces +satyr +saturn2 +sasuke123 +sasuke12 +saspurs +sasha7 +sasha14 +sasch +sas123 +sarolta +sardegna +sarcasm +sapphir +sapito +sapato +santorini +santaros +santana1 +santan +santamaria +sanskrit +sandy3 +sandusky +sandrita +sandra123 +sandra12 +sandies +sandi1 +sandhill +sanderson +samuel123 +sampdoria +sammy13 +samboy +sam999 +salvia +saloon +salon +salmon1 +salma1 +salli +salida +salah +sahtm131 +sahtm093 +sahtm082 +sahtm053 +sahtm038 +sahil +sagitarius +sagapo +safesex +sae1856 +sadiemae +saddles +sacoremsg +sabra +sabado +saavedra +sS6z2sw6lU +s211278 +s1erra +s11111 +ryebread +ruthruth +rutger +rustang +russells +ruslan123 +rusher +rush11 +runo +ruiz +rugby9 +rubikon +rubberduck +ru4692 +rtyu4567 +rovert +rover123 +routine +rouse +rossy +rossman +rossini +rosie123 +rosella +rosebud7 +roseann +roscoe12 +rosco2008 +rosalyn +rosalita +rosado +root138 +rooster2 +roone +room101 +rono +ronaldin +romper +romochka +romanson +rojo +rogets +rogelio +rodionov +rockytop +rocky7 +rocky12 +rocklee +rockhill +rocket7 +rocker1 +rockandroll +rock22 +rochester +rocha2 +robvandam +roberts1 +robert8 +robert4 +robert23 +robert123 +robert00 +robert0 +robe +robbieh +robben +roadrace +rmpop +rmanis +rjpkjljq +rjkmwj +rjdfktdf +riverman +ritz +ripper1 +ripken08 +ripe +riogrand +rino +ringding +rincess +rinaldo +right4 +rideau +rick123 +richardl +richard9 +ricbch4 +ribeiro +ribalka +rhonda1 +rhfcyjzhcr +rhbdtnrf +rhbcnb +rfvtym +rfvbkm +rfvbgt +rfnz11 +rfnthbyjxrf +rfkbybyuhfl +rfkbajhybz +rfinfy +rfcgthcrbq +reza +reyrey +rexton +rewq1234 +rewards +reviewme +revert +retriver +retreat +retep1 +restart1 +rest +resets +rerhsybrcs +reports +remont +remix +reiner +refused +reel +redredred +redred1 +redoctob +redlover +redlabel +redflag +redfish1 +redcap +redbrick +red5thx +recneps +rebbecca +reallove +reality5 +realest +readread +reading1 +reactor +rdq5Ww4x +rc.itymrf +rc.irf +rbceyz +razorblade +rayne +ravenna +ravenlof +raven666 +raven2 +raven13 +raulito +rauchen +ratiug +rational +ratbert +rastlin +rassilon +rasha +raser +rasca +rasberry +raritan +raptor22 +ranier +rangerover +ranger82 +ranger7 +randyb +randell +ramtough +rammramm +ramcharg +ramarama +rainking +raines +raiders9 +raiders7 +raider12 +ragweed +ragger +rafting +raffle +raffaello +rafal +rafa +radford +raddad +radars +rackham +rachel7 +rachel12 +rabit +rabbit13 +r1mini +r0ckstar +qwerty9 +qwerewq +qweqwe1 +qweasdzxc12 +qwe123321 +quit +quiche +querty +querida +quasimod +quartz1 +quartet +qetuop +qazxsw22 +qazwsxedcrf +qazwsx123456 +qazwer +qaz321 +qaz123wsx456 +q80661658441 +q7w8e9 +q3dm17 +q2w3e4r5t6 +q26606 +pyfrjvcndj +putana +pussy6 +pussy420 +puspus +purple99 +purple77 +puregold +punk77 +pumps +pumpkin9 +pujols +puente +pudder +psycho72 +prussia +proverb +prova +protec +prostar +prorok +propel +promotio +progres +progamer +priya +prior +princip +princess2 +prince55 +primos +prevost +preview +preved +pres +premio +prasanna +pppooo +pp04a +powmia +poul +potolok +potent +portnoy +porque +porntube +pornog +pornboy +poptart1 +poppos +poppe +poplop +popa +poopdick +poop69 +poooop +pooo +pooner +pookie11 +pooh123 +ponomarenko +pompeyfc +polsk +polpetta +pollys +pollop +pollie +polla +polka1 +politeh +polanco +pokus +pokie +pokeman +poiqwe +pointbreak +pogosyan +poepie +poep123 +podvinsev +podunk +podstava +podruga +plot +plokplok +plokiju +pljhjdmt +plaza +play69 +play2win +play123 +platter +plato2 +platipus +pjsheridan +pizza2 +pivo +pitmans4 +pitman +pitcher1 +pissonme +pisshead +piping +pioli +pinocchio +pinned +pinkyy +pinkrose +pinker +pink1 +pinheiro +pingeye2 +pinger +pina +pimpsta +pimpman +pimpit +pimpdogg +pikey13 +pigskin +pigeons +piffle +pierino +piddle +pickwick +pickl +pichon +pibzk431 +phooey +phoenix9 +phoenix5 +phoebe1 +phildec +pheobe +phelan +pfqwtdf +pflhjncndj +pfchfyrf +peugeot2 +petrushka +petrie +petrenko +peterbui +peter11 +petals +persona1 +persephone +perrys +perron +pernilla +pernell +perkin +percent +pepsi12 +pepper23 +people12 +penwindo +penumbra +pencils +pelosa +peikko +peggys +peggie +pegase +pederast +pedant +peanut2 +peaches3 +peace2 +pcs2174 +pcmcia +payless +paulista +paule +paul04 +patton1 +patricks +patrick6 +patito +pasword1 +passwurd +password33 +password! +passman +pass23 +pass2012 +pashtet +partridge +partner1 +parson +parsnip +parry +parisi +paris75 +parfois +paramon +paradize +paradice +papo +paperman +papasmur +paparazzi +papa1 +panthera +panther8 +pantera6 +pantat +palomo +palladio +pall +palito +paige2 +paid +paddler +pacotaco +p0tat0 +ozzyman +overseas +outrider +outrage +outlet +ou81234 +others +otaku +otabek +ostsee +ossi +osman +oskari +osirus +oscarcat +oscar99 +osasuna +orxan +orochimaru +orochi +orion3 +oren +orange9 +opusopus +optiques +operations +open321 +opaque +onslow +only4u +oneil +omytvc15 +omySUt +omglol +omen666 +omen +omega666 +oliwia +olin +olga12 +oleksandr +oleg1967 +oleg12345 +oleaut32 +olds +oldlady +oldgold +oldcrow +okk34125 +okayokay +offside +off +odranoel +odieodie +oddity +oclock +obscene +oberst +obafgkm +oakman +oakdale +nzceg251 +nyvott +nyranger +nyisles +nx2000 +nutt +nurjan +nunu +nuggett +nuggets1 +nthvbyfk +nthk12345 +nsnabh76 +nozomi +noway123 +nova99 +notlim +notch +not4me +not4long +nostradamus +nosliw +noskcaj +nosbig +norwich1 +norwest +northwoo +norsemen +noonehackme +nonnahs +nolimit1 +nokianokia +nokia5700 +nokia1600 +nokia1100 +noeli +nodnol +nmnmnm +nji90okm +njhnbr +nizmo400r +nixons +nissan35 +nintendods +ninjitsu +ninja2 +niniko +ninety9 +nikoniko +nikki69 +nikita2010 +nikita1996 +nikiforova +nigora +nighty +nightwis +nightfall +nicolle +nicnac +nicko +nick2000 +nicholas9 +nichelle +nicebutt +niceboy +niagra +nhjabvjdf +nhbybnhjnjkejk +nhbujyjvtnhbz +nfgbpltwq +newlook +neverhood +nevergiveup +netx500 +networth +netnovel +nesterenko +nelson11 +nekochan +neggy +nefertit +needhelp +nedlog +necronomicon +neckk +neckbone +nebesa +nbnjdf +navillus +navigation +navarr +naughty2 +native1 +nathans +nathanae +nathali +natawa +natasha7 +natalja +natalee +nata2010 +nastya1996 +nassar +nasnas +nascar18 +naruto2010 +nagging +nafisa +nadira +n1k1ta +n1a2t3a4 +myway +mythology +mymgis41 +mykonos +myeyes +mydear +mycomput +mybike +mutt22pu +mute +mustapha +musicbox +musical1 +music69 +music5 +music11 +murphy11 +murcielag +muncie +mumu +mumford +muie +muhamma +muffmuff +muddog +mudddd +mudd +mucus +mucsaj +mtr1996 +mtgl5r +mtdew +mt73sb +msjet40 +mrkmrk +mrfish +moxie7 +mousemouse +mountie +mountaindew +mounds +moumoune +motylek +motu6697 +morphy +morph +moron1 +morgans +morena1 +moran +morales1 +mopmop +moorea +moontime +moonchild +moonchil +moonbar +moon5leg +monty2 +montreux +montie +montella +montana2 +monrovia +monreal +mononoke +monkman +monkey8 +monkey55 +monit +monica01 +mong1ni +money3 +money10 +monette +moneta +monde +monalis +molder +mojojo +moisture +mohsen +mohinder +mohamme +mogwai1976 +moejoe +model1 +modder +mkjhfg +mjones +mj2323 +miyagi +miwako +mitino +mitch123 +mistycat +mishaoooyeah +miser +misamore +mirrors +mirror1 +mirko +mirand +miquel +minniemouse +minnie2 +minkey +minigolf +mine4 +mimino +millioner +miller01 +millen +milking +milker +milano1 +mikey5 +mike20 +microlab1 +mickey13 +michelangelo +michaelk +michael69 +miami99 +miami13 +metree +metfan +metalist +metalic +metalhea +metalgod +metalcore +message4 +mervyn +merlin10 +merde1 +mensos +memnon +membe +meloni +melissas +meli +meijer +megmeg +megazone +megan7 +mefisto +meerkat +meepmeep +medicman +mech6666 +meaty +measures +meaning +meanie +meade +mdmsii64 +mdmolic +mdmnttd2 +mdmmoto +mdmgl010 +mdmgen +mcse +mcqueen +mcnair +mcfly +mccloud +mccallum +mcafee +mc6288 +mazdamx3 +mazda123 +maywood +mays24 +mayflower +may12 +maxxie +maxxam +maxwell7 +maxmaxma +maximi +max528 +max2010 +max1234 +mavs +mavipies +mausmaus +matthew10 +matt69 +matt25 +matrix9 +mata +masterg +master88 +master6 +master4 +master0 +mass234 +masoud +mashinka +masha2011 +mascara +masayuki +masaru +masana +masala +mas123 +maryse +martymar +martmart +martinet +martin19 +martin06 +martell +marsbars +marrero +marquett +marmo3 +marlins1 +marley11 +marku +markis +markin +markham +markel +mark77 +mark44 +mark23 +mark2 +maritt +mario6 +marines2 +marinas +marina15 +marijane +mariette +mariamaria +mariah1 +marhaba +marengo +marcuseckos +marcs1997 +marcia1 +march3 +march22 +march20 +marameo +manure +mansoor +mansel +manolis +manning18 +mankato +mangoo +mango123 +mange +mando +mand +manara +mammas +mamata +mamaeva +mama2011 +mama1960 +mama1956 +malmsteen +malmstee +mallrat +malkavian +malin +malib +malaki +malachy +maksimuss +maksat +maks1995 +makayla1 +makassar +makaroni +maiden666 +maia +mahmoud +magnus1 +magnumpi +magnific +magius +magical1 +magic69 +maggie123 +maffia +madzia1 +madhatter +madd +madame +madalin +mad123 +macdad +mabuhay +ma1lc0 +m249saw +m123456789 +m0ntlure +lytdybrbdfvgbhf +lyons +lynnette +lxgiwyl +lvd9341 +luvluv +luv4ever +luton1 +luton +lutheran +luster +luscombe +lurcher +lupit +lupin +lunge +lung +lunatik +lumper +lukester +luis2 +luckyday +lucky22 +lucky10 +luckee +lucid +lucia1 +lucerne +lubasha +ls6454 +lplplp +lovesazz +lovejone +lovedoc +loved1 +lovecraft +lovebu +lovebaby +love007 +lousy +louisvil +louise12 +louann +lothian +loshadka +lose +lorilori +lordof +loquit +lope +longneck +longjump +longing +longhaul +longboat +londres +london01 +lombok +lolomg +lolita1 +lola123 +lol +lokator +loh123 +logroll +logologo +logo +logmein +logistics +loginov +login1 +loggins +locote +loafer +loadtoad +lllll1 +llanelli +lklk +ljcnjtdcrbq +lizzy123 +lizzie1 +lizzi +liz8tysiu +litvin +littlehole +lissette +lisalove +lirika +lionss +lionhart +lion12 +linton +lindse +lindsay2 +lincoln2 +limpkorn +limonade +limon +limeligh +lilo +lilmac +lillypad +liken +lickpussy +lickpuss +lickitup +libra1 +liberty9 +liberty7 +liberdade +lfybkjd +lfieyz +leyden +lexalexa +lewka111 +levy +leveller +letme +lesya +lesta +lessons +lesley1 +leonida +lena22 +lemont +leiter +leihak +legends1 +legend2 +legend12 +legato +leetah +leecher +ledge +leckmich +leaving +leading +leaders +lcroft +lclprog +lbvfhbr +lbvf +lazyboy +lazio +layla1 +lavazza +laurita +laural +laughs +laudrup +lattice +latrell +lathrop +lasha +larue +larryboy +laputa +lapo1995 +lantana +lanier +lange9x +landscape +landman +lancelo +lampshade +lamonte +lakers2 +laila +lafrance +lafayette +ladyhawk +ladybug7 +ladoga +lacuna +lacsap +lackey +lacie +lachlan +labyrinth +kyoto +kvazar +kuzmin +kutter +kurica +kurban +kunt +kumite +kukukuku +ktc110 +ks1977 +krypton1 +kristo +kristina1 +kristie1 +kozlik +kovaleva +koufax32 +kotyara +kottayam +kotiko +koteczek1 +koster +korobok +korgm1 +kooler +kompik7 +kolosok +kolkol +kolkata +koliko +kolian +kolesnikova +kolakola +kokoro +kojack +knucklehead +knoxville +knothead +knocks +knitting +knicker +km83wa00 +kloten +klop12 +klm123 +klimov +klever +klepper +kleopatr +klasse +kkkkk1 +kkk777 +kiuhnm1 +kittykitty +kittycat1 +kitten2 +kitaro +kitaec +kissyou +kissme2 +kisse +kirsikka +kirkkirk +kirillova +kirillov +kirill2010 +kiparis +kinshasa +kingpins +kingkong1 +kingkhan +king55 +king10 +kincaid +kimberley +kimba1 +killshot +killkillkill +killers1 +killer55 +killer3 +killer22 +killacam +kikokiko +kiisuke +kiddo +kicks +kicking +kiana +kg5698 +keynbr +keyfnbr +kevin9 +kevin22 +ketamine +kerygma +keraskeras +kenzo +kenshi +kendog +ken123 +kellyj +kelly8 +kelli1 +keks +keiko +keepout1 +kbpfdtnf +kbkbxrf +kayode +kawa +katter +katiew +katie12 +kate123 +katastrofa +kassargar +kassa1 +kashtan +kasatka +kartoffe +kartina +karlito +karlit +karkar +karenina +karend +karena +karekare +kardelen +karatist +karas +karambol +kar120c +kapper +kappaman +kanus1 +kamera +kamchatka +kambing +kamakiri +kalvin +kalipso +kalashnikov +kalamata +kakka12 +kakaska +kaizer +kain +k1ll3r +k1f4c8 +k.ljxrf +juttu123 +justine1 +justin3 +jury +june30 +june23 +june15 +june14 +june12 +jumpers +jumbo1 +july31 +july24 +july11 +julit +juliett +julia666 +jule +julchen +juiced +juicebox +juanpabl +jrracing +jrjrjr +joyboy +joshy +joshua13 +joshua04 +josephphone7 +jos +jordan98 +jordan6 +jordan05 +jonpetter +jolly1 +jokker +joker2 +johnwoo +johnpass +johnny12 +johnno +johnlee +johnie +johnboy1 +john25 +joggin +joeyjojo +joe999 +joanjett +joanbb69 +jncnjq +jktujdbx +jktrcfylh +jktctymrf +jktcmrf +jkjkjkjk +jjjjjjjjjjjj +jjj123 +jj9999 +jixian +jitters +jimmyjim +jimmy9 +jimmy5 +jimmi +jim1234 +jhonn +jgarcia +jfjfjf +jets12 +jesuslovesme +jesusgod +jesusfreak +jesus01 +jessie20 +jess1ca +jerkit +jerker +jeremie +jennym +jenkin +jenechka +jena +jellyman +jellos +jello123 +jehuty +jeffry +jedi01 +jeanmarc +jbond +jbjbjb +jayja +jayden1 +jaws1221 +jasper01 +jason23 +jaroslav +jantje +janetj +janeth +janel +jancok +jammie +jamessss +jamesg +james101 +jamaika +jakub +jakejaka +jake02 +jahlove +jaguares +jaden1 +jacobo +jackyboy +jackruss +jackpot1 +jackie2 +jackie01 +jackhammer +jackasss +jack69 +jack55 +jacinda +j10e5d4 +j0rdan +izabela +iwillwin +ivory1 +ivanko +ivanivanov +ivan1983 +ivan1234 +italias1 +ismailov +ishorny +isdaman +isback +ironma +irkutsk +irina1991 +irina1989 +irelan +ipo54tj45uy856 +ionic +iodine +inxsinxs +investment +invernes +intubate +interrupt +internacional +intercep +integrity +intake +inshallah +ingress +ingmar +ingenier +infra +indurain +indra +indahouse +incorrect +incident +impress +imperato +imin +iman +iluvgirl +iluvatar +iloveyoubaby +iloveyou3 +iloveyou22 +ilovesam +ilovepie +ilovem +ilovefee +ilovedick +ilovedan +ilovebri +iloveali +illini1 +illiad +ilikepor +ildar +iiiiiiiiii +ihgfedcba +ignore +ignite +ie4bak +iddqd890 +iddqd88 +icky +iceskate +icenine +icecream1 +ibragimova +ibill00 +i9i9i9 +hymen +hydro1 +huseyn +hurts +huron +hunter9 +hunter5 +hummer99 +humber +hull +hulahoop +hughjass +huggie +huckster +htvjyn +hpojscan +hoyas +housing +housemusic +house12 +hottsexx +hotpot +hotlanta +hotice +hosty +horseshi +horsepower +hornyme +horner +hoodyhoo +honors +hongfund +honeyz +honda95 +honda2000 +holywood +holyman +hollywood1 +holle +holla1 +holl +holdup +hola123 +hogdog +hofner +hoffnung +hoffman1 +hocus +hockeyman +hockey30 +hobune +hobgoblin +hobble +hobbits +hobbiton +hobbe +hjvfynbr +hjcnbr +hitma +hithere1 +hisham +hirurg +hippo1 +hillel +hiheels +hghghg +hgasjasg +hfgbhf +hfcnbirf +heston +hess +hesham +herder +herbie1 +herbi +hensley +henshin +hendri +hender +hemingwa +helpme12 +hellsbel +hellowor +hello7 +hello101 +hello10 +hello01 +helga +heine +hein +heimlich +heididog +hegemon +heffner +heeler +hedge123 +heckle +hecfkjxrf +heather7 +hearty +hb4235 +hazel5 +hayek +hayashi +hawthorne +hawley +hawkhawk +hawkes +hawk13 +hawk12 +havelock +hattori +hatagaya +hasmik +haskell +hashim +hasbeen +harvest1 +harryhoo +harry5 +harrell +harol +harley03 +harkonnen +hardie +harden +haras +happy22 +happy21 +hansje +hanker +hangtime +hanging +handkerchief +hanalei +hamtaro +hammer35 +hammer2 +hammer01 +hamid +hamer +hambur +hamasaki +hamann +hamal +halo1234 +haines +hail +hahahah +haha1234 +haddad +habbo123 +h72sfibbnl +h12345 +h0lygr41l +h0ckey +gypsydog +gypsum +gypsie +gymnast1 +gwar +gwapoako +gustave +gusset +gurpreet +gunz +gungadin +gunda +gully +guitar01 +guest1 +guerilla +guardia +guarana +gtogto +gthcjyfk +gthang +gtasanandreas +gtagta +grusha +groovy1 +grommet +groan +grizzle +griswold +grishin +grimreaper +grimreap +griffo +griffey1 +greylock +greybear +gremlin1 +gregster +greg12 +greenwic +greenvil +greenone +greenlea +greencat +green9 +green75 +green10 +greatwhite +greatday +grayson1 +grasss +granola +grandkids +grandkid +granata +gracious +grace7 +gracchus +gq361hy +gouda +gotten +gothic1 +gostosao +gosselin +gosharks +gordy1 +gordo99 +gordita +gordienko +gopats +goosie +goodshit +gooding +goodguy1 +goodfuck +goodbye1 +gonow +gonad +golovin +goliat +golfer69 +golfer20 +goldz +goldtop +goldroad +golddust +golddesk +goku69 +gohan1 +gofsu338 +goffer +godzils4s7 +gocougs +goblet +goatee +go4broke +go49ers +gmoney1 +gmcjimmy +gloryhol +gloria1 +glock45 +glassic +gjyjvfhtdf +gjkjdbyrf +gjgjxrf +gizmocat +giucil +gitanes +gismo1 +gisella +girlygirl +girls2 +girlfuck +girlfrie +girard +ginkgo +ginger69 +gilliam +gilbert2707 +ghostrecon +ghostface +ghostfac +ghjnbdjufp +ghislain +ghijkl +ghibli +ghghghgh +ghbdtn12345 +gfhjkmrf +gfhjkl +gfhfktkjuhfv +gfgf123 +gfgbhjcf +gfdkeif +getsex +getit123 +getinnow +getin1 +getback +getachew +gers +geronim +germano +gerger +geranium +george69 +george4 +george00 +geogeo +geo123 +gengis +geminis +gemini6 +gemini13 +gemini12 +gelios +geewiz +geenidee +geddon +gdog +gbpltw147 +gbpltw123 +gavilan +gateway6 +gateway5 +gastone +gasket +gasanov +garylee +garygary +garters +gargle +gardena +garden1 +garbage1 +gaping +gameman +galactica +gaggle +gaastra +g1nger +g00dPa$$w0rD +fyodor +fylht +fyfnjkmtdbx +fw190d +fuzzle +futile +futaba +furlong +funnys +funlovin +fungible +funforme +fujiko +fuckyous +fuckyour +fuckyoua +fuckyou3 +fucktard +fuckme12 +fuckit1 +fuckinti +fuckher1 +fuckersss +fucka +frufru +frostbite +frost1 +frodobag +fritolay +frick +freude +frem77 +freeworld +freeway1 +freesurf +freeshit +freebeer +fredric +fred66 +fred2 +franzi +franway +frankzappa +frank21 +francuz +francia +fracture +fraction +fr33d0m +foxxx +foxman +fox1 +foutre +fournier +foulball +fortyone +forty1 +forms +forlorn +fork +foreveryoung +forestry +forest5 +fores +fordfocu +ford99 +ford350 +footsex +footjobs +footfuck +footballs +football5 +football123 +footbabe +foobar1 +fomina +follett +flyfishing +flux +flurry +flugel +floyds +floris +florida9 +fliper +flint1 +fling +flexflex +fleetwood +flatbed +flashpoint +flashlight +flannel +fktrcfylhjdf +fktrcf +fisse +fishpond +fishman1 +fishing4 +fishies +fish11 +fiscal +firhill +firelord +fired +fiorell +finnish +finn +fink +findus +findit +financial +finals +finalcut +final4 +filly +fillmore +filling +filippov +filipok +filch +fila +figvam +figtree +figjam +fifnfy +fifa08 +fiendish +fggjkbyfhbz +ffviii +ffffffffff +fevers +fernwood +fernando1 +fender12 +felton +felixs +felixcat +felecia +feel +feefee +fedele +fdsaf +fdnjhbpfwbz +fdfsfaf +fcnfkfdbcnf +faxman +fattie +fatcow +fastfred +fasteddie +fashist +fartuna +farrar +farouk +farooq +farewell +faraway +farah +faraday +fantasm +fantasie +fanat1234 +falmouth +fallout1 +falkland +falcone +falcon7 +falcon5 +falcon21 +faithless +fairytail +fairplay +fagget +fafyfcmtd +faceit +faceface +f250 +f22raptor +express2 +explosiv +explorer1 +expand +exorcist +exhaust +exhale +exciting +excelsior +excelsio +excel1 +excaliber +exarkun +ewanko +evillive +evie +evgenij +evgen +every1 +evenstar +evdokimov +evanston +evander +evan1 +eugenio +eternit +estreet +estrada +estell +erunda +erudite +erskine +erotica1 +eroseros +ernest1 +eriepa +eric69 +eric1132 +erect +equal +epsilon1 +entertainment +entertain +enlarge +enjoy1 +enginee +enders +emoboy +emmaus +eminem123 +emerso +embark +emar3114 +emails +elkhart +elite2 +eliane +elfriede +elena1975 +elaman +eisbaer +einnor +eingang +eider +ehcrew +egypt1 +eeyore1 +edwardo +edwardcullen +edna +edisni +edinorog +eddieboy +ecnirp +echidna +eatpuss +eatmycum +eatme123 +easyonmy +easylife +easports +earwax +earth1 +earring +eamonn +eagles5 +eagles11 +eagle9 +e214fre21 +dyno +dylan123 +dyexrf +dxtmsft +dutchboy +dustman +duro +dunnowho89 +dumplin +dumars +dulcinea +duke00 +dugout +duffydog +dubstep +dublin1 +dubbie +dtnthbyfh +dt58sck +dstars +dryfly +drugfree +drug +drpeppe +drone +dripdrip +drew11 +dreamonline +draw +drako +dragonla +dragon98 +dragon8 +dragon4 +dragon35 +dragon07 +drafting +draco1 +drac +douse +dory +dorthe +doral +dopey01 +dooger +doody1 +doodle1 +dooby +donvito +dontlook +dontforget +dontdoit +donetsk +donatella +donaldduck +donahue +domovoy +domodedovo +dominoes +domedome +dolphin5 +dolphin3 +dolfijn +dolcevita +doingit +dogsss +dogmeat1 +dogman1 +doggy69 +dogbones +doctorwho +dochenka +dmiller12as +dlgddm +dknight +djljghjdjl +djkxfhf +djeter2 +djcnjr +diya2003 +dixon1 +divide +disturb +distal +disney12 +dirkdirk +dirac +dios +diode +dino12 +dindin +dimazarya +dimabilan +dima777 +dima77 +dima2002 +dima1983 +dima13 +dilnoza +dilly +dillion +digler +digits +digitex +digdog +dienstag +diebold +dick11 +diamond0 +diablito +dhtlbyrf +dfyzdfyz +dfrgifps +dfktxrf +dfcz +dfcbkmtdyf +dezamone +devitt +devil66 +deutschl +detritus +dethklok +detective +destruction +desmond1 +desig +derwent +depeche1 +depart +denver7 +dentman +dennis12 +denisz +denis2011 +denis1983 +denham +dengad +denali1 +den040791 +demona +demodemo +demidov +demetri +demetra +demchenko +deluca +deltatau +delta12 +delegwiz +dekalb +defend +defcon5 +deepred +dedbol +debtfree +deadboy +deadbolt +dddsss +ddavis +dbrecmrf +dbnfkbr1 +daxada +dawg69 +davison +davidt +david6 +dave77 +dave22 +davcprox +dauntivi +dastin +dasha2010 +darya +darlingt +darkover +darknite +darkness1 +dapple +dannys +danknugs +daniel9 +daniel7 +daniel6 +daniel14 +daniel00 +dandelio +dancedance +dan3 +dan +damore +damasta +dallen +dallas88 +dallas33 +dalia +dale123 +daimon +dahmer +dagger1 +daffyd +daddy69 +daddy21 +da010375 +d36rkqdff +d1arrhea +d0ct0r +cygnet +cx18ka +cwoodson +cvzefh1gk +cvyx76h +cvetlana +cutgrass +cushing +cursor +curling +curioso +curio +cupid1 +cunning +cumsalot +cum69 +culloden +cuenca +cucu +cuco +cuca +cubs1 +cubiche +cubamar +cthuttd +cthulhu1 +cthueyz +cthnbabrfn +ctdthysq +crystal7 +croydon +crowns +crosswor +crocket +croc +cristobal +cristine +cristan +crimes +criket +cricri10 +crepusculo +creditca +crease +cream1 +crazyhorse +crazyhor +crapcrap +crankers +cranium +cracks +cracking +cowsrule +cowboy11 +covington +covingto +couture +courty +court1 +couco +costing +cosmin +cosmetic +cosanostra +corsar +corrigan +corratec +corduroy +copyright +copperfi +copperco +copley +cooper12 +coolidge +cooldog +cookman +controll +continen +contex +consulting +constanz +constabl +consist +connor12 +connolly +conner1 +connecto +confess +computer12 +compose +compiling +compete +compas +commo +commit +commerci +comma +comida +combos +colours +college2 +colima +coleen +colecole +coke12 +coitus +coglione +coffee11 +codyboy +cody12 +codered1 +cocopops +coco1234 +cocklover +cockcock +cocheese +cochabamb +cobble +coastie +coachk +closter +clit69 +clayman +claude1 +clapper +clan +claire2 +claddagh +ckjytyjr +ckflrfz +cjdtcnm +cindyl +cigarette +cider +church1 +chunga +chukcha +chuch +christoph +chrisn +chris20 +chris111 +chris03 +chowmein +chowdary +chouette +chojin +choccy +choc +chloecat +chloe69 +chkdsk +chitchat +chisholm +chippe +chiper +chipchop +chinos +chinit +ching +chinedu +chinatown +chimps +chiles +chikung +chien +chiemsee +chiefy +chicken6 +chick1 +chicago9 +chicago5 +chicago3 +chevy57 +chevvy +chester8 +chester12 +chery +cherrypi +chernov +chelovek +checkup +chasm +charlied +charles7 +charles0 +chard +charade +char4u +chapper +chanta +chant +chanel1 +chandu +chandos +chancho +champy +chamorro +chalice +chaff +cghfdjxybr +cgfhnf +cfnfyf +cfgfa03 +cextxrf +certified +cerf123 +centrum +centro +centric +celtics3 +cellos +cegthvty +cedri +cedar1 +cdog +cdcdcd +cchaiyas +cbkmdf +caution1 +catsup +catsss +catseye +catrin +catman1 +cater +catbird +caste +cassiope +cassini +cassell +cashin +cash1 +casey12 +cartmann +carson1 +carsca +carsales +carols +carmen00 +carlos68 +carlos10 +carlo2 +carletto +carita +carisma +caribbean +captaink +capsule +capser +cappy1 +cappy +capitola +caocao +cantwait +canoes +canino +canales +canadiens +camus +campo +campagno +camman +camion +cameron6 +cameron3 +camel123 +calzone +calvin12 +calv1n +calle +calicali +calibre +calavera +calamar +caillou +caesars +caesar12 +cadilla +caballero +cGzFRhUf +c123456789 +byyjxrf +buzzbait +button12 +butter12 +buttboy +butt1 +butnut +butkus51 +buster44 +busta +busstop +bushra +burtons +burnette +burgerking +burgerki +burger12 +burbon +bunner +bunda +bullss +bullnuts2003 +bullgod +bulldog6 +bulabula +bujinkan +bujhm123 +build +buheirf +buggin +buffalo2 +buddy99 +buddy111 +budda1 +buckles +buchholz +bubbah +bs2010 +bruxelle +brunodog +brunello +brucie +browneyes +brothe +brooklin +bronica +brittle +bristolc +bristol1 +brinks +brijam +brianf +brian12 +brevard +bret +breeze1 +brebre +breakdown +brazilia +bravo20 +bratpack +brant +branford +brands +brandonn +brandee +brande +braindea +bradbrad +brad22 +boxes +bowles +bowler1 +bowens +boudin +boucher +bot_schokk +bot123 +boston99 +boroboro +boricua1 +boracay +booyaka +boosted +boomer12 +bookem +booger12 +booge +booboos +bonjov +bonger +bonding +bonapart +bombarde +bojangles +boise +boeing747 +bodensee +bobo12 +bobby4 +bobbilly +boba +bob007 +bmwpower +bmw750 +bmw540i +bmw318is +bmfc2353 +bma2002 +bluewater +bluewate +blueskies +blueprint +bluebox +bluebir +bluebaby +blue75 +blue456 +blue34 +blue333 +blue24 +blue222 +blue18 +blows +blowjob6 +blowhard +blotter +blossoms +blossom1 +bloop +blooming +bloodlust +blondie2 +blimp +blaze420 +blather +blas98 +blank1 +blammo +blaker +blakeca +blahbla +blacksonblon +blacksmi +blacksheep +blacklabel +blackk +blacki +blackflag +blackb +blackand +black99 +black6 +black47 +bk.irf +bjones +bj200ex1 +bittner +bitch2 +bitbit +birthday52 +birdie3 +bird333 +biologia +biloute +billyjo +billyc +billy5 +biller +bigwilli +bigtimer +bigt +bigsmurf +bigsexxy +bigmoose +bigmomma +bigmac12 +bigkahun +bigjohn1 +biggen +bigdummy +bigc +bigbut +bigbos +bigbitch +bigballer +bigasses +biblioteka +bianka +bhbir +bevis +better99 +berty +bertil +berth +berry1 +bernd +bernardi +bernal +berl1952 +berkshir +bering +berik +bergeron +beret +benway +benno007 +benno +benj +bengel +bengali +belzagor +belle123 +bellboy +bellamy +bellaire +belladonna +bella12 +belka +belind +belgarat +belcher +beisbol +beerguy +beerboy +beer123 +been +beeldbuis +beeble +beck69 +beauford +beastly +beastie1 +bears2 +bearden +bear2000 +beanies +beamish +beach4 +bdog +bdfyjdyf +bbnyxyx +bball15 +bba25547 +baytown +bayram +bayou +bayamon +battlestar +bator +batman23 +batman00 +batistut +bastrop +bassboy +basket1 +basil1 +baseball21 +baseball17 +bartsimpson +bartfast +bars +barren +barr +barisax +barchett +barca1 +barbus +bantu +banky +banken +banjos +bangcock +bandit11 +bananas1 +bananaman +banana2 +ballyhoo +ballsy +ballsdeep +ballin23 +ballarat +baldo +baldeagle +balance1 +baiser +baffle +badstuff +badhabit +badday +badd +backseat +bacall +babylon6 +babyko +babygirl2 +babybo +babybird +baby31 +baby11 +babolat +babe12 +babbette +b1teme +b1t3m3 +aztlan +azsxd +azizbek +azerok +axle +awake1 +avinash +avarice +avaava +autobus +autobody +authority +austin20 +aussie1 +august8 +august19 +august10 +augie +audubon +audre +audit +audi5000 +attilio +attempt +atonal +asuka +astrolog +astrodog +astras +astra12 +astor +astaire +asta +assorted +associat +asso +assess +ass904 +aspirina +aspirant +asparagu +askold +askari +askar +asianlov +ashley22 +asdqwe12 +asdfzxc +asdfvcxz +asdasda +asd123asd123 +asawako +as2579 +as12az23 +aryan +artist1 +artillery +arthur69 +arther +arthal +artemi +artem2000 +artem1994 +arte +artboy +arsene +arsenal7 +arsenal6 +arpeggio +arno +arnette +armyman +armyada2 +arizon +aris +arguments +aregstyl +archimed +arbuckle +arapahoe +aradia +arachne +aqwsde +aprile +april9 +april4 +april30 +april29 +april2 +appraise +apppatch +apples10 +appleby +apocalipsis +apart +anxious +anushka +antwerp1 +antonin +anton1992 +antikiller +anthony12 +antena +ante +anniee +annieb +annada2 +annabella +anna88 +anna1994 +anna1992 +anna1979 +anna1 +anjaanja +anitra +aniolek +animales +animal2 +angelfac +andyboy +andy852 +andy22 +andria +andrewb +andrew33 +andrew00 +andrea69 +andrea00 +andranik +anastasya +anastaci +anand +anal69 +amy1 +amulet +amstrad +amoros +amorcito +amoramor +ammonia +amino +aminka +amiga500 +amg921 +amber9 +amber12 +amaranta +amar1111 +amali +alysia +alycia +alvarito +alucard1 +altern +altec1 +alta +alstott +alsa4you +alphabravo +alpha135792468 +alouette +alomar +allybong +alltime +allpro +allora +alloallo +alleyoop +allende +allall +alkogolik +alkash +alize +alisaalisa +alimov +alihan +algiers +algae +alf123 +alexandro +alex88 +alex87 +alex73 +alex66 +alex24 +alex1989 +alex1983 +alex06 +alesi +aleksey1986 +aleister +aldebaran +alanon +alania +alaine +aladino +akron +akira123 +akiko +akiaki +akella +akarkoba +ak471996 +ajmccl +airtime +airshow +aimhigh +aikman8 +aika +aigerim +agustus +aguil +agent86 +against +afternoon +afriend +afnbvf +afireinside +afghanistan +afc1903 +afafaf +aeonflux +aekdb1 +adoxreadme +adonis1 +adolphus +adnan +admirals +adm15575 +adidas99 +adidas23 +adeola +adelheid +addition +adders +adamss +adamas +acuratl +activex +across +acotec +ackbar +acidbath +achill +ace2luv +accurate +access10 +abuelita +abubakr +abnrgr +abercrombie +abe5 +abcd123456 +abcd1 +abccba +abababab +ab12345 +aaurafmf +aaaddd +aaaaaa11 +aaaa1 +aaa666 +aaa333 +aa123456s +a6543210 +a3930571 +a2s3d4 +a112233 +Zxcv1234 +Zachary1 +ZEPPELIN +Z123z123 +Xc473tp +Wildcat +Werner +Welkom01 +Waterloo +Water1 +Warriors +Walter1 +Wallace +WaPBBS +WSBadmin +WHATEVER +W1408776w +Vv127pr +Vs310ct +Voyager1 +Vanessa1 +VOODOO +VINCENT +VERONICA +Ukraine +Twisted +Turkey +Tucker1 +Truck1 +Tristan1 +Tornado +Topgun +Tomcat1 +Timothy +Time1 +Therock1 +Theodore +Teresa +Tdutybq +TdfqUgL5 +TWEETY +TOMCAT +TINKER +TINA +TERESA +TATIANA +System1 +SyncMaster +Sylvia +Swordfis +Sunset +Sunday +Sundance +Stone +Stewart +Start123 +Stacey1 +St123st +Sparta +Spain1 +Smoke +Smitty +Smiley +SmartNav +Simpson1 +Silkeborg +Shorty +Sexyred1 +SetupENU2 +Sergi +September +Sebastia +Scripts +Scotty1 +Sanchez +Sampson1 +Sammy +Saints +SYDNEY +SWALLOW +SSSSSS +SPLASH +SNAPON +SLICK +SINGLE +SIMON +SHEILA +SEXUAL +SERGEY +SCOTLAND +Russian6 +Rooster +Rock +Roberts1 +Ripple +Rider1 +Rhonda +Reggie +Redman +Raven +Rainer +Racing +RT3460014 +ROLLTIDE +RODNEY +RICORICO +REDUSER +Qwerty11 +Qwert1 +Qwe1234567 +Qq123321 +QWEASD +PvHpX6 +Pumpkin1 +Printer +Poseidon +Portugal +Porno1 +Pokemon1 +Pierre +Piccolo +Picard1 +Phillips +Pete +Penny1 +Penis +Pebbles +Pavilion +Patriots +Patches1 +Panthers +PUSSYCAT +POWER9 +PORN +PHILLIP +PERVERT +PEACHES +PASSION +Oscar +Online1 +Ns910cv +Nissan1 +Nielsen +Nick +Neptune +Ncc1701 +NYMETS +NT5IIS +NASTY +Mv943Fc +Muffin1 +Ms911sc +Mountai1 +Moore +Mmmmmmm1 +Milano +Michele1 +Mercede1 +Melinda +Mdmnis1u +Matt +Mark1 +Marissa +Marino +Marianne +Maria +Margaret +Marcus1 +Magnum +Magic +MITCHELL +MAXINE +MARLEY +MARIO +MARINES +MADMAX +MADMAN +Location +Lisa1 +LarterLarter +Lancer +LUCKY1 +LTM9z8XA +LOVELOVE +LOULOU +LOL5 +LIZARD +LIGHT +Kristin1 +Klingon1 +Kitten +Katrin +Katherin +Ka12rm12 +KEVIN +KATIE +Junior1 +Joey +Joanna +Jester1 +Jerome +Janice +Jackson5 +Jackie1 +JOSH +JESUS1 +JENNY +Itachi1995 +Is211tn +Irish +Inside1 +IMPALA +ILOVESEX +Hn261dn +Hershey +Heritage +Hennepin +Helpme +HelpHost +Helena +Helen +Heinrich +Hd764nW5d7E1vbv +Hayley +Hawaii50 +Hardcor1 +Hard +Hamburg1 +Hallowboy +HV120dv +HOUSTON +HOTBOY +HAMBONE +H1Y4dUa229 +Gringo +Graphics +Goldfish +Goldberg +Goforit1 +Goddess +Girl1 +Giovanni +German +Gautie +Gators1 +Gator1 +Galaxy +Gaeta +GOFORIT +FromVermine +Friday1 +Frederi +Fred +Florian +Flipper1 +Flash1 +Fish1 +Fireman1 +Findaupair007 +Fabian +FREDDIE +FLYERS +FLORES +FLASH +Es206en +Erik +Engineer +Eminem +Elliot +Edinburg +ENGINEER +ELIZA1 +ELECTRIC +Dustin +Durden +Dreamer1 +Drake +Domain +Dilbert1 +Dilbert +Dfcbkbcf +Desire +Denis +Demon666 +Defender +Darwin +DREAMER +DJAMAAL +DAVIDS +DANGER +Cricket1 +Common +Command +Chuck1 +Chuck +Christine +Chopper1 +Chiefs +Charmed +Celine +Cartman1 +Carolin1 +Camille +Camera1 +Camelot +Camaro1 +Calvin1 +Calling +Caesar +CRICKET +CORONA +CONTROL +CMiGTVo7 +CHUCKY +CHOPPER +CHAMPION +CARPET +CANNON +CANCER +CANADA +Building +Buffett +Bubbles1 +Brown +Brooks +Brent1 +Brazil +Braindea +Bradley1 +Booger1 +Boeing +Blues1 +Bigdick1 +BhRh0h2Oof6XbqJEH +Bersercer +Belmont +Becky +Beaver +Basket +Babygirl +BULLDOGS +BROTHER +BOOGER +BLACK1 +BISHOP +BIONIC +BIGBOOTY +BELLER +BEAUTY +BAXTER +BADASS +Australi +Attack +Aragorn1 +Apollo13 +Apache +Anubis +Angelika +Anfield +Andy +Anastasiya +Alpha +Alexander1 +Albert1 +Alabama1 +Ajax +Ad12345678 +Accessibilit +Aa12345 +APOLLO +ANNA +ANIMAL +ALEXANDE +ALASKA +ADRIAN +ACCORD +A514527514 +A12345a +9ujhashj +9otr4pVs +9i8u7y6t +997755 +9916 +9911 +9900 +98stang +9891 +987qwe +9874563210 +987321654 +9856 +98219821 +97ford +9791 +9731553197 +966966 +96385 +96321 +95jeep +9550 +9517883 +951236 +9512 +9498 +93939393 +9375 +93664546 +9231wcf +91929394 +91827364 +9121 +91191 +911112 +9107 +9105425888 +909909 +907629 +9035768 +9021090210 +9021 +9008 +8971 +89586 +89181502334 +890iop +89057003343 +8904 +890123 +8892 +8891xel +8891 +888666 +88552200 +8840 +881988 +8777 +876876 +8753 +86248624 +8591 +858888 +8554 +85258525 +8525 +8495 +8486 +84488448 +8400 +8252 +8246 +8216 +8202 +81818181 +8125 +80camaro +80972694711 +80808 +8080 +803803 +80361665abc +78aajuh +789999 +789951123 +789852123 +7897 +78967896 +789456123q +7880 +787899 +787898mich +7852 +7828962 +7827 +781227 +77sunset +7799 +77930117 +7777777q +777775 +777007 +7769 +7758521 +77557755 +773377 +770077 +7663 +7580 +755555 +7532159 +753214 +75315 +74827482 +7465 +74477447 +7423 +741qaz +741963852 +741369 +74125896 +7410258963 +7388 +7383 +7375 +7357 +7311 +7240 +7231 +7213 +720000 +71727374 +712712 +7106189 +7100 +70780070780 +7011 +700000 +6y7u8i +699999 +6981 +6973 +69716971 +696696 +6944 +69426942 +691702z +6896 +68916891 +67mustan +6771 +66mustan +6698 +66778899 +666xxx +666hell +666666s +66613 +6612 +65impala +6588 +6566 +6546 +6487 +64546454 +6443 +6425 +635csi +6312 +6309 +6280 +626626 +62432770 +620620 +6162 +6146 +613613 +6110 +6101988 +5seks7 +5962 +5900 +5888 +5858855abc +5847 +5744 +5711 +5708 +5689 +567432 +5662 +5657 +564738 +5616 +5610 +5606 +55775577 +557755 +5567 +5563 +555aaa +5559 +55555m +5542 +553355 +551155 +550606 +5500 +5491 +54745474 +5467 +5461 +5457 +54325432 +5429 +5418 +5390 +5356 +53535353 +5351 +5320 +52xmax +5283 +5277 +52745274 +5266 +5265 +5257 +52535253 +52525 +5250 +5241 +5234 +5233 +5231 +5227 +5219 +5217 +5214 +520131 +5175 +5152535455 +514514 +5131 +5119 +511511 +5114 +5110 +5072 +5071 +5063 +5032 +5022 +4sure +4rdf_king7 +4p9f8nja +4SolOmon +4991 +4972 +495812 +4928 +4923 +4917 +4903 +4899 +4891 +4875 +4865 +483483 +4815162342z +4770 +4762 +4758 +4752 +4731 +4714 +4702 +470000 +46824682 +4669 +466800 +46534653 +4645 +459228 +4591 +4572 +456963 +45683968 +4558 +4557 +455455 +454454 +4538 +4515 +4513 +451236789 +450450 +4501 +4496 +4494 +4478 +4462 +4460 +4453 +4449 +444587qw +444466 +4441 +44224422 +4414 +4403 +4348 +43344334 +4304 +4287 +4275 +426426 +4257 +4245 +423423 +422119 +4221 +4202 +420 +4195 +4175 +4162 +41144114 +40plusdd +4089 +4081 +4080 +4050328 +4050 +4042 +40302010 +4020 +4018 +3e4r5t6y +3dwe45 +3children +3927 +38dd +3833 +383295502 +3825968 +3776 +3762 +3760 +3734 +3704 +3700 +369987 +3660 +3647 +3642 +3616615a +361619 +358853 +3582 +3569 +3562 +3557 +354354 +3521 +35153515 +3500 +34erdfcv +3489 +3474 +3468 +3464 +345123 +3445 +3444 +344344 +3411 +3400 +3390 +3384 +3383 +33663366 +33445566 +3343 +3336 +33333v +33331111 +333123 +333 +33253325 +331199 +331133 +330033 +3288 +3272 +32663266 +3266 +325632 +3255 +325225 +32473247 +3235 +32343234 +32333233 +32303230 +3220 +32198 +321890 +321789 +321677 +32145 +32123212 +3195 +317537 +317317 +3164 +3157 +3156 +311rocks +311274 +311268 +31122006 +31121968 +31121957 +311096 +31101967 +31101966 +31101962 +311000 +310869 +31081962 +31081958 +310797 +310772 +310770 +310768 +31071999 +31071958 +31059 +310578 +310570 +310563 +310562 +31051966 +31051963 +31051956 +3104 +310370 +31032001 +31031999 +31031966 +31031957 +31031956 +310196 +310165 +31011999 +310101 +30seconds +3088 +304304 +3025 +301978 +3013 +301295 +301272 +301169 +30111966 +30111964 +301098 +30101997 +30101963 +300996 +300974 +300972 +30091999 +30091965 +30091959 +30081966 +30081963 +30081954 +300808 +300766 +30071956 +300673 +300664 +30061965 +30061958 +300596 +300593 +300569 +300567 +30051954 +30051953 +300499 +300498 +300496 +300473 +300467 +300466 +30041959 +300399 +300397 +30038 +30031967 +30031958 +300160 +2sexy4u +2q3w4e5r +2q3w4e +2br02b +2bon2b +2access +2W93jpA4 +2999 +2996 +2978 +296600 +2954 +2947251 +2934 +291987 +291269 +291266 +291196 +291168 +29112000 +29111997 +29111959 +291094 +291076 +291071 +291070 +291062 +291059 +29101969 +29101966 +29101965 +29101957 +29101955 +29101953 +290973 +290972 +29091962 +290870 +29082908 +29081961 +29081957 +290770 +290672 +29061966 +29061957 +290598 +290497 +290474 +290466 +29041966 +29041959 +29041957 +290395 +29038 +290376 +290370 +290366 +290199 +290168 +29012001 +29011969 +29011963 +29011958 +29011957 +29011955 +2882 +2871 +286685 +2858 +2848 +2826 +2823 +281987 +281269 +28122005 +28121967 +281194 +28111968 +28111962 +28111959 +281095 +281067 +281060 +28101968 +28101962 +28101960 +280972 +28091967 +28091963 +280873 +280869 +280864 +28082000 +28081959 +280793 +280698 +280696 +280667 +28061960 +280595 +280594 +280571 +28052000 +28051965 +280470 +280466 +280394 +280371 +280360 +28031969 +28031954 +280298 +280297 +28021961 +280195 +280171 +280167 +28011958 +28011957 +2782 +2778 +2777 +2775 +2769 +27442744 +2735 +27121958 +271198 +271196 +27112001 +27111997 +271096 +271070 +271064 +27101959 +27101958 +270998 +270993 +270973 +27092003 +27091998 +27091967 +27091966 +270896 +270893 +27082002 +27081999 +270797 +270772 +270670 +27061968 +27041958 +27031959 +27031958 +27031956 +270170 +270166 +27012701 +27011959 +2700 +2698 +2684 +2682 +26802680 +2674 +26622662 +2661 +2645 +2644 +2633 +2630 +2629 +261967 +261261 +26121968 +26121962 +26121958 +26112001 +26111969 +26111962 +26111961 +26111960 +26111958 +26111955 +261073 +26101968 +26101964 +260966 +260960 +260958 +26091964 +26081964 +26081960 +26072000 +26071968 +26071967 +26071963 +26071953 +260669 +260662 +260654 +26061963 +26061962 +26061957 +260565 +260562 +26051962 +26051958 +260496 +260474 +260472 +260471 +260470 +260468 +260467 +260375 +260365 +26032002 +26032000 +26031967 +26031962 +260272 +26022000 +26021957 +26021949 +26011958 +26011957 +2590 +258036 +2580147 +2567 +2547 +2543 +252252 +251299 +25121964 +25121961 +25121960 +25121954 +251199 +251196 +25112511 +25111969 +25111955 +251068 +25101969 +25101959 +250999 +250968 +250958 +25092007 +25091959 +250897 +25081961 +25081958 +25081953 +250769 +250761 +250697 +250673 +25061965 +25061964 +25061960 +250570 +250565 +250469 +25041965 +25041957 +250398 +250397 +25031954 +25028 +250266 +25021965 +25021956 +250170 +250165 +25012001 +25012000 +25011963 +25011955 +24beers +2489 +2470 +246969 +246813 +2467 +246642 +24622462 +245245 +2451 +2450 +2435 +2434 +2431 +241980 +2414 +241274 +241267 +24122412 +24121960 +241170 +24111999 +241100 +24108 +241074 +24102003 +240994 +240966 +240964 +24092000 +24091959 +240866 +240865 +24081959 +240777 +240772 +240768 +240763 +24072004 +24071998 +24071955 +240683 +240670 +240664 +24061961 +24061957 +24061956 +240606 +240597 +24051968 +24051964 +24051959 +240496 +24048 +240477 +24041967 +24041961 +24041959 +24041958 +240400 +240375 +24037 +24031965 +240297 +24021999 +240196 +24011998 +24011966 +24011963 +239239 +2388 +23843dima +2384 +238238 +23472347 +2340 +2329 +23272327 +232123 +231995 +23152315 +231296 +23121964 +23121957 +231175 +231173 +231160 +231159 +23111967 +231071 +23101969 +230999 +230973 +23091961 +23081957 +23081956 +230770 +230769 +23071960 +230667 +230666 +23062306 +23061958 +230565 +230560 +23051961 +23042001 +23041999 +230397 +230375 +230370 +230366 +23031963 +230267 +230263 +23022001 +23021949 +230173 +230168 +230166 +230165 +23011959 +230000 +2293 +228363 +22692269 +2268 +226688 +2258 +225225 +2251 +2237 +2236345 +223622 +22360679 +22342234 +22322232 +22299 +22233 +22228888 +222223 +222222000 +222221 +2219 +22182218 +2218 +221275 +22121959 +22121951 +22111963 +221067 +22101998 +220971 +22091966 +22091955 +22081961 +220798 +220762 +22072000 +22071959 +22068 +220667 +22061953 +22051976 +22051956 +220468 +220466 +220460 +220457 +22041963 +22041959 +220399 +220366 +220360 +22031964 +22031956 +220299 +22021964 +220173 +220170 +22012201 +22011967 +21952q +2184 +2171 +21692169 +2166 +2153 +2152 +2146 +2144 +213243 +21314151 +21202120 +21198 +2118 +2117 +211298 +211274 +211262 +21121997 +21121966 +21121960 +211199 +211177 +211173 +211160 +21102110 +21101959 +21099 +21091964 +21091958 +210874 +21082001 +21081968 +21081966 +21081964 +21081960 +210769 +210668 +21061998 +210599 +210595 +210564 +210498 +210470 +210464 +210361 +21031965 +21031960 +210303 +21022002 +21022001 +21021968 +21021964 +21021961 +21021959 +210196 +210173 +21011999 +21011965 +21011958 +21011955 +2090 +2089 +2073 +2071 +2051 +2045 +20402040 +2033 +202122 +20162016up +201296 +201277 +201273 +201259 +20122000 +20121970 +20121965 +20118 +201178 +201176 +201165 +201160 +201096 +201072 +201071 +201063 +201060 +20102007 +201010 +20100 +200999 +200975 +20091959 +200900 +200860 +20081967 +20081960 +20081953 +200799 +200764 +20071962 +20071960 +200666 +200665 +200659 +20062007 +20061963 +200600 +200596 +200574d +200479 +200473 +200471 +200468 +200462 +20041998 +20041962 +20041959 +20041950 +20031959 +20031955 +200299 +200293 +20028 +200266 +20021958 +2002111 +200210 +200202 +200168 +20011960 +2000000 +2-Oct +1winner +1w2e3r4t +1qaz1qaz1qaz +1qaz0okm +1q3e5t +1q1a1z +1nternet +1hello +1diamond +1buddy +1bubba +1bigfish +1a2a3a4a5a6a +1Yamaha +1Willie +1White +1Vvvvv +1Voyager +1Trouble +1System +1Super +1Suck +1Stella +1Simpson +1Raider +1Rachel +1Qwert +1Peanut +1Music +1Muffin +1Mountai +1Mookie +1Manager +1Louise +1London +1Little +1Knight +1Justin +1Jerry +1Jake +1Hhhhhhh +1Hard +1Happy +1Genesis +1Frank +1Flyers +1Fish +1Elvis +1Dogs +1Doggie +1Digital +1Dddddd +1Dave +1Cookie +1Christi +1Chicken +1Chester +1Cassie +1Bullshi +1Booger +1Bigtits +1Bandit +1Asdfghj +1Alexis +1Alex +1Albert +1Abcdef +19thhole +19delta +199828 +199811 +1997199 +199612 +19960610ilja +199513 +199512 +19942010 +1994200414 +19941996 +199419 +199406 +199329 +199323 +199314 +199312 +199302 +199301 +199292 +19922008 +199203 +199202 +199191 +199123 +199119 +199105 +199090 +19902006 +199006 +199004 +19892009 +198918 +198907 +19888891 +198822 +198802 +198720 +19871988 +198715 +198707 +19870 +198620 +19852906 +198526 +198524 +19851987 +1985198 +198510 +198504 +19850 +198421 +19841986 +198419 +198415 +198383 +198319 +19822 +198124 +198122 +198023 +19802 +19800 +197888 +197824 +197822 +197802 +197711 +197610 +197519 +197511 +19732846 +197321 +19731981 +19730 +1972197 +197171 +197131 +19688691 +196500 +19381938 +19361936 +192192 +191993 +191989 +191194 +191174 +191173 +191165 +19111967 +19111963 +191079 +191075 +191071 +19102000 +19101954 +190977 +190976 +190966 +190963 +19092001 +19091959 +19091956 +190872 +19082001 +19081963 +19081962 +19071967 +19071962 +190680 +190677 +190668 +19061964 +19061962 +190577 +190565 +19051999 +19051968 +19051966 +19051964 +19051956 +19051953 +190494 +19042002 +190394 +190392 +19038 +190371 +19032009 +19032001 +19032000 +19031963 +19031960 +19031955 +190299 +190284 +190268 +19022000 +19021999 +190179 +190148 +19011961 +19011958 +19011901 +19001900 +189189 +18901890 +1886 +1882 +1878 +1871 +18631863 +1854 +1852 +1842 +1840 +1835 +1826 +18241824 +1823 +18201820 +181995 +181264 +18122003 +181218 +181162 +181096 +181072 +181071 +181062 +18101958 +180998 +18097 +180961 +18092001 +180894 +180867 +18081965 +180770 +180765 +18071961 +180666 +18062001 +18061961 +180596 +180564 +18051967 +18051959 +180497 +180471 +180463 +18041965 +18041964 +18041951 +180369 +180366 +180362 +180266 +180197 +180166 +180161 +18012000 +18011949 +179328 +1783 +1781 +177777 +1756 +174174 +1736 +172165 +171267 +17121965 +17121958 +171195 +171172 +171170 +171164 +17111965 +17111957 +171096 +171092 +17108 +171078 +171074 +171069 +171066 +171065 +171060 +17101962 +17101957 +170965 +17091960 +170860 +17081965 +17072002 +17071964 +17071954 +170699 +170676 +17062002 +17062000 +17061956 +170595 +170592 +170571 +170563 +17051999 +17051962 +17051958 +17051705 +170469 +170466 +17041999 +17041997 +17041958 +170372 +170358 +17031969 +17031968 +170297 +170295 +17028 +170271 +170265 +170258 +17021960 +170177 +17011958 +16666 +1665 +1662 +164427 +1644 +161987 +161985 +161297 +161268 +161251 +16121967 +16121959 +16111960 +16111959 +16111958 +16111611 +16108 +161063 +161057 +16101965 +16101963 +16101953 +160997 +16092000 +16091958 +160875 +160865 +160861 +16081999 +16081969 +16081608 +160799 +160796 +160771 +160770 +16071968 +16071955 +16062003 +16062000 +160571 +16051963 +16051954 +160496 +160467 +16041960 +16041951 +160400 +160369 +16031964 +16031960 +160276 +16022008 +160169 +160166 +16011965 +159654 +15951 +1595 +15935728 +1592648 +1585 +1581 +1566 +1561 +15541632 +1544 +1543 +15421542 +1541 +1536 +1531bs +15301530 +15281528 +15211521 +151974 +1519 +15161718 +15161516 +15141312 +151299 +151260 +15122006 +15121966 +15121961 +15121959 +151161 +15108 +151075 +151070 +151067 +15101997 +150971 +15091959 +150898 +150865 +15081964 +15081954 +150771 +150769 +150759 +15061966 +15061956 +15061955 +150598 +150570 +15052001 +15031966 +15031958 +15031951 +150297 +150268 +15021954 +150199 +150198 +150173 +150168 +150165 +15012001 +14u2nv +1486 +148148 +1480 +14791479 +1478965 +14751475 +147369a +1472580 +14714714 +1464 +1444 +1442 +143143143 +14215469 +142142 +14211421 +1416 +14121999 +14121967 +14121966 +14121965 +141199 +141174 +141166 +14111999 +14111967 +141069 +141067 +141062 +14101999 +14101964 +14101960 +14101957 +140972 +140969 +140959 +14091967 +14091955 +14081963 +14081950 +140770 +140762 +14071958 +140669 +14062001 +140574 +140566 +140561 +14052002 +14051958 +140499 +140496 +140470 +14041959 +140404 +140376 +140371 +14031967 +140276 +140256 +14022002 +14022001 +14022000 +140177 +14011963 +14011957 +1371 +13651365 +13591359 +13581358 +1351 +13456 +1344 +134267 +1335 +1329 +1328 +1324354657 +131995 +131991 +131984 +131619 +131297 +131272 +131267 +13117 +131165 +13112001 +131096 +131093 +131066 +130998 +130970 +130968 +13091966 +130899 +13081999 +13081998 +13081971 +13081960 +13081957 +130808 +130767 +130764 +13072000 +13071959 +13071957 +130667 +130660 +13061965 +130599 +130570 +13051962 +130496 +13041959 +130399 +13031958 +130298 +130273 +130268 +130260 +13022001 +13021961 +13021955 +130196 +130158 +13011967 +12sambo10 +12qwasyx +12beers +12andriy14 +127721 +127576 +127560 +12691269 +1262 +12561256 +125480 +12471247 +124563 +124321 +123zxcv +123z123 +123vvv123 +123rep +123lol +123happy +123gjm +123ewqasd +123dog +123bob +123alex +1235123 +1234rtyu +1234q1234 +123498 +123478 +12345ru +12345qazwsx +12345qa +12345q12345 +12345h +123456zxcvbn +1234567n +1234567j +1234567891011 +1234567890qwertyuiop +123456789* +12345677654321 +123456- +1234554321a +12340 +12332111 +123233 +123182 +123177 +122896 +122874 +122867 +122862 +122782 +122678 +122599 +122480 +122379 +1223505sayana +12233 +122185 +121999 +121992 +12198 +121946 +121899 +121869 +121577 +12141618 +121401 +121374 +121371 +121369 +121354 +1213456 +1212aa +12122002 +121197 +121192 +12118 +121169 +121164 +121160 +12111966 +121099 +121058 +121054 +12102001 +12101998 +12101963 +12101961 +12101954 +12099 +12091960 +120860 +120859 +12081966 +120793 +12071961 +12071957 +120668 +120664 +120659 +12061966 +120562 +120558 +12051957 +120467 +120460 +12041957 +12032002 +12032001 +12031967 +12031956 +120261 +120256 +12021962 +120203 +120194 +120165 +12011962 +12011961 +12011957 +11771177 +116211 +114466 +1135 +113456 +11331133 +113257 +1132 +112774 +112769 +112763 +112699 +112371 +112271 +112198 +112192 +112163 +111997 +111989 +111985 +111977 +111971 +111966 +1116jm +111297 +11128 +111272 +111222333444 +11112005 +11111968 +11111957 +11111955 +111111s +1111111111q +111097 +11108 +111079 +111071 +111070 +111066 +111062 +11101998 +11101959 +11101958 +11101957 +11101775 +111000z +110956 +110873 +11081958 +11071965 +11071958 +110708 +110698 +110672 +110661 +110606 +110599 +110566 +110562 +11051953 +110501 +110499 +110498 +110459 +110453 +110450 +11041967 +11041962 +11041961 +110400 +110372 +11031103 +110298 +110267 +110266 +11021965 +11021102 +110199 +110170 +10dogs +10691069 +1047 +1046 +103175 +103173 +103079 +102485 +102475 +102380 +102269 +102175 +10210 +10201 +101985 +101983 +101980 +101975 +101972 +101966 +101965 +101774 +101760 +101664 +101481 +10141014 +101267 +101255 +10121962 +10121956 +101213 +101165 +101161 +10111967 +101058 +101023 +10101999 +10101954 +10101950 +100971 +100961 +10091964 +10091960 +10091958 +100900 +10088 +100868 +100858 +10081008 +100798 +100764 +10072006 +100664 +100662 +100657 +100656 +10061965 +10061962 +10061958 +100599 +100499 +100453 +100362 +100361 +10031965 +10031959 +10031958 +10031956 +100298 +100262 +100256 +10010 +10000000 +0px +0999 +0989 +0976 +091982 +091296 +09121968 +09121966 +09121960 +091166 +09111997 +09111963 +09111962 +09111960 +09111959 +091075 +091074 +091070 +09101970 +09101966 +09101965 +090964 +09091960 +09081968 +09081967 +09081960 +090789 +090770 +09071959 +090696 +09061960 +09061956 +09051959 +09051955 +09051954 +090475 +090474 +090467 +09041961 +090376 +090374 +090370 +090369 +090361 +09031969 +09028 +090268 +090262 +09021963 +09021957 +090195 +090192 +090179 +090171 +09011963 +0891 +0885 +0879 +0876 +0874 +0864 +0857 +0814 +081297 +081275 +081273 +081271 +081267 +081265 +081264 +081258 +08122001 +081187 +081175 +081172 +08111999 +08111968 +08111965 +081097 +081079 +081078 +081075 +081073 +081068 +080978 +080972 +080971 +080960 +08091969 +08091968 +08091963 +08082009 +08082006 +08081998 +08081965 +08071965 +080706 +080695 +08061957 +080598 +080594 +080575 +080564 +080561 +080477 +080476 +08041999 +080393 +080373 +080370 +080266 +08021954 +080197 +080194 +080178 +080173 +080166 +08012000 +08011999 +08011961 +0799 +0779 +0772 +071299 +071296 +071273 +07121961 +07121957 +071195 +071193 +071176 +071165 +07111955 +071099 +071064 +071061 +07102000 +070997 +070977 +070974 +070972 +07091966 +07091961 +07091957 +07091955 +070897 +070872 +070871 +07081965 +070793monolit +070769 +070765 +070706 +070692 +070672 +070662 +070660 +07061998 +070598 +070597 +070594 +070586 +070570 +070564 +07041970 +07041957 +07041956 +07041954 +070395 +070376 +07032000 +070268 +070266 +07021965 +070181 +070170 +070167 +070166 +07011996 +0697 +062676 +06251106 +062001 +061981 +061974 +06121999 +06121972 +06121965 +06121964 +06121962 +061173 +06111999 +061099 +061096m +061091 +061081z +061073 +06101963 +06098 +060964 +06091968 +06091966 +06082000 +060780 +06071999 +06071961 +06071953 +060708q +060667 +060665 +0606198 +06061967 +06061965 +06061957 +06061956 +06061954 +060580 +060579 +060563 +06051966 +060478 +060475 +060474 +060472 +06041958 +06031967 +06031963 +060293 +060284 +060272 +060268 +060255 +06022009 +06022001 +06021955 +060160 +06011960 +0579 +0575 +0568 +052769 +051582 +051373 +051267 +05121962 +05121952 +05118 +05112000 +05111966 +05111965 +05111963 +051093 +051074 +051071 +051066 +051064 +051061 +05101997 +050974 +05092000 +05091959 +050905 +050898 +050866 +05081959 +05081957 +05081956 +05081955 +050798 +050796 +050769 +05071958 +050699 +050695 +050672 +050667 +05061999 +05061970 +050607 +050605rostik +050598 +05058 +050558 +05052008 +05051955 +050495 +050494 +050472 +05041964 +05041961 +05041956 +050379 +050377 +050375 +050373 +050364 +05031957 +050272 +050268 +050267 +05021959 +050205 +050179 +05011959 +05011956 +05011955 +0495 +0491 +0459 +042898 +041370 +041298 +041261 +04122001 +04121958 +041197 +041195 +041163 +041156 +04111963 +041095 +041077 +041070 +04101964 +04101961 +04101959 +04101958 +04101954 +040997 +040995 +04098 +04092000 +04091964 +04091958 +04081968 +040794 +040770 +040768 +04071968 +04071957 +040695 +040672 +040662 +0406198 +04061967 +04061960 +04061957 +040568 +040562 +040558 +04052005 +04052000 +04051960 +040472 +040464 +04042002 +040397 +040394 +040389 +040370 +04032001 +04031960 +04031955 +040260 +04021959 +040197 +040176 +040160 +04011966 +04011963 +04011955 +0391 +0384 +0380 +0379 +0356 +033033 +03210321 +031976 +031660 +03130313 +031292 +031288 +031260 +03121966 +03121965 +03121960 +031170 +031168 +031167 +031163 +03111965 +03111961 +03111958 +031091 +031070 +031067 +03102002 +03101999 +03101953 +030994 +03091959 +03091957 +030902 +030896 +030862 +03082007 +03081959 +030803 +030777 +030773 +03072002 +03071997 +030663 +03061969 +030559 +03052007 +03051959 +030499 +030467 +03042006 +03042003 +03042002 +03041999 +03041960 +03041959 +030399 +030396 +03031957 +03030 +030297 +030271 +030268 +03021961 +03021955 +030193 +030167 +030157 +03012002 +0287 +0283 +0282 +0269 +0260 +0235 +0231 +0230 +021979 +021961 +021498 +02143006 +021296 +021196 +021176 +021173 +021172 +02111967 +02111966 +02111964 +02111961 +02108 +021070 +02101965 +02101964 +02101953 +020999 +020969 +020960 +02091966 +02091963 +020898 +020897 +02081953 +020775 +020768 +020671 +020668 +02062006 +02061963 +020592 +02051998 +02051966 +02051959 +02051956 +020472 +02041961 +02041953 +020391 +020367 +02032011 +02032001 +02031965 +02031960 +02031954 +020293 +020175 +020174 +020172 +0198 +0196 +0195 +0193 +0187541 +0169 +0163 +01280128 +012583 +012578 +012177 +0119 +011294 +011266 +01121997 +01121962 +01121958 +011192 +011166 +01111968 +01111960 +011094 +011078 +01102002 +01101966 +01101962 +01101961 +01101956 +010893 +010861 +01081961 +010773 +01072011 +01072002 +01071970 +01071954 +010673 +01062005 +01062001 +010565 +01051954 +01051953 +01051949 +010469 +010468 +010456 +01041949 +010400 +010395 +010370 +010369 +010362 +010359 +01032007 +01032002 +01032001 +01031958 +01031957 +01031952 +01030 +010299 +010271 +01022007 +01021958 +01021956 +010191m +00seven +0099 +0056 +0045 +0040 +002112 +002002 +001983 +001966 +001963 +001962 +001002003 +000999888 +000911 +000357 +000311 +000019 +000015 +000000q +.kbxrf +#NAME? +!QAZ1qaz +zzz333 +zxcvbnm2 +zxcvasdfqwer +zxcqwe +zxc456 +zxc123456 +zuzu +zulu44 +zsxmr7sztmr +zotova +zooker +zolushka1 +zobrdjlrb1 +zman +zkexibq +zjhhjhkj +zippers +zipper1 +zinger48 +zima2011 +ziggys +zgmf +zetazeta +zero11 +zero0000 +zergling +zenner +zenit1 +zeke11 +zeeman +zedzed +zcar1122 +zaqxswcde123 +zaq12 +zapret +zapat +zamorano +zamir +zalman +zakary +zainab +zafar +zaebalo +z159753 +z1234567890 +yves +yuschen +yurkamaliy +yungyung +yummmy +yucca +ytrhjvfycth +ytrewq11 +ytrew +ytdpkjvfti +yoyoy +yourmum +yourface +yotefan +yoshida +yooper +yomama1 +yoda99 +yoda69 +yobaby +yjuufyj +yjcjhju +yinyan +yfnfif2010 +yfcn.irf +yfcmrf +yesssss +yesno +ydnarb +ybytkm +ybrjulf +ybrjkm +ybrjkfbx +ybrbnby +yasuko +yashin +yannic +yank33s +yamoon +yamama +yamada +yadira +yachts +yabadaba +yK66o2kzpZ +xyzzyxyz +xxyyzz +xxx69xxx +xxlolxx +xthntyjr +xlanman +xflavor +xep624 +xegfxegc +xatuna +x1x2x3x4 +wylde +wwwwww1 +wwweee +www12345 +wwfraw +wuhan +wsxcde +wsgktyjr +wretch +wreath +wrath +wqwqwqwq +wqsaxz +wpatop +wpakey +wowowo +worthing +wordword +wordpass1 +wordman +word12 +woodtree +woodelf +wonker +wonderwoman +womba +woman1 +wolfwood +wolflord +wolcott +wizzer +wizard01 +wittmann +witchblade +wiosna +winter10 +winter06 +winter04 +wintcher +winston9 +winslet +wingate +windowsn +windom +wilson2 +willie2 +willian +willee +wildwolf +wildcat8 +wildcat7 +wifeyswo +wienie1 +widzew +whoopie +whoisit +whitne +whitestar +whiskas +whirlwin +whipple +wheatley +whatisup +whatisth +whatfor +wetland +wetdream +westy1 +westside1 +westpoin +westminster +westfiel +wessel +wesle +wertyuio +wentworth +wench +wellwell +weiwei +weirdal +weee +weeder +wedding1 +webste +websex +weber1 +webbie +weaknesspays +we5471w +wdsawdsa +wcrfxtvgbjy +wbemsnmp +waynee +wayne123 +waylande +way2cool +waxman +waverley +waveride +wavemsp +waukesha +wattle +water911 +watchme +watchers +wastelan +warty +warstein +warnow +warmth +warlok +warburg +wangchun +wamozart +walpole +walmart1 +walfisch +wakefield +waite +wags +wagons +wacky +waar +waaagh +w4st3 +w4nk3r +w46ws7ufs +w2e3r4 +w1w1w1 +w11111 +vyjujltytu +vwpolo +vvvvvvvvvv +vulcano +vtnhjgjkbnty +vtnhj2033 +vtnfkk +vrijheid +vp3whbjvp8 +voyager7 +vova1234 +vova12 +vortech +vorobei +volvo480 +volvic +volleybal +volks +volkl +vodkas +vocom401 +vlasenko +vladisla +vladik123 +vlad2010 +vitriol +vitek +visible +visacard +vipper +viper999 +viper13 +viorel +violets +vinipuh +vindaloo +vincente +vince123 +vinayaka +villeneuve +viktorovich +vikto +vikram +vika2005 +vika2000 +vika1989 +vika12345 +vicfirth +vice +vgfun3 +vfvjxrf1 +vfvfvbz +vfrcbvtyrj +vflb22 +vfksijr +vfkmlbds +vfhvsirf +vfhreif +vfhbz007 +vfhbyf1 +vfeukb +vezugu7 +vesy7csae64 +veselov +veryhorn +verycool +verve +versace1 +vernie +vernal +vergessen +verbose +venkata +veniamin +venecia +velocidade +velma +velhjcnm +vehfrfvb +vegetabl1 +vegeta1 +vegas99 +vbyfcnbhbn +vbkkbjyth +vbc7ui +vaxvax +vanvan +vano +vane4ka +vandyke +vandana +valuta +valley1 +valentinka +valente +valarie +vaibhav +vahagngsg +vadim2000 +vadim1 +vacances +v5150h +v1o2v3a4 +v1l2a3d4 +v12345678 +v060197 +uzasjhas +uzalknap +uyjvbr +ustinova +usnret +usmc0331 +usmail +usbank +usa2003 +usa1776 +usa111 +urinal +uriel7 +upward +upupup +unnamed +unknow +unisys +unisol +uniqu +underwood +underwater +undergroun +uncanny +umlaut +ujyxfhjdf +ujkjc1 +ujhjcrjg +uehby92pac +udon0101 +uce1 +ublhjgjybrf +uandme +u2u2u2 +tyson2 +tyler5 +tygrys +twiztid1 +twistys +twister2 +twinkies +twilight1 +twiglet +tweezer +tweeling +tweek +twat69 +twat123 +tvtvtv +tusker +tushkan +turtle3 +turtle2 +turret +turok +turnbull +turmoil +turkey10 +turboz +turboman +turbo123 +tumeio +tumbin +tugnut +tuananh +tslabels +tscmsi01 +trudie +trottier +trojan1 +trofimov +trodat +trinity7 +trimix +trim +trifle +trifecta +tress +trent1 +tremble +travis11 +traverse +travelmate +trasfiv +transa +trandafir +traktor1 +trainer1 +trafficracer +tr1n1ty +toulous +toulon +touchy +touchit +tottenham1 +tosca1 +tortola +tortik +torsion +tormoz +torin +torero +tore +toptotty +topping +topdogg +topcon +toothy +toools +toolkit +tool462 +tonystar +tonya1 +tonto123 +tomson +toms +tompetty +tommyw +tommot +tomi +tomgreen +tombola +tomato1 +tomates +toller +toll +toko +tokenbad +tofast +toetoe +toeman +toctoc +tochka +tobyboy +toby1234 +toastie +tjones +titus1 +titsass +title +titicaca +titanic2 +tita +tireman +tips +tippytoe +tipple +timothy8 +timofeeva +timmons +timetogo +time1 +tilden +tilburg +tiiger +tigrou +tigras +tightcunt +tigger7 +tigger21 +tigger19 +tigger10 +tigger00 +tigerlily +tiger9 +tiger74 +tiger62 +tiger44 +tiger4 +tiffin +tiffer +tiffanys +tierr +tiemeup +ticino +tibbar +thunder6 +thunder4 +thunder123 +thunder12 +thumper2 +thuggish +thug4life +thtvtyrj +thrush +thrower +throbber +threesix +threekid +threads +thorvald +thorin +thor13 +thomsen +thomas35 +thirteen13 +thinks +thienthan +thewad +theteet1 +thestuff +thesims3 +theriver +thepope +thepain +themost +themes +themann +thelove +thelord +thelion +thekop +thegreat1 +thegoose +thefall +thedude1 +theblack +tfjunwptzsjp +teymur +textile +texast +texas69 +tevion +tettone +tessera +tessadog +tescos +terryter +terre32 +terrain +terese +tequilas +tenth +tenretni +tenfour +tenafly +tempos +templar1 +tempfire +tempe +telman +tellurid +telecono +tekken4 +teet +teeoff +teenz +teddy69 +technici +techn9ne +techn +teague +tdutybq1 +tdutyb +tdhjgf +tbone69 +taurussh +taunus +taukappa +tatto +taterbug +tatas +taster +tastatur +tasmin +tashadog +tasha2 +taser334455 +tascha +tarzan1 +taryn +tarquin +tariq +target74 +tarantin +tarantas +tantor +tanning +tankgirl +tammany +tameka +talitha +takhisis +taifun +tactic +tacos1 +tablada +tab123 +system2 +sypher +syndikat +syncoo +syncmaster740n +symbiote +sydnie +sydney2 +swpakey +swoop +swing1 +swine +swimteam +sweetums +sweetone +sweetlip +sweetiepie +sweepstakes +swedes +sweaters +swaswa +swart +svizzera +sveta12 +svensps820 +suzukirm +suzevide +susant +susannah +surrender +surin50 +surfmore +surety +surefire +supple +supervis +superuse +superpass +supermod +superkev +superk +supergas +superflu +super98 +supe +supaman +sunglass +sung +sunflower1 +sundin13 +sunday1 +sundari +sundaram +sunda +sunako +sun32 +summit1 +summer7 +suka11 +suites +sugary +sugar123 +suesue +sucks1 +suckoff +suckmeof +sucke +success7 +subtle +subhanallah +stunt101 +stunner1 +strum +struan +stroitel +strobe +strips +strangel +straits +stosh +stormer +stone2 +stocazzo +stmirren +stmartin +stinkpot +stingy +stinge +sthein +stewart2 +stevied +stevevai +stevens1 +steven11 +stevec +steveb +steve0 +stev +stesha +sterno +steps +stepka +stephanie1 +stelkhs +steelbed +stearman +stealth2 +stcroix +stasis +stas123 +starscream +starhawk +stargatesg1 +starchild +starbury +star01 +stan007 +stampy +stalport +stalker777 +stained +stabilmente +sssaaa +ssassa +sretep +srawrats +sr20de +squiggle +squeal +squaw +square1 +spxports +spurs21 +spurs01 +spur +spunky1 +spud22 +sprung +sprugass +sprock +spritz +sprinkler +spring19 +spree +sportsmen +spocky +splurgeola +spitball +spiros +spillo +spike9 +spike12 +spiderman2 +sphynx +sphincte +spengler +speedbal +spectre1 +speckles +species +speakes +sparkle1 +spankher +spangle +spader +spacedog +space123 +soysauce +souths +southampton +sousa +sourire +soulglo +sosweet +sosodef +sore +sonya1 +sonu +sonnyg +sonnyb +sonne1 +sonic12 +sone4ko +sommer68 +somme +someguy +solrac11 +solomio +soloio +soloflex +solnushko +solniwko +solit +solids +sole +sold +solano +sol123 +sokol1 +sohot +sodom +sodibe +socklint +soccer03 +snowday +snow69 +snort +snoopy77 +snoopy5 +snoopy25 +snoop123 +snejinka +snejana +sneaky1 +snapscan +snakeyes +smxx5333 +smutman +smokey69 +smithson +smirnof +smeshariki +smartone +smallone +smallman +smabokk +slumber +slots8 +slots1 +sloboda +sllottery +slit +slipknot66 +slipknot123 +slimmer +slimey +slickster +slick2 +slbcsp +slawek +slastena +slappers +slapnutz +slammer1 +slainte6 +sl1210 +skyrider +skull1 +skubrick +skrunt +skier +skeptic +sizemore +size13 +sixpak +sitt +sisco1 +sirius1 +sinker +sink +sinilill +singh1 +singers +simoncat +simon2 +simba12 +sima +silverstone +silvermoon +silveria +silverha +silverbi +silverbe +silver66 +silver123 +silmarillion +silica +silent1 +silencio +sigmas +sigma7 +sierra12 +siegi +siege +sideburn +siccmade +sian +shyone +shrestha +shoshone +shorinji +shorin +shooter2 +shone +shoehorn +shockwave +shoal +shkiper +shittt +shits +shithea +shithapp +shitfire +shitbrick +shisha +shippuden +shipman +shipley +shinichi +shiner1 +shikha +shibainu +shhh +sherma +sherm +sheldon1 +shelby2 +shelby01 +shelbi +shekinah +sheetz +shebas +shear +shawnd +sharra +sharmila +sharm +shark99 +shark7 +shareef +shapes +shannon7 +shanelle +shandor +shambles +shalom1 +shahin +shagwell +shagadel +shae +shadwell +shadowrun +shadow77 +shadow6 +shadow21 +shadow20 +shadey +shaban +sgi4501 +sfetish1 +sexyrexy +sexyma +sexygir +sexycat +sexybutt +sexyboys +sexybody +sexrocks +sexlife +sexkitten +sexgirl +sex4fun +several +sevendust +serum +serseri +serra +seroga +serious1 +sergius +sereja +serega88 +sereg +serbian +septimus +sept25 +senthil +sensitiv +semarti +selin +seliger +seismic +seeya +seemann +seeley +seeitnow +seeds +seedless +seeall +seattle7 +seasick +seamaste +sealion +sealed +seacrest +seabird +sdsd +sdfsdfsd +sdfghj +sd90mac +scuttle +scsi +scrump +scruffy2 +scoutsou +scottg +scotte +scott24 +scorsese +scoremag +scorcher +scops +scooter8 +scitex +scissor +schweden +schwag +schultz1 +schnulli +schnuff +schmidty +schlepp +schillin +schilder +schatje +schafer +scarlet2 +scanners +scanjet +scampy +sbcgloba +saysay +saxon1 +savoie +savita +saviour +satriani8 +satin1 +satan69 +sassys +sasha99 +sasha2002 +sasha1990 +sasasasasa +sari +saran +sarahjan +sarah9 +sarah18 +sarah12 +sara1234 +sara11 +sapsap +sapiens +santtu +santac +sanrio +sanne +sankofa +sangoku +sandy01 +sandra69 +sandma +sandieg +sandburg +sandbag +samurai7 +samuel2 +samuel11 +samuel01 +samsung9 +samson01 +samoyed +sammysos +sammysam +sammy3 +sammy111 +sammy01 +sammie01 +sam12345 +salvo +saltwater +salocaluimsg +salamon +sakana +saiyajin +saira +sainte +sahtm112 +sahtm084 +sahtm056 +sahtm039 +sagara +safron +sadvceid +sacore +sabrina2 +sabot +saber6 +sabber +sabasaba +saadmweb +saabsaab +s7777777 +s55555 +s3sav3d +s1mple +s1234 +ryuken +ryan24 +ryan2000 +rvdrvd +ruzanna +rustyw +rusty02 +rustie +russell7 +rushing +rushan +ruper +runs +runn +runescape123 +ruiner +rufino +ruffryders +rucker +ruben1 +rtyuiop +rtyfgh +rtrt +royce59 +rowrow +rover2 +round1 +roughsex +roughrid +rott +rotate +rosy +roswell1 +rostock +rossie +rosiedog +rosenrot +rosemont +rose22 +rosana +rosaleen +rosale +roping +ropers +root66 +rooftop +ronjeremy +ronja +roni +ronaldinho10 +ron123 +romulan +rominet +romani +roma1995 +rolly +rollon +roller45 +rogerg +rodnik +rod123 +rockyb +rockish +rocket22 +rocket12 +rockers +rockdog +robinso +robin2 +robertr +robertj +robert71 +robert69 +robert24 +roberson +robbo +robbery +robbert +rob +roadrun +rkfccbrf +rjytwcdtnf +rjyjdfkjdf +rjvfhjdf +rjrfby +rjkjrjk +rjdfkm +rjcvtnbxrf +riyadh +rivet +rivers1 +rita123 +risk +rise +ripples +rintintin +ringo123 +rinat +rikitikitavi +ridder +rickson +rickslic +richardc +rich83 +rhumba +rhodesia +rhett1 +rfnhecz +rfkfiybrjd +rfhlbyfk1 +rfgexbyj +rewers +revlon +review00 +retard1 +restrict +respond +respec +resources +resolve +resistance +resipsa +reset123 +reprah +repo +repmvtyrj +repete +repeat99 +renzo +renrew +reman +relics +relentless +relative +relapse +reisen +rehana +regulate +regor +regnig +regnar +registration +reggit +regal1 +refugee +reflect +referenc +reeve +reeree +redtiger +redtide +redsun +redsox21 +redseven +redru +redrocks +redredre +redrange +rednef +rednec +redmen +redma +redline1 +redhea +redgrave +reddot +redcoat +redcell +redbook +red718 +red555 +red500 +red100 +recorder +recliner +reckon +recently +receiver +rebellion +rebecca9 +rebecca3 +rebec +realtree +readit +rdpcfgex +rbrbvjhf +rbkmrf +rbhjdf +rbckjhjl +rbcjymrf +razvod +razor123 +raynor +rayallen +ravnos +ravioli +raven99 +rattlesnake +rattlers +ratio +rathbone +rasmu +rashida +rashid12 +rara +raptor1 +ranxerox +ranking +rangersz +ranger13 +ranger10 +ranged +randys +randrand +rancor +ramtruck +ramteid +ramses2 +rammin +ramfan +rambus +rambow +ramblers +ramazi +ramage +ram2500 +ralph69 +ralph2 +raleigh1 +rakastan +rainbow5 +raiders4 +raiders3 +rahul1 +rahmat +ragtime +ragerage +rafael1 +radnor +radiate +radhika +racsan +racing1 +rachel01 +rach +raceway +rabid +rabbit69 +rabb1t +r5t6y7 +r2u1s1h2 +qwqwqwqwqw +qwqw1212 +qwertyuiopasdfg +qwertyuiop123456789 +qwertyui1 +qwertyasdfg +qwerty65 +qwerty55 +qwerty54321 +qwerty19 +qwerty14 +qwertqwert +qwert2 +qweqweqw +qweasz +qwe1998 +qwaszxqwaszx +qwaszx11 +qwaqwa +qw12er +qw12345 +qureshi +quorum +quin +quilter +quilt +quill +quetal +quesnel +quenti +queers +quant430 +qqqqqqq1 +qqqq1 +qq12345 +qpwoeiru +qeadzc +qball +qazwsxedc12 +qazw +qazqaz123 +qazqa +qader +q4946227 +q1q2q3q4q5q6 +q1819084 +q123321q +q123321 +pword +putin +pute +pussyass +pussy50 +pussy5 +pussy4 +pussy01 +pushka +purple22 +purina +pupster +puppylove +puppy3 +puppy123 +punt +punkstar +punkpunk +punica +pumped +pump02 +pulpfict +pulcino +puke +puhlik +puce +ptcruise +psychotic +ps2ps2 +przemek +prowler1 +provue +providia +provide +protecte +prost +prophet5 +prophet1 +prompt +prokopenko +profit1 +profiler +professi +prof +procyon +problema +proball +pride1 +pricilla +prezident +pretzels +prefab +precision +precept +preben +pratap1245 +pqpqpq +powerrangers +powermax +powerlifting +powerbal +power200 +powder1 +powa +poupoune +poupee +potluck +potato1 +postel +postal1 +posey +portis +portico +portfoli +porsche7 +porsche2 +pornsta +pornoporno +porcupin +poppins +popluv +popcorns +poorman +poor +poopman +poop11 +pooh69 +poochunk +poobum +ponomarev +pongpong +pomodoro +pomada +polpot +polonais +polniypizdec110211 +polkovnik +polkan +polite +polipo +polepole +polar1 +poison1 +poiiop +pogopogo +podsm +podium +poco +pluto123 +plunk +plumtree +plums +plumbum +plugger +plhfdcndeq +plextor +please12 +playtim +playplay +playoff +playboy3 +play190 +plateau +plat +plank +pizda123 +pisna4 +pisci +pisces1 +pisang +pipoca +pipkin +pipefitt +piotrus +pintos +pinot +pinklady +pinkdot +pingisi +pinetop +pimp123 +pimp1 +pimp01 +pilgrims +piggly +pigg +pifagor +piero +pieper +piccard +picachu +piaggio +pi31416 +phuon +phreaker +phose +phoenix123 +phoenix0 +phish2 +philosop +phillipa +phillie +philli +phill +phildo +phil22 +pheonix1 +pharcyde +phantom7 +pfnvtybt +pfeffer +pettie +petruha +petro1 +petri +peterr +peterpeter +petern +peterk +peterh +petergun +peterf +petercar +peter4 +perver +peruvian +peruperu +peruano +persimmon +perry123 +perra +perico1 +perhaps +perfecti +perdido +perasperaadastra +pepsi6 +pepsi24 +peppi +pentacle +pennant +penmen +penis7 +penguin7 +pencil2 +pena +peloton +pelot +pelmeni +pelican1 +pelaez +pekin +pegasus7 +pegasu +peewe +peeping +peeing +peebles +pedro45 +pedr +peder +peasoup +peakaboo +peak +peachie +peaches8 +peaches7 +peace7 +pdaddy +pbvfktnj +pazzkrew +payson +paycom +pawnshop +pavilio +paulius +paulita +paul69 +pattar +patsfan +patriots1 +patrickj +patri +patio +paterno +patches2 +pat123 +pastrami +passzone +passworld +passport1 +passon +passionate +passion8 +pass789 +pass321 +pass12345 +pass00 +paskal +pascal1 +pasanko +partytime +party123 +parrotts +parnell +parmalat +parkplac +parklane +parker11 +paramoun +parabellum +papper +paper123 +papajohn +pantys +panther7 +panther6 +pantheon +pantech +paninaro +panel +pandora6 +pandabea +pancho1 +panch +panatha +panadol +pana +pallone +palle +pallavi +palladium +paladins +paixao +paddles +pacman13 +packing +packers2 +packardbell +pacbell +pablo12 +pablit +pabl +p9uJkuf36D +p0rnlove +ozarks +oyh7u4 +oyasumi +oxana +overseer +overmind +overdrive +ovechkin +outthere +outstand +outkast1 +ou812ou8 +ou8125150 +ou8121 +otacon +osiri +oscar12 +oscar01 +orwell84 +orlov +orione +orioles8 +organist +organa +orders +orbiter +orbit1 +optic +ophelie +opeyemi +operas +ooooo1 +onurtitz +onotole +onme +onlylove +onit +onimusha +onelife +one2three +one1one +one123 +omicron1 +omgomgomg +omega6 +omega200 +omarov +omaromar +omarion +olufsen +olsson +oliviero +oliver22 +oliver123 +oliver12 +oliver11 +oliver01 +oliebol +olga777 +olga1988 +olga1982 +olga1979 +olga11 +olesja +olegator +oleg777 +oleg1998 +oleg1988 +oleg1985 +oleg1975 +oleg12 +oldgoat +oldblue +ojojoj +oigres +ohno +ohfuck +ogden +offend +oejunk +oded99aa +oceanside +ocean7 +occash69 +obninsk +oakpark +oakle +nutts +nuttin +nursultan +nuqneh +numnuts +number12 +number11 +nuknuk +nudism +nudies +nudge1 +ntyybc +ntnhflm +np6168 +now123 +novosib +november1 +novella +nouvelle +not4u +nosnos +nosnibor +nosleep +northpol +northeas +norte +norstar +norge +nordman +nordland +noproblem +nopenope +nomer111 +noland +nokia6 +nokia321 +nohope +nohitter +nogueira +nogales +noemie +noemi +noelia +noanswer +noahfish +noah25 +nnnnnnnnnn +nmminmmi +njnjirf +njgjkm +nixon68 +ninjazx7 +ninja3000 +nine99 +nine11 +nilson +nikson +nikotin +nikol +niknak +nikita2002 +nikita1997 +nikifor +nike21 +nike11 +nik123 +nihil +nihao123 +nightrider +nightcra +nifty9 +nieves +niemtel +nielson +nicosia +nicolino +nicole69 +nicole22 +nickster +nickelfi +nickcave +nick69 +nichon +nicglobal +nicaragu +niblet +nibbler +nhjkkm +ng1971 +nfqaey +nfpa13 +nfhfynek +nextoff +newyears +newwave +newtown +newlife2 +newlif +newjack +newberry +neverever +neuroman +nettiger +nets +netf56n5 +netel99x +netbcm4e +nerual +neopet +nemesis2 +nellis +nekromant +neirfyxbr +nefilim +neerg +neely +need4speed +nederlan +necros +necronom +ne14a69 +ncc74205 +ncbound +nbvjityrj +nbveh +nbanba +naylor +navistar +naturebo +natsuko +nats +nation1 +natick +natia +nata1982 +nata1977 +nastyone +nastya1999 +nastya123 +naslund +nascar6 +nascar38 +naruto0 +nargiz +napass123 +naosei +nano93 +nani +namrepus +namita +nalgene +nalani +nakedteens +nakata +nagshead +nagel +nadja +nadi +nadeem +nacichal +n2deep +n123456789 +myspace! +mydoggy +mycat +mybabies +mybab +myangels +my3boys +muzika +mustang66 +mustaf +muskogee +musicals +mushu +mushmush +murugan +murry +murray1 +murphy12 +murka +murielle +murano +murali +mura +munk +mumble +multipass +multan +muiemuie +mughal +muggles +mudpuppy +mudlo1 +muddy1 +mtsadmin +msuJoe +mst3k1 +msstate +msimnimp +msdaorar +msadox +mrclark +mourid +moulton +motor11 +motomoto +motogp +motherlo +mother22 +mota +mossyoak +moskow +mosher +mosfet +moscow1 +mosca +mortise +morimori +moria +morgan11 +morfeo +moretti +moreporn +morelove +morelli +morefire +moose7 +moose2 +moonsun +moonrise +moon1 +mooker +monyet +mony +monthly +montell +montec +monta +monsterkill +monster123 +monro +monkmonk +monkie +monkeyba +monkey88 +monkey42 +monkey32 +monkey19 +monkees +monitor4 +money6 +money1234 +money101 +money100 +monarch1 +momo123 +momma1 +moma +mollyy +molitor +moksha +mojorisi +moira +moi123 +mohame +mogens +mobley +mo5kva +mnmcmg +mnemonic +mnbvcxy +mixtape +mivid +mitico +mita +misteri +missmiss +misiaczek1 +mironenko +mirkwood +mirkone +miras +miranda2 +miracle1 +mirabell +minsk +minpin +minkax +minima +minigun +mindwarp +minder +minato +mimic +milorad +million2 +millhous +millhaus +miller99 +miller11 +milky1 +militia +milesdav +mild +milan1899 +miklos +mikita +mikey6 +mikess +mikep +mikeman +mikele +mike7 +mike2000 +mike14 +mikala +mihai +miguel1 +midgie +midgar +middlese +microsca +micra +michigan1 +michaelt +michaele +mibeb +miami123 +miah +mexico2 +metsjets +mets31 +metrolog +meto +methods +meth +metanoia +messier1 +merry1 +merlo +merlin7 +meribel +mercy1 +mercuri +merci +mercedez +menzies +menlo +menina +menage +memphi +melvin1 +melvi +melting +meltin +melman +melissaa +melania +meknes +meganb +medal +mecmec +meandme +mdmvdot +mdmtdkj2 +mdmmcom +mdmmc288 +mdmcrtix +mdmbw561 +mdeth22 +mdavis +md1234 +mcneil +mcmillan +mclarenf +mckay +mcfc89 +mcescher +mcelroy +mcdougal +mb811434 +mazdamx6 +maybenot +maybe1 +maxxum +maxxtro +maxxmaxx +maxrebo +maximuss +maximum1 +maximill +maximiliano +max7043 +max2007 +max2002 +mausbaer +maurice2 +maulwurf +maturin +mattyboy +matthew5 +mattfz +matterho +matt13 +matson +matrox +matrica +mathman +matheus123 +mathers +mathe +mateusz1 +matako +mastro +masterok +mastercr +master33 +master1234 +masta +mast +massilia +masseffect +massage1 +mason2 +mashie +marzia +marylee +maryan +mary69 +maruska +marusja +marugame +martinka +martiniq +martin22 +martin10 +marsland +marsden +mars88 +marmaduke +marky1 +markii +mark10 +marjon +maritz +marine21 +marine12 +marinamarina +marilu +maridon +maric +marian1 +mariac +mariaa +maria32b +margus +marfa +marchand +march21 +march197 +marboro +marbles1 +maraton +maranafa +many +manutd1 +manse +manray +mannys +manmeat +maniaco +mangesh +mandms +mandal +manami +man22man +mamoxa +mamaipapa +mama99 +malory +malmal +malkuth +malinda +maldonad +malay +malandro +malaka99 +malahit +makson +maksimova +makomako +makeover +mainst +mailroom +mailmsg +maico +mahjong +mahaon +magodeoz +magman +magico +magicc +magic22 +magic12 +maggie99 +maggie13 +magand +magamed +mafiaman +madre +madmax1 +madman1 +madjack +madison5 +madison4 +mademan +madelin +made40media +maddogg +maddoc +maddie01 +madafaka +macross2 +mack11 +maciej +machi +mach +maceo +macca +macc +macavity +macabre +mabelle +m1a1 +m0n9b8 +lyric +lynch1 +lydia1 +luvfeet +luv2fish +lush +lumbur2 +lumber1 +luki +lukasz1 +luisluis +lugosi +ludovico +ludicgirls +lucy22 +luckzz +luckycharm3 +lucky21 +lucife +lucid1 +luchit +lucer +lucas2 +lube +lpkoji +lowride +lowman +lovesucks +lovesu +lovelost +lovelong +lovehim +lovegood +lovebuzz +loveass +love98 +love6 +love45 +love44 +love26 +love101 +love00 +louloute +louise01 +louie123 +lotta +loserboy +loretta1 +lorencia +lordik011 +looped +looner +looc +longines +longboy +lonewol +lonestar44 +lolololol +lollllol +lollipop1 +lolilol +lolek123 +lolada +lol000 +lokos1998 +loki99 +loin +lohloh +logon1 +logic1 +loganx +log3 +loewen +lodewijk +lockup +locdog +local1 +lobby +lobah +loaf +loads +lmao123 +lllllllll +llessur +llebpmac +llabtoof +lizliz +liza2010 +liza2009 +liza123 +livres +livesex +liverpo +liverp +littler +littlefo +littlecunt +litespee +listless +lissa +lisbeth +lisamarie +lisa21 +lion62 +lion123 +liolik +linux1 +linn +linley +linguist +lindsa +lindasue +lindab +linda2 +linalina +limousin +limon32988 +limelite +lilwayne1 +lilly123 +liller +liljohn +lililili +lilija +likethis +lightwav +lietome +liesbeth +lidstrom +liberia +liberati +libbie +lianne +lianna +liamliam +lfiekmrf +lexus200 +lexa123 +lewlew +lewiston +lewdog +levus +levent +lettre +letsgome +lets +letmein5 +letartee +lessthan +lessee +lera2010 +leonova +leonar +leoemo12 +leodog +lens +lenny123 +lennard +leningra +leigha +leiden +lehf2010 +legslegs +legen +leftwing +leftfiel +leedsfc +ledom +ledge00 +lecken +learn +leapyear +leaper +lbyjpfdh +lbyfvbn +lbvjysxm +lbvf123 +lbdfy1 +laydown +lavina +laurenc +lauren69 +lauralee +laur +latinum +latimer +lateral +lastman +lash +laser2 +larryr +laraza +lannie +langdon +lanette +landslid +lanalana +lampard8 +lammer +laminat +lambofgod +lalla +lalita +lalalalala +lakomka +laker1 +lake55 +lainie +lagger +ladodger +ladiesman +lacika +labuda +l0nd0n +l.qvjdjxrf +kyler +kyle11 +kylacole +kvadrat +kuuipo +kurwa1 +kurtkurt +kukkuk +kukkanen +kucher +kubiak +ktyfktyf +ktyecz +ktutjyth333 +ktm250 +kthecz +krystyna +kronic +kroket +kristoff +kristofer +kristofe +kristiina +kristi1 +krispy +kriskris +krishna1 +kris10 +kriginegor +krebs1 +krazykat +krasnov +krammer +kowalski +kovtun +kouter +kourtney +kostroma +kosmos1 +kosmonavt +koshak +kosarev +korvet +kornienko +kornev +korner +korn666 +kordell +kopilka +koolkat +konmar12 +kommer +komltptfcor +kokosik +koka555 +kochan +kobetai +knox +knopochka +knightrider +knight11 +knight01 +kmdtyjr +klubnichka +klover +klim +klavier +kkklll +kkk123 +kjyljy +kjujgtl +kjkj +kiwi12 +kittyhaw +kittyca +kittles +kitti +kitfox +kitchen1 +kitakita +kisswave +kissm +kisses1 +kissbutt +kisa123 +kirra1 +kirill2002 +kirill1999 +kirby34 +kirby123 +kira1976 +kippax +kiowa +kintaro +kinsale +kino +kingsway +kingpin1 +kingdoms +kingdo +kingcobr +king5464 +king01 +kimcuong +kimbal +killia +killer10 +kilimanjaro +kikkeli +kiesha +kiekeboe +kiddkidd +kickback +kickapoo +kibbles +kiaora +kianna +kfrhbvjpf +keysersoze +kexifz +kexibq +kevinw +kevinj +kevin01 +kev123 +ketrin +ketchum +keshia +kerplunk +kermi +kerimov +kepler +kennyd +ken25 +kelso +kelly99 +kelbel +kekkut +kekeke +keke +keithm +keeping +keep +keely +keane16 +kaylyn +kayleen +kaye +katuxa +katoom +katman +katiekat +katiec +katie3 +katie22 +katie01 +kathy69 +kathryn1 +kate01 +kasten +kassel +kass +kasper1 +kasiunia +kasia123 +karvinen +karton +karrie +karolek +karnak +karlsson +karissa +kardan +karapetyan +kapital +kanekane +kandi +kamlesh +kamali +kalamazoo +kakashi1 +kaka123 +kaitlyn1 +kaisha +kaiser1 +kahn4 +kaefer +kadeem +kabanchik +kaball +kabala +justmine +justin99 +justin22 +justin16 +justin0 +jurist +jupiter7 +junito +juniors +jungle1 +june2 +june11 +jumpy +jumpstart +jumpmaster +july30 +july1 +juliocesa +julie2 +jules1 +juicyfruit +judit +jpmorgan +jp1234 +joshua21 +josh123 +josh01 +josey +josette +joseph123 +josemari +josemanue +joris +jorge123 +jones123 +jonas123 +jonas1 +jonah1 +jon123 +jomomma +jolson +jokes +joker3 +jojo11 +johny1 +johnsmit +johnnys +johnny23 +johnny22 +johnb +john34 +john1968 +john13 +joeyboy +joey11 +joecool1 +joder +jockstra +jobless +jobjob +joao +joanne1 +joann1 +jo2deh +jktujktu +jktujdyf +jkh4545jhk +jjames +jizzman +jimmyt +jimmy11 +jimmy10 +jimkelly +jimdandy +jhkjdf +jhbaktqv +jghy452gf +jetpilot +jetjet +jetchip +jetaim +jet123 +jesuscristo +jesus666 +jesus1967 +jessie01 +jessey +jerrie +jerr +jeri +jeremy2 +jensen1 +jennah +jendos +jen123 +jem777 +jellybel +jelloo +jeffreys +jeffff +jeep4x4 +jedidiah +jedi99 +jeannot +jeanett +jealous +jcjcjc +jazz123 +jazmi +jays +jaypee +jaymz +jaylyn +jaxx +javier12 +javert +java123 +jasper2 +jason88 +jason69 +jason28 +jason26 +jason14 +jasmine7 +jasman +jareth +jardine +janic +janett +jane1234 +jandikkz +janaki +janajana +jammy +jamiroquai +jameslewis +jamesj +jamesa +james9 +james8 +james21 +jamall +jake22 +jajaj +jaimito +jaguar12 +jags +jagoda +jager1 +jade22221 +jacquie +jacobus +jacobe +jacksparrow +jackson6 +jackee +jack88 +jack2000 +jabbahut +jNe990pQ23 +izolda +iyehjr +iwonka +iwant +itch +isvipebaby +istvan +isthebest +ismailova +ismae +islam1 +iskakov +isign32 +isgay1 +iscariot +ironpen +ironkitt +irjkmybr +irish7 +irene1 +ipoipo +inxs +invincible +introubl +intermil +interfaces +insomniac +inseng +injury +ingri +informatic +infierno +infest +infect +ineedsex +ineedhelp +indobokep +indaclub +inbhkbw +imsocool +impuls +imhipp99 +imgood +imaging +imagin +iluvlisa +iloveyou5 +iloilo +illusions +ilikeike +ileana +ikmujn +ikickass +ikari +ihateyo +ignition +ifvbkm +iforgot2 +if6was9 +ieinfo5 +idspispopd +idontknow1 +icthus +iching +iceman44 +iceman22 +iceking +icecubes +icebreak +iceboy +icebear +iceage +ice123 +ibane +iaxe105 +iamdaman +hyper66 +hype +hydros +husten +hurensohn +hurdles +hunter45 +hunter10 +hummingb +hummer2 +humility +humerus +hulkhoga +huhuhu +hugs +huggybea +hudhud +hubbabubba +huangjin1987 +htubyjxrf +htdjk.wbz +htcgtrn +ht6236 +hpmrbm41 +howser +howe +howareyou +howard2 +housemus +housemou +hotsocks +hotrob +hotpink +hothotho +hotfuck +hotboyz +hot69 +hostess +hostage +hortense +horseshit +horsecoc +horny4u +horntoad +hornets1 +hornee +horizons +hore +horde +hops +hopper1 +hooters6 +hootch +hoosier1 +hoorah +hoopty +honour +honney +honeyboy +honeybab +hondastars +hondasi +hondac +hondaacc +honda750 +honda600 +honda400 +hommie +homerhom +homer22 +homer12 +homeboy1 +home69 +home11 +homage +holyspirit +holybible +holly12 +hollands +hollaback +hoilamgi +hogman +hocuspocus +hockey6 +hockey27 +hockey17 +hockey123 +hjvfir +hjkhjk +hitsquad +hithard +hitchcoc +historia +himanshu +hillview +hillary1 +hightowe +highschool +hifi +hicham +hfvfpfy +heyyo +hey123 +heureka +hertford +hernando +hermano +hermanni +herkimer +herehere +hennesse +henkel +hemingway +helo +hellohi +hellobob +hellobaby +hello111 +hellboy1 +hella +hell66 +helaman +hefty +hebrides +heaven12 +heaton +heatherg +heatheat +heartbreaker +heart2 +health1 +headspin +hbnekz +haystack +haylie +hayden1 +havesex +havefun1 +havasu +havanna +haustool +hatrack +hatebreed +hate2003 +harryc +harrold +harlie +harleyma +harley97 +harley66 +harley4 +harley20 +harland +hari +harekrishna +hardi +hardflip +hardc0re +harbinger +harbin +harare +happpy +hanuma +hann +hank1 +handles +handgun +hammy +hammet +hammerti +hammerfall +hammer00 +hamlet1 +hameleon +hamdan +hailey1 +hagbard +hackit +habeeb +h2oh2o +h1234567 +h0ck3y +gymrat +gwendolyn +guyver1 +gussy +gurgen +guppy1 +gunsnros +gunshy +gunner01 +gungrave +gunayka1995 +gummy +gummi +gullwing +guizmo +guitarr +guilt +guide1 +guidance +guerrer +guarddog +guadalajara +gthdsq +gscgsc +grounded +grooves +groggy +grisou +grinnell +grimley +griffe +grete +greg99 +greg1234 +greenz +greenhou +greenhor +greenbean +greenapple +green88 +green13 +greco +grecia +greatman +grazie +grati +grands +granda +graf +grader +grad +grabit +gowron +gotribe1 +gotone +gothmog +gothica +gotech +gostar +gort +gorod312 +gorky +gorf +gopackgo +goonline +gooner01 +google2 +goodpuss +goodnight +goodguys +goodall +good1234 +gonz +golubeva +golgotha +golfman1 +golfer2 +golf2000 +golf19 +golem1 +goldpony +goldgoat +golden12 +gohokies +gogita +gogirls +goforit1 +gocaps +gobolts +goblins +gobears1 +goalie1 +glucas +glowing +glorioso +globe1 +glisten +glenna +glazed +glastron +glam8394 +gladiator5 +gl3bk02k +gjyjvfhtyrj +gjujlf +gjlheuf +gjkbnjkjubz +gizzard +gisel +girona +girls4me +ginola14 +ginger99 +ginette +gimnazjum +gillingham +gillen +gille +gigaset +gidday +giblets +gibbs +giancarl +giambi +giRLI3s +ghtdtlvtldtl +ghoul +ghost9 +ghost2 +ghjuhfvf +ghjirf +ghjghjghj +ghjcnjkjk +ghjcnj33 +ghjcnhfycndj +ghjbpdjlcndj +ghjatccjh +gherkin +gfkjxrf +gfhjkz +gfgfyz +gfgbhec +gfdtk666 +getsome1 +getoffme +gertruda +gerrard1 +gerrar +germes +georgios +georgie1 +georgia9 +george99 +george23 +george10 +gently +gentile +geno +genlee +generato +gekko +gegrby +gegege +geert +geaux +gbdjgbdj +gazette +gazebo +gaygaygay +gavrilova +gatorfan +gatorbai +gator65 +gateway7 +gateway0 +gates1 +gas006 +gary1 +garrick +garr1234 +garp +garet +garcia12 +garber +ganga +ganes +ganapath +gammon +gamemaster +gambling +gambia +gama +galvez +galois +gallows +gallerie +galleria +galler +gallatin +gallant +galapago +gain +gaia +gabriel7 +gabit +fynjkjubz +fynbkjgf +fylhttdbx +fybcbvjdf +fuzzbutt +furrball +furface +funone +funnybunny +funnies +fungi +fulvia +fukyou +fukuyama +fujisan +fudge10 +fudd +fuckyou4 +fuckoff8 +fuckmyas +fuckinglove +fuckfuckfuck +fuckboy +fubu05 +frye +frunze +frosty12 +frostie +frontlin +froger +fritz123 +frighten +friendz1 +friend12 +frente +frem +freeza +freewilly +freetraffic +freeserv +freemind +freemaso +freeman2 +freely +freelander +freefuck +freedom6 +freedom123 +free99 +frederiksberg +fred999 +fred34 +fred10 +frazer +frauke +frantz +franklin1 +frankenstein +frankd +frank11 +francoise +framed +frail +fquekm +fpfkbz +foxrun +fox +foursome +foureyes +founder +foto +fossil1 +forzamilan +forza +forvard +former +formel +forgo +forgetmenot +forfar +foreverlove +forever2 +fordvan +fordmust +ford250 +ford2000 +footy +football9 +football7 +football6 +football4 +football11 +foolfool +fooler +foodman +fonz +foghat +fogger +focal +fnord23 +flynn1 +flyers10 +flutes +fluid +flown +flowerss +flowers2 +flower34 +flotilla +florida8 +florencia +floral +flomaster +fliegen +flhrci +fleets +flannery +flames12 +flam +flakey +flack +fktrctq1 +fktrcfylh1 +fkmabz +fkbyf123 +fixed +fivehole +fitzgera +fitch +firsttime +firsova +firm +firkin +firing +fireston +firefall +firebir +firebal +fire99 +fingolfin +finger1 +finfin +findlay +filofax +filik16 +filatov +fiji1848 +fifi123 +fifa09 +fickle +ficke +fibber +fhntvjy +fhntv123 +fhbyjxrf +fgjcnjk +fghjk +fghjfghj +fff111 +fernan +ferment +ferien +fergo +ferfer +ferenc +ferch +fenriz +fennel +fenian +fender21 +fender01 +felipe12 +felcher +feetlove +feenix +feelings +feeler +fedorenko +fede +fdhfvbyrj +fctymrf +fazer +favre04 +faulk28 +faty +fattire +fatter +fatpig +fatman1 +fatguy +fatfuck +fatfree +fatal1ty +fastford +fasteddi +fast1 +fashion1 +farrow +farra +fariza +farid +fargo1 +fara +fantasi +fanta123 +fanfare +famille +fallacy +falcon4 +fakename +fagsman +faggot1 +fagboy +fafa +fadi +face2face +fabio1 +fabfour +faberlic +faMily +fSId3N +f2n93 +eyelid +extremes +expres +exiles +exciteme +except +evrika +evilive +evileye +evil1 +evets1 +evertonfc +evaluate +euteamo +euphoniu +eumeamo +etud +etrigan +ethyl1 +ethereal +etetet +etalon +essential +essentia +espiritu +esperanto +esmith22 +escorts +escorpi +escondido +esco +erving +ermakova +erling +erkin +erikerik +ericsso +eric98 +eric88 +eric01 +erfurt +ereyes4269 +erdna +erase +ephraim +entry170 +entrez +entree +entered +enrique1 +enomis +england6 +eng53533 +end +enclave +emulator +emporio +empir +emmons +emmit +emit +eminem11 +emilyg +emilyany +emily22 +emile +emerica1 +emeral +emanon +email1 +elzorro +elway1 +eltons +eltigre +elsled +elsalvador +elsaelsa +eloisa +elmago +ellswort +elliedog +elkabong +elizavet +elizabe +eliseev +elflord +eleniko +elene +elenas +elena1977 +elena1973 +element2 +electro1 +eleanor1 +elcid +elaine1 +eject +eisregen +einstien +eggseggs +eggjuice +eggert +effie +edwards1 +edward22 +edward10 +edik123 +edgehill +edgars +eddie12 +ed1234 +ebirtog +eatthis +eats +easyrider +easy2 +eastham +easley +earthquake +eagles25 +eagle69 +eagle4 +eagle111 +eagle055 +e280bis +e1l2e3n4a5 +e123456 +e0000206 +dylan2 +dyke +dying +dwilla +dvtcntyfdctulf +duvvvvvy +dusti +durian +durable +dup1991 +dunlap +dunker +dunduk +dumpy +dumbass2 +dumb11 +dukes1 +dukenuke +duke21 +duke13 +duggan +duecebox +due911q +dudester +dudess +duckbutt +duck1 +ducati91 +dubuque +dublin01 +dtynbkznjh +dsfdsf +drusilla +drumms +drummerb +drummer2 +drumbeat +drumbass +droz9122 +drowssa +droffilc +drizzt1 +drizzle +drippy +drewski +drew123 +drella +dreamlan +dream123 +drayton +drake123 +dragonx +dragonss +dragonslayer +dragonma +dragonlord +dragones +dragon67 +dragon55 +dragon17 +dragon16 +dracula1 +draconia +dozier +downset +downdown +douglas2 +doudouth +douce +double07 +doright +doos +doorbell +doom2004 +doolittl +doogie1 +doogan +doodl +dooder +donovan1 +donor +donk +donaldo +dominio +domehard +dolphin7 +dolores1 +dogtown +dogone +doggss +dogged +dogeral +dog4life +doedoe +dodge99 +doctorno +docteur +dnalor +dkfljxrf +djdfdjdf +djcross +dizzie +dixie123 +diver69 +ditch +discrete +discos +dirtypop +dirtdog +diomedes +dinkus +dinkie +dinkey +dinho +dingaling +dingalin +diner +dindon +dinar +dinadina +dimanche +dima2011 +dima199 +dima007 +dillinge +dilate +dikkie +digital9 +diggle +difranco +dietcok +diehard1 +diego12 +didou +dido +didenko +dickhea +dicaprio +diana2002 +diamondg +diablo69 +diabetic +dflmqljm +dfknjhyf +dfhbfyn +dexter12 +devils95 +devil13 +devil12 +deven +develope +devan +destiny0 +dessie +deshon +deshaun +descarte +derrida +derric +derive +derderder +denise01 +denis1995 +denis1989 +denis1986 +denis1985 +denice +denchik +den12345 +demur +demonio +demon6 +demon2 +demon13 +demiurg +demina +delwyn +deltron +deltapi +delillo +delicia +delfina +dekcah +degrees +degr9369 +defrag +defende +deesnuts +deer99 +deepspac +deedra +dediko +decor +december12 +decca +debugger +debbie12 +deathwish +death66 +deadmazay +deadguy +deadbird +deadass +dddd1 +dctvcjcfnm +dctcerb +dbrfdbrf +dbnfkmrf +dbdbdbdb +dawn69 +dawgpound +dawgdawg +davron +davila +davidf +david98 +david25 +david24 +david23 +david200 +david19 +david18 +davenport +dave11 +dasha1999 +das123 +dartman +darshan +darnit +darnell1 +darksid +darks +darkroom +darkling +darkcity +darkblue +dark007 +darima +daria1 +dari +darhan +dapdap +dante666 +danser +dannyg +danni123 +dankster +dankdank +danildanil +daniel77 +daniel22 +daniel20 +daniel13 +dangermo +dancer12 +dance4life +dan1el +damons +damo +damari +damage1 +dally +dallas00 +dalene +dalejr08 +dakini +daisy12 +dagfadg +dagame +dafotre +daewo +daeih69 +daddy3 +daboyz +dabomb86 +daba3ff +d1d2d3d4 +d192009 +cyrille +cypress1 +cymbals +cyclist +cyberpun +cwilliam +cvtifhbr +cvbnnbvc +cvb123 +cutout +curacao +cuntlicker +cuntface +cunny +cumtome +cumstain +cumon +cummy +cuestick +cucina +cubssuck +ctvtqrf +ctswaj13 +ctqkjhvey +ctktlrf +cstock1 +csmith +cruzeiro +crooks +crook +crjnbyf +critter1 +criton +cristiana +crinkle +crimedog +crewman +crete +crazyass +crash123 +cranford +cranberries +craddock +crackwho +crackass +cr1cket +cpcpcp +coyee +cowboyss +coverall +coupons +cough +couch2 +cosby +corte +corsair1 +corral +corraggi +corona42 +cornman +cornea +corliss +corinthians +corenti +corelli +coquet +copies +copa +coos +coolshit +coolin +cooldood +coolbugi2000 +coolass +cool-cat +cooder +convex +constan +consilium +conn +conlon +confmsp +conejito +comstock +comply +compliance +compass1 +compaq11 +compaq01 +comp967r +command2 +comicboo +cometome +comedia +collet +collector +collecto +coldshot +coldcold +coinage +cody13 +cody1 +cody01 +code3 +coda +cocoliso +cocoas +cockss +cockpit +coccinel +coby +cobrasvt +cobra11 +cobol +cnhjbntkmcndj +cnhfntubz +cnfkrbh +cnfhjghfvty +cnfdhjgjkm +cneltynrf +clout +clouseau +clotilde +cloth +clockwork +clock1 +clitrub +clioclio +clinique +clinch +clementine +clemen +cleburne +claudia9 +classic2 +clark123 +clannad +clan123 +clacker +ckfdjxrf +civilization +citizen2 +citabria +ciprian +cippalippa +cindyb +cielo +ciccone +chupas +chupakabra +chupacab +chuggy +chucknorris +chucki +chronicle +chrisf +chris9 +chris7 +chris30 +chris00 +chorly +chloedog +chiro1 +chiquito +chiqui +chinch +chinadoll +china123 +chimera1 +chill1 +chigga +chieftan +chief123 +chicklet +chicken8 +chicken4 +chicane +cheyenne1 +chevy327 +chevy123 +chevie +cherokee1 +chelsea01 +chelly +chefchef +cheetah1 +cheering +chee +chedder +checkitout +checkin +chechen +checco +cheaphornybastard +chawanxan +chateaux +chasman +chasity +charter1 +charmander +charliedog +charles9 +charleen +charla +charizard +chaos2 +chanti +chantelle +chancer +chaman +chadley +chaddy +ch3cooh +ch3ch2oh +cgtkcbyuth +cgfhnfrxtvgbjy +cfyzcfyz +cfycfysx +cfvjujy +cfgabh +ceyhun +cervelo +cervante +certain +cent +censored +cemetery +celt +celeron1 +cdtnf123 +cdfhobr +cderfv +cccc11 +cbr954 +cbr600f2 +cayley +cavendish +cauldron +catv +catullus +catskill +catriona +catrina +catnap +cathat +catch1 +catbox +catamoun +cataldo +castrol +castaneda +cast +cassy +cassey1 +casin +casanov +casado +caryl +cary +cartoon1 +cartel +carrot1 +carros +carrol +carrera1 +carpets +carolynn +carole1 +carmona +carmine1 +carmin +carmilla +carmen2 +carmelit +carmack +carlas +caribbea +caress +capullo +captian +captai +caprisun +capper +capacity +cantstop +canopus +canons +canon123 +cannabi +canel +candyy +candygirl +candy69 +candy3 +candle1 +candel +cancer69 +canari +camry98 +camry1 +cami +cameosis +camaroz +camaro01 +camano +cally +callofduty4 +calista +caline +calicat +caliburn +cajuns +cairns +cagliostro +caesa +cadilac +caddy1 +cachito +cabview +cabby +c0mputer +c0l0rad0 +c0cac0la +c00kies +byte +byrdman +bygger +bvc7xr635 +butyl +buttrock +button1 +buttlick +butthead1 +butters1 +buster13 +buss +busdriver +burton13 +burnin +burlroad +bure10 +bunty123 +bunsen +bunkys +bumpkin +bumbling +bully1 +bulls6 +bullman +bullish +bullett +bulletproof +bullen +bulldog8 +bulldog5 +bulldog4 +bulger +bulge +bujhtdbx +buheirb +bugler +buggss +buggers +buggerme +buffy12 +buffster +buffman +buffalo7 +buena +budligh +buddy9 +buddy5 +buddy22 +buddy13 +buddy10 +buckethe +buccaneers +bubun +bubbles9 +bubbacat +bubba9 +bubba222 +bubba13 +bubba111 +bu7re8au +bsaltz +bryguy +brydges +bryant24 +bryanna +brute +brunswick +brown2 +bros +brookes +brompton +brolly +broker1 +broil +brody36 +brmfcsto +brixton +brissonl +briony +brinki12 +brimstone +briguy +brighto +bride +brianr +brianj +brian5 +brentwoo +bravo123 +brause +bratva +brasov +brantley +brake +bracket +br0ken +boywonder +boyar +boxhead +boxerdog +boxbox +bowzer +bowlin +bowie1 +bouncing +boulevar +boudreau +boubo +bosun1 +bosox9 +boske +bose +bosco2 +boreal +borak95 +booooo +boooom +booobs +boones +boonedog +boomeran +books1 +booklover +boojum +boogs +boogies +boocat +boobs4me +boobs12 +booboo22 +booblove +boobee +bonney +bonneville +bonjours +bonita1 +bongwate +boner2 +boneca +bonanza1 +bommer +bolo +bollie +bolder +bojack +boink +bogner +boeing777 +bodyman +boddyb +bobwhite +bobs +bobo1234 +bobjoe +bobette +bobcat1 +bobbyv +bobbyorr +bobby5 +bobbie1 +bobbi1 +bob777 +boardwal +bo45 +bncnbxc +bmwmrx7 +bmw850 +bmw325ci +bmbmbm +bm1440 +blush +bluntz +blujay1 +bluish +blueprin +bluelove +blueligh +bluehen +bluehair +bluegold +bluegirl +blueee +bluedog1 +blue57 +blue4 +blue27 +blue07 +blowjoe +blooms +bloodmoon +bloodhou +blojob +blog +blocks +blizzard1 +bliznec +blinn +blinkme +bling1 +blend +blaster2 +blaste +blaque +blaney +blakes7 +blake9 +blake4 +blade3 +blackwol +blackwat +blacktie +blackstone +blacksto +blackmagic +blackhor +blackcar +blackbla +blackbas +black7 +black69 +black21 +blabla1 +bjc2110 +bjc210 +bjackson +biznes +biturbo +bitter1 +biteme11 +bisquit +bishkek +birdi +birdhous +biodtl +bingo2 +bimbam +billygoat +billycat +billy22 +billy12 +billll +billfish +billb +bill22 +bilge +bilabong +bikeboy +bikebike +bigtree +bigtits6 +bigphil +bigmoe +bigman69 +bigmac25 +bigkat +bigjugs +bigjack +biggy1 +bigfat +bigeye +bigdude +bigdog2 +bigdeer +bigdawg1 +bigdady +bigbum +bigboy69 +bigboy40 +bigboy22 +bigboat +bigbertha +bigbear1 +biene +bharath +bhammer +bexley +bettina1 +betta +betito +beside +beset +bertho +bergie +berger1 +berge +bens +benny123 +benjis +bene +bendan +benbow +belong +belmondo +belldandy +bellaa +bella2 +believe1 +bekzat +being +behold +beet +beeswax +beergood +beergod +beer13 +beenther +beeboo +become +beckham1 +bebito +beaujeu21 +beattie +beats +beatriz1 +bearded +bear98 +bear40 +bear22 +bear1234 +beani +beach2 +beach123 +bdiddy +bcrfylth +bbunny +bbsbbs +bball2 +bb1234 +bayarea +batten +batt +batshit +batman88 +batman20 +bate +bastogne +bastar +bassma +bass1234 +basic1 +baseball10 +baruch +barrye +barros +barrett1 +baroni +barnowl +barmen +barkey +barkas +barham +bardot +barcelona1 +barbee +barbara2 +baran +banone +bango +banff +bandini +bandid +bandicoo +bandgeek +banda +bananen +bananas2 +banana11 +banaani +bamse +bambus +bambuk +bambucha +balto +balsa +balong +ballplay +ballbust +balearic +baldwin1 +baldone +balandin +balaban +balabama +baking +baked +bajaboat +baines +bailey123 +bahrom +baggage +baddog2p +baddawg +badboy123 +badboy11 +badazz +backoff +bach4150 +bacchus1 +babyjane +babydol +babydog +babson +babnik +babeland +babcom +babalon +b12345678 +b0r3dy +azzhole +azxs +azertyuio +azerty01 +azerbaycan +azer123 +aze123 +azarov +azaliya +axman +axctrnm +away1 +awawaw +avionics +avila +aviator1 +avert +avante +avadakedavra +auxerre +autopsy +autism +austin99 +austin97 +austin7 +auio +august27 +august21 +august01 +aug1971 +audir8 +audencia +aubie +atropos +atrick +atocha +atikin +atiixpad +atartsis +asuncion +astrahan +astragte +asteri +assunta +assume +assmonkey +assman69 +asskicker +assistant +assassas +asqw12 +aspnet +aspen2 +aspasp +aslwit +asil +ashutosh +ashima +asheron +asdfhjkl +asdfghj1 +asdf;lkj +asdf777 +ascot +as5fz17i +as123 +arzamas +artur4ik +artlover +artlight +article +artem1998 +artem1991 +arshad +arsenal123 +arsenal12 +arrogant +arriflex +arrecho +arnie100 +armyofon +armyboy +armbar +armalite +argos1 +argon +archbold +aral +arabian +aquile +aqaqaqaq +aq12wsde3 +aprill +april23 +april18 +april11 +applebomb +apple9 +apollo44 +aphid +apartmen +aparna +apacer +anytka +anything1 +anvar +anubis1 +antoshenechka +antonino +antonia1 +anton1989 +antihero77 +antic +antanta +anon99 +anomie +annetta +annemarie +anna1999 +anna1998 +anna1996 +anna1978 +anna11 +ankle +anikin +anibal +angst +angry +angina +angies +angels2 +angels02 +angella +angelie +angelidis +angelic1 +angelfire +angelface +angelbaby +angela21 +angel2010 +angel100 +angel0 +anfiska +anett +aneste +andy2000 +andy01 +andsexy +andrey1992 +andrew7 +andrew21 +andrew17 +andreita +andreit +andreas2 +andrea2 +anderson1 +ancona +anasha +analii70 +anakin99 +anacond +anabella +anaana +amoureux +among +amlink21 +amity +amirov +amilcar +amie +amidamaru +ames +american1 +america7 +amer +amc20277 +amberd +ambercat +amber3 +amber01 +amazin +amaze +amarok +amara +amante +amant +amanda2 +amanda13 +alumina +alternativa +alternativ +alteclansing +alster +alpha9 +alpha69 +alpha4 +alpha190 +alpaca +aloof +along +allthewa +allsaints +allsaint +allpass +allnite +allis +allin +alley1 +allens +allahuakbar +allahakbar +allabout +alla123 +all4love +alive1 +alitalia +alisa2010 +alina2003 +alina2000 +alimony +alice99 +alibi +alfresco +alfetta +alfagtv +alfa01 +alexpass +alexmike +alexis12 +alex98 +alex28 +alex2009 +alex15 +alex14 +alessi +alena1992 +alena123 +alekss +aleksandar +alekos +alejandro1 +aldoaldo +albertin +alannah +alamo1 +alacran +akrobat +akmal +akimbo +ajtajt +aisling +airway +ainsley +ahegme +aguirre +agreed +agathe +agata1 +agadir +afternoo +afterglo +afro +afkmmwsbz +afight +aezakmi123 +aerospace +aerospac +aeroplan +aeroflot +aerodeck +aekdb448 +advertis +adminpass +administrato +admin12 +adler1 +adil +adidas123 +adg123 +adelya +adela +adeade +addie +addictio +added +addadd +adameve +adam22 +adam21 +ada123 +acuras +acura32 +activity +actarus +acmila +acidic +acesfull +ace2000 +accura +accounta +accordex +access31 +ac1062 +abubakar +abracadabr +abogado +ableable +abitch +abington +abingdon +abc123de +abc123abc123 +abbygirl +abbie1 +abbeyroa +abbasov +abalone +abakan +abagail +ababagalamaga +abab +ab123 +aaron8 +aaliyah1 +aaabbbccc +aaaaaaaaaaa +aaa11 +a2345678 +a1a1 +a159357 +a13579 +a123456789a +a102030 +Zxcvb12345 +Zipper +Zaphod +ZZZZZZZZ +Yvonne +Yankee +Xzaqwsx1 +Xtreme +XFR184 +World +Wombat +Wolf +Winner +Windows +Willie1 +Whiskers +Welcome01 +Webster +Wayne +Washingt +Wally1 +WESTHAM +WALLACE +Vision +Violet +Vegeta +Vampire1 +Valera +VIRGINIA +UploadLB +UninstallSql +UNKNOWN +Turner +Trumpet1 +Trojan +Tricky +Trevor +Topgun1 +Tomcat +Tn278sm +Tk3281022 +Thx1138 +Thunderb +Thor +TheBest +Test123 +TempPassWord +Teens1 +Teddy +Team +Tdutybz +Tazman +Tawny20 +Tamara +TURKEY +TRUCKER +TROOPER +TORRES +THUGLIFE +THNKUWaP +TERRY +TARGET +TANNER +SystEm58 +Swimbike +Sweety +Sweetpea +Susanne1 +Super412 +Sucks +Sublime +Stuff23 +String +Strike1 +Strange1 +Stone1 +Standard +Speedy1 +Special1 +Spanky1 +Sp1251dn +Soso123bbb +Snake1 +Sn121ma +Smooth +Slagelse +Skyline +Shooter +Shelly +Sharon1 +Sergio +SemperFi +Section +Sebastian +Scruffy +Scarface +Sasha123 +Santiago +Salem +Sabrina1 +SUNSET +SUCKS +STINGRAY +STEPHANI +SPIKE +SPECIAL +SMILEY +SHITHEAD +SHIT +SHELLY +SERGI +SAMMY +SAMMIE +SAINTS +Rulez1 +Roscoe +Romashka +Roger1 +Roger +Rock1 +Ricky +Rfnthbyf +Resource +Reggie1 +Redsox1 +Rctybz +Raymond1 +ROCKY +ROBIN +RHbzxTGJ +REGINA +REBECCA +Quincy +Quattro +Quality +Qazwsx1 +Punisher +ProductId20F +Pontiac +PolniyPizdec1102 +Police1 +Pirates +Pirate1 +Phantom1 +Personal +Perfect1 +Perfect +People +Penguin +Penelope +Peanuts +Patric +Palmer +Packer +Pacific +PUSSIES +PRESTON +POWERS +POWER +PNP0600 +PHILLY +PACKER +Overlord +ORLANDO +OFFICE +Nugget +Ns410fr +Nosgoth +Norton +Nokia6233 +Nitti +Nirvana1 +Nipples1 +Nimrod +Networkingpe +Nelson1 +Nebraska +National +NORMAN +NOAdmi +NIKKI +NICOLAS +NEWPORT +Mp127mb +Mouse +Monday +Molly +Mollie +Mister +Microsof +Michell1 +Miami1 +Meier +Maveric1 +Maryland +Marley1 +Marie1 +Margit +Marco +Marbles +Manuel +Malcolm1 +Makl1234 +Maiden +Magnus +Madonna1 +MUSIC +MSPAUL +MOTOROLA +MOMONEY +MICHEL +MERZARIO +MAXIMUS +MAXIMA +MANAGER +Lv125is +Ltybcrf +Ls101vt +Lol12345 +Logan1 +Liverpool1 +Lightnin +Leopold +Lenochka +Legolas +Legion +Leavemealone +Leader +LasVegas +Larry1 +LOVERBOY +LOVEIT +LINDA +LIBERTY +LESLIE +Knights +Klaus +Kitty +Killer12 +Kermit1 +Kenneth1 +Kelsey +Kelly1 +Katherine +Karate +KODIAK +KISSES +Justice1 +Julius +Julia +Joanne +Jimbo1 +Jhon@ta2011 +Jensen +Jasmin +JUSTME +JETSKI +JESSICA1 +Isabelle +Intrepid +IdeDeviceP0T +INDIANS +INDIAN +IB6UB9 +Huskers +Horses +Hoover +Holland +Holiday1 +Hobbes1 +Hjvfirf +Hershey1 +Herbert +Hash +Harris +Happy123 +Hannes +Hacker1 +HUBERT +HORSE +HOLMES +HOLLY +HOLIDAY +HERSHEY +HENDRIX +HEAVEN +Gregory1 +Gregory +Gp437oi +Gotcha +Goliath +Golden1 +Gibson1 +GenuineIntel +Gauthie +Gankutsuou1989 +GUSSIE +GOBLUE +GJCkLr2B +GFHJKM +GEORGIA +GARCIA +Fyfnjkbq +Funny1 +Fucking +Frosty +Free1 +Freddy1 +Frankie1 +Francois +Frame1 +Foster +Forum +Fortuna +Flatron +Firebird +Firebir1 +Filipo3 +Fhvfy6 +FRENCH +FREAKY +FRANCOIS +FLUFFY +FLORENCE +FISHER +FARMER +F64579820f +Everton +EulaComplete +Eric +Enterprise +Elephant +Electric +Efwe5tgwa5twhgd +Eduard1 +EVELYN +ERIC +ENGLISH +ELVIS +Dutchman +Duncan +Dreams1 +Doit +Doggie1 +Dkflbckfd +Diver1 +Disney1 +Diesel1 +Dfktynbyf +Dfkthbz +Devils1 +Dennis1 +Death +Dave1 +Darius +DaoCiYiY +Danni +Dancer +DUSTY +DUSTIN +DONKEY +DONALD +DODGE +DIESEL +DIAMONDS +DEEDEE +DDDDDD +DBCE51 +CzPS5NYNDWCkSC +Cynthia1 +Country +Copper +College +Cody +Cock1 +Cobra +CmXMyi9H +Cloud9 +Christy1 +China +Children2 +Charlie9 +ChangeLangMs +Champ1 +Cf510cr +Cashed +Carrie +California +CURTIS +COTTON +CORAZO +COCO +CHEVYS +CHARLIE1 +CHAMPS +CENTRAL +CE5939AE +CATFISH +CANTONA +Bullet +Buffy1 +Buddha1 +Buckeye1 +Bruno +Bridge +Brasil +Booboo1 +Boner1 +Bobafett +Blowme1 +Bloody +Blazer1 +Blaster1 +Blades +Blade1 +Blackdog +Bismarck +Birdie +Bill1 +Bigtits1 +Bigman1 +Bigdog +Bhbirf +Beer1 +Beauty1 +Baby1 +BUTTONS +BULLET +BUCKEYES +BRUTUS +BROWSEUI +BRIAN +BRAVES +BIGCOCK +BIGBIRD +BCbAWHrJ +BApass +Az5625 +Avenger +Avatar1 +Australia +At_ASP +Asdfgh1 +Archer +Aragorn +Aquarius +Apples +Apple +Annie1 +Anna +Animal +Angelus +Africa +AdreNoliN +Account1 +Acarrids +Abcdef1 +Ab101972 +AZaz09 +ARTURO +ANGEL1 +ANACONDA +ALYSSA +ALLEN +ADGJMPTW +AAAAAAAA +AAA111 +A7777777 +99999999999 +999991 +99991111 +999222 +9970 +9948xx +98cobra +98989 +988988 +9875 +98741 +9865 +9853 +976976 +9665 +9663 +963741852 +9632145 +9559 +9527473q +951951951 +951753852456 +9510 +9471 +9448 +9392 +933084 +92k2cizCdP +9298 +928928 +92631043 +9250986 +9226 +92129212 +9200 +9192 +9166 +912345 +9123 +9115 +91129112 +90proof +9095 +9088 +9070 +9050 +8ball8 +8997 +89898 +8950 +8932060 +890890890 +8905 +89023346574 +8898 +88888888q +888333 +888222 +8866 +88488848 +8810 +87stang +87898789 +8769 +8758 +875643 +8733 +8722 +8704 +8590 +8583737 +852852852 +852741963 +850912 +8489 +848711 +848586 +8475 +8411 +840840 +8316 +8311 +82dabn +828828 +8263 +82465 +8232490 +8217 +8215010 +8190 +8184 +8137 +8134 +8127 +810199 +8086 +8082 +8050 +8024 +8011 +80085 +800000 +7sajzasj +7mmmag +7hjksdjk +7ecffkx8 +79927992 +7981 +7946135 +7924 +78vette +78965412 +789521 +789012 +78900987 +789000 +7874 +785412 +78451 +782ehuws +7816 +7810 +7808 +77887788 +777xxx +7777r1 +77779999 +7777778 +7777777f +777777777777 +777776 +7775 +7774 +775775 +77531911 +7744 +7735 +773311 +7728 +7727 +771177 +7679 +767300 +7664 +7612 +759486 +755755 +753dfx +753421 +7531 +7480 +7445 +7436 +7419 +741852963q +74125 +741177 +7410852963 +7410852 +7402 +7398 +7333 +7325 +730000 +72727 +7170878g +7116 +710710 +710420 +708708 +7072 +7057378 +7029 +7009 +7006 +69pass +69mustan +6980 +6971 +69691 +6966 +6932 +6928 +6912 +6902 +6861 +6844305 +6819 +6781 +6777 +676869 +6765 +675675675a +673108090 +66mustang +6678176 +6675 +666devil +66696669 +66677 +6660666 +6651 +6636 +662662 +6606025 +65mustang +6572 +6571 +655005 +6543211 +654312 +65412 +6533 +6512 +6462 +6454 +6449494 +6416 +6411 +6370869 +6357 +63206320 +6307 +62vette +6294 +6272 +6255 +6252 +6248 +6235 +6233 +623000 +6215 +6204 +6189 +61616161 +6120 +6119 +6117 +6055 +5klapser6 +5978 +5972 +59595959 +5953 +592111 +58915891 +5885 +5882300 +5882 +5874 +5869 +5867314 +5859 +585585 +5855 +5854 +580709 +57vetguy +5789 +5761 +5755 +56tyghbn +5672 +5670 +56654566 +56525652 +5647 +564321 +56325632 +558855 +55681293 +5562 +5561 +5560 +55555s +55555l +555 +5531 +55235523 +55013550 +5483 +5480 +547896321 +5470 +544544 +5432167890 +5414 +5388 +533333 +5316 +5302 +5301 +5300 +5267 +526526 +5236 +52325403 +5230 +5224 +5223 +5221 +52135213 +5212 +52015201 +5201 +5199 +5174 +5168 +5166 +5157 +5156 +515050 +5144355 +5144 +5133 +5130 +5123 +5121 +511006q +5102 +50cents +5040 +5038 +5011 +5010 +4rfvbgt5 +4r4r4r +4ngF4g2 +4horseme +4girls +4getit +4access +49erfan +4999 +4982 +4977 +4969 +4951 +4943tabb +4936 +4922 +4897 +48916052a +48914891 +48844884 +487111 +4866 +486213 +4858 +4845 +4819 +4789 +4784 +4774 +4767 +4735 +4697 +4664996 +4647 +4644 +4643 +4641 +46225778 +4615 +4613 +4595 +459459 +4586 +456456456q +4555 +4547 +454647 +4544proj +4527 +4517 +44street +4495 +4485 +4480 +4476 +446644 +4465134444 +4463 +4459 +445544 +4452 +44446666 +44445 +4438 +4424 +44234423 +4420 +4415 +441441 +441144 +4406 +440044 +4367 +4346 +4339 +4336 +4334 +4329 +432432 +43215678 +431311 +4311 +4295 +4277 +4273 +4269 +4262 +4251 +424424 +424344 +4243 +4240 +42324232 +4220 +4210 +4208 +4203 +42000 +4174 +4164 +4161 +4151 +4150 +4145 +4140 +4139 +4136 +4133 +4127 +4124 +4122 +410410 +4090 +4066 +4047 +4037 +4025 +4023 +4017 +4010 +4004 +3speed +3993 +3964 +3961 +3933 +39273927 +3910 +38super +3881 +3872 +3852 +3841 +38323832 +382003 +3781 +3780 +3740 +37333733 +37113711 +369272 +369123 +3689 +3684 +3683 +367900 +3673 +3667 +36523652 +3650 +364364 +3640 +3620 +361111 +3604127 +3595 +3585 +358358 +35791 +356356 +354eli +3548 +354545 +3524 +3522 +3520 +3519 +3488 +34851290 +3478526129 +3477 +344444 +3438 +3435 +34343 +3425 +342342 +3420 +3417 +340cuda +3406 +340000 +33yank +3398 +337799 +3375 +336933 +3360666 +335335 +3353 +33467 +334365 +3338333 +3338 +3337 +33335555 +333333a +33303333 +3322607093 +33153315 +331331 +3304 +3282 +3280 +3276 +3270 +326532 +326326 +3261 +325698 +325678 +3240500777 +323432 +3228 +3216789 +3215987 +321000 +3208 +3189 +3176 +3160 +3155 +3137 +3135 +31321dj51982 +3132 +3130 +31253125 +311313 +311260 +31121998 +311111 +311069 +31101999 +310870 +31082001 +31081963 +31078 +310773 +310761 +31072001 +31071956 +31052001 +31052000 +310368 +31031958 +3102 +31011962 +30secondstomars +3086 +308308 +3080 +307307 +3063 +304050 +3039 +3036 +3033 +301269 +301261 +3012292113 +301199 +30119 +301174 +301173 +30111998 +301099 +301069 +301063 +301056 +30101967 +30101959 +300992 +300960 +30091960 +30081999 +30081998 +300795 +300774 +30072000 +30071998 +300697 +30062000 +30061966 +30061964 +30061959 +30061957 +300566 +300563 +30051958 +300469 +300464 +30041945 +300398 +300373 +300370 +300369 +300368 +300363 +30031966 +30031956 +30031952 +300176 +30012002 +30011958 +30011953 +2smart4u +2pacshakur +2dogs +2cute4u +2bears +29922992 +29912991 +2970 +2968 +2964 +2961 +2960 +2958 +2955 +2953 +2936 +2930 +2926 +2919 +291273 +291265 +29121968 +29121959 +29121955 +291199 +291169 +291166 +29111961 +291098 +291097 +291096 +291073 +291061 +290971 +290961 +29092002 +29091958 +29091951 +290895 +290876 +290871 +29082000 +29081958 +29078 +290774 +290767 +29071966 +29071961 +290699 +290698 +290696 +290671 +29061953 +29058 +290573 +290567 +29051957 +29051955 +29051953 +290496 +290468 +290462 +29042904 +290368 +290365 +29022008 +29021968 +290176 +290174 +290170 +290164 +290160 +29011956 +28912891 +2877 +2876 +285485 +285285 +284968 +2843 +284063 +2833004 +28282 +281985 +2815 +2814 +281261 +28121999 +28121956 +281171 +28111955 +28108 +281075 +28102810 +28101956 +280965 +280962 +28091964 +28091958 +280907 +280870 +28081954 +28081952 +280796 +280770 +28071998 +28071963 +28071953 +280668 +280666 +280560 +28051959 +28051958 +28051955 +280498 +280497 +280494 +280471 +28041956 +28041955 +280361 +28031962 +28031957 +280303 +280275 +28022001 +28021957 +280196 +280163 +28012001 +2796 +2787 +2774 +2767 +2758 +2757 +2729 +2725 +271987 +271299 +271281 +271276 +271268 +271256 +27122003 +27121963 +27121952 +271167 +271160 +27111969 +27111966 +27111965 +271078 +271001 +270977 +270974 +270972 +270966 +27091961 +27091955 +270871 +270866 +270860 +27082001 +27081953 +270799 +270769 +270757 +270665 +270574 +270570 +27052000 +270472 +27042002 +27042001 +270377 +270367 +270363 +27032001 +270274 +270272 +27021959 +27021956 +27021955 +27011964 +27011961 +27011957 +2690 +2681 +266666 +266266 +2653 +2650 +263739 +262728 +261996 +2616 +261294 +261259 +26122002 +26121965 +26121963 +26121961 +26121959 +26121951 +261198 +26117 +261169 +261168 +261167 +261162 +261158 +26112002 +26112000 +26111967 +26111959 +261074 +261069 +261068 +26101967 +26101957 +260974 +260967 +260868 +260867 +26082000 +26081963 +26081961 +26081959 +260771 +260770 +260769 +26068 +260671 +260667 +260663 +26061999 +26061958 +260569 +260567 +260564 +260560 +26051960 +260461 +260459 +260370 +26032001 +26031958 +26031957 +260299 +260269 +26012002 +25tolife +2592 +258852258 +2588 +25845 +25832583 +25822582 +2580852 +2579 +2577 +2574 +25692569 +255ooooo +2556 +25544 +2553 +2548 +25451a +2545 +2540 +2533162 +25292529 +252903 +252 +25197 +25162516 +2516 +251296 +251294 +25121962 +251167 +251164 +251159 +25111965 +25111957 +251111 +251070 +25102006 +25102000 +250964 +250961 +25091960 +25082007 +25081959 +25081951 +250772 +25077 +250766 +25071963 +250698 +250696 +250670 +250669 +250659 +25061998 +250596 +250572 +250566 +250562 +250560 +25052009 +25051970 +25051963 +250500 +25041959 +250368 +250356 +25032001 +25031958 +25031952 +250303 +250293 +250269 +250268 +25022001 +250199 +250168 +250162 +25002500 +24hour +2495 +248163264 +2478 +2471 +246802 +2461 +2458 +24552455 +2438 +2437 +243243 +2430 +2429 +2428 +24262426 +24202420 +24162416 +241299 +241273 +241266 +241263 +241255 +241203 +241166 +24112000 +24111966 +241064 +241063 +24101999 +240968 +24092002 +24091958 +240897 +240895 +240874 +240862 +24082000 +240797 +240774 +240767 +240766 +24068 +240669 +24062000 +24061963 +24061959 +240565 +24051960 +240500 +240472 +240468 +240460 +240459 +240404 +240274 +240269 +240261 +24021961 +24021952 +24011956 +2398 +2397 +2393 +2390 +2387 +2360 +235623 +23552355 +235200 +2352 +2348TYty +23462346 +234556 +2343 +2339 +233445 +23232323q +232 +231996 +231990 +231987 +231983 +2318 +2317 +231423 +23132313 +231277 +231268 +231267 +23121966 +231164 +231070 +23101960 +23101959 +23101958 +23092000 +23091959 +23091958 +23091957 +230900 +230872 +230871 +230865 +23071989a +23071957 +230697 +230672 +230663 +23061962 +23061961 +230600 +230572 +230566 +230467 +230462 +23032001 +23031958 +23031953 +230297 +230266 +23021956 +230163 +230155 +23012004 +23012000 +22red22 +22ffkeij +2295 +229229 +228899 +228228228 +2279428 +2267137151 +22558899 +22558800 +225533 +22482248 +223333 +222322 +2222333344445555 +221991 +221990 +221989 +221985 +221322 +22128 +221267 +221222 +22121967 +221206 +22113 +22111957 +221063 +22101968 +22101955 +22091961 +220907 +220867 +22082001 +220799 +22078 +22077 +22071958 +220699 +220669 +220666 +220665 +220663 +22061959 +22061957 +220568 +220561 +220555 +22052002 +220464 +22038 +220364 +220355 +220297 +22028 +220273 +22022000 +22011959 +2199 +2197 +2190 +21812181 +2179 +2173 +2165 +2163 +2161 +215215 +21422142 +2138 +2136 +21222324 +212121sex +211983 +211270 +211267 +21121954 +211198 +211159 +21111961 +211070 +21107 +21101958 +21101957 +21101954 +210967 +210961 +210957 +21092001 +21091960 +210898 +210893 +21082108 +210797 +21078 +210771 +21071958 +210698 +21062001 +210598 +210566 +21051999 +21051962 +21051958 +210471 +210469 +210462 +210461 +210359 +21031962 +21031958 +210275 +21021950 +210211 +210165 +210162 +210159 +21011960 +210 +2098 +2097 +20932093 +2088 +2080 +20652065 +2056 +2054 +2050 +2039 +20302030 +20222022 +201990 +20132013 +20129 +201266 +20121955 +201197 +201168 +201163 +201161 +20111957 +20108 +201069 +201068 +201065 +201057 +20102002 +200996 +200966 +20091956 +200896 +200873 +20081999 +200769 +200757 +20071965 +20071952 +200700 +200695 +200660 +20061999 +200574 +200565 +200564 +200555 +20051951 +200507 +200500 +200469 +200467 +200461 +20041961 +20041957 +20041956 +20041955 +200400 +200398 +200372 +200370 +200368 +200366 +200365 +20032001 +20031958 +20031957 +200265 +20022000 +20021955 +20021952 +200201 +20020 +200194 +200167 +200165 +20012008 +20012004 +2001200 +20011999 +2000char +1wizard +1wildcat +1w2e3r +1samira1 +1qazwsxedc +1qaz2wsx3 +1q1q1 +1o3t6res +1liasita +1kitty +1jeffrey +1dollar +1bonjour +1avvatar +1aszxm +1a3g5m +1Zzzzzz +1Yyyyyyy +1Xavier +1Windows +1Warrior +1Uuuuu +1Teens +1Sucks +1Suckit +1Sssss +1Shelly +1Service +1Sarah +1Sandra +1Sally +1Rocky +1Reddog +1Raiders +1Psycho +1Princes +1Nathan +1Molly +1Marine +1Marcus +1Lucky +1Lisa +1Lights +1Kermit +1Jimmy +1Jasper +1Hooters +1Hobbes +1Hermes +1Harry +1Gabriel +1Freddy +1Directo +1Ddddddd +1David +1Cricket +1Cracker +1Cock +1Cobra +1Claire +1City +1Carmen +1Captain +1Brother +1Billy +1August +1Asdf +1Alexand +19kilo +1999666 +199900 +19988991 +1998199 +199712 +199711 +199696 +19952008 +199510 +199494 +1994199 +199418 +19932009 +19930901w +19930305 +19922009 +19922 +199206 +19911993 +199116 +199012 +198929 +198927 +19891991 +198908 +198902 +19882 +198819 +198815 +198708 +198666 +19862005 +19862 +198617 +198614 +198613 +198601 +198507 +19848 +198422 +198412 +198405 +198323 +19831986 +198310 +19821986 +19821985 +198214 +1981198 +198119 +198105 +198025 +198011 +198007 +19792000 +197821 +197812 +197723 +197719 +197701 +19761978 +1976197 +197617 +197612 +19741977 +197401 +197346825 +197323 +197310 +197224 +197219 +19690902 +196819 +196767 +19671297 +196700 +196600 +1964delt +196411 +196111 +196000 +195800 +195600 +195501 +194700 +194362 +19431943 +194145 +194123 +19351935 +1928374650 +19283 +191295 +191261 +19121999 +19121966 +19121963 +19121955 +19118 +19112000 +19111959 +19111951 +191096 +191092 +191088 +191074 +19091998 +19091968 +190895 +19082006 +19081999 +19081954 +190796 +190773 +190770 +19072002 +190708 +190696 +190694 +190674 +190667 +19061961 +190595 +190572 +19052003 +19052001 +1905199 +19051960 +19051958 +190496 +19048 +190467 +190466 +190460 +19042001 +19041999 +19041960 +190375 +19037 +190365 +19031967 +19031958 +19031956 +19031949 +190273 +190269 +19021964 +19021955 +190193 +190000 +1897 +1889 +188888 +187777 +1862 +1845 +18381505 +1832 +183183 +1829 +1828 +182000 +18152229 +181298 +181296 +181274 +181268 +181266 +181262 +181257 +18121967 +18121955 +18121954 +18117 +18111964 +18111958 +18111956 +18111954 +181067 +18101961 +18101960 +180976 +180973 +180967 +18092003 +18091962 +180897 +18088 +180877 +180858 +18081966 +18081960 +180800 +180697 +180673 +18061960 +180599 +180597 +180571 +180561 +180558 +18052005 +18051968 +18051957 +180505 +18048 +180467 +18042001 +18041961 +180398 +180376 +180370 +180363 +180298 +18021960 +18021956 +18021802 +180174 +180159 +18001800 +17days +1797 +1794 +1788 +1786 +17761968 +17711771 +176176 +1745 +1735 +1730 +1729 +172040 +171987 +171979 +171298 +171295 +171270 +17121999 +17121963 +17121956 +17121955 +171192 +171167 +171160 +17112001 +17111962 +17111951 +17101959 +17101949 +170971 +170959 +17092000 +17091967 +17091963 +17091954 +170896 +170893 +17088 +170868 +170861 +170859 +170856 +17081963 +17081957 +170799 +170769 +170767 +170766 +170759 +170758 +170670 +17062001 +17061963 +17061954 +170599 +170572 +170567 +17051954 +17041961 +17041959 +170406 +170364 +170273 +170263 +170260 +170251 +17021959 +17021956 +1701a +170179 +170163 +17012010 +17011955 +1696 +1691 +168888 +16777216 +1656 +1650 +1648 +1641 +1639 +16281628 +161992 +16199 +16197 +16171617 +16161 +16137055r +161299 +161298 +161265 +16122000 +16121962 +161163 +161067 +161066 +16101964 +16101958 +16101956 +160971 +160970 +160963 +16091957 +160895 +160860 +16082002 +160808 +16077 +160769 +16071967 +160670 +160668 +16061961 +16061960 +16061958 +16061956 +16058 +160573 +160558 +160494 +160472 +16042001 +16041957 +16041604 +160399 +160368 +160367 +160364 +160356 +16031997 +160296 +160272 +160269 +16021957 +16021954 +16021953 +160202 +160170 +16011999 +16011958 +159987 +15997357 +15975328 +1597 +15935700 +1589 +1588 +1586 +157408 +1572 +156789 +1555 +155115 +15451545 +15411541 +15381538 +1528 +151986 +151975 +151297 +151274 +15121964 +15121512 +151197 +15111956 +15111955 +15111954 +151099 +151068 +151062 +15102001 +15101999 +150999 +150973 +150970 +150969 +150965 +15091967 +150907 +150861 +15081958 +15081957 +150776 +150768 +15071965 +15068 +150673 +150668 +150664 +150657 +15061968 +15061967 +15061965 +15061963 +15061957 +15051505 +150471 +150468 +150462 +150460 +15042003 +15042002 +15041968 +15041955 +150368 +15027 +150265 +15021963 +15021956 +15021955 +15021949 +150195 +14f7245 +1498 +1484 +147852a +1472232 +1466 +1456321 +14523 +1449 +1448 +14361436 +14291429 +142536a +142414 +142356 +142000 +141298 +141297 +141267 +141264 +141260 +141259 +14121960 +14121955 +141200 +141170 +14111962 +14111960 +141070 +141060 +14102000 +14101965 +14101963 +14101962 +14101954 +14098 +140970 +14091958 +140870 +140869 +140861 +140854 +14081968 +14072008 +14072006 +14072001 +140693 +14068 +140671 +140664 +14061999 +14061967 +14061965 +14061954 +140599 +14052008 +14051961 +14051951 +140457 +140456 +14041967 +14041960 +14041952 +140362 +14032002 +140267 +14021958 +14021957 +140204 +140168 +140160 +140153 +140128 +14012006 +14012001 +14011966 +14011401 +140000 +13erin3 +13972684 +13799731 +1377713 +137465331 +1374 +136969 +13666 +1364 +13579000 +1352 +1346789d +13451345 +13246587 +132457 +1324354657687980 +13211321 +131990 +131985 +131983 +13181318 +131719 +13161316 +13151315 +1315 +13141516 +131261 +13121965 +13121961 +131194 +131167 +131163 +131162 +13111967 +13111966 +13110 +131098 +13107 +131065 +13102007 +13101958 +13092003 +13091958 +13091957 +130860 +13081964 +13081962 +130805 +130796 +130765 +130760 +130758 +13071999 +13071960 +13071307 +130701 +13068 +130668 +130666 +130665 +130562 +13051967 +13051961 +130498 +13048 +130463 +13041957 +13041955 +130367 +13031963 +130267 +13021999 +130170 +13012001 +130120 +13001300 +12string +12qwert +12q34w +126969 +12591259 +125634 +1252 +124567 +124512 +12411241 +123w123 +123stella +123sas4758 +123qwertyuiop +123qweR +123qwe4r +123q456 +123poi +123muda +123jkl +123india +123e456 +123Qwe +1239875 +1237890 +1236987a +123698745a +12369874123 +1236987005 +1235711 +1234zxc +1234tp +1234rfv +1234q +1234go +1234aaaa +1234aaa +1234Qwer +1234F4321 +123499 +12347 +12345zz +12345ua +12345roma +12345asdf +123456S +1234567y +1234567qwerty +12345678t +12345678qwertyu +12345678l +12345678k +12345678f +123456789azat +12345678999 +123456789987 +12345676 +12345654 +123453 +123421 +1234131 +12340000 +123321l +123321as +12332144 +123184 +123163 +1231313 +123123w +123123r +123123az +123123aa +1231239 +123123123z +12312300 +123078 +123060 +123012 +123003 +122900 +122869 +122852 +122679 +122676 +122580 +122572 +122344 +122269 +122221 +122198 +122170 +12214221 +122080 +121993 +121982 +12197 +121967 +121787 +121770 +12161216 +121578 +121570 +121567 +121512 +121482 +121481 +121377 +121355 +1213141516171819 +12129 +121254 +121247 +12121999 +12121958 +1212123a +12121234 +121161 +12112004 +121100 +121064 +12101957 +12100 +12097 +120961 +120959 +120954 +12092004 +12091971 +120900 +120863 +120853 +120848 +12081999 +12081963 +12081923 +120800 +12080 +120771 +12072008 +12061958 +12061953 +12051955 +12051954 +12050 +12047 +120465 +120454 +12041958 +12041955 +120399 +12039 +120365 +120362 +120360 +120358 +120357 +120265 +12021965 +12021956 +12021951 +120172 +12016 +120151 +11qqaazz +115476 +11441144 +1136 +113399 +113077 +113069 +113049 +112state +112plz +112956 +11291129 +112778 +112770 +112678 +112581 +112578 +112500 +112399 +112382 +112374 +112358132134 +11234 +112283 +112276 +112272 +112270 +112161 +112081 +112065 +111zzz +111995 +111967 +111963 +111953 +111266 +111261 +111222333q +11121958 +11118888 +11116 +111159 +111158 +111121 +11112 +1111199 +11111961 +111119 +111111aa +111101 +111069 +111065 +111063 +111050 +11101999 +11101996 +11101970 +110997 +110968 +110959 +11092002 +11091963 +11091959 +110899 +11082006 +11071968 +11071963 +11071960 +11062001 +110568 +110565 +110560 +110557 +11051963 +110463 +110457 +11042002 +11041960 +11041954 +110406 +110396 +110365 +11032002 +110296 +11021958 +11021957 +11021956 +11020 +110164 +11011955 +1091989 +1082 +106969 +105000 +1048576 +10351035 +103199 +103180 +103179 +102981 +102888 +102780 +102578 +102576 +102568 +102478 +1024768 +102476 +102462 +102456 +102370 +102356 +102275 +1021521 +10211021 +102078 +102030123 +101994 +101982 +101963 +101780 +101711 +101677 +101666 +101594 +101578 +101495 +101361 +101299 +10127 +101259 +10122001 +10121963 +10121953 +101214 +101212 +101172 +10117 +10111961 +101102 +10110 +101059 +101053 +101010a +101000 +100995 +100964 +100959 +10091966 +10091962 +10091959 +100898 +100895 +100894olol +100863 +10081961 +10081956 +10081951 +10072002 +10068 +100670 +10067 +10061957 +10061953 +10061006 +1005198 +100501 +10042007 +100399 +100369 +100365 +100364 +100358 +100357 +100270 +100260 +10021963 +100198 +100195 +100170 +10012002 +10011958 +10011950 +100111 +10001 +0okmnji9 +0o9i8u7 +0995 +0993 +0992 +09910991 +0991 +0988 +0987poiu +0987612345 +0985 +0983 +098098098 +0980 +0979 +0975 +0962 +0935 +091674 +091297 +091274 +091271 +09121964 +09121963 +091170 +091161 +09111964 +091073 +090984 +09092001 +09091969 +09091956 +09091955 +09091954 +090875 +090870 +090868 +09082000 +09081959 +090809 +090794 +09072004 +09071956 +090674 +090595 +090570 +090569 +090559 +09052001 +09041959 +09041953 +090382 +090378 +090377 +09032002 +09031962 +09031953 +090292 +090257 +090193 +090182 +090175 +090174 +090172 +09011965 +0900 +089300 +0882 +0875 +0868 +0867 +0856 +0855 +0853 +085213 +0826 +082000 +081955 +081269 +08121999 +08121961 +081208 +081195 +081167 +081157 +08112000 +081101 +081095 +081063 +08101967 +080996 +08091952 +080860 +08081968 +080776 +080772 +080767 +08072001 +08071967 +080696 +08061959 +080579 +080577 +080567 +080560 +08051960 +08051955 +080498 +080493 +080473 +080465 +080461 +08041955 +080392 +08031951 +080300 +080278 +080272 +080264 +080259 +08021966 +08021959 +0802 +080177 +080168 +0798 +077777 +0775 +0774 +0750 +0746 +0741020 +0732 +0727 +071262 +07121999 +07121962 +071162 +07111957 +07111956 +071097 +071063 +07101965 +07101959 +07091965 +07091964 +070907 +070896 +070868 +070867 +070865 +070863 +070861 +07081962 +07081952 +07071962 +070696 +07061999 +07061957 +070596 +070579 +07051962 +07051958 +070470 +070397 +070381 +070370 +07032006 +07031966 +07031964 +070275 +07022002 +07022000 +070197 +070177 +070174 +070161 +07011955 +07010701 +0698 +0693 +0685 +0678 +0662 +0638 +062274 +061295 +06128 +06121998 +06121967 +061178 +061166 +061162 +06112000 +06111960 +061098 +061093 +06108 +061067 +061059 +06101960 +06101958 +060995 +060969 +060963 +06092000 +060899 +060894 +06082002 +06081954 +060767 +060760 +060660 +06062002 +06061959 +060597 +060574 +060568 +060564 +060561 +06052005 +060504 +060499 +06041966 +06041956 +060366 +060299 +060297 +060277 +060274 +060263 +06021952 +06011962 +06011953 +0588 +0578 +0577 +0574 +0555 +053098 +0530 +0528325452mr +052585 +051979 +051974 +051973 +05180518 +051298 +051268 +051264 +05121969 +05121967 +05121963 +05121954 +05120512 +051199 +051195 +051173 +051172 +051171 +051170 +051162 +051160 +05111967 +05111960 +051099 +051067 +05102000 +05101962 +05101960 +05101958 +05101956 +05101955 +050994 +050971 +050969 +050967 +05092001 +05091955 +050865 +050855 +050800 +05072002 +05072001 +05071967 +05071963 +05071955 +050675 +050669 +050662 +05062003 +05062001 +05061962 +050606 +050599 +050597 +050567 +050566 +050565 +05051956 +050481 +05042007 +05041962 +050398 +050367 +050361 +05032001 +05032000 +05031956 +050299 +050294 +050261 +050199 +050169 +050166 +04yvette +0472 +0447 +0441 +0432 +042376 +041988 +041970 +041677 +04128 +041276 +041268 +04121999 +04121961 +041199 +041196 +041161 +041159 +04112000 +04111998 +04111969 +04111967 +04111962 +04111949 +041100 +041098 +041068 +041065 +041063 +04101998 +04101957 +040973 +040967 +04091999 +04091956 +04087 +04081999 +04081957 +040769 +040767 +04072006 +04071999 +04071965 +04071961 +040669 +040668 +04062004 +04061963 +040573 +040563 +04051964 +04051961 +04051954 +040467 +040465 +04042010 +04042008 +040395 +040369 +040363 +04032003 +040295 +040294 +040275 +040267 +040263 +040174 +040168 +040164 +04011999 +03whel +0397 +0382 +0372 +0341 +032257 +03160316 +031299 +031266 +031261 +03122001 +03122000 +03121968 +03121955 +031191 +031175 +03112000 +031066 +03101965 +03101963 +03100310 +030995 +03098 +030975 +030963 +030958 +03091970 +03091964 +03091963 +030866 +030865 +03081960 +030774 +030763 +03071961 +03071958 +03071957 +030673 +030667 +030665 +030661 +03062002 +03061964 +03061954 +030596 +030556 +03051953 +03051952 +030498 +03048 +03041962 +030364 +030355 +03032004 +03031965 +03031962 +03031954 +030294 +030275 +030272 +03022001 +03021959 +030170 +030164 +030163 +030161 +03011998 +03011966 +03011957 +03011954 +03011951 +02987654321 +0290 +0280 +0277 +0276 +0273 +02650265 +0259 +0247 +0229 +021974 +021294 +021274 +021269 +02122000 +021164 +021159 +02111954 +021094 +021093 +021092 +02102000 +02101999 +02101959 +02101955 +020995 +020961 +020899 +020867 +020864 +020860 +02082002 +02081956 +020771 +020770 +020767 +02071962 +02071960 +020664 +02061959 +02061951 +020572 +020566 +02052001 +02052000 +02051960 +02051950 +020508 +020499 +020471 +020470 +020469 +020464 +02042005 +02042004 +02042001 +02041956 +020360 +02031956 +02021958 +020197 +020168 +01mina +0189 +0184 +0180 +0174 +01477410 +01200120 +012000 +011291 +011274 +011260 +01122006 +01122001 +011175 +011172 +01111963 +01111954 +011096 +011092 +011076 +011066 +01101954 +01092003 +01092001 +01091954 +010907 +010896 +010867 +01082006 +01082001 +01081958 +01081955 +01078 +010759 +01071959 +01070107 +010699 +010697 +010674 +010663 +01062007 +010599 +010561 +010559 +010553 +01050105 +010465 +010463 +010460 +01042009 +010403 +01040 +010398 +010394 +010367 +010365 +01031964 +01031959 +01031955 +01031953 +01031950 +010297 +010264 +010260 +01021951 +010190m +01011949 +01011920 +010107 +009009 +007777 +00769 +007123 +00700700 +0068 +0066600 +0058 +004937 +0035 +0031 +0021 +001974 +001972 +00197 +001300 +001234 +000ooo +0000aaaa +00009870 +000044 +00000000a +zzzz1111 +zyryab +zxcdsaqwe +zxcasq +zxc789 +zxasqw1 +zx12zx12 +zx1234 +zvfqrf +zvereva +zverek +zuzanna +zuzana +zuma +zuerich +ztrewq +zrjdktd +zpdtplf +zozozo +zowie +zounds +zorr +zorina +zonk +zombie13 +zolotoi +zofran +zn87x54mxma +zita +zippy69 +zipp +zimzim +zimarules +ziggyh8 +zifnab +zhorik +zghjcnjcegth +zeroxm +zero12 +zenitram +zenith1 +zenden +zelenograd +zelda64 +zekedog +zeitung +zeilboot +zdenka +zazar +zatoichi +zasranka +zaremba +zaqzaqzaq +zaq321 +zaq1qaz +zaparilo +zangetsu +zakhar +zak123 +zaibatsu +zacker +zack01 +zMpIMejE +z1z2z3z4z5 +z1sn8h6m +yzf600 +yzerman19 +yz250 +yxes +yuu777 +yurik1 +yulya +yukons +yukmouth +yuka +yuhjnm +yue12345 +ytrhjvfyn10 +ytrhfcjdf +ytrewq321 +ytrewq123 +ytrewq1 +ytrcbz +ytktpm +ytkmpz +ytgfhjkm +ytcnthjdf +yrrral +yrogerg +youtoo +yousuck2 +yoursony +yourmother +youporn +yount19 +youngmoney +young8 +youfuck +youcef +youbet +yoshii +yolanda1 +yoko +yohoho +yogesh +yloe +yjhvfkmyj +yjdjvjcrjdcr +yjdjrepytwr +yildiz +yfnfkz +yfnfif123 +yfnfif1 +yfnfi +yflz13041976 +yfevjdf +yfdctulf +yfcnz1996 +yellow8 +yellow77 +yellow3 +yellow2 +yeller +yeknom +yeasty +yearight +yeababy +yc248 +ybrjkfq1 +yasu30 +yarrum +yanks99 +yanks23 +yankees23 +yankee2 +yanke +yad8yugg +xyzpdq +xxx999 +xu71eab7 +xtrem +xsw222 +xpressmusic +xposter +xoxota +xmodem +xlh883 +xesxes +xeljdbot +xdr5tgb +xavier12 +xaverian +xandra +wyclef +wwwwwwwww +wwewwewwe +wutangcl +wurly64 +wtfwtfwtf +wrigley1 +wpaflag +wowman +worms220 +worceste +wootay +wookiee +woodworm +woodsy +woodster +woodson2 +woodshed +woods1 +woodoo +woodlands +woodhead +wood1 +wonger +wombles +wolfy +wolfpak +wolfmann +wolff +wolfenstein +wolf17 +wobbly +withe +wishy +wired1 +winton +winter20 +winter03 +wingding +windy1 +windowsxp +windows98 +winch +wilmingt +wilmas +williamt +william9 +wilhelm2 +wildflower +wilderne +wildcat6 +wilbert +wiezda +wideglide +whoop +whizbang +whitley +whiterabbit +whiterab +whiteoak +whitehouse +whitecap +white22 +white2 +whisk +wheezer +wheeler1 +whale1 +wetsuit +wetpus +westy +westover +westha +westbury +westbrook +wesman +wesley12 +wertz +wertyuiop +wersdf +welsh +weihnachtsbau +weg228 +weeeee +webley +wealthy1 +weak +wcwwwf +wcwnwo +wazza +wayne2 +watson1 +watering +watergat +waterfalls +water2 +watanabe +warwagon +warrior6 +warre +warhawks +warezz +warder +wanna +wankel +wallyy +wallys +wallow +wallac +wakefiel +waiwai +waffle1 +waddle111 +w4ebkss4 +w1ll1am +w123456789w +vwbeetle +vtkmybrjdf +vr4m6d +vpered +voyageur +vovo4ka +vova666 +vova1996 +vova1988 +vote +voodoo3 +volvo123 +volv +volumes +vogue +vmax +vlasov12 +vlad12345 +vjybrf +vjwfhn +vjlthfnjh +vjkybz +vjhcrfz +vjbltnb +vivo +vivere +vitamins +vitamin1 +visiting +vision11 +visconti +virginia1 +viper97 +viper666 +vipe +viorica +violate +viola1 +vinogradova +vilnius +viking99 +viking44 +videogame +video123 +vicodin +vfylhfujhf +vfvfvjz +vfvf +vfuybn +vfrcjy666 +vfrcb +vfqjytp +vfndttdf +vflbyf +vfktymrbq +vfksi +vfhujhbnf +vfhrtnbyu +vfhrtdbx +vfhbyf123 +vfhbrf +vette77 +vetrov +vesna +verywell +version1 +verseau +verse +vernon1 +vernice +verdad +veranda +venuss +venuk48 +venturi +venture1 +vengeanc +venedig +vehfdtq +vegas69 +vbvjpf +vbscript +vbktlb +vbhytuhfv +vbhjytyrj +vazgen +vaz2105 +vavoom +vava +vaults +vatson +vasya111 +vasquez2 +vasilenko +vaquero +vanya123 +vanner +vanila +vangog +vanderbilt +vamos +valya +valvoline +values +vallon +valkrie9 +valkerie +validpwd +valhala +valerija +vale46 +valdes +valby +vakula +vaillant +vail +vadim1995 +vadim123 +v111111 +uyeptjnx +uwa2df2n +utica +uthvbjyf +uthnhelf +usuck +usher +usgrant +usafpaca +ursus +urology +urlcache +upsilon +upside +uproar +upnda1re +unusual +until +united2 +unitec +unitas +unified +uncletom +un4given +ummagumm +umass +umar +ultravox +ullrich +ulalas +ujkjcf +ujhjljr +ufdyfrecjr +uerori34 +uconn1 +uchiha +ubitch +ubisoft +ubetcha +uberl33t +uPfpRJew +tzewserr +tyrone1 +typer +tynio +tyler00 +twokids +twoboys +twizzle +twit +twirl +twinge +twincity +tweetie +tuyy +tuttar +tute +turnkey +turism +turion64 +turbulen +turbo98 +tuntun +tunisie +tunica +tunguska +tums +tumbleweed +tully1 +tucker01 +tuareg +tttyyy +ttigger +tsutomu +tsclient +trytobra +trythis1 +tryme +tryfan +try123 +trustno2 +trust23 +trunte +trumper +truelove1 +troytroy +troube +trotfox +troppus +troper +trombon +trolling +troll1 +trojans2 +troi +trixie1 +triumph7 +triton1 +tristian +trishul +trisha1 +trippe +trini +trigga +trieu1 +trider +tribe12 +treviso +trend +tremont +treebark +treb +treasury +trazom +travis12 +travies +travian +travers +trave +tratra +trapper1 +transsex +transporter +transistor +transform +transex +trancer +trammell +tramado1 +traktorji +traktorist +trains1 +trainers +tracy69 +traci1 +tracer1 +tracee +traccount +trac +tr0uble +toyota2 +toyota01 +townshen +towman +towerman +towels +toward +tove +totty +tottie +totten +toto12 +toskana +toshiaki +torrejon +torpedo1 +toronto2 +torie +toribi +tora +toppers +topaze +top100 +toots1 +toolman1 +tonyd +tony8669 +tony64 +tony20 +tony11 +tonio +tomthumb +tommy11 +tomislav +tomcruise +tomcat01 +tomasito +tom111 +toki +tokens +tokarev +tokamak +tojo +toenail1 +toddster +toddly +todd1234 +today123 +toccoa +tobycat +tobrin +tobie +tobe +tnuc +tnt2244 +tmnet12 +tmac +tm1205 +tlf1625 +tl1000s +tkjxrf +tjb611 +tizian +tisha +tion +tinuviel +tini0022 +timurka +timtom +tims +timoxa9 +timmyd +timecop +timbre +tilly1 +tihonov +tihomirova +tigr +tightpus +tiggy1 +tiggy +tigern +tiger88 +tiger15 +tiger007 +tige +tieten +tictoc +ticotico +ticonder +tickle20 +tical1 +tiberiu +tiamaria +thuy +thunderr +thunderbolt +throb +thrifty +though +thomass +thomas3 +thomas23 +thomas0 +tho279z +thirty3 +think1 +thin +thickone +thicket +thiaguinho +thexfile +thewiz +theused +thetwins +thethird +thesky +thesheep +theseus +thersh +thering +there1 +thenight +thenet1 +themask +theman69 +thekidd +thehill +thehawk +theguy +thegreatone +thegam +thefirm +thedrago +thedoctor +thecow +thechef +thebone +thebird +thebig1 +thebat +thebaby +theanswer +tharmika +tgirls +tgif +texas5 +texas01 +tetra +tete +tetatet +testtest1 +testings +testify +tester2 +terse +terryc +terror1 +terro +termin8 +terence1 +tennyson +tenn1s +tenbears +temuri +tempor +telex +telefo +teknik +teken +teh0123 +teens2000 +teddyboy +tecum +teclado +techno69 +tech1200 +tech1 +teabags +tdhjctnm +tbird1 +tazztazz +taylor6 +taylor5 +taylor22 +taxtax +taxes +tawney +taureau +tattooed +tatoshka +tatianna +tashia +tartaruga +tarnsman +taraska +tarasenko +tarah +tanyas +tanya1985 +tansy +tankman +tanka +tangtang +tango55 +tanger +tammyb +tammi +tamm +tamik +tambov68 +tambov +talofa +talktalk +talia +talant +takuang +taken +takeda +takataka +takahiro +taisiya +tai +tahir +tadlock +tadatada +tacky +tack +table1 +tabatha1 +tabarnac +t123456789 +swipe +swinglin +swingin +sweitz +sweetz +sweetsweet +sweetpea1 +sweetkiss +sweetest +sweetdreams +sweet18 +sweet12 +svobod +svintus +svetlova +svadba +sv650s +suzana +suzan1 +sutherla +susu +susisusi +susanm +surya +surgict +surfin50 +surfer01 +surfdog +supertec +supersport +supermodel +superman69 +supercool +super88 +super10 +sunset99 +sunnyb +sunday12 +suncoast +sunbelt +summer96 +summer4 +summer2010 +summer09 +summary +sulfur +sukumar +sujata +suhrob +sugar3 +sugar01 +sugabear +suffocat +sucky +suckss +suckscock +suckmyballs +suckmy +suckme1 +successful +succeed +suburb +styxstyx +stutter +stupidas +stunning +stump1 +stuff123 +studios +strunz +strungou +strudel +stron +strict +stricker +stretch1 +strega +straydog +straws +strawman +strawberr +strangers +stpstp +stover +storming +stoop +stonehenge +stoneh +stomat +stol1234 +stlblues +stinke +stinger3 +sting123 +stiller +stilgar +stewart20 +stewarde +steviera +steveste +stevenson +stevenm +stevemc +steveg +steve5 +stepup +stephen2 +stepha +stensten12 +stella2 +steklo +steffe +steep +steelroa +steeldoo +stedman +stealthy +stead +stayaway +stavropol +stavange +station4 +stasi22 +starwars2 +starwars12 +stars123 +starrs +starlog +stargate1 +starcraft1 +starch +stanhope +stallard +stalker2010 +stalingr +stal +stair +stagy +stage1 +stag +stacia +stac +stabler +sss333 +ssomeone +ssj4 +ssgohan +ss_pass +srvsrv +squared +squad1 +spurt +spukcab +spudley +spudboy +sprouts +sprinte +springbo +sprayer +spotlight +spotdog +spongebob1 +spokes +splint +splean +splashed +spitfir +spite +spinney +spikelee +spikee +spider69 +spider01 +spicedog +speleo +speedy17 +speedbum +speedbir +speed123 +speckle +special7 +special2 +spearman +spazzy +spasibo +spartak1 +sparky2 +spar +spanky11 +spank69 +spank123 +sp1200 +soyelmejo +souvenir +soupnazi +souper +soultake +souljah +souledge +sossina +sosososo +sorghum +sorensen +soray +sopwith +sophie11 +sonrisa +sonofa +sonnenschein +sonnensc +sonica +soni +sonechko +sondek +someone1 +solveig +solter +solon +solomo +solo1 +solito +solene +solcom +solare +solan +sokrat +soiree +sohorny +softer +sofija +sofian +sofia2010 +soccer88 +soccer08 +soccer05 +soccer0 +snowolf +snowman2 +snowma +snouty +snotball +snopro +snoozer +snook1 +snoman +sniffpol +snick +snegovik +sneeky +snayper +snax +snatch1 +snare +snapon1 +snapdrag +snake666 +snake11 +smutt +smuthut +smoking2 +smith12 +smile11 +smile101 +smetana +smashed +smartguy +smallz +smacks +sm4llville +sm4llvil +slyder +slutpupp +slutgirl +slut4u +slugfest +slowmo +slovenija +slovak +slough +slots7 +slots +slopes +slop +slonopotam +slipper1 +slipnot +slimline +slimjim1 +slimfast +slickrick +slickdog +sleutel +sleeper1 +sledhead +slavej +slap2000 +slant +slamslam +slamming +skywalker1 +skynard +skyliner34 +skyliner +skyler1 +skydive1 +skrilla +skool +skippy11 +skindeep +skimbo +skill +skiff +skies +skeeve +skcus +skaters +skateordie +skateboarding +skarbek +skagen +sk8ing +sk8er +sixpac +sixkids +siva +siunga12 +situs +sitoweb +sith +siste +sisson +sissdem5 +sisko197 +sisi +sis630 +sinus +sinne +singular +singsing +sindy +since +simulator +simpson2 +simples +simple12 +simonp +simonb +simms +simmons1 +simian +simcha +simbaa +simba01 +silverstar +silverki +silver3 +silver23 +silver10 +silveira +silvano +sillybil +silkroad +silkman +silke1 +silikon +silage +sikorsky +sigma4 +sigep +sig226 +sierra2 +siegfrie +sidonie +sider +siddartha +sibley +shyboy +shut +shura +shultz +shulman +shsvcs +shrugged +shriram +showmethemoney +showdown +shotta +shotput +shotgunn +shotgu +shorelin +shore6 +shooter9 +shocker1 +shmoo +shkoda +shizuka +shitbox +shirl +shires +shinta +shingle +shinebox +shine1 +shimsham +shiloh1 +shikamaru +shibby1 +shiatsu +sherin +shelly12 +shellfis +shelbie +sheil +shed +shazzam +shazam1 +shaz +shawn123 +shawarma +shauna1 +sharla +sharkboy +sharkbit +shards +shaquill +shaqfu +shaoli +shantell +shannon9 +shannon5 +shanic +shanes +shanel +shane12 +shanae +shalom18 +shale +shakeit +shakeela +shafter +shafer +shadrack +shadow98 +shadow0 +sfhj5484fgh +sexyslut +sexysara +sexym +sexygurl +sexybab +sexy777 +sexy2000 +sexy13 +sexmachi +sexaddict +sex4ever +sewell +sevinc +severo +seven07 +setset +sethanon +sesese +servers1 +server1 +serswet +serres +serpent1 +serotta +serha +serggalant +sergey2010 +serg123111 +serezha +sepia +seoul +seo21SAAfd23 +senor +sending +senator1 +sempron +sempai +semmel +selfmade +seldon +selacome +sektorgaza +seitnap +sehnsucht +segeln +seenow +seekup +seducer +sedge +seaworld +seaside1 +searching +sean69 +sean11 +sean01 +seals +seal01 +seafox +seabrook +sdfsd +sdfg +scumdog +sculpt +scubadiver +screwball +scredir +scratchman +scrapple +scrape +scout5 +scottd +scott5r +scorpio4 +scorpio3 +scorer +scooterb +scooter9 +scooby22 +scoobnot +sclgntfy +schulze +schroeder +schnuffe +schnucki +scavenger +scarf +scam +scalpel +scalp +scalia +saxet +savin +savages +savage2 +saute +saule +saudi +saucony +saturnsl +saturn96 +saturn69 +sassey +sashay +sasha666 +sasha5 +sasha2003 +sasha1999 +sasha1987 +sasha1985 +sasha10 +sash +sasas +sasaki +sasa123321 +sarahr +sarahjane +sarahj +sarahann +sarada +sapphira +saphira +sanyok +sanyo +sanya1 +santro +santiago1 +santhosh +santer +santander +santande +santaklaus +sansoo +sanmarco +sanman72 +sanjana +sandra13 +sandpipe +sandman7 +sandman2 +sande +sanda +samusara +samtheman +samsungs5230 +samsung5 +samsung12 +samstag +samples +samoth +samone +samoa +sammyp +sammyjo +sammyg +sammyd +sammyb +sammy98 +sammy66 +sammy23 +sammilly +sammi1 +sammas +samman +samjack +samaya +samantha2 +saman +saltwate +saltine +salta +salsal +salomon45 +salomon1 +salohcin +salmankhan +sallyb +sally2 +salgado +saleen1 +salary +sakara +saintes +saint7 +sailors +sailon +sailo +saidin +saibot +sahtm102 +sahtm101 +sahtm094 +sahtm045 +sahtm004 +sahelp +sagitario +sagesse +sager +sagar +sagan +safrcdlg +saffrejo +safet +sadsadsad +sadsack +sadida +saddlers +sadattim +sadamaza +sacura +sacre +sacha1 +sabirov +saban +saadmcfg +saab900s +s69!#%&( +s555555 +s229683 +s123456s +ryoohki +ryno +ryan21 +ry65v3a +rwuser +rutledge +rustyy +rustin +russian1 +ruslan4ik +rushin +rurouni +runt +runoobe +rune +runamuck +rumford +rumba1 +ruler +ruger9mm +rugbys +rubydog +ruby12 +rubleva +rubbers +rtvthjdj +rt934tt +rreedd +royhobbs +rover88 +rover75 +route666 +rotimi +rosso +rose01 +rosaria +rosamari +rosali +rootau +rooste +roost +rooney1 +ronnoc +ronda +romy +romeo2 +romcops +romaska +romantica +roman2 +roman1994 +roma2000 +roma1997 +roma1234 +rohan +rofl123 +roebuck +rodne +rockyone +rocky44 +rocksalt +rockohamster +rockies1 +rockets1 +rocket2 +rock13 +rock11 +rocio +rochell +roche +robusta +robotron +robinn +robina +robin4 +robertson +roberts2 +robert7 +robert17 +robert10 +robalo +rob1 +roach1 +rkty200 +rjynhjkm +rjvgfc +rjpjxrf +rjktymrf +rjirf1 +rjifhf +rjhjktd +rjcvjyfdn +rjcnhjvf +rizla +rivendel +riva +risolvop +risa +ripper69 +riposte +ripclaw +rink +ringmast +rimny77 +riley2 +rilero +righto +rigging +rietriet +ridgebac +ridehard +ridebmx +riddik +ridcully +rickyd +rickyb +rickover +rickjame +rickard +rick01 +richieri +richie1 +richardr +richardp +richardb +richard4 +rich69 +riceman +ricco +ricardit +rican +rica +rhtgjcnm +rhtdtnrf +rhtdtnrb +rhine +rhfgbdf +rhbcnz +rhbcnbyf123 +rfvtyrf +rfrnfr +rfrfirf123 +rfpone +rfpfrjdf +rfnz2010 +rfnz +rfnfyf +rfltncndj +rfhfcbr +rfgrfy +rfatlhf +rf101b +reymisterio +review99 +review1 +revenge1 +retupmoc +retribution +results +research1 +repsol +reppep +renuka +renshi +renegad +renee2 +renee123 +rendezvous +renaul +renata1 +rena +remind +remedios +rembrandt +remaro +rellek +rekord +reklaw +reklam +rekcuf +reign +rehcfyn +regit +reggie12 +reg123 +reece1 +redwin +redsoxs +redsox34 +redseal +redros +redqueen +rednight +redips +redhat91 +redhat500 +redeem +reddo +red777 +red456344 +rector +recruiter +recchi +rebelins +rebel10 +realtor1 +realesta +ready4u +reaccount +rc10gt +rbgfhbc +razvedka +razraz +razina +rayzor +raytheon +rayra +rayjay +rayburn +rawkus +raving +raver1 +ravenous +ravenn +raushan +raul2000 +rattus +ratchet1 +rastro +rash +rasaki +raptor01 +rania +rangerov +ranger97 +ranger9 +ranger66 +ranger32 +ranger3 +ranger23 +ranger22 +ranger19 +randyman +randall1 +rancid1 +ramzan +ramones1 +ramdisk +rambling +ramarao +ramani +rallyman +rallen +ralf +rake +rajini +rajani +rajan +raisa +rainier1 +rainey +rainbowsix +rainbow9 +rainbird +raina +raikkonen +raiders8 +rahimov +raheem +ragnaro +raghav +rafanet +raekwon +radu +radrat +radmila +radisson +radiolog +radiation +rader +rackem +rachel99 +rachel2 +rachae +racerx1 +raceme +raceman +rabbit99 +rabat +r5t6y7u8 +r55555 +r3r3vi3wacc3ss +r03461 +qwertyuiopasdfghjkl +qwertyuiopasdfgh +qwertyasdf +qwerty96 +qwerty84 +qwerty76 +qwerty72 +qwerty56 +qwerty2000 +qwerty1993 +qwerty18 +qwerty17 +qwerty123321 +qwerrewq +qwerpoiu +qwerasdzx +qwer666 +qw12er34ty56 +quoz99 +quote +quite +quirly +quinn1 +quinlin +quijote +quicky +quicks +queue +quepasa +quedog +quarry +quarantine +quanta +quackqua +qsdfghjk +qsdfg +qrg7t8rhqy +qqqqq2 +qqq12345 +qbert1 +qazzxc +qazxqazx +qazxcde +qazx12 +qazwsx7 +qazse123 +qazedc123 +qazWSXedc12 +qaz2626 +qaz1wsx2edc3 +qaz111 +qaqa +q3538004 +q2w3e4r5t6y7 +q1w2e3r4t5y +q1q2q1q2 +q123Q123 +q123123123 +q1205199333 +q111111q +q1111111 +python1 +pyroman +pyrex +pyfrjvcndf +pwned +pw5600 +pw4sex +puzzles +putters +putput +put +pussyhole +pussygod +pussydick +pussy9 +pussy18 +pushpa +purplehaze +pupil +punahele +pumpitup +pumpit +pulpfiction +pugster +pugsley1 +puggy +puffdaddy +pucci +puavbill +psytrance +psalm91 +proy33 +providence +prostaff +prosoft +properties +propagan +promoter +promod +projekt +profound +profess +probe1 +proach1 +pro123 +prize +privat1 +pristine +princy +princess3 +princess12 +prince19 +prince10 +primate +prettygi +pressup +pressed +presidio +presents +prem +prelude2 +prelest +predator1 +preach +pranav +pragmati +praetorian +prabhu +ppussy +ppp000 +powerpuf +powerplay +poweron +postal2 +posta +portugue +portrait +portofin +porthole +porte +porovoz123 +pornoo +porn12 +porn01 +porksoda +popup +poptop +popping +poppel +popop +poper22 +popcorn2 +popapopa +popa123 +pooters +pootang +poopypoo +poops +pooppy +poopoop +pookie69 +pooja +poof +poodoo +poodles +poochi +ponygirl +ponch +pompiers +pompie +pomapoma +polyakov +polska2 +polosport +poloman +polli1 +politica +polipoli +polino4ka +polina2008 +polina2005 +polina1 +polici +polecatt +polaris2 +polara +polanski +pokopoko +poko +pokemon9 +pojke123 +poiuyt1 +pointy +pogues +poderoso +pocomoke +pocahontas +plutos +plutarch +plunge +plugh +plough +pleasur +playit +player22 +player2 +player11 +playboy8 +playah +platte +platos +plasticm +plasticf +plasticb +plante +plans +planetar +planet99 +planar +placenta +placebo1 +pizzaa +pizdez +pitviper +pitts +pits +pito +pitney +pissy +pissflap +pippip +pipicaca +piotrek1 +pioneer5 +pinkslip +pinkpony +pinkmoon +pinkish +pinking +pingpon +pingon +pines +pinder +pilou +pillars +pilgrim1 +pike2012 +pike1868 +pikapi +piglet69 +piglet1 +piggy2 +piggy15708 +piesek1 +pierre1 +pier +pieface +pie12345 +pie +pictman +picsou +pickme +pickerin +piccol +picard47 +picard01 +pianeta +piacenza +photography +phishman +phazer +phatcat +pharmd +pfrhsnj +pfqrf +peyton18 +petticoat +petrusha +petrosyan +petpet +peters1 +peter001 +persson +personne +perpetua +perova +peropero +peroni +perish +perform +perfectexploiter +pepsinsx +peps +pepper99 +pepper10 +pepete +pepe01 +pennydog +pelon +pellet +peeter +peetee +pechenka +pease +pearlja +peacenow +pdnejoh +pchela +pbeach +payne1 +payman +pavlota19 +pavel123 +pauline1 +paulas +paula12 +paul77 +paul22 +patryk1 +patroclo +patrick5 +patricia1 +patou +patoloco +patlabor +patina +patholog +patchess +pasty +pastis +pasta123 +passwort1 +password101 +passwod +passwd01 +passw1 +passkey +passgas +pass2000 +pashademon +pasa +party69 +partie +parpar +parola12 +parkers +paris2 +parfour +paredes +pardonme +paratroo +parasol +parapa +parana +paramed +paragon1 +paradiz +papuas +paps +papoose +papone90 +papaw +papa1234 +paokara +panton +panthose +panther9 +pantera2 +panova +panini +panina +panika +panels +pane +pandora7 +panda97 +panchit +pan27043 +pammie +pam2233 +paloma1 +palmer1 +palme +palette +palermo1 +palce +palamino +paladino +paladi +pala +padraic +padma +paddy123 +paddle1 +paddingt +packs296 +packman1 +pacific2 +paashaas +p51mustang +p3corion +p0tl8dje +p0rnstar +p08158 +ozzyfan +ozzfest +oyoyoy +owned123 +owenhart +overhead +outlaw1 +outatime +ounce +otrends +osvald +ostate +osit +osier +oscarito +oscar69 +oscar11 +orvokki +orville1 +orologio +orinoco +orian +orhideya +orhidea +org4sm +oreocat +oreo11 +ordnance +ordinateur +orazio +oray74 +orange13 +optional +optimal +openupno +opelastr +opa123 +oodles +ontheroad +onrop123 +ononon +onlyone1 +oneworld +onestop +onedog +one1two2 +one1 +ondine +omygod +omglolomg +omfg +omegaa +olusia +olly +ollie123 +olk98usr +olivier1 +oliver10 +olifant +olga77 +olga2010 +olga1984 +olga1978 +olga1971 +olegna +oleg1992 +oleg1991 +oleg1973 +oleg1234 +oleacc +oldcar +oklapro +oioi +oiauerk39 +ohmss101 +ogrady +oflove +oflife +offering +ofen6 +ofborg +oduvanchik +odinodin +odess +odbcinst +octubr +october31 +octet +oconnell +oceania +obobob +oblako +objsel +obinna +obama +oasiss +oakenfol +nyrangers +nymets86 +nwctrinity +nutty1 +nursing1 +nununu +numnum +nummer1 +number4 +number22 +nukenuke +nugs +nubnub +nubia +nuance +ntfsdrct +ntense +nozadze +noxious +nowayin +noviembre +november2 +nova12 +noumea +notrab +notone +notnot +nothing2 +notepad +nostril +nosova +nosotros +northwest +northland +norris1 +norrie +norad +nopain +noobie +noo2ga +nonnie +nomeacuerdo +nolimit6 +nolimit2 +nola27 +nokian97 +nokia72 +nokia6600 +nokia3120 +nokia3100 +nokia12 +nokia11 +nohanada +noclaf +nochnik104 +nobody1 +nobby1 +nobber +noahsark +noah123 +no1z +no1knows +nntpapi +nnnnnnnnn +nnnmmm +nnamdi +nivlac +nivek1 +nitty +nitra +nithya +nishiki +nisha +nirvana2 +ninpo +ninochka +ninjamonkey +ninja900 +ninja69 +niners1 +nimnim +nilufar +nikolya +nikolj +nikki6 +nikki12 +nikita2011 +nikita1994 +nijmegen +nightly +nightlife +nigger2 +nigels +nigar +nicolo +nicoletta +nicoleta +nicole19 +nicole0 +nicolay +niclas +nickjonas +nickc +nick21 +nici +nichole1 +nicanor +nhatrang +ngga +nfyz1987 +nfnecz +nfhfctyrj +nfhfcjd +neznakomka +nextone +newyork0 +newt7899onrs +newsman +newmark1 +newleaf +newkid +newfound +newboy +neversmile +neversaynever +neversaymypassword +neverlan +nevera +netter +neto +netnet +netmadge +netlpd +netip6 +netel90b +net1394 +nesakysiu +nerf +nepali +neon99 +neo20xx +nenita +nemesis7 +nemesis6 +nellie1 +neither +neilneil +neil27 +nehpets +neekeri +needy +need +necromant +nebulous +ndisip +ndbyrb +ncc1701b +nbvjxrf +nazar +naughtyb +nato +nationals +nathanm +nathan01 +nathal +nataku +nata777 +nata12 +nat123 +nastygirl +nastyass +nasty69 +nasty6 +nasty123 +nastay +nasir +nascar48 +nascar4 +nascar12 +narvik +narutouzumaki +narcis +naranja +napper +nanna +namath +nakatomi +najah +naima +nahtanoj +nagato +nagash +nagano +naga +nafania +nafana +nadia123 +nadanada +nacnud +nachodog +n7Dj3Saa +n123at +mytest +mystra +mysmut +mysex +myrzik +myoplex +mynigga +mylif +myjeep +mybud +myangel1 +my4kids +mwalsh +muzzy +muzyka +mutty +muthafuc +mutation +musty +mustang50 +muskoka +muskies +musik13 +musicc +music12 +musial +mush +musashi1 +musa +murre +murka15 +murillo +murf +muratti +murasame +munter +munky +mundaka +mumanddad +mullin17 +mulder12 +muhamed +muggs +muffinma +mudflap +mu11igan +mswrd632 +mstask +msnetmtg +msinfo +mscorsecr +mscorpe +mscormmc +mscorie +msadds32 +msadco +ms1234 +mrtibbs +mrmagic +mpgs +mowers +moveit +mousy +mousee +mous +mountain1 +mound +motorspo +motorola1 +motl855 +mother3 +motel6 +mostar +mossman +moss25 +mosesblk +moser +morpho +morozko +morgan23 +moreman +moreira +morango +mops +moppie +moose11 +moore2 +moondog1 +moondance +moojuice +moog +monza +montrell +montre +monterrey +montana8 +monster3 +monster0 +monkeynuts +monkeydo +monkeyas +monkey33 +monkey15 +monitor3 +monimo +mongush +moncho +monchi +monange +monaghan +momoko +mommy3 +moments +mombasa +moloko1 +molly7 +molly5 +mojo123 +moiseeva +mohsin +mohicans +modelt +model10 +moccasin +mobetta +mntwins +mnlicens +mnbvcxza +mmmkkk +mmmbeer +mmm147258 +mmm123 +mmartin +mmaaxx +mm1234 +mjordan2 +mjohng69 +mj23 +mitter +mitsub +mite +mitche +mistyblu +misty69 +mistik +mistert +misterma +mistere +misspigg +missmolly +mississipp +missis +missing1 +missin +misamisa +mirabella +mintman +minster +minoan +minky +minkie +ministr +minion33 +minioc +minimi +miniman +minge +minett +minecraft1 +mine99 +mindy123 +mindcrim +minaise +mimmo +mimi12 +milto +milou +milord +millos +millman +millie12 +miller69 +millar +milesdavis +miles123 +mildred1 +milanka +milamila +mikvarxar +mikimaus +mikeyt +mikey69 +mikesch +mikem +mikell +mikeb +mike57 +mike111 +mike09 +mika12 +mik6178 +miheeva +miguelange +miguel12 +mifune55 +midwife +midas1 +microtek +mickel +micio +michaeln +michaelf +michael13 +michael10 +micah1 +miaumiau +miami69 +mia0561 +mfmhzn5 +mexiko +mexico86 +metzger +metron +metroman +metheny +meter +metcalf +meta +mess11 +mesohorn +meshugga +merl +merkava +merino +meriba +merdas +mercenary +mercado +mention +mentat +mensa1 +mens +memor +meme123 +melaniec +meissen +meisha +meiser +meinolf2 +meiner +meimei +mehves +mehoff +megusta +meganfox +megagerka +meep +meenter +meemaw +medus +medstar +medico +medicare +med123 +mecanic +mebaby +me262a +me123456 +mdmzyxel +mdmusrk1 +mdmtdkj7 +mdmsun2 +mdmrock +mdmnttp +mdmgl006 +mdmgl005 +mdmgl002 +mdmcpq2 +mdmboca +mdmaiwa5 +mdmaiwa4 +mcnasty +mccord +mcclane +mccarty +mbrown +mazda323f +mazda2 +mazafaker +mayer +maybelle +maybach +maxxim +maxogo +maxivan +max666 +mawmaw +mausen +maura +matto +matthewp +mattes +matric +matr1x +matiss +mathmath +mateus1 +mateo1 +matado +masterx +master999 +master9 +master20 +master101 +masina +masi +masha1995 +masamasa +masahiko +maryna +marylin +mary1234 +martys +martin3 +martens +marshall1 +marsface +marron +marmstad +marlb0r0 +markymark +markovka +marko1 +market1 +mark99 +mark84 +mariu +mariol +mario7 +mario69 +mario2 +marina86 +marina20 +marina13 +marico +maricel +marianas +maria7 +margarida +marder +marcop +marco12 +march7 +march27 +march26 +march25 +march24 +march198 +march16 +marcelo1 +marcellu +marcel1 +marbury +maraud +maranata +mar +mapleleaf +manzan +mantis1 +mantel +manpreet +manowar1 +manowa +manouche +manon1 +manny2 +manmanman +manko +manjula +manito +manit +manina +manija +manhood +manester +mandymoo +mandigo +mandate +manchesterunited +manatee1 +manasa +mamoru +mammut +mammon +maminka +mamedova +mambo5 +mamasha +mamanunya +mamami +mamakin +mamadas +mama555 +mama21 +mama1998 +mama1982 +mama1971 +mama1955 +mama1953 +mama13 +maluco +maling +maldito +malden +malady +maks96 +maks2011 +maks1996 +makisupa +majora +mainstay +mainline +mailme +maikel +maigan +maide +mahope555 +mahmut +mahmudov +mahalk +magus +magura +magrat +magoos +magill +magika +magic3 +magic10 +magic01 +magee +magal +mag123 +mafald +maelstrom +mady +madriver +madmonk +madmoney +madmax2 +madmac +madison7 +madhavi +madge +maddog20 +maddog13 +macron +macon +maclean +mackster +macko +macizo +maciek1 +machete +macfly +macca64 +mac2olli +m55555 +m3m3m3 +m221087 +m1a2r3i4 +m0nster +m019m1 +m00m00 +lyrical +lynnie +lyman +lusty1 +lusaka +lunit +luna123 +lumpur +lump +lumen +lula +lukoil +luke1234 +luiza +luismigue +lughser +lufkin +lucy69 +lucky77 +lucky111 +lucille1 +lucile +lucca +ltlvjhjp +ltdeirf +lsutigers +lslsls +lsdlsd +lovett +lovesit +loves1 +lovers2 +loverboy1 +loveplanet +loveme69 +lovem1 +lovely2 +lovelisa +loveing +lovein +lovei +lovehurts1 +lovebug1 +love9 +love89 +love27 +love1986 +love17 +love16 +loureed +louisvuitton +louis11 +louie2 +lotuss +lothlorien +loserman +loser69 +losang +loreto +lordofth +lordgod +lord123 +loquito +loot +loops +longcock +loneranger +londoner +london21 +london10 +lolpot +lolp +lolo1234 +lolo123 +lollakas +lolipo +loliloli +lolikas +loki13 +loki12 +loki01 +logs +logist +logdog +logan12 +loga +lofty +locur +locoman +locksley +locker21 +locals +local3 +lobit +lmnop +lkjasd +ljvjdjq +ljhjujq +ljhjattd +ljdthbt +lizzy2 +lizet +lizardsquad +liven +livelong +litvinov +littlefucker +littled +lithe +lita +liston +listerin +lisalis +lionkin +linuss +linker +lingua +liners +lineika +lineage123 +lindyhop +linder +lindak +limpbiz +lilyrose +lilyfire +lilies +likuna +likethat +lightyear +lightyea +light2 +light100 +ligaya +lifecare +lien +lickthis +lickers +licious +library1 +liberato +libelula +lhfwtyf +lhfrjif +lhfrekf +lfymrf +lfybkjdf +leyla +lewinsky +levski +levis501 +levina +leviatan +letsrock +letmen +letmec +letitgo +letgo +leszek +lera1998 +leprechaun +leopard2 +leonardo1 +leocat +leo12345 +lensman +lenoir +lena1996 +lena1990 +lena12345 +lena1234 +len4ik +lemony +lemondrop +leman +legere +legendar +legal1 +leeway +leeward +leeman +leefl850 +leedsunited +ledoux +ledanac +leclerc +leche +lebanon1 +leardini +leandr +leaky +leadership +lbpfqy +lbfyrf +lazybone +lazyass +lazers +lazaro +lawrence1 +lawrenc +lauris +laura6 +latigo +latifah +latifa +latif +lateef +lasto4ka +lastdon +lastchance +lastchan +laska +lasdkh +larryh +large1 +lardog +lapina +lapata +lanvin +lantern7 +lantern6 +lanmannt +lanka +lands +landon1 +landen +lambretta +lambert1 +lambeau +lalena +lala1234 +lakini +laketahoe +lakers13 +laidback +lagavulin +lagalaxy +lafarge +ladybugs +lady123 +lada2110 +lacy3 +labtech +lablab +labas +l8g3bkde +l84ad8 +l30722 +l1e2n3a4 +l1510s +l0sk2e8S7a +kyra +kyle99 +kyle2000 +kyle12 +kykyky +kuznecova +kutje +kurvica +kurdistan +kurac +kunsan +kuldeep +ktyj4rf +ktyecmrf +ktjgjkml +ktjgfhl +krystina +krutoi +krunch +krswood +krsone +kristof +kristina123 +kristia +krista1 +krissy1 +kris123 +kreativ +kraven +kraut +krasava +kranta1 +krame +krallen +kournikova +kotofey +kostia +kostenko +koskos +kosenko +korsika +kornhead +korn69 +kopper +kopet +kopeika +kool123 +kooky +koniak +konakovo +konakona +komputer1 +kompot +komarik +kolumbus +kolos +kolombo +kolokolo +koljan +kokikoki +kojzgsf +kojiro +koeman +kody +kodi +kodaks +kochanie1 +kobe66661 +kobalt +knut +knoxvill +known +knowit +knot +knittin +knight2 +knifes +kneesox +knacker +kn1ght +kmjnhbgv +kmh12025476 +kmg666 +klop123 +kleevage +klaxon +klavdia +klara1 +kkonradi +kjubyjdf +kjubyjd +kjubrf +kiyoshi +kitty7 +kitty69 +kitty12 +kittty +kitten12 +kitka +kitchens +kisulja +kissshot +kissrock +kissinger +kissel +kiss2000 +kisha +kirill1996 +kirill1995 +kirik +kippe +kinski +kinky2 +kingly +king74 +kimura +kimosabe +kimmel +kimlee +kimjjang +kimi666 +kimberlee +killteam +killeri +killer45 +killer4 +killer1234 +kill123 +kikakika +kika +kiera +kielbasa +kickboxing +kickball +kickas +kiakia +kharkov +khalsa +khali +kgosfm +kfycth +kfdfylf +kezman +keynes +keyboards +kevint +kevina +kevin66 +kevin3 +kevin21 +kevin0 +kevdog +ketch +kester +kenwort +kenny2 +kenguru +kenbob +kellyp +kellyk +kelly13 +kellie11 +kelebe +keksik +keitha +keikei +keeshond +keepit +kearns +keane +kealoha +kds2141 +kbytqrfpkj +kbxyjcnm +kbndbytyrj +kbcnjgfl +kazane +kayser +kaylee1 +kaylas +kaylan +kayden +kayce +kawazaki +kaviar +kaufmann +katze1 +katysha +katya1 +katrinka +katrien +katja1 +katier +katiee +katiecat +katie69 +kathym +kathyl +kathyb +kathmand +katey +kater +katarzyna +katarsis +kasser +kasia11 +kasablanka +karyn +karper +karpenko +karlson +karlik +karlie +karenc +kareltje +kare +karamazo +kapanadze +kaoru +kankudai +kandy +kanazawa +kanaka +kamloops +kameleon +kambala +kamakura +kamael +kalli +kallen +kalikali +kale +kaka12 +kaise +kailee +kaikias +kahlil +kadabra +kacperek +kachok +k7wp1fr2 +k240889 +justlove +justjack +justin8 +justin6 +justin20 +justify +justice4 +justform +just1n +jupiter5 +jupiter4 +jupiter3 +junkers +june2902 +june2719 +june20 +june19 +june13 +jumpstar +jumpmast +jumphigh +jumper1 +julyjuly +july10 +juliet1 +juliem +julief +julie69 +julie01 +juliann +juliaa +jukjuk +juice123 +juggalos +judo +juanjos +juanj +juanc +juan23 +jtccbill +jt1234 +jrock +jovian +joshua5 +josh1234 +josel +jornada +jorgito +jordi +jordan13 +jopajopa +jookie +jone +jonata +jollyrog +joker8 +jokeman +jojo99 +johnwayne +johnny25 +johnlove +johnjay +johna +john3 +john27 +john17 +johanson +jogger +joeybear +joeseph +joejoe1 +joeimlea +joeeee +joeblow1 +joebar +jocelyne +jobshop200 +jobhunt +joaopedro +jo1jo1 +jmiller +jmhj5464dcx +jmarie +jmac +jktu +jktcz +jjjj1 +jj9684 +jizzer +jimmymac +jimmyjoe +jimmy3 +jimijimi +jetsfan +jetsam +jesuslives +jesus4 +jester11 +jeste +jessica9 +jessica5 +jessica12 +jesika +jerry3 +jeriryan +jeremy123 +jennyy +jennyfer +jenny12 +jennifer8 +jennif +jenney +jellob +jeffgordon +jeff99 +jeetkune +jeeptj +jeepcj +jeep2000 +jeep01 +jeejee +jedi123 +jedi1 +jdogg +jd4430 +jcyjdf +jb1234 +jazzmine +jazz12 +jazira +jayz +jaynes +jayme +jaylan +jayc +jaws3d +jawa +javelina +javany +jaspers +jasper123 +jasper10 +jaspal +jason8 +jason76 +jason007 +jason001 +jasmines +jasmin1 +jasja +jarrell +janwood +janusz +janson +jannik +janete +janes +janek +jander +jamin1 +jamieson +jamied +jamieb +jameso +jamesn +jameslee +jamesf +james111 +jambo1 +jamar +jamais +jamaican +jake21 +jake00 +jailer +jaguarxk +jaguar01 +jagoff +jade12 +jade1 +jacobyte +jacob22 +jackson9 +jackle +jacking +jack8on4 +jack15 +jack00 +jacare +jabba2 +jGlo4erz +j123456789 +ivashka +ivanovna +ivan777 +ivan1984 +ivan12 +iuliana +itin +itchitch +italians +isxxxvip +issexy +isotta +isnice +ismayil +islan +isildur +isidro +isidoro +isidora +isetup +irongate +ironcouc +ironclad +irjkf1 +iriver +irishboy +irish88 +irish11 +irina1980 +irina1978 +irfan +iran +ira1985 +ipswitch +ipswich1 +iponow +ipodnano +ipod +ioio +inthere +intervention +interdit +interceptor +intents +integra9 +instation +inspired +insdprgm +insan +innochka +inman +inline6 +inky +injector +initiald +inhale +ingrid1 +ingraham +ingot +info123 +inetopts +ineedyou +ineedajob +ineedajo +indycars +indulge +indu +indio +indie +index1 +indabag +includecatal +imsingle +imsexy +impeach +impalas +immorta +immense +imdaman +imagery +imafreak +iloveyou7 +iloveyou. +ilovekat +ilovejoe +iloveindia +ilovebig +illini11 +ilikecheese +ikillyou +ikikik +iisrstas +ihateniggers +igor12345 +ignatenko +iggyiggy +igeldcheat +ig2651 +ifhbyufy +idspispo +idol +idiocy +idinaxyi +icwtutor +icpicp +iconnect +icehockey +icehocke +icedog +ice +icansk82 +ibytkm +ibiza1 +ibis +ian123 +iamthebe +iamsorry +iamgood +iambob +ialmnt5 +i740nt5 +i23456 +i123456 +hypnosis +hyannis +hvac +huzzah +huthut +hustlers +hushhush +hunter6 +hunter06 +hunter00 +hunt4red +hunnybunny +hunbun +humblepi +hulkhulk +huivam +hugo1 +huckfinn +hubbahubba +htubjy +htptlf +hrpsy +hpotter +hpkaaa +housetab +housedoo +hotwomen +hotwire +hotteens +hotte +hotpuss +hotmomma +hotfries +hotbuns +hotbo +hotblond +hot4u +hot4sex +hosting +hostel +hossman +hosebag +horsepow +horrible +hornyy +horned +hornblow +hoppla +hoppel +hoppe +hope123 +hooters69 +hoolef +hooker2 +hooker1 +hoohaa +honey24 +honda6 +honda00 +homestar +homerun1 +homer7 +homebody +homealone +homburg +hombres +holygrai +holt +hollycat +hollabac +holborn +hoi123 +hoghog +hofstra +hoenix +hockey7 +hockey15 +hobie1 +hobbit1 +hobbies +hmmapi +hkmp5sd +hk1997 +hjvfirf1 +hiya +hither +histor +hirotake +hirohiro +hiro09 +hireme +hinckley +hina +hilo +hilmar +hilaryduff +hilander +highroll +highboy +hiding +hideaki +hialeah +hhhhhhhhhhh +hhadkd99 +hezekiah +heymoe +hewett +hettie +hessen +heslo1 +hernia +herndon +hermite +hermann1 +herm +here2 +hercul +herbalife +henry7 +henery +helpmeno +helmer +hellojed +hello4 +hello21 +hellish +hellep +hell312 +heliski +hejhej123 +hejhe +heisenberg +heimat +heidiho +heidelberg +hegel +heatherb +heather3 +heated +hearts1 +heartbeat +heartagram +headman +headbang +head69 +hbomb +hbceyjr +haywire +hawke +hawk33 +hawk11 +havock +havens +haveit +haveblue +hatstand +hathor +hatch +hasilein +hasegawa +hartke +harry69 +harry4 +harry12 +harringt +harriers +harrahs +harpos +harmonie +harleys +harley10 +harley05 +harkonen +hardon1 +hardluck +hardkore +harcourt +harbinge +harass +happyg +happyfeet +happyass +happy77 +happy4 +happ +hans123 +hannover96 +hanniba +hannele +hannas +hannah7 +hannah3 +hannah0 +hankyung +hankyun +hankhill +handiman +hammy1 +hallon +haller +halina +halflif +halcon +hakunamatata +haker +hairypus +hairyass +hailee +haile +hagler +hagar +hafeez +h_froeschl7 +h0td0g +gwydion +gvd900 +guwip5 +gustavus +gusdog +gus123 +gunmen +gummie +gumboot +gumbee +gulshan +guldana +guitar99 +guidog +guggen +guestpas +guessme +gudvin +guanaco +gu1tar +gtycbjyth +gtnhj328903 +gtnhj123 +gtnheif +gthtdjhjn +gthgtylbrekzh +gthcgtrnbdf +gsktcjc +gruzin +grunting +gruner +grundig +gruffy +gruesome +grub +growl +grow4 +groves +grounds +groundhog +grouchy +grotto +groper +groentje +grizly +griz +grinnel +gring +grimjack +grigri +griggs +griffi +greyson +greg11 +greensky +greenpea +greenl +greenguy +greengrass +greenfield +greenber +greeley +greeen +greebo +greatful +grateful1 +grata +grassman +gras +grapevin +grapefru +grape22 +granules +grandma2 +grandia +grampa +graha +grad2000 +graciela +gracee +grace3 +govols1 +gouge +gottogo +gotahack +gossipgirl +goreds +goracing +gopens +googlecheckou +goofie +goodpass +goodnite +goodboy1 +goodbo +good12 +good11 +gonzoo +gonzo2 +gondon +golubev +golosa +golly +golfer22 +golf10 +golf02 +golem +goldwind +goldwin +goldhill25 +golden2 +golden11 +golden01 +gold77 +gold1234 +gohard +gogoboy +gogo12 +goforit2 +godzilla1 +godman +godis1 +gocolts +gochiefs +gobucks1 +gobshite +gobeavs +goatass +goat11 +gnik +glorybe +glofiish +globule +glassy +glaser +glamdrin +glady +gjleirf +gjkyjkeybt +gjakova +gizmodom +gizmodog +giving +giuliett +gitarist +girth +girlsgir +girlpower +giovani +giovan +gink +ginawild +gin55ger +gimli1 +gijane +giggsy11 +gigem +gifgif +gide +gibralta +gibber +gianfranco +giacomin +ghjrkznsq +ghjgtkkth +ghjghj22 +ghjcnjdkfl +ghjcnbnewbz +ghj100 +ghfrnbrf +ghfgjhobr +ghbywtcc +ghblehjr1 +ghbjhf +ghbdtncerf +gforce1 +gfnhjy +gfktdj +gfifgfif +gfhrtn +gfhnbz +gfhjkmxtu +gfhjkm21 +gfhjkm2011 +gfhjkm123456 +gfhjkbr +gfhflbuvf +gfhfktkm +gfgfvfvfz +gfgfg +gfcnthyfr +gewitter +getwet +getusome +getright +getone +getmoney1 +getlucky +gesine +gersh +gerrie +germ +gerkin +gerasimov +gera +george9 +geoman +geography +gentlema +genoa +geniusgenius +genesis9 +geneseo +generous +generali +general2 +general007 +gemmas +geller +gelato +gektor +geiler +geibyrf +gege +geeks +geddy +gbhfymz +gbdfcbr +gb2312 +gazprom +gaz29wak +gaypride +gayatri +gayane +gawker12 +gavr +gautier +gaudy +gatinha +gatherin +gastro +gashish +garwood +garry123 +garnett2 +garman +gargar +gargantua +gargano +garde +ganja420 +ganduras +gandalf4 +gamez +galochka +galley +galland +galiya +galin +galati +gainer +gaggag +gagarina +gaby777 +gabriel6 +gabby123 +gabby12 +gabbag1 +g3ny5yof +fyz123 +fyutkbyrf +fynjy123 +fynbdbhec +fylhtq123 +fuzzfuzz +futures1 +fussel +fuser +fuscus +funnyboy +funding +funchal +fun4us +fumbling +fullmeta +fullhouse +fujiwara +fujifuji +fugger +fuesse +fuerza +fuckyu +fuckyou5 +fuckyou11 +fuckyea +fucksuck +fuckoff9 +fuckoff123 +fuckital +fuckingshit +fuckings +fuckball +fuckal1 +fuck1108 +fubar2 +fthjgjhn +fryguy +fruit1 +frosted +fromto +frog13 +frog1 +frisson +frill +friday11 +friar +fretless +fresh123 +frequent +freerun +freepussy +freelance +freejack +freehold +freefly +freedom11 +freecom5 +freebee +freds +frederico +fredek +freddog +freddie0 +fred62 +freaknas +freaking +frdfhtkm +frazzle +franzisk +frankie3 +frankb +frank55 +frank333 +frank13 +fram +fragile1 +foyer +foxxxy +foxtail +foxhole +fourramv +fourcats +fountain1 +fortitud +forsyth +forsex +formula2 +formica +formic +formee +forget1 +fordf100 +fordcar +fordboy +ford351 +force10 +footsies +footlock +footfoot +footfeti +footed +football24 +football22 +football10 +fonfon +fonda +follies +folk +fokina +foible +fofinha +flypaper +flyleaf +flyers25 +flvbybcnhfwbz +fluffer +floydd +flower123 +floss +florida6 +fliptop +flippo +flints +flim +flight23 +fleshy +flee +flatro +flatiron +flashme +flash80 +flash7 +flaquit +flapwnage +flanner +flameng +flagstaf +flags +fl4rg3n +fktrcfirf +fkmnfbh +fixture +fiveten +fission +fishstix +fishdog +fishbulb +firstaid +firewolf +firewave +fireside +firefox1 +fireball5 +firearms +fire77 +fire1234 +fiorella +fineass +findou +final1 +filo +fill +figueroa +fignewto +figment1 +figafiga +fifty1 +fifififi +fieruld +fieldy +fids +fidelio1 +fibers +fiber +fhyjkml +fhnehbr +fhneh123 +fh18p2ss +fgtkmcbyxbr +fgh123 +fewer +fetishes +fetisch +ferraro +ferrari360 +fenomen +fenice +fender99 +fellas +felixthe +felix7 +felix12 +feetman +fedya +fedeisor7 +fearthis +fdsf +fcnfyf +faxmodem +favorites +fault +fatcat22 +fatb0y +fatass1 +fastporn +fassenoc +fassen55 +farty1 +farthead +farmacia +farkas +farhana +farfel +fantasys +fantan +fansrus +fandorin +familygu +falling1 +faldo +falcon01 +fal4317 +fairport +fagott +fagg99 +fackoff +faceboo +faaxma +fM2zxc49 +f1atus +f14tomca +ezrider +ezcleo +eyeless +eybdth +extent +expo +explosion +explor +expedition +exotica +existenz +ewqdsacxz +ewelinka +evseeva +evinrude +evette +everybody +everett1 +evangeline +evad53 +eva2000 +eva123 +eurostar +euro2004 +eurek +eugenie +eudora4 +etude +etaylor +estrange +estel +esteban1 +esselte +espraber +espire +especial +eshesh +escargot +escape1 +escapade +esbjerg +errol +erotika +erocdrah +ermakov +erkebulan +eric13 +eremin +eremeev +eqeS606898 +epping +epidemia +entity +enterr +enterent +entele +enric +enhanced +england2 +engeltje +engel1 +encounte +empower +empacher +emotional +emoney +emoemo +emocore +emmylou +emmy +emmi +emmapeel +emmalou +emmalee +emma11 +emin +emily3 +emilian +emiguo +emeralds +emerald2 +embers +elvi +elsworth +elodi +elmerfud +elmejor +ellsworth +elliot1 +ellina +ellens +eliz +elieli +elias1 +elian +elia +elfman +elephants +eleni +elena2011 +element7 +electrical +electri +elate +elan +eladio +ekx1x3k9BS +ekaj +eintracht +eights +eieiou +egypte +egwene +egipto +eghfdktybt +eggnog +efremova +efgh +edwin1 +edward7 +eduard0 +edlight3 +edifier +edgerton +edelveis +edededed +eddie4 +edcvfr +ecuador1 +ecuado +econom +eclair +echostar +ebbs +eaters +eateat +eatcunt +easynews +easyed +eastpak +eastlake +earthy +earlmill +eanut +eagles00 +eagle777 +eagle6 +eagle22 +eagle12 +eagle01 +dziadzia +dybvfybt +dvdrom +dustyboy +durkin +duran2 +duran1 +dupa12 +dunkan +dundun +dundee1 +dumpty +dumptruck +dumitru +dumbo1 +dumas1 +dulles +duke99 +duke14 +duilio +dufresne +duece +duduka +dudnik +dude13 +dude10 +dude01 +ductile +duckies +duck123 +duce22 +ducados +duc916 +dtdtdt +dtcyf2010 +dtctkmxfr +dt426a37 +dsnfksr +dslack +dsaewq +dsade +drunks +drunkard +drumnbas +drugba +droptop +droid +drkenny +drive487 +drinkme +drillsgt +drew87 +drew1 +dreher +dreamworks +dreamwor +dreamtea +dreamin +drazil +dranoel +drakyla +drake2 +dragoo +dragonbo +dragon85 +dragon29 +dragon27 +dragon19 +dragon100 +draconian +dpxtrm +dps140786 +dozers +downloads +doverdel +douc1234 +dostup +doronina +dornier +dorien +dorf +doowop +doorstop +doorss +doordie +doolittle +dookie1 +doodlebug +doodle12 +donut1 +dontstop +donnalee +donnab +donkey2 +donkey12 +donita +dondi +donatas +domovoi +domolink +domingue +dolphine +dolphin8 +dollop +dollbaby +dollarbill +dolgov +dolce1 +dolboeb +dolan +dogshow +dogs123 +dogpatch +dogmatix +doggiest +doggg +dogface1 +dogeatdo +dog111 +does +doeboy +dodgy1 +dodgeman +dodge01 +dodadoda +docent +dnomyar +dnodno +dnjhybr +dmitrieva +dl1119 +dkny +dkfl123 +dkfcjdf +djmuls +djlzhf +djibouti +djhjyjdf +djengis +djclue +dixies +dixie2 +divided +diverdow +divan +diunilaobu8* +distress +displays +dishwash +disguise +discworld +dirtysouth +dirtyone +dipset1 +dinozavr +dinodogg +dinmor +dinker +dinkel +dingoman +dimonchik +dimon1992 +dimdim +dima38821 +dima1991 +dima1988 +dima1986 +dima1984 +dima1972 +dilly1 +dillon1 +dillhole +dillan +dikobraz +dikkelul +dikdik +digital2 +diggerdo +digby +dietcoke1 +dieguit +diediedie +didel95 +dickss +dicklips +dick4u +dicarlo +dianita +dianes +diamondz +diamondt +diamondj +dialup +dialtone +diakonos +diactfrm +diablo12 +dhl123 +dfybkkf +dfvgbh12 +dfubyf +dfp2110 +dfkthbr +dfgdrb5se4 +dfgdfgdfg +dfgdfgdf +dfg123 +dfcbkbyf +dfcbkbcr +df3sypro +dezembro +dewdrops +devinn +devils22 +devildoc +devildo +devere +devadeva +deus +detroit6 +detroit4 +detnews +destination +desperate +desktop1 +desklamp +desiree1 +desertfo +desadov +dern +derail +denzil +denson +dennise +denisdenis +denis12345 +dendenden +den4ik +den1020834880 +demon66 +demetrius +delux +delton +delta11 +delt +deloitte +delo +dell1234 +delet +delavega +delane +deke +deja +degenerationx +default1 +deere1 +deeply +deepdeep +deena1 +deeker +deed +deecee +dedushka +dedmoroz +deco +december2 +decaview +deca +debra1 +debiloid +deathman +dearest +deanna1 +deaner +deadspace +deader +deadcat +dead12 +ddss +ddkk +dd7799 +dc2000 +dbz123 +dazz +daze +dazdraperma +daywalke +daytrip +dayna1 +daylily +davout +davita +davinc +davies1 +davidhbk +david33 +david1984 +david16 +david15 +david14 +david09 +davey1 +davenpor +dave28 +dauphine +daugavpils1 +datuna +dasreich +dasdasd +darwei +darts1 +darsol +darnoc +darmstad +darkomen +darkhorse +darkcave +dark66 +dark12 +darjeeling +dariu +darinka +daring +daphne1 +danyelle +danton +dannyl +danny22 +dannii +danner +danilova +danijela +danifilth +danielm +daniel4 +daniel27 +daniel24 +daniel19 +daniel17 +daniel0 +dania +dangle +danette +dancin +dancer13 +damon2 +damnation +damie +damann +damaged +daly +dallas2 +dalibor +daktari +dakota88 +dakota11 +dakar +dak06ota +daisho +dainty +dagmara +dafydd +dady +dads +daddyd +daddyboy +daddy01 +daddies +dadad +dackel +dabass +da0206sf +d12345678 +cynical +cylinder +cydonia +cyclope +cybershot +cybermax +cxzcxz +cxfcnkbdxbr +cwizintr +cville +cuttie +cuteme +cursive +cursed +cups +cupoftea +cupidon +cupido +cupcak +cupboard +cuntlips +cumwhore +cumsluts +cumshot1 +cuminme +cumberland +culotte +cuerv +cuddles2 +cuchito +cubbys +cubans +ctvthrf +ctrnjhufpf +ctrhtnfhm +ctrhtn47 +csrnsdrfh +crystal9 +crystal8 +crystal5 +cruzados +crusoe +crunchie +crump +cruisers +crowe +crouch +crosser +cromo2002 +crimso +crhtgrf +creeksid +creeks +creech +credo +crazyone +crazyguy +crazydude +crazydog +crazy88 +crazy69 +craz +crawling +crawdads +craft1 +crackle +crackerj +cr250 +cprofile +cpe1704t +coyot +cowshit +cows2 +cowmoo +cowgirls +cowboy23 +coward +cowan +covet +coupcir +cougar99 +cossacks +cosmocat +cosit +cosine +cosima +cosgrove +corycory +cortana +corsa1 +corps4 +cornwell +corning +corney +cornerst +corker +coriolis +cori +corgis +coreys +corellia +core2rap +cordov +cord +copper12 +coorslt +coolz +coolit +coolguys +coolcat1 +coolbob +cookies2 +cookiemo +cooked +conundrum +conundru +controle +cont +consultant +consult1 +constitution +conrado +conrad1 +conifer +conger +confusio +coney +conejit +condos +concho +conch +concetta +comrereg +computer123 +comphh +compare +compaq99 +comp1234 +comfort1 +comedyclub +combined +colter +colonels +colman +colleges +colita +coli +coldone +colchester +colada +coelho +codie +coder +cocobean +cockslut +cockroach +cockface +cock12 +coccinella +cobra6 +cobra5 +coaxial +coasters +co2002 +cnfylfhn +cnfrfy +clyde7 +clung +cluedo +clownfis +closure +clitclit +clip +clicks +clergy +clementin +clayto +claudy +claudett +claud +classof0 +classifi +classical +classica +class99 +class1 +clarky +clarkent +clare1 +clarabino +clancys +ckjdfhm +ckfltymrfz +cjybthbrcjy +cjrhjdbot +cjkyw +cjklfn +cjkjdmtdf +cjcfnmdctv +city1 +cisneros +ciro +cipa +ciotion +cindyc +cindy123 +cilia +cilantro +cicely +ciaran +cia187 +chutiya +chuleta +chulai +chuckste +chuck99 +chsz20 +chrisw +chrisr +chrisman +chrisi +chris74 +chris07 +chopper2 +chong1 +cholco01 +chocolate2 +chocola +chocha10 +choad +chloe2 +chlo +chix +chivas11 +chiswick +chips98 +chipper2 +chipper10 +chipman +chintu +chinny +chinka12 +chimpo +chimney +chime +chilla +chijioke +chiens +chickie +chickenb +chicken3 +chickade +chichago +chiang +chevy9 +chester123 +cherry7 +cherry20 +chernova +chemnitz +chelsy +chelsea5 +chella +chekhov +chegevara +cheever +cheeseman +cheese123 +cheese01 +cheery +cheerful +check6 +chechnya +chau +chatroom +chassis +charts +charoot +charlotte1 +charline +charleston +charles5 +charity1 +charger7 +characters +chaps +chappi +chanter +chantel1 +channa +changes1 +change123 +chanchal +champer +champa +champ24 +chaka1 +chad1 +chaca +chaazmo +cha +cgfhnfrvjcrdf +cfvfzkexifz +cfvfzcxfcnkbdfz +cfvfhrfyl +cfvcjy +cftvgy +cfnehy +cfkfdfn +cfifvfif211 +cfieyz +ceylon +certobj +cerritos +cephas +cepeda +cents +celtics33 +celtic12 +cellardo +celexa +celestine +celeste2 +celebrate +celebrat +cecille +cecil1 +cecece +cece +cdtnkfyf1 +cdtnekz +cdjjlf +cbvtycbyjrbz +cbvcbv +cbcbcb +cbanch +cazador +cavs +cavalera +catz +catttt +cattail +catracho +cathal +catera +catch222 +catbutt +catawba +catatoni +cat666 +cat12 +cat111 +casull +castings +castilla +cassin +cassie01 +cassel +cassady +casper11 +casket +casino1 +casillas +cashel +cashcow +cas123 +cartman2 +carryon +carrick1 +carpet1 +caroll +caroli +caroleen +carnut +carnie +carnage1 +carlot +carlosa +carlos13 +carib +cariad +careers +carebears +cardoso +caramail +captain9 +captain7 +captain2 +capstick +capone1 +capon +capman +cap232 +cap123 +caniinac +cancun1 +canarsie +canarias +canada01 +camvid30 +campfire +cameron9 +camello +cameljoe +camela +camaleo +cam123 +calypso1 +callum123 +calloway +calley +cacete +caccola +cacao +caca123 +cabyrc +cabrera +c5vette +c1234567 +bytor +bytccf +byrnes +byrd +byntuhfk +bygrace +bygone +bycgtrnjh +buzzy1 +buzzbomb +buziaczek +butty +buthole +butche +butchdog +busy56 +busway +busterb +buster7 +buster0 +bushnell +bushmill +bushhog +bury +burwell +burto +burst +burnley1 +burnham +burlroof +burge +bunnyhop +bunker1 +bunk +bulwark +bulsara +bulma +bullwhip +bullrider +bullocks +bulldog9 +bullcrap +build1 +buhbuh +buggs +bugger1 +bugfree +buffy99 +buffy69 +bufford +buell +budman22 +budlight1 +bud123 +bud1 +bucs99 +bucko +buckner +buckdeer +bucaneer +bubbler +bubblebu +bubbagump +bubbagum +bubbaboy +bubba01 +bubabuba +bsanders +bs2020 +bryant8 +brutus12 +bruteforce +bruski +browntro +browner +browncat +brotherhood +brophy +brooker +brook1 +broncos3 +bronco7 +brock1 +brochet +broadcast +britty +britany +brinkman +brindisi +brigitta +brigid +brief +bridie +brickhou +brianl +brian13 +brents +brennen +bremer +breez +breeanna +brechin +bream +breakin +breakdow +brazil66 +brawley +bravo2 +bratty +brasskey +brasse +branston +brandonl +brandon9 +brancusi +bradipo +brad123 +bpevhel +bozwell +boyce +boyblue +bowwo +bowl2000 +bowflex +bowel +bout +boulou +boulder1 +bouchra +bottleca +bots +botany +boston69 +boston01 +bossyak123 +bossman1 +bosse +boss123 +boss12 +bosox1 +bosom +borzoi +boriss +bordeau +borat +bora +boppers +bootboy +bootboot +boooty +boomstic +bookend +boogie2 +boobz +booby1 +boobs123 +booboy +booboobo +boobers +bonzodog +bonsoir +boniface +bongload +boneym +bones123 +bonedadd +bone1 +bondie +bondages +bonbo +bonaire +bombon +bomberos +bomber123 +bollywood +bolleke +bolle +boleslaw +bolbo6a6s +bolabola +bokonon +bokkie +boiler1 +bogy +bogie1 +bogeyman +bogdanov +bofa +boeing73 +bock +boccoli +bocachic +bobweir +bobthedo +bobolina +bobmarley1 +bobman +bobhope +bobby69 +bobby3 +bobbles +bobbafet +bob743 +boat11 +bmx4life +bmwz3 +bmwm33 +bmwk1200 +bmw320d +bluphi +bluewolf +bluesy +bluesky2 +bluemonkey +bluehawk +bluegree +bluegrass +bluefrog +bluecrab +blueboy1 +blueberry1 +bluebel +blue74 +blue666 +blue43 +blue17 +blount +bloody1 +bloggs +block2 +blizzar +blitzkri +blitzer +bliss3 +blip +blinkers +blinder +blinded +blehbleh +bledsoe1 +bleat +blbjn007 +blasto +blaser +blank123 +blakstar +blake123 +blahblah1 +bladez +blade13 +blackwoo +blackshadow +blackmai +blacken +blackcow +blackangel +black8 +black73 +bjsbjs +bjoern +bizzy +bizzaro +bizness +bits +bitchsla +bitch12 +bitburg +bisou +bisons +bishops +bisho +birthday0 +birthda +birgitta +birdseye +birdseed +biosinfo +binnie +binnen +binman +binky2 +bingobin +bingo69 +bingo5 +bingle +binge +bina +billydog +billies +billie1 +billg +bill12 +bill01 +bigwin +bigtrain +bigsteve +bigshit +bigs +bigron +bigrock +bigrick +bigrat +bigqueer +bigpipe +bigone2 +bigmig +bigmatt +bigge +bigfish1 +bigern +bigeagle +bigdoug +bigdog99 +bigdog12 +bigcoc +bigcheese +bigcats +bigbush +bigbuds +bigboobi +bigbloc +bigballe +big1foot +bidden +bibika +bhbitxrf +bhbhbh +bgbgbg +bezparolya +bevo +bevinlee +beverly1 +between +betula +bettys +betterth +betina +bethbeth +betacam +beta12 +bestpker09 +bestial +bestever +besson +bert12 +berrys +berryman +bernadett +berk +beringer +berezin +berenger +beowolf +benzino +bentley2 +bentle +bent6 +benso +benni +benjij +benitez +bengt +bengrimm +benard +ben +belvoir +belvedere +belove +belomor +belo +bellss +bellow +bellhop +bell123 +bell1 +belive +belief +belgique +belgar +belgacom +belette +belaya +begone +beggar +beeson +bees +beers1 +beerlove +beer22 +beenie +beefstew +beefheart +beccaboo +bebemi27 +beatles2 +bearboy +beamer1 +beales +beabea +bdusty +bdunn1 +bdsmbdsm +bdfytyrj +bbbbbbbbbbbb +bbbb7777 +bbbb1 +bball24 +bball123 +bball12 +bb66PP +bazzy1 +bazzer +bayern1 +baubau +batmans +batman8 +batman22 +batman10 +batist +bater +basti +bastard2 +bastage +basswood +bassmaster +bassi +bassdrum +basket12 +basin +basf +baseball6 +baseball14 +baseball123 +barthez +bart123 +bart01 +barrymor +barry20 +barriste +barrio +barrab +barony +barney123 +barges +barbeque +barbariska +barashka +barak +barabba +barabashka +barabas +banquo +bannon +banning +banner1 +bankbank +banister +bandit99 +bandit123 +bander +banbury +banano +banana69 +banana123 +banana01 +banan123 +bamberg +baluga +baluba +balrog12 +baloon +ballys +ballou +ballin1 +baller22 +ballas +balinor +balers +baldisar +balans +bakunin +baker123 +bake +bailbond +bagpiper +baghouse +bagged +badreligion +badgir +badgers1 +badgas +baddad +badbrad +badboy21 +badass12 +badas +bad1 +backstre +backflip +baccus +baccarat +bacard +baca07 +babyoil +babyjay +baby15 +baby0 +babula +baboso +babo4ka +babay123 +babatund +babar +babaev +bababooey +bababooe +b747400 +b486arn +b16delta +b0ngh1t +b0nehead +azzarra23 +azxsdc +azxcvbnm +azsxdcfvgbhn +azflkjw1 +axis +axant5 +awdqseawdssa +aware +aviles +aviano +avenir +avellino +avatar12 +avalo +automobile +automati +autohaus +aussi +aurora1 +augustine +august26 +august23 +audrey2 +audirs6 +audirs4 +audiaudi +audi90 +atytxrf +attits +attilla +attil +attic +attest +attentio +attend +attache +att923 +atsupas +atropine +atmosfera +atljhjd +atliens +atiradn1 +atherton +athen +aten +ateam +at_asp +asusasus +astros1 +astri +aston1 +asterlam +astarta +asswhole +assneck +assisi +assholee +asshole69 +assfuck1 +assfan +assboy +assassi +asp123 +asiansex +ashwini +ashot +ashley3 +ashley13 +ashleigh69 +ashfield +ashamed +aset +asdfgh0 +asdfg6 +asdfdsasdf +asdfdsa +asdf123456 +asdasdasdasd +asdaasda +asd9fgh +asd789 +asan +asain +arusha +artur123 +arttatum +arts +artista +artis +artifact +artemida +artem2001 +artem1988 +arrow123 +arron +array +arrack +aroma +armani1 +arkada +aristide +arise +ariella +arianne +argos +arcoiris +aragor +aqwzsxed +apsara +april200 +april20 +appletree +apples2 +appleapp +apple4 +appetite +aotearoa +antonios +antipov +anthonys +anthonym +anther +ansari +anonimo +anomaly +anny +anniversary +anni +annamarie +annalise +annalee +anna79 +anna69 +anna25 +anna1983 +anna1980 +anna1975 +anna18 +anna17 +ankit +animatio +animas +animal12 +anichka +ania123 +anglin +angie69 +angie01 +angharad +angers +angelos +angelone +angelik +angelgirl +angelfir +angelas +angel66 +angel24 +angel23 +angel200 +angel16 +angel15 +angel101 +angel00 +andy24 +andrius +andrey2010 +andrey1234 +andrew9 +andrew77 +andrew6 +andrew5 +andrew23 +andreu +andresito +andres1 +andrea10 +andrea01 +andre3000 +andersso +anavrin +anarhist +analman +analia +ana123 +amylou +amygrant +amygdala +amster +amraam +amorsit +amorphis +amoco +amish +amfiton +america0 +amer123 +amend +ameise +amcuk +amco442 +amble +ambert +amazon1 +amanita +amanece +amandas +amanda19 +amaizrul +amadeu +am1234 +alvarad +alva +alter1 +altavist +altamira +alrighty +alpo +alpha99 +alpha66 +alpha101 +aloha123 +allworld +allsorts +allsex +alliswell +alliecat +allentow +all4u7 +all4u6 +all4u4 +alkohol +alison88 +alisokskok +alisha1 +alina98 +alina777 +alina1997 +alik +alijon +alienware +alicia1 +aliceadsl +alica +alhimik +alfiya +alexsander +alexandr1 +alex93 +alex555 +alex55 +alex2539 +alex2006 +alex1994 +alex1993 +alex1991 +alex199 +alex1984 +alex1980 +alex1974 +alex1967 +alessa +alertpaydoubl +alertemailms +alerte +alero1 +alembic +aleksandrova +aleksandrov +alegra +ale123456 +alden +albrecht +albireo +albertus +alberto2 +alberta1 +alban +alaskaml +alaska12 +alas +alanya +alan123 +akvamarin +akula +akuankka +akerke +akbota +akademik +ajones1 +ajones +aiyana +aitken +airtours +airship +airplanes +airplan +airpark +airone +aionrusian +ainur +aint +aiken +ai1370 +ahamay +agrippa +agnieszka1 +agnieszk +aggies00 +agent47 +agent00 +agave +agata +afynjv +after8 +african1 +afresh +afhnjdsq +afhblf +afght +aexp2b +aeross +aeiou1 +aegean +advisory +advanta +advance1 +adsads +adrienn +adriaan +adorable +adnega +adivina +adidas22 +adidas10 +adgjmptw0 +adgjl +adfasdf +adewale +adelman +adelle +adelaid +add123 +adbt14226 +adanac +adair +actor1 +actions +action2 +acroyear +acissej +acinom +achilleus +achiever +achieve +acetone +accusync +accounti +accountant +accoun +accord99 +accessme +access49 +access3 +access21 +acc3ss +ac4479 +abyfycbcn +abuser +abuelo +absolut1 +abramo +ablett +ability +abelard +abeatle +abe123 +abdullayev +abcjm +abcdefghijkl +abc_123 +abbot +abbeyroad +aarong +aaron2 +aaron11 +aaro +aapjes +aadams +aaaaa2 +aa1998 +aa12345 +a58Wtjuz4U +a550777954 +a1b2 +a1a2a3a +a1a1a +a12s3w1 +a11853 +Zxcvbn1 +ZAQ12wsx +Yqra61b6 +YouNg3sT +Yfcntymrf +Yankees2 +Yankee1 +YELENA03 +YANKEES1 +Xavier1 +XFR432 +XFR182 +Woody +Willow1 +Whitney +Wetzlar +Westside +Weed1 +Warren +Warner +Wallace1 +Waiting +WaPbbs +WONDER +WINNIE +WELCOME1 +WATCHER +WALTER +Vsavb7rtUI +Vs896ct +Vr265tu +Vladik +Viktoria +Victor1 +Vfhufhbnf +Valhalla +Vader1 +Vader +VIOLET +VICTORY +VHpuuLf2K +Tweety +Turtle1 +Turtle +Turkey1 +Trojan1 +Trinity1 +Tricia +Tony +Tomato1 +TokioHotel +Tojiik85521133 +Tkbpfdtnf +Theodor +Terrapin +Temple1 +Tacoma +TURTLE +TREVOR +TRAVEL +TRACTOR +TOMMY +TINTIN +TICKLE +THEONE +TEXAS +TEAM +TARHEELS +Sweetie +Sunflower +Suka1985 +Sucks1 +Suckit1 +Suck1 +Stupid +Stud1 +Storm +Stick1 +Starwars1 +St801nyl +Squirrel +Spiderman +Spartan +Sparrow +Spanish +Soso12eec +Snuggles +Smokie1994 +Skywalke +Sister1 +Sic8885 +Shotgun +Shorty1 +Shithea1 +Shelly1 +Shelby1 +Shaggy +Semperfi +Sega123 +School +Schmidt +Schatz +Scarlet +Sandy2562 +Sammie +Salvator +Salvador +Safeway +SWEET +STRIKE +STINGER +STEWART1 +SPITFIRE +SOLDIER +SOFTBALL +SNUISUBU +SNOWBALL +SIDNEY +SHOTGUN +SHOOTER +SHERIFF +SEMINOLE +SCHOOL +SANDY +SANDRO +S4xnHsdN +Ryan +Rusty1 +Russia1 +Rupert +RunDLL +Rules +Rule +Royals +Royal +Route66 +Rodney +Rockstar +RoFemyA3 +Ripper +Richards +Redwings +Redsox +Redhead +Reddog1 +Red7Stork +Rainbow6 +Raider +Racing1 +RUSTY +RONALDO +ROMEO +ROCKS +RIVERA +RIVER +RICHIE +REDNECK +RECORDS +R7uGnm +R3v59p +R030989 +Queens +Quantum1 +QQQQQQ +Pyramid1 +Pussy69 +Pt206ps +Private1 +Printers +Princes1 +Power1 +Porn1 +Pikachu +Pickle +Picasso +Phillip1 +Philipp +Pencil1 +Paula13e +Patrick7 +Password12 +Passat +PassAgen +Pakistan +PLAYBOY2 +PIRATE +PIERRE +PETER +PEACE +PASSWoRDassword +PASSWoRD +PASSWORD1 +PANAVISI +PACKARD +P0oooo00 +Oilers +Odessa +Oap9UTO293 +OPERATOR +OMAR +OAKLAND +Norway +Nm310fn +Nloq_010101 +Nikki +Nikita1 +Nicrasow212 +Nicolas +Network1 +Nessus09 +Natasha1 +Nastena +NYLONS +NOVEMBER +NEVADA +Ms241cr +Morrowind +Morris1 +Morgoth +Montreal +Monday1 +Mo987vu +Minnesota +Mine1 +Milton +Miles1 +Mercury1 +Megiddo +Megan1 +Mazda626 +Martini +Martinez +Marshal1 +Marinaro +Marigol +Mariah +Mari +Margie +Margarita +Manfred +Manchester +Madness +Maddog1 +Maddog +MYGIRL +MUNCHKIN +MOZART +MOUNTMGR +MOLLY +MLForman +MINNIE +MEGAN +MARIAH +MAKSIM +MACBETH +Luzi2005 +Ludmila +Lucas +Lsk8v9sa +Loverboy +Lorraine +Lizzie +Little +Lick1 +Leonid +LeoGetz +Lenny +Leanne +Lance1 +Ladies1 +LOST4815162342 +LORENZO +LEONARD +LEELEE +LAURA +LAGUNA +Kubrick1 +Krzysiek12 +Kostya +Kondom25 +Kingpin +Keith1 +Kawasaki +KRAMER +KL?benhavn +KENWORTH +KAREN +Julia1 +Judith +JroReadme +Josh +Joschi +Joker +Johannes +Johanna +Jimbob +Jethro +Jessie1 +Jerry1 +Japan10 +Jane +Jamaica +Jacob +JUSTICE +JULIAN +JScript +JOKER +JOEY +JCasas +JAVIE +JAMES1 +JACKOFF +Island1 +Intruder +Install +Infantry +Indiana1 +Imaging +ISABELLA +ILOVEU +IECONT +Hummer +Hounddog +Horsens +Horse +Honolulu +Honey1 +Holmes +Hitman +Higgins +Hermes1 +Hermes +Herbie +Hentai +Helsinki +Helpme1 +Hawaiian +Hartland +Hardon1 +Handball +Hamster +Hailey +Hacked1 +HOTFRANK +HCAppRes +HAWAII +HARVEY +HAROLD +H2Tmc4g358 +Gunnar +Guest1 +Griffey1 +Grendel1 +Greenday +Gordon1 +Gollum +Goldie +Goku +Gizmo1 +Geezer +Garden +GRIZZLY +GATOR +Future +Frosch +Froggy7 +Fright1 +Freeman +Freaky +Freak +Flyers1 +Flowers +Floria +Floppy +Fletcher +Fiesta +Ferrari2 +Farscape +Falla123 +FRANK1 +FLOWERS +FITTEC +FIREBIRD +FENDER +FELIX +FATHER +FANTASY +Excalibur +Everett +Eventlog +Emerald1 +Elvira +Ellen +Elijah +ERywgan5 +ENTERPRI +ENTER +ELIZABET +EDDIE +ECLIPSE +Duluth +Dthjybrf +Drummer1 +Drummer +Dresden +Dragoon +DrExploi +Dr342500 +Donnie +Donald1 +Dogs1 +Doggy1 +Director +Digital1 +DeviceClass +Detroit1 +Denni +Darkside +Dallas22 +DXN36099 +DUNCAN +DRUMMER +DROWSSAP +DPCDPC +DONNA +DOMINO +DOGS +DODGER +DETROIT +DESTINY +DELTA1 +DEATH +DEAN +DARREN +DALEJR +D36E96D +D36E96C +D29EF7 +Cthulhu +Create +Cracker1 +Cq883tv +Connor +Connie1 +Collins +Clitoris +Clinton1 +Clifford +Claude +Cinnamon +Cinder +Christina +Christ1 +ChrisBLN +Chocolat +Chloe +Chipper +Chestnut +Charly +Charger +Changeme +Cessna +Cc219fi +Capital +Canadarr +CallSceSetup +CUTLASS +CREATIVE +COYOTE +COCACOLA +CLAYTON +CLAIRE +CHURCH +CHRONIC +CHRISTIN +CHIEF +CHELSEA1 +CE6AC8 +CBR900RR +CATHYL +CATDOG +CARTER +CAROLIN +C72E74A2 +Buttons +Butter1 +BunniHoni +Bullet1 +Bulldawg +Buffa1 +Buck +Browns1 +Bronco1 +Brianna +Brando +Brady +Bowling +BostonLi +Bosco +Borussia +Booger +Bond +Bomber1 +Bogart +Bluebell +Blue123 +Blowjob +Bitches +Bigmac1 +Bigdaddy +Belinea +Beast +Bears1 +Barbados +Baltimor +Ball1 +Baggio +Badboy +Baby +BUTTMAN +BUTT +BUFFALO +BROWN +BROOKE +BREEZE +BRADLEY +BRAD +BOEING +BOBCAT +BLUESKY +BLUE123 +BIRDIE +BIGBEAR +BIGBALLS +BEATLES +BASSMAN +BALLS +BABYDOLL +B2rLkCJG +Azsxdc123 +Augustus +Asdfghj1 +Asdf1234 +Asdf123 +Asdf1 +Asd12345 +As123456 +Artemis +Arnold1 +Arkansas +Arizona1 +Apples1 +Antonio1 +Annie +Animal1 +Andreas1 +Anastasi +Always +Alucard +Allen +Allan1 +Alicia1 +Alice1 +Aleksey +Aleksandra +Aikido +Adrian1 +Adelaide +AccReader +AWESOME +AVATAR +ATTACK +ASDFGHJK +ASDF1234 +ASD123 +ARTIST +ARIZONA +ARCHIE +ALPHA +ALICIA +ALABAMA +ABCDE +ABCD +9inchnai +9incher +9fingers +9dragons +99harley +99999a +99990000 +9994 +99899989 +996969 +9965 +9949 +9934 +9933 +9915 +991199 +98919891 +988776 +98789878 +987654a +987654321w +987654321d +9848xx +9823 +9812 +9789 +96randall +969 +9654 +9652 +9611 +9609367 +95altima +95959595 +9563 +9525 +951753a +9514 +9512357 +9511 +9394 +9360 +93399339 +9339 +93339333 +9303 +9295 +9283 +927927 +9248 +9234 +9211 +919293 +9191403 +9151 +9149 +91199119 +911777 +9112 +9110024 +910910 +9101989 +9099 +909000 +902860 +9022 +9016 +8yssrcxt +8ikjhy7u +89857 +8982 +89658965 +89128830153 +89055521933 +890000 +88ford +88dan88 +88888888d +888444 +8872 +8856343 +8851 +8841 +8816 +881488 +8766 +8765436 +8731 +8723 +87158715 +870498 +8691 +8679 +86753091 +86753 +8666 +8654 +86428642 +86400 +8589 +8587 +8563 +855200 +8531 +8515 +8492 +8482 +8472 +8433 +8410 +8388 +8384 +837291 +8362 +8295 +8284 +8280 +82517 +8251 +82466428 +8245 +8230 +8222 +8186 +8183 +8161 +812812 +8128 +8118 +80lt80lt +80990606390 +80969260620 +80966095182z +8091 +8089 +80679047880 +80672091913 +80663635606 +80633459472qw +8041982 +800620 +7houdini +7995 +7963 +7939 +7906 +789512357 +7894562 +7891 +7886 +7877 +7859 +784512963 +7811 +779999 +778877 +778548 +7783 +7779 +777777q +7777777v +776969 +7757 +7753 +77441 +770770 +7668 +7665 +7650 +7648 +75987598 +7595246 +759153 +7571 +753698 +75321 +753159456 +7530 +751953 +7473 +7469 +74527452 +7428 +7421 +7420241 +7420 +7418 +741456 +7407 +740106 +7385 +7366 +7361 +7360392 +7351302 +7334 +7326 +7308 +729729 +72779673 +7275 +7250 +7246 +7243 +7238 +72277227 +7218 +7214 +7200 +717273 +7172 +717071 +7166 +7162534 +715715 +7155 +7147 +7129034 +7122 +7115 +7080 +7058 +7049 +7046 +7012 +7002 +6strings +6serv9 +6BC8A365 +69sex69 +69love +69erin +69bronco +69886988 +6985 +6978 +6972 +6969696969 +6968 +695847 +693693 +6929 +691969 +6903 +68iypNeg6U +68chevy +6890 +6872 +6871 +6835acdi +67ford +6780 +6779 +6773 +6746828 +6722 +6713562 +66stang +6696 +6673 +6671 +66706670 +6667370 +66668888 +666667 +666666z +6666661 +666661 +66554433 +661944 +6615 +6611960 +660066 +658346 +6569 +6567 +65458845 +6545 +6523 +6519 +6504 +6501 +6496 +6482 +646646 +6461 +6449 +6436 +6422 +6420 +6412 +6410 +6400 +63chevy +6390780 +6378351 +636963 +636234 +6345 +63366336 +63286328 +632632 +6325 +6322 +6311 +6300 +629334 +6292 +62896289 +6286 +6282 +6271 +6246 +6234 +6196 +6182 +6181 +6177 +6160 +615615 +6155 +61536153 +6151 +6137 +6123 +6122 +6114 +6108225 +6103 +609609 +6095586 +6030 +6028 +6022 +6019 +6018 +601601 +6013 +6009 +6002432 +5td76use +5clint +59pennsy +599eidhi +5977 +596444 +59575153 +58GREEN +5893 +588588 +5877 +585885 +58585 +57ford +579579 +577777 +577191 +5771 +57595153 +575859 +575575 +5733 +5714 +56chevy +569874123 +5679 +567666 +56745674 +567123 +5666 +5658 +5647382910 +56468553 +56465646 +564236 +5611 +5595 +5585 +5566778899 +556633 +556611 +55558888 +555566 +55555t +5552 +554411 +553zolf21 +5534 +553322 +55277835 +55255525 +5514 +551255 +5511 +54chevy +5495 +5468 +546252 +5459 +5451 +5443 +5436 +54322q22345 +5425 +5407 +538538 +5380 +5374 +53665366 +5361 +5346 +5344 +5341 +5324 +53115311 +5310 +5305 +5281 +5273 +52545658 +525352 +5247 +523614 +522552 +5218 +5215 +52145214 +5206 +5205 +5196 +5177 +5138825 +5136 +5090 +50694201 +504504 +5036 +5021 +501501 +500705738 +50005000 +4wheeler +4today +4mandy +49merc +4998 +4990 +4984 +4975 +4974 +4959 +4925 +4919 +4887 +4863 +4857 +4850 +4849 +4843 +4837 +4820 +4815162342s +4811 +4799 +479066 +4769 +4763 +475747 +4750131 +4750 +47474 +4743 +4737 +4733 +4729748 +4713 +4700 +46948530 +469469 +46855343 +468468 +4680 +4668 +4667 +46624662 +4661 +46604660 +46540535 +46494649 +4648246482 +4634 +4628 +4624 +4598 +4592 +4589 +456870 +45665 +456123q +45612378 +454987 +45344534 +4528 +451384 +45124512 +45034503 +4491 +4475 +447447 +4467 +44665555 +4464 +444719 +4446 +4445 +4442 +44324432 +4431 +4427 +441122 +4405 +440000 +4352 +4351558q +4340542zx +4335 +4333 +4315 +431431 +42p37 +4276 +4272 +4270 +4269115 +42674267 +4254254 +42514251 +425087 +42506 +4244 +4243216 +42344234 +4228 +4214 +42124212 +4204life +420187 +4192 +418541646 +4180 +4168 +415666 +4155 +4147 +413413 +413121 +41304130 +4129 +4121412 +40404 +40124012 +4005 +40044004 +3somes +3drcgiy6 +3angels +3J8zegDo +398399 +394600 +3940 +3936 +3925 +3923 +3920 +3916 +3911 +3891 +3873 +3866 +38553855 +381381 +3803 +3785 +377377 +37733773 +3758 +375375 +373996 +37133713 +3713 +3708 +370370 +3702 +3696 +36913691 +369100 +36903690 +3675 +3672 +365850413 +3651 +3641 +3638 +3632 +3626 +3622 +36143614 +3614 +3608774 +3606199 +3578vb +357000 +3546 +35403540 +35353 +3532 +3530 +352352 +351472 +3510 +3508 +3504 +35003500 +34lestat +3494 +3465 +345891670 +3454051maksim +3446 +34433443 +3441 +342434 +3424 +3423 +3418 +3408 +339933 +3391 +338833 +338338 +3371 +336905 +3366441 +3361 +335566 +334918 +333777999 +33366699 +3324 +3319 +33133313 +3312 +33113311 +3310 +3307 +3306 +3304895 +3299 +3297 +3281 +3279 +3277 +3262 +3243 +3241 +3229 +32233223 +322322 +32167890 +32132132 +3212321 +321111 +3208080 +3205 +320000 +3197 +3193 +3190 +3186 +3184 +3180 +3179 +3177 +317573 +3172 +3169 +3168 +3167 +31553155 +3147 +3145 +31423142 +312400 +3121013 +3117 +3116 +31143114 +311299 +31122007 +31122005 +31122004 +31121962 +31121961 +31121900 +3111995 +31108 +311070 +311064 +31103110 +31101959 +31101953 +310866 +31081967 +310779 +310766 +310756 +31071968 +31071960 +31071955 +3106 +310571 +31051959 +31051954 +31051952 +310397 +31035518 +31033103 +310199 +310198 +310172 +310171 +310170 +310162 +31012003 +3082 +30703070 +3067 +305256 +3044 +3024 +3022 +30201 +301mas +301297 +30128 +301268 +301266 +301264 +301260 +30122004 +30122002 +30121965 +30121963 +30121957 +301198 +30112000 +30111960 +301096 +301077 +301074 +301062 +301061 +30101999 +30101965 +300998 +300978 +300964 +300958 +300870 +300864 +30082000 +30081957 +30081952 +300773 +300768 +30072002 +300698 +300655 +300600 +300565 +300562 +30052003 +30052001 +30051967 +30051960 +30051955 +300468 +30042001 +30042000 +30041953 +300395 +300372 +300366 +30036 +300198 +300169 +300166 +300165 +300003 +2timer +2tight +2slick4u +2seams4u +2nipples +2insider +2hearts +2guard +2ewq1 +2dollars +2cool +2beornot +2b1ind2c +2974 +2959446 +2925 +2921 +291298 +291295 +291272 +291268 +291259 +29122000 +29121963 +29121962 +29121957 +291197 +291174 +291161 +29111967 +29111953 +291066 +291065 +291064 +29101998 +29101959 +29101956 +290997 +290969 +290962 +29091966 +29088 +290866 +290862 +290858 +29082001 +29081960 +290762 +29071957 +29071954 +29071952 +290665 +290662 +290599 +290577 +290568 +290561 +29052001 +29051964 +290461 +29042002 +29041954 +290378 +290361 +290360 +29031956 +290264 +29021952 +2902 +290197 +29011964 +29011960 +29011953 +28ttqaq +2899 +2897 +2892 +2857 +2827 +2821 +28198 +2816 +2813 +281299 +28121961 +281206 +281204 +28118 +281162 +28111963 +28111956 +281111 +28110 +281074 +281070 +28107 +281069 +28102006 +28101953 +28101952 +28091962 +28091961 +280866 +28081957 +280775 +280771 +280768 +280766 +280765 +28071967 +28071958 +28071956 +28071955 +280662 +28062001 +28061965 +28061963 +280568 +280563 +28051998 +28051963 +28051956 +28051952 +280472 +280467 +280465 +280460 +28041999 +28041957 +28040 +280373 +280366 +28032001 +28031999 +28031965 +28031959 +280296 +280271 +280266 +280263 +28021962 +280170 +280159 +28011951 +2799 +279279 +2788 +277rte87hryloitru +2771 +2756 +2750 +2746685 +2736 +2719 +271297 +271274 +271263 +27121956 +271199 +271175 +271168 +271155 +27111963 +271076 +271066 +2710198 +27101965 +27101962 +270997 +270970 +270960 +27091963 +27082000 +27081962 +27081960 +270798 +270774 +270765 +270760 +27071966 +27071959 +270698 +270667 +27061961 +27058 +270566 +270562 +270497 +270467 +270464 +27042009 +270366 +270360 +27031965 +270269 +270267 +270265 +270261 +270175 +270171 +270168 +270162 +270156 +27011954 +27011952 +2687 +2685 +2659 +2636 +2635 +2623020 +26222622 +261986 +261297 +261273 +261268 +261200 +261197 +261176 +261166 +261160 +26112611 +26111999 +26111954 +261071 +261063 +261061 +261056 +26101999 +26101956 +26101954 +260993 +260964 +260963 +26091962 +26091960 +260896 +260876 +260870 +260865 +260864 +260855 +26081956 +260796 +26071987m +26071957 +260666 +260660 +26061954 +260597 +260568 +260566 +26052007 +26052001 +26051966 +26051961 +26051957 +26042002 +26041959 +260399 +260369 +260363 +26031960 +26031959 +26031953 +260297 +26021961 +26021955 +260197 +260195 +260171 +26012010 +26011953 +260000 +25or624 +2594 +2591 +2585 +25844125 +258369147 +258079 +2580369 +258013 +2576 +2571 +2565 +25632563 +25502550 +25456585 +2538 +253425 +25242524 +252025 +251995 +251992 +251987 +251982 +25198 +25152515 +251268 +251260 +251258 +25121967 +25121959 +25121955 +25118 +251172 +25111959 +251106 +25110 +25107 +251063 +251062 +25102001 +251000 +250997 +25092001 +25091963 +25091955 +250899 +250898 +2507905048 +25078 +250764 +250763 +250762 +25072002 +25072001 +25071955 +25068 +250674 +250671 +2506198 +25061962 +25061958 +250567 +250559 +25052002 +25051958 +25051950 +25049 +250475 +250471 +250468 +250466 +250399 +25038 +250355 +250308 +250298 +25011948 +24992499 +24842484 +2483 +2481 +24802480 +2474 +246888 +246812 +246789 +2454240 +243546 +2432 +2424242 +2420 +241971 +241963 +2417 +2413 +241270 +24122004 +24121959 +24121958 +24121954 +241171 +241168 +241167 +24112411 +24112001 +24111997 +24111960 +24111959 +24111956 +241070 +241068 +241065 +24102001 +24101956 +240972 +240965 +240954 +24091963 +24091956 +240856 +24081962 +240799 +24072002 +24071966 +24071962 +240703 +240700 +240660 +24061958 +240564 +24052002 +24051998 +24051965 +24042003 +240373 +240370 +240361 +2403082 +240298 +240268 +240267 +240266 +240257 +24022402 +24021959 +24021958 +240199 +240156 +24011950 +239133 +23802380 +237241 +2370 +23682368 +2368 +2354381 +234678 +234589 +234548 +23352335 +2335 +23267601 +23262326 +231982 +231976 +231965 +231298 +23128 +231265 +231263 +231260 +231256 +23122008 +231167 +231158 +23112007 +2311198 +23111957 +23111956 +23102007 +23101966 +230959 +23091999 +23091963 +23091956 +23091954 +230895 +230873 +230870 +230867 +230866 +230860 +230850 +230798 +230755 +23071999 +23071955 +230661 +23062006 +23061967 +23061954 +230561 +23052003 +23051960 +23051900 +230505 +230495 +230468 +230456 +230454 +23041962 +230398 +230371 +230362 +230359 +23031960 +230303 +230250 +23021959 +23021958 +230199 +230174 +230156 +23011952 +230103 +2297 +2289 +22882 +22872287 +22752275 +2271 +22622262 +225577 +225566 +22532253 +22512251 +2244668800 +2239 +223300 +2231 +22302230 +22292229 +222333444 +222324 +22232223 +2222223 +221982 +22198 +221963 +221941 +221433 +221296 +221269 +221261 +221258 +221255 +22122002 +2212198 +221198 +22118 +221169 +221167 +221159 +22112003 +22111965 +22111953 +221092o +22107 +221069 +221066 +22101999 +22101954 +22101953 +22092007 +22092002 +22091958 +220856 +22082208 +22082003 +22081999 +22081964 +22081959 +22081956 +220808 +22071962 +220700 +22067 +220661 +220660 +22062001 +22061951 +220571 +220559 +22051957 +22051955 +22051954 +22051952 +220471 +220469 +22041955 +220400 +22032203 +22031955 +220302 +220269 +220267 +220264 +220260 +220259 +22022202 +220222 +22022001 +22021956 +220205 +220197 +220167 +22012001 +21qazx +2198 +21937 +2174 +217217 +2159 +215455 +21382138 +213546 +21342134 +21324354 +21292129 +212222 +212136 +211991 +211987 +211297 +211266 +211265 +21121961 +21121 +21118 +211170 +211166 +211158 +21112 +21111999 +211096 +21101965 +21101960 +210994 +210970 +210963 +210897 +210866 +210860 +210857 +210765 +21071962 +21071956 +21071955 +21070 +21067 +210661 +21061965 +21061959 +210597 +210557 +21051953 +210404 +21037 +210366 +210363 +210362 +210354 +21031957 +21031956 +21031954 +210269 +210261 +21021963 +21021958 +21021955 +210200 +21019 +210170 +21012003 +21011952 +21011 +210101 +20seats +2084 +207207 +2072 +2065 +2059 +2058 +2038 +2037 +2035 +2027 +2026 +202021 +202020a +202010 +20201 +202 +201994 +201984 +2017 +20128 +20127 +201262 +201255 +20121997 +20112001 +20111959 +201074 +201058 +20102010ss +20101963 +20101960 +20101956 +20098 +2009198 +20091955 +200872 +200864 +200863 +20081958 +200808 +200805 +200798 +200762 +200761 +200674 +200670 +200664 +20061957 +200599 +200598 +200594 +200567 +200561 +20052008 +20052003 +20051961 +20051955 +20051953 +200465 +200464 +200455 +20042008 +20041958 +200373 +200369 +200360 +200359 +200353 +20032004 +20031999 +200255 +200251 +20021954 +200197 +200153 +200010 +1z2z3z4z +1vette +1tiger +1qazxsw23 +1qazaq1 +1qazZAQ! +1qaz2wsx3ed +1qaz23 +1px +1plus1 +1pepper +1penguin +1patrick +1moretim +1moose +1james +1hundred +1honda +1harley +1gnogno2 +1forever +1d1d1d +1billion +1alex1 +1adgjmptw +1a2b3c4d5 +1a2b368c +1Yankees +1Wizard +1Walter +1Viking +1Tucker +1Truck +1Tomcat +1Texas +1Testing +1Sucker +1Stud +1Steven +1Spooky +1Speed +1Slut +1Sierra +1Secret +1Rulez +1Rules +1Roberts +1Ripper +1Racing +1Qwertyu +1QAZ2WSX +1Pencil +1Mother +1Morris +1Mine +1Marino +1Linda +1Leonard +1Kitty +1Kevin +1Kenny +1Jungle +1Joseph +1Jester +1Infinit +1Helpme +1Heaven +1Hack +1Great +1Girl +1Gemini +1Gators +1Gator +1Galaxy +1Forever +1Ford +1Florida +1Fishing +1Enter +1Drummer +1Dreams +1Death +1Dancer +1Cooper +1Connie +1Compaq +1Chaos +1Cccccc +1Calvin +1Brandon +1Boston +1Boobs +1Blaster +1Birdie +1Bigman +1Bernard +1Beaver +1Animal +1Alicia +1Airborn +1Adrian +1Adidas +1Accord +1A2B3C4D +19mm5409 +19km527 +199909 +1998vlad +19982001 +19982000 +199800 +199725 +199714 +199701 +199700 +19961996a +1996123 +199522 +19952010 +19951996 +1995199 +199519 +199514 +199509 +199413 +19941201 +199405 +199403 +19932010 +199316 +199313 +199310 +199300 +199215 +199213 +199208 +1991pmoy +199120 +199118 +199018 +199015 +19900125 +199001 +19900 +1989god +198919891989 +198915 +198914 +198909 +198905 +198829 +198823 +19881987 +198812 +198801 +198725 +19872008 +198719871987 +198718 +198716 +198703 +198626 +198612 +198609 +198606 +198605 +198604 +198602 +19860 +198525 +19851989 +19851984 +198518 +19851 +198509 +198444 +198426 +19842005 +19842 +19841985 +19841983 +198416 +198409 +198404 +198402 +198401 +19832005 +19831984 +198312 +198306 +198302 +198230 +198211 +198209 +198205 +198201 +198198 +198128 +198107 +19799791 +197928 +197921 +197915 +197904 +197826 +19781 +19777 +197708 +197707 +197706 +197704 +197666 +197631 +197630 +197624 +197622 +197577 +197525 +197503 +197444 +197428 +197425 +197407 +197382 +197333 +197330 +1973197 +197313 +197312 +197304 +19722791 +197221 +19722 +19721975 +197212 +19711972 +197106 +197071 +197070 +196999 +1968gto +196888 +196878 +196827 +19677691 +1966gto +196464 +196312 +196011 +195819 +19577591 +195111 +19450509 +19374628 +193746 +193711101994a +193333 +19291929 +19241924 +19216803 +192021 +191983 +191981 +19198 +19181716 +191765 +191274 +191272 +191270 +191268 +191255 +19122001 +19121956 +191178 +191172 +191171 +191164 +19111998 +19111968 +19111957 +19111953 +191093 +191084 +191080 +19101999 +19101958 +190994 +190992 +190975 +190973 +19097 +19092000 +19091955 +190898 +19088 +19081961 +19081955 +190797 +19078 +190775 +190765 +19071961 +190697 +19068 +190666 +190660 +19062002 +19061955 +19061906 +190573 +190569 +190564 +190500 +190495 +190492 +190478 +19041961 +19041957 +190372 +19031968 +19031952 +190272 +19021957 +19021952 +190200 +190197 +190175 +19011953 +1890 +1883 +187666 +1873 +1866 +18571857 +18481848 +1844 +1838 +1834 +1831 +181972 +1816 +1815 +181259 +18121945 +181204 +181180 +181178 +181171 +181161 +18112005 +18111959 +181097 +181092 +18101959 +181000 +180996 +180972 +180966 +180964 +180962 +180869 +180861 +180859 +18082003 +18081962 +18081956 +18078 +180773 +18072001 +18071959 +18071957 +18071955 +18071950 +180674 +180668 +180667 +18061955 +180594q +180566 +18052002 +18051964 +18051956 +18051955 +180465 +180458 +18041959 +18041958 +18041957 +18041956 +18041954 +18041953 +18040 +180372 +18036 +18031957 +18031954 +180270 +180262 +18022001 +18018 +180170 +180164 +180158 +18011962 +18011959 +18011801 +1792 +1790 +178353 +178178 +1778397 +17631763 +175175 +1743 +1741 +173468 +1731 +17308913 +171991 +171272 +17121962 +17121951 +17121950 +171198 +171166 +17111966 +17111960 +17111958 +171097 +171075 +171073 +171068 +17101958 +17101955 +170996 +170966 +170962 +170961 +170957 +17092002 +170897 +170870 +170869 +170867 +170778 +170771 +170765 +170763 +17072001 +17071965 +170698 +170667 +170664 +170663 +170660 +170568 +170464 +17042004 +17041962 +17041956 +170399 +170398 +170371 +170368 +170363 +17032005 +17032000 +17031962 +17031960 +17031949 +170268 +170257 +17021955 +1701ab +170175 +170165 +17012001 +17011968 +17011959 +17011950 +170100 +1697 +1693 +167349 +1673 +166166 +16611661 +1658 +1653 +165165 +1645 +1642 +162636 +16261626 +16251625 +1622br +16201620 +161988 +1616161 +161422 +161296 +16121999 +161197 +161166 +161123 +16112002 +16112001 +16111969 +16111965 +16111956 +161111 +161097 +161062 +161061 +16101959 +160999 +160998 +160996 +160968 +160967 +16092001 +1609198 +16091964 +160768 +16071969 +16071963 +16071956 +16071952 +160672 +160667 +160666 +160662 +16066061 +16062006 +16061959 +16061954 +16052002 +16052001 +16051966 +16051959 +16051957 +160474 +160473 +160468 +16042003 +16038 +160371 +16032007 +16032002 +160298 +16028 +160268 +160260 +16021962 +16021960 +160196 +160156 +16012003 +16011955 +15gtha +159874123 +15987 +15975382 +159753258456 +159741 +15951595 +1595159 +159515 +1594 +159357z +159357s +159357lik +159357159357 +1593 +159265 +159263487 +15801580 +1576 +15701570 +1568 +1549 +153828 +15357595 +15351535 +153045 +15263748 +15251525 +152121 +151976 +15141514 +151268 +151267 +151262 +15122001 +15121953 +151175 +151169 +151157 +15112006 +15111961 +15111959 +151098 +15102003 +150962 +15091960 +15091509 +150901 +150875 +150870 +150869 +150866 +150862 +15082002 +15081999 +15081952 +15071962 +15071955 +150706 +15069 +150671 +150669 +1506164 +150607 +150568 +150566 +150565 +150562 +15051999 +150499 +150473 +150463 +150459 +15041961 +15041958 +150398 +150366 +150360 +15032000 +15031949 +150269 +150264 +15021958 +15021950 +150194 +150171 +150164 +150163 +15011958 +15011956 +15011952 +14bestlist +149149 +1488ss1488 +1485 +1478963215 +147258369q +1467 +14581458 +145263 +14311431 +141994 +141982 +141979 +141973 +141274 +141254 +14121998 +14121963 +14121958 +141214 +141197 +141173 +141169 +141161 +14112001 +14111997 +14111966 +14111959 +141098 +141073 +141066 +14102006 +14102003 +141000 +140997 +140996 +140973 +140971 +140967 +14091966 +14091951 +140898 +140867 +14082007 +140774 +14071965 +14071956 +140699 +140672 +14061955 +140567 +140565 +140559 +14052001 +140497 +140464 +14042003 +14042001 +14041965 +14041954 +14041404 +140375 +140369 +140367 +14031969 +14031956 +14031955 +14031953 +140266 +140257 +14021956 +140206 +140196n +140167 +14012002 +14011960 +139713 +1395 +13881388 +137900 +13761376 +1368 +13671367 +135qet +13551355 +13467913 +134500 +1340cc +13401340 +1337ness +13377331 +1334 +13271327 +132639 +13243 +132321 +132132132 +132123 +131313a +131313131313 +131264 +131259 +13122008 +13122006 +13121959 +13121957 +13121954 +131196 +131176 +131156 +13111957 +13111311 +131063 +13102006 +130964 +13092008 +13092006 +13091963 +130858 +13082001 +13081308 +13078 +130773 +13072006 +13071967 +13071964 +13070 +130663 +13061967 +13061961 +13061957 +13061954 +13051969 +13051952 +130499 +130465 +130455 +130398 +130371 +130363 +130358 +130355 +13032002 +13031999 +13031951 +1302alex1994 +130265 +130258 +13021959 +13021957 +13021100 +130175 +13012005 +13012002 +13011958 +12qwer34 +12many +12gauge +12ab34cd +12891 +1286091 +128256512 +12781278 +127777 +127562 +127549 +127486 +127001 +125712571257d +12567 +125555 +12533 +125125125 +1245780 +12441244 +123zxc456 +123yfcnz +123wert +123to123 +123qwerty456 +123qwe45 +123qwe4 +123qazwsxedc +123pass +123iop +123go +123ddd +123_123 +12391239 +123789a +123789852 +123654123 +1236540 +1234zx +1234r +123490 +12345zzz +12345zxcv +12345www +12345six +12345lox +12345love +12345ira +12345den +12345M +123456oe +123456az +1234567g +1234567e +1234567aa +12345678n +123456789Z +1234567899876543 +123456789123456 +123456789101112 +1234567890l +1234567890g +1234567890123 +1234567812345678 +123456654321a +1234562 +123442 +12344 +123434 +1233456 +123321v +123312 +12325 +123164 +123160 +123154 +123123qw +12311994 +123070 +123061 +123056 +1230456 +122977 +12291229 +122779 +122757 +122699 +122566 +122491 +122477 +122470 +122400 +12234 +122087 +122071 +122001 +121971 +121969 +121959 +121881 +121880 +12182 +121783 +121774 +121695 +121586 +121581 +121576 +121478 +12141 +121357 +121351 +121314a +12131415q +12127 +121264 +12122007 +12122006 +12121956 +12121313 +121198 +12116av +121156 +12111948 +12109 +121062 +12101962 +12101960 +121004 +120971 +120958 +120956 +120934 +120867 +120864 +12081957 +12081956 +12081953 +120803 +12078 +120763 +120748 +12071954 +12071953 +120667 +12061959 +120599 +120566 +12051960 +12051956 +120455 +12041952 +120405 +120366 +120364 +12032000 +12031955 +12031954 +120271 +120266 +120258 +120254 +12021959 +120208 +120171 +120164 +120156 +12011958 +12011951 +11eleven +11921192 +11791179 +117463 +11711bbl +116611 +11561156 +115500 +11461146 +113611 +11339977 +113366 +113344 +113300 +11321132 +113082 +112879 +112790 +112683 +112674 +11261126 +112611 +112568 +112566 +11251983 +112470 +112467 +112396 +112321 +112300 +112290 +112282 +112277 +112268 +11226 +1122112 +112181 +112178 +11215 +112131 +112011 +111991 +111968 +111958 +111674 +111555999 +11151115 +111376 +111354 +11131113 +111251 +111234 +11121964 +11121957 +11121956 +1111zz +1111qqq +111141 +11111956 +11111948 +111111v +111111d +11111111q +1111111111111 +111110 +111095 +11101110 +11101 +110998 +11092000 +11091955 +11091109 +110902 +110901 +11088 +110853 +11081955 +110806 +110801 +11078 +110768 +110765 +110757 +11072008 +11071999 +11071961 +11071956 +11071954 +11071107 +110707 +110666 +11062009 +11061951 +110567 +110559 +110469 +110461 +110455 +11041958 +110397 +110395 +110370 +110354 +11031958 +11031953 +11029 +110265 +110263 +110258 +110168 +110157 +11012002 +11011956 +11011954 +1100101 +110000 +10xby49k +10toes +10904 +1071988 +10617906 +105400 +1051983 +1047977 +1038 +103099 +103050 +103030 +102969 +102767 +102680 +102583 +102571 +102570 +102503 +102484 +102473 +102399 +10236 +102300 +102294 +10221022 +102200 +102178 +102171 +102101 +102081 +102070 +101abn +101977 +101967 +101962 +101949 +101886 +101818 +101781 +10166 +101579 +101566 +10152417 +101489 +101400 +101298 +101261 +101260 +101253 +10121960 +101219 +1012010 +101162 +101153 +10112001 +10111950 +101110 +10107 +101054 +101048 +101025 +1010198 +10101962 +10101010m +101006 +10098 +100960 +100955 +10092009 +10091954 +100896 +100873 +100872 +100871 +100854 +100844 +10081999 +10081955 +10081954 +10080 +100769 +100761 +10072003 +10071959 +10071956 +10071955 +10071954 +10071949 +100705 +100658 +100655 +10062006 +10062001 +10061955 +100605 +10058 +100563 +100560 +10052001 +100468 +10042010 +10042008 +10042000 +10041957 +10041954 +1003198 +10031950 +100297 +100264 +100257 +10022007 +10022006 +10021956 +10021955 +100199 +100163 +100161 +100156 +10011959 +100106 +0wnz +0995359291 +0987654a +0981 +092002 +091986 +091979 +091878 +091865 +09141974 +09140914 +091295 +091278 +091265 +09121961 +09121957 +091199 +09111998 +091067 +091064 +091057 +09102001 +09101999 +09101960 +090998 +090973 +090967 +09092006 +09091966 +090895 +090893 +090865 +090862 +090861 +09081958 +09080908 +090776 +090775 +09072000 +09071957 +09071953 +090708 +090676 +090666 +090664 +09061958 +090573 +090568 +090555 +090494 +090469 +090371 +090364 +09031968 +09031965 +09031957 +090282 +090279 +090274 +090265 +090264 +09021955 +090199 +09011969 +09011955 +0899 +0898 +089089 +0890 +0881 +08800880 +0878 +0852123 +082280 +081989 +081983 +081980 +081299 +081270 +081260 +08121958 +081173 +081096 +08101997 +080968 +080967 +080962 +08092001 +08091961 +08091954 +08090809 +08088 +08081956 +080800 +08072002 +08071959 +080700 +080665 +08061960 +080597 +080566 +080559 +080474 +080471 +080468 +08042000 +08041960 +08041959 +080369 +080368 +080367 +080362 +080361 +08031949 +08031947 +080270 +080268 +080252 +080250 +08022001 +08021956 +080195 +080176 +080169 +080167 +08011958 +08011954 +0789 +0771 +077077 +0768 +0747 +0735 +072000 +071956 +071377 +071297 +071271 +071266 +071265 +07122006 +07121965 +07121956 +071203 +07111967 +071095 +071094 +071093 +071091 +07101961 +07101956 +070973 +070967 +070962 +07091959 +070874 +070862 +070859 +07082004 +07081953 +070798 +070796 +07072001 +070679 +070669 +070667 +070666 +07061964 +07061955 +070608 +070575 +070573 +070571 +070569 +070565 +070562 +07051968 +07051952 +070499 +070495 +070464 +07042001 +07042000 +07041955 +07031969 +07031967 +070297 +070278 +07021958 +07021957 +07021954 +070191 +070175 +070171 +070162 +07012006 diff --git a/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/Top100000CommonPasswordsPlus.cs b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/Top100000CommonPasswordsPlus.cs new file mode 100644 index 00000000..693230c3 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/Top100000CommonPasswordsPlus.cs @@ -0,0 +1,13 @@ +ο»Ώusing Microsoft.AspNetCore.Identity; + +namespace EssentialCSharp.Web.Areas.Identity.Services.PasswordValidators; + +/// +/// Validates that the supplied password is not one of the 100,000+ most common passwords +/// +public class Top100000PasswordValidator(PasswordLists passwords) + : CommonPasswordValidator(passwords.Top100000PasswordsPlus.Value) where TUser : IdentityUser +{ + public Top100000PasswordValidator() : this(new PasswordLists()) + { } +} diff --git a/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/UsernameOrEmailAsPasswordValidator.cs b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/UsernameOrEmailAsPasswordValidator.cs new file mode 100644 index 00000000..24cb51c1 --- /dev/null +++ b/EssentialCSharp.Web/Areas/Identity/Services/PasswordValidators/UsernameOrEmailAsPasswordValidator.cs @@ -0,0 +1,21 @@ +ο»Ώusing Microsoft.AspNetCore.Identity; + +namespace EssentialCSharp.Web.Areas.Identity.Services.PasswordValidators; + +public class UsernameOrEmailAsPasswordValidator : IPasswordValidator + where TUser : IdentityUser +{ + public Task ValidateAsync(UserManager manager, TUser user, string? password) + { + if (string.Equals(user.UserName, password, StringComparison.OrdinalIgnoreCase) + || string.Equals(user.Email, password, StringComparison.OrdinalIgnoreCase)) + { + return Task.FromResult(IdentityResult.Failed(new IdentityError + { + Code = "UsernameOrEmailAsPassword", + Description = "You cannot use your username or email as your password" + })); + } + return Task.FromResult(IdentityResult.Success); + } +} diff --git a/EssentialCSharp.Web/Controllers/BaseController.cs b/EssentialCSharp.Web/Controllers/BaseController.cs new file mode 100644 index 00000000..94f0421c --- /dev/null +++ b/EssentialCSharp.Web/Controllers/BaseController.cs @@ -0,0 +1,29 @@ +using EssentialCSharp.Web.Extensions; +using EssentialCSharp.Web.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; + +namespace EssentialCSharp.Web.Controllers; + +public abstract class BaseController : Controller +{ + private readonly IRouteConfigurationService _RouteConfigurationService; + private readonly IHttpContextAccessor _HttpContextAccessor; + + protected BaseController(IRouteConfigurationService routeConfigurationService, IHttpContextAccessor httpContextAccessor) + { + _RouteConfigurationService = routeConfigurationService; + _HttpContextAccessor = httpContextAccessor; + } + + public override void OnActionExecuting(ActionExecutingContext context) + { + // Automatically add static routes to all views + ViewBag.StaticRoutes = System.Text.Json.JsonSerializer.Serialize(_RouteConfigurationService.GetStaticRoutes()); + + // Set the referral Id for use in the front end if available + ViewBag.ReferralId = _HttpContextAccessor.HttpContext.GetReferrerId(); + + base.OnActionExecuting(context); + } +} diff --git a/EssentialCSharp.Web/Controllers/ChatController.cs b/EssentialCSharp.Web/Controllers/ChatController.cs new file mode 100644 index 00000000..8634144b --- /dev/null +++ b/EssentialCSharp.Web/Controllers/ChatController.cs @@ -0,0 +1,124 @@ +using System.Text.Json; +using EssentialCSharp.Chat.Common.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace EssentialCSharp.Web.Controllers; + +[ApiController] +[Route("api/[controller]")] +[Authorize] +[EnableRateLimiting("ChatEndpoint")] +public class ChatController : ControllerBase +{ + private readonly AIChatService _AiChatService; + private readonly ILogger _Logger; + + public ChatController(ILogger logger, AIChatService aiChatService) + { + _AiChatService = aiChatService; + _Logger = logger; + } + + [HttpPost("message")] + public async Task SendMessage([FromBody] ChatMessageRequest request, CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(request.Message)) + { + return BadRequest(new { error = "Message cannot be empty." }); + } + + // Require user authentication for chat + if (!User.Identity?.IsAuthenticated ?? true) + { + return Unauthorized(new { error = "User must be logged in to use chat." }); + } + + var (response, responseId) = await _AiChatService.GetChatCompletion( + prompt: request.Message, + systemPrompt: request.SystemPrompt, + previousResponseId: request.PreviousResponseId, + enableContextualSearch: request.EnableContextualSearch, + cancellationToken: cancellationToken); + + return Ok(new ChatMessageResponse + { + Response = response, + ResponseId = responseId, + Timestamp = DateTime.UtcNow + }); + } + + [HttpPost("stream")] + public async Task StreamMessage([FromBody] ChatMessageRequest request, CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(request.Message)) + { + Response.StatusCode = 400; + await Response.WriteAsync(JsonSerializer.Serialize(new { error = "Message cannot be empty." }), cancellationToken); + return; + } + + // Require user authentication for chat + if (!User.Identity?.IsAuthenticated ?? true) + { + Response.StatusCode = 401; + await Response.WriteAsync(JsonSerializer.Serialize(new { error = "User must be logged in to use chat." }), cancellationToken); + return; + } + + Response.ContentType = "text/event-stream"; + Response.Headers.CacheControl = "no-cache"; + Response.Headers.Connection = "keep-alive"; + + try + { + await foreach (var (text, responseId) in _AiChatService.GetChatCompletionStream( + prompt: request.Message, + systemPrompt: request.SystemPrompt, + previousResponseId: request.PreviousResponseId, + enableContextualSearch: request.EnableContextualSearch, + cancellationToken: cancellationToken)) + { + if (!string.IsNullOrEmpty(text)) + { + var eventData = JsonSerializer.Serialize(new { type = "text", data = text }); + await Response.WriteAsync($"data: {eventData}\n\n", cancellationToken); + await Response.Body.FlushAsync(cancellationToken); + } + + if (!string.IsNullOrEmpty(responseId)) + { + var eventData = JsonSerializer.Serialize(new { type = "responseId", data = responseId }); + await Response.WriteAsync($"data: {eventData}\n\n", cancellationToken); + await Response.Body.FlushAsync(cancellationToken); + } + } + + await Response.WriteAsync("data: [DONE]\n\n", cancellationToken); + await Response.Body.FlushAsync(cancellationToken); + } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested || HttpContext.RequestAborted.IsCancellationRequested) + { + _Logger.LogDebug("Chat stream cancelled for user {User}", User.Identity?.Name); + } + catch (Exception ex) when (!Response.HasStarted) + { + _Logger.LogError(ex, "Chat streaming error before response started for user {User}", User.Identity?.Name); + Response.StatusCode = 500; + Response.ContentType = "application/json"; + await Response.WriteAsJsonAsync(new { error = "Chat service unavailable" }, CancellationToken.None); + } + catch (Exception ex) + { + _Logger.LogError(ex, "Chat streaming error mid-stream for user {User}", User.Identity?.Name); + try + { + await Response.WriteAsync("data: {\"type\":\"error\",\"message\":\"Stream interrupted\"}\n\n", CancellationToken.None); + await Response.Body.FlushAsync(CancellationToken.None); + } + catch { /* client already disconnected */ } + } + } +} diff --git a/EssentialCSharp.Web/Controllers/ChatMessageRequest.cs b/EssentialCSharp.Web/Controllers/ChatMessageRequest.cs new file mode 100644 index 00000000..5d7b3bea --- /dev/null +++ b/EssentialCSharp.Web/Controllers/ChatMessageRequest.cs @@ -0,0 +1,10 @@ +namespace EssentialCSharp.Web.Controllers; + +public class ChatMessageRequest +{ + public string Message { get; set; } = string.Empty; + public string? SystemPrompt { get; set; } + public string? PreviousResponseId { get; set; } + public bool EnableContextualSearch { get; set; } = true; + public string? CaptchaResponse { get; set; } // For future captcha implementation +} diff --git a/EssentialCSharp.Web/Controllers/ChatMessageResponse.cs b/EssentialCSharp.Web/Controllers/ChatMessageResponse.cs new file mode 100644 index 00000000..d1c237b1 --- /dev/null +++ b/EssentialCSharp.Web/Controllers/ChatMessageResponse.cs @@ -0,0 +1,8 @@ +namespace EssentialCSharp.Web.Controllers; + +public class ChatMessageResponse +{ + public string Response { get; set; } = string.Empty; + public string ResponseId { get; set; } = string.Empty; + public DateTime Timestamp { get; set; } +} diff --git a/EssentialCSharp.Web/Controllers/HomeController.cs b/EssentialCSharp.Web/Controllers/HomeController.cs index f1e8a263..b3161fd8 100644 --- a/EssentialCSharp.Web/Controllers/HomeController.cs +++ b/EssentialCSharp.Web/Controllers/HomeController.cs @@ -1,40 +1,36 @@ +using EssentialCSharp.Web.Extensions; using EssentialCSharp.Web.Models; +using EssentialCSharp.Web.Services; using HtmlAgilityPack; using Microsoft.AspNetCore.Mvc; +using Microsoft.CodeAnalysis; namespace EssentialCSharp.Web.Controllers; -public class HomeController : Controller +public class HomeController(ILogger logger, IWebHostEnvironment hostingEnvironment, ISiteMappingService siteMappingService, IHttpContextAccessor httpContextAccessor, IRouteConfigurationService routeConfigurationService) : BaseController(routeConfigurationService, httpContextAccessor) { - private readonly IWebHostEnvironment _HostingEnvironment; - private readonly IList _SiteMappings; - private readonly ILogger _Logger; - - public HomeController(ILogger logger, IWebHostEnvironment hostingEnvironment, IList siteMappings) + public IActionResult Index() { - _Logger = logger; - _HostingEnvironment = hostingEnvironment; - _SiteMappings = siteMappings; - } + string? key = Request.Path.Value?.TrimStart('/'); - public IActionResult Index(string key) - { // if no key (default case), then load up home page - SiteMapping? siteMapping = SiteMapping.Find(key, _SiteMappings); + SiteMapping? siteMapping = siteMappingService.SiteMappings.Find(key); if (string.IsNullOrEmpty(key)) { - return RedirectToAction(nameof(Home)); + return RedirectToAction(nameof(Home)); } else if (siteMapping is not null) { - string filePath = Path.Combine(_HostingEnvironment.ContentRootPath, Path.Combine(siteMapping.PagePath)); + string filePath = Path.Join(hostingEnvironment.ContentRootPath, Path.Join(siteMapping.PagePath)); HtmlDocument doc = new(); doc.Load(filePath); string headHtml = doc.DocumentNode.Element("html").Element("head").InnerHtml; string html = doc.DocumentNode.Element("html").Element("body").InnerHtml; + ViewBag.PageTitle = siteMapping.IndentLevel is 0 ? siteMapping.ChapterTitle + " " + siteMapping.RawHeading : siteMapping.RawHeading; ViewBag.NextPage = FlipPage(siteMapping!.ChapterNumber, siteMapping.PageNumber, true); + ViewBag.CurrentPageKey = siteMapping.PrimaryKey; ViewBag.PreviousPage = FlipPage(siteMapping.ChapterNumber, siteMapping.PageNumber, false); ViewBag.HeadContents = headHtml; ViewBag.Contents = html; @@ -42,35 +38,55 @@ public IActionResult Index(string key) } else { - return RedirectToAction(nameof(Error), new { errorMessage = "Specified page not found, please check your spelling and try again" }); + return RedirectToAction(nameof(Error), new { errorMessage = "Specified page not found, please check your spelling and try again", statusCode = 404 }); } - } [Route("/TermsOfService", Name = "TermsOfService")] public IActionResult TermsOfService() { + ViewBag.PageTitle = "Terms Of Service"; return View(); } - [Route("/Announcements", - Name = "Announcements")] + [Route("/Announcements", Name = "Announcements")] public IActionResult Announcements() { + ViewBag.PageTitle = "Announcements"; + return View(); + } + + [Route("/about", Name = "about")] + public IActionResult About() + { + ViewBag.PageTitle = "About"; return View(); } - [Route("/home", - Name = "home")] + [Route("/home", Name = "home")] public IActionResult Home() { return View(); } + [Route("/guidelines", Name = "guidelines")] + public IActionResult Guidelines() + { + ViewBag.PageTitle = "Coding Guidelines"; + FileInfo fileInfo = new(Path.Join(hostingEnvironment.ContentRootPath, "Guidelines", "guidelines.json")); + if (!fileInfo.Exists) + { + return RedirectToAction(nameof(Error), new { errorMessage = "Guidelines could not be found", statusCode = 404 }); + } + ViewBag.Guidelines = fileInfo.ReadGuidelineJsonFromInputDirectory(logger); + ViewBag.GuidelinesUrl = Request.Path.Value; + return View(); + } + private string FlipPage(int currentChapter, int currentPage, bool next) { - if (_SiteMappings.Count == 0) + if (siteMappingService.SiteMappings.Count == 0) { return ""; } @@ -81,31 +97,33 @@ private string FlipPage(int currentChapter, int currentPage, bool next) page = 1; } - SiteMapping? siteMap = _SiteMappings.FirstOrDefault(f => f.ChapterNumber == currentChapter && f.PageNumber == currentPage + page); + SiteMapping? siteMap = siteMappingService.SiteMappings.FirstOrDefault(f => f.ChapterNumber == currentChapter && f.PageNumber == currentPage + page); if (siteMap is null) { if (next) { - siteMap = _SiteMappings.FirstOrDefault(f => f.ChapterNumber == currentChapter + 1 && f.PageNumber == 1); + siteMap = siteMappingService.SiteMappings.FirstOrDefault(f => f.ChapterNumber == currentChapter + 1 && f.PageNumber == 1); } else { - int? previousPage = _SiteMappings.LastOrDefault(f => f.ChapterNumber == currentChapter - 1)?.PageNumber; - siteMap = _SiteMappings.FirstOrDefault(f => f.ChapterNumber == currentChapter - 1 && f.PageNumber == previousPage); + int? previousPage = siteMappingService.SiteMappings.LastOrDefault(f => f.ChapterNumber == currentChapter - 1)?.PageNumber; + siteMap = siteMappingService.SiteMappings.FirstOrDefault(f => f.ChapterNumber == currentChapter - 1 && f.PageNumber == previousPage); } if (siteMap is null) { return ""; } } - return $"{siteMap.Key}#{siteMap.AnchorId}"; + return $"{siteMap.Keys.First()}#{siteMap.AnchorId}"; } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] - public IActionResult Error(string? errorMessage = null) + public IActionResult Error(string? errorMessage = null, int statusCode = 404) { - ViewBag.ErrorMessage = errorMessage; + Response.StatusCode = statusCode; + ViewBag.ErrorMessage = $"{statusCode}: {errorMessage}"; + ViewBag.PageTitle = $"Error-{statusCode}"; return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } } diff --git a/EssentialCSharp.Web/Controllers/ListingSourceCodeController.cs b/EssentialCSharp.Web/Controllers/ListingSourceCodeController.cs new file mode 100644 index 00000000..d7d6c644 --- /dev/null +++ b/EssentialCSharp.Web/Controllers/ListingSourceCodeController.cs @@ -0,0 +1,42 @@ +using EssentialCSharp.Web.Services; +using Microsoft.AspNetCore.Mvc; + +namespace EssentialCSharp.Web.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class ListingSourceCodeController : ControllerBase +{ + private readonly IListingSourceCodeService _ListingSourceCodeService; + private readonly ILogger _Logger; + + public ListingSourceCodeController( + IListingSourceCodeService listingSourceCodeService, + ILogger logger) + { + _ListingSourceCodeService = listingSourceCodeService; + _Logger = logger; + } + + [HttpGet("chapter/{chapter}/listing/{listing}")] + [ResponseCache(Duration = 3600, Location = ResponseCacheLocation.Any)] + public async Task GetListing(int chapter, int listing) + { + var result = await _ListingSourceCodeService.GetListingAsync(chapter, listing); + + if (result == null) + { + return NotFound(new { error = $"Listing {chapter}.{listing} not found." }); + } + + return Ok(result); + } + + [HttpGet("chapter/{chapter}")] + [ResponseCache(Duration = 3600, Location = ResponseCacheLocation.Any)] + public async Task GetListingsByChapter(int chapter) + { + var results = await _ListingSourceCodeService.GetListingsByChapterAsync(chapter); + return Ok(results); + } +} diff --git a/EssentialCSharp.Web/DatabaseMigrationService.cs b/EssentialCSharp.Web/DatabaseMigrationService.cs new file mode 100644 index 00000000..fc6342d1 --- /dev/null +++ b/EssentialCSharp.Web/DatabaseMigrationService.cs @@ -0,0 +1,22 @@ +ο»Ώusing EssentialCSharp.Web.Data; +using Microsoft.EntityFrameworkCore; + +namespace EssentialCSharp.Web; + +/// +/// Runs EF Core migrations synchronously in so the schema +/// is fully applied before the HTTP server begins accepting traffic. This prevents +/// race conditions where a request touches the DataProtectionKeys (or Identity) tables +/// before the migration that creates them has run. +/// +public class DatabaseMigrationService(IServiceScopeFactory services) : IHostedService +{ + public async Task StartAsync(CancellationToken cancellationToken) + { + using IServiceScope scope = services.CreateScope(); + EssentialCSharpWebContext context = scope.ServiceProvider.GetRequiredService(); + await context.Database.MigrateAsync(cancellationToken); + } + + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; +} diff --git a/EssentialCSharp.Web/Dockerfile b/EssentialCSharp.Web/Dockerfile new file mode 100644 index 00000000..0aa2e949 --- /dev/null +++ b/EssentialCSharp.Web/Dockerfile @@ -0,0 +1,26 @@ +#syntax=docker/dockerfile:1.2 + +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:10.0.203 AS build +ARG ACCESS_TO_NUGET_FEED=true +ENV ACCESS_TO_NUGET_FEED=$ACCESS_TO_NUGET_FEED +RUN sh -c "$(curl -fsSL https://aka.ms/install-artifacts-credprovider.sh)" +WORKDIR /src +COPY . . +RUN --mount=type=secret,id=nuget_auth_token \ + if [ "$ACCESS_TO_NUGET_FEED" = "true" ]; then \ + auth_token=$(cat /run/secrets/nuget_auth_token) && \ + export VSS_NUGET_EXTERNAL_FEED_ENDPOINTS="{\"endpointCredentials\": [{\"endpoint\":\"https://pkgs.dev.azure.com/intelliTect/_packaging/EssentialCSharp/nuget/v3/index.json\", \"password\":\"$auth_token\"}]}"; \ + fi && \ + dotnet restore "EssentialCSharp.Web.slnx" -p:AccessToNugetFeed=$ACCESS_TO_NUGET_FEED && \ + dotnet build "EssentialCSharp.Web.slnx" -c Release --no-restore -p:AccessToNugetFeed=$ACCESS_TO_NUGET_FEED -p:ReleaseDateAttribute=True && \ + dotnet publish "EssentialCSharp.Web.slnx" -c Release -p:PublishDir=/app/publish -p:UseAppHost=false --no-build + +FROM base AS final +WORKDIR /app +COPY --from=build /app/publish . +ENTRYPOINT ["dotnet", "EssentialCSharp.Web.dll"] diff --git a/EssentialCSharp.Web/EssentialCSharp.Web.csproj b/EssentialCSharp.Web/EssentialCSharp.Web.csproj index 996e9ff7..705a16ca 100644 --- a/EssentialCSharp.Web/EssentialCSharp.Web.csproj +++ b/EssentialCSharp.Web/EssentialCSharp.Web.csproj @@ -1,30 +1,102 @@ -ο»Ώ + - net7.0 - true + net10.0 + + + $(NoWarn);CA1873; + - - + + + + + + + + + + + + - + + - - - - - + + + + + + + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + all + + + all + + + + + + + + + + + PreserveNewest + + PreserveNewest + - - + + + + + + + + RemoveIdentityAssets + + + + + + + + + + + + + + diff --git a/EssentialCSharp.Web/Extensions/ClaimsExtensions.cs b/EssentialCSharp.Web/Extensions/ClaimsExtensions.cs new file mode 100644 index 00000000..b969f5cf --- /dev/null +++ b/EssentialCSharp.Web/Extensions/ClaimsExtensions.cs @@ -0,0 +1,28 @@ +ο»Ώusing System.Security.Claims; + +namespace EssentialCSharp.Web.Extensions; + +public static class ClaimsExtensions +{ + public static string? GetReferrerId(this ClaimsPrincipal claimsPrincipal) + { + return claimsPrincipal.FindFirstValue(ReferrerIdClaimType); + } + + public static string? GetReferrerId(this IList claims) + { + return claims.FirstOrDefault(claim => claim.Type == ReferrerIdClaimType)?.Value; + } + + /// + /// Gets the referral ID from the current user's claims in the HttpContext + /// + /// The HttpContext to get the referral ID from + /// The referral ID if found, otherwise null + public static string? GetReferrerId(this HttpContext? httpContext) + { + return httpContext?.User?.GetReferrerId(); + } + + public const string ReferrerIdClaimType = "ReferrerId"; +} diff --git a/EssentialCSharp.Web/Extensions/FileInfoExtensions.cs b/EssentialCSharp.Web/Extensions/FileInfoExtensions.cs new file mode 100644 index 00000000..e3a78600 --- /dev/null +++ b/EssentialCSharp.Web/Extensions/FileInfoExtensions.cs @@ -0,0 +1,29 @@ +ο»Ώusing System.Text.Json; + +namespace EssentialCSharp.Web.Extensions; + +public static class FileInfoExtensions +{ + public static List? ReadGuidelineJsonFromInputDirectory(this FileInfo guidelinesJsonFile, ILogger logger) + { + // Check if the file exists + if (!guidelinesJsonFile.Exists) + { + logger.LogError("File not found at {JsonPath}", guidelinesJsonFile.FullName); + return null; + } + + // Read the JSON file + string jsonString = File.ReadAllText(guidelinesJsonFile.FullName); + + // Deserialize the JSON string into a List + List? guidelines = JsonSerializer.Deserialize>(jsonString, GuidelineListing.Options); + + if (guidelines?.Count > 0) + { + logger.LogInformation("guidelines.json successfully read from {JsonPath}", guidelinesJsonFile.FullName); + } + + return guidelines; + } +} diff --git a/EssentialCSharp.Web/Extensions/IServiceCollectionExtensions.cs b/EssentialCSharp.Web/Extensions/IServiceCollectionExtensions.cs new file mode 100644 index 00000000..9ef4a7b1 --- /dev/null +++ b/EssentialCSharp.Web/Extensions/IServiceCollectionExtensions.cs @@ -0,0 +1,16 @@ +ο»Ώusing EssentialCSharp.Web.Services; + +namespace EssentialCSharp.Web.Extensions; + +public static class IServiceCollectionExtensions +{ + public static void AddCaptchaService(this IServiceCollection services, IConfigurationSection CaptchaOptions) + { + services.Configure(CaptchaOptions); + services.AddSingleton(); + services.AddHttpClient("hCaptcha", c => + { + c.BaseAddress = new Uri("https://api.hcaptcha.com"); + }); + } +} diff --git a/EssentialCSharp.Web/Extensions/SiteMappingListExtensions.cs b/EssentialCSharp.Web/Extensions/SiteMappingListExtensions.cs new file mode 100644 index 00000000..3e50d4e5 --- /dev/null +++ b/EssentialCSharp.Web/Extensions/SiteMappingListExtensions.cs @@ -0,0 +1,70 @@ +ο»Ώusing System.Globalization; + +namespace EssentialCSharp.Web.Extensions; + +public static class SiteMappingListExtensions +{ + /// + /// Finds a site mapping based on a key. + /// + /// IList of SiteMappings + /// If null, uses the first key in the list + /// If found, the site mapping that matches the key, otherwise null. + public static SiteMapping? Find(this IList siteMappings, string? key) + { + if (string.IsNullOrWhiteSpace(key)) + { + return siteMappings.FirstOrDefault(); + } + return key.GetPotentialMatches() + .Select(potentialMatch => siteMappings.FirstOrDefault(x => x.Keys.Any(k => k == potentialMatch))) + .FirstOrDefault(siteMap => siteMap != null); + } + /// + /// Finds percent complete based on a key. + /// + /// IList of SiteMappings + /// The key to search for. If null, returns null. + /// Returns a formatted double for use as the percent complete. + public static string? FindPercentComplete(this IList siteMappings, string? key) + { + if (key is null) + { + return null; + } + if (key.Trim().Length is 0) + { + throw new ArgumentException("Parameter 'key' cannot be null or whitespace.", nameof(key)); + } + int currentMappingCount = 0; + int overallMappingCount = 0; + bool currentPageFound = false; + IEnumerable> chapterGroupings = siteMappings.GroupBy(x => x.ChapterNumber).OrderBy(g => g.Key); + foreach (IGrouping chapterGrouping in chapterGroupings) + { + IEnumerable> pageGroupings = chapterGrouping.GroupBy(x => x.PageNumber).OrderBy(g => g.Key); + foreach (IGrouping pageGrouping in pageGroupings) + { + foreach (SiteMapping siteMapping in pageGrouping) + { + if (!currentPageFound) + { + currentMappingCount++; + } + overallMappingCount++; + if (siteMapping.PrimaryKey == key) + { + currentPageFound = true; + } + } + } + } + if (overallMappingCount is 0 || !currentPageFound) + { + return "0.00"; + } + + double result = (double)currentMappingCount / overallMappingCount * 100; + return string.Format(CultureInfo.InvariantCulture, "{0:0.00}", result); + } +} diff --git a/EssentialCSharp.Web/Extensions/StringExtensions.cs b/EssentialCSharp.Web/Extensions/StringExtensions.cs index b4386348..32509550 100644 --- a/EssentialCSharp.Web/Extensions/StringExtensions.cs +++ b/EssentialCSharp.Web/Extensions/StringExtensions.cs @@ -8,7 +8,7 @@ public static class StringExtensions /// Prepares a string to be sanitized. /// /// Input string - /// An IEnumberable of the input string + /// An IEnumerable of the input string public static IEnumerable GetPotentialMatches(this string str) { string[] pathBeforeAnchorFragment = str.Split("#"); diff --git a/EssentialCSharp.Web/Helpers/SitemapXmlHelpers.cs b/EssentialCSharp.Web/Helpers/SitemapXmlHelpers.cs new file mode 100644 index 00000000..1a8abc5b --- /dev/null +++ b/EssentialCSharp.Web/Helpers/SitemapXmlHelpers.cs @@ -0,0 +1,100 @@ +using DotnetSitemapGenerator; +using DotnetSitemapGenerator.Serialization; +using EssentialCSharp.Web.Services; + +namespace EssentialCSharp.Web.Helpers; + +public static class SitemapXmlHelpers +{ + public static void EnsureSitemapHealthy(List siteMappings) + { + var groups = siteMappings.GroupBy(item => new { item.ChapterNumber, item.PageNumber }); + foreach (var group in groups) + { + var count = group.Count(item => item.IncludeInSitemapXml); + if (count != 1) + { + throw new InvalidOperationException($"Sitemap error: Chapter {group.Key.ChapterNumber}, Page {group.Key.PageNumber} has more than one canonical link, or none"); + } + } + } + + public static void GenerateAndSerializeSitemapXml(DirectoryInfo wwwrootDirectory, List siteMappings, ILogger logger, IRouteConfigurationService routeConfigurationService, string baseUrl) + { + GenerateSitemapXml(wwwrootDirectory, siteMappings, routeConfigurationService, baseUrl, out List nodes); + XmlSerializer sitemapProvider = new(); + var xmlPath = Path.Join(wwwrootDirectory.FullName, "sitemap.xml"); + sitemapProvider.Serialize(new SitemapModel(nodes), xmlPath, true); + logger.LogInformation("sitemap.xml successfully written to {XmlPath}", xmlPath); + } + + public static void GenerateSitemapXml(DirectoryInfo wwwrootDirectory, List siteMappings, IRouteConfigurationService routeConfigurationService, string baseUrl, out List nodes) + { + DateTime newDateTime = DateTime.UtcNow; + + // Routes should end up with leading slash + baseUrl = baseUrl.TrimEnd('/'); + + // Start with the root URL + nodes = new() { + new($"{baseUrl}/") + { + LastModificationDate = newDateTime, + ChangeFrequency = ChangeFrequency.Daily, + Priority = 1.0M + } + }; + + // Add routes dynamically discovered from controllers + var allRoutes = routeConfigurationService.GetStaticRoutes(); + var controllerRoutes = allRoutes + .Where(route => !route.Contains("error", StringComparison.OrdinalIgnoreCase)) // Skip Error actions for sitemap + .Where(route => !route.Contains("index", StringComparison.OrdinalIgnoreCase)) // Skip Index actions for sitemap + .Where(route => !route.Contains("identity", StringComparison.OrdinalIgnoreCase)) // Skip Identity actions for sitemap + // All routes should have leading slash + .Select(route => $"/{route}") // Add leading slash for sitemap URLs + .ToList(); + + foreach (var route in controllerRoutes) + { + nodes.Add(new($"{baseUrl}{route}") + { + LastModificationDate = newDateTime, + ChangeFrequency = GetChangeFrequencyForRoute(route), + Priority = GetPriorityForRoute(route) + }); + } + + // Add site mappings from content + nodes.AddRange(siteMappings.Where(item => item.IncludeInSitemapXml).Select(siteMapping => new($"{baseUrl.TrimEnd('/')}/{siteMapping.Keys.First()}") + { + LastModificationDate = siteMapping.LastModified ?? newDateTime, + ChangeFrequency = ChangeFrequency.Daily, + Priority = 0.8M + })); + } + + private static ChangeFrequency GetChangeFrequencyForRoute(string route) + { + return route.ToLowerInvariant() switch + { + "/termsofservice" => ChangeFrequency.Yearly, + "/announcements" => ChangeFrequency.Monthly, + "/guidelines" => ChangeFrequency.Monthly, + _ => ChangeFrequency.Monthly + }; + } + + private static decimal GetPriorityForRoute(string route) + { + return route.ToLowerInvariant() switch + { + "/home" => 0.5M, + "/about" => 0.5M, + "/announcements" => 0.5M, + "/guidelines" => 0.9M, + "/termsofservice" => 0.2M, + _ => 0.5M + }; + } +} diff --git a/EssentialCSharp.Web/Middleware/Constants/ContentTypeOptionsConstants.cs b/EssentialCSharp.Web/Middleware/Constants/ContentTypeOptionsConstants.cs new file mode 100644 index 00000000..6f833b08 --- /dev/null +++ b/EssentialCSharp.Web/Middleware/Constants/ContentTypeOptionsConstants.cs @@ -0,0 +1,14 @@ +ο»Ώnamespace EssentialCSharp.Web.Middleware.Constants; + +public class ContentTypeOptionsConstants +{ + /// + /// Header value for X-Content-Type-Options + /// + public const string Header = "X-Content-Type-Options"; + + /// + /// Disables content sniffing + /// + public const string NoSniff = "nosniff"; +} diff --git a/EssentialCSharp.Web/Middleware/Constants/FrameOptionsConstants.cs b/EssentialCSharp.Web/Middleware/Constants/FrameOptionsConstants.cs new file mode 100644 index 00000000..0f2fb70c --- /dev/null +++ b/EssentialCSharp.Web/Middleware/Constants/FrameOptionsConstants.cs @@ -0,0 +1,29 @@ +using System.Text; + +namespace EssentialCSharp.Web.Middleware.Constants; + +/// +/// X-Frame-Options-related constants. +/// +public static class FrameOptionsConstants +{ + /// + /// The header value for X-Frame-Options + /// + public const string Header = "X-Frame-Options"; + + /// + /// The page cannot be displayed in a frame, regardless of the site attempting to do so. + /// + public const string Deny = "DENY"; + + /// + /// The page can only be displayed in a frame on the same origin as the page itself. + /// + public const string SameOrigin = "SAMEORIGIN"; + + /// + /// The page can only be displayed in a frame on the specified origin. {0} specifies the format string + /// + public static readonly CompositeFormat AllowFromUri = CompositeFormat.Parse("ALLOW-FROM {0}"); +} diff --git a/EssentialCSharp.Web/Middleware/Constants/ServerConstants.cs b/EssentialCSharp.Web/Middleware/Constants/ServerConstants.cs new file mode 100644 index 00000000..745c0f6a --- /dev/null +++ b/EssentialCSharp.Web/Middleware/Constants/ServerConstants.cs @@ -0,0 +1,9 @@ +ο»Ώnamespace EssentialCSharp.Web.Middleware.Constants; + +public class ServerConstants +{ + /// + /// The header value for X-Powered-By + /// + public const string Header = "Server"; +} diff --git a/EssentialCSharp.Web/Middleware/Constants/StrictTransportSecurityConstants.cs b/EssentialCSharp.Web/Middleware/Constants/StrictTransportSecurityConstants.cs new file mode 100644 index 00000000..9c1b5be7 --- /dev/null +++ b/EssentialCSharp.Web/Middleware/Constants/StrictTransportSecurityConstants.cs @@ -0,0 +1,29 @@ +ο»Ώusing System.Text; + +namespace EssentialCSharp.Web.Middleware.Constants; + +/// +/// Strict-Transport-Security-related constants. +/// +public static class StrictTransportSecurityConstants +{ + /// + /// Header value for Strict-Transport-Security + /// + public const string Header = "Strict-Transport-Security"; + + /// + /// Tells the user-agent to cache the domain in the STS list for the provided number of seconds {0} + /// + public static readonly CompositeFormat MaxAge = CompositeFormat.Parse("max-age={0}"); + + /// + /// Tells the user-agent to cache the domain in the STS list for the provided number of seconds {0} and include any sub-domains. + /// + public static readonly CompositeFormat MaxAgeIncludeSubdomains = CompositeFormat.Parse("max-age={0}; includeSubDomains"); + + /// + /// Tells the user-agent to remove, or not cache the host in the STS cache. + /// + public const string NoCache = "max-age=0"; +} diff --git a/EssentialCSharp.Web/Middleware/Constants/XssProtectionConstants.cs b/EssentialCSharp.Web/Middleware/Constants/XssProtectionConstants.cs new file mode 100644 index 00000000..6213f7c0 --- /dev/null +++ b/EssentialCSharp.Web/Middleware/Constants/XssProtectionConstants.cs @@ -0,0 +1,35 @@ +ο»Ώusing System.Text; + +namespace EssentialCSharp.Web.Middleware.Constants; + +/// +/// X-XSS-Protection-related constants. +/// +public static class XssProtectionConstants +{ + /// + /// Header value for X-XSS-Protection + /// + public const string Header = "X-XSS-Protection"; + + /// + /// Enables the XSS Protections + /// + public const string Enabled = "1"; + + /// + /// Disables the XSS Protections offered by the user-agent. + /// + public const string Disabled = "0"; + + /// + /// Enables XSS protections and instructs the user-agent to block the response in the event that script has been inserted from user input, instead of sanitizing. + /// + public const string Block = "1; mode=block"; + + /// + /// A partially supported directive that tells the user-agent to report potential XSS attacks to a single URL. Data will be POST'd to the report URL in JSON format. + /// {0} specifies the report url, including protocol + /// + public static readonly CompositeFormat Report = CompositeFormat.Parse("1; report={0}"); +} diff --git a/EssentialCSharp.Web/Middleware/ReferralTrackingMiddleware.cs b/EssentialCSharp.Web/Middleware/ReferralTrackingMiddleware.cs new file mode 100644 index 00000000..4306becf --- /dev/null +++ b/EssentialCSharp.Web/Middleware/ReferralTrackingMiddleware.cs @@ -0,0 +1,39 @@ +using System.Web; +using EssentialCSharp.Web.Areas.Identity.Data; +using EssentialCSharp.Web.Services.Referrals; +using Microsoft.AspNetCore.Identity; + +namespace EssentialCSharp.Web.Middleware; + +public sealed class ReferralMiddleware +{ + private readonly RequestDelegate _Next; + + public ReferralMiddleware(RequestDelegate next) + { + _Next = next; + } + + public async Task InvokeAsync(HttpContext context, IReferralService referralService, UserManager userManager) + { + // Retrieve current referral Id for processing + System.Collections.Specialized.NameValueCollection query = HttpUtility.ParseQueryString(context.Request.QueryString.Value!); + string? referralId = query["rid"]; + if (string.IsNullOrWhiteSpace(referralId)) + { + await _Next(context); + return; + } + + if (context.User is { Identity.IsAuthenticated: true } claimsUser) + { + referralService.TrackReferralAsync(referralId, claimsUser); + } + else + { + referralService.TrackReferralAsync(referralId, null); + } + + await _Next(context); + } +} diff --git a/EssentialCSharp.Web/Middleware/SecurityHeadersBuilder.cs b/EssentialCSharp.Web/Middleware/SecurityHeadersBuilder.cs new file mode 100644 index 00000000..51c19e8c --- /dev/null +++ b/EssentialCSharp.Web/Middleware/SecurityHeadersBuilder.cs @@ -0,0 +1,213 @@ +ο»Ώusing System.Globalization; +using EssentialCSharp.Web.Middleware.Constants; + +namespace EssentialCSharp.Web.Middleware; + +/// +/// Exposes methods to build a policy. +/// +public class SecurityHeadersBuilder +{ + private readonly SecurityHeadersPolicy _Policy = new(); + + //public SecurityHeadersBuilder() { } + + /// + /// The number of seconds in one year + /// + public const int OneYearInSeconds = 60 * 60 * 24 * 365; + + /// + /// Add default headers in accordance with most secure approach + /// + public SecurityHeadersBuilder AddDefaultSecurePolicy() + { + // Headers to Add: https://owasp.org/www-project-secure-headers/ci/headers_add.json + // + AddFrameOptionsDeny(); + // + AddXssProtectionBlock(); + // + AddContentTypeOptionsNoSniff(); + // + AddStrictTransportSecurityMaxAgeIncludeSubDomains(); + // + AddCustomHeader("X-Permitted-Cross-Domain-Policies", "master-only"); + // + AddCustomHeader("Referrer-Policy", "no-referrer"); + // + AddCustomHeader("Permissions-Policy", "accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),layout-animations=(self),legacy-image-formats=(self),magnetometer=(),microphone=(),midi=(),oversized-images=(self),payment=(),picture-in-picture=(),publickey-credentials-get=(),speaker-selection=(),sync-xhr=(self),unoptimized-images=(self),unsized-media=(self),usb=(),screen-wake-lock=(),web-share=(),xr-spatial-tracking=()"); + + // Headers to Remove: https://owasp.org/www-project-secure-headers/ci/headers_remove.json + RemoveServerHeader(); + RemoveHeader("X-Powered-By"); + + return this; + } + + /// + /// Add X-Frame-Options DENY to all requests. + /// The page cannot be displayed in a frame, regardless of the site attempting to do so + /// + public SecurityHeadersBuilder AddFrameOptionsDeny() + { + _Policy.SetHeaders[FrameOptionsConstants.Header] = FrameOptionsConstants.Deny; + return this; + } + + /// + /// Add X-Frame-Options SAMEORIGIN to all requests. + /// The page can only be displayed in a frame on the same origin as the page itself. + /// + public SecurityHeadersBuilder AddFrameOptionsSameOrigin() + { + _Policy.SetHeaders[FrameOptionsConstants.Header] = FrameOptionsConstants.SameOrigin; + return this; + } + + /// + /// Add X-Frame-Options ALLOW-FROM {uri} to all requests, where the uri is provided + /// The page can only be displayed in a frame on the specified origin. + /// + /// The uri of the origin in which the page may be displayed in a frame + public SecurityHeadersBuilder AddFrameOptionsSameOrigin(string uri) + { + _Policy.SetHeaders[FrameOptionsConstants.Header] = string.Format(CultureInfo.InvariantCulture, FrameOptionsConstants.AllowFromUri, uri); + return this; + } + + /// + /// Add X-XSS-Protection 1 to all requests. + /// Enables the XSS Protections + /// + public SecurityHeadersBuilder AddXssProtectionEnabled() + { + _Policy.SetHeaders[XssProtectionConstants.Header] = XssProtectionConstants.Enabled; + return this; + } + + /// + /// Add X-XSS-Protection 0 to all requests. + /// Disables the XSS Protections offered by the user-agent. + /// + public SecurityHeadersBuilder AddXssProtectionDisabled() + { + _Policy.SetHeaders[XssProtectionConstants.Header] = XssProtectionConstants.Disabled; + return this; + } + + /// + /// Add X-XSS-Protection 1; mode=block to all requests. + /// Enables XSS protections and instructs the user-agent to block the response in the event that script has been inserted from user input, instead of sanitizing. + /// + public SecurityHeadersBuilder AddXssProtectionBlock() + { + _Policy.SetHeaders[XssProtectionConstants.Header] = XssProtectionConstants.Block; + return this; + } + + /// + /// Add X-XSS-Protection 1; report=http://site.com/report to all requests. + /// A partially supported directive that tells the user-agent to report potential XSS attacks to a single URL. Data will be POST'd to the report URL in JSON format. + /// + public SecurityHeadersBuilder AddXssProtectionReport(string reportUrl) + { + _Policy.SetHeaders[XssProtectionConstants.Header] = + string.Format(CultureInfo.InvariantCulture, XssProtectionConstants.Report, reportUrl); + return this; + } + + /// + /// Add Strict-Transport-Security max-age= to all requests. + /// Tells the user-agent to cache the domain in the STS list for the number of seconds provided. + /// + public SecurityHeadersBuilder AddStrictTransportSecurityMaxAge(int maxAge = OneYearInSeconds) + { + _Policy.SetHeaders[StrictTransportSecurityConstants.Header] = + string.Format(CultureInfo.InvariantCulture, StrictTransportSecurityConstants.MaxAge, maxAge); + return this; + } + + /// + /// Add Strict-Transport-Security max-age=; includeSubDomains to all requests. + /// Tells the user-agent to cache the domain in the STS list for the number of seconds provided and include any sub-domains. + /// + public SecurityHeadersBuilder AddStrictTransportSecurityMaxAgeIncludeSubDomains(int maxAge = OneYearInSeconds) + { + _Policy.SetHeaders[StrictTransportSecurityConstants.Header] = + string.Format(CultureInfo.InvariantCulture, StrictTransportSecurityConstants.MaxAgeIncludeSubdomains, maxAge); + return this; + } + + /// + /// Add Strict-Transport-Security max-age=0 to all requests. + /// Tells the user-agent to remove, or not cache the host in the STS cache + /// + public SecurityHeadersBuilder AddStrictTransportSecurityNoCache() + { + _Policy.SetHeaders[StrictTransportSecurityConstants.Header] = + StrictTransportSecurityConstants.NoCache; + return this; + } + + /// + /// Add X-Content-Type-Options nosniff to all requests. + /// Can be set to protect against MIME type confusion attacks. + /// + public SecurityHeadersBuilder AddContentTypeOptionsNoSniff() + { + _Policy.SetHeaders[ContentTypeOptionsConstants.Header] = ContentTypeOptionsConstants.NoSniff; + return this; + } + + /// + /// Removes the Server header from all responses + /// + public SecurityHeadersBuilder RemoveServerHeader() + { + _Policy.RemoveHeaders.Add(ServerConstants.Header); + return this; + } + + /// + /// Adds a custom header to all requests + /// + /// The header name + /// The value for the header + /// + public SecurityHeadersBuilder AddCustomHeader(string header, string value) + { + if (string.IsNullOrEmpty(header)) + { + throw new ArgumentNullException(nameof(header)); + } + + _Policy.SetHeaders[header] = value; + return this; + } + + /// + /// Remove a header from all requests + /// + /// The to remove + /// + public SecurityHeadersBuilder RemoveHeader(string header) + { + if (string.IsNullOrEmpty(header)) + { + throw new ArgumentNullException(nameof(header)); + } + + _Policy.RemoveHeaders.Add(header); + return this; + } + + /// + /// Builds a new using the entries added. + /// + /// The constructed . + public SecurityHeadersPolicy Build() + { + return _Policy; + } +} diff --git a/EssentialCSharp.Web/Middleware/SecurityHeadersMiddleware.cs b/EssentialCSharp.Web/Middleware/SecurityHeadersMiddleware.cs new file mode 100644 index 00000000..dd973660 --- /dev/null +++ b/EssentialCSharp.Web/Middleware/SecurityHeadersMiddleware.cs @@ -0,0 +1,47 @@ +ο»Ώnamespace EssentialCSharp.Web.Middleware; + +/// +/// Instantiates a new . +/// +/// The next middleware in the pipeline. +/// An instance of the which can be applied. +public class SecurityHeadersMiddleware(RequestDelegate next, SecurityHeadersPolicy policy) +{ + private readonly RequestDelegate _Next = next ?? throw new ArgumentNullException(nameof(next)); + private readonly SecurityHeadersPolicy _Policy = policy ?? throw new ArgumentNullException(nameof(policy)); + + public async Task Invoke(HttpContext? context) + { + ArgumentNullException.ThrowIfNull(context); + + HttpResponse response = context.Response ?? throw new InvalidOperationException(nameof(context.Response)); + IHeaderDictionary headers = response.Headers; + + foreach (KeyValuePair headerValuePair in _Policy.SetHeaders) + { + headers[headerValuePair.Key] = headerValuePair.Value; + } + + foreach (string header in _Policy.RemoveHeaders) + { + headers.Remove(header); + } + + await _Next(context); + } +} + +// Extension method used to add the middleware to the HTTP request pipeline. +public static class MiddlewareExtensions +{ + public static IApplicationBuilder UseSecurityHeadersMiddleware(this IApplicationBuilder builder) + { + return builder.UseMiddleware(new SecurityHeadersBuilder().AddDefaultSecurePolicy().Build()); + } + + public static IApplicationBuilder UseSecurityHeadersMiddleware(this IApplicationBuilder app, SecurityHeadersBuilder builder) + { + SecurityHeadersPolicy policy = builder.Build(); + return app.UseMiddleware(policy); + } +} diff --git a/EssentialCSharp.Web/Middleware/SecurityHeadersPolicy.cs b/EssentialCSharp.Web/Middleware/SecurityHeadersPolicy.cs new file mode 100644 index 00000000..9a0f221c --- /dev/null +++ b/EssentialCSharp.Web/Middleware/SecurityHeadersPolicy.cs @@ -0,0 +1,10 @@ +ο»Ώnamespace EssentialCSharp.Web.Middleware; + +public class SecurityHeadersPolicy +{ + public IDictionary SetHeaders { get; } + = new Dictionary(); + + public ISet RemoveHeaders { get; } + = new HashSet(); +} diff --git a/EssentialCSharp.Web/Migrations/20231021170008_CreateIdentitySchema.Designer.cs b/EssentialCSharp.Web/Migrations/20231021170008_CreateIdentitySchema.Designer.cs new file mode 100644 index 00000000..9a0a93cf --- /dev/null +++ b/EssentialCSharp.Web/Migrations/20231021170008_CreateIdentitySchema.Designer.cs @@ -0,0 +1,282 @@ +ο»Ώ// +using System; +using EssentialCSharp.Web.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace EssentialCSharp.Web.Migrations; + +[DbContext(typeof(EssentialCSharpWebContext))] +[Migration("20231021170008_CreateIdentitySchema")] +partial class CreateIdentitySchema +{ + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } +} diff --git a/EssentialCSharp.Web/Migrations/20231021170008_CreateIdentitySchema.cs b/EssentialCSharp.Web/Migrations/20231021170008_CreateIdentitySchema.cs new file mode 100644 index 00000000..f52303ca --- /dev/null +++ b/EssentialCSharp.Web/Migrations/20231021170008_CreateIdentitySchema.cs @@ -0,0 +1,222 @@ +ο»Ώusing Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace EssentialCSharp.Web.Migrations; + +/// +public partial class CreateIdentitySchema : Migration +{ + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AspNetRoles", + columns: table => new + { + Id = table.Column(type: "nvarchar(450)", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetUsers", + columns: table => new + { + Id = table.Column(type: "nvarchar(450)", nullable: false), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + EmailConfirmed = table.Column(type: "bit", nullable: false), + PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), + SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), + PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false), + AccessFailedCount = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetRoleClaims", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + RoleId = table.Column(type: "nvarchar(450)", nullable: false), + ClaimType = table.Column(type: "nvarchar(max)", nullable: true), + ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserClaims", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + UserId = table.Column(type: "nvarchar(450)", nullable: false), + ClaimType = table.Column(type: "nvarchar(max)", nullable: true), + ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetUserClaims_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserLogins", + columns: table => new + { + LoginProvider = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderKey = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(max)", nullable: true), + UserId = table.Column(type: "nvarchar(450)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); + table.ForeignKey( + name: "FK_AspNetUserLogins_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserRoles", + columns: table => new + { + UserId = table.Column(type: "nvarchar(450)", nullable: false), + RoleId = table.Column(type: "nvarchar(450)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserTokens", + columns: table => new + { + UserId = table.Column(type: "nvarchar(450)", nullable: false), + LoginProvider = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AspNetUserTokens_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AspNetRoleClaims_RoleId", + table: "AspNetRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "RoleNameIndex", + table: "AspNetRoles", + column: "NormalizedName", + unique: true, + filter: "[NormalizedName] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserClaims_UserId", + table: "AspNetUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserLogins_UserId", + table: "AspNetUserLogins", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserRoles_RoleId", + table: "AspNetUserRoles", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "EmailIndex", + table: "AspNetUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "UserNameIndex", + table: "AspNetUsers", + column: "NormalizedUserName", + unique: true, + filter: "[NormalizedUserName] IS NOT NULL"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AspNetRoleClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserLogins"); + + migrationBuilder.DropTable( + name: "AspNetUserRoles"); + + migrationBuilder.DropTable( + name: "AspNetUserTokens"); + + migrationBuilder.DropTable( + name: "AspNetRoles"); + + migrationBuilder.DropTable( + name: "AspNetUsers"); + } +} diff --git a/EssentialCSharp.Web/Migrations/20231023153538_AddUserFirstAndLastName.Designer.cs b/EssentialCSharp.Web/Migrations/20231023153538_AddUserFirstAndLastName.Designer.cs new file mode 100644 index 00000000..d41215ca --- /dev/null +++ b/EssentialCSharp.Web/Migrations/20231023153538_AddUserFirstAndLastName.Designer.cs @@ -0,0 +1,288 @@ +ο»Ώ// +using System; +using EssentialCSharp.Web.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace EssentialCSharp.Web.Migrations; + +[DbContext(typeof(EssentialCSharpWebContext))] +[Migration("20231023153538_AddUserFirstAndLastName")] +partial class AddUserFirstAndLastName +{ + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } +} diff --git a/EssentialCSharp.Web/Migrations/20231023153538_AddUserFirstAndLastName.cs b/EssentialCSharp.Web/Migrations/20231023153538_AddUserFirstAndLastName.cs new file mode 100644 index 00000000..6f2c9901 --- /dev/null +++ b/EssentialCSharp.Web/Migrations/20231023153538_AddUserFirstAndLastName.cs @@ -0,0 +1,37 @@ +ο»Ώusing Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace EssentialCSharp.Web.Migrations; + +/// +public partial class AddUserFirstAndLastName : Migration +{ + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "FirstName", + table: "AspNetUsers", + type: "nvarchar(max)", + nullable: true); + + migrationBuilder.AddColumn( + name: "LastName", + table: "AspNetUsers", + type: "nvarchar(max)", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "FirstName", + table: "AspNetUsers"); + + migrationBuilder.DropColumn( + name: "LastName", + table: "AspNetUsers"); + } +} diff --git a/EssentialCSharp.Web/Migrations/20250217215739_ReferralCount.Designer.cs b/EssentialCSharp.Web/Migrations/20250217215739_ReferralCount.Designer.cs new file mode 100644 index 00000000..828dc5a8 --- /dev/null +++ b/EssentialCSharp.Web/Migrations/20250217215739_ReferralCount.Designer.cs @@ -0,0 +1,292 @@ +ο»Ώ// +using System; +using EssentialCSharp.Web.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace EssentialCSharp.Web.Migrations +{ + [DbContext(typeof(EssentialCSharpWebContext))] + [Migration("20250217215739_ReferralCount")] + partial class ReferralCount + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("ReferralCount") + .HasColumnType("int"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/EssentialCSharp.Web/Migrations/20250217215739_ReferralCount.cs b/EssentialCSharp.Web/Migrations/20250217215739_ReferralCount.cs new file mode 100644 index 00000000..4b69bc67 --- /dev/null +++ b/EssentialCSharp.Web/Migrations/20250217215739_ReferralCount.cs @@ -0,0 +1,29 @@ +ο»Ώusing Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace EssentialCSharp.Web.Migrations +{ + /// + public partial class ReferralCount : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ReferralCount", + table: "AspNetUsers", + type: "int", + nullable: false, + defaultValue: 0); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ReferralCount", + table: "AspNetUsers"); + } + } +} diff --git a/EssentialCSharp.Web/Migrations/20260417060024_AddDataProtectionKeys.Designer.cs b/EssentialCSharp.Web/Migrations/20260417060024_AddDataProtectionKeys.Designer.cs new file mode 100644 index 00000000..a3234d8d --- /dev/null +++ b/EssentialCSharp.Web/Migrations/20260417060024_AddDataProtectionKeys.Designer.cs @@ -0,0 +1,311 @@ +ο»Ώ// +using System; +using EssentialCSharp.Web.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace EssentialCSharp.Web.Migrations +{ + [DbContext(typeof(EssentialCSharpWebContext))] + [Migration("20260417060024_AddDataProtectionKeys")] + partial class AddDataProtectionKeys + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("ReferralCount") + .HasColumnType("int"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("nvarchar(max)"); + + b.Property("Xml") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/EssentialCSharp.Web/Migrations/20260417060024_AddDataProtectionKeys.cs b/EssentialCSharp.Web/Migrations/20260417060024_AddDataProtectionKeys.cs new file mode 100644 index 00000000..15d8958e --- /dev/null +++ b/EssentialCSharp.Web/Migrations/20260417060024_AddDataProtectionKeys.cs @@ -0,0 +1,35 @@ +ο»Ώusing Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace EssentialCSharp.Web.Migrations +{ + /// + public partial class AddDataProtectionKeys : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "DataProtectionKeys", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + FriendlyName = table.Column(type: "nvarchar(max)", nullable: true), + Xml = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_DataProtectionKeys", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "DataProtectionKeys"); + } + } +} diff --git a/EssentialCSharp.Web/Migrations/EssentialCSharpWebContextModelSnapshot.cs b/EssentialCSharp.Web/Migrations/EssentialCSharpWebContextModelSnapshot.cs new file mode 100644 index 00000000..7d1e4270 --- /dev/null +++ b/EssentialCSharp.Web/Migrations/EssentialCSharpWebContextModelSnapshot.cs @@ -0,0 +1,308 @@ +ο»Ώ// +using System; +using EssentialCSharp.Web.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace EssentialCSharp.Web.Migrations +{ + [DbContext(typeof(EssentialCSharpWebContext))] + partial class EssentialCSharpWebContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("ReferralCount") + .HasColumnType("int"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("nvarchar(max)"); + + b.Property("Xml") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("EssentialCSharp.Web.Areas.Identity.Data.EssentialCSharpWebUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/EssentialCSharp.Web/Models/HCaptchaErrorDetails.cs b/EssentialCSharp.Web/Models/HCaptchaErrorDetails.cs new file mode 100644 index 00000000..5c9f8012 --- /dev/null +++ b/EssentialCSharp.Web/Models/HCaptchaErrorDetails.cs @@ -0,0 +1,59 @@ +ο»Ώusing System.Diagnostics.CodeAnalysis; + +namespace EssentialCSharp.Web.Models; + +public record class HCaptchaErrorDetails +{ + public const string MissingInputSecret = "missing-input-secret"; + public const string InvalidInputSecret = "invalid-input-secret"; + public const string MissingInputResponse = "missing-input-response"; + public const string InvalidInputResponse = "invalid-input-response"; + public const string BadRequest = "bad-request"; + public const string InvalidOrAlreadySeenResponse = "invalid-or-already-seen-response"; + public const string NotUsingDummyPasscode = "not-using-dummy-passcode"; + public const string SitekeySecretMismatch = "sitekey-secret-mismatch"; + +#pragma warning disable CA1859 // Use concrete types when possible for improved performance + private static readonly IReadOnlyDictionary _ErrorCodeDescriptionDictionary = new Dictionary() + { +#pragma warning restore CA1859 // Use concrete types when possible for improved performance + { MissingInputSecret, new(MissingInputSecret, "Your secret key is missing.", null) }, + { InvalidInputSecret, new(InvalidInputSecret, "Your secret key is invalid or malformed.", null) }, + { MissingInputResponse, new(MissingInputResponse, "The response parameter (verification token) is missing.", "Please complete the captcha and try again.") }, + { InvalidInputResponse, new(InvalidInputResponse, "The response parameter (verification token) is invalid or malformed.", null) }, + { BadRequest, new(BadRequest, "The request is invalid or malformed.", null) }, + { InvalidOrAlreadySeenResponse, new(InvalidOrAlreadySeenResponse, "The response parameter has already been checked, or has another issue.", null) }, + { NotUsingDummyPasscode, new(NotUsingDummyPasscode, "You have used a testing sitekey but have not used its matching secret.", null) }, + { SitekeySecretMismatch, new(SitekeySecretMismatch, "The sitekey is not registered with the provided secret.", null) }, + }; + + private readonly string? _FriendlyDescription; + + public HCaptchaErrorDetails(string errorCode, string description, string? friendlyDescription) + { + ErrorCode = errorCode; + Description = description; + _FriendlyDescription = friendlyDescription; + } + + public string ErrorCode { get; } + public string Description { get; } + public string FriendlyDescription => _FriendlyDescription ?? Description; + + public static HCaptchaErrorDetails GetValue(string key) + { + if (_ErrorCodeDescriptionDictionary.TryGetValue(key, out HCaptchaErrorDetails? errorDetails)) + { + return errorDetails; + } + else + { + throw new KeyNotFoundException("Error not found for details lookup"); + } + } + + public static bool TryGetValue(string key, [MaybeNullWhen(false)] out HCaptchaErrorDetails value) + { + return _ErrorCodeDescriptionDictionary.TryGetValue(key, out value); + } +} diff --git a/EssentialCSharp.Web/Models/HCaptchaResult.cs b/EssentialCSharp.Web/Models/HCaptchaResult.cs new file mode 100644 index 00000000..e1d883f6 --- /dev/null +++ b/EssentialCSharp.Web/Models/HCaptchaResult.cs @@ -0,0 +1,32 @@ +ο»Ώusing System.Text.Json.Serialization; + +namespace EssentialCSharp.Web.Models; + +// https://docs.hcaptcha.com/#verify-the-user-response-server-side +//{ +// "success": true|false, // is the passcode valid, and does it meet security criteria you specified, e.g. sitekey? +// "challenge_ts": timestamp, // timestamp of the challenge (ISO format yyyy-MM-dd'T'HH:mm:ssZZ) +// "hostname": string, // the hostname of the site where the challenge was solved +// "credit": true|false, // optional: deprecated field +// "error-codes": [...] // optional: any error codes +// "score": float, // ENTERPRISE feature: a score denoting malicious activity. +// "score_reason": [...] // ENTERPRISE feature: reason(s) for score. +//} +public class HCaptchaResult +{ + + [JsonPropertyName("success")] + public bool Success { get; set; } + + [JsonPropertyName("challenge_ts")] + public DateTimeOffset ChallengeTimeStamp { get; set; } + + [JsonPropertyName("hostname")] + public string Hostname { get; set; } = string.Empty; + + [JsonPropertyName("credit")] + public bool Credit { get; set; } + + [JsonPropertyName("error-codes")] + public string[]? ErrorCodes { get; set; } +} diff --git a/EssentialCSharp.Web/Models/ListingSourceCodeResponse.cs b/EssentialCSharp.Web/Models/ListingSourceCodeResponse.cs new file mode 100644 index 00000000..ac4c3a7e --- /dev/null +++ b/EssentialCSharp.Web/Models/ListingSourceCodeResponse.cs @@ -0,0 +1,7 @@ +namespace EssentialCSharp.Web.Models; + +public record class ListingSourceCodeResponse( + int ChapterNumber, + int ListingNumber, + string FileExtension = "", + string Content = ""); \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/01.html b/EssentialCSharp.Web/Placeholders/01.html deleted file mode 100644 index d3d9b091..00000000 --- a/EssentialCSharp.Web/Placeholders/01.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - -

Local Development Placeholder

-

This is a placeholder for where the essentialcsharp.com would normally lie in a production environment. Don't worry, the site is not broken 😃

- - \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/01.html b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/01.html new file mode 100644 index 00000000..626d6a3b --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/01.html @@ -0,0 +1,1822 @@ + + + + + + + + + +
+ + + +
+ +
+ +
1
+
+ +
+

Introducing C#

+
+
+ + +

+The C# programming language can be used to build software components and applications that run on a wide variety of operating systems (platforms)—including mobile devices, game consoles, web applications, Internet of Things (IoT), microservices, and desktop applications. Furthermore, C# is free; in fact, it is entirely open source, so you can view, modify, redistribute, and contribute back any improvements you make. As a language, C# is built on features found in its predecessor C-style languages (C, C++, and Java), making it immediately familiar to many experienced programmers.1

+ + +
+ + +
+
+
+ + +

+

+ + +

+This chapter introduces C# using the traditional HelloWorld program. It focuses on C# syntax fundamentals, including defining an entry point into the C# program, which will familiarize you with the C# syntax style and structure and enable you to produce the simplest of C# programs. Prior to the discussion of C# syntax fundamentals is a summary of managed execution context, which explains how a C# program executes at runtime. This chapter ends with a discussion of variable declaration, writing and retrieving data from the console, and the basics of commenting code in C#.

+ +
+ +Hello, World + +
+ + +

+The best way to learn a new programming language is to write code. The first example is the classic HelloWorld program. In this program, you will display some text to the screen.

+ + +

+Listing 1.1 shows the complete HelloWorld program; in the following sections, you will compile and run the code.

+ + +
+ +
+Listing 1.1: HelloWorld in C#2
+ +
+
+ 1. +Console.WriteLine("Hello. My name is Inigo Montoya.");
+
+
+ + + +

+(A listing this simple requires a feature—top-level statements—enabled in C# 9.0 to help with learning C#. An alternative listing—arguably a more typical listing—is shown later in Listing 1.6. See Chapter 4 for more information about top-level statements.)

+ + + +
+ +
Beginner Topic
+
Basic Compilation Terms
+ + + + +

+A compiler acts like a translator, changing code from one language to another. Generally, the compiler is responsible for converting from a higher level language, like C#, to a lower level language that a computer understands directly. In the case of C#, the compiler output is an intermediate language that a second compiler translates to machine language. This is discussed further in the “Managed Execution and the Common Language Infrastructure” section later in this chapter. Source code is simply the text that makes up a program, so Listing 1.1 is considered source code to our HelloWorld Program. The word code is often used interchangeably with source code.

+ +
+ +Creating, Editing, Compiling, and Running C# Source Code + +
+ + +

+Once you have written your C# code, it is time to compile and run it. Based on your operating system, you have a choice of which compiler to download. Generally, the implementation is packaged into a software development kit (SDK). The SDK includes the compiler, the runtime execution engine, the framework of pragmatically accessible functionality that the runtime can access (see “Application Programming Interface” later in the chapter), and any added tooling (such as a build engine for automating build steps) that might be bundled with the SDK. Given that there are compilers available for multiple platforms and that C# has been publicly available since 2000 (see “Multiple .NET Frameworks” later in the chapter), there are several options to choose from.

+ + +

+For each operating system the installation instructions vary. For this reason, we recommend you visit https://dotnet.microsoft.com/download for download and installation instructions, selecting the package to download based on which operating system you will be developing on. Furthermore, you have a choice of which .NET implementation(s) to use—sometimes referred to as the .NET framework(s). While we could provide further details here, the .NET download site has the most updated instructions for each combination supported. While there are multiple framework versions available, the easiest is to download the default one, which corresponds to the latest fully released version.

+ + +

+There are also numerous ways to edit your source code, including the most rudimentary of tools, such as Notepad on Windows, TextEdit on Mac/macOS, or vi on Linux. However, you’re likely to want something more advanced so that at least your code is colorized. Any programming editor that supports C# will suffice. If developing on Linux, we recommend you consider the open source editor Visual Studio Code (https://code.visualstudio.com). To optimize working with C# in Visual Studio Code, you will want to install the C# extension, as shown in Figure 1.1. However, if you are working on Windows or Mac, consider the corresponding version of Microsoft Visual Studio 2022 (or later)—see https://visualstudio.microsoft.com/. All are available free of charge.

+ + +

+

+ + + +

+

+ + +
+ + +
+Figure 1.1: Installing the C# extension for Visual Studio Code
+
+ + +

+

+ + +

+In the remainder of this section, we provide instructions for these editors. For Visual Studio Code, we rely on the command-line interface (CLI) tool dotnet CLI for creating the initial C# program in addition to compiling and running the program. For Windows and Mac, we focus on using the platform-specific version of Visual Studio 2022.

+ + + +
+ +With Dotnet CLI + +
+ + +

+The dotnet command, dotnet, is the dotnet command-line interface, or dotnet CLI, and it may be used to generate the initial code base for a C# program in addition to compiling and running the program.3 (To avoid ambiguity between CLI referring to the Common Language Infrastructure or the command-line interface, throughout the book we will prefix CLI with dotnet when referring to the dotnet CLI. CLI without the dotnet prefix refers to Common Language Infrastructure.) Once you have completed the installation, verify that dotnet is an available command from the terminal—thus verifying your installation.

+ + +

+Following are the instructions for creating, compiling, and executing the HelloWorld program from a terminal on Windows, macOS, or Linux:

+ +
+
+ 1. +
+
+
+Open the terminal. (Optionally, consider using the cross-platform command-line interface PowerShell by running the command pwsh.4) +
+
+
+ + +
+
+ 2. +
+
+
+Create a new directory where you want to place the code. Consider a name such as HelloWorld or EssentialCSharp/HelloWorld. From the command line, use +
+
+mkdir HelloWorld +
+
+
+ + +
+
+ 3. +
+
+
+Navigate into the new directory so that it is the terminal’s current location. +
+
+cd HelloWorld +
+
+
+ + +
+
+ 4. +
+
+
+Execute dotnet new console to generate the initial scaffolding (or project) for your program. While several files are generated, the two main files are Program.cs and the project file HelloWorld.csproj: +
+
+dotnet new console +
+
+
+ + +
+
+ 5. +
+
+
+Run the generated program. This compiles and runs the code created by the dotnet new console command. The content of Program.cs is similar to Listing 1.1 but it outputs “Hello World!” instead. +
+
+dotnet run +
+
+
+ + +
+
+ 6. +
+
+
+Even though we don’t explicitly request the project to compile (or build)—via the dotnet build command, that step still occurs implicitly. +
+
+
+ + +
+
+ 7. +
+
+
+Edit the Program.cs file and modify the code to match what is shown in Listing 1.1. If you use one of the editors mentioned to open and edit Program.cs, you will see the advantage of a C#-aware editor, as the code will be colorized to indicate the different types of constructs in your program. To open and edit using Visual Studio Code, use the following command or start Visual Studio Code and open the Program.cs file. +
+
+code . +
+
+
+ + +
+
+ 8. +
+
+
+(Alternatively, Output 1.1 shows an approach using only the command line that works for Bash and PowerShell.) +
+
+
+ + +
+
+ 9. +
+
+
+  Rerun the program: +
+
+dotnet run +
+
+
+ + + +

+Output 1.1 shows the output following the preceding steps.5

+ +
+ +
+Output 1.1
+ +
+
+1>
+
+2> mkdir ./HelloWorld
+
+3> cd ./HelloWorld/
+
+4> dotnet new console
+
+The template "Console Application" was created successfully.
+
+
+
+Processing post-creation actions...
+
+Running 'dotnet restore' on C: \EssentialCSharp\HelloWorld\HelloWorld.csproj...
+
+  Restore completed in 100.38 ms for C:\EssentialCSharp\HelloWorld\HelloWorld.csproj.
+
+Restore succeeded.
+
+5> dotnet run
+
+Hello World!
+
+6> echo '
+
+Console.WriteLine("Hello. My name is Inigo Montoya.");
+
+' > Program.cs
+
+7> dotnet run
+
+Hello. My name is Inigo Montoya.
+
+ +
+ + + +
+ +With Visual Studio 2022 (Windows or Mac) + +
+ + +

+With Visual Studio 2022, which runs only on Microsoft Windows or Mac, the procedure is similar, but instead of using the command line, you use an integrated development environment (IDE), which has menus you can choose from rather than executing everything from the command line:

+ +
+
+ 1. +
+
+
+Launch Visual Studio 2022. +
+
+
+ + +
+
+ 2. +
+
+
+Click the Create a new project button. (If the Start Window is not visible, you can open it from the File->Start Window menu or jump directly to create the project via the File->New Project (Ctrl+Shift+N) menu.) +
+
+
+ + +
+
+ 3. +
+
+
+From the Search box (Alt+S), type Console App and select the Console App item (see Figure 1.2). (You can optionally select C# to reduce the options count if other languages are installed.) +
+
+
+ + + + +
+ + +
+Figure 1.2: The Create a new project dialog
+
+ +
+
+ 4. +
+
+
+For the Project name text box, use HelloWorld, and for Location, select a working directory of your choosing (see Figure 1.3). +
+
+
+ + + + +
+ + +
+Figure 1.3: The Configure your new project dialog
+
+ +
+
+ 5. +
+
+
+At the Additional information dialog, choose .NET 7.0 in the Framework dropdown. (Leave the Do not use top-level statements checkbox unchecked.) +
+
+
+ + +
+
+ 6. +
+
+
+Once the project is created, you should see a Program.cs file, as shown in Figure 1.4. +
+
+
+ + + + +

+

+ + +
+ + +
+Figure 1.4: Dialog that shows the Program.cs file
+
+ +
+
+ 7. +
+
+
+Run the generated program using the Debug->Start Without Debugging (Ctrl+F5) menu. This displays the terminal with the text shown in Output 1.2 except the first line displays “Hello World!” only. +
+
+
+ + +
+ +
+Output 1.2
+ +
+
+Hello. My name is Inigo Montoya.
+
+
+
+...\HelloWorld.exe (process 11856) exited with code 0.
+
+Press any key to close this window . . .
+
+ +
+ + +
+
+ 8. +
+
+
+Modify Program.cs to match Listing 1.1. Rerun the program to see the output shown in Output 1.2. +
+
+
+ + + + + +
+ +Understanding a Project + +
+ + +

+Whether using dotnet CLI or Visual Studio, there are several files created. The first file is a C# file with the name Program.cs by convention. The name Program is commonly used as the starting point for a console program, even though any name could be used. The .cs extension is the standard convention for all C# files and what the compiler expects to compile into the final program by default. To use the code shown in Listing 1.1, open the Program.cs file and replace its content with Listing 1.1. Before saving the updated file, observe that the only functional difference between Listing 1.1 and what was generated by default is the text between the double quotes.

+ + +

+A configuration file called a project file is included as part of the generated source code of your C# project. The project file content varies from one application type and .NET framework to the next. However, at a minimum, it generally identifies what application type to build (console, web, library, etc.), which .NET framework(s) to support, compiler settings, and which potential settings are needed to launch the application, along with other dependencies the code may rely on (called libraries). For example, the simple .NET console application project file created in the previous section appears in Listing 1.2.

+ +
+ +
+Listing 1.2: Sample .NET Console Project File
+ +
+
+ 1. +<Project Sdk="Microsoft.NET.Sdk">
+
+ 2. +  <PropertyGroup>
+
+ 3. +    <OutputType>Exe</OutputType>
+
+ 4. +    <TargetFramework>net7.0</TargetFramework>
+
+ 5. +    <ImplicitUsings>enable</ImplicitUsings>
+
+ 6. +    <Nullable>enable</Nullable>
+
+ 7. +  </PropertyGroup>
+
+ 8. +</Project>
+
+
+ + + +

+In Listing 1.2, the application type is identified as a .NET 8.0 (net8.0) console application (Exe). The two other elements, Nullable (C# 8.0) and ImplicitUsings (C# 10.0) , will be discussed in β€œDeclaring Types That Allow Null” in Chapter 3 and “Using Directives” in Chapter 5, respectively. All other settings (such as which C# files to compile) are identified by convention. For example, by default, all *.cs6 files in the same directory (or subdirectory) as the project file are included in the compile.

+ + + + +
+ +Compilation and Execution + +
+ + +

+When you execute dotnet run, it first implicitly runs dotnet build to compile the code. The compiled output created by the dotnet build command is an assembly called HelloWorld.dll.7 Assemblies contain a set of instructions specifying how a program will behave. The extension stands for dynamic link library (DLL), and with .NET, assemblies have a .dll extension even if they are console programs, as this one is. (On Windows, an .exe file is also created.) By default, the compiled output for a .NET application is placed into a subdirectory according to the TargetFramework identified in the project file, as shown in Listing 1.2 (./bin/Debug/net7.0/). The Debug directory is used because the default configuration is debug. This configuration causes the output to be optimized for debugging rather than for performance. The compiled output does not execute on its own. Rather, it needs the CLI to host the code. For .NET applications, this requires using the dotnet.exe (dotnet on Linux and Mac) process as a host process for the application. Hence why the program is executed with the dotnet run command. That said, there is a way to generate a stand-alone executable that includes the necessary runtime files so that installing the dotnet runtime is not required—see the “Advanced Topic: Publishing a Stand-Alone Executable” (On Windows, the .exe file can be used directly, if the dotnet runtime is installed, rather than using dotnet run.)

+ + +
+ +Essential C# Source Code + +
+ + +

+Both the source code and the manuscript text are available at https://essentialcsharp.com. Alternatively, the source code for this book is available for download on GitHub directly at https://github.com/IntelliTect/EssentialCSharp. Instructions for compiling and running the code are available in the README.md file at the same location.

+ + +

+An alternative approach is to paste the source code into the HelloWorld program created earlier in the chapter and then execute the source code.

+ + +

+________________________________________

+ +
+ 1. + The first C# design meeting took place in 1998.
+ +
+ 2. + Refer to the movie The Princess Bride if you’re confused about the Inigo Montoya references.
+ +
+ 3. + This tool was released around the same time as C# 7.0, and it eclipsed compiling directly with the C# compiler, csc.exe.
+ + + +
+ 5. + The bold formatting in an Output indicates the user-entered content.
+ +
+ 6. + The “*” in *.cs is called a wildcard character, and matches any number of characters including none. In this instance, this identifies that any file ending in .cs will be included. If it was i*.cs it would include any files starting with an i and ending in .cs.
+ +
+ 7. + Note that if you use the Microsoft .NET Framework to create a console program, the compiled code is placed into a HelloWorld.exe file that you can execute directly assuming the Microsoft .NET Framework is installed on the computer.
+ + \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/02.html b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/02.html new file mode 100644 index 00000000..68fe1dd7 --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/02.html @@ -0,0 +1,3142 @@ + + + + + + + + + +
+ + + +
+ +C# Syntax Fundamentals + +
+ + +

+Once you successfully compile and run the HelloWorld program, you are ready to start dissecting the code to learn its individual parts. Of course, Listing 1.1 is the simplest of C# programs with only a single statement.

+ +
+ +Statements and Statement Delimiters + +
+ + +

+The single statement is Console.WriteLine(), which is used to write a line of text to the console. C# generally uses a semicolon to indicate the end of a statement, where a statement comprises one or more actions that the code will perform. Declaring a variable, controlling the program flow, and calling a method are typical uses of statements.

+ + +
+ +
AdVanced Topic
+
Statements without Semicolons
+ + + + +

+Many programming elements in C# end with a semicolon. One example that does not include the semicolon is a switch statement. Because curly braces are always included in a switch statement, C# does not require a semicolon following the statement. In fact, code blocks themselves are considered statements (they are also composed of statements), and they don’t require ending with a semicolon. Similarly, there are cases, such as the using declaration, in which a semicolon appears as a postfix, but it is not a statement.

+ + +

+Since creation of a newline does not separate statements, you can place multiple statements on the same line, and the C# compiler will interpret the line as having multiple instructions. For example, Listing 1.3 contains two statements on a single line that, in combination, display Up and Down on two separate lines.

+ +
+ +
+Listing 1.3: Multiple Statements on One Line
+ +
+
+ 1. +Console.WriteLine("Up"); Console.WriteLine("Down");
+
+
+ + + +

+Similarly, each statement can be placed on its own line, as shown in Listing 1.4.

+ +
+ +
+Listing 1.4: Multiple Statements Each on Separate Lines
+ +
+
+ 1. +Console.WriteLine("Down");
+
+ 2. +Console.WriteLine("Side");
+
+ 3. +Console.WriteLine("Up");
+
+
+ + + +

+C# also allows the splitting of a statement across multiple lines. Again, the C# compiler looks for a semicolon to indicate the end of a statement. In Listing 1.5, for example, the original WriteLine() statement from the HelloWorld program is split across multiple lines.

+ +
+ +
+Listing 1.5: Splitting a Single Statement across Multiple Lines
+ +
+
+ 1. +Console.WriteLine(
+
+ 2. +    "Hello. My name is Inigo Montoya.");
+
+
+ + +
+ +Introducing a Class and a Method + +
+ + +

+In the listings shown so far, the statements are independent of any other C# constructs and appear this way in only a single file. The previous listings are the simplest of C# programs, a HelloWorld program, after all. Programs can, however, get vastly more complicated, and structure can be added to organize the code. The simplest structure is to add methods and to place those methods within classes. Listing 1.6 provides an example.

+ +
+ +
+Listing 1.6: HelloWorld with Class and Method
+ +
+
+ 1. +public class Program
+
+ 2. +{
+
+ 3. +    public static void Main()
+
+ 4. +    {
+
+ 5. +        System.Console.WriteLine("Hello. My name is Inigo Montoya.");
+
+ 6. +    }
+
+ 7. +}
+
+
+ + + +

+In this listing, the HelloWorld statement is placed into a method called Main, which is placed into a class called Program.

+ + +

+Those experienced in programming with Java, C, or C++ will immediately see similarities. Like Java, C# inherits its basic syntax from C and C++.8 Syntactic punctuation (such as semicolons and curly braces), features (such as case sensitivity), and keywords (such as class, public, and void) are familiar to programmers experienced in these languages.

+ + +

+

+ +
+ +
+ +
+ note
+ +
+ +
+C# is a case-sensitive language: Incorrect case prevents the code from compiling successfully.
+
+
+
+ + + +

+

+ + + +

+

+ +
+ +
+ +
+
+Language Contrast: Java—Filename Must Match Class Name
+ +
+ + + + +

+In Java, the filename must follow the name of the class. In C#, this convention is frequently followed but is not required. In C#, it is possible to have two classes in one file, and even to have a single class span multiple files, with a feature called a partial class.

+
+
+ + + +

+

+ + + +
+ +
Beginner Topic
+
Keywords
+ + + + +

+To enable the compiler to interpret the code, certain words within C# have special status and meaning. Known as keywords, they provide the concrete syntax that the compiler uses to interpret the expressions the programmer writes. In the HelloWorld program, class, static, and void are examples of keywords.

+ + +

+The compiler uses the keywords to identify the structure and organization of the code. Because the compiler interprets these words with elevated significance, C# requires that developers place keywords only in certain locations. When programmers violate these rules, the compiler issues errors.

+ + + + + + + + + + + +
+ +C# Keywords + +
+ + +

+Keywords are another construct common to other programming languages. Table 1.1 shows the C# keywords.

+ + +
+
Table 1.1: C# Keywords
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+abstract

+ + + + +

+add*(1)

+ + + + +

+alias*(2)

+ + + + +

+and*

+ + + + +

+args*

+ + + + +

+as

+ + + + +

+ascending*(3)

+ + + + +

+async*(5)

+ + + + +

+await*(5)

+ + + + +

+base

+ + + + +

+bool

+ + + + +

+break

+ + + + +

+by*(3)

+ + + + +

+byte

+ + + + +

+case

+ + + + +

+catch

+ + + + +

+char

+ + + + +

+checked

+ + + + +

+class

+ + + + +

+const

+ + + + +

+continue

+ + + + +

+decimal

+ + + + +

+default

+ + + + +

+delegate

+ + + + +

+descending*(3)

+ + + + +

+do

+ + + + +

+double

+ + + + +

+dynamic*(4)

+ + + + +

+else

+ + + + +

+enum

+ + + + +

+equals*(3)

+ + + + +

+event

+ + + + +

+explicit

+ + + + +

+extern

+ + + + +

+false

+ + + + +

+file*

+ + + + +

+finally

+ + + + +

+fixed

+ + + + +

+float

+ + + + +

+for

+ + + + +

+foreach

+ + + + +

+from*(3)

+ + + + +

+get*(1)

+ + + + +

+global*(2)

+ + + + +

+goto

+ + + + +

+group*(3)

+ + + + +

+if

+ + + + +

+implicit

+ + + + +

+in

+ + + + +

+init*(9)

+ + + + +

+int

+ + + + +

+interface

+ + + + +

+internal

+ + + + +

+into*(3)

+ + + + +

+is

+ + + + +

+join*(3)

+ + + + +

+let*(3)

+ + + + +

+lock

+ + + + +

+long

+ + + + +

+nameof*(6)

+ + + + +

+namespace

+ + + + +

+new

+ + + + +

+nint*(9)

+ + + + +

+not*

+ + + + +

+notnull*(8)

+ + + + +

+null

+ + + + +

+nunit*(9)

+ + + + +

+object

+ + + + +

+on*(3)

+ + + + +

+operator

+ + + + +

+or*

+ + + + +

+orderby*(3)

+ + + + +

+out

+ + + + +

+override

+ + + + +

+params

+ + + + +

+partial*(2)

+ + + + +

+private

+ + + + +

+protected

+ + + + +

+public

+ + + + +

+readonly

+ + + + +

+record*

+ + + + +

+ref

+ + + + +

+remove*(1)

+ + + + +

+required*(11)

+ + + + +

+return

+ + + + +

+sbyte

+ + + + +

+scoped*

+ + + + +

+sealed

+ + + + +

+select*(3)

+ + + + +

+set*(1)

+ + + + +

+short

+ + + + +

+sizeof

+ + + + +

+stackalloc

+ + + + +

+static

+ + + + +

+string

+ + + + +

+struct

+ + + + +

+switch

+ + + + +

+this

+ + + + +

+throw

+ + + + +

+TRUE

+ + + + +

+try

+ + + + +

+typeof

+ + + + +

+uint

+ + + + +

+ulong

+ + + + +

+unchecked

+ + + + +

+unmanaged*(7.3)

+ + + + +

+unsafe

+ + + + +

+ushort

+
+ + +

+* Contextual keyword. Numbers in parentheses (n) identify in which version the contextual keyword was added.

+ + + + + + + + + + + + + +

+After C# 1.0, no new reserved keywords were introduced to C#. However, some constructs in later versions use contextual keywords, which are significant only in specific locations. Outside these designated locations, contextual keywords have no special significance.9 By this method, even C# 1.0 code is compatible with the later standards.10

+ + +
+ +Identifiers + +
+ + +

+Like other languages, C# includes identifiers to identify constructs that the programmer codes. In Listing 1.6, HelloWorld and Main are examples of identifiers. The identifiers assigned to a construct are used to refer to the construct later, so it is important that the names the developer assigns are meaningful rather than arbitrary.

+ + +

+

+ +
+ +
+ +
+ note
+ +
+ +
+A keen ability to select succinct and indicative names is an important characteristic of a strong programmer because it means the resultant code will be easier to understand and reuse.
+
+
+
+ + + +

+

+ + +

+Clarity coupled with consistency is important enough that the Framework Design Guidelines (http://bit.ly/dotnetguidelines) advise against the use of abbreviations or contractions in identifier names and even recommend avoiding acronyms that are not widely accepted. If an acronym is sufficiently well established (e.g., HTML), you should use it consistently. Avoid spelling out the accepted acronym in some cases but not in others. Generally, adding the constraint that all acronyms be included in a glossary of terms places enough overhead on the use of acronyms that they are not used flippantly. Ultimately, select clear, possibly even verbose names—especially when working on a team or when developing a library that other developers will use.

+ + +

+There are two basic casing formats for an identifier. Pascal case (henceforth PascalCase), as the .NET framework creators refer to it because of its popularity in the Pascal programming language, capitalizes the first letter of each word in an identifier name; examples include ComponentModel, Configuration, and HttpFileCollection. As HttpFileCollection demonstrates with HTTP, when using acronyms that are more than two letters long, only the first letter is capitalized. The second format, camel case (henceforth camelCase), follows the same convention except that the first letter is lowercase; examples include quotient, firstName, httpFileCollection, ioStream, and theDreadPirateRoberts.

+ + +

+

+ +
+ +
+ +
+
+Guidelines
+ +
+DO favor clarity over brevity when naming identifiers.
+
+DO NOT use abbreviations or contractions within identifier names.
+
+DO NOT use any acronyms unless they are widely accepted, in which case use them consistently.
+
+
+ + + +

+

+ + +

+Notice that although underscores are legal, generally there are no underscores, hyphens, or other nonalphanumeric characters in identifier names. Furthermore, C# doesn’t follow its predecessors in that Hungarian notation (prefixing a name with a data type abbreviation) is not used. This convention avoids the variable rename that is necessary when data types change, or the inconsistency introduced due to failure to adjust the data type prefix when using Hungarian notation.

+ + +

+In rare cases, some identifiers, such as Main, can have a special meaning in the C# language.

+ + +

+While naming guidelines may seem relatively trivial, especially when coming from other languages where such guidelines are ambiguous or missing entirely, violations of these guidelines will be glaring to an experienced C#/.NET programmer and indicate poor quality or inexperience. To avoid this, learn the guidelines, and follow them religiously.

+ + +

+

+ +
+ +
+ +
+
+Guidelines
+ +
+DO capitalize both characters in two-character acronyms, except for the first word of a camelCased identifier.
+
+DO capitalize only the first character in acronyms with three or more characters, except for the first word of a camelCased identifier.
+
+DO NOT capitalize any of the characters in acronyms at the beginning of a camelCased identifier.
+
+DO NOT use Hungarian notation (that is, do not encode the type of a variable in its name).
+
+
+ + + +

+

+ + +

+

+ + +
+ +
AdVanced Topic
+
Keywords
+ + + + +

+Although it is rare, keywords may be used as identifiers if they include @ as a prefix. For example, you could name a local variable @return. Similarly (although it doesn’t conform to the casing standards of C# coding standards), it is possible to name a method @throw, with parentheses following: @throw().

+ + +

+‎There are also four undocumented reserved keywords in the Microsoft implementation: __arglist, __makeref, __reftype, and __refvalue. These are required only in rare interop scenarios, and you can ignore them for all practical purposes. Note that these four special keywords begin with two underscores. The designers of C# reserve the right to make any identifier that begins with two underscores into a keyword in a future version; for safety, avoid ever creating such an identifier yourself.

+ +
+ +Type Definition + +
+ + +

+A class definition is the section of code that generally begins with class <identifier> { ... }, as shown in Listing 1.7, where HelloWorld is the identifier.

+ +
+ +
+Listing 1.7: Basic Class Declaration
+ +
+
+ 1. +public class HelloWorld
+
+ 2. +{
+
+ 3. +    // ...
+
+ 4. +}
+
+
+ + + +

+The name used for the type (in this case, HelloWorld) can vary, but by convention, it must be PascalCased. For this example, therefore, other possible names are Greetings, HelloInigoMontoya, Hello, or simply Program. (Program is a good convention to follow when the class contains the Main() method, described next.)

+ + +

+

+ +
+ +
+ +
+
+Guidelines
+ +
+DO name classes with nouns or noun phrases.
+
+DO use PascalCasing for all class names.
+
+
+ + + +

+

+ + +

+Generally, programs contain multiple types, each containing multiple methods.

+ + +

+

+ + +
+ +
Beginner Topic
+
What Is a Method?
+ + + + +

+Syntactically, a method in C# is a named block of code introduced by a method declaration (e.g., static void Main()) and (usually) followed by zero or more statements within curly braces. Methods perform computations and/or actions. Like paragraphs in written languages, methods provide a means of structuring and organizing code so that it is more readable. More important, methods can be reused and called from multiple places and so avoid the need to duplicate code. The method declaration introduces the method and defines the method name along with the data passed to and from the method. In Listing 1.8, Main() followed by { ... } is an example of a C# method.

+ +
+ +Main Method + +
+ + +

+The location where C# programs begin execution is the Main method, which begins with static void Main(). When you execute the program by typing dotnet run on the terminal, the program starts with the Main method and begins executing the first statement, as identified in Listing 1.8.

+ + + +
+ +
+Listing 1.8: Breaking Apart HelloWorld
+ +
+
+ 1. +public class Program                // BEGIN Class definition
+
+ 2. +{
+
+ 3. +    public static void Main()       // Method declaration
+
+ 4. +    {                               // BEGIN method implementation
+
+ 5. +        Console.WriteLine(          // This statement spans 2 lines
+
+ 6. +            "Hello, My name is Inigo Montoya");
+
+ 7. +    }                               // END method implementation
+
+ 8. +}                                   // END class definition
+
+
+ + + +

+Although the Main method declaration can vary to some degree, static and the method name, Main, are always required for a program (see “Advanced Topic: Declaration of the Main Method”).

+ + +

+The comments, text that begins with // in Listing 1.8, are explained later in the chapter. They are included to identify the various constructs in the listing.

+ + +
+ +
AdVanced Topic
+
Declaration of the Main Method
+ + + + +

+C# requires that the Main method return either void or int and that it take either no parameters or a single array of strings. Listing 1.9 shows the full declaration of the Main method. The args parameter is an array of strings corresponding to the command-line arguments. The executable name is not included in the args array (unlike in C and C++). To retrieve the full command used to execute the program, including the program name, use Environment.CommandLine.

+ +
+ +
+Listing 1.9: The Main Method with Parameters and a Return
+ +
+
+ 1. +public static int Main(string[] args)
+
+ 2. +{
+
+ 3. +    // ...
+
+ 4. +}
+
+
+ + + +

+The int returned from Main() is the status code, and it indicates the success of the program’s execution. A return of a nonzero value generally indicates an error.

+ + +

+C# 7.1 also added support for async/await on the Main method, in which case you would use Task-based types in the return.

+ + +

+

+ +
+ +
+ +
+ note
+ +
+ +
+All Lowercase
+
+Unlike its C-style predecessors, C# uses an uppercase M for the Main method to be consistent with the PascalCased naming conventions of C#.
+
+
+
+ + + +

+

+ + +

+The designation of the Main method as static indicates that other methods may call it directly off the class definition. Without the static designation, the terminal that started the program would need to perform additional work (known as instantiation) before calling the method. (Chapter 6 contains an entire section devoted to the topic of static members.)

+ + +

+Placing void prior to Main() indicates that this method does not return any data. (This is explained further in Chapter 2.)

+ + +

+One distinctive C/C++-style characteristic followed by C# is the use of curly braces for the body of a construct, such as the class or the method. For example, the Main method contains curly braces that surround its implementation; in this case, only one statement appears in the method.

+ + +
+ +
Beginner Topic
+
What Is Whitespace?
+ + + + +

+Whitespace is the combination of one or more consecutive formatting characters such as tab, space, and newline characters. Eliminating all whitespace between words is obviously significant, as is including whitespace within a quoted string.

+ +
+ +Whitespace + +
+ + +

+The semicolon makes it possible for the C# compiler to ignore whitespace in code. Apart from a few exceptions, C# allows developers to insert whitespace throughout the code without altering its semantic meaning. In Listing 1.8 and Listing 1.9, it didn’t matter whether a newline was inserted within a statement, between statements, or eliminated entirely, and doing so had no effect on the resultant executable created by the compiler.

+ + +

+Frequently, programmers use whitespace to indent code for greater readability. Consider the two variations on HelloWorld shown in Listing 1.10 and Listing 1.11. Although these two examples look significantly different from the original program, the C# compiler sees them as semantically equivalent.

+ +
+ +
+Listing 1.10: No Indentation Formatting
+ +
+
+ 1. +public class HelloWorld
+
+ 2. +{
+
+ 3. +public static void Main()
+
+ 4. +{
+
+ 5. +Console.WriteLine("Hello Inigo Montoya");
+
+ 6. +}
+
+ 7. +}
+
+
+ + +
+ +
+Listing 1.11: Removing Whitespace
+ +
+
+ 1. +public class HelloWorld{public static void Main()
+
+ 2. +{Console.WriteLine("Hello Inigo Montoya");}}
+
+
+ + + +

+

+ + +
+ +
Beginner Topic
+
Formatting Code with Whitespace
+ + + + +

+Indenting the code using whitespace is important for greater readability. As you begin writing code, you need to follow established coding standards and conventions to enhance code readability.

+ + +

+The convention used in this book is to place curly braces on their own line and to indent the code contained between the curly brace pair. If another curly brace pair appears within the first pair, all the code within the second set of braces is also indented.

+ + +

+This is not a uniform C# standard but a stylistic preference.

+ + +

+________________________________________

+ +
+ 8. + When creating C#, the language creators reviewed the specifications for C/C++, literally crossing out the features they didn’t like and creating a list of the ones they did like. The group also included designers with strong backgrounds in other languages.
+ +
+ 9. + For example, early in the design of C# 2.0, the language designers designated yield as a keyword, and Microsoft released alpha versions of the C# 2.0 compiler, with yield as a designated keyword, to thousands of developers. However, the language designers eventually determined that by using yield return rather than yield, they could ultimately avoid adding yield as a keyword because it would have no special significance outside its proximity to return.
+ +
+ 10. + There are some rare and unfortunate incompatibilities, such as the following: C# 2.0 requires implementation of IDisposable with the using statement rather than simply using a Dispose() method.  Some rare generic expressions are different between versions. For example, F(G<A,B>(7)) means F((G<A), (B>7)) in C# 1.0, but in C# 2.0, it means to call generic method G<A,B> with argument 7 and pass the result to F.
+ + \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/03.html b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/03.html new file mode 100644 index 00000000..bec185ee --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/03.html @@ -0,0 +1,1593 @@ + + + + + + + + + +
+ + + +
+ +Working with Variables + +
+ + +

+Now that you’ve been introduced to the most basic C# program, it’s time to declare a local variable. Once a variable is declared, you can assign it a value, replace that value with a new value, and use it in calculations, output, and so on. However, you cannot change the data type of the variable. In Listing 1.12, string max is a variable declaration.

+ + + +
+ +
+Listing 1.12: Declaring and Assigning a Variable
+ +
+
+ 1. +public class MiracleMax
+
+ 2. +{
+
+ 3. +    public static void Main()
+
+ 4. +    {
+
+ 5. +        string max;     // "string" identifies the data type
+
+ 6. +                        // "max" is the variable
+
+ 7. +        max = "Have fun storming the castle!";
+
+ 8. +        Console.WriteLine(max);
+
+ 9. +    }
+
+ 10. +}
+
+
+ + + +
+ +
Beginner Topic
+
Local Variables
+ + + + +

+A variable is a name that refers to a value that can change over time. Local indicates that the programmer declared the variable within a method.

+ + +

+To declare a variable is to define it, which you do by

+ +
+ +
+
+ • +
+
+
+Specifying the type of data which the variable will contain
+
+
+ +
+
+ • +
+
+
+Assigning it an identifier (name)
+
+
+
+ +
+ +Introducing Data Types + +
+ + +

+Listing 1.12 declares a variable with the data type string. Other common data types used in this chapter are int and char.

+ +
+ +
+
+ • +
+
+
+int is the C# designation of an integer type that is 32 bits in size.
+
+
+ +
+
+ • +
+
+
+char is used for a character type. It is 16 bits, large enough for (nonsurrogate) Unicode characters.
+
+
+
+ + +

+The next chapter looks at these and other common data types in more detail.

+ + +
+ +
Beginner Topic
+
What Is a Data Type?
+ + + + +

+The type of data that a variable declaration specifies is called a data type (or object type). A data type, or simply type, is a classification of things that share similar characteristics and behavior. For example, animal is a type. It classifies all things (monkeys, warthogs, and platypuses) that have animal characteristics (multicellular, capacity for locomotion, and so on). Similarly, in programming languages, a type is a definition for several items endowed with similar qualities.

+ +
+ +Declaring a Variable + +
+ + +

+In Listing 1.12, string max is a variable declaration of a string type whose name is max. It is possible to declare multiple variables within the same statement by specifying the data type once and separating each identifier with a comma. Listing 1.13 demonstrates such a declaration.

+ +
+ +
+Listing 1.13: Declaring Two Variables within One Statement
+ +
+
+ 1. +string message1, message2;
+
+
+ + + +

+Because a multivariable declaration statement allows developers to provide the data type only once within a declaration, all variables will be of the same type.

+ + +

+In C#, the name of the variable may begin with any letter or an underscore (_), followed by any number of letters, numbers, and/or underscores. By convention, however, local variable names are camelCased (the first letter in each word is capitalized, except for the first word) and do not include underscores.

+ + +

+

+ +
+ +
+ +
+
+Guidelines
+ +
+DO use camelCasing for local variable names.
+
+
+ + +
+ +Assigning a Variable + +
+ + +

+After declaring a local variable, you must assign it a value before reading from it. One way to do this is to use the = operator, also known as the simple assignment operator. Operators are symbols used to identify the function the code is to perform. Listing 1.14 demonstrates how to use the assignment operator to designate the string values to which the variables miracleMax and valerie will point.

+ +
+ +
+Listing 1.14: Changing the Value of a Variable
+ +
+
+ 1. +public class StormingTheCastle
+
+ 2. +{
+
+ 3. +    public static void Main()
+
+ 4. +    {
+
+ 5. +        string valerie;
+
+ 6. +        string miracleMax = "Have fun storming the castle!";
+
+ 7.
+
+ 8. +        valerie = "Think it will work?";
+
+ 9.
+
+ 10. +        Console.WriteLine(miracleMax);
+
+ 11. +        Console.WriteLine(valerie);
+
+ 12.
+
+ 13. +        miracleMax = "It would take a miracle.";
+
+ 14. +        Console.WriteLine(miracleMax);
+
+ 15. +    }
+
+ 16. +}
+
+
+ + + +

+From this listing, observe that it is possible to assign a variable as part of the variable declaration (as it was for miracleMax) or afterward in a separate statement (as with the variable valerie). The value assigned must always be on the right side of the declaration.

+ + +

+Running the compiled program produces the code shown in Output 1.3.

+ +
+ +
+Output 1.3
+ +
+
+>dotnet run
+
+Have fun storming the castle!
+
+Think it will work?
+
+It would take a miracle.
+
+ +
+ + + +

+

+ + +

+In this example, we show the command dotnet run explicitly. In future output listings, we will omit this line unless there is something special about the command used to execute the program.

+ + +

+C# requires that local variables be (as determined by the compiler) “definitely assigned” before they are read. Additionally, an assignment results in a value. Therefore, C# allows two assignments within the same statement, as demonstrated in Listing 1.15.

+ +
+ +
+Listing 1.15: Assignment Returning a Value That Can Be Assigned Again
+ +
+
+ 1. +public class StormingTheCastle
+
+ 2. +{
+
+ 3. +    public static void Main()
+
+ 4. +    {
+
+ 5. +        // ...
+
+ 6. +        string requirements, miracleMax;
+
+ 7. +        requirements = miracleMax = "It would take a miracle.";
+
+ 8. +        // ...
+
+ 9. +    }
+
+ 10. +}
+
+
+ + +
+ +Using a Variable + +
+ + +

+The result of the assignment, of course, is that you can then refer to the value using the variable identifier. Therefore, when you use the variable miracleMax within the Console.WriteLine(miracleMax) statement, the program displays “Have fun storming the castle!”—the value of miracleMax—on the console. Changing the value of miracleMax and executing the same Console.WriteLine(miracleMax) statement displays the new miracleMax value, “It would take a miracle.”

+ + +
+ +
AdVanced Topic
+
Strings Are Immutable
+ + + + +

+All values of type string, whether string literals or otherwise, are immutable (or unmodifiable). For example, it is not possible to change the string Come As You Are. to Come As You Age. A change such as this requires that you reassign the variable instead of modifying the data to which the variable originally referred.

+ + \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/04.html b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/04.html new file mode 100644 index 00000000..da32abda --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/04.html @@ -0,0 +1,2182 @@ + + + + + + + + + +
+ + + +
+ +Console Input and Output + +
+ + +

+This chapter already used Console.WriteLine repeatedly for writing out text to the command console. In addition to being able to write out data, a program needs to be able to accept data that a user may enter.

+ +
+ +Getting Input from the Console + +
+ + +

+One way to retrieve text that is entered at the console is to use Console.ReadLine(). This method stops the program execution so that the user can enter characters. When the user presses the Enter key, creating a newline, the program continues. The output, also known as the return, from the Console.ReadLine() method is the string of text that was entered. Consider Listing 1.16 and the corresponding output shown in Output 1.4.

+ +
+ +
+Listing 1.16: Using Console.ReadLine()
+ +
+
+ 1. +public class HeyYou
+
+ 2. +{
+
+ 3. +    public static void Main()
+
+ 4. +    {
+
+ 5. +        string firstName;
+
+ 6. +        string lastName;
+
+ 7.
+
+ 8. +        Console.WriteLine("Hey you!");
+
+ 9.
+
+ 10. +        Console.Write("Enter your first name: ");
+
+ 11. +        firstName = Console.ReadLine();
+
+ 12.
+
+ 13. +        Console.Write("Enter your last name: ");
+
+ 14. +        lastName = Console.ReadLine();
+
+ 15. +    }
+
+ 16. +}
+
+
+ + +
+ +
+Output 1.4
+ +
+
+Hey you!
+
+Enter your first name: Inigo
+
+Enter your last name: Montoya
+
+ +
+ + + +

+

+ + +

+After each prompt, this program uses the Console.ReadLine() method to retrieve the text the user entered and assign it to an appropriate variable. By the time the second Console.ReadLine() assignment completes, firstName refers to the value Inigo and lastName refers to the value Montoya.

+ + +

+If you encounter a CS8600, “Converting null literal or possible null value to non-nullable type,” warning when assigning Console.ReadLine(), you can safely ignore it until Chapter 2. Alternatively, use string? rather than string when declaring the firstName and lastName variables to address the warning. You can also disable the nullable-related warnings entirely by disabling them, setting the Nullable element in your project file to disable (<Nullable>disable</Nullable>) within the PropertyGroup element of the .csproj file.

+ + +
+ +
AdVanceD Topic
+
System.Console.Read()
+ + + + +

+In addition to the System.Console.ReadLine() method, there is a System.Console.Read() method. However, the data type returned by the System.Console.Read() method is an integer corresponding to the character value read, or –1 if no more characters are available. To retrieve the actual character, it is necessary to first cast the integer to a character, as shown in Listing 1.17.

+ +
+ +
+Listing 1.17: Using System.Console.Read()
+ +
+
+ 1. +int readValue;
+
+ 2. +char character;
+
+ 3. +readValue = Console.Read();
+
+ 4. +character = (char) readValue;
+
+ 5. +Console.Write(character);
+
+
+ + + +

+The Console.Read() method does not return the input until the user presses the Enter key; no processing of characters will begin, even if the user types multiple characters before pressing the Enter key.

+ + + +

+You can use Console.ReadKey(),11 which, in contrast to Console.Read(), returns the input after a single keystroke. It allows the developer to intercept the keystroke and perform actions such as key validation or to restrict the characters to numerics.

+ + +
+ +Writing Output to the Console + +
+ + +

+Listing 1.16 prompted the user for their first and last names using the method Console.Write() rather than Console.WriteLine(). Instead of placing a newline character after displaying the text, the Console.Write() method leaves the current position on the same line. In this way, any text the user enters will be on the same line as the prompt for input. The output from Listing 1.16 demonstrates the effect of Console.Write().

+ + + +

+The next step is to write the values retrieved using Console.ReadLine() back to the console. In the case of Listing 1.18, the program writes out the user’s full name. However, instead of using Console.WriteLine() as before, this code uses a slight variation that leverages string interpolation.12 Notice in Listing 1.18, the dollar sign preceding the string literal in the call to Console.WriteLine; it indicates that string interpolation will be used. Output 1.5 shows the corresponding output.

+ +
+ +
+Listing 1.18: Formatting Using String Interpolation
+ +
+
+ 1. +public class HeyYou
+
+ 2. +{
+
+ 3. +    public static void Main()
+
+ 4. +    {
+
+ 5. +        string firstName;
+
+ 6. +        string lastName;
+
+ 7.
+
+ 8. +        Console.WriteLine("Hey you!");
+
+ 9.
+
+ 10. +        Console.Write("Enter your first name: ");
+
+ 11. +        firstName = Console.ReadLine();
+
+ 12.
+
+ 13. +        Console.Write("Enter your last name: ");
+
+ 14. +        lastName = Console.ReadLine();
+
+ 15.
+
+ 16. +        Console.WriteLine(
+
+ 17. +            $"Your full name is { firstName } { lastName }.");
+
+ 18. +    }
+
+ 19. +}
+
+
+ + +
+ +
+Output 1.5
+ +
+
+Hey you!
+
+Enter your first name: Inigo
+
+Enter your last name: Montoya
+
+
+
+Your full name is Inigo Montoya.
+
+ +
+ + + +

+

+ + +

+Instead of writing out “Your full name is” followed by another Write statement for firstName, a third Write statement for the space, and finally a WriteLine statement for lastName, Listing 1.18 writes out the entire output string interpolation. With string interpolation, the compiler interprets the interior of the curly brackets within the string as regions in which you can embed code (expressions) that the compiler will evaluate and convert to strings. Rather than executing lots of code snippets individually and combining the results as a string at the end, string interpolation allows you to do this in a single step. This makes the code easier to understand.

+ + + +

+Prior to C# 6.0, C# used a different approach, that of composite formatting. With composite formatting, the code first supplies a format string to define the output format—see Listing 1.19.

+ +
+ +
+Listing 1.19: Formatting Using Console.WriteLine()’s Composite Formatting
+ +
+
+ 1. +public class HeyYou
+
+ 2. +{
+
+ 3. +    public static void Main()
+
+ 4. +    {
+
+ 5. +        string firstName;
+
+ 6. +        string lastName;
+
+ 7.
+
+ 8. +        Console.WriteLine("Hey you!");
+
+ 9.
+
+ 10. +        Console.Write("Enter your first name: ");
+
+ 11. +        firstName = Console.ReadLine();
+
+ 12.
+
+ 13. +        Console.Write("Enter your last name: ");
+
+ 14. +        lastName = Console.ReadLine();
+
+ 15.
+
+ 16. +        Console.WriteLine(
+
+ 17. +            "Your full name is {0} {1}.", firstName, lastName);
+
+ 18. +    }
+
+ 19. +}
+
+
+ + + +

+In this example, the format string is Your full name is {0} {1}. It identifies two indexed placeholders for data insertion in the string. Each placeholder corresponds to the order of the arguments that appear after the format string.

+ + +

+Note that the index value begins at zero. Each inserted argument (known as a format item) appears after the format string in the order corresponding to the index value. In this example, since firstName is the first argument to follow immediately after the format string, it corresponds to index value 0. Similarly, lastName corresponds to index value 1.

+ + +

+Note that the placeholders within the format string need not appear in order. For example, Listing 1.20 switches the order of the indexed placeholders and adds a comma, which changes the way the name is displayed (see Output 1.6).

+ +
+ +
+Listing 1.20: Swapping the Indexed Placeholders and Corresponding Variables
+ +
+
+ 1. +Console.WriteLine("Your full name is {1}, {0}.", firstName, lastName);
+
+
+ + +
+ +
+Output 1.6
+ +
+
+Hey you!
+
+Enter your first name: Inigo
+
+Enter your last name: Montoya
+
+
+
+Your full name is Montoya, Inigo
+
+ +
+ + + +

+

+ + +

+In addition to not having the placeholders appear consecutively within the format string, it is possible to use the same placeholder multiple times within a format string. Furthermore, it is possible to omit a placeholder. It is not possible, however, to have placeholders that do not have a corresponding argument.

+ + +

+

+ +
+ +
+ +
+ note
+ +
+ +
+Since string interpolation is almost always easier to understand than the alternative composite string approach, throughout the remainder of the book we use string interpolation by default.
+
+
+
+ + +
+ +Comments + +
+ + +

+In this section, we modify the program in Listing 1.19 by adding comments. In no way does this modification change the execution of the program; rather, providing comments within the code can simply make the code more understandable in areas where it isn’t inherently clear. Listing 1.21 shows the new code, and Output 1.7 shows the corresponding output.

+ + +
+ +
+Listing 1.21: Commenting Your Code
+ +
+
+ 1. +public class CommentSamples
+
+ 2. +{
+
+ 3. +    public static void Main()
+
+ 4. +    {
+
+ 5. +        string firstName; // Variable for storing the first name
+
+ 6. +        string lastName;  // Variable for storing the last name
+
+ 7.
+
+ 8. +        Console.WriteLine("Hey you!");
+
+ 9.
+
+ 10. +        Console.Write /* No new line */ ("Enter your first name: ");
+
+ 11. +        firstName = Console.ReadLine();
+
+ 12.
+
+ 13. +        Console.Write /* No new line */ ("Enter your last name: ");
+
+ 14. +        lastName = Console.ReadLine();
+
+ 15.
+
+ 16. +        /* Display a greeting to the console 
+
+ 17. +          using composite formatting. */
+
+ 18.
+
+ 19. +        Console.WriteLine("Your full name is {1}, {0}."
+
+ 20. +            firstName, lastName);
+
+ 21. +        // This is the end
+
+ 22. +        // of the program listing
+
+ 23. +    }
+
+ 24. +}
+
+
+ + +
+ +
+Output 1.7
+ +
+
+Hey you!
+
+Enter your first name: Inigo
+
+Enter your last name: Montoya
+
+
+
+Your full name is Inigo Montoya.
+
+ +
+ + + +

+

+ + +

+Despite the inserted comments, compiling and executing the new program produces the same output as before.

+ + +

+Programmers use comments to describe and explain the code they are writing, especially where the syntax itself is difficult to understand, or perhaps a particular algorithm implementation is surprising. Since comments are pertinent only to the programmer reviewing the code, the compiler ignores comments and generates an assembly that is devoid of any trace that comments were part of the original source code.

+ + +

+Table 1.2 shows four different C# comment types. The program in Listing 1.21 includes three of these.

+ + +
+
Table 1.2: C# Comment Types
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+Comment Type

+ + + + +

+Description

+ + + + +

+Example

+ + + + +

+Delimited comments

+ + + + +

+A forward slash followed by an asterisk, /*, identifies the beginning of a delimited comment. To end the comment, use an asterisk followed by a forward slash: */. Comments of this form may span multiple lines in the code file or appear embedded within a line of code. The asterisks that appear at the beginning of the lines but within the delimiters are simply for formatting.

+ + + + +

+/*comment*/

+ + + + +

+Single-line comments

+ + + + +

+Comments may be declared with a delimiter comprising two consecutive forward slash characters: //. The compiler treats all text from the delimiter to the end of the line as a comment. Comments of this form are considered a single line. It is possible, however, to place sequential single-line comments one after another, as is the case with the last comment in Listing 1.19.

+ + + + +

+//comment

+ + + + +

+XML delimited comments

+ + + + +

+Comments that begin with /** and end with **/ are called XML delimited comments. They have the same characteristics as regular delimited comments, except that instead of ignoring XML comments entirely, the compiler can place them into a separate text file.13

+ + + + +

+/**comment**/

+ + + + +

+XML single-line comments

+ + + + +

+XML single-line comments begin with /// and continue to the end of the line. In addition, the compiler can save single-line comments into a separate file with the XML delimited comments.

+ + + + +

+///comment

+
+ + + +

+A more comprehensive discussion of the XML comments and how they are leveraged to generate API documentation appears in Chapter 10, where we further discuss the various XML tags.

+ + +

+There was a period in programming history when a prolific set of comments implied a disciplined and experienced programmer. This is no longer the case. Instead, code that is readable without comments is more valuable than that which requires comments to clarify what it does. If developers find it necessary to enter comments to clarify what a block of code is doing, they should favor rewriting the code more clearly over commenting it. Writing comments that simply repeat what the code clearly shows serves only to clutter the code, decrease its readability, and increase the likelihood of the comments going out of date because the code changes without the comments getting updated.

+ + +

+

+ +
+ +
+ +
+
+Guidelines
+ +
+DO NOT use comments unless they describe something that is not obvious to someone other than the developer who wrote the code.
+
+DO favor writing clearer code over entering comments to clarify a complicated algorithm.
+
+
+ + + +

+

+ + +

+

+ + +
+ +
Beginner Topic
+
Extensible Markup Language
+ + + + +

+The Extensible Markup Language (XML) is a simple and flexible hierarchical text format. XML is extensible because included within an XML document is information that describes the data, known as metadata. Here is a sample XML file:

+ + +

+<?xml version="1.0" encoding="utf-8" ?>

+ + +

+<body>

+ + +

+   <book title="Essential C# 11.0">

+ + +

+       <chapters>

+ + +

+           <chapter title="Introducing C#"/>

+ + +

+           <chapter title="Data Types"/>

+ + +

+           ...

+ + +

+       </chapters>

+ + +

+   </book>

+ + +

+</body>

+ + +

+The file starts with a header indicating the version and character encoding of the XML file, after which appears one main “book” element. Elements begin with a word in angle brackets, such as <body>. To end an element, place the same word in angle brackets and add a forward slash to prefix the word, as in </body>. In addition to elements, XML supports attributes. title="Essential C#" is an example of an XML attribute. Note that the metadata (book title, chapter, and so on) describing the data (“Essential C#,” “Data Types”) is included in the XML file. This can result in rather bloated files, but it offers the advantage that the data includes a description to aid in interpreting it.

+ +
+ +Debugging + +
+ + +

+One significant feature of using an IDE is its support for debugging. To try it, follow these additional steps in either operating system version of Visual Studio or in Visual Studio Code:

+ +
+
+ 1. +
+
+
+With the latest version of Program.cs open (Listing 1.9), put your cursor on the last Console.WriteLine line and click the Debug->Toggle Breakpoint (F9) menu item to activate a breakpoint on that line. +
+
+
+ + +
+
+ 2. +
+
+
+In Visual Studio, click the Debug->Start Debugging (F5) menu to relaunch the application but this time with debugging activated. +
+
+
+ + +
+
+ 3. +
+
+
+Visual Studio Code is similar except the menu is Run->Start Debugging (F5). Visual Studio Code also displays a notification to create the build and debug assets, the launch.json and tasks.json files, if you haven’t created them already. Because of the Console.ReadLine statement, you will also need to change the console line in the launch.json file to use “integratedTerminal” rather than “internalConsole.” Now, when debugging, be sure to switch to the TERMINAL output window to respond to your program’s prompts. +
+
+
+ + +
+
+ 4. +
+
+
+Once debugging starts, execution will stop on the line where you set the breakpoint. You can then hover your cursor over a variable (e.g., firstName) to see its value. +
+
+
+ + +
+
+ 5. +
+
+
+In Visual Studio, you can even move the execution of the program from the current line to another line within the method by dragging the yellow arrow in the left margin of the file window. +
+
+
+ + +
+
+ 6. +
+
+
+To continue the program execution, use the Continue button for either IDE (or the Debug->Continue (F5) menu in Visual Studio or Run->Continue (F5) in Visual Studio Code). +
+
+
+ + + +

+For more information about debugging, see the links corresponding to each version:

+ +
+ + + +
+
+ • +
+ +
+ +
+
+ • +
+ +
+
+ + +

+________________________________________

+ +
+ 11. + In C# 2.0 and above.
+ +
+ 12. + A C# 6.0 feature.
+ +
+ 13. + XML delimited comments were explicitly added only in C# 2.0, but the syntax is compatible with C# 1.0.
+ + \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/05.html b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/05.html new file mode 100644 index 00000000..155b772e --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/05.html @@ -0,0 +1,1663 @@ + + + + + + + + + +
+ + + +
+ +Managed Execution and the Common Language Infrastructure + +
+ + +

+The processor cannot directly interpret an assembly. .NET assemblies consist mainly of a second language known as Common Intermediate Language (CIL), or IL for short.14 The C# compiler transforms the C# source file into this intermediate language. An additional step, usually performed at execution time, is required to change the CIL code into machine code that the processor can understand. This involves an important element in the execution of a C# program: the Virtual Execution System (VES). The VES, also casually referred to as the runtime, compiles CIL code as needed (a process known as just-in-time compilation or jitting). The code that executes under the context of an agent such as the runtime is termed managed code, and the process of executing under control of the runtime is called managed execution. The code is “managed” because the runtime controls significant portions of the program’s behavior by managing aspects such as memory allocation, security, and just-in-time compilation. Code that does not require the runtime to execute is called native code (or unmanaged code).

+ + +

+The specification for a runtime is included in a broader specification known as the Common Language Infrastructure (CLI) specification.15 An international standard, the CLI includes specifications for the following:

+ +
+ +
+ +
+ note
+ +
+ +
+The term runtime can refer to either execution time or the VES. To help clarify the intended meaning, this book uses the term execution time to indicate when the program is executing, and it uses the term runtime when discussing the agent responsible for managing the execution of a C# program while it executes.
+
+
+
+ + +
+ +
+
+ • +
+
+
+The VES or runtime
+
+
+ +
+
+ • +
+
+
+The CIL
+
+
+ +
+
+ • +
+
+
+A type system that supports language interoperability, known as the Common Type System (CTS)
+
+
+ +
+
+ • +
+
+
+Guidance on how to write libraries that are accessible from CLI-compatible languages (available in the Common Language Specification [CLS])
+
+
+ +
+
+ • +
+
+
+Metadata that enables many of the services identified by the CLI (including specifications for the layout or file format of assemblies)
+
+
+
+ + +

+

+ + +

+Running within the context of a runtime execution engine enables support for several services and features that programmers do not need to code for directly, including the following:

+ +
+ +
+ +
+ note
+ +
+ +
+This section provides a brief synopsis of the CLI to familiarize you with the context in which a C# program executes. It also provides a summary of some of the terms that appear throughout this book. Chapter 24 is devoted to the topic of the CLI and its relevance to C# developers. Although the chapter appears last in the book, it does not depend on any earlier chapters, so if you are eager to become more familiar with the CLI, you can jump to it at any time.
+
+
+
+ + +
+ +
+
+ • +
+
+
+Language interoperability: Interoperability between different source languages. This is possible because the language compilers translate each source language to the same intermediate language (CIL).
+
+
+ +
+
+ • +
+
+
+Type safety: Checks for conversion between types, ensuring that only conversions between compatible types occurs. This helps prevent the occurrence of buffer overruns, a leading cause of security vulnerabilities.
+
+
+ +
+
+ • +
+
+
+Code access security: Certification that the assembly developer’s code has permission to execute on the computer.
+
+
+ +
+
+ • +
+
+
+Garbage collection: Memory management that automatically de-allocates memory previously allocated by the runtime.
+
+
+ +
+
+ • +
+
+
+Platform portability: Support for running the same assembly on a variety of operating systems.
+
+
+ +
+
+ • +
+
+
+Base Class Library (BCL): Provides a foundation of code that developers can depend on so that they do not have to develop the code themselves.
+
+
+
+ +
+ +Common Intermediate Language and Ildasm + +
+ + +

+As mentioned in the introduction of this section, the C# compiler converts C# code to CIL code and not to machine code. The processor can directly understand machine code; therefore, CIL code needs to be converted before the processor can execute it. Given an assembly, it is possible to view the CIL code using a CIL disassembler utility to deconstruct the assembly into its CIL representation. (The CIL disassembler is affectionately referred to by its Microsoft .NET Framework–specific filename, Ildasm, which stands for IL Disassembler.) Ildasm disassembles an assembly and extracts the CIL generated by the C# compiler into text.

+ + +

+The output that results from disassembling a .NET assembly is significantly easier to understand than machine code. For many developers, this may raise a concern because it is easier for programs to be decompiled and algorithms understood without explicitly redistributing the source code. As with any program, CLI based or not, the only foolproof way of preventing disassembly is to disallow access to the compiled program altogether (e.g., hosting a program only on a website instead of distributing it to a user’s machine). However, if decreased accessibility to the source code is all that is required, there are several obfuscators available. Obfuscators read the IL code and transform it so that it does the same thing but in a way that is much more difficult to understand. This technique prevents the casual developer from accessing the code and creates assemblies that are much more difficult and tedious to decompile into comprehensible code. Unless a program requires a high degree of algorithm security, obfuscators are generally sufficient.

+ + +
+ +
AdVanced Topic
+
CIL Output for HelloWorld.exe
+ + + + +

+The exact command used for the CIL disassembler depends on which implementation of the CLI is used. Instructions are available at http://itl.tc/ildasm. Listing 1.22 shows the CIL code created from running Ildasm.

+ +
+ +
+Listing 1.22: Sample CIL Output
+ +
+
+ 1. +.assembly extern System.Runtime
+
+ 2. +{
+
+ 3. +  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )
+
+ 4. +  .ver 4:2:0:1
+
+ 5. +}
+
+ 6.
+
+ 7.
+
+ 8. +.assembly extern System.Console
+
+ 9. +{
+
+ 10. +  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )
+
+ 11. +  .ver 4:1:0:1
+
+ 12. +}
+
+ 13.
+
+ 14.
+
+ 15. +.assembly 'HelloWorld'
+
+ 16. +{
+
+ 17. +  .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = (01 00 08 00 00 00 00 00 )
+
+ 18. +  .custom instance void [System.Runtime]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = (01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )
+
+ 19. +  .custom instance void [System.Runtime]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = (01 00 18 2E 4E 45 54 43 6F 72 65 41 70 70 2C 56 65 72 73 69 6F 6E 3D 76 33 2E 30 01 00 54 0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61 79 4E 61 6D 65 00 )
+
+ 20. +  .custom instance void [System.Runtime]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = (01 00 0A 48 65 6C 6C 6F 57 6F 72 6C 64 00 00 )
+
+ 21. +  .custom instance void [System.Runtime]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = (01 00 05 44 65 62 75 67 00 00 )
+
+ 22. +  .custom instance void [System.Runtime]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = (01 00 07 31 2E 30 2E 30 2E 30 00 00 )
+
+ 23. +  .custom instance void [System.Runtime]System.Reflection.AssemblyInformationalVersionAttribute::.ctor(string) = (01 00 05 31 2E 30 2E 30 00 00 )
+
+ 24. +  .custom instance void [System.Runtime]System.Reflection.AssemblyProductAttribute::.ctor(string) = (01 00 0A 48 65 6C 6C 6F 57 6F 72 6C 64 00 00 )
+
+ 25. +  .custom instance void [System.Runtime]System.Reflection.AssemblyTitleAttribute::.ctor(string) = (01 00 0A 48 65 6C 6C 6F 57 6F 72 6C 64 00 00 )
+
+ 26. +  .hash algorithm 0x00008004
+
+ 27. +  .ver 1:0:0:0
+
+ 28. +}
+
+ 29.
+
+ 30.
+
+ 31. +.module 'HelloWorld.dll'
+
+ 32. +// MVID: {05b2d1a7-c150-4f20-bd96-c065e4f97a31}
+
+ 33. +.imagebase 0x00400000
+
+ 34. +.file alignment 0x00000200
+
+ 35. +.stackreserve 0x00100000
+
+ 36. +.subsystem 0x0003  // WindowsCui
+
+ 37. +.corflags 0x00000001  // ILOnly
+
+ 38.
+
+ 39.
+
+ 40. +.class private auto ansi beforefieldinit HelloWorld.Program extends[System.Runtime] System.Object
+
+ 41. +{
+
+ 42.
+
+ 43.
+
+ 44. +  .method private hidebysig static void Main(string[] args) cil managed
+
+ 45. +        {
+
+ 46. +    .entrypoint
+
+ 47. +    // Code size 13
+
+ 48. +    .maxstack 8
+
+ 49. +    IL_0000: nop
+
+ 50. +    IL_0001: ldstr "Hello. My name is Inigo Montoya."
+
+ 51. +    IL_0006: call void
+
+ 52. +β†ͺ System.Console]System.Console::WriteLine(string)
+
+ 53. +    IL_000b: nop
+
+ 54. +    IL_000c: ret
+
+ 55. +    } // End of method System.Void
+
+ 56. +      // HelloWorld.Program::Main(System.String[])
+
+ 57.
+
+ 58.
+
+ 59. +  .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
+
+ 60. +    {
+
+ 61. +    // Code size 8
+
+ 62. +    .maxstack 8
+
+ 63. +    IL_0000: ldarg.0
+
+ 64. +    IL_0001: call instance void [System.Runtime]
+
+ 65. +        System.Object::.ctor()
+
+ 66. +    IL_0006: nop
+
+ 67. +    IL_0007: ret
+
+ 68. +    } // End of method System.Void HelloWorld.Program::.ctor()
+
+ 69. +} // End of class HelloWorld.Program
+
+
+ + + +

+The beginning of the listing is the manifest information. It includes not only the full name of the disassembled module (HelloWorld.dll) but also all the assemblies it depends on, along with their version information.

+ + +

+Perhaps the most interesting thing that you can glean from such a listing is how relatively easy it is to follow what the program is doing compared to trying to read and understand machine code (assembler). In the listing, an explicit reference to Console.WriteLine() appears. There is a lot of peripheral information to the CIL code listing, but if a developer wanted to understand the inner workings of a C# assembly (or any CLI-based program) without having access to the original source code, it would be relatively easy unless an obfuscator is used. In fact, several free tools are available (such as Red Gate’s Reflector, ILSpy, JustDecompile, dotPeek, and CodeReflect) that can decompile from CIL to C# automatically.

+ + + +

+________________________________________

+ +
+ 14. + A third term for CIL is Microsoft IL (MSIL). This book uses the term CIL because it is the term adopted by the CLI standard. IL is prevalent in conversation among people writing C# code because they assume that IL refers to CIL rather than other types of intermediate languages.
+ +
+ 15. + Miller, J., and S. Ragsdale. 2004. The Common Language Infrastructure Annotated Standard. Boston: Addison-Wesley.
+ + \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/06.html b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/06.html new file mode 100644 index 00000000..e6ae4e14 --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/06.html @@ -0,0 +1,1835 @@ + + + + + + + + + +
+ + + +
+ +Multiple .NET Frameworks + +
+ + +

+As briefly mentioned earlier in the chapter, there are multiple .NET frameworks. The large number of offerings is driven mainly by the desire to provide .NET implementations across multiple operating systems and, potentially, even different hardware platforms. Table 1.3 shows those that are predominant.

+ +
+
Table 1.3: Predominant .NET Framework Implementations
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+Comment Type

+ + + + +

+Description

+ + + + +

+NET 6 and later

+ + + + +

+Starting with NET 6 (following .NET Core 5.0), the Core suffix was dropped to indicate .NET Core and the .NET Framework have essentially unified into one framework.

+ + + + +

+.NET Core

+ + + + +

+A truly cross-platform and open source .NET framework that supports a highly modularized set of APIs for both the server and command-line applications.

+ + + + +

+Microsoft .NET Framework

+ + + + +

+The first of the .NET frameworks—slowly being supplanted by .NET.

+ + + + +

+Xamarin

+ + + + +

+With the release of NET 6.0, this effectively becomes a legacy mobile platform implementation of .NET that works with both iOS and Android and enables the development of mobile applications from a single code base while still enabling access to native platform APIs.

+ + + + +

+Mono

+ + + + +

+The oldest open source implementation of .NET that formed the foundation upon which Xamarin and Unity were built. Mono has been replaced by .NET Core for new development.

+ + + + +

+Unity

+ + + + +

+A cross-platform game engine used to develop video games for game consoles, PCs, mobile devices, and even websites. (The Unity engine is the first public implementation to support projections into the Microsoft Hololens augmented reality realm.)

+
+ + +

+

+ + +

+All the samples in the book work for .NET, at a minimum, unless they specifically indicate otherwise.

+ + +

+

+ +
+ +
+ +
+ note
+ +
+ +
+Throughout the book, .NET framework (lowercase) refers to the framework supported by .NET implementations in general. In contrast, Microsoft .NET Framework refers to the specific .NET framework implementation that runs only on Microsoft Windows and was first released by Microsoft in 2001.
+
+
+
+ + + +

+

+ +
+ +Application Programming Interface + +
+ + +

+All the methods (or more generically, the members) found on a data type such as Console are what define the Console’s application programming interface (API). The API defines how a software program interacts with a component. As such, it is found not just with a single data type, but more generically; the combination of all the APIs for a set of data types is said to create an API for the collective set of components. In .NET, for example, all the types (and the members within those types) in an assembly are said to form the assembly’s API. Likewise, given a combination of assemblies, such as those found in .NET, the collective group of assemblies forms a larger API. Often, this larger group of APIs is referred to as the framework—hence the term .NET framework in reference to the APIs exposed by all the assemblies included with the .NET. Generically, the API comprises the set of interfaces and protocols (or instructions) for programming against a set of components. In fact, with .NET, the protocols themselves are the rules for how .NET assemblies execute.

+ +
+ +C# and .NET Versioning + +
+ + +

+Historically, the development life cycle of .NET frameworks has not always been consistent with that of the C# language; therefore, the version of the underlying .NET framework and the corresponding version of the C# language end up with different numbers. This means if you compile with the C# 11.0 compiler, it will, by default, compile against the .NET 7.0, for example. Table 1.4 is a brief overview of the C# and .NET releases for the Microsoft .NET Framework and .NET Core.

+ + + + + + + + + + + +
+
Table 1.4: C# and .NET Versions
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+Comment Type

+ + + + +

+Description

+ + + + +

+C# 1.0 with Microsoft .NET Framework 1.0/1.1 (Visual Studio 2002 and 2003)

+ + + + +

+The initial release of C#. A language built from the ground up to support .NET programming.

+ + + + +

+C# 2.0 with Microsoft .NET Framework 2.0 (Visual Studio 2005)

+ + + + +

+Added generics to the C# language and libraries that supported generics to the Microsoft .NET Framework 2.0.

+ + + + +

+Microsoft .NET Framework 3.0

+ + + + +

+An additional set of APIs for distributed communications (Windows Communication Foundation [WCF]), rich client presentation (Windows Presentation Foundation [WPF]), workflow (Windows Workflow [WF]), and Web authentication (Cardspaces).

+ + + + +

+C# 3.0 with Microsoft .NET Framework 3.5 (Visual Studio 2008)

+ + + + +

+Added support for LINQ, a significant improvement to the APIs used for programming collections. The Microsoft .NET Framework 3.5 provided libraries that extended existing APIs to make LINQ possible.

+ + + + +

+C# 4.0 with Microsoft .NET Framework 4 (Visual Studio 2010)

+ + + + +

+Added support for dynamic typing along with significant improvements in the API for writing multithreaded programs that capitalized on multiple processors and cores within those processors.

+ + + + +

+C# 5.0 with Microsoft .NET Framework 4.5 (Visual Studio 2012) and WinRT integration

+ + + + +

+Added support for asynchronous method invocation without the explicit registration of a delegate callback. An additional change in the framework was support for interoperability with the Windows Runtime (WinRT).

+ + + + +

+C# 6.0 with Microsoft .NET Framework 4.6 and .NET Core 1.X (Visual Studio 2015)

+ + + + +

+Added string interpolation, null propagating member access, exception filters, dictionary initializers, and numerous other features.

+ + + + +

+C# 7.0 with Microsoft .NET Framework 4.7 and .NET Core 1.1 or 2.0 (Visual Studio 2017)

+ + + + +

+Added tuples, deconstructors, pattern matching, local functions, return by reference, and more.

+ + + + +

+C# 8.0 with Microsoft .NET Framework 4.8 and .NET Core 3.0

+ + + + +

+Added support for nullable reference types, advanced pattern matching, using declarations, static local functions, disposable ref structs, ranges and indices, and async streams (although Microsoft .NET Framework 4.8 does not support the last two features).

+ + + + +

+C# 9.0 with Microsoft .NET 5.0 (most of the .NET Framework functionality was merged into .NET Core)

+ + + + +

+Added support for records, relational pattern matching, top-level statements, source generators, and function pointers.

+ + + + +

+C# 10.0 with .NET 6.0

+ + + + +

+Added simplifications included record structs, global using directives, file-scoped namespaces, extended property patterns. In addition, caller argument expressions and more were added.

+ + + + +

+C# 11 with .NET 7.0

+ + + + +

+Added support for file-scoped types, generic math support, default struct initialization, raw literal strings, generic attributes, list patterns, required members, and more.

+ + + + +

+C# with .NET 8.0

+ + + + +

+Extended use of primary constructors beyond records, and the using alias directive to any type. Added optional parameters in lambda expressions, and more.

+
+ + + + + + +

+Perhaps the most important framework feature add occurred alongside C# 6.0—that is, cross-platform compilation. In other words, not only would the Microsoft .NET Framework run on Windows, but Microsoft also provided the .NET Core implementation that would run on Windows, Linux, and macOS. This means that with the same code base it is possible to compile and execute applications that run across multiple platforms. .NET Core, renamed to simply .NET with version 5.0, is an entire SDK with everything from the .NET Compiler Platform (“Roslyn”), which itself executes on Linux and macOS, to the .NET runtime, along with tools such as the dotnet command-line utility, dotnet CLI (which was introduced around the time of C# 7.0).

+ + + + + +
+ + \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/07.html b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/07.html new file mode 100644 index 00000000..0df4d3fd --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/Chapters/01/Pages/07.html @@ -0,0 +1,1241 @@ + + + + + + + + + +
+ + + +
+ +Chapter 1: Summary + +
+ + +

+This chapter served as a rudimentary introduction to C#. It provided a means of familiarizing you with basic C# syntax. Because of C#’s similarity to C++-style languages, much of this chapter’s content might not have been new material to you. However, C# and managed code do have some distinct characteristics, such as compilation down to CIL. Although it is not unique, another key characteristic of C# is its full support for object-oriented programming. Even tasks such as reading and writing data to the console are object oriented. Object orientation is foundational to C#, as you will see throughout this book.

+ + +

+The next chapter examines the fundamental data types that are part of the C# language and discusses how you can use these data types with operands to form expressions.

+ + \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/Chapters/02/Pages/01.html b/EssentialCSharp.Web/Placeholders/Chapters/02/Pages/01.html new file mode 100644 index 00000000..e7593d28 --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/Chapters/02/Pages/01.html @@ -0,0 +1,1329 @@ + + + + + + + + + +
+ + + +
+ +
+ +
2
+
+ +
+

Data Types

+
+
+ + +

+From Chapter 1’s HelloWorld program, you got a feel for the C# language, its structure, basic syntax characteristics, and how to write the simplest of programs. This chapter continues to discuss the C# basics by investigating the fundamental C# types.

+ + +
+ + +
+
+
+ + + +

+Until now, you have worked with only a few built-in data types, with little explanation. In C# thousands of types exist, and you can combine types to create new types. A few types in C#, however, are relatively simple and are considered the building blocks of all other types. These types are the predefined types. The C# language’s predefined types include 10 integer types, two binary floating-point types for scientific calculations and one decimal float for financial calculations, one Boolean type, and a character type. This chapter investigates these types and looks more closely at the string type.

+ + +
+ +Type Name Forms + +
+ + +

+All built-in types have essentially three name forms. Consider the string type, for example. There is the full name (i.e., System.String), the implied or simplified name (i.e., String), and the keyword (i.e., string).

+ + +

+The full name provides all the context and disambiguates the type from all other types. This is the name used in the underlying CIL code into which C# compiles. The full name is comprised of the namespace (everything in the fully qualified type’s name before the last period) followed by the type name (the final part of the name after the last period). If it wasn’t for some C# conveniences, all types within C# would be referenced by their full name. All the predefined types themselves are part of the Base Class Library (BCL)—the name given to the set of APIs that comprise the underlying framework. The full name of the types included in the BCL, therefore, is also the BCL name.

+ + +

+The conveniences are shortcuts that allow the compiler to resolve a type’s namespace implicitly rather than providing the namespace with each reference. Types with long namespaces such as System.Text.RegularExpressions.RegEx benefit a lot from the shortcut of avoiding the namespace qualifier (i.e., RegEx). See  β€œUsing Directives” in Chapter 5 for more information about the shortcuts and how the compiler can infer namespaces.

+ + +

+The keyword is a shortcut built into the C# language specifically for the predefined types. Types that are not predefined don’t have a keyword. Console from Chapter 1, for example, has only the full name (i.e., System.Console) and simpler non-qualified name (Console) with the namespace inferred. Similarly, any of the custom types that you define (such as Program) don’t have a keyword shortcut.

+ + +

+Developers have a choice of which of the three name forms to use when. Rather than switching back and forth, it is better to use one consistently. While there is seemingly little difference between using the unqualified name versus the keyword, C# developers generally use the C# keyword form (when available)—choosing, for example, string rather than String or System.String and int rather than Int32 or System.Int32. Using the fully qualified name from within C# code is rare and generally reserved to disambiguate types with the same unqualified name (such as System.Timers.Timer and System.Threading.Timer).

+ +
+ +
+ +
+
+Guidelines
+ +
+DO use the C# keyword rather than the unqualified name when specifying a data type (e.g., string rather than String).
+
+DO favor consistency rather than variety within your code.
+
+
+ + + +

+The choice for consistency often may be at odds with other guidelines. For example, given the guideline to use the C# keyword in place of the full name, there may be occasions when you find yourself maintaining a file (or library of files) with the opposite style. In these cases, it would be better to stay consistent with the previous style than to inject a new style and inconsistencies in the conventions. Even so, if the “style” was a bad coding practice that was likely to introduce bugs and obstruct successful maintenance, by all means correct the issue throughout.

+ + + +
+ +
AdVanced Topic
+
Using Directive and Global Using Static Directive
+ + + + +

+The full name of the Console class that we have used for reading and writing content from the command line is System.Console. The System portion of the name is the namespace. Namespaces provide a hierarchical grouping of types. For example, the RegEx class (used for parsing text with regular expressions) is located in the System.Text.RegularExpressions namespace. Each period in the namespace represents a different level within the hierarchy.

+ + +

+For example, you can place a using directive at the top of a file, using System, for example, thereby eliminating the need to prefix a type with the namespace because the compiler can assume the namespace from the using directives.

+ + +

+C# 10 also includes a global using directive such that the using directive is required only once for the entire project, instead of repeatedly within each file that leverages types within the namespace. To identify a using directive as global, you can prefix the statement with global as in global using System.

+ + +

+In addition, C# 10 generates a default set of global using statements. A lookback at the enable value of the ImplicitUsings element from Listing 1.2 turns this on. Once enabled, it is no longer necessary to provide using directives or fully qualified names for any types in the generated set including System. Specifically, the C# compiler generates a .cs file that contains a set of global using statements.

+
+ + \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/Chapters/02/Pages/02.html b/EssentialCSharp.Web/Placeholders/Chapters/02/Pages/02.html new file mode 100644 index 00000000..b5cb7256 --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/Chapters/02/Pages/02.html @@ -0,0 +1,3144 @@ + + + + + + + + + +
+ + + +
+ +Fundamental Numeric Types + +
+ + +

+The basic numeric types in C# have keywords associated with them. These types include integer types, floating-point types, and a special floating-point type called decimal to store large numbers with no representation error.

+ + +
+ +Integer Types + +
+ + +

+There are 10 C# integer types, as shown in Table 2.1. This variety allows you to select a data type large enough to hold its intended range of values without wasting resources.

+ +
+
Table 2.1: Integer Types
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+Type

+ + + + +

+Size

+ + + + +

+Range (Inclusive)

+ + + + +

+BCL Name

+ + + + +

+Signed

+ + + + +

+Literal Suffix

+ + + + +

+sbyte

+ + + + +

+8 bits

+ + + + +

+–128 to 127

+ + + + +

+System.SByte

+ + + + +

+Yes

+ + + + +

+

+ + + + +

+byte

+ + + + +

+8 bits

+ + + + +

+0 to 255

+ + + + +

+System.Byte

+ + + + +

+No

+ + + + +

+

+ + + + +

+short

+ + + + +

+16 bits

+ + + + +

+–32,768 to 32,767

+ + + + +

+System.Int16

+ + + + +

+Yes

+ + + + +

+

+ + + + +

+ushort

+ + + + +

+16 bits

+ + + + +

+0 to 65,535

+ + + + +

+System.UInt16

+ + + + +

+No

+ + + + +

+

+ + + + +

+int

+ + + + +

+32 bits

+ + + + +

+–2,147,483,648 to 2,147,483,647

+ + + + +

+System.Int32

+ + + + +

+Yes

+ + + + +

+

+ + + + +

+uint

+ + + + +

+32 bits

+ + + + +

+0 to 4,294,967,295

+ + + + +

+System.UInt32

+ + + + +

+No

+ + + + +

+U or u

+ + + + +

+Long

+ + + + +

+64 bits

+ + + + +

+–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

+ + + + +

+System.Int64

+ + + + +

+Yes

+ + + + +

+L or l

+ + + + +

+ulong

+ + + + +

+64 bits

+ + + + +

+0 to 18,446,744,073,709,551,615

+ + + + +

+System.UInt64

+ + + + +

+No

+ + + + +

+UL or ul

+ + + + +

+nint

+ + + + +

+Signed 32-bit or 64-bit integer is a [depends on platform]

+ + + + +

+Depends on platform where the code is executing.

+ + +

+Use sizeof(nint) to retrieve size.

+ + + + +

+System.IntPtr

+ + + + +

+Yes

+ + + + +

+

+ + + + +

+nuint

+ + + + +

+Unsigned 32-bit or 64-bit integer is a [depends on platform]

+ + + + +

+Depends on platform where the code is executing.

+ + +

+Use sizeof(nuint) to retrieve size.

+ + + + +

+System.UIntPtr

+ + + + +

+No

+ + + + +

+

+
+ + + +

+Included in Table 2.1 (and all the type tables within this section) is a column for the full name of each type; we discuss the literal suffix later in the chapter. All the fundamental types in C# have both a short name and a full name. The full name corresponds to the type as it is named in the BCL. This name, which is the same across all languages, uniquely identifies the type within an assembly. Because of the fundamental nature of these types, C# also supplies keywords as short names or abbreviations for the full names of fundamental types. From the compiler’s perspective, both names refer to the same type, producing identical code. In fact, an examination of the resultant Common Intermediate Language (CIL) code would provide no indication of which name was used.

+ +
+ +
+ +
+
+Language Contrast: C++—short Data Type
+ +
+ + + + +

+In C/C++, the short data type is an abbreviation for short int. In C#, short on its own is the actual data type.

+
+
+ + + +
+ +Floating-Point Types (float, double) + +
+ + +

+Floating-point numbers have varying degrees of precision, and binary floating-point types can represent numbers exactly only if they are a fraction with a power of 2 as the denominator. If you were to set the value of a floating-point variable to be 0.1, it could very easily be represented as 0.0999999999999999 or 0.10000000000000001 or some other number very close to 0.1. Similarly, setting a variable to a large number such as Avogadro’s number, 6.02 × 1023, could lead to a representation error of approximately 108, which after all is a tiny fraction of that number. The accuracy of a floating-point number is in proportion to the magnitude of the number it represents. A floating-point number is precise to a certain number of digits of precision, not by a fixed value such as ±0.01. There are at most 17 significant digits for a double and 9 significant digits for a float1 (assuming the number wasn’t converted from a string as described in the “Advanced Topic: Floating-Point Types Dissected”). 2

+ + +

+C# supports the two binary floating-point number types listed in Table 2.2. Binary numbers appear as base 10 (denary) numbers for human readability. While there are additional floating-point types beyond the scope of this book (see https://learn.microsoft.com/dotnet/standard/numerics), they are not built-in types with associated keywords.

+ +
+
Table 2.2: Floating-Point Types
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+Type

+ + + + +

+Size

+ + + + +

+Significant Digits

+ + + + +

+BCL Name

+ + + + +

+Significant Digits

+ + + + +

+Literal Suffix

+ + + + +

+float

+ + + + +

+32 bits

+ + + + +

+±1.5 × 10−45 to ±3.4 × 1038

+ + + + +

+System.Single

+ + + + +

+7

+ + + + +

+F or f

+ + + + +

+double

+ + + + +

+64 bits

+ + + + +

+±5.0 × 10−324 to ±1.7 × 10308

+ + + + +

+System.Double

+ + + + +

+15–16

+ + + + +

+D or d

+
+ + + +

+

+ + +
+ +
AdVanced Topic
+
Floating-Point Types Dissected
+ + + + + +

+Denary numbers within the range and precision limits of the decimal type are represented exactly. In contrast, the binary floating-point representation of many denary numbers introduces a rounding error. Just as ⅓ cannot be represented exactly in any finite number of decimal digits, so ¹¹⁄₁₀ cannot be represented exactly in any finite number of binary digits (the binary representation being 1.0001100110011001101…). In both cases, we end up with a rounding error of some kind.

+ + +

+A decimal is represented by ±N * 10k where the following is true:

+ +
+ +
+
+ • +
+
+
+N, the mantissa, is a positive 96-bit integer.
+
+
+ +
+
+ • +
+
+
+k, the exponent, is given by -28 <= k <= 0.
+
+
+
+ + +

+In contrast, a binary float is any number ±N * 2k where the following is true:

+ +
+ +
+
+ • +
+
+
+N is a positive 24-bit (for float) or 53-bit (for double) integer.
+
+
+ +
+
+ • +
+
+
+k is an integer ranging from -149 to +104 for float and from -1074 to +970 for double.
+
+
+
+ +
+ +Decimal Type + +
+ + +

+C# also provides a decimal floating-point type with 128-bit precision (see Table 2.3). This type is suitable for financial calculations.

+ +
+
Table 2.3: Decimal Type
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+Type

+ + + + +

+Size

+ + + + +

+Range (Inclusive)

+ + + + +

+BCL Name

+ + + + +

+Significant Digits

+ + + + +

+Literal Suffix

+ + + + +

+decimal

+ + + + +

+128 bits

+ + + + +

+1.0 × 10−28 to approximately 7.9 × 1028

+ + + + +

+System.Decimal

+ + + + +

+28–29

+ + + + +

+M or m

+
+ + +

+Unlike binary floating-point numbers, the decimal type maintains exact accuracy for all denary numbers within its range. With the decimal type, therefore, a value of 0.1 is exactly 0.1. However, while the decimal type has greater precision than the floating-point types, it has a smaller range. Thus, conversions from floating-point types to the decimal type may result in overflow errors. Also, calculations with decimal are slightly (generally imperceptibly) slower.

+ + + + +
+ +
AdVanced Topic
+
Native-Sized Integers
+ + + + +

+C# 9.0 added new contextual keywords to represent native-sized signed and unsigned integers, specifically nint and nuint respectively starting in C# 11. (See Table 2.4.) Unlike the other numeric types that are the same size regardless of the underlying operating system, the native sized integer types will vary depending on what platform the code is executing. A nint, for example, will be 32-bits on a 32-bit platform and 64-bit on a 64-bit platform. These types are designed to match the size of a pointer within the system on which they are executing. They are a more advanced type because they are generally only useful when working with pointers and memory in the underlying operating system rather than memory within the managed execution context of .NET.

+ +
+
Table 2.4: Native Integer Types3
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+Type

+ + + + +

+Size

+ + + + +

+Range (Inclusive)

+ + + + +

+BCL Name

+ + + + +

+Significant Digits

+ + + + +

+Literal Suffix

+ + + + +

+nint

+ + + + +

+Matches Operating System (OS)

+ + + + +

+Variable but available at runtime via nint.MinValue and nint.MaxValue

+ + + + +

+System.IntPtr

+ + + + +

+Matches OS

+ + + + +

+none

+ + + + +

+nuint

+ + + + +

+Matches Operating System (OS)

+ + + + +

+Variable but available at runtime via unint.MinValue and unint.MaxValue

+ + + + +

+System.UIntPtr

+ + + + +

+Matches OS

+ + + + +

+none

+
+ + +

+See Chapter 23 for more information on nint and nuint.

+ + + +
+ +Literal Values + +
+ + +

+A literal value is a representation of a constant value within source code. For example, if you want to have Console.WriteLine() print out the integer value 42 and the double value 1.618034, you could use the code shown in Listing 2.1 with Output 2.1.

+ +
+ +
+Listing 2.1: Specifying Literal Values
+ +
+
+ 1. +Console.WriteLine(42);
+
+ 2.
+
+ 3. +Console.WriteLine(1.618034);
+
+
+ + + +

+

+ +
+ +
+Output 2.1
+ +
+
+42
+
+1.618034
+
+ +
+ + + +
+ +
Beginner Topic
+
Use Caution When Hardcoding Values
+ + + + +

+The practice of placing a value directly into source code is called hardcoding, because changing the values requires recompiling the code. Developers must carefully consider the choice between hardcoding values within their code and retrieving them from an external source, such as a configuration file, so that the values are modifiable without recompiling.

+ + +

+By default, when you specify a literal number with a decimal point, the compiler interprets it as a double type. Conversely, a literal value with no decimal point generally defaults to an int, assuming the value is not too large to be stored in a 32-bit integer. If the value is too large, the compiler interprets it as a long. Furthermore, the C# compiler allows assignment to a numeric type other than an int, assuming the literal value is appropriate for the target data type. short s = 42 and byte b = 77 are allowed, for example. However, this is appropriate only for constant values; b = s is not allowed without additional syntax, as discussed in the section “Conversions between Data Types” later in this chapter.

+ + +

+As previously discussed in this section, there are many different numeric types in C#. In Listing 2.2, a literal value is passed to the WriteLine method. Since numbers with a decimal point will default to the double data type, the output, shown in Output 2.2, is 1.618033988749895 (the last two digits, 48, are now 5), corresponding to the expected accuracy of a double.

+ +
+ +
+Listing 2.2: Specifying a Literal double
+ +
+
+ 1. +Console.WriteLine(1.6180339887498948);
+
+
+ + +
+ +
+Output 2.2
+ +
+
+1.618033988749895
+
+ +
+ + + +

+

+ + +

+To view the intended number with its full accuracy, you must declare explicitly the literal value as a decimal type by appending an M (or m) (see Listing 2.3 and Output 2.3).

+ +
+ +
+Listing 2.3: Specifying a Literal decimal
+ +
+
+ 1. +Console.WriteLine(1.6180339887498948M);
+
+
+ + +
+ +
+Output 2.3
+ +
+
+1.6180339887498948
+
+
+
+ +
+ + + +

+

+ + +

+Now the output of Listing 2.3 is as expected: 1.618033988749895. Note that d is the abbreviation for double. To remember that M should be used to identify a decimal, remember that “m is for monetary calculations.”

+ + +

+You can also add a suffix to a value to explicitly declare a literal as a float or double by using the F (or f) and D (or d) suffixes, respectively. For integer data types, the suffixes are U, L, LU, and UL. The type of an integer literal can be determined as follows:

+ +
+ +
+
+ • +
+
+
+Numeric literals with no suffix resolve to the first data type that can store the value, in this order: int, uint, long, and ulong.
+
+
+ +
+
+ • +
+
+
+Numeric literals with the suffix U resolve to the first data type that can store the value, in the order uint and then ulong.
+
+
+ +
+
+ • +
+
+
+Numeric literals with the suffix L resolve to the first data type that can store the value, in the order long and then ulong.
+
+
+ +
+
+ • +
+
+
+If the numeric literal has the suffix UL or LU, it is of type ulong.
+
+
+
+ + +

+Note that suffixes for literals are case insensitive. However, uppercase is generally preferred to avoid any ambiguity between the lowercase letter l and the digit 1.

+ +
+ +
+ +
+
+Guidelines
+ +
+DO use uppercase literal suffixes (e.g., 1.618033988749895M).
+
+
+ + + + +

+On occasion, numbers can get quite large and difficult to read. To overcome the readability problem, C# 7.0 added support for a digit separator, an underscore (_), when expressing a numeric literal, as shown in Listing 2.4.

+ +
+ +
+Listing 2.4: Specifying Digit Separator
+ +
+
+ 1. +Console.WriteLine(9_814_072_356M);
+
+
+ + + +

+In this case, we separate the digits into thousands (threes), but this is not required by C#. You can use the digit separator to create whatever grouping you like as long as the underscore occurs between the first and last digits. In fact, you can even have multiple underscores side by side—with no digit between them.

+ + + +

+In addition, you may wish to use exponential notation instead of writing out several zeroes before or after the decimal point (whether using a digit separator or not). To use exponential notation, supply the e or E infix, follow the infix character with a positive or negative integer number, and complete the literal with the appropriate data type suffix. For example, you could print out Avogadro’s number as a float, as shown in Listing 2.5 and Output 2.4.

+ +
+ +
+Listing 2.5: Exponential Notation
+ +
+
+ 1. +Console.WriteLine(6.023E23F);
+
+
+ + +
+ +
+Output 2.4
+ +
+
+6.023E+23
+
+ +
+ + + +
+ +
Beginner Topic
+
Hexadecimal Notation
+ + + + +

+Usually, you work with numbers that are represented with a base of 10, meaning there are 10 symbols (0–9) for each place value in the number. If a number is displayed with hexadecimal notation, it is displayed with a base of 16 numbers, meaning 16 symbols are used: 0–9, A–F (or in lowercase). Therefore, 0x000A corresponds to the decimal value 10 and 0x002A corresponds to the decimal value 42, being 2 × 16 + 10. The actual number is the same. Switching from hexadecimal to decimal, or vice versa, does not change the number itself—just the representation of the number.

+ + +

+Each hex digit is four bits, so a byte can represent two hex digits.

+ + +

+In all discussions of literal numeric values so far, we have covered only base 10 type values. C# also supports the ability to specify hexadecimal values. To specify a hexadecimal value, prefix the value with 0x and then use any hexadecimal series of digits, as shown in Listing 2.6.

+ +
+ +
+Listing 2.6: Hexadecimal Literal Value
+ +
+
+ 1. +//Display the value 42 using a hexadecimal literal
+
+ 2. +Console.WriteLine(0x002A);
+
+
+ + + +

+Output 2.5 shows the results of Listing 2.6. Note that this code still displays 42, not 0x002A.

+ +
+ +
+Output 2.5
+ +
+
+42
+
+ +
+ + + + +

+Starting with C# 7.0, you can also represent numbers as binary values (see Listing 2.7).

+ +
+ +
+Listing 2.7: Binary Literal Value
+ +
+
+ 1. +// Display the value 42 using a binary literal
+
+ 2. +Console.WriteLine(0b101010);
+
+
+ + + +

+The syntax is like the hexadecimal syntax except with 0b as the prefix (an uppercase B is also allowed). See “Beginner Topic: Bits and Bytes” in Chapter 4 for an explanation of binary notation and the conversion between binary and decimal.

+ + +

+Note that starting with C# 7.2, you can place the digit separator after the x for a hexadecimal literal or the b for a binary literal.

+ + + +
+ +
AdVanced Topic
+
Formatting Numbers as Hexadecimal
+ + + + +

+To display a numeric value in its hexadecimal format, it is necessary to use the x or X numeric formatting specifier. The casing determines whether the hexadecimal letters appear in lowercase or uppercase. Listing 2.8 with Output 2.6 shows an example of how to do this.

+ +
+ +
+Listing 2.8: Example of a Hexadecimal Format Specifier
+ +
+
+ 1. +//Displays "0x2A"
+
+ 2. +Console.WriteLine($"0x{42:X}");
+
+
+ + +
+ +
+Output 2.6
+ +
+
+0x2A
+
+ +
+ + + +

+Note that the numeric literal (42) can be in decimal or hexadecimal form. The result will be the same. Also, to achieve the hexadecimal formatting, we rely on the formatting specifier, separated from the string interpolation expression with a colon.

+ + +
+ +
AdVanced Topic
+
Round-Trip Formatting
+ + + + +

+By default, Console.WriteLine(1.618033988749895); displays 1.61803398874989, with the last digit missing. To more accurately identify the string representation of the double value, it is possible to convert it using a format string and the round-trip format specifier, R (or r). For example, Console.WriteLine($"{1.618033988749895:R}") will display 1.6180339887498949.

+ + +

+The round-trip format specifier returns a string that, if converted back into a numeric value, will always result in the original value. Listing 2.9 with Output 2.7 shows the numbers are not equal without the use of the round-trip format.

+ +
+ +
+Listing 2.9: Formatting Using the R Format Specifier
+ +
+
+ 1. +// ...
+
+ 2. +const double number = 1.618033988749895;
+
+ 3. +double result;
+
+ 4. +string text;
+
+ 5.
+
+ 6. +text = $"{number}";
+
+ 7. +result = double.Parse(text);
+
+ 8. +Console.WriteLine($"{result == number}{result} == {number}");
+
+ 9.
+
+ 10. +text = $"{number:R}";
+
+ 11. +result = double.Parse(text);
+
+ 12. +Console.WriteLine($"{result == number}{result} == {number}");
+
+ 13.
+
+ 14. +// ...
+
+
+ + +
+ +
+Output 2.7
+ +
+
+False: result == number
+
+True: result == number
+
+ +
+ + + +

+When assigning text the first time, there is no round-trip format specifier; as a result, the value returned by double.Parse(text) is not the same as the original number value. In contrast, when the round-trip format specifier is used, double.Parse(text) returns the original value.

+ + +

+For those readers who are unfamiliar with the == syntax from C-based languages, result == number evaluates to true if result is equal to number, while result != number does the opposite. Both assignment and equality operators are discussed in the next chapter.

+ + +

+________________________________________

+ +
+ 1. + Starting with .NET Core 3.0.
+ +
+ 2. + Prior to .NET Core 3.0, the number of bits (binary digits) converts to 15 decimal digits, with a remainder that contributes to a sixteenth decimal digit as expressed in Table 2.2. Specifically, numbers between 1.7 × 10307 and less than 1 × 10308 have only 15 significant digits. However, numbers ranging from 1 × 10308 to 1.7 × 10308 will have 16 significant digits. A similar range of significant digits occurs with the decimal type as well.
+ +
+ 3. + The exact BCL type varies based on context.
+ + \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/guidelines.json b/EssentialCSharp.Web/Placeholders/guidelines.json new file mode 100644 index 00000000..1fa7badc --- /dev/null +++ b/EssentialCSharp.Web/Placeholders/guidelines.json @@ -0,0 +1,1930 @@ +[ + { + "Type": 1, + "Guideline": "DO NOT define a struct unless it logically represents a single value, consumes 16 bytes or less of storage, is immutable, and is infrequently boxed.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "" + }, + { + "Type": 4, + "Guideline": "DO use record struct when declaring a struct (C# 10.0).", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Structs", + "ActualSubsection": "Record Struct Code Generation" + }, + { + "Type": 4, + "Guideline": "DO use record class (C# 10.0) for clarity, rather than the abbreviated record-only syntax.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Structs", + "ActualSubsection": "Record Struct Code Generation" + }, + { + "Type": 4, + "Guideline": "DO use records, where possible, if you want equality based on data rather than identity.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Classes", + "ActualSubsection": "Record Classes" + }, + { + "Type": 4, + "Guideline": "DO use PascalCase for the positional parameters of the record (C# 9.0).", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Data Storage with Properties" + }, + { + "Type": 4, + "Guideline": "DO define all reference type positional parameters as nullable if not providing a custom property implementation that checks for null.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Data Storage with Properties" + }, + { + "Type": 4, + "Guideline": "DO implement custom non-nullable properties for all non-nullable positional parameters.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Data Storage with Properties" + }, + { + "Type": 4, + "Guideline": "DO use the readonly modifier on a struct definition, making value types immutable.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Types", + "ActualSubsection": "Immutable Value Types" + }, + { + "Type": 4, + "Guideline": "DO use read-only or init-only setter automatically implemented properties rather than fields within structs.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Types", + "ActualSubsection": "Immutable Value Types" + }, + { + "Type": 4, + "Guideline": "DO ensure that the default value of a struct is valid; encapsulation cannot prevent obtaining the default \u201Call zero\u201D value of a struct.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Structs", + "ActualSubsection": "Record Struct Initialization" + }, + { + "Type": 1, + "Guideline": "DO NOT rely on either default constructors or member initialization at declaration to run on a value type.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Structs", + "ActualSubsection": "Record Struct Initialization" + }, + { + "Type": 4, + "Guideline": "DO override ToString() whenever useful developer-oriented diagnostic strings can be returned.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "ToString()", + "ActualSubsection": "Overriding ToString()" + }, + { + "Type": 3, + "Guideline": "CONSIDER trying to keep the string returned from ToString() short.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "ToString()", + "ActualSubsection": "Overriding ToString()" + }, + { + "Type": 1, + "Guideline": "DO NOT return an empty string or null from ToString().", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "ToString()", + "ActualSubsection": "Overriding ToString()" + }, + { + "Type": 1, + "Guideline": "DO NOT throw exceptions or make observable side effects (change the object state) from ToString().", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "ToString()", + "ActualSubsection": "Overriding ToString()" + }, + { + "Type": 4, + "Guideline": "DO provide an overloaded ToString(string format) or implement IFormattable if the return value requires formatting or is culture-sensitive (e.g., DateTime).", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "ToString()", + "ActualSubsection": "Overriding ToString()" + }, + { + "Type": 3, + "Guideline": "CONSIDER returning a unique string from ToString() so as to identify the object instance.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "ToString()", + "ActualSubsection": "Overriding ToString()" + }, + { + "Type": 1, + "Guideline": "DO NOT use the enum type name as part of the values name.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Enums", + "ActualSubsection": "Enums" + }, + { + "Type": 4, + "Guideline": "DO use an enum type name that is singular unless the enum is a flag.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Enums", + "ActualSubsection": "Enums" + }, + { + "Type": 3, + "Guideline": "CONSIDER using the default 32-bit integer type as the underlying type of an enum. Use a smaller type only if you must do so for interoperability; use a larger type only if you are creating a flags enum with more than 32 flags.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 3, + "Guideline": "CONSIDER adding new members to existing enums, but keep in mind the compatibility risk.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 2, + "Guideline": "AVOID creating enums that represent an \u201Cincomplete\u201D set of values, such as product version numbers.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 2, + "Guideline": "AVOID creating \u201Creserved for future use\u201D values in an enum.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 2, + "Guideline": "AVOID enums that contain a single value.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 4, + "Guideline": "DO provide a value of 0 (none) for simple enums, knowing that 0 will be the default value when no explicit initialization is provided.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 2, + "Guideline": "AVOID direct enum/string conversions where the string must be localized into the user\u2019s language.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Enums", + "ActualSubsection": "Converting between Enums and Strings" + }, + { + "Type": 4, + "Guideline": "DO use the FlagsAttribute to mark enums that contain flag values.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Enums", + "ActualSubsection": "Enums as Flags" + }, + { + "Type": 4, + "Guideline": "DO provide a None value equal to 0 for all enums.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Enums", + "ActualSubsection": "Enums as Flags" + }, + { + "Type": 2, + "Guideline": "AVOID creating flag enums where the zero value has a meaning other than \u201Cno flags are set.\u201D", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Enums", + "ActualSubsection": "Enums as Flags" + }, + { + "Type": 3, + "Guideline": "CONSIDER providing special values for commonly used combinations of flags.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Enums", + "ActualSubsection": "Enums as Flags" + }, + { + "Type": 1, + "Guideline": "DO NOT include \u201Csentinel\u201D values (such as a value called Maximum); such values can be confusing to the user.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Enums", + "ActualSubsection": "Enums as Flags" + }, + { + "Type": 4, + "Guideline": "DO use powers of 2 to ensure that all flag combinations are represented uniquely.", + "ChapterNumber": 9, + "ChapterTitle": "Introducing Structs and Records", + "SanitizedSubsection": "Enums", + "ActualSubsection": "Enums as Flags" + }, + { + "Type": 4, + "Guideline": "DO check that the value of a delegate is not null before invoking it.", + "ChapterNumber": 14, + "ChapterTitle": "Events", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Check for null" + }, + { + "Type": 4, + "Guideline": "DO use the null-conditional operator prior to calling Invoke() starting in C# 6.0.", + "ChapterNumber": 14, + "ChapterTitle": "Events", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Check for null" + }, + { + "Type": 4, + "Guideline": "DO check that the value of a delegate is not null before invoking it (possibly by using the null-conditional operator in C# 6.0).", + "ChapterNumber": 14, + "ChapterTitle": "Events", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Coding Conventions" + }, + { + "Type": 4, + "Guideline": "DO pass the instance of the class as the value of the sender for nonstatic events.", + "ChapterNumber": 14, + "ChapterTitle": "Events", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Coding Conventions" + }, + { + "Type": 4, + "Guideline": "DO pass null as the sender for static events.", + "ChapterNumber": 14, + "ChapterTitle": "Events", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Coding Conventions" + }, + { + "Type": 1, + "Guideline": "DO NOT pass null as the value of the eventArgs argument.", + "ChapterNumber": 14, + "ChapterTitle": "Events", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Coding Conventions" + }, + { + "Type": 4, + "Guideline": "DO use System.EventArgs or a type that derives from System.EventArgs for a TEventArgs type.", + "ChapterNumber": 14, + "ChapterTitle": "Events", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Coding Conventions" + }, + { + "Type": 3, + "Guideline": "CONSIDER using a subclass of System.EventArgs as the event argument type (TEventArgs) unless you are sure the event will never need to carry any data.", + "ChapterNumber": 14, + "ChapterTitle": "Events", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Coding Conventions" + }, + { + "Type": 4, + "Guideline": "DO throw an ArgumentException or one of its subtypes if bad arguments are passed to a member. Prefer the most derived exception type (e.g., ArgumentNullException), if applicable.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Types", + "ActualSubsection": "Multiple Exception Types" + }, + { + "Type": 1, + "Guideline": "DO NOT throw a System.SystemException or an exception type that derives from it.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Types", + "ActualSubsection": "Multiple Exception Types" + }, + { + "Type": 1, + "Guideline": "DO NOT throw a System.Exception, System.NullReferenceException, or System.ApplicationException.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Types", + "ActualSubsection": "Multiple Exception Types" + }, + { + "Type": 3, + "Guideline": "CONSIDER terminating the process by calling System.Environment.FailFast() if the program encounters a scenario where it is unsafe to continue execution.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Types", + "ActualSubsection": "Multiple Exception Types" + }, + { + "Type": 4, + "Guideline": "DO use nameof for the paramName argument passed into argument exception types that take such a parameter. Examples of such exceptions include ArgumentException, ArgumentOutOfRangeException, and ArgumentNullException.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Types", + "ActualSubsection": "Multiple Exception Types" + }, + { + "Type": 2, + "Guideline": "AVOID exception reporting or logging lower in the call stack.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Guidelines for Exception Handling" + }, + { + "Type": 1, + "Guideline": "DO NOT over-catch. Exceptions should be allowed to propagate up the call stack unless it is clearly understood how to programmatically address those errors lower in the stack.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Guidelines for Exception Handling" + }, + { + "Type": 3, + "Guideline": "CONSIDER catching a specific exception when you understand why it was thrown in a given context and can respond to the failure programmatically.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Guidelines for Exception Handling" + }, + { + "Type": 2, + "Guideline": "AVOID catching System.Exception or System.SystemException except in top-level exception handlers that perform final cleanup operations before rethrowing the exception.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Guidelines for Exception Handling" + }, + { + "Type": 4, + "Guideline": "DO use throw; rather than throw \u003Cexception object\u003E inside a catch block.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Guidelines for Exception Handling" + }, + { + "Type": 4, + "Guideline": "DO use exception filters to avoid rethrowing an exception from within a catch block.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Guidelines for Exception Handling" + }, + { + "Type": 4, + "Guideline": "DO use caution when rethrowing different exceptions.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Guidelines for Exception Handling" + }, + { + "Type": 2, + "Guideline": "AVOID throwing exceptions from exception filters.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Guidelines for Exception Handling" + }, + { + "Type": 2, + "Guideline": "AVOID exception filters with logic that might implicitly change over time.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Guidelines for Exception Handling" + }, + { + "Type": 2, + "Guideline": "AVOID deep exception hierarchies.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Defining Custom Exceptions" + }, + { + "Type": 1, + "Guideline": "DO NOT create a new exception type if the exception would not be handled differently than an existing CLR exception. Throw the existing framework exception instead.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Defining Custom Exceptions" + }, + { + "Type": 4, + "Guideline": "DO create a new exception type to communicate a unique program error that cannot be communicated using an existing CLR exception and that can be programmatically handled in a different way than any other existing CLR exception type.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Defining Custom Exceptions" + }, + { + "Type": 4, + "Guideline": "DO provide a parameterless constructor on all custom exception types. Also provide constructors that take a message and an inner exception.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Defining Custom Exceptions" + }, + { + "Type": 4, + "Guideline": "DO name exception classes with the \u201CException\u201D suffix.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Defining Custom Exceptions" + }, + { + "Type": 4, + "Guideline": "DO make exceptions runtime-serializable.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Defining Custom Exceptions" + }, + { + "Type": 3, + "Guideline": "CONSIDER providing exception properties for programmatic access to extra information relevant to the exception.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Defining Custom Exceptions" + }, + { + "Type": 3, + "Guideline": "CONSIDER wrapping specific exceptions thrown from the lower layer in a more appropriate exception if the lower-layer exception does not make sense in the context of the higher-layer operation.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Rethrowing a Wrapped Exception" + }, + { + "Type": 4, + "Guideline": "DO specify the inner exception when wrapping exceptions.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Rethrowing a Wrapped Exception" + }, + { + "Type": 4, + "Guideline": "DO target developers as the audience for exceptions, identifying both the problem and the mechanism to resolve it, where possible.", + "ChapterNumber": 11, + "ChapterTitle": "Exception Handling", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Rethrowing a Wrapped Exception" + }, + { + "Type": 4, + "Guideline": "DO create public managed wrappers around unmanaged methods that use the conventions of managed code, such as structured exception handling.", + "ChapterNumber": 23, + "ChapterTitle": "Platform Interoperability and Unsafe Code", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Error Handling" + }, + { + "Type": 1, + "Guideline": "DO NOT unnecessarily replicate existing managed classes that already perform the function of the unmanaged API.", + "ChapterNumber": 23, + "ChapterTitle": "Platform Interoperability and Unsafe Code", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "P/Invoke Guidelines" + }, + { + "Type": 4, + "Guideline": "DO declare extern methods as private or internal.", + "ChapterNumber": 23, + "ChapterTitle": "Platform Interoperability and Unsafe Code", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "P/Invoke Guidelines" + }, + { + "Type": 4, + "Guideline": "DO provide public wrapper methods that use managed conventions such as structured exception handling, use of enums for special values, and so on.", + "ChapterNumber": 23, + "ChapterTitle": "Platform Interoperability and Unsafe Code", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "P/Invoke Guidelines" + }, + { + "Type": 4, + "Guideline": "DO simplify the wrapper methods by choosing default values for unnecessary parameters.", + "ChapterNumber": 23, + "ChapterTitle": "Platform Interoperability and Unsafe Code", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "P/Invoke Guidelines" + }, + { + "Type": 4, + "Guideline": "DO use the SetLastErrorAttribute on Windows to turn APIs that use SetLastError error codes into methods that throw Win32Exception.", + "ChapterNumber": 23, + "ChapterTitle": "Platform Interoperability and Unsafe Code", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "P/Invoke Guidelines" + }, + { + "Type": 4, + "Guideline": "DO extend SafeHandle or implement IDisposable and create a finalizer to ensure that unmanaged resources can be cleaned up effectively.", + "ChapterNumber": 23, + "ChapterTitle": "Platform Interoperability and Unsafe Code", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "P/Invoke Guidelines" + }, + { + "Type": 4, + "Guideline": "DO use delegate types that match the signature of the desired method when an unmanaged API requires a function pointer.", + "ChapterNumber": 23, + "ChapterTitle": "Platform Interoperability and Unsafe Code", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "P/Invoke Guidelines" + }, + { + "Type": 4, + "Guideline": "DO use ref parameters rather than pointer types when possible.", + "ChapterNumber": 23, + "ChapterTitle": "Platform Interoperability and Unsafe Code", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "P/Invoke Guidelines" + }, + { + "Type": 4, + "Guideline": "DO ensure that custom comparison logic produces a consistent \u201Ctotal order.\u201D", + "ChapterNumber": 17, + "ChapterTitle": "Building Custom Collections", + "SanitizedSubsection": "Equality", + "ActualSubsection": "Total Ordering" + }, + { + "Type": 1, + "Guideline": "DO NOT make any unwarranted assumptions about the order in which elements of a collection will be enumerated. If the collection is not documented as enumerating its elements in a particular order, it is not guaranteed to produce elements in any particular order.", + "ChapterNumber": 17, + "ChapterTitle": "Building Custom Collections", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Dictionary Collections: Dictionary\u003CTKey, TValue\u003E" + }, + { + "Type": 1, + "Guideline": "DO NOT represent an empty collection with a null reference.", + "ChapterNumber": 17, + "ChapterTitle": "Building Custom Collections", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Returning null or an Empty Collection" + }, + { + "Type": 3, + "Guideline": "CONSIDER using the Enumerable.Empty\u003CT\u003E() method instead.", + "ChapterNumber": 17, + "ChapterTitle": "Building Custom Collections", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Returning null or an Empty Collection" + }, + { + "Type": 3, + "Guideline": "CONSIDER whether the readability benefit of defining your own delegate type outweighs the convenience of using a predefined generic delegate type.", + "ChapterNumber": 13, + "ChapterTitle": "Delegates and Lambda Expressions", + "SanitizedSubsection": "Types", + "ActualSubsection": "General-Purpose Delegate Types: System.Func and System.Action" + }, + { + "Type": 3, + "Guideline": "CONSIDER omitting the types from lambda formal parameter lists when the types are obvious to the reader or when they are an insignificant detail.", + "ChapterNumber": 13, + "ChapterTitle": "Delegates and Lambda Expressions", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Statement Lambdas" + }, + { + "Type": 2, + "Guideline": "AVOID the anonymous method syntax in new code; prefer the more compact lambda expression syntax.", + "ChapterNumber": 13, + "ChapterTitle": "Delegates and Lambda Expressions", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Anonymous Methods" + }, + { + "Type": 2, + "Guideline": "AVOID using implicitly typed local variables (var) unless the data type of the assigned value is obvious.", + "ChapterNumber": 3, + "ChapterTitle": "More with Data Types", + "SanitizedSubsection": "Variables", + "ActualSubsection": "Implicitly Typed Local Variables" + }, + { + "Type": 4, + "Guideline": "DO use camelCasing for variable declarations using tuple syntax.", + "ChapterNumber": 3, + "ChapterTitle": "More with Data Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Tuples" + }, + { + "Type": 3, + "Guideline": "CONSIDER using PascalCasing for all tuple item names.", + "ChapterNumber": 3, + "ChapterTitle": "More with Data Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Tuples" + }, + { + "Type": 3, + "Guideline": "CONSIDER checking the array length before indexing into an array rather than assuming the length.", + "ChapterNumber": 3, + "ChapterTitle": "More with Data Types", + "SanitizedSubsection": "Arrays", + "ActualSubsection": "Using an Array" + }, + { + "Type": 3, + "Guideline": "CONSIDER using the index from end operator (^) rather than Length - 1 with C# 8.0 or higher.", + "ChapterNumber": 3, + "ChapterTitle": "More with Data Types", + "SanitizedSubsection": "Arrays", + "ActualSubsection": "Using an Array" + }, + { + "Type": 4, + "Guideline": "DO use System.Linq.Enumerable.Any() rather than calling patents.Count() when checking whether there are more than zero items.", + "ChapterNumber": 15, + "ChapterTitle": "Collection Interfaces with Standard Query Operators", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Counting Elements with Count()" + }, + { + "Type": 4, + "Guideline": "DO use a collection\u2019s Count property (if available) instead of calling the System.Linq.Enumerable.Count() method.", + "ChapterNumber": 15, + "ChapterTitle": "Collection Interfaces with Standard Query Operators", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Counting Elements with Count()" + }, + { + "Type": 1, + "Guideline": "DO NOT call an OrderBy() following a prior OrderBy() method call. Use ThenBy() to sequence items by more than one value.", + "ChapterNumber": 15, + "ChapterTitle": "Collection Interfaces with Standard Query Operators", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Sorting with OrderBy() and ThenBy()" + }, + { + "Type": 4, + "Guideline": "DO cancel unfinished tasks rather than allowing them to run during application shutdown.", + "ChapterNumber": 19, + "ChapterTitle": "Introducing Multithreading", + "SanitizedSubsection": "Tasks", + "ActualSubsection": "Canceling a Task" + }, + { + "Type": 4, + "Guideline": "DO inform the task factory that a newly created task is likely to be long-running so that it can manage it appropriately.", + "ChapterNumber": 19, + "ChapterTitle": "Introducing Multithreading", + "SanitizedSubsection": "Tasks", + "ActualSubsection": "Long-Running Tasks" + }, + { + "Type": 4, + "Guideline": "DO use TaskCreationOptions.LongRunning sparingly.", + "ChapterNumber": 19, + "ChapterTitle": "Introducing Multithreading", + "SanitizedSubsection": "Tasks", + "ActualSubsection": "Long-Running Tasks" + }, + { + "Type": 2, + "Guideline": "AVOID calling Thread.Sleep() in production code.", + "ChapterNumber": 19, + "ChapterTitle": "Introducing Multithreading", + "SanitizedSubsection": "Threads", + "ActualSubsection": "Working with System.Threading" + }, + { + "Type": 4, + "Guideline": "DO use tasks and related APIs in favor of System.Theading classes such as Thread and ThreadPool.", + "ChapterNumber": 19, + "ChapterTitle": "Introducing Multithreading", + "SanitizedSubsection": "Threads", + "ActualSubsection": "Working with System.Threading" + }, + { + "Type": 4, + "Guideline": "DO use PascalCasing and an \u201CI\u201D prefix for interface names.", + "ChapterNumber": 8, + "ChapterTitle": "Interfaces", + "SanitizedSubsection": "Interfaces", + "ActualSubsection": "Introducing Interfaces" + }, + { + "Type": 1, + "Guideline": "DO NOT add members without a default implementation to a published interface.", + "ChapterNumber": 8, + "ChapterTitle": "Interfaces", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Versioning" + }, + { + "Type": 3, + "Guideline": "CONSIDER using extension methods or an additional interface in place of default interface members when adding methods to a published interface.", + "ChapterNumber": 8, + "ChapterTitle": "Interfaces", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Extension Methods versus Default Interface Members" + }, + { + "Type": 4, + "Guideline": "DO use extension methods when the interface providing the polymorphic behavior is not under your control.", + "ChapterNumber": 8, + "ChapterTitle": "Interfaces", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Extension Methods versus Default Interface Members" + }, + { + "Type": 3, + "Guideline": "CONSIDER defining an interface if you need to support its functionality on types that already inherit from some other type.", + "ChapterNumber": 8, + "ChapterTitle": "Interfaces", + "SanitizedSubsection": "Interfaces", + "ActualSubsection": "Interfaces Compared with Abstract Classes" + }, + { + "Type": 2, + "Guideline": "AVOID using \u201Cmarker\u201D interfaces with no members; use attributes instead.", + "ChapterNumber": 8, + "ChapterTitle": "Interfaces", + "SanitizedSubsection": "Interfaces", + "ActualSubsection": "Interfaces Compared with Attributes" + }, + { + "Type": 4, + "Guideline": "DO favor clarity over brevity when naming identifiers.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Identifiers" + }, + { + "Type": 1, + "Guideline": "DO NOT use abbreviations or contractions within identifier names.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Identifiers" + }, + { + "Type": 1, + "Guideline": "DO NOT use any acronyms unless they are widely accepted, in which case use them consistently.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Identifiers" + }, + { + "Type": 4, + "Guideline": "DO capitalize both characters in two-character acronyms, except for the first word of a camelCased identifier.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 4, + "Guideline": "DO capitalize only the first character in acronyms with three or more characters, except for the first word of a camelCased identifier.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 1, + "Guideline": "DO NOT capitalize any of the characters in acronyms at the beginning of a camelCased identifier.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 1, + "Guideline": "DO NOT use Hungarian notation (that is, do not encode the type of a variable in its name).", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 4, + "Guideline": "DO name classes with nouns or noun phrases.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Types", + "ActualSubsection": "Type Definition" + }, + { + "Type": 4, + "Guideline": "DO use PascalCasing for all class names.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Types", + "ActualSubsection": "Type Definition" + }, + { + "Type": 4, + "Guideline": "DO use camelCasing for local variable names.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Variables", + "ActualSubsection": "Declaring a Variable" + }, + { + "Type": 1, + "Guideline": "DO NOT use comments unless they describe something that is not obvious to someone other than the developer who wrote the code.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Comments", + "ActualSubsection": "Comments" + }, + { + "Type": 4, + "Guideline": "DO favor writing clearer code over entering comments to clarify a complicated algorithm.", + "ChapterNumber": 1, + "ChapterTitle": "Introducing C#", + "SanitizedSubsection": "Comments", + "ActualSubsection": "Comments" + }, + { + "Type": 2, + "Guideline": "AVOID locking on this, System.Type, or a string.", + "ChapterNumber": 22, + "ChapterTitle": "Thread Synchronization", + "SanitizedSubsection": "Threads", + "ActualSubsection": "Why to Avoid Locking on this, typeof(type), and string" + }, + { + "Type": 4, + "Guideline": "DO declare a separate, read-only synchronization variable of type object for the synchronization target.", + "ChapterNumber": 22, + "ChapterTitle": "Thread Synchronization", + "SanitizedSubsection": "Threads", + "ActualSubsection": "Why to Avoid Locking on this, typeof(type), and string" + }, + { + "Type": 2, + "Guideline": "AVOID using the MethodImplAttribute for synchronization.", + "ChapterNumber": 22, + "ChapterTitle": "Thread Synchronization", + "SanitizedSubsection": "Synchronization", + "ActualSubsection": "Avoid Synchronizing with MethodImplAttribute" + }, + { + "Type": 1, + "Guideline": "DO NOT request exclusive ownership of the same two or more synchronization targets in different orders.", + "ChapterNumber": 22, + "ChapterTitle": "Thread Synchronization", + "SanitizedSubsection": "Threads", + "ActualSubsection": "Avoiding Unnecessary Locking" + }, + { + "Type": 4, + "Guideline": "DO ensure that code that concurrently holds multiple locks always acquires them in the same order.", + "ChapterNumber": 22, + "ChapterTitle": "Thread Synchronization", + "SanitizedSubsection": "Threads", + "ActualSubsection": "Avoiding Unnecessary Locking" + }, + { + "Type": 4, + "Guideline": "DO encapsulate mutable static data in public APIs with synchronization logic.", + "ChapterNumber": 22, + "ChapterTitle": "Thread Synchronization", + "SanitizedSubsection": "Threads", + "ActualSubsection": "Avoiding Unnecessary Locking" + }, + { + "Type": 2, + "Guideline": "AVOID synchronization on simple reading or writing of values no bigger than a native (pointer-size) integer, as such operations are automatically atomic.", + "ChapterNumber": 22, + "ChapterTitle": "Thread Synchronization", + "SanitizedSubsection": "Threads", + "ActualSubsection": "Avoiding Unnecessary Locking" + }, + { + "Type": 4, + "Guideline": "DO apply AssemblyVersionAttribute to assemblies with public types.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Attributes" + }, + { + "Type": 3, + "Guideline": "CONSIDER applying AssemblyFileVersionAttribute and AssemblyCopyrightAttribute to provide additional information about the assembly.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Attributes" + }, + { + "Type": 4, + "Guideline": "DO apply the following information assembly attributes: System.Reflection.AssemblyCompanyAttribute, System.Reflection.AssemblyCopyrightAttribute, System.Reflection.AssemblyDescriptionAttribute, and System.Reflection.AssemblyProductAttribute.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Attributes" + }, + { + "Type": 4, + "Guideline": "DO name custom attribute classes with the suffix Attribute.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Custom Attributes" + }, + { + "Type": 4, + "Guideline": "DO provide get-only properties (without public setters) on attributes with required property values.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Initializing an Attribute through a Constructor" + }, + { + "Type": 4, + "Guideline": "DO provide constructor parameters to initialize properties on attributes with required properties. Each parameter should have the same name (albeit with different casing) as the corresponding property.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Initializing an Attribute through a Constructor" + }, + { + "Type": 2, + "Guideline": "AVOID providing constructor parameters to initialize attribute properties corresponding to the optional arguments (and, therefore, avoid overloading custom attribute constructors).", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Initializing an Attribute through a Constructor" + }, + { + "Type": 4, + "Guideline": "DO apply the AttributeUsageAttribute class to custom attributes.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "System.AttributeUsageAttribute" + }, + { + "Type": 1, + "Guideline": "DO NOT explicitly pass arguments for Caller* attribute decorated parameters.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Caller* Attributes" + }, + { + "Type": 4, + "Guideline": "DO use non-nullable string for the data type of Caller* attribute decorated string parameters.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Caller* Attributes" + }, + { + "Type": 4, + "Guideline": "DO assign null! for the default value of Caller* attribute decorated string parameters.", + "ChapterNumber": 18, + "ChapterTitle": "Reflection, Attributes, and Dynamic Programming", + "SanitizedSubsection": "Assemblies", + "ActualSubsection": "Caller* Attributes" + }, + { + "Type": 4, + "Guideline": "DO choose meaningful names for type parameters and prefix the name with T.", + "ChapterNumber": 12, + "ChapterTitle": "Generics", + "SanitizedSubsection": "Types", + "ActualSubsection": "Type Parameter Naming Guidelines" + }, + { + "Type": 3, + "Guideline": "CONSIDER indicating a constraint in the name of a type parameter.", + "ChapterNumber": 12, + "ChapterTitle": "Generics", + "SanitizedSubsection": "Types", + "ActualSubsection": "Type Parameter Naming Guidelines" + }, + { + "Type": 4, + "Guideline": "DO place multiple generic semantically equivalent classes into a single file if they differ only by the number of generic parameters.", + "ChapterNumber": 12, + "ChapterTitle": "Generics", + "SanitizedSubsection": "Parameters", + "ActualSubsection": "Multiple Type Parameters" + }, + { + "Type": 2, + "Guideline": "AVOID shadowing a type parameter of an outer type with an identically named type parameter of a nested type.", + "ChapterNumber": 12, + "ChapterTitle": "Generics", + "SanitizedSubsection": "Types", + "ActualSubsection": "Nested Generic Types" + }, + { + "Type": 2, + "Guideline": "AVOID unsafe array covariance. Instead, CONSIDER converting the array to the read-only interface IEnumerable\u003CT\u003E, which can be safely converted via covariant conversions.", + "ChapterNumber": 12, + "ChapterTitle": "Generics", + "SanitizedSubsection": "Arrays", + "ActualSubsection": "Support for Unsafe Covariance in Arrays" + }, + { + "Type": 4, + "Guideline": "DO use parallel loops when the computations performed can be easily split up into many mutually independent processor-bound computations that can be executed in any order on any thread.", + "ChapterNumber": 21, + "ChapterTitle": "Iterating in Parallel", + "SanitizedSubsection": "Branches", + "ActualSubsection": "Executing Loop Iterations in Parallel" + }, + { + "Type": 2, + "Guideline": "AVOID placing more than one class in a single source file.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Classes", + "ActualSubsection": "Declaring and Instantiating a Class" + }, + { + "Type": 4, + "Guideline": "DO name the source file with the name of the public type it contains.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Classes", + "ActualSubsection": "Declaring and Instantiating a Class" + }, + { + "Type": 2, + "Guideline": "AVOID target-typed new expressions when the data type of the constructor is not obvious.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 3, + "Guideline": "CONSIDER use target-typed new expressions when the data type of the constructor is obvious.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 4, + "Guideline": "DO use properties for simple access to simple data with simple computations.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 2, + "Guideline": "AVOID throwing exceptions from property getters.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 4, + "Guideline": "DO preserve the original property value if the property throws an exception.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 3, + "Guideline": "CONSIDER using the same casing on a property\u2019s backing field as that used in the property, distinguishing the backing field with an \u201C_\u201D prefix.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 4, + "Guideline": "DO name properties using a noun, noun phrase, or adjective.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 3, + "Guideline": "CONSIDER giving a property the same name as its type.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 2, + "Guideline": "AVOID naming fields with camelCase.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 4, + "Guideline": "DO favor prefixing Boolean properties with \u201CIs,\u201D \u201CCan,\u201D or \u201CHas,\u201D when that practice adds value.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 4, + "Guideline": "DO declare all instance fields as private (and expose them via a property).", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 4, + "Guideline": "DO name properties with PascalCase.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 4, + "Guideline": "DO favor automatically implemented properties over fields.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 4, + "Guideline": "DO favor automatically implemented properties over using fully expanded ones if there is no additional implementation logic.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Property and Field Guidelines" + }, + { + "Type": 2, + "Guideline": "AVOID accessing the backing field of a property outside the property, even from within the containing class.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Using Properties with Validation" + }, + { + "Type": 4, + "Guideline": "DO create read-only properties if the property value should not be changed.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Read-Only and Write-Only Properties" + }, + { + "Type": 4, + "Guideline": "DO create read-only automatically implemented properties, rather than read-only properties with a backing field if the property value should not be changed.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Read-Only and Write-Only Properties" + }, + { + "Type": 4, + "Guideline": "DO apply appropriate accessibility modifiers on implementations of getters and setters on all properties.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Access Modifiers on Getters and Setters" + }, + { + "Type": 1, + "Guideline": "DO NOT provide set-only properties or properties with the setter having broader accessibility than the getter.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Access Modifiers on Getters and Setters" + }, + { + "Type": 4, + "Guideline": "DO provide sensible defaults for all properties, ensuring that defaults do not result in a security hole or significantly inefficient code.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Object Initializers" + }, + { + "Type": 4, + "Guideline": "DO allow properties to be set in any order, even if this results in a temporarily invalid object state.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Object Initializers" + }, + { + "Type": 4, + "Guideline": "DO use the same name for constructor parameters (camelCase) and properties (PascalCase) if the constructor parameters are used to simply set the property.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Overloading Constructors" + }, + { + "Type": 4, + "Guideline": "DO provide constructor optional parameters or constructor overloads that initialize properties with good defaults.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Overloading Constructors" + }, + { + "Type": 4, + "Guideline": "DO implement non-nullable read/write reference fully implemented properties with a nullable backing field, a null-forgiveness operator when returning the field from the getter, and non-null validation in the property setter.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Read-Only Automatically Implemented Reference Type Properties" + }, + { + "Type": 4, + "Guideline": "DO assign non-nullable reference type properties before instantiation completes.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Read-Only Automatically Implemented Reference Type Properties" + }, + { + "Type": 4, + "Guideline": "DO implement non-nullable reference type automatically implemented properties as read-only.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Read-Only Automatically Implemented Reference Type Properties" + }, + { + "Type": 4, + "Guideline": "DO use a nullable check for all reference type properties and fields that are not initialized before instantiation completes.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Properties", + "ActualSubsection": "Read-Only Automatically Implemented Reference Type Properties" + }, + { + "Type": 1, + "Guideline": "DO NOT use constructor parameters to initialize required properties; instead, rely on object initializer\u2013specified values.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "required Modifier" + }, + { + "Type": 1, + "Guideline": "DO NOT use the SetRequiredParameters attribute unless all required parameters are assigned valid values during construction.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "required Modifier" + }, + { + "Type": 3, + "Guideline": "CONSIDER having a default constructor only on types with required parameters, relying on the object initializer to set both required and non-required members.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "required Modifier" + }, + { + "Type": 2, + "Guideline": "AVOID adding required members to released types to avoid breaking the compile on existing code.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "required Modifier" + }, + { + "Type": 2, + "Guideline": "AVOID required members where the default value of the type is valid.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "required Modifier" + }, + { + "Type": 3, + "Guideline": "CONSIDER initializing static fields inline rather than explicitly using static constructors or declaration assigned values.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Static Constructors" + }, + { + "Type": 2, + "Guideline": "AVOID frivolously defining extension methods, especially on types you don\u2019t own.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Extension Methods" + }, + { + "Type": 4, + "Guideline": "DO use constant fields for values that will never change.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Fields", + "ActualSubsection": "const" + }, + { + "Type": 2, + "Guideline": "AVOID constant fields for values that will change over time.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Fields", + "ActualSubsection": "const" + }, + { + "Type": 4, + "Guideline": "DO favor read-only automatically implemented properties over read-only fields.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "readonly" + }, + { + "Type": 2, + "Guideline": "AVOID publicly exposed nested types. The only exception is if the declaration of such a type is unlikely or pertains to an advanced customization scenario.", + "ChapterNumber": 6, + "ChapterTitle": "Classes", + "SanitizedSubsection": "Classes", + "ActualSubsection": "Nested Classes" + }, + { + "Type": 4, + "Guideline": "DO use query expression syntax to make queries easier to read, particularly if they involve complex from, let, join, or group clauses.", + "ChapterNumber": 16, + "ChapterTitle": "LINQ with Query Expressions", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Query Expressions Are Just Method Invocations" + }, + { + "Type": 3, + "Guideline": "CONSIDER using the standard query operators (method call form) if the query involves operations that do not have a query expression syntax, such as Count(), TakeWhile(), or Distinct().", + "ChapterNumber": 16, + "ChapterTitle": "LINQ with Query Expressions", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Query Expressions Are Just Method Invocations" + }, + { + "Type": 4, + "Guideline": "DO use the C# keyword rather than the unqualified name when specifying a data type (e.g., string rather than String).", + "ChapterNumber": 2, + "ChapterTitle": "Data Types", + "SanitizedSubsection": "Types", + "ActualSubsection": "Type Name Forms" + }, + { + "Type": 4, + "Guideline": "DO favor consistency rather than variety within your code.", + "ChapterNumber": 2, + "ChapterTitle": "Data Types", + "SanitizedSubsection": "Types", + "ActualSubsection": "Type Name Forms" + }, + { + "Type": 4, + "Guideline": "DO use uppercase literal suffixes (e.g., 1.618033988749895M).", + "ChapterNumber": 2, + "ChapterTitle": "Data Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Literal Values" + }, + { + "Type": 4, + "Guideline": "DO rely on System.Console.WriteLine() and System.Environment.NewLine rather than \\n to accommodate Windows-specific operating system idiosyncrasies with the same code that runs on Linux and macOS.", + "ChapterNumber": 2, + "ChapterTitle": "Data Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Newline" + }, + { + "Type": 1, + "Guideline": "DO NOT throw exceptions from within the implementation of operator overloading.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Comparison Operators (==, !=, \u003C, \u003E, \u003C=, \u003E=)" + }, + { + "Type": 1, + "Guideline": "DO NOT provide an implicit conversion operator if the conversion is lossy.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Conversions", + "ActualSubsection": "Guidelines for Conversion Operators" + }, + { + "Type": 1, + "Guideline": "DO NOT throw exceptions from implicit conversions.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Conversions", + "ActualSubsection": "Guidelines for Conversion Operators" + }, + { + "Type": 4, + "Guideline": "DO use file-scoped namespaces (C# 10.0 or later).", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Namespaces", + "ActualSubsection": "Defining Namespaces" + }, + { + "Type": 4, + "Guideline": "DO prefix namespace names with a company name to prevent namespaces from different companies having the same name.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Namespaces", + "ActualSubsection": "Defining Namespaces" + }, + { + "Type": 4, + "Guideline": "DO use a stable, version-independent product name at the second level of a namespace name.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Namespaces", + "ActualSubsection": "Defining Namespaces" + }, + { + "Type": 1, + "Guideline": "DO NOT define types without placing them into a namespace.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Namespaces", + "ActualSubsection": "Defining Namespaces" + }, + { + "Type": 3, + "Guideline": "CONSIDER creating a folder structure that matches the namespace hierarchy.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Namespaces", + "ActualSubsection": "Defining Namespaces" + }, + { + "Type": 4, + "Guideline": "DO provide XML comments on public APIs when they provide more context than the API signature alone. This includes member descriptions, parameter descriptions, and examples of calling the API.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Files", + "ActualSubsection": "Generating an XML Documentation File" + }, + { + "Type": 4, + "Guideline": "DO implement the dispose pattern on objects with resources that are scarce or expensive.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO implement IDisposable to support possible deterministic finalization on classes with finalizers.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO implement finalizer methods only on objects with resources that don\u0027t have finalizers but still require cleanup.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO refactor a finalization method to call the same code as IDisposable, perhaps simply by calling the Dispose() method.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 1, + "Guideline": "DO NOT throw exceptions from finalizer methods.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 3, + "Guideline": "CONSIDER registering the finalization code with the AppDomain.ProcessExit to increase the probability that resource cleanup will execute before the process exits.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO unregister any AppDomain.ProcessExit events during dispose.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO call System.GC.SuppressFinalize() from Dispose() to avoid repeating resource cleanup and delaying garbage collection on an object.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO ensure that Dispose() is idempotent (it should be possible to call Dispose() multiple times).", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO keep Dispose() simple, focusing on the resource cleanup required by finalization.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 2, + "Guideline": "AVOID calling Dispose() on owned objects that have a finalizer. Instead, rely on the finalization queue to clean up the instance.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 2, + "Guideline": "AVOID referencing other objects that are not being finalized during finalization.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO invoke a base class\u2019s Dispose() method when overriding Dispose().", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 3, + "Guideline": "CONSIDER ensuring that an object becomes unusable after Dispose() is called. After an object has been disposed, methods other than Dispose() (which could potentially be called multiple times) should throw an ObjectDisposedException.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO implement IDisposable on types that own disposable fields (or properties) and dispose of those instances.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO invoke a base class\u2019s Dispose() method from the Dispose(bool disposing) method if one exists.", + "ChapterNumber": 10, + "ChapterTitle": "Well-Formed Types", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Garbage Collection, Finalization, and IDisposable" + }, + { + "Type": 4, + "Guideline": "DO favor composite formatting over use of the addition operator for concatenating strings when localization is a possibility.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Strings", + "ActualSubsection": "Using the Addition Operator with Strings" + }, + { + "Type": 2, + "Guideline": "AVOID binary floating-point types when exact decimal arithmetic is required; use the decimal floating-point type instead.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Special Floating-Point Characteristics" + }, + { + "Type": 2, + "Guideline": "AVOID using equality conditionals with binary floating-point types. Either subtract the two values and see if their difference is less than a tolerance or use the decimal type.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 2, + "Guideline": "AVOID confusing usage of the increment and decrement operators.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Increment/decrement", + "ActualSubsection": "Increment and Decrement Operators (\u002B\u002B, --)" + }, + { + "Type": 4, + "Guideline": "DO be cautious when porting code between C, C\u002B\u002B, and C# that uses increment and decrement operators; C and C\u002B\u002B implementations need not follow the same rules as C#.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Increment/decrement", + "ActualSubsection": "Increment and Decrement Operators (\u002B\u002B, --)" + }, + { + "Type": 1, + "Guideline": "DO NOT use a constant for any value that can possibly change over time. The value of pi and the number of protons in an atom of gold are constants; the price of gold, the name of your company, and the version number of your program can change.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Constant Expressions and Constant Locals" + }, + { + "Type": 2, + "Guideline": "AVOID omitting braces, except for the simplest of single-line if statements.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Code Blocks ({})" + }, + { + "Type": 3, + "Guideline": "CONSIDER using an if-else statement instead of an overly complicated conditional expression.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Branches", + "ActualSubsection": "Conditional Operator (?:)" + }, + { + "Type": 3, + "Guideline": "CONSIDER refactoring the method to make the control flow easier to understand if you find yourself writing for loops with complex conditionals and multiple loop variables.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Branches", + "ActualSubsection": "The for Loop" + }, + { + "Type": 4, + "Guideline": "DO use the for loop when the number of loop iterations is known in advance and the \u201Ccounter\u201D that gives the number of iterations executed is needed in the loop.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 4, + "Guideline": "DO use the while loop when the number of loop iterations is not known in advance and a counter is not needed.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 1, + "Guideline": "DO NOT use continue as the jump statement that exits a switch section. This is legal when the switch is inside a loop, but it is easy to become confused about the meaning of break in a later switch section.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Branches", + "ActualSubsection": "The Basic switch Statement" + }, + { + "Type": 2, + "Guideline": "AVOID using goto.", + "ChapterNumber": 4, + "ChapterTitle": "Operators and Control Flow", + "SanitizedSubsection": "Branches", + "ActualSubsection": "The goto Statement" + }, + { + "Type": 4, + "Guideline": "DO give methods names that are verbs or verb phrases.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Methods", + "ActualSubsection": "Calling a Method" + }, + { + "Type": 4, + "Guideline": "DO use PascalCasing for namespace names.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Namespaces", + "ActualSubsection": "Namespaces" + }, + { + "Type": 3, + "Guideline": "CONSIDER organizing the directory hierarchy for source code files to match the namespace hierarchy.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Namespaces", + "ActualSubsection": "Namespaces" + }, + { + "Type": 4, + "Guideline": "DO use camelCasing for parameter names.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Parameters", + "ActualSubsection": "Formal Parameter Declaration" + }, + { + "Type": 4, + "Guideline": "DO use parameter arrays when a method can handle any number\u2014including zero\u2014of additional arguments.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Arrays", + "ActualSubsection": "Parameter Arrays (params)" + }, + { + "Type": 4, + "Guideline": "DO provide good defaults for all parameters where possible.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Parameters", + "ActualSubsection": "Optional Parameters" + }, + { + "Type": 4, + "Guideline": "DO provide simple method overloads that have a small number of required parameters.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Parameters", + "ActualSubsection": "Optional Parameters" + }, + { + "Type": 3, + "Guideline": "CONSIDER organizing overloads from the simplest to the most complex.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Parameters", + "ActualSubsection": "Optional Parameters" + }, + { + "Type": 4, + "Guideline": "DO treat parameter names as part of the API, and avoid changing the names if version compatibility between APIs is important.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 2, + "Guideline": "AVOID explicitly throwing exceptions from finally blocks. (Implicitly thrown exceptions resulting from method calls are acceptable.)", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Trapping Errors" + }, + { + "Type": 4, + "Guideline": "DO favor try/finally and avoid using try/catch for cleanup code.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Trapping Errors" + }, + { + "Type": 4, + "Guideline": "DO throw exceptions that describe which exceptional circumstance occurred and, if possible, how to prevent it.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Trapping Errors" + }, + { + "Type": 2, + "Guideline": "AVOID general catch blocks and replace them with a catch of System.Exception.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 2, + "Guideline": "AVOID catching exceptions for which the appropriate action is unknown. It is better to let an exception go unhandled than to handle it incorrectly.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": null + }, + { + "Type": 4, + "Guideline": "DO prefer using an empty throw when catching and rethrowing an exception, to preserve the call stack.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Reporting Errors Using a throw Statement" + }, + { + "Type": 4, + "Guideline": "DO report execution failures by throwing exceptions rather than returning error codes.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Reporting Errors Using a throw Statement" + }, + { + "Type": 1, + "Guideline": "DO NOT have public members that return exceptions as return values or an out parameter. Throw exceptions to indicate errors; do not use them as return values to indicate errors.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Reporting Errors Using a throw Statement" + }, + { + "Type": 2, + "Guideline": "AVOID catching and logging an exception before rethrowing it. Instead, allow the exception to escape until it can be handled appropriately.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Reporting Errors Using a throw Statement" + }, + { + "Type": 4, + "Guideline": "DO verify that non-null reference types parameters are not null and throw an ArgumentNullException when they are.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Reporting Null Argument Exceptions" + }, + { + "Type": 4, + "Guideline": "DO use ArgumentException.ThrowIfNull() to verify values are null in .NET 7.0 or later.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Reporting Null Argument Exceptions" + }, + { + "Type": 4, + "Guideline": "DO use nameof(value) (which resolves to \u0022value\u0022) for the paramName argument when creating ArgumentException() or ArgumentNullException() type exceptions. (value is the implicit name of the parameter on property setters.)", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Miscellaneous", + "ActualSubsection": "Introducing the nameof Operator" + }, + { + "Type": 1, + "Guideline": "DO NOT use exceptions for handling normal, expected conditions; use them for exceptional, unexpected conditions.", + "ChapterNumber": 5, + "ChapterTitle": "Parameters and Methods", + "SanitizedSubsection": "Exceptions", + "ActualSubsection": "Avoid Using Exception Handling to Deal with Expected Situations" + } +] \ No newline at end of file diff --git a/EssentialCSharp.Web/Placeholders/sitemap.json b/EssentialCSharp.Web/Placeholders/sitemap.json index e7dc316e..c43e0b62 100644 --- a/EssentialCSharp.Web/Placeholders/sitemap.json +++ b/EssentialCSharp.Web/Placeholders/sitemap.json @@ -1,6 +1,108 @@ [ { - "Key": "hello-world", + "Keys": [ + "introducing-c" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "01.html" + ], + "ChapterNumber": 1, + "PageNumber": 1, + "OrderOnPage": 0, + "ChapterTitle": "Introducing C#", + "RawHeading": "Overview", + "ContentHash": "74B5", + "AnchorId": "overview", + "IndentLevel": 0, + "IncludeInSitemapXml": true + }, + { + "Keys": [ + "hello-world" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "01.html" + ], + "ChapterNumber": 1, + "PageNumber": 1, + "OrderOnPage": 1, + "ChapterTitle": "Introducing C#", + "RawHeading": "Hello, World", + "ContentHash": "C68C", + "AnchorId": "hello-world", + "IndentLevel": 1, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "creating-editing-compiling-and-running-c-source-code" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "01.html" + ], + "ChapterNumber": 1, + "PageNumber": 1, + "OrderOnPage": 2, + "ChapterTitle": "Introducing C#", + "RawHeading": "Creating, Editing, Compiling, and Running C# Source Code", + "ContentHash": "8185", + "AnchorId": "creating-editing-compiling-and-running-c-source-code", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "with-dotnet-cli" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "01.html" + ], + "ChapterNumber": 1, + "PageNumber": 1, + "OrderOnPage": 3, + "ChapterTitle": "Introducing C#", + "RawHeading": "With Dotnet CLI", + "ContentHash": "E879", + "AnchorId": "with-dotnet-cli", + "IndentLevel": 3, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "with-visual-studio-2022-windows-or-mac" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "01.html" + ], + "ChapterNumber": 1, + "PageNumber": 1, + "OrderOnPage": 4, + "ChapterTitle": "Introducing C#", + "RawHeading": "With Visual Studio 2022 (Windows or Mac)", + "ContentHash": "ECF8", + "AnchorId": "with-visual-studio-2022-windows-or-mac", + "IndentLevel": 3, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "understanding-a-project" + ], "PagePath": [ "Chapters", "01", @@ -9,9 +111,672 @@ ], "ChapterNumber": 1, "PageNumber": 1, - "ChapterTitle": "Hello World", - "RawHeading": "Local Development Placeholder", - "AnchorId": "helloworld", - "IndentLevel": 0 + "OrderOnPage": 5, + "ChapterTitle": "Introducing C#", + "RawHeading": "Understanding a Project", + "ContentHash": "E9E5", + "AnchorId": "understanding-a-project", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "compilation-and-execution" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "01.html" + ], + "ChapterNumber": 1, + "PageNumber": 1, + "OrderOnPage": 6, + "ChapterTitle": "Introducing C#", + "RawHeading": "Compilation and Execution", + "ContentHash": "A4C6", + "AnchorId": "compilation-and-execution", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "essential-c-source-code" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "01.html" + ], + "ChapterNumber": 1, + "PageNumber": 1, + "OrderOnPage": 7, + "ChapterTitle": "Introducing C#", + "RawHeading": "Essential C# Source Code", + "ContentHash": "527F", + "AnchorId": "essential-c-source-code", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "c-syntax-fundamentals" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "02.html" + ], + "ChapterNumber": 1, + "PageNumber": 2, + "OrderOnPage": 0, + "ChapterTitle": "Introducing C#", + "RawHeading": "C# Syntax Fundamentals", + "ContentHash": "983A", + "AnchorId": "c-syntax-fundamentals", + "IndentLevel": 1, + "IncludeInSitemapXml": true + }, + { + "Keys": [ + "statements-and-statement-delimiters" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "02.html" + ], + "ChapterNumber": 1, + "PageNumber": 2, + "OrderOnPage": 1, + "ChapterTitle": "Introducing C#", + "RawHeading": "Statements and Statement Delimiters", + "ContentHash": "A624", + "AnchorId": "statements-and-statement-delimiters", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "introducing-a-class-and-a-method" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "02.html" + ], + "ChapterNumber": 1, + "PageNumber": 2, + "OrderOnPage": 2, + "ChapterTitle": "Introducing C#", + "RawHeading": "Introducing a Class and a Method", + "ContentHash": "F9FF", + "AnchorId": "introducing-a-class-and-a-method", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "c-keywords" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "02.html" + ], + "ChapterNumber": 1, + "PageNumber": 2, + "OrderOnPage": 3, + "ChapterTitle": "Introducing C#", + "RawHeading": "C# Keywords", + "ContentHash": "1E24", + "AnchorId": "c-keywords", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "identifiers" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "02.html" + ], + "ChapterNumber": 1, + "PageNumber": 2, + "OrderOnPage": 4, + "ChapterTitle": "Introducing C#", + "RawHeading": "Identifiers", + "ContentHash": "8156", + "AnchorId": "identifiers", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "type-definition" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "02.html" + ], + "ChapterNumber": 1, + "PageNumber": 2, + "OrderOnPage": 5, + "ChapterTitle": "Introducing C#", + "RawHeading": "Type Definition", + "ContentHash": "FA33", + "AnchorId": "type-definition", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "main-method" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "02.html" + ], + "ChapterNumber": 1, + "PageNumber": 2, + "OrderOnPage": 6, + "ChapterTitle": "Introducing C#", + "RawHeading": "Main Method", + "ContentHash": "52B1", + "AnchorId": "main-method", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "whitespace" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "02.html" + ], + "ChapterNumber": 1, + "PageNumber": 2, + "OrderOnPage": 7, + "ChapterTitle": "Introducing C#", + "RawHeading": "Whitespace", + "ContentHash": "0151", + "AnchorId": "whitespace", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "working-with-variables" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "03.html" + ], + "ChapterNumber": 1, + "PageNumber": 3, + "OrderOnPage": 0, + "ChapterTitle": "Introducing C#", + "RawHeading": "Working with Variables", + "ContentHash": "134A", + "AnchorId": "working-with-variables", + "IndentLevel": 1, + "IncludeInSitemapXml": true + }, + { + "Keys": [ + "introducing-data-types" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "03.html" + ], + "ChapterNumber": 1, + "PageNumber": 3, + "OrderOnPage": 1, + "ChapterTitle": "Introducing C#", + "RawHeading": "Introducing Data Types", + "ContentHash": "EC83", + "AnchorId": "introducing-data-types", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "declaring-a-variable" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "03.html" + ], + "ChapterNumber": 1, + "PageNumber": 3, + "OrderOnPage": 2, + "ChapterTitle": "Introducing C#", + "RawHeading": "Declaring a Variable", + "ContentHash": "98A8", + "AnchorId": "declaring-a-variable", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "assigning-a-variable" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "03.html" + ], + "ChapterNumber": 1, + "PageNumber": 3, + "OrderOnPage": 3, + "ChapterTitle": "Introducing C#", + "RawHeading": "Assigning a Variable", + "ContentHash": "0143", + "AnchorId": "assigning-a-variable", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "using-a-variable" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "03.html" + ], + "ChapterNumber": 1, + "PageNumber": 3, + "OrderOnPage": 4, + "ChapterTitle": "Introducing C#", + "RawHeading": "Using a Variable", + "ContentHash": "8C38", + "AnchorId": "using-a-variable", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "console-input-and-output" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "04.html" + ], + "ChapterNumber": 1, + "PageNumber": 4, + "OrderOnPage": 0, + "ChapterTitle": "Introducing C#", + "RawHeading": "Console Input and Output", + "ContentHash": "C93C", + "AnchorId": "console-input-and-output", + "IndentLevel": 1, + "IncludeInSitemapXml": true + }, + { + "Keys": [ + "getting-input-from-the-console" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "04.html" + ], + "ChapterNumber": 1, + "PageNumber": 4, + "OrderOnPage": 1, + "ChapterTitle": "Introducing C#", + "RawHeading": "Getting Input from the Console", + "ContentHash": "A17C", + "AnchorId": "getting-input-from-the-console", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "writing-output-to-the-console" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "04.html" + ], + "ChapterNumber": 1, + "PageNumber": 4, + "OrderOnPage": 2, + "ChapterTitle": "Introducing C#", + "RawHeading": "Writing Output to the Console", + "ContentHash": "A935", + "AnchorId": "writing-output-to-the-console", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "comments" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "04.html" + ], + "ChapterNumber": 1, + "PageNumber": 4, + "OrderOnPage": 3, + "ChapterTitle": "Introducing C#", + "RawHeading": "Comments", + "ContentHash": "F51C", + "AnchorId": "comments", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "debugging" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "04.html" + ], + "ChapterNumber": 1, + "PageNumber": 4, + "OrderOnPage": 4, + "ChapterTitle": "Introducing C#", + "RawHeading": "Debugging", + "ContentHash": "B9AA", + "AnchorId": "debugging", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "managed-execution-and-the-common-language-infrastructure" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "05.html" + ], + "ChapterNumber": 1, + "PageNumber": 5, + "OrderOnPage": 0, + "ChapterTitle": "Introducing C#", + "RawHeading": "Managed Execution and the Common Language Infrastructure", + "ContentHash": "0B6A", + "AnchorId": "managed-execution-and-the-common-language-infrastructure", + "IndentLevel": 1, + "IncludeInSitemapXml": true + }, + { + "Keys": [ + "common-intermediate-language-and-ildasm" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "05.html" + ], + "ChapterNumber": 1, + "PageNumber": 5, + "OrderOnPage": 1, + "ChapterTitle": "Introducing C#", + "RawHeading": "Common Intermediate Language and Ildasm", + "ContentHash": "2200", + "AnchorId": "common-intermediate-language-and-ildasm", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "multiple-net-frameworks" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "06.html" + ], + "ChapterNumber": 1, + "PageNumber": 6, + "OrderOnPage": 0, + "ChapterTitle": "Introducing C#", + "RawHeading": "Multiple .NET Frameworks", + "ContentHash": "9CE9", + "AnchorId": "multiple-net-frameworks", + "IndentLevel": 1, + "IncludeInSitemapXml": true + }, + { + "Keys": [ + "application-programming-interface" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "06.html" + ], + "ChapterNumber": 1, + "PageNumber": 6, + "OrderOnPage": 1, + "ChapterTitle": "Introducing C#", + "RawHeading": "Application Programming Interface", + "ContentHash": "941F", + "AnchorId": "application-programming-interface", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "c-and-net-versioning" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "06.html" + ], + "ChapterNumber": 1, + "PageNumber": 6, + "OrderOnPage": 2, + "ChapterTitle": "Introducing C#", + "RawHeading": "C# and .NET Versioning", + "ContentHash": "3503", + "AnchorId": "c-and-net-versioning", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "chapter-1-summary" + ], + "PagePath": [ + "Chapters", + "01", + "Pages", + "07.html" + ], + "ChapterNumber": 1, + "PageNumber": 7, + "OrderOnPage": 0, + "ChapterTitle": "Introducing C#", + "RawHeading": "Chapter 1: Summary", + "ContentHash": "DE96", + "AnchorId": "chapter-1-summary", + "IndentLevel": 1, + "IncludeInSitemapXml": true + }, + { + "Keys": [ + "data-types" + ], + "PagePath": [ + "Chapters", + "02", + "Pages", + "01.html" + ], + "ChapterNumber": 2, + "PageNumber": 1, + "OrderOnPage": 0, + "ChapterTitle": "Data Types", + "RawHeading": "Overview", + "ContentHash": "61DD", + "AnchorId": "overview", + "IndentLevel": 0, + "IncludeInSitemapXml": true + }, + { + "Keys": [ + "type-name-forms" + ], + "PagePath": [ + "Chapters", + "02", + "Pages", + "01.html" + ], + "ChapterNumber": 2, + "PageNumber": 1, + "OrderOnPage": 1, + "ChapterTitle": "Data Types", + "RawHeading": "Type Name Forms", + "ContentHash": "BAB3", + "AnchorId": "type-name-forms", + "IndentLevel": 1, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "fundamental-numeric-types" + ], + "PagePath": [ + "Chapters", + "02", + "Pages", + "02.html" + ], + "ChapterNumber": 2, + "PageNumber": 2, + "OrderOnPage": 0, + "ChapterTitle": "Data Types", + "RawHeading": "Fundamental Numeric Types", + "ContentHash": "7EC2", + "AnchorId": "fundamental-numeric-types", + "IndentLevel": 1, + "IncludeInSitemapXml": true + }, + { + "Keys": [ + "integer-types" + ], + "PagePath": [ + "Chapters", + "02", + "Pages", + "02.html" + ], + "ChapterNumber": 2, + "PageNumber": 2, + "OrderOnPage": 1, + "ChapterTitle": "Data Types", + "RawHeading": "Integer Types", + "ContentHash": "FB7E", + "AnchorId": "integer-types", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "floating-point-types-float-double" + ], + "PagePath": [ + "Chapters", + "02", + "Pages", + "02.html" + ], + "ChapterNumber": 2, + "PageNumber": 2, + "OrderOnPage": 2, + "ChapterTitle": "Data Types", + "RawHeading": "Floating-Point Types (float, double)", + "ContentHash": "95AB", + "AnchorId": "floating-point-types-float-double", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "decimal-type" + ], + "PagePath": [ + "Chapters", + "02", + "Pages", + "02.html" + ], + "ChapterNumber": 2, + "PageNumber": 2, + "OrderOnPage": 3, + "ChapterTitle": "Data Types", + "RawHeading": "Decimal Type", + "ContentHash": "7C20", + "AnchorId": "decimal-type", + "IndentLevel": 2, + "IncludeInSitemapXml": false + }, + { + "Keys": [ + "literal-values" + ], + "PagePath": [ + "Chapters", + "02", + "Pages", + "02.html" + ], + "ChapterNumber": 2, + "PageNumber": 2, + "OrderOnPage": 4, + "ChapterTitle": "Data Types", + "RawHeading": "Literal Values", + "ContentHash": "BFB8", + "AnchorId": "literal-values", + "IndentLevel": 2, + "IncludeInSitemapXml": false } ] \ No newline at end of file diff --git a/EssentialCSharp.Web/Program.cs b/EssentialCSharp.Web/Program.cs index 6081014d..ac2a916f 100644 --- a/EssentialCSharp.Web/Program.cs +++ b/EssentialCSharp.Web/Program.cs @@ -1,49 +1,437 @@ -namespace EssentialCSharp.Web; - -public sealed class Program -{ - private static void Main(string[] args) - { - WebApplicationBuilder builder = WebApplication.CreateBuilder(args); - - // Add services to the container. - builder.Services.AddRazorPages(); - - builder.Services.AddSingleton>(sp => - { - IWebHostEnvironment _HostingEnvironment = sp.GetRequiredService(); - string path = Path.Combine(_HostingEnvironment.ContentRootPath, "Chapters", "sitemap.json"); - List? siteMappings = System.Text.Json.JsonSerializer.Deserialize>(File.OpenRead(path)); - if (siteMappings is null) - { - throw new InvalidOperationException("No table of contents found"); - } - return siteMappings; - }); - - WebApplication app = builder.Build(); - _ = app.Services.GetRequiredService>(); - // Configure the HTTP request pipeline. - if (!app.Environment.IsDevelopment()) - { - app.UseExceptionHandler("/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.UseHttpsRedirection(); - app.UseStaticFiles(); - - app.UseRouting(); - app.UseAuthorization(); - - app.MapDefaultControllerRoute(); - - app.MapControllerRoute( - name: "slug", - pattern: "{*key}", - defaults: new { controller = "Home", action = "Index" }); - - app.Run(); - } -} +using System.Threading.RateLimiting; +using EssentialCSharp.Chat.Common.Extensions; +using EssentialCSharp.Web.Areas.Identity.Data; +using EssentialCSharp.Web.Areas.Identity.Services.PasswordValidators; +using EssentialCSharp.Web.Data; +using EssentialCSharp.Web.Extensions; +using EssentialCSharp.Web.Helpers; +using EssentialCSharp.Web.Middleware; +using EssentialCSharp.Web.Services; +using EssentialCSharp.Web.Services.Referrals; +using Mailjet.Client; +using Microsoft.AspNetCore.HttpOverrides; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.AspNetCore.RateLimiting; +using Azure.Monitor.OpenTelemetry.AspNetCore; +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using OpenTelemetry; +using OpenTelemetry.Instrumentation.AspNetCore; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; + +namespace EssentialCSharp.Web; + +public partial class Program +{ + private static void Main(string[] args) + { + WebApplicationBuilder builder = WebApplication.CreateBuilder(args); + + // Health checks (liveness/readiness probes for ACA and standalone hosting) + builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]); + + // OpenTelemetry β€” two mutually exclusive export paths: + // Production: Azure Monitor (Application Insights) via APPLICATIONINSIGHTS_CONNECTION_STRING + // Local/Aspire: OTLP to Aspire Dashboard via OTEL_EXPORTER_OTLP_ENDPOINT + // Never both simultaneously β€” that would cause duplicate telemetry in App Insights. + string? appInsightsConnectionString = builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]; + bool useAzureMonitor = !string.IsNullOrWhiteSpace(appInsightsConnectionString); + bool useOtlp = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); + + builder.Logging.AddOpenTelemetry(logging => + { + logging.IncludeFormattedMessage = true; + logging.IncludeScopes = true; + }); + + // Health probe paths excluded from tracing unconditionally β€” applies to both + // manual instrumentation and Azure Monitor's auto-instrumentation. + builder.Services.Configure(options => + options.Filter = ctx => + !ctx.Request.Path.StartsWithSegments("/health") + && !ctx.Request.Path.StartsWithSegments("/alive")); + + var otel = builder.Services.AddOpenTelemetry() + .WithMetrics(metrics => + { + // Azure Monitor auto-instruments ASP.NET Core + HttpClient metrics; only add + // them manually when using OTLP so we don't register duplicate meter listeners. + if (!useAzureMonitor) + { + metrics.AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation(); + } + // Runtime metrics are not included in the Azure Monitor distro. + metrics.AddRuntimeInstrumentation(); + }) + .WithTracing(tracing => + { + tracing.AddSource(builder.Environment.ApplicationName); + // Azure Monitor distro auto-instruments tracing; add manually only for OTLP path. + if (!useAzureMonitor) + { + tracing.AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddSqlClientInstrumentation(); + } + }); + + if (useAzureMonitor) + otel.UseAzureMonitor(); + else if (useOtlp) + otel.UseOtlpExporter(); + + // HttpClient defaults β€” standard retry/circuit breaker for all named clients. + builder.Services.ConfigureHttpClientDefaults(http => http.AddStandardResilienceHandler()); + + + + builder.Services.Configure(options => + { + options.ForwardedHeaders = + ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + + // Only loopback proxies are allowed by default. + // Clear that restriction because forwarders are enabled by explicit + // configuration. + options.KnownIPNetworks.Clear(); + options.KnownProxies.Clear(); + }); + + ConfigurationManager configuration = builder.Configuration; + string connectionString = builder.Configuration.GetConnectionString("EssentialCSharpWebContextConnection") ?? throw new InvalidOperationException("Connection string 'EssentialCSharpWebContextConnection' not found."); + + // Create a logger that's accessible throughout the entire method + var loggerFactory = LoggerFactory.Create(loggingBuilder => + loggingBuilder.AddConsole().SetMinimumLevel(LogLevel.Information)); + var initialLogger = loggerFactory.CreateLogger(); + + builder.Services.AddDbContext(options => options.UseSqlServer(connectionString, sql => sql.EnableRetryOnFailure(5))); + + // Data Protection β€” persist keys in SQL Server so they survive container restarts. + // Local dev: SQL Server container with WithDataVolume keeps data between restarts. + // Production (ACA via Terraform): Azure SQL connection string injected via env vars. + // SetApplicationName ensures the discriminator is stable across container hostname changes. + // Production: if DataProtection:AzureKeyVaultKeyUri is set (Terraform injects it as + // DataProtection__AzureKeyVaultKeyUri env var), keys are wrapped with Key Vault. + // Requires: RSA key in Key Vault + managed identity with Key Vault Crypto User role. + var dpBuilder = builder.Services.AddDataProtection() + .SetApplicationName("EssentialCSharpWeb") + .PersistKeysToDbContext(); + var keyVaultKeyUri = builder.Configuration["DataProtection:AzureKeyVaultKeyUri"]; + if (!string.IsNullOrEmpty(keyVaultKeyUri)) + { + dpBuilder.ProtectKeysWithAzureKeyVault(new Uri(keyVaultKeyUri), new Azure.Identity.DefaultAzureCredential()); + } + else if (!builder.Environment.IsDevelopment()) + { + throw new InvalidOperationException( + "DataProtection:AzureKeyVaultKeyUri is required in non-Development environments. " + + "Set the DataProtection__AzureKeyVaultKeyUri environment variable to the Key Vault key URI."); + } + + builder.Services.AddDefaultIdentity(options => + { + // Password settings + options.User.RequireUniqueEmail = true; + options.Password.RequiredLength = PasswordRequirementOptions.PasswordMinimumLength; + options.Password.RequireDigit = PasswordRequirementOptions.RequireDigit; + options.Password.RequireNonAlphanumeric = PasswordRequirementOptions.RequireNonAlphanumeric; + options.Password.RequireUppercase = PasswordRequirementOptions.RequireUppercase; + options.Password.RequireLowercase = PasswordRequirementOptions.RequireLowercase; + options.Password.RequiredUniqueChars = PasswordRequirementOptions.RequiredUniqueChars; + + options.SignIn.RequireConfirmedEmail = true; + options.SignIn.RequireConfirmedAccount = true; + + options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30); + options.Lockout.MaxFailedAccessAttempts = 3; + + //TODO: Implement IProtectedUserStore + //options.Stores.ProtectPersonalData = true; + }) + .AddEntityFrameworkStores() + .AddPasswordValidator>() + .AddPasswordValidator>(); + + builder.Configuration + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .AddUserSecrets() + .AddEnvironmentVariables(); + + builder.Services.ConfigureApplicationCookie(options => + { + options.Cookie.HttpOnly = true; + options.ExpireTimeSpan = TimeSpan.FromMinutes(60); + options.SlidingExpiration = true; + // API endpoints must return 401/403 instead of redirecting to the login page. + // Cookie auth's default behavior (302 redirect) causes fetch() to follow the + // redirect, eventually hitting the fallback controller and returning a 404. + options.Events.OnRedirectToLogin = context => + { + if (context.Request.Path.StartsWithSegments("/api")) + context.Response.StatusCode = StatusCodes.Status401Unauthorized; + else + context.Response.Redirect(context.RedirectUri); + return Task.CompletedTask; + }; + options.Events.OnRedirectToAccessDenied = context => + { + if (context.Request.Path.StartsWithSegments("/api")) + context.Response.StatusCode = StatusCodes.Status403Forbidden; + else + context.Response.Redirect(context.RedirectUri); + return Task.CompletedTask; + }; + }); + + builder.Services.Configure(option => + { + // https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2 + // Minimum recommended is currently 210,000 iterations for pdkdf2-sha512 as of October 27, 2023 + option.IterationCount = 500000; + }); + builder.Services.AddScoped>(provider => + { + if (!provider.GetRequiredService>().SupportsUserEmail) + { + throw new NotSupportedException("The default UI requires a user store with email support."); + } + return (IUserEmailStore)provider.GetRequiredService>(); + }); + + builder.Services.AddScoped>(provider => + { + if (provider.GetRequiredService>() is IUserPasswordStore userPasswordStore) + { + return userPasswordStore; + } + throw new NotSupportedException("The default UI requires a user store with password support."); + }); + + //TODO: Implement the anti-forgery token with every POST/PUT request: https://learn.microsoft.com/en-us/aspnet/core/security/anti-request-forgery + + if (!builder.Environment.IsDevelopment()) + { + builder.Services.AddTransient(); + } + builder.Services.Configure(builder.Configuration.GetSection(AuthMessageSenderOptions.AuthMessageSender)); + + // Add services to the container. + builder.Services.AddRazorPages(); + builder.Services.AddCaptchaService(builder.Configuration.GetSection(CaptchaOptions.CaptchaSender)); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddHostedService(); + builder.Services.AddScoped(); + + // Add AI Chat services + if (!builder.Environment.IsDevelopment()) + { + builder.Services.AddAzureOpenAIServices(configuration); + } + + // Add Rate Limiting for API endpoints + builder.Services.AddRateLimiter(options => + { + // Global rate limiter for authenticated users by username, anonymous by IP + options.GlobalLimiter = PartitionedRateLimiter.Create(httpContext => + { + var partitionKey = httpContext.User.Identity?.IsAuthenticated == true + ? httpContext.User.Identity.Name ?? "unknown-user" + : httpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown-ip"; + + return RateLimitPartition.GetFixedWindowLimiter( + partitionKey: partitionKey, + factory: _ => new FixedWindowRateLimiterOptions + { + PermitLimit = 30, // requests per window + Window = TimeSpan.FromMinutes(1), // minute window + QueueProcessingOrder = QueueProcessingOrder.OldestFirst, + QueueLimit = 0 // No queuing - immediate rejection for better UX + }); + }); + + options.AddFixedWindowLimiter("ChatEndpoint", rateLimiterOptions => + { + rateLimiterOptions.PermitLimit = 15; // chat messages per window (reasonable limit) + rateLimiterOptions.Window = TimeSpan.FromMinutes(1); // minute window + rateLimiterOptions.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; + rateLimiterOptions.QueueLimit = 0; // No queuing to make rate limiting immediate + }); + + options.AddFixedWindowLimiter("Anonymous", rateLimiterOptions => + { + rateLimiterOptions.PermitLimit = 5; // requests per window for anonymous users + rateLimiterOptions.Window = TimeSpan.FromMinutes(1); + rateLimiterOptions.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; + rateLimiterOptions.QueueLimit = 0; // No queuing for anonymous users + }); + + // Custom response when rate limit is exceeded + options.OnRejected = async (context, cancellationToken) => + { + if (context.HttpContext.Request.Path.StartsWithSegments("/.well-known")) + { + return; + } + context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests; + context.HttpContext.Response.Headers.RetryAfter = "60"; + if (context.HttpContext.Request.Path.StartsWithSegments("/api/chat")) + { + // Custom rejection handling logic + context.HttpContext.Response.ContentType = "application/json"; + + var errorResponse = new + { + error = "Rate limit exceeded. Please wait before sending another message.", + retryAfter = 60, + requiresCaptcha = true, + statusCode = 429 + }; + + await context.HttpContext.Response.WriteAsync( + System.Text.Json.JsonSerializer.Serialize(errorResponse), + cancellationToken); + + // Optional logging + initialLogger.LogWarning("Rate limit exceeded for user: {User}, IP: {IpAddress}", + context.HttpContext.User.Identity?.Name ?? "anonymous", + context.HttpContext.Connection.RemoteIpAddress); + return; + } + + await context.HttpContext.Response.WriteAsync("Rate limit exceeded. Please try again later.", cancellationToken); + + // Optional logging + initialLogger.LogWarning("Rate limit exceeded for user: {User}, IP: {IpAddress}", + context.HttpContext.User.Identity?.Name ?? "anonymous", + context.HttpContext.Connection.RemoteIpAddress); + }; + }); + + if (!builder.Environment.IsDevelopment()) + { + builder.Services.AddHttpClient(client => + { + //set BaseAddress, MediaType, UserAgent + client.SetDefaultSettings(); + + client.UseBasicAuthentication(configuration["AuthMessageSender:APIKey"], configuration["AuthMessageSender:SecretKey"]); + }); + } + + if (!builder.Environment.IsDevelopment()) + { + builder.Services.AddAuthentication() + .AddMicrosoftAccount(microsoftoptions => + { + microsoftoptions.ClientId = configuration["authentication:microsoft:clientid"] ?? throw new InvalidOperationException("authentication:microsoft:clientid unexpectedly null"); + microsoftoptions.ClientSecret = configuration["authentication:microsoft:clientsecret"] ?? throw new InvalidOperationException("authentication:microsoft:clientsecret unexpectedly null"); + }) + .AddGitHub(o => + { + o.ClientId = configuration["authentication:github:clientId"] ?? throw new InvalidOperationException("github:clientId unexpectedly null"); + o.ClientSecret = configuration["authentication:github:clientSecret"] ?? throw new InvalidOperationException("github:clientSecret unexpectedly null"); + + // Grants access to read a user's profile data. + // https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps + o.Scope.Add("read:user"); + }); + } + + loggerFactory.Dispose(); + + WebApplication app = builder.Build(); + // Configure the HTTP request pipeline. + if (!app.Environment.IsDevelopment()) + { + app.UseExceptionHandler(exceptionApp => + { + exceptionApp.Run(async context => + { + var exceptionFeature = context.Features.Get(); + var logger = context.RequestServices.GetRequiredService>(); + logger.LogError(exceptionFeature?.Error, "Unhandled exception on {Path}", context.Request.Path); + + if (context.Request.Path.StartsWithSegments("/api")) + { + context.Response.StatusCode = 500; + context.Response.ContentType = "application/json"; + await context.Response.WriteAsJsonAsync(new { error = "An unexpected error occurred" }); + } + else + { + context.Response.Redirect("/Home/Error?statusCode=500"); + } + }); + }); + app.UseForwardedHeaders(); + app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder() + .AddDefaultSecurePolicy()); + } + else + { + app.UseDeveloperExceptionPage(); + app.UseForwardedHeaders(); + } + + app.MapHealthChecks("/health"); + app.MapHealthChecks("/alive", new HealthCheckOptions + { + Predicate = r => r.Tags.Contains("live") + }); + + if (app.Environment.IsDevelopment()) + { + app.UseHttpsRedirection(); + } + app.UseStaticFiles(); + + app.UseRouting(); + + app.UseAuthentication(); + app.UseAuthorization(); + + app.UseRateLimiter(); + + app.UseMiddleware(); + + app.MapRazorPages(); + app.MapDefaultControllerRoute(); + + app.MapFallbackToController("Index", "Home"); + + // Generate sitemap.xml at startup + var wwwrootDirectory = new DirectoryInfo(app.Environment.WebRootPath); + var siteMappingService = app.Services.GetRequiredService(); + var logger = app.Services.GetRequiredService>(); + + // Extract base URL from configuration + var baseUrl = configuration.GetSection("SiteSettings")["BaseUrl"] ?? "https://essentialcsharp.com"; + + try + { + // Create a scope to resolve scoped services + var routeConfigurationService = app.Services.GetRequiredService(); + + SitemapXmlHelpers.EnsureSitemapHealthy(siteMappingService.SiteMappings.ToList()); + SitemapXmlHelpers.GenerateAndSerializeSitemapXml(wwwrootDirectory, siteMappingService.SiteMappings.ToList(), initialLogger, routeConfigurationService, baseUrl); + logger.LogInformation("Sitemap.xml generation completed successfully during application startup"); + } + catch (Exception ex) + { + logger.LogError(ex, "Failed to generate sitemap.xml during application startup"); + // Continue startup even if sitemap generation fails + } + + app.Run(); + } +} diff --git a/EssentialCSharp.Web/Properties/launchSettings.json b/EssentialCSharp.Web/Properties/launchSettings.json index ac233b23..dc0f481a 100644 --- a/EssentialCSharp.Web/Properties/launchSettings.json +++ b/EssentialCSharp.Web/Properties/launchSettings.json @@ -19,6 +19,13 @@ "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" } }, + "Docker": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}", + "publishAllPorts": true, + "useSSL": true + }, "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, diff --git a/EssentialCSharp.Web/Properties/serviceDependencies.json b/EssentialCSharp.Web/Properties/serviceDependencies.json new file mode 100644 index 00000000..f21a76d7 --- /dev/null +++ b/EssentialCSharp.Web/Properties/serviceDependencies.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "mssql1": { + "type": "mssql", + "connectionId": "ConnectionStrings:EssentialCSharpWebContextConnection" + } + } +} \ No newline at end of file diff --git a/EssentialCSharp.Web/Properties/serviceDependencies.local.json b/EssentialCSharp.Web/Properties/serviceDependencies.local.json new file mode 100644 index 00000000..578f9754 --- /dev/null +++ b/EssentialCSharp.Web/Properties/serviceDependencies.local.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "mssql1": { + "type": "mssql.local", + "connectionId": "ConnectionStrings:EssentialCSharpWebContextConnection" + } + } +} \ No newline at end of file diff --git a/EssentialCSharp.Web/Services/AuthMessageSenderOptions.cs b/EssentialCSharp.Web/Services/AuthMessageSenderOptions.cs new file mode 100644 index 00000000..1186d124 --- /dev/null +++ b/EssentialCSharp.Web/Services/AuthMessageSenderOptions.cs @@ -0,0 +1,10 @@ +ο»Ώnamespace EssentialCSharp.Web.Services; + +public class AuthMessageSenderOptions +{ + public const string AuthMessageSender = "AuthMessageSender"; + public string? APIKey { get; set; } + public string? SecretKey { get; set; } + public string? SendFromEmail { get; set; } + public string? SendFromName { get; set; } +} diff --git a/EssentialCSharp.Web/Services/CaptchaOptions.cs b/EssentialCSharp.Web/Services/CaptchaOptions.cs new file mode 100644 index 00000000..32ac4397 --- /dev/null +++ b/EssentialCSharp.Web/Services/CaptchaOptions.cs @@ -0,0 +1,28 @@ +namespace EssentialCSharp.Web.Services; + +public class CaptchaOptions +{ + public const string CaptchaSender = "HCaptcha"; + public required string SecretKey { get; set; } + public required string SiteKey { get; set; } + + /// + /// The hCaptcha base URL + /// + public string ApiBaseUrl { get; set; } = "https://hcaptcha.com/"; + + /// + /// The HTTP Post Form Key to get the token from + /// + public const string HttpPostResponseKeyName = "h-captcha-response"; + + /// + /// if true client IP is passed to hCaptcha token verification + /// + public bool VerifyRemoteIp { get; set; } = true; + + /// + /// Full Url to hCaptchy JavaScript + /// + public string JavaScriptUrl { get; set; } = "https://hcaptcha.com/1/api.js"; +} diff --git a/EssentialCSharp.Web/Services/CaptchaService.cs b/EssentialCSharp.Web/Services/CaptchaService.cs new file mode 100644 index 00000000..0c67e74f --- /dev/null +++ b/EssentialCSharp.Web/Services/CaptchaService.cs @@ -0,0 +1,52 @@ +using System.Text.Json; +using EssentialCSharp.Web.Models; +using Microsoft.Extensions.Options; + +namespace EssentialCSharp.Web.Services; + +public class CaptchaService(IHttpClientFactory clientFactory, IOptions optionsAccessor) : ICaptchaService +{ + private IHttpClientFactory ClientFactory { get; } = clientFactory; + private CaptchaOptions Options { get; } = optionsAccessor.Value; + + // Verify captcha. Optionally add overload to pass in remoteIp as in the docs + // https://docs.hcaptcha.com/#verify-the-user-response-server-side + public async Task VerifyAsync(string secret, string response, string sitekey, CancellationToken cancellationToken = default) + { + // create post data + List> postData = + [ + new KeyValuePair("secret", secret), + new KeyValuePair("response", response), + new KeyValuePair("sitekey", sitekey) + ]; + + return await PostVerification(postData, cancellationToken); + } + + public async Task VerifyAsync(string? response, CancellationToken cancellationToken = default) + { + if (string.IsNullOrWhiteSpace(response)) + { + return null; + } + string secret = Options.SecretKey ?? throw new InvalidOperationException($"{CaptchaOptions.CaptchaSender} {nameof(Options.SecretKey)} is unexpectedly null"); + string sitekey = Options.SiteKey ?? throw new InvalidOperationException($"{CaptchaOptions.CaptchaSender} {nameof(Options.SiteKey)} is unexpectedly null"); + + return await VerifyAsync(secret, response, sitekey, cancellationToken); + } + + public async Task PostVerification(List> postData, CancellationToken cancellationToken = default) + { + HttpClient client = ClientFactory.CreateClient("hCaptcha"); + + // request api + // hCaptcha wants URL-encoded POST; base url is given in IHttpClientFactory service registration + using FormUrlEncodedContent content = new(postData); + HttpResponseMessage res = await client.PostAsync("/siteverify", content, cancellationToken); + + res.EnsureSuccessStatusCode(); + // convert JSON string into Class + return JsonSerializer.Deserialize(await res.Content.ReadAsStringAsync(cancellationToken)); + } +} diff --git a/EssentialCSharp.Web/Services/EmailSender.cs b/EssentialCSharp.Web/Services/EmailSender.cs new file mode 100644 index 00000000..e6ec577e --- /dev/null +++ b/EssentialCSharp.Web/Services/EmailSender.cs @@ -0,0 +1,51 @@ +ο»Ώusing Mailjet.Client; +using Mailjet.Client.Resources; +using Mailjet.Client.TransactionalEmails; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.Extensions.Options; + +namespace EssentialCSharp.Web.Services; + +public class EmailSender(IMailjetClient mailjetClient, IOptions options, + ILogger logger) : IEmailSender +{ + private readonly ILogger _Logger = logger; + + private AuthMessageSenderOptions Options { get; } = options.Value; + + public async Task SendEmailAsync(string email, string subject, string htmlMessage) + { + await Execute(subject, email, htmlMessage); + } + + public async Task Execute(string subject, string toEmail, string message) + { + MailjetRequest request = new() + { + Resource = Send.Resource, + }; + + // construct your email with builder + TransactionalEmail email = new TransactionalEmailBuilder() + .WithFrom(new SendContact(Options.SendFromEmail, Options.SendFromName)) + .WithSubject(subject) + .WithHtmlPart(message) + .WithTo(new SendContact(toEmail)) + .Build(); + + // invoke API to send email + Mailjet.Client.TransactionalEmails.Response.TransactionalEmailResponse response = await mailjetClient.SendTransactionalEmailAsync(email); + switch (response.Messages.Length) + { + case 0: + _Logger.LogError("Unexpectedly no messages returned in the mailer response"); + break; + case 1 when response.Messages.First().Status == "success": + _Logger.LogInformation("Email to queued successfully!"); + break; + default: + _Logger.LogError("Failure To Send Email"); + break; + } + } +} diff --git a/EssentialCSharp.Web/Services/ICaptchaService.cs b/EssentialCSharp.Web/Services/ICaptchaService.cs new file mode 100644 index 00000000..7df06b2b --- /dev/null +++ b/EssentialCSharp.Web/Services/ICaptchaService.cs @@ -0,0 +1,9 @@ +ο»Ώusing EssentialCSharp.Web.Models; + +namespace EssentialCSharp.Web.Services; + +public interface ICaptchaService +{ + Task VerifyAsync(string secret, string response, string sitekey, CancellationToken cancellationToken = default); + Task VerifyAsync(string? response, CancellationToken cancellationToken = default); +} diff --git a/EssentialCSharp.Web/Services/IListingSourceCodeService.cs b/EssentialCSharp.Web/Services/IListingSourceCodeService.cs new file mode 100644 index 00000000..28aa04a0 --- /dev/null +++ b/EssentialCSharp.Web/Services/IListingSourceCodeService.cs @@ -0,0 +1,9 @@ +using EssentialCSharp.Web.Models; + +namespace EssentialCSharp.Web.Services; + +public interface IListingSourceCodeService +{ + Task GetListingAsync(int chapterNumber, int listingNumber); + Task> GetListingsByChapterAsync(int chapterNumber); +} diff --git a/EssentialCSharp.Web/Services/IRouteConfigurationService.cs b/EssentialCSharp.Web/Services/IRouteConfigurationService.cs new file mode 100644 index 00000000..b22b1f0a --- /dev/null +++ b/EssentialCSharp.Web/Services/IRouteConfigurationService.cs @@ -0,0 +1,6 @@ +namespace EssentialCSharp.Web.Services; + +public interface IRouteConfigurationService +{ + IReadOnlySet GetStaticRoutes(); +} diff --git a/EssentialCSharp.Web/Services/ISiteMappingService.cs b/EssentialCSharp.Web/Services/ISiteMappingService.cs new file mode 100644 index 00000000..f754eaa3 --- /dev/null +++ b/EssentialCSharp.Web/Services/ISiteMappingService.cs @@ -0,0 +1,7 @@ +namespace EssentialCSharp.Web.Services; + +public interface ISiteMappingService +{ + IList SiteMappings { get; } + IEnumerable GetTocData(); +} diff --git a/EssentialCSharp.Web/Services/ListingSourceCodeService.cs b/EssentialCSharp.Web/Services/ListingSourceCodeService.cs new file mode 100644 index 00000000..a586023f --- /dev/null +++ b/EssentialCSharp.Web/Services/ListingSourceCodeService.cs @@ -0,0 +1,134 @@ +using System.Globalization; +using System.Text.RegularExpressions; +using EssentialCSharp.Web.Models; +using Microsoft.Extensions.FileProviders; + +namespace EssentialCSharp.Web.Services; + +public partial class ListingSourceCodeService : IListingSourceCodeService, IDisposable +{ + private readonly IFileProvider _FileProvider; + private readonly bool _OwnsFileProvider; + private readonly string _ChapterDirectoryPrefix; + private readonly ILogger _Logger; + + public ListingSourceCodeService(IWebHostEnvironment webHostEnvironment, ILogger logger, IConfiguration configuration) + { + _Logger = logger; + + string? listingSourceCodePath = configuration["LISTING_SOURCE_CODE_PATH"]; + if (!string.IsNullOrEmpty(listingSourceCodePath) && Directory.Exists(listingSourceCodePath)) + { + _FileProvider = new PhysicalFileProvider(listingSourceCodePath); + _OwnsFileProvider = true; + _ChapterDirectoryPrefix = "src"; + _Logger.LogInformation("Using listing source code from: {Path}", listingSourceCodePath); + } + else + { + _FileProvider = webHostEnvironment.ContentRootFileProvider; + _ChapterDirectoryPrefix = "ListingSourceCode/src"; + } + } + + public void Dispose() + { + if (_OwnsFileProvider && _FileProvider is IDisposable disposable) + disposable.Dispose(); + GC.SuppressFinalize(this); + } + + public async Task GetListingAsync(int chapterNumber, int listingNumber) + { + string chapterDirectory = $"{_ChapterDirectoryPrefix}/Chapter{chapterNumber:D2}"; + IDirectoryContents directoryContents = _FileProvider.GetDirectoryContents(chapterDirectory); + + if (!directoryContents.Exists) + { + _Logger.LogWarning("Chapter directory not found: {ChapterDirectory}", chapterDirectory); + return null; + } + + string pattern = $"{chapterNumber:D2}.{listingNumber:D2}.*"; + IFileInfo? matchingFile = directoryContents + .Where(f => !f.IsDirectory) + .FirstOrDefault(f => IsMatch(f.Name, pattern)); + + if (matchingFile == null) + { + _Logger.LogWarning("Listing file not found: {Pattern} in {ChapterDirectory}", pattern, chapterDirectory); + return null; + } + + string content = await ReadFileContentAsync(matchingFile); + string extension = Path.GetExtension(matchingFile.Name).TrimStart('.'); + + return new ListingSourceCodeResponse( + chapterNumber, + listingNumber, + extension, + content + ); + } + + public async Task> GetListingsByChapterAsync(int chapterNumber) + { + string chapterDirectory = $"{_ChapterDirectoryPrefix}/Chapter{chapterNumber:D2}"; + IDirectoryContents directoryContents = _FileProvider.GetDirectoryContents(chapterDirectory); + + if (!directoryContents.Exists) + { + _Logger.LogWarning("Chapter directory not found: {ChapterDirectory}", chapterDirectory); + return Array.Empty(); + } + + // Regex to match files like "01.01.cs" or "23.15.xml" + Regex listingFileRegex = ListingFilePattern(); + + var matchedFiles = directoryContents + .Where(f => !f.IsDirectory) + .Select(f => new { File = f, Match = listingFileRegex.Match(f.Name) }) + .Where(x => x.Match.Success) + .Select(x => new + { + x.File, + ChapterNumber = int.Parse(x.Match.Groups[1].Value, CultureInfo.InvariantCulture), + ListingNumber = int.Parse(x.Match.Groups[2].Value, CultureInfo.InvariantCulture), + Extension = x.Match.Groups[3].Value + }) + .Where(x => x.ChapterNumber == chapterNumber); + + var results = new List(); + + foreach (var item in matchedFiles) + { + string content = await ReadFileContentAsync(item.File); + + results.Add(new ListingSourceCodeResponse( + item.ChapterNumber, + item.ListingNumber, + item.Extension, + content + )); + } + + return results.OrderBy(r => r.ListingNumber).ToList(); + } + + private static async Task ReadFileContentAsync(IFileInfo file) + { + using Stream stream = file.CreateReadStream(); + using StreamReader reader = new(stream); + return await reader.ReadToEndAsync(); + } + + private static bool IsMatch(string fileName, string pattern) + { + // Convert glob-like pattern to regex (simple version for our use case) + string regexPattern = "^" + Regex.Escape(pattern).Replace("\\*", ".*") + "$"; + return Regex.IsMatch(fileName, regexPattern); + } + + [GeneratedRegex(@"^(\d{2})\.(\d{2})\.(\w+)$")] + private static partial Regex ListingFilePattern(); +} diff --git a/EssentialCSharp.Web/Services/PasswordRequirementOptions.cs b/EssentialCSharp.Web/Services/PasswordRequirementOptions.cs new file mode 100644 index 00000000..057e00e0 --- /dev/null +++ b/EssentialCSharp.Web/Services/PasswordRequirementOptions.cs @@ -0,0 +1,12 @@ +ο»Ώnamespace EssentialCSharp.Web.Services; + +internal static class PasswordRequirementOptions +{ + public const int PasswordMinimumLength = 10; + public const int PasswordMaximumLength = 100; + public const bool RequireDigit = true; + public const bool RequireNonAlphanumeric = true; + public const bool RequireUppercase = true; + public const bool RequireLowercase = true; + public const int RequiredUniqueChars = 6; +} diff --git a/EssentialCSharp.Web/Services/Referrals/IReferralService.cs b/EssentialCSharp.Web/Services/Referrals/IReferralService.cs new file mode 100644 index 00000000..80bd8ccd --- /dev/null +++ b/EssentialCSharp.Web/Services/Referrals/IReferralService.cs @@ -0,0 +1,11 @@ +ο»Ώusing System.Security.Claims; +using EssentialCSharp.Web.Areas.Identity.Data; + +namespace EssentialCSharp.Web.Services.Referrals; + +public interface IReferralService +{ + void TrackReferralAsync(string referralId, ClaimsPrincipal? user); + Task GetReferralIdAsync(string userId); + Task EnsureReferralIdAsync(EssentialCSharpWebUser? user); +} diff --git a/EssentialCSharp.Web/Services/Referrals/ReferralService.cs b/EssentialCSharp.Web/Services/Referrals/ReferralService.cs new file mode 100644 index 00000000..4d0e1325 --- /dev/null +++ b/EssentialCSharp.Web/Services/Referrals/ReferralService.cs @@ -0,0 +1,86 @@ +using System.Security.Claims; +using EssentialCSharp.Web.Areas.Identity.Data; +using EssentialCSharp.Web.Data; +using EssentialCSharp.Web.Extensions; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using Microsoft.IdentityModel.Tokens; + +namespace EssentialCSharp.Web.Services.Referrals; + +public class ReferralService(EssentialCSharpWebContext dbContext, UserManager userManager) : IReferralService +{ + public async Task GetReferralIdAsync(string userId) + { + EssentialCSharpWebUser? user = await userManager.FindByIdAsync(userId); + return await EnsureReferralIdAsync(user); + } + + /// + /// Ensure that the user has a referral ID. If the user does not have a referral ID, generate one and save it to the user. + /// + /// + /// + public async Task EnsureReferralIdAsync(EssentialCSharpWebUser? user) + { + if (user is null) + { + return null; + } + else + { + // Check if the user already has a referrer ID + string? referrerId = dbContext.UserClaims.FirstOrDefault(claim => claim.UserId == user.Id && claim.ClaimType == ClaimsExtensions.ReferrerIdClaimType)?.ClaimValue; + if (!string.IsNullOrEmpty(referrerId)) + { + // Add the referrer ID to the user's claims if it does not exist + if (!(await userManager.GetClaimsAsync(user)).Any(claim => claim.Type == ClaimsExtensions.ReferrerIdClaimType)) + { + await userManager.AddClaimAsync(user, new Claim(ClaimsExtensions.ReferrerIdClaimType, referrerId)); + } + return referrerId; + } + else + { + do + { + referrerId = Base64UrlEncoder.Encode(Guid.NewGuid().ToByteArray())[..8]; + } + while (dbContext.UserClaims.Any(claim => claim.ClaimType == ClaimsExtensions.ReferrerIdClaimType && claim.ClaimValue == referrerId)); + + await userManager.AddClaimAsync(user, new Claim(ClaimsExtensions.ReferrerIdClaimType, referrerId)); + return referrerId; + } + } + } + + /// + /// Track the referral in the database. + /// + /// The referrer ID to track. + /// True if the referral was successfully tracked, otherwise false. + public void TrackReferralAsync(string referralId, ClaimsPrincipal? user) + { + // Check if the referrer ID exists in the claims principal + string? claimsReferrerId = user?.GetReferrerId(); + + if (claimsReferrerId == referralId) + { + // If the referrer ID in the claims principal matches the referral ID, do not track the referral + return; + } + + TrackReferral(dbContext, referralId); + } + + private static void TrackReferral(EssentialCSharpWebContext dbContext, string referralId) + { + var userClaim = dbContext.UserClaims.FirstOrDefault(claim => claim.ClaimType == ClaimsExtensions.ReferrerIdClaimType && claim.ClaimValue == referralId); + if (userClaim is null) + { + return; + } + + dbContext.Users.Where(user => user.Id == userClaim.UserId).ExecuteUpdate(setters => setters.SetProperty(b => b.ReferralCount, b => b.ReferralCount + 1)); + } +} diff --git a/EssentialCSharp.Web/Services/RouteConfigurationService.cs b/EssentialCSharp.Web/Services/RouteConfigurationService.cs new file mode 100644 index 00000000..c1d75983 --- /dev/null +++ b/EssentialCSharp.Web/Services/RouteConfigurationService.cs @@ -0,0 +1,62 @@ +using Microsoft.AspNetCore.Mvc.Infrastructure; + +namespace EssentialCSharp.Web.Services; + +public class RouteConfigurationService : IRouteConfigurationService +{ + private readonly IActionDescriptorCollectionProvider _ActionDescriptorCollectionProvider; + private readonly HashSet _StaticRoutes; + + public RouteConfigurationService(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider) + { + _ActionDescriptorCollectionProvider = actionDescriptorCollectionProvider; + _StaticRoutes = ExtractStaticRoutes(); + } + + public IReadOnlySet GetStaticRoutes() + { + return _StaticRoutes; + } + + private HashSet ExtractStaticRoutes() + { + var routes = new HashSet(StringComparer.OrdinalIgnoreCase); + + // Get all action descriptors + var actionDescriptors = _ActionDescriptorCollectionProvider.ActionDescriptors.Items; + + foreach (var actionDescriptor in actionDescriptors) + { + // Look for route attributes + if (actionDescriptor.AttributeRouteInfo?.Template != null) + { + string template = actionDescriptor.AttributeRouteInfo.Template; + + // Remove leading slash and add to our set + string routePath = template.TrimStart('/').ToLowerInvariant(); + routes.Add(routePath); + } + + // Skip the default fallback route (Index action in HomeController) + if (actionDescriptor.RouteValues.TryGetValue("action", out var action) && action == "Index") + continue; + + // Skip Error actions + if (action == "Error") + continue; + + // For actions without attribute routes, use conventional routing + if (actionDescriptor.AttributeRouteInfo?.Template == null && + actionDescriptor.RouteValues.TryGetValue("action", out var actionName) && + actionDescriptor.RouteValues.TryGetValue("controller", out var controllerName) && + controllerName?.Equals("Home", StringComparison.OrdinalIgnoreCase) == true && + actionName != null) + { + // Use the action name directly as the route + routes.Add(actionName.ToLowerInvariant()); + } + } + + return routes; + } +} diff --git a/EssentialCSharp.Web/Services/SiteMappingDto.cs b/EssentialCSharp.Web/Services/SiteMappingDto.cs new file mode 100644 index 00000000..3b7ba91f --- /dev/null +++ b/EssentialCSharp.Web/Services/SiteMappingDto.cs @@ -0,0 +1,12 @@ +ο»Ώnamespace EssentialCSharp.Web.Services; + +// Data transfer object to pass necessary SiteMapping data info +// to frontend for use in table of contents +public class SiteMappingDto +{ + public required int Level { get; set; } + public required string Key { get; set; } + public required string Href { get; set; } + public required string Title { get; set; } + public required IEnumerable Items { get; set; } +} diff --git a/EssentialCSharp.Web/Services/SiteMappingService.cs b/EssentialCSharp.Web/Services/SiteMappingService.cs new file mode 100644 index 00000000..a961a0bd --- /dev/null +++ b/EssentialCSharp.Web/Services/SiteMappingService.cs @@ -0,0 +1,52 @@ +using System.Globalization; + +namespace EssentialCSharp.Web.Services; + +public class SiteMappingService : ISiteMappingService +{ + public IList SiteMappings { get; } + + public SiteMappingService(IWebHostEnvironment webHostEnvironment) + { + string path = Path.Join(webHostEnvironment.ContentRootPath, "Chapters", "sitemap.json"); + List? siteMappings = System.Text.Json.JsonSerializer.Deserialize>(File.OpenRead(path)) ?? throw new InvalidOperationException("No table of contents found"); + SiteMappings = siteMappings; + } + public IEnumerable GetTocData() + { + return SiteMappings.GroupBy(x => x.ChapterNumber).OrderBy(x => x.Key).Select(x => + { + IEnumerable orderedGrouping = x.OrderBy(i => i.PageNumber).ThenBy(i => i.OrderOnPage); + SiteMapping firstElement = orderedGrouping.First(); + return new SiteMappingDto() + { + Level = 0, + Key = firstElement.Keys.First(), + Href = $"{firstElement.Keys.First()}#{firstElement.AnchorId}", + Title = $"Chapter {x.Key}: {firstElement.ChapterTitle}", + Items = GetItems(orderedGrouping.Skip(1), 1) + }; + } + ); + } + + private static IEnumerable GetItems(IEnumerable chapterItems, int indentLevel) + { + return chapterItems + // Examine all items up until we move up to a level higher than where we're starting, + // which would indicate that we've reached the end of the entries nested under `indentationLevel` + .TakeWhile(i => i.IndentLevel >= indentLevel) + // Of all the multi-level descendants we found, take only those at the current level that we're wanting to render. + .Where(i => i.IndentLevel == indentLevel) + .Select(i => new SiteMappingDto() + { + Level = indentLevel, + Key = i.Keys.First(), + Href = $"{i.Keys.First()}#{i.AnchorId}", + Title = i.RawHeading, + // Any children of this node will be /after/ this node, + // so skip any items that are /before/ the current node. + Items = GetItems(chapterItems.SkipWhile(q => i.Keys.First() != q.Keys.First()).Skip(1), indentLevel + 1) + }); + } +} diff --git a/EssentialCSharp.Web/Views/Home/About.cshtml b/EssentialCSharp.Web/Views/Home/About.cshtml new file mode 100644 index 00000000..81210bee --- /dev/null +++ b/EssentialCSharp.Web/Views/Home/About.cshtml @@ -0,0 +1,73 @@ +ο»Ώ@{ + ViewData["Title"] = "About"; +} + +
+

@ViewData["Title"]

+
+ +
+
+
+ Who We Are +
+

+ IntelliTect is a high-end software architecture and development consulting firm based in Spokane, Washington. +

+

+ At IntelliTect, we offer a full range of software and consulting services. + Our passion for innovation manifests itself primarily in technology and software development. +

+

+ We provide high-end architecture consulting, full life-cycle software development, and training that enables our clients to solve their most challenging problems. +

+ +
+
+
+ IntelliTect Logo +
+
+
+ +
+ +
+
+
+ + Essential C Sharp Book + +
+
+
+
+ Essential C# Book +
+

+ Check out the interactive and comprehensive guide to the C# coding language to expand your development knowledge and enhance your skill set at your own pace. The site includes everything developers need to master C# and is an excellent tool for beginners to experts. +

+ + +
+
+
+ +
+
+ Welcome to one of the most venerable and trusted franchises you could dream of in the world of C# books—and probably far beyond! +
+
+
+ From the Foreword by Mads Torgersen +
+ C# Lead Designer, Microsoft +
+
+
+
+
\ No newline at end of file diff --git a/EssentialCSharp.Web/Views/Home/Announcements.cshtml b/EssentialCSharp.Web/Views/Home/Announcements.cshtml index 5465ddc0..bc28425e 100644 --- a/EssentialCSharp.Web/Views/Home/Announcements.cshtml +++ b/EssentialCSharp.Web/Views/Home/Announcements.cshtml @@ -1,57 +1,40 @@ @{ ViewData["Title"] = "Announcements"; } -
-
-

@ViewData["Title"]

-
- -
-
-
+
+

@ViewData["Title"]

+
-
+
-

Web Features Coming Soon

+

Web Features Coming Soon

-
-
+
+

-
-
-
-
- -
-

Content Coming Soon

+

Content Coming Soon

-
-
+
+

-
- -
-
-
-
-

Recently Completed

+

Recently Completed

-
-
+
+

diff --git a/EssentialCSharp.Web/Views/Home/Guidelines.cshtml b/EssentialCSharp.Web/Views/Home/Guidelines.cshtml new file mode 100644 index 00000000..cb2a4842 --- /dev/null +++ b/EssentialCSharp.Web/Views/Home/Guidelines.cshtml @@ -0,0 +1,89 @@ +@using EssentialCSharp.Common +@{ + ViewData["Title"] = "Coding Guidelines"; + var guidelines = (List)ViewBag.Guidelines as List; +} + +
+

@ViewData["Title"]

+
+ +
+

+ C# Naming Conventions - Quick Reference Table + + + +

+
+ + + + + + + + + + + + + + + + + + + + + +
KindNaming ConventionExample
ClassesPascalCaseclass Car
Types and NamespacesPascalCasenamespace VehicleManufacturer;
ParameterscamelCasepublic Car(int odometerMileage, string manufacturer)
MethodsPascalCasepublic void StartEngine()
PropertiesPascalCasepublic double FuelLevel { get; set; }
Local VariablescamelCaseint yearManufactured;
Local FunctionsPascalCasestring CalculateMilesUntilEmpty(double fuelLevel)
Fields_PascalCaseprivate string _Day;
Enum MembersPascalCaseenum Status { Unknown, Operational, Broken, InShop }
Type ParametersTPascalCasepublic TOutput Convert<TInput, TOutput>(TInput from)
InterfacesIPascalCaseinterface ISampleInterface
+
+
+ +
+ @foreach (var group in guidelines.GroupBy(g => g.SanitizedSubsection).OrderBy(g => g.Key)) + { +

+ @group.Key + + + +

+ foreach (var guideline in group) + { +
+ + @guideline.Guideline +
+ } +
+ } +
+
+ +@functions { + private string GetSymbolForType(GuidelineType type) + { + return type switch + { + GuidelineType.DoNot => "fa fa-solid fa-x", + GuidelineType.Avoid => "fa fa-solid fa-circle-exclamation", + GuidelineType.Consider => "fa fa-solid fa-question", + GuidelineType.Do => "fa fa-solid fa-check", + _ => string.Empty, + }; + } + + private string GetColorForType(GuidelineType type) + { + return type switch + { + GuidelineType.DoNot => "#ff0000", + GuidelineType.Avoid => "#ff0000", + GuidelineType.Consider => "#7a7a7a", + GuidelineType.Do => "#63E6BE", + _ => string.Empty, + }; + } +} diff --git a/EssentialCSharp.Web/Views/Home/Home.cshtml b/EssentialCSharp.Web/Views/Home/Home.cshtml index 812017f9..5c33e127 100644 --- a/EssentialCSharp.Web/Views/Home/Home.cshtml +++ b/EssentialCSharp.Web/Views/Home/Home.cshtml @@ -1,39 +1,73 @@ -
-
+
+

Welcome to Essential C#

-

Written by Mark Michaelis with Eric Lippert & Kevin Bost

-
-
-
- +
+ +
+ +
+
+

The Comprehensive, Expert Guide to C# Language Programming

+
Written by Mark Michaelis and Benjamin Michaelis with Eric Lippert & Kevin Bost
+

+ Essential C# is a well-organized, no-fluff guide to C# for programmers at all levels of experience. + Reflecting the most important C# features from 3.0 through 12.0 and including modern programming patterns, + it will help you write code that’s simple, powerful, robust, secure, and maintainable. +

+

+ World-class C# expert Mark Michaelis and Benjamin Michaelis present a complete tutorial and reference for the entire language, + including expert coverage of key C# enhancements, C#’s use with .NET Core/.NET Standard, + and cross-platform compilation. They illustrates key C# constructs with succinct examples, + and presents best-practice coding guidelines. +

+
+
+ +
+ +
+
+
+ + Essential C Sharp Book + +
+
+
+

Essential C# Book

+

+ Check out the interactive and comprehensive guide to the C# coding language to expand your development knowledge and enhance your skill set at your own pace. The site includes everything developers need to master C# and is an excellent tool for beginners to experts. +

+ + +
+
+
+ +
+
+ Welcome to one of the most venerable and trusted franchises you could dream of in the world of C# books—and probably far beyond! +
-
- Welcome to one of the most venerable and trusted franchises you could dream of in the world of C# books—and probably far beyond! +
+ From the Foreword by Mads Torgersen +
+ C# Lead Designer, Microsoft
-
- From the Foreword by Mads Torgersen -
- C# Lead Designer, Microsoft -
-
-

The Comprehensive, Expert Guide to C# Language Programming

-

Essential C# is a well-organized, no-fluff guide to C# for programmers at all levels of experience. Reflecting the most important C# features from 3.0 through 8.0 and including modern programming patterns, it will help you write code that’s simple, powerful, robust, secure, and maintainable. World-class C# expert Mark Michaelis presents a complete tutorial and reference for the entire language, including expert coverage of key C# enhancements, C#’s use with .NET Core/.NET Standard, and cross-platform compilation. He illustrates key C# constructs with succinct examples, and presents best-practice coding guidelines.

-
- -
-
-
+
-
+

Web Features Coming Soon

-
-
+
+

@@ -42,34 +76,26 @@
-
-
-
- -
+

Content Coming Soon

-
-
+
+
-
+

-
-
-
- -
+

Recently Completed

-
-
+
+

@@ -77,12 +103,12 @@
+ - -
\ No newline at end of file +
diff --git a/EssentialCSharp.Web/Views/Home/Privacy.cshtml b/EssentialCSharp.Web/Views/Home/Privacy.cshtml deleted file mode 100644 index af4fb195..00000000 --- a/EssentialCSharp.Web/Views/Home/Privacy.cshtml +++ /dev/null @@ -1,6 +0,0 @@ -ο»Ώ@{ - ViewData["Title"] = "Privacy Policy"; -} -

@ViewData["Title"]

- -

Use this page to detail your site's privacy policy.

diff --git a/EssentialCSharp.Web/Views/Home/TermsOfService.cshtml b/EssentialCSharp.Web/Views/Home/TermsOfService.cshtml index 50226e0f..bc01affc 100644 --- a/EssentialCSharp.Web/Views/Home/TermsOfService.cshtml +++ b/EssentialCSharp.Web/Views/Home/TermsOfService.cshtml @@ -27,7 +27,7 @@
Privacy and Protection of Personal Information
-

Your privacy is important to us. Please read theIntelliTect Privacy Statementβ€―(the "Privacy Statement") as it describes the types of data we collect from you and your devices, how we use that data, and the legal bases we have to process that data.

+

Your privacy is important to us. Please read the IntelliTect Privacy Statementβ€―(the "Privacy Statement") as it describes the types of data we collect from you and your devices, how we use that data, and the legal bases we have to process that data.

diff --git a/EssentialCSharp.Web/Views/Shared/_Layout.cshtml b/EssentialCSharp.Web/Views/Shared/_Layout.cshtml index 15cad478..60cf43fc 100644 --- a/EssentialCSharp.Web/Views/Shared/_Layout.cshtml +++ b/EssentialCSharp.Web/Views/Shared/_Layout.cshtml @@ -1,13 +1,40 @@ @using EssentialCSharp.Web.Extensions @using System.Globalization +@using EssentialCSharp.Web.Services @using IntelliTect.Multitool -@inject IList _SiteMappings +@using EssentialCSharp.Common +@using Microsoft.AspNetCore.Identity +@using EssentialCSharp.Web.Areas.Identity.Data +@using Microsoft.Extensions.Options +@using Microsoft.Extensions.Configuration +@inject ISiteMappingService _SiteMappings +@inject SignInManager SignInManager +@inject IOptions CaptchaOptions +@inject IConfiguration Configuration +@using Microsoft.AspNetCore.Components +@{ + var prodMap = new ImportMapDefinition( + new Dictionary + { + { "vue", "https://cdn.jsdelivr.net/npm/vue@3.5.12/dist/vue.esm-browser.prod.js" }, + { "vue-window-size", "./lib/vue-window-size/composition-api/dist/index.js" }, + { "vuetify", "https://cdn.jsdelivr.net/npm/vuetify@3.9.2/dist/vuetify.esm.js" }, + }, null, null); + var devMap = new ImportMapDefinition( + new Dictionary + { + { "vue", "https://cdn.jsdelivr.net/npm/vue@3.5.12/dist/vue.esm-browser.js" }, + { "vue-window-size", "./lib/vue-window-size/composition-api/dist/index.js" }, + { "vuetify", "https://cdn.jsdelivr.net/npm/vuetify@3.9.2/dist/vuetify.esm.js" }, + }, null, null); +} @{ const string imageUrl = "https://essentialcsharp.com/images/icon.png"; - const string description = "Welcome to one of the most venerable and trusted franchises you could dream of in the world of C# books and probably far beyond! -Mads Torgersen, C# Lead Designer, Microsoft"; + const string description = "Accelerate your development knowledge with C# expert Mark Michaelis and Benjamin Michaelis' free, online comprehensive C# tutorial and reference that is updated through C# 11.0"; + string title = $"Essential C#{(string.IsNullOrEmpty(ViewBag.PageTitle) ? string.Empty : $": {ViewBag.PageTitle}")}"; } @@ -16,6 +43,7 @@ + @title @@ -23,11 +51,16 @@ - - Essential C# + + + + + - + + + @*Font Family*@ @@ -41,27 +74,17 @@ @*So that Safari can import modules*@ - + - + - + + + + + - + - + + + + + + + @await RenderSectionAsync("HeadAppend", required: false) -
+
-
-
+
+ + @if (!Context.Request.Path.StartsWithSegments("/Identity")) + { +
+ + + + + +
+ } + + + + + +
@@ -235,44 +651,23 @@ - @await RenderSectionAsync("Scripts", required: false) @* Recursive vue component template for rendering the table of contents. *@ @@ -281,18 +676,18 @@
{{item.title}} + 'toc-content' : item.level==0, + 'nested' : item.level> + 0, + 'current-section': currentPage.some(p => p.key == item.key), + }" :href="item.href">{{item.title}}
  • + ['indent-level-' + (item.level+1)]: true, + 'current-li' : currentPage.some(p=> + p.key == item.key) && !currentPage.some(p => p.level > item.level), + }" > - p.key == item.key) && !currentPage.some(p => p.level > item.level), - }" > + ['indent-level-' + (item.level+1)]: true, + 'current-li' : currentPage.some(p=> + p.key == item.key) && !currentPage.some(p => p.level > item.level), + }" > - diff --git a/EssentialCSharp.Web/Views/Shared/_LoginPartial.cshtml b/EssentialCSharp.Web/Views/Shared/_LoginPartial.cshtml new file mode 100644 index 00000000..bf16e4c3 --- /dev/null +++ b/EssentialCSharp.Web/Views/Shared/_LoginPartial.cshtml @@ -0,0 +1,28 @@ +ο»Ώ@using Microsoft.AspNetCore.Identity +@using EssentialCSharp.Web.Areas.Identity.Data + +@inject SignInManager SignInManager +@inject UserManager UserManager + + diff --git a/EssentialCSharp.Web/Web/SiteMapping.cs b/EssentialCSharp.Web/Web/SiteMapping.cs deleted file mode 100644 index 5deba765..00000000 --- a/EssentialCSharp.Web/Web/SiteMapping.cs +++ /dev/null @@ -1,19 +0,0 @@ -ο»Ώusing EssentialCSharp.Web.Extensions; - -namespace EssentialCSharp.Web; - -public record class SiteMapping(string Key, string[] PagePath, int ChapterNumber, int PageNumber, string ChapterTitle, string RawHeading, string? AnchorId, int IndentLevel) -{ - public static SiteMapping? Find(string key, IList siteMappings) - { - key ??= siteMappings[0].Key; - foreach (string? potentialMatch in key.GetPotentialMatches()) - { - if (siteMappings.FirstOrDefault(x => x.Key == potentialMatch) is { } siteMap) - { - return siteMap; - } - } - return null; - } -} diff --git a/EssentialCSharp.Web/appsettings.Development.json b/EssentialCSharp.Web/appsettings.Development.json index 770d3e93..f7e1d576 100644 --- a/EssentialCSharp.Web/appsettings.Development.json +++ b/EssentialCSharp.Web/appsettings.Development.json @@ -5,5 +5,11 @@ "Default": "Information", "Microsoft.AspNetCore": "Warning" } + }, + "ConnectionStrings": { + "EssentialCSharpWebContextConnection": "Server=localhost;Database=EssentialCSharp.Web;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=true;" + }, + "SiteSettings": { + "BaseUrl": "https://localhost:7184" } } diff --git a/EssentialCSharp.Web/appsettings.json b/EssentialCSharp.Web/appsettings.json index 10f68b8c..a8b6f1fc 100644 --- a/EssentialCSharp.Web/appsettings.json +++ b/EssentialCSharp.Web/appsettings.json @@ -1,9 +1,34 @@ { + "ConnectionStrings": { + "PostgresVectorStore": "your-postgres-connection-string-here" + }, "Logging": { "LogLevel": { - "Default": "Information", + "Default": "Warning", "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" -} + "AllowedHosts": "*", + "HCaptcha": { + "SecretKey": "0x0000000000000000000000000000000000000000", + "SiteKey": "10000000-ffff-ffff-ffff-000000000001" + }, + "ChatThrottling": { + "CaptchaThreshold": 10, + "ThrottlingWindowMinutes": 60, + "MaxMessagesPerWindow": 50 + }, + "AIOptions": { + "VectorGenerationDeploymentName": "text-embedding-3-large-v1", + "ChatDeploymentName": "gpt-5", + "SystemPrompt": "You are a helpful AI assistant with expertise in C# programming and the Essential C# book content. You can help users understand C# concepts, answer programming questions, and provide guidance based on the Essential C# book materials. Be concise but thorough in your explanations.", + "Endpoint": "", + "ApiKey": "" + }, + "SiteSettings": { + "BaseUrl": "https://essentialcsharp.com" + }, + "TryDotNet": { + "Origin": "" + } +} \ No newline at end of file diff --git a/EssentialCSharp.Web/wwwroot/css/chat-widget.css b/EssentialCSharp.Web/wwwroot/css/chat-widget.css new file mode 100644 index 00000000..3dec0841 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/css/chat-widget.css @@ -0,0 +1,897 @@ +/* AI Chat Widget - Vuetify Style with Enhanced Accessibility */ + +/* Screen reader only content */ +.visually-hidden { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + +/* Optimized pulse animation */ +@keyframes pulse { + 0% { + opacity: 1; + } + 50% { + transform: scale(1.05); + opacity: 0.9; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +/* Main widget container */ +.chat-widget { + position: fixed; + bottom: 24px; + right: 24px; + z-index: 1050; + font-family: 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif; +} + +/* Responsive positioning to avoid navigation conflicts */ +@media (max-width: 768px) { + .chat-widget { + bottom: 120px; /* Above mobile navigation */ + right: 16px; + } +} + +@media (min-width: 769px) { + .chat-widget { + bottom: 100px; /* Above desktop navigation */ + } +} + +/* When sidebar is visible, adjust position */ +.layout.has-sidebar .chat-widget { + right: calc(24px + 375px); +} + +/* Chat trigger button */ +.chat-button { + background: linear-gradient(135deg, #1976d2 0%, #1565c0 50%, #0d47a1 100%); + border: none; + border-radius: 28px; + color: white; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 14px 20px; + min-width: 56px; + height: 56px; + transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1); + font-size: 14px; + font-weight: 500; + text-transform: none; + letter-spacing: 0.25px; + box-shadow: + 0 3px 5px -1px rgba(0,0,0,.2), + 0 6px 10px 0 rgba(0,0,0,.14), + 0 1px 18px 0 rgba(0,0,0,.12), + 0 0 0 0 rgba(25, 118, 210, 0.4); + position: relative; + overflow: hidden; +} + +/* Add a subtle ripple effect */ +.chat-button::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + border-radius: 50%; + background: rgba(255, 255, 255, 0.1); + transition: all 0.6s ease; + transform: translate(-50%, -50%); +} + +.chat-button:hover::before { + width: 120%; + height: 120%; +} + +.chat-button:hover { + background: linear-gradient(135deg, #1565c0 0%, #0d47a1 50%, #1a237e 100%); + box-shadow: + 0 5px 5px -3px rgba(0,0,0,.2), + 0 8px 10px 1px rgba(0,0,0,.14), + 0 3px 14px 2px rgba(0,0,0,.12), + 0 0 20px rgba(25, 118, 210, 0.3); + transform: translateY(-2px) scale(1.02); +} + +.chat-button:focus { + outline: 3px solid rgba(25, 118, 210, 0.3); + outline-offset: 2px; + box-shadow: + 0 5px 5px -3px rgba(0,0,0,.2), + 0 8px 10px 1px rgba(0,0,0,.14), + 0 3px 14px 2px rgba(0,0,0,.12), + 0 0 0 3px rgba(25, 118, 210, 0.3); +} + +.chat-button:active { + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.12), 0 1px 5px 0 rgba(0,0,0,.2); +} + +.chat-button--active { + background: linear-gradient(135deg, #388e3c 0%, #2e7d32 50%, #1b5e20 100%); + animation: subtlePulse 2s ease-in-out infinite; +} + +@keyframes subtlePulse { + 0%, 100% { + box-shadow: + 0 3px 5px -1px rgba(0,0,0,.2), + 0 6px 10px 0 rgba(0,0,0,.14), + 0 1px 18px 0 rgba(0,0,0,.12), + 0 0 0 0 rgba(56, 142, 60, 0.4); + } + 50% { + box-shadow: + 0 3px 5px -1px rgba(0,0,0,.2), + 0 6px 10px 0 rgba(0,0,0,.14), + 0 1px 18px 0 rgba(0,0,0,.12), + 0 0 0 8px rgba(56, 142, 60, 0.1); + } +} + +.chat-button-text { + margin-left: 4px; + white-space: nowrap; +} + +/* Chat overlay */ +.chat-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.4); + -webkit-backdrop-filter: blur(4px); + backdrop-filter: blur(4px); + display: flex; + align-items: center; + justify-content: center; + z-index: 1055; + animation: fadeInEnhanced 250ms cubic-bezier(0.4, 0, 0.2, 1); +} + +@keyframes fadeInEnhanced { + from { + opacity: 0; + -webkit-backdrop-filter: blur(0px); + backdrop-filter: blur(0px); + } + to { + opacity: 1; + -webkit-backdrop-filter: blur(4px); + backdrop-filter: blur(4px); + } +} + +/* Chat card */ +.chat-card { + background: white; + border-radius: 16px; + width: 90vw; + max-width: 800px; + height: 80vh; + max-height: 700px; + display: flex; + flex-direction: column; + box-shadow: + 0 24px 38px 3px rgba(0,0,0,.14), + 0 9px 46px 8px rgba(0,0,0,.12), + 0 11px 15px -7px rgba(0,0,0,.2); + animation: slideUpEnhanced 350ms cubic-bezier(0.34, 1.56, 0.64, 1); + -webkit-backdrop-filter: blur(1px); + backdrop-filter: blur(1px); + border: 1px solid rgba(255, 255, 255, 0.2); +} + +/* Desktop-specific sizing for better space utilization */ +@media (min-width: 769px) { + .chat-card { + width: 80vw; + max-width: 900px; + height: 85vh; + max-height: 800px; + } +} + +@keyframes slideUpEnhanced { + 0% { + opacity: 0; + transform: translateY(30px) scale(0.95); + } + 100% { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +/* Chat header */ +.chat-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 24px 28px; + border-bottom: 1px solid rgba(0, 0, 0, 0.08); + background: linear-gradient(135deg, #f8f9fa 0%, #f1f3f4 100%); + border-radius: 16px 16px 0 0; + position: relative; +} + +.chat-header::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 1px; + background: linear-gradient(90deg, transparent 0%, rgba(25, 118, 210, 0.2) 50%, transparent 100%); +} + +.chat-title { + display: flex; + align-items: center; + margin: 0; + font-size: 20px; + font-weight: 600; + color: rgba(0, 0, 0, 0.87); + letter-spacing: 0.15px; +} + +.chat-title i { + color: #1976d2; + margin-right: 12px; + font-size: 24px; +} + +.chat-close-button { + background: rgba(0, 0, 0, 0.04); + border: none; + cursor: pointer; + padding: 10px; + border-radius: 50%; + color: rgba(0, 0, 0, 0.54); + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); + display: flex; + align-items: center; + justify-content: center; + width: 44px; + height: 44px; +} + +.chat-close-button:hover { + background: rgba(244, 67, 54, 0.08); + color: #f44336; + transform: rotate(90deg); +} + +.chat-close-button:focus { + outline: 3px solid rgba(25, 118, 210, 0.3); + outline-offset: 2px; +} + +/* Header actions container */ +.chat-header-actions { + display: flex; + align-items: center; + gap: 8px; +} + +/* Messages area */ +.chat-messages { + flex: 1; + overflow-y: auto; + padding: 16px; + display: flex; + flex-direction: column; + gap: 16px; +} + +.welcome-message { + text-align: center; + color: rgba(0, 0, 0, 0.6); + padding: 40px 24px; + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; +} + +.welcome-message i { + font-size: 56px; + color: #1976d2; + opacity: 0.8; + animation: gentleBounce 3s ease-in-out infinite; +} + +@keyframes gentleBounce { + 0%, 100% { transform: translateY(0px); } + 50% { transform: translateY(-5px); } +} + +.welcome-message p { + margin: 0; + font-size: 16px; + line-height: 1.6; + font-weight: 400; +} + +/* Login required message */ +.login-required-message { + text-align: center; + color: rgba(0, 0, 0, 0.6); + padding: 40px 24px; + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; +} + +.login-required-message i { + font-size: 56px; + color: #f57c00; + opacity: 0.8; +} + +.login-required-message h3 { + margin: 0; + font-size: 20px; + font-weight: 500; + color: rgba(0, 0, 0, 0.8); +} + +.login-required-message p { + margin: 0; + font-size: 16px; + line-height: 1.6; + font-weight: 400; +} + +.login-required-message .btn { + padding: 12px 24px; + border-radius: 24px; + font-weight: 500; + text-decoration: none; + display: inline-flex; + align-items: center; + transition: all 0.3s ease; +} + +.login-required-message .btn:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(25, 118, 210, 0.3); +} + +/* Rate limiting error message */ +.rate-limit-error { + text-align: center; + color: rgba(0, 0, 0, 0.7); + padding: 20px 24px; + margin: 16px 0; + background: linear-gradient(135deg, #fff3e0 0%, #ffecb3 100%); + border: 1px solid #ffb74d; + border-radius: 12px; + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + animation: fadeInShake 0.5s ease-out; +} + +.rate-limit-error i { + font-size: 32px; + color: #ff9800; + opacity: 0.9; +} + +.rate-limit-error h4 { + margin: 0; + font-size: 18px; + font-weight: 600; + color: #e65100; +} + +.rate-limit-error p { + margin: 0; + font-size: 14px; + line-height: 1.5; + font-weight: 400; + color: rgba(0, 0, 0, 0.8); +} + +.rate-limit-error .retry-info { + font-size: 13px; + font-weight: 500; + color: #f57c00; + background: rgba(255, 193, 7, 0.1); + padding: 8px 16px; + border-radius: 20px; + border: 1px solid rgba(255, 193, 7, 0.3); +} + +/* Shake animation for error messages */ +@keyframes fadeInShake { + 0% { + opacity: 0; + transform: translateX(-10px); + } + 50% { + opacity: 0.8; + transform: translateX(5px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +/* General error message styles */ +.error-message { + background: linear-gradient(135deg, #ffebee 0%, #ffcdd2 100%); + border: 1px solid #ef5350; + color: #c62828; + padding: 16px 20px; + margin: 12px 0; + border-radius: 8px; + font-size: 14px; + line-height: 1.5; + display: flex; + align-items: center; + gap: 10px; + animation: fadeInShake 0.5s ease-out; +} + +.error-message i { + font-size: 18px; + color: #d32f2f; + flex-shrink: 0; +} + +.error-message .message-text { + flex: 1; +} + +/* Success/info message styles for contrast */ +.success-message { + background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 100%); + border: 1px solid #66bb6a; + color: #2e7d32; + padding: 16px 20px; + margin: 12px 0; + border-radius: 8px; + font-size: 14px; + line-height: 1.5; + display: flex; + align-items: center; + gap: 10px; + animation: fadeIn 0.3s ease-out; +} + +.success-message i { + font-size: 18px; + color: #4caf50; + flex-shrink: 0; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(-5px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Message bubbles */ +.message-wrapper { + display: flex; + margin-bottom: 8px; +} + +.message-wrapper.user { + justify-content: flex-end; +} + +.message-wrapper.assistant { + justify-content: flex-start; +} + +.message-bubble { + max-width: 80%; + padding: 14px 18px; + border-radius: 20px; + word-wrap: break-word; + position: relative; + margin-bottom: 4px; +} + +.message-bubble.user { + background: linear-gradient(135deg, #1976d2 0%, #1565c0 100%); + color: white; + border-bottom-right-radius: 8px; + box-shadow: 0 2px 8px rgba(25, 118, 210, 0.3); +} + +.message-bubble.assistant { + background: #f8f9fa; + color: rgba(0, 0, 0, 0.87); + border-bottom-left-radius: 8px; + border: 1px solid rgba(0, 0, 0, 0.04); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.message-content { + font-size: 14px; + line-height: 1.4; +} + +.message-content p { + margin: 0 0 8px 0; +} + +.message-content p:last-child { + margin-bottom: 0; +} + +.message-content code { + background: rgba(0, 0, 0, 0.08); + padding: 2px 4px; + border-radius: 4px; + font-size: 13px; +} + +.message-content pre { + background: rgba(0, 0, 0, 0.08); + padding: 12px; + border-radius: 8px; + overflow-x: auto; + font-size: 13px; +} + +/* Typing indicator */ +.typing-indicator { + display: flex; + align-items: center; + gap: 8px; +} + +.typing-text { + font-size: 14px; + color: rgba(0, 0, 0, 0.6); +} + +.typing-dots { + display: flex; + gap: 4px; +} + +.typing-dots span { + width: 6px; + height: 6px; + border-radius: 50%; + background: rgba(0, 0, 0, 0.4); + animation: typingBounce 1.4s ease-in-out infinite both; +} + +.typing-dots span:nth-child(1) { animation-delay: -0.32s; } +.typing-dots span:nth-child(2) { animation-delay: -0.16s; } +.typing-dots span:nth-child(3) { animation-delay: 0s; } + +@keyframes typingBounce { + 0%, 80%, 100% { + transform: scale(0.8); + opacity: 0.5; + } + 40% { + transform: scale(1); + opacity: 1; + } +} + +/* Chat footer */ +.chat-footer { + padding: 20px 28px; + border-top: 1px solid rgba(0, 0, 0, 0.08); + background: linear-gradient(135deg, #ffffff 0%, #fafafa 100%); + border-radius: 0 0 16px 16px; +} + +.chat-form { + margin-bottom: 12px; +} + +.input-wrapper { + display: flex; + align-items: center; + background: #f8f9fa; + border-radius: 28px; + padding: 6px; + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); + border: 2px solid transparent; +} + +.input-wrapper:focus-within { + background: #f1f3f4; + border-color: rgba(25, 118, 210, 0.3); + box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.1); +} + +.chat-input { + flex: 1; + border: none; + background: none; + padding: 14px 18px; + font-size: 14px; + color: rgba(0, 0, 0, 0.87); + outline: none; + border-radius: 22px; +} + +.chat-input::placeholder { + color: rgba(0, 0, 0, 0.6); +} + +.send-button { + background: linear-gradient(135deg, #1976d2 0%, #1565c0 100%); + border: none; + border-radius: 50%; + color: white; + cursor: pointer; + width: 44px; + height: 44px; + display: flex; + align-items: center; + justify-content: center; + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); + margin-left: 8px; + box-shadow: 0 2px 4px rgba(25, 118, 210, 0.3); +} + +.send-button:hover:not(:disabled) { + background: linear-gradient(135deg, #1565c0 0%, #0d47a1 100%); + transform: scale(1.08); + box-shadow: 0 4px 8px rgba(25, 118, 210, 0.4); +} + +.send-button:active:not(:disabled) { + transform: scale(0.95); +} + +.send-button:focus { + outline: 3px solid rgba(25, 118, 210, 0.3); + outline-offset: 2px; +} + +.send-button:disabled { + background: rgba(0, 0, 0, 0.12); + color: rgba(0, 0, 0, 0.26); + cursor: not-allowed; + transform: none; +} + +/* Elevation classes for consistency with Vuetify */ +.elevation-6 { + box-shadow: 0 3px 5px -1px rgba(0,0,0,.2), 0 6px 10px 0 rgba(0,0,0,.14), 0 1px 18px 0 rgba(0,0,0,.12) !important; +} + +.elevation-12 { + box-shadow: 0 7px 8px -4px rgba(0,0,0,.2), 0 12px 17px 2px rgba(0,0,0,.14), 0 5px 22px 4px rgba(0,0,0,.12) !important; +} + +/* High contrast mode support */ +@media (prefers-contrast: high) { + .chat-button { + border: 2px solid white; + } + + .message-bubble.assistant { + border: 1px solid rgba(0, 0, 0, 0.24); + } + + .input-wrapper { + border: 1px solid rgba(0, 0, 0, 0.24); + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + .chat-button, + .chat-overlay, + .chat-card, + .send-button { + animation: none; + transition: none; + } + + .typing-dots span { + animation: none; + } +} + +/* Mobile responsiveness */ +@media (max-width: 768px) { + .chat-card { + width: 95vw; + height: 85vh; + max-width: none; + max-height: none; + margin: 8px; + } + + .chat-button-text { + display: none; + } + + .chat-button { + width: 56px; + border-radius: 50%; + padding: 0; + } + + .chat-header { + padding: 16px; + } + + .chat-footer { + padding: 12px 16px; + } +} + +/* Captcha Modal Styles */ +.captcha-modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.6); + z-index: 2000; /* Higher than chat widget */ + display: flex; + align-items: center; + justify-content: center; + -webkit-backdrop-filter: blur(3px); + backdrop-filter: blur(3px); + animation: fadeIn 0.3s ease-out; +} + +.captcha-modal-card { + background: white; + border-radius: 16px; + box-shadow: 0 24px 48px rgba(0, 0, 0, 0.2); + max-width: 480px; + width: 90%; + max-height: 90vh; + overflow-y: auto; + animation: slideInScale 0.4s ease-out; +} + +.captcha-modal-header { + padding: 24px 24px 16px; + border-bottom: 1px solid rgba(0, 0, 0, 0.12); + text-align: center; +} + +.captcha-modal-title { + margin: 0; + font-size: 20px; + font-weight: 500; + color: #1976d2; + display: flex; + align-items: center; + justify-content: center; +} + +.captcha-modal-content { + padding: 24px; + text-align: center; +} + +.captcha-explanation { + margin: 0 0 24px; + font-size: 16px; + line-height: 1.6; + color: rgba(0, 0, 0, 0.8); +} + +.captcha-widget-container { + display: flex; + justify-content: center; + margin: 24px 0; + min-height: 78px; /* hCaptcha widget height */ +} + +.captcha-help-text { + margin: 24px 0 0; + font-size: 14px; + color: rgba(0, 0, 0, 0.6); + font-style: italic; +} + +/* Modal animations */ +@keyframes slideInScale { + 0% { + opacity: 0; + transform: translate(-50%, -60%) scale(0.8); + } + 100% { + opacity: 1; + transform: translate(0, 0) scale(1); + } +} + +/* Responsive adjustments for mobile */ +@media (max-width: 480px) { + .captcha-modal-card { + width: 95%; + margin: 16px; + border-radius: 12px; + } + + .captcha-modal-header { + padding: 20px 16px 12px; + } + + .captcha-modal-content { + padding: 20px 16px; + } + + .captcha-modal-title { + font-size: 18px; + } + + .captcha-explanation { + font-size: 15px; + } +} + +/* High contrast mode support */ +@media (prefers-contrast: high) { + .captcha-modal-overlay { + background: rgba(0, 0, 0, 0.8); + } + + .captcha-modal-card { + border: 2px solid #000; + } + + .captcha-modal-header { + border-bottom-color: #000; + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + .captcha-modal-overlay, + .captcha-modal-card { + animation: none; + } + + .captcha-modal-overlay { + opacity: 1; + } + + .captcha-modal-card { + transform: none; + } +} diff --git a/EssentialCSharp.Web/wwwroot/css/code-runner.css b/EssentialCSharp.Web/wwwroot/css/code-runner.css new file mode 100644 index 00000000..0354deb3 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/css/code-runner.css @@ -0,0 +1,686 @@ +/* Code Runner Panel - Interactive Code Execution Styles */ + +/* CSS Custom Properties */ +:root { + /* Primary palette */ + --code-runner-primary: #388e3c; + --code-runner-primary-mid: #2e7d32; + --code-runner-primary-dark: #1b5e20; + --code-runner-primary-darker: #0d3d0f; + --code-runner-primary-shadow: rgba(56, 142, 60, 0.3); + --code-runner-primary-shadow-strong: rgba(56, 142, 60, 0.4); + + /* Gradients */ + --code-runner-gradient: linear-gradient(135deg, var(--code-runner-primary) 0%, var(--code-runner-primary-mid) 50%, var(--code-runner-primary-dark) 100%); + --code-runner-gradient-hover: linear-gradient(135deg, var(--code-runner-primary-mid) 0%, var(--code-runner-primary-dark) 50%, var(--code-runner-primary-darker) 100%); + + /* Surface & text */ + --code-runner-surface: #ffffff; + --code-runner-surface-alt: #fafafa; + --code-runner-surface-alt2: #f5f5f5; + --code-runner-surface-header: #f8f9fa; + --code-runner-surface-header-end: #f1f3f4; + --code-runner-text: rgba(0, 0, 0, 0.87); + --code-runner-text-secondary: rgba(0, 0, 0, 0.6); + --code-runner-text-tertiary: rgba(0, 0, 0, 0.54); + --code-runner-border: rgba(0, 0, 0, 0.08); + --code-runner-border-light: rgba(0, 0, 0, 0.06); + --code-runner-hover-bg: rgba(0, 0, 0, 0.04); + --code-runner-hover-bg-strong: rgba(0, 0, 0, 0.08); + + /* Console / output */ + --code-runner-console-bg: #1e1e1e; + --code-runner-console-header-bg: #252526; + --code-runner-console-border: #333333; + --code-runner-console-text: #d4d4d4; + --code-runner-console-text-secondary: rgba(255, 255, 255, 0.7); + --code-runner-console-text-tertiary: rgba(255, 255, 255, 0.5); + --code-runner-console-scroll-thumb: rgba(255, 255, 255, 0.15); + --code-runner-console-scroll-thumb-hover: rgba(255, 255, 255, 0.25); + + /* Error */ + --code-runner-error-color: #f44336; + --code-runner-error-dark: #d32f2f; + --code-runner-error-darker: #c62828; + --code-runner-error-bg-start: #ffebee; + --code-runner-error-bg-end: #ffcdd2; + --code-runner-error-output: #f48771; + --code-runner-error-close-hover-bg: rgba(244, 67, 54, 0.08); + + /* Focus */ + --code-runner-focus-ring: rgba(56, 142, 60, 0.3); + --code-runner-focus-ring-light: rgba(255, 255, 255, 0.3); + + /* Layout */ + --code-runner-panel-width: 600px; + + /* Z-index layers β€” relative to site overlay layer */ + --code-runner-z-overlay: 1100; + --code-runner-z-panel: 1101; + + /* Easing */ + --code-runner-ease: cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Box-sizing scope */ +.code-runner-panel *, +.code-runner-panel *::before, +.code-runner-panel *::after { + box-sizing: border-box; +} + +/* Run button (inline, placed next to listings) */ +.code-runner-btn { + display: inline-flex; + align-items: center; + gap: 5px; + padding: 5px 14px; + margin-inline-start: 8px; + background: var(--code-runner-gradient); + color: white; + border: none; + border-radius: 20px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: all 200ms var(--code-runner-ease); + flex-shrink: 0; + box-shadow: 0 1px 3px var(--code-runner-primary-shadow); + position: relative; + overflow: hidden; +} + +.code-runner-btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s ease; +} + +.code-runner-btn:hover::before { + left: 100%; +} + +.code-runner-btn:hover { + background: var(--code-runner-gradient-hover); + box-shadow: 0 3px 8px var(--code-runner-primary-shadow-strong); +} + +.code-runner-btn:active { + transform: translateY(0); + box-shadow: 0 1px 2px var(--code-runner-primary-shadow); +} + +.code-runner-btn:focus-visible { + outline: 3px solid var(--code-runner-focus-ring); + outline-offset: 2px; +} + +.code-runner-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +.code-runner-btn i { + font-size: 15px; +} + +/* Slide-out panel overlay */ +.code-runner-overlay { + position: fixed; + inset: 0; + /* Opaque fallback for browsers without backdrop-filter support */ + background: rgba(0, 0, 0, 0.6); + z-index: var(--code-runner-z-overlay); + opacity: 0; + visibility: hidden; + /* visibility uses a step delay: hide after fade-out completes */ + transition: opacity 250ms var(--code-runner-ease), + visibility 0s linear 250ms; +} + +@supports (backdrop-filter: blur(4px)) or (-webkit-backdrop-filter: blur(4px)) { + .code-runner-overlay { + background: rgba(0, 0, 0, 0.4); + -webkit-backdrop-filter: blur(4px); + backdrop-filter: blur(4px); + } +} + +.code-runner-overlay.active { + opacity: 1; + visibility: visible; + /* visibility flips immediately on show (0s delay) */ + transition: opacity 250ms var(--code-runner-ease), + visibility 0s linear 0s; +} + +/* Slide-out panel */ +.code-runner-panel { + position: fixed; + top: 0; + inset-inline-end: 0; + bottom: 0; + width: var(--code-runner-panel-width); + max-width: 100vw; + background: var(--code-runner-surface); + box-shadow: + -8px 0 30px rgba(0, 0, 0, 0.12), + -2px 0 8px rgba(0, 0, 0, 0.08); + z-index: var(--code-runner-z-panel); + display: flex; + flex-direction: column; + transform: translateX(100%); + transition: transform 350ms var(--code-runner-ease); + border-radius: 16px 0 0 16px; + overflow: hidden; + will-change: transform; + contain: layout style; +} + +.code-runner-overlay.active .code-runner-panel { + transform: translateX(0); +} + +/* Panel header β€” light gradient, matches chat */ +.code-runner-header { + display: flex; + align-items: center; + justify-content: space-between; + padding-block: 20px; + padding-inline: 24px; + background: linear-gradient(135deg, var(--code-runner-surface-header) 0%, var(--code-runner-surface-header-end) 100%); + border-bottom: 1px solid var(--code-runner-border); + flex-shrink: 0; + position: relative; +} + +.code-runner-header::after { + content: ''; + position: absolute; + bottom: 0; + inset-inline: 0; + height: 1px; + background: linear-gradient(90deg, transparent 0%, rgba(56, 142, 60, 0.25) 50%, transparent 100%); +} + +.code-runner-title { + display: flex; + align-items: center; + gap: 10px; + margin: 0; + font-size: 18px; + font-weight: 600; + color: var(--code-runner-text); + letter-spacing: 0.15px; +} + +.code-runner-title i { + font-size: 22px; + color: var(--code-runner-primary); +} + +.code-runner-close-btn { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + background: var(--code-runner-hover-bg); + border: none; + border-radius: 50%; + color: var(--code-runner-text-tertiary); + cursor: pointer; + transition: all 200ms var(--code-runner-ease); +} + +.code-runner-close-btn:hover { + background: var(--code-runner-error-close-hover-bg); + color: var(--code-runner-error-color); + transform: rotate(90deg); +} + +.code-runner-close-btn:focus-visible { + outline: 3px solid var(--code-runner-focus-ring); + outline-offset: 2px; +} + +.code-runner-close-btn i { + font-size: 20px; +} + +/* Editor container β€” top 60% of panel */ +.code-runner-editor-container { + /* 6 : 4 ratio with output container (60% / 40%) */ + flex: 6; + min-height: 0; + display: flex; + flex-direction: column; + border-bottom: 1px solid var(--code-runner-border); + position: relative; +} + +.code-runner-editor-header { + display: flex; + align-items: center; + justify-content: space-between; + padding-block: 10px; + padding-inline: 20px; + background: linear-gradient(135deg, var(--code-runner-surface-alt) 0%, var(--code-runner-surface-alt2) 100%); + border-bottom: 1px solid var(--code-runner-border-light); +} + +.code-runner-editor-header h4 { + margin: 0; + font-size: 13px; + font-weight: 500; + color: var(--code-runner-text-secondary); + letter-spacing: 0.4px; + text-transform: uppercase; +} + +.code-runner-buttons { + display: flex; + gap: 8px; +} + +.code-runner-run-btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 7px 20px; + background: var(--code-runner-gradient); + color: white; + border: none; + border-radius: 20px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: all 200ms var(--code-runner-ease); + box-shadow: 0 2px 6px var(--code-runner-primary-shadow); + position: relative; + overflow: hidden; +} + +.code-runner-run-btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s ease; +} + +.code-runner-run-btn:hover::before { + left: 100%; +} + +.code-runner-run-btn:hover { + background: var(--code-runner-gradient-hover); + box-shadow: 0 4px 12px var(--code-runner-primary-shadow-strong); + transform: translateY(-1px); +} + +.code-runner-run-btn:active { + transform: translateY(0); + box-shadow: 0 1px 4px var(--code-runner-primary-shadow); +} + +.code-runner-run-btn:focus-visible { + outline: 3px solid var(--code-runner-focus-ring); + outline-offset: 2px; +} + +.code-runner-run-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +.code-runner-clear-btn { + display: inline-flex; + align-items: center; + gap: 5px; + padding: 7px 14px; + background: var(--code-runner-hover-bg); + color: var(--code-runner-text-secondary); + border: none; + border-radius: 20px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: all 200ms var(--code-runner-ease); +} + +.code-runner-clear-btn:hover { + background: var(--code-runner-hover-bg-strong); + color: var(--code-runner-text); +} + +.code-runner-clear-btn:focus-visible { + outline: 3px solid var(--code-runner-focus-ring); + outline-offset: 2px; +} + +/* Monaco editor iframe */ +.code-runner-editor { + flex: 1; + width: 100%; + min-height: 0; + border: none; + display: block; +} + +/* Loading state */ +.code-runner-loading { + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px; + color: var(--code-runner-text-secondary); + background: var(--code-runner-surface); + z-index: 10; +} + +.code-runner-spinner { + display: inline-block; + width: 36px; + height: 36px; + border: 3px solid var(--code-runner-border); + border-radius: 50%; + border-top-color: var(--code-runner-primary); + animation: code-runner-spin 0.8s ease-in-out infinite; +} + +@keyframes code-runner-spin { + to { + transform: rotate(360deg); + } +} + +.code-runner-loading-text { + margin-top: 16px; + font-size: 14px; + font-weight: 400; + letter-spacing: 0.25px; +} + +/* Error state */ +.code-runner-error { + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px; + background: linear-gradient(135deg, var(--code-runner-error-bg-start) 0%, var(--code-runner-error-bg-end) 100%); + text-align: center; + z-index: 10; +} + +.code-runner-error > i { + font-size: 48px; + margin-bottom: 16px; + color: var(--code-runner-error-dark); + opacity: 0.8; +} + +.code-runner-error p { + margin: 0; + font-size: 14px; + line-height: 1.6; + color: var(--code-runner-error-darker); + max-width: 320px; +} + +.code-runner-retry-btn { + display: inline-flex; + align-items: center; + gap: 6px; + margin-top: 20px; + padding: 8px 22px; + background: var(--code-runner-gradient); + color: white; + border: none; + border-radius: 20px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 200ms var(--code-runner-ease); + box-shadow: 0 2px 6px var(--code-runner-primary-shadow); +} + +.code-runner-retry-btn:hover { + background: var(--code-runner-gradient-hover); + box-shadow: 0 4px 12px var(--code-runner-primary-shadow-strong); + transform: translateY(-1px); +} + +.code-runner-retry-btn:active { + transform: translateY(0); + box-shadow: 0 1px 4px var(--code-runner-primary-shadow); +} + +.code-runner-retry-btn:focus-visible { + outline: 3px solid var(--code-runner-focus-ring); + outline-offset: 2px; +} + +.code-runner-retry-btn i { + font-size: 16px; + color: white; +} + +/* Output console β€” dark theme, bottom 40% of panel */ +.code-runner-output-container { + /* 4 : 6 ratio with editor container (40% / 60%) */ + flex: 4; + min-height: 0; + display: flex; + flex-direction: column; + background: var(--code-runner-console-bg); +} + +.code-runner-output-header { + display: flex; + align-items: center; + justify-content: space-between; + padding-block: 10px; + padding-inline: 20px; + background: var(--code-runner-console-header-bg); + border-bottom: 1px solid var(--code-runner-console-border); +} + +.code-runner-output-header h4 { + margin: 0; + font-size: 12px; + font-weight: 500; + display: flex; + align-items: center; + gap: 8px; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +/* Scoped specificity: the dark console header forces white text + without needing !important */ +.code-runner-output-container .code-runner-output-header h4 { + color: var(--code-runner-console-text-secondary); +} + +.code-runner-output-header h4 i { + font-size: 15px; + color: var(--code-runner-console-text-tertiary); +} + +.code-runner-clear-output-btn { + display: inline-flex; + align-items: center; + gap: 5px; + padding: 4px 10px; + background: transparent; + color: var(--code-runner-console-text-tertiary); + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 12px; + font-size: 12px; + cursor: pointer; + transition: all 200ms var(--code-runner-ease); +} + +.code-runner-clear-output-btn:hover { + background: rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.8); + border-color: var(--code-runner-focus-ring-light); +} + +.code-runner-clear-output-btn:focus-visible { + outline: 2px solid var(--code-runner-focus-ring-light); + outline-offset: 2px; +} + +.code-runner-output { + flex: 1; + min-height: 0; + overflow-y: auto; + padding-block: 16px; + padding-inline: 20px; + font-family: 'Consolas', 'Monaco', 'Courier New', monospace; + font-size: 13px; + line-height: 1.6; + color: var(--code-runner-console-text); + white-space: pre-wrap; + word-wrap: break-word; + overflow-wrap: break-word; + /* Firefox scrollbar */ + scrollbar-width: thin; + scrollbar-color: var(--code-runner-console-scroll-thumb) transparent; +} + +.code-runner-output.error { + color: var(--code-runner-error-output); +} + +/* Chromium / Safari scrollbar */ +.code-runner-output::-webkit-scrollbar { + width: 8px; +} + +.code-runner-output::-webkit-scrollbar-track { + background: transparent; +} + +.code-runner-output::-webkit-scrollbar-thumb { + background: var(--code-runner-console-scroll-thumb); + border-radius: 4px; +} + +.code-runner-output::-webkit-scrollbar-thumb:hover { + background: var(--code-runner-console-scroll-thumb-hover); +} + +/* Responsive */ +@media (max-width: 768px) { + .code-runner-panel { + width: 100%; + border-radius: 0; + } + + .code-runner-header { + padding: 16px; + } + + .code-runner-title { + font-size: 15px; + } + + .code-runner-editor-header { + flex-direction: column; + align-items: flex-start; + gap: 10px; + padding-block: 10px; + padding-inline: 16px; + } + + .code-runner-buttons { + width: 100%; + justify-content: flex-end; + } + + .code-runner-output-header { + padding-block: 10px; + padding-inline: 16px; + } + + .code-runner-output { + padding-block: 12px; + padding-inline: 16px; + } +} + +/* High contrast mode */ +@media (prefers-contrast: high) { + .code-runner-panel { + border-inline-start: 2px solid #000; + } + + .code-runner-header { + border-bottom: 2px solid #000; + } + + .code-runner-run-btn { + border: 2px solid white; + } + + .code-runner-btn { + border: 2px solid white; + } + + .code-runner-clear-output-btn { + border-color: var(--code-runner-console-text-tertiary); + } +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + .code-runner-overlay, + .code-runner-panel, + .code-runner-btn, + .code-runner-run-btn, + .code-runner-clear-btn, + .code-runner-close-btn, + .code-runner-clear-output-btn, + .code-runner-retry-btn { + transition: none; + } + + .code-runner-btn::before, + .code-runner-run-btn::before { + display: none; + } + + .code-runner-spinner { + animation: none; + opacity: 0.6; + } +} + +/* Print β€” hide everything */ +@media print { + .code-runner-overlay, + .code-runner-btn { + display: none; + } +} diff --git a/EssentialCSharp.Web/wwwroot/css/site.css b/EssentialCSharp.Web/wwwroot/css/site.css index 30ab421c..f27e5ad2 100644 --- a/EssentialCSharp.Web/wwwroot/css/site.css +++ b/EssentialCSharp.Web/wwwroot/css/site.css @@ -15,4 +15,4 @@ html { body { margin-bottom: 60px; -} +} \ No newline at end of file diff --git a/EssentialCSharp.Web/wwwroot/css/styles.css b/EssentialCSharp.Web/wwwroot/css/styles.css index 81abcb5e..886b6dd9 100644 --- a/EssentialCSharp.Web/wwwroot/css/styles.css +++ b/EssentialCSharp.Web/wwwroot/css/styles.css @@ -1,13 +1,15 @@ /* Global Styles */ :root { + --primary-color: rgb(30, 83, 160); + --primary-color-rgb: 30, 83, 160; + --primary-dark-color: rgb(26, 48, 70); + --primary-medium-color: rgb(35, 119, 213); + --primary-accent-color: rgb(127, 201, 206); + --toolbar-height: 50px; - --primary-color: #11356a; - --secondary-color: #232732; - --accent-color-1: #7fc9ce; - --accent-color-2: #ffdd74; - --link-color: #0042b5; - --link-color-hover: #208fe4; + --link-color: var(--primary-color); + --link-color-hover: var(--primary-medium-color); --grey: #bcbec0; --grey-lighten-1: #e6e7e8; --grey-lighten-2: #f1f2f2; @@ -22,10 +24,17 @@ body { } h1, -h2, -h3 { - font-weight: bold; - color: var(--primary-color); +h2 { + font-weight: bold !important; + color: var(--primary-dark-color) !important; +} + +h3, +h4, +h5, +h6 { + font-weight: 500 !important; + color: var(--primary-dark-color) !important; } a { @@ -41,15 +50,42 @@ a:hover { background-color: var(--grey-lighten-2); } -.button { - background-color: var(--primary-color); - color: white; - border: none; - padding: 0.5em 1em 0.5em 1em; - text-transform: uppercase; - font-size: small; +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: var(--primary-color) !important; + --bs-btn-border-color: var(--primary-color); + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: var(--primary-medium-color); + --bs-btn-hover-border-color: var(--primary-medium-color); + --bs-btn-focus-shadow-rgb: var(--primary-accent-color); + --bs-btn-active-color: #fff; + --bs-btn-active-bg: var(--primary-color); + --bs-btn-active-border-color: var(--primary-color); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: var(--primary-accent-color); + --bs-btn-disabled-border-color: var(--primary-accent-color); +} + +.btn-primary { + color: #fff; + background-color: var(--primary-color); + border-color: var(--primary-color); } + .btn-primary:hover { + background-color: var(--primary-medium-color); + border-color: var(--primary-medium-color); + } + + .btn-primary:focus { + background-color: var(--primary-medium-color); + } + + .btn-primary:active { + background-color: var(--primary-medium-color); + } + :hover.button { opacity: 75%; } @@ -59,25 +95,13 @@ a:hover { } .divider-light-blue { - border-top: 3px solid var(--accent-color-1); - margin: 2em 0 2em 0; - opacity: 1; -} - -.divider-blue { - border-top: 3px solid var(--link-color-hover); - margin: 2em 0 2em 0; - opacity: 1; -} - -.divider-yellow { - border-top: 3px solid var(--accent-color-2); + border-top: 3px solid var(--primary-accent-color); margin: 2em 0 2em 0; opacity: 1; } .icon-light { - color: var(--accent-color-1); + color: var(--primary-accent-color); } :hover.icon-light { @@ -102,32 +126,37 @@ a:hover { /* Style Edits to Bootstrap Components */ .card-title { - font-weight: bold; - color: var(--primary-color); + font-weight: 500; + color: var(--primary-dark-color); } .card { height: 100%; } -.card-light-blue { +.card-primary { border-radius: 0; - border-left: 8px solid var(--accent-color-1); + border-left: 8px solid var(--primary-color); background-color: var(--grey-lighten-2); } -.card-blue { +.card-secondary { border-radius: 0; - border-left: 8px solid var(--link-color-hover); + border-left: 8px solid var(--primary-dark-color); background-color: var(--grey-lighten-2); } -.card-yellow { +.card-accent { border-radius: 0; - border-left: 8px solid var(--accent-color-2); + border-left: 8px solid var(--primary-accent-color); background-color: var(--grey-lighten-2); } +.list-group-item.active { + background-color: var(--primary-color); + border-color: var(--primary-color); +} + /* Main Layout */ .layout { @@ -137,6 +166,23 @@ a:hover { margin-top: var(--toolbar-height); } +/* Prevent horizontal overflow on main content */ +.container { + max-width: 100vw; + overflow-x: hidden; + position: relative; +} + +/* Ensure code blocks, tables, and pre elements wrap or scroll within themselves */ +.container pre, +.container code, +.container table { + max-width: 100%; + overflow-x: auto; + word-break: break-word; + white-space: pre-wrap; +} + /* Search Bar Styles */ @media (max-width: 768px) { @@ -178,13 +224,16 @@ a:hover { } } +.page-menu { + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + .menu-brand { font-style: normal; font-weight: 400; font-size: 1.5rem; - text-decoration: none; - white-space: nowrap; - overflow: hidden; margin-left: 5px; } @@ -192,19 +241,22 @@ a:hover { font-style: normal; font-weight: 300; font-size: 1.2rem; - text-decoration: none; text-overflow: ellipsis; - overflow: hidden; cursor: pointer; - white-space: nowrap; } -.menu-tooltip { +.menu-progress { + font-style: normal; + font-weight: 200; + font-size: 1rem; +} + +.has-tooltip { position: relative; display: inline-block; } -.menu-tooltip .tooltip-text { +.has-tooltip .tooltip-text { visibility: hidden; width: 120px; background-color: var(--grey-lighten-1); @@ -221,11 +273,11 @@ a:hover { z-index: 1; } -.menu-tooltip:hover .tooltip-text { +.has-tooltip:hover .tooltip-text { visibility: visible; } -.menu-tooltip .tooltip-text::after { +.has-tooltip .tooltip-text::after { content: " "; position: absolute; bottom: 100%; /* At the top of the tooltip */ @@ -236,24 +288,97 @@ a:hover { border-color: transparent transparent var(--grey-lighten-1) transparent; } +.has-tooltip:hover .sidebar-tooltip-text { + transition-delay: 1s; + transition-property: visibility; +} + +.has-tooltip .sidebar-tooltip-text { + width: 90px; + position: relative; + left: 5rem; + border-radius: 10px; + padding: 10px; + white-space: normal; +} + +.has-tooltip .sidebar-tooltip-text:after { + content: ''; + display: block; + width: 0; + height: 0; + position: absolute; + border-width: 5px; + border-top: 8px solid transparent; + border-bottom: 8px solid transparent; + border-right: 8px solid var(--grey-lighten-1); + left: -9%; + bottom: 30%; +} + +.nav-link { + color: white; +} + +.nav-link:hover { + color: var(--primary-accent-color); +} + +.nav-item .active { + color: var(--primary-accent-color); +} + +.account-nav-link { + color: black; +} + +.account-nav-link:hover { + color: var(--primary-accent-color); +} + +.account-nav-item .active { + color: var(--primary-accent-color); +} + /* Page Navigation Arrow Buttons */ .turn-page { - top: calc(100vh - 9rem); - top: calc(100dvh - 9rem); + position: fixed; + left: 0; + right: 0; + bottom: 2rem; + top: auto; + transform: none; + z-index: 1000; display: flex; justify-content: space-between; - position: -webkit-sticky; /* Safari */ - position: sticky; - padding: 0 0.5rem 0 0.5rem; - transform: translate(0, 3rem); - height: 0; + padding: 0 0.5rem; + height: auto; + pointer-events: none; /* allow buttons to be clickable only */ + margin-left: 0; } +.turn-page .arrow-btn { + pointer-events: auto; +} + +/* Hide turn-page buttons on mobile when sidebar is open */ @media only screen and (max-width: 768px) { + /* Hide buttons when sidebar is open on mobile (sidebarSmall class is used) */ + body:has(.sidebarSmall) .turn-page { + display: none; + } + .turn-page { - top: calc(100vh - 13rem); - top: calc(100dvh - 9rem); + bottom: 4rem; + margin-left: 0; + } +} + +/* Adjust turn-page positioning when sidebar is visible on larger screens */ +@media only screen and (min-width: 769px) { + .layout.has-sidebar .turn-page { + margin-left: 375px; /* Same as sidebar width */ } } @@ -344,6 +469,37 @@ a:hover { } } +.filter-input-container { + display: flex; + align-items: center; + width: 100%; + padding: 0.5rem; + box-sizing: border-box; +} + +.filter-input { + flex: 1; + padding: 0.5rem; + border: 1px solid #ccc; + border-radius: 4px 0 0 4px; + font-size: 1rem; +} + +.filter-btn { + padding: 0.5rem; + border: 1px solid #ccc; + border-left: none; + background-color: #007bff; + color: white; + border-radius: 0 4px 4px 0; + cursor: pointer; +} + + .filter-btn .fa-search { + font-size: 1rem; + } + + /* Table of Contents For Chapters */ .toc-menu { @@ -485,6 +641,7 @@ details > summary::-webkit-details-marker { padding-top: 15px; padding-right: 18px; padding-left: 15px; + scrollbar-gutter: stable; } /* Top Banner Bar */ @@ -494,7 +651,7 @@ details > summary::-webkit-details-marker { width: 100%; display: flex; justify-content: center; - background: var(--secondary-color); + background: var(--primary-dark-color); position: fixed; top: 0; z-index: 2; @@ -612,7 +769,7 @@ details > summary::-webkit-details-marker { } .quote .quote-content .quote-icon { - color: var(--accent-color-1); + color: var(--primary-accent-color); position: absolute; top: -30px; left: 20px; @@ -631,6 +788,28 @@ details > summary::-webkit-details-marker { border-color: var(--grey-lighten-2) transparent transparent transparent; } +/* Anchor Styling */ +.heading-wrapper:not(:hover) .anchor-link:not(:focus-visible) { + opacity: 0; +} + +.anchor-link { + border: none; + color: var(--link-color); + text-decoration: none; + position: absolute; + font-size: 14px; + margin: 4px 2px; + transition-duration: 0.4s; + cursor: pointer; + background-color: transparent; +} + + .anchor-link:hover { + color: var(--link-color-hover); + } + + /* The snackbar - position it at the bottom and in the middle of the screen */ #snackbar { visibility: hidden; /* Hidden by default. Visible on click */ @@ -734,3 +913,141 @@ button.accept-policy { } /*end transitions*/ + +/* Captcha Modal Styles */ +.captcha-modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.6); + z-index: 2000; /* Higher than chat widget */ + display: flex; + align-items: center; + justify-content: center; + -webkit-backdrop-filter: blur(3px); + backdrop-filter: blur(3px); + animation: fadeIn 0.3s ease-out; +} + +.captcha-modal-card { + background: white; + border-radius: 16px; + box-shadow: 0 24px 48px rgba(0, 0, 0, 0.2); + max-width: 480px; + width: 90%; + max-height: 90vh; + overflow-y: auto; + animation: slideInScale 0.4s ease-out; +} + +.captcha-modal-header { + padding: 24px 24px 16px; + border-bottom: 1px solid rgba(0, 0, 0, 0.12); + text-align: center; +} + +.captcha-modal-title { + margin: 0; + font-size: 20px; + font-weight: 500; + color: #1976d2; + display: flex; + align-items: center; + justify-content: center; +} + +.captcha-modal-content { + padding: 24px; + text-align: center; +} + +.captcha-explanation { + margin: 0 0 24px; + font-size: 16px; + line-height: 1.6; + color: rgba(0, 0, 0, 0.8); +} + +.captcha-widget-container { + display: flex; + justify-content: center; + margin: 24px 0; + min-height: 78px; /* hCaptcha widget height */ +} + +.captcha-help-text { + margin: 24px 0 0; + font-size: 14px; + color: rgba(0, 0, 0, 0.6); + font-style: italic; +} + +/* Modal animations */ +@keyframes slideInScale { + 0% { + opacity: 0; + transform: translate(-50%, -60%) scale(0.8); + } + 100% { + opacity: 1; + transform: translate(0, 0) scale(1); + } +} + +/* Responsive adjustments for mobile */ +@media (max-width: 480px) { + .captcha-modal-card { + width: 95%; + margin: 16px; + border-radius: 12px; + } + + .captcha-modal-header { + padding: 20px 16px 12px; + } + + .captcha-modal-content { + padding: 20px 16px; + } + + .captcha-modal-title { + font-size: 18px; + } + + .captcha-explanation { + font-size: 15px; + } +} + +/* High contrast mode support */ +@media (prefers-contrast: high) { + .captcha-modal-overlay { + background: rgba(0, 0, 0, 0.8); + } + + .captcha-modal-card { + border: 2px solid #000; + } + + .captcha-modal-header { + border-bottom-color: #000; + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + .captcha-modal-overlay, + .captcha-modal-card { + animation: none; + } + + .captcha-modal-overlay { + opacity: 1; + } + + .captcha-modal-card { + transform: none; + } +} diff --git a/EssentialCSharp.Web/wwwroot/images/book.png b/EssentialCSharp.Web/wwwroot/images/book.png new file mode 100644 index 00000000..1abd8aad Binary files /dev/null and b/EssentialCSharp.Web/wwwroot/images/book.png differ diff --git a/EssentialCSharp.Web/wwwroot/images/intellitect-logo.svg b/EssentialCSharp.Web/wwwroot/images/intellitect-logo.svg new file mode 100644 index 00000000..fac0cf45 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/images/intellitect-logo.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EssentialCSharp.Web/wwwroot/js/chat-module.js b/EssentialCSharp.Web/wwwroot/js/chat-module.js new file mode 100644 index 00000000..78cb6b1d --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/js/chat-module.js @@ -0,0 +1,413 @@ +// Chat Module - Vue.js composable for AI chat functionality +import { ref, nextTick, watch, onMounted, onUnmounted } from 'vue'; + +export function useChatWidget() { + // Authentication state + const isAuthenticated = ref(window.IS_AUTHENTICATED || false); + + // Chat state with persistence + const showChatDialog = ref(false); + const chatMessages = ref([]); + const chatInput = ref(''); + const isTyping = ref(false); + const chatMessagesEl = ref(null); + const chatInputField = ref(null); + const lastResponseId = ref(null); + + // Load chat history from localStorage on initialization + function loadChatHistory() { + try { + const saved = localStorage.getItem('aiChatHistory'); + if (saved) { + const data = JSON.parse(saved); + chatMessages.value = data.messages || []; + lastResponseId.value = data.lastResponseId || null; + } + } catch (error) { + console.warn('Failed to load chat history:', error); + } + } + + // Save chat history to localStorage with message limits + function saveChatHistory() { + try { + // Limit messages to prevent memory issues (keep last 100 messages) + const maxMessages = 100; + const messagesToSave = chatMessages.value.slice(-maxMessages); + + const data = { + messages: messagesToSave, + lastResponseId: lastResponseId.value, + timestamp: Date.now() + }; + localStorage.setItem('aiChatHistory', JSON.stringify(data)); + } catch (error) { + console.warn('Failed to save chat history:', error); + // If localStorage is full, try clearing and saving only recent messages + try { + const recentMessages = chatMessages.value.slice(-20); + const fallbackData = { + messages: recentMessages, + lastResponseId: lastResponseId.value, + timestamp: Date.now() + }; + localStorage.setItem('aiChatHistory', JSON.stringify(fallbackData)); + } catch (fallbackError) { + console.error('Failed to save even minimal chat history:', fallbackError); + } + } + } + + // Initialize chat history on load + loadChatHistory(); + + // Clear chat if user is not authenticated + if (!isAuthenticated.value) { + chatMessages.value = []; + lastResponseId.value = null; + } + + // Watch for authentication changes and clear chat when user logs out + watch(isAuthenticated, (newAuth, oldAuth) => { + if (oldAuth === true && newAuth === false) { + // User logged out, clear chat + clearChatHistory(); + } + }); + + // Chat functions + function openChatDialog() { + // Update authentication status in case it changed without page refresh + isAuthenticated.value = window.IS_AUTHENTICATED || false; + + showChatDialog.value = true; + nextTick(() => { + if (chatInputField.value && isAuthenticated.value) { + chatInputField.value.focus(); + } + scrollToBottom(); + }); + } + + function closeChatDialog() { + showChatDialog.value = false; + } + + function clearChatHistory() { + chatMessages.value = []; + lastResponseId.value = null; + saveChatHistory(); + + // Force a scroll to top to make it obvious the messages are gone + nextTick(() => { + if (chatMessagesEl.value) { + chatMessagesEl.value.scrollTop = 0; + } + }); + } + + // Remove captcha callback functions as they're no longer needed for chat + // The captcha service can still be used elsewhere in the application + + function scrollToBottom() { + if (chatMessagesEl.value) { + nextTick(() => { + chatMessagesEl.value.scrollTop = chatMessagesEl.value.scrollHeight; + }); + } + } + + function formatMessage(content) { + if (!content) return ''; + + // Use marked.js for markdown rendering with DOMPurify sanitization + if (typeof window.marked !== 'undefined' && typeof window.DOMPurify !== 'undefined') { + const rawHtml = window.marked.parse(content); + return window.DOMPurify.sanitize(rawHtml); + } + + // Fallback to simple line break replacement + return content.replace(/\n/g, '
    '); + } + + function getErrorMessageClass(errorType) { + if (errorType === 'rate-limit') { + return 'rate-limit-error'; + } else if (errorType === 'auth-error') { + return 'error-message'; + } else if (errorType === 'validation-error') { + return 'error-message'; + } else { + return 'error-message'; + } + } + + function getErrorIconClass(errorType) { + if (errorType === 'rate-limit') { + return 'fas fa-clock'; + } else if (errorType === 'auth-error') { + return 'fas fa-lock'; + } else if (errorType === 'validation-error') { + return 'fas fa-exclamation-circle'; + } else if (errorType === 'network-error') { + return 'fas fa-wifi'; + } else if (errorType === 'connection-error') { + return 'fas fa-plug'; + } else { + return 'fas fa-exclamation-triangle'; + } + } + + async function sendChatMessage() { + if (!chatInput.value.trim() || isTyping.value) return; + + // Check authentication first + if (!isAuthenticated.value) { + chatMessages.value.push({ + role: 'error', + errorType: 'auth-error', + content: 'You must be logged in to use the chat feature. Please log in and try again.', + timestamp: new Date().toISOString() + }); + saveChatHistory(); + return; + } + + const userMessage = chatInput.value.trim(); + + // Client-side validation + if (userMessage.length > 500) { + chatMessages.value.push({ + role: 'error', + errorType: 'validation-error', + content: 'Your message is too long. Please keep it under 500 characters.', + timestamp: new Date().toISOString() + }); + saveChatHistory(); + return; + } + + chatInput.value = ''; + + // Add user message + chatMessages.value.push({ + role: 'user', + content: userMessage, + timestamp: new Date().toISOString() + }); + + // Save immediately after adding user message + saveChatHistory(); + + // Show typing indicator + isTyping.value = true; + + // Scroll to bottom + nextTick(() => { + if (chatMessagesEl.value) { + chatMessagesEl.value.scrollTop = chatMessagesEl.value.scrollHeight; + } + }); + + let reader = null; + try { + const requestBody = { + message: userMessage, + enableContextualSearch: true, + previousResponseId: lastResponseId.value + }; + + const response = await fetch('/api/chat/stream', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (!response.ok) { + if (response.status === 401) { + throw new Error('Authentication required'); + } else if (response.status === 429) { + // Handle rate limiting - simple error message without captcha + let errorData; + try { + errorData = await response.json(); + } catch (e) { + errorData = { + error: 'Rate limit exceeded. Please wait before sending another message.', + retryAfter: 60 + }; + } + + const retryAfter = errorData.retryAfter || 60; + const errorMessage = `Rate limit exceeded. Please wait ${Math.ceil(retryAfter)} seconds before sending another message.`; + + throw new Error(errorMessage); + } else if (response.status === 400) { + // Handle validation errors + const errorData = await response.json(); + throw new Error(errorData.error || 'Bad request'); + } + throw new Error(`HTTP error! status: ${response.status}`); + } + + // Handle streaming response + reader = response.body.getReader(); + const decoder = new TextDecoder(); + let assistantMessage = ''; + let assistantMessageIndex = -1; + let hasStartedStreaming = false; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + const chunk = decoder.decode(value); + const lines = chunk.split('\n'); + + for (const line of lines) { + if (line.startsWith('data: ')) { + const data = line.slice(6); + if (data === '[DONE]') { + isTyping.value = false; + // Save final state + saveChatHistory(); + continue; + } + + try { + const parsed = JSON.parse(data); + if (parsed.type === 'text' && parsed.data) { + // If this is the first chunk, hide typing indicator and add assistant message + if (!hasStartedStreaming) { + isTyping.value = false; + chatMessages.value.push({ + role: 'assistant', + content: '', + timestamp: new Date().toISOString() + }); + assistantMessageIndex = chatMessages.value.length - 1; + hasStartedStreaming = true; + } + + assistantMessage += parsed.data; + chatMessages.value[assistantMessageIndex].content = assistantMessage; + + // Scroll to bottom + nextTick(() => { + if (chatMessagesEl.value) { + chatMessagesEl.value.scrollTop = chatMessagesEl.value.scrollHeight; + } + }); + } + // Store responseId for conversation continuity + else if (parsed.type === 'responseId' && parsed.data) { + lastResponseId.value = parsed.data; + } + } catch (e) { + console.warn('Failed to parse SSE data:', data); + } + } + } + } + + } catch (error) { + console.error('Chat error:', error); + + // Hide typing indicator if still showing + isTyping.value = false; + + // Provide more specific error messages with types + let errorMessage = 'Sorry, I encountered an error while processing your request. Please try again.'; + let errorType = 'error'; + + if (error.name === 'AbortError') { + errorMessage = 'Request was cancelled. Please try again.'; + errorType = 'error'; + } else if (error.message?.includes('Authentication required')) { + errorMessage = 'You must be logged in to use the chat feature. Please log in and try again.'; + errorType = 'auth-error'; + isAuthenticated.value = false; // Update auth state + } else if (error.message?.includes('Rate limit exceeded')) { + errorMessage = error.message; // Use the specific rate limit message with timing + errorType = 'rate-limit'; + } else if (error.message?.includes('HTTP error')) { + errorMessage = 'Unable to connect to the chat service. Please check your connection and try again.'; + errorType = 'connection-error'; + } else if (error.message?.includes('Failed to fetch')) { + errorMessage = 'Network error. Please check your internet connection and try again.'; + errorType = 'network-error'; + } + + chatMessages.value.push({ + role: 'error', + errorType: errorType, + content: errorMessage, + timestamp: new Date().toISOString() + }); + saveChatHistory(); + } finally { + // Ensure reader is properly closed + if (reader) { + try { + await reader.cancel(); + } catch (e) { + console.warn('Failed to cancel reader:', e); + } + } + + // Ensure typing indicator is hidden + isTyping.value = false; + + // Focus back on input + nextTick(() => { + if (chatInputField.value) { + chatInputField.value.focus(); + } + }); + } + } + + // Clean up old chat sessions (keep only last 7 days) + function cleanupOldSessions() { + try { + const saved = localStorage.getItem('aiChatHistory'); + if (saved) { + const data = JSON.parse(saved); + const sevenDaysAgo = Date.now() - (7 * 24 * 60 * 60 * 1000); + + if (data.timestamp && data.timestamp < sevenDaysAgo) { + localStorage.removeItem('aiChatHistory'); + chatMessages.value = []; + lastResponseId.value = null; + } + } + } catch (error) { + console.warn('Failed to cleanup old sessions:', error); + } + } + + // Run cleanup on initialization + cleanupOldSessions(); + + return { + // State + isAuthenticated, + showChatDialog, + chatMessages, + chatInput, + isTyping, + chatMessagesEl, + chatInputField, + + // Methods + openChatDialog, + closeChatDialog, + clearChatHistory, + formatMessage, + getErrorMessageClass, + getErrorIconClass, + sendChatMessage + }; +} diff --git a/EssentialCSharp.Web/wwwroot/js/consent-manager.js b/EssentialCSharp.Web/wwwroot/js/consent-manager.js new file mode 100644 index 00000000..ae107df4 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/js/consent-manager.js @@ -0,0 +1,510 @@ +/** + * Cookie Consent Manager for Essential C# + * Implements Google Consent Mode v2 for Microsoft Clarity and Google Analytics + * Compliant with GDPR requirements for EEA, UK, and Switzerland + */ + +class ConsentManager { + constructor(options = {}) { + this.COOKIE_NAME = 'essential-csharp-consent'; + this.COOKIE_DURATION = 365; // days + this.GOOGLE_ANALYTICS_ID = options.googleAnalyticsId || 'G-761B4BMK2R'; + this.consentState = { + analytics_storage: 'denied', + ad_storage: 'denied', + ad_user_data: 'denied', + ad_personalization: 'denied', + functionality_storage: 'granted', // Always granted for essential functionality + security_storage: 'granted', // Always granted for security + personalization_storage: 'denied' + }; + + // Check if user is in EEA/UK/Switzerland region + this.requiresConsent = this.checkRegionRequiresConsent(); + + this.init(); + } + + init() { + // Initialize Google Consent Mode + this.initGoogleConsentMode(); + + // Load saved consent preferences + this.loadConsentPreferences(); + + // Show banner if consent required and not yet given + if (this.shouldShowConsentBanner()) { + this.showConsentBanner(); + } + + // Dispatch initialization event for other scripts to listen to + this.dispatchInitializationEvent(); + } + + dispatchInitializationEvent() { + // Create and dispatch custom event to signal consent manager is ready + const event = new CustomEvent('consentManagerReady', { + detail: { + hasAnalyticsConsent: this.hasAnalyticsConsent(), + hasAdvertisingConsent: this.hasAdvertisingConsent(), + requiresConsent: this.requiresConsent + } + }); + document.dispatchEvent(event); + } + + initGoogleConsentMode() { + // Initialize gtag if not already loaded + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + window.gtag = window.gtag || gtag; + + // Set default consent state - denial for all except essential + gtag('consent', 'default', this.consentState); + } + + checkRegionRequiresConsent() { + // Check for forced testing via URL parameter + const urlParams = new URLSearchParams(window.location.search); + if (urlParams.get('testConsent') === 'true') { + return true; + } + + // Timezone-based region detection for GDPR compliance + // Users can change timezones, but this provides reasonable detection for most cases + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + + // EEA countries, UK, and Switzerland timezones + const requiresConsentTimezones = [ + // Western Europe + 'Europe/London', 'Europe/Dublin', 'Europe/Lisbon', 'Europe/Madrid', + 'Europe/Paris', 'Europe/Amsterdam', 'Europe/Brussels', 'Europe/Luxembourg', + 'Europe/Zurich', 'Europe/Vienna', 'Europe/Rome', 'Europe/Vatican', + 'Europe/San_Marino', 'Europe/Malta', 'Europe/Monaco', + + // Central Europe + 'Europe/Berlin', 'Europe/Prague', 'Europe/Budapest', 'Europe/Warsaw', + 'Europe/Bratislava', 'Europe/Ljubljana', 'Europe/Zagreb', 'Europe/Belgrade', + 'Europe/Sarajevo', 'Europe/Podgorica', 'Europe/Skopje', 'Europe/Tirane', + + // Northern Europe + 'Europe/Stockholm', 'Europe/Oslo', 'Europe/Copenhagen', 'Europe/Helsinki', + 'Europe/Tallinn', 'Europe/Riga', 'Europe/Vilnius', 'Europe/Reykjavik', + + // Eastern Europe + 'Europe/Bucharest', 'Europe/Sofia', 'Europe/Athens', 'Europe/Nicosia', + + // Additional EEA territories + 'Atlantic/Canary', 'Atlantic/Madeira', 'Atlantic/Azores', + 'Europe/Gibraltar', 'Africa/Ceuta' + ]; + + return requiresConsentTimezones.includes(timezone); + } + + loadConsentPreferences() { + const saved = this.getCookie(this.COOKIE_NAME); + if (saved) { + try { + const preferences = JSON.parse(saved); + + // Validate and only apply known consent properties for security + const validConsentKeys = [ + 'analytics_storage', 'ad_storage', 'ad_user_data', + 'ad_personalization', 'functionality_storage', + 'security_storage', 'personalization_storage' + ]; + + const validatedPreferences = {}; + validConsentKeys.forEach(key => { + if (preferences.hasOwnProperty(key) && + (preferences[key] === 'granted' || preferences[key] === 'denied')) { + validatedPreferences[key] = preferences[key]; + } + }); + + this.consentState = { ...this.consentState, ...validatedPreferences }; + this.updateConsentMode(); + } catch (e) { + console.warn('Failed to parse consent preferences', e); + } + } + } + + shouldShowConsentBanner() { + // Show banner if in EEA/UK/Switzerland and no consent stored + return this.requiresConsent && !this.getCookie(this.COOKIE_NAME); + } + + showConsentBanner() { + if (document.getElementById('consent-banner')) return; // Already shown + + const banner = this.createConsentBanner(); + document.body.appendChild(banner); + + // Add banner styles if not already added + this.addConsentStyles(); + } + + createConsentBanner() { + const banner = document.createElement('div'); + banner.id = 'consent-banner'; + banner.className = 'consent-banner'; + banner.innerHTML = ` + + + `; + + // Add event listeners + this.addBannerEventListeners(banner); + + return banner; + } + + addBannerEventListeners(banner) { + banner.querySelector('#consent-accept-all').addEventListener('click', () => { + this.acceptAllConsent(); + }); + + banner.querySelector('#consent-reject-all').addEventListener('click', () => { + this.rejectAllConsent(); + }); + + banner.querySelector('#consent-customize').addEventListener('click', () => { + this.showCustomizeOptions(); + }); + + banner.querySelector('#consent-save-preferences').addEventListener('click', () => { + this.saveCustomPreferences(); + }); + } + + showCustomizeOptions() { + const details = document.getElementById('consent-details'); + if (details) { + details.style.display = details.style.display === 'none' ? 'block' : 'none'; + + // Load current preferences into checkboxes + document.getElementById('consent-analytics').checked = + this.consentState.analytics_storage === 'granted'; + document.getElementById('consent-advertising').checked = + this.consentState.ad_storage === 'granted'; + } + } + + acceptAllConsent() { + this.consentState = { + ...this.consentState, + analytics_storage: 'granted', + ad_storage: 'granted', + ad_user_data: 'granted', + ad_personalization: 'granted', + personalization_storage: 'granted' + }; + + this.saveConsentAndClose(); + } + + rejectAllConsent() { + this.consentState = { + ...this.consentState, + analytics_storage: 'denied', + ad_storage: 'denied', + ad_user_data: 'denied', + ad_personalization: 'denied', + personalization_storage: 'denied' + }; + + this.saveConsentAndClose(); + } + + saveCustomPreferences() { + const analyticsChecked = document.getElementById('consent-analytics').checked; + const advertisingChecked = document.getElementById('consent-advertising').checked; + + this.consentState = { + ...this.consentState, + analytics_storage: analyticsChecked ? 'granted' : 'denied', + ad_storage: advertisingChecked ? 'granted' : 'denied', + ad_user_data: advertisingChecked ? 'granted' : 'denied', + ad_personalization: advertisingChecked ? 'granted' : 'denied', + personalization_storage: analyticsChecked ? 'granted' : 'denied' + }; + + this.saveConsentAndClose(); + } + + saveConsentAndClose() { + // Save consent to cookie + this.setCookie(this.COOKIE_NAME, JSON.stringify(this.consentState), this.COOKIE_DURATION); + + // Update consent mode + this.updateConsentMode(); + + // Update Clarity consent + this.updateClarityConsent(); + + // Remove banner + this.removeConsentBanner(); + } + + updateConsentMode() { + if (window.gtag) { + try { + gtag('consent', 'update', this.consentState); + + // Configure Google Analytics if analytics consent is granted + if (this.consentState.analytics_storage === 'granted') { + gtag('config', 'G-761B4BMK2R'); + } + } catch (error) { + console.warn('Failed to update Google Consent Mode:', error); + } + } + } + + updateClarityConsent() { + // Send consent signal to Microsoft Clarity using Consent API v2 + if (window.clarity) { + try { + clarity('consentv2', { + ad_storage: this.consentState.ad_storage, + analytics_storage: this.consentState.analytics_storage + }); + } catch (error) { + console.warn('Failed to update Clarity consent:', error); + } + } + } + + removeConsentBanner() { + const banner = document.getElementById('consent-banner'); + if (banner) { + banner.remove(); + } + } + + addConsentStyles() { + if (document.getElementById('consent-styles')) return; // Already added + + const styles = document.createElement('style'); + styles.id = 'consent-styles'; + styles.textContent = ` + .consent-banner { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background: #ffffff; + border-top: 3px solid #007bff; + box-shadow: 0 -4px 12px rgba(0,0,0,0.15); + z-index: 10000; + font-family: inherit; + } + + .consent-banner-content { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + } + + .consent-banner-text h3 { + margin: 0 0 8px 0; + font-size: 1.2rem; + color: #333; + } + + .consent-banner-text p { + margin: 0; + color: #666; + font-size: 0.95rem; + } + + .consent-banner-actions { + display: flex; + gap: 10px; + flex-wrap: wrap; + } + + .consent-details { + border-top: 1px solid #eee; + padding: 20px; + max-width: 1200px; + margin: 0 auto; + } + + .consent-category { + margin-bottom: 20px; + } + + .consent-switch { + display: flex; + align-items: center; + gap: 15px; + cursor: pointer; + padding: 15px; + border: 1px solid #ddd; + border-radius: 8px; + background: #f8f9fa; + } + + .consent-switch input[type="checkbox"] { + width: 20px; + height: 20px; + margin: 0; + } + + .consent-info strong { + display: block; + margin-bottom: 5px; + color: #333; + } + + .consent-info p { + margin: 0; + color: #666; + font-size: 0.9rem; + } + + .consent-actions { + text-align: center; + margin-top: 20px; + } + + @media (max-width: 768px) { + .consent-banner-content { + flex-direction: column; + text-align: center; + } + + .consent-banner-actions { + justify-content: center; + width: 100%; + } + } + `; + + document.head.appendChild(styles); + } + + // Cookie utility methods + setCookie(name, value, days) { + const expires = new Date(); + expires.setTime(expires.getTime() + (days * 24 * 60 * 60 * 1000)); + document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/;SameSite=Lax`; + } + + getCookie(name) { + const nameEQ = name + "="; + const ca = document.cookie.split(';'); + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) === ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); + } + return null; + } + + // Public API for consent preference management + openConsentPreferences() { + this.showConsentBanner(); + // If banner already exists, show customize options + setTimeout(() => { + if (document.getElementById('consent-banner')) { + this.showCustomizeOptions(); + } + }, 100); + } + + // Check current consent status + hasAnalyticsConsent() { + return this.consentState.analytics_storage === 'granted'; + } + + hasAdvertisingConsent() { + return this.consentState.ad_storage === 'granted'; + } + + // Method to revoke consent (useful for "forget me" functionality) + revokeAllConsent() { + this.rejectAllConsent(); + // Also clear any existing tracking cookies + this.clearTrackingCookies(); + // Erase Clarity cookies according to documentation + if (window.clarity) { + clarity('consent', false); + } + } + + clearTrackingCookies() { + // Clear common tracking cookies (Google Analytics and Microsoft Clarity) + const trackingCookies = ['_ga', '_gid', '_gat', '_clck', '_clsk', 'CLID', 'ANONCHK', 'MR', 'MUID', 'SM']; + trackingCookies.forEach(cookieName => { + document.cookie = `${cookieName}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`; + }); + } +} + +// Initialize consent manager when DOM is ready +document.addEventListener('DOMContentLoaded', function() { + // Check for configuration from script tag data attributes + const configScript = document.querySelector('script[data-consent-config]'); + const config = configScript ? JSON.parse(configScript.dataset.consentConfig) : {}; + + window.consentManager = new ConsentManager(config); +}); + +// Global function for opening consent preferences +window.openConsentPreferences = function() { + if (window.consentManager) { + window.consentManager.openConsentPreferences(); + } +}; \ No newline at end of file diff --git a/EssentialCSharp.Web/wwwroot/js/qr.js b/EssentialCSharp.Web/wwwroot/js/qr.js new file mode 100644 index 00000000..33dbc7ce --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/js/qr.js @@ -0,0 +1,9 @@ +ο»Ώwindow.addEventListener("load", () => { + const uri = document.getElementById("qrCodeData").getAttribute('data-url'); + new QRCode(document.getElementById("qrCode"), + { + text: uri, + width: 150, + height: 150 + }); +}); diff --git a/EssentialCSharp.Web/wwwroot/js/site.js b/EssentialCSharp.Web/wwwroot/js/site.js index ff40a309..7eefaa29 100644 --- a/EssentialCSharp.Web/wwwroot/js/site.js +++ b/EssentialCSharp.Web/wwwroot/js/site.js @@ -1,278 +1,394 @@ -import { - createApp, - ref, - reactive, - onMounted, - markRaw, - watch, - computed, -} from "vue"; -import { useWindowSize } from "vue-window-size"; - -/** - * @typedef {Object} TocItem - * @prop {number} [level] - * @prop {string} [key] - * @prop {string} [href] - * @prop {string} [title] - * @prop {TocItem[]} [items] - */ -/** @type {TocItem} */ -const tocData = markRaw(TOC_DATA); - -//Add new content or features here: - -const featuresComingSoonList = [ - { - title: "Client-side Compiler", - text: "Write, compile, and run code snippets right from your browser. Enjoy hands-on experience with the code as you go through the site.", - }, - { - title: "Interactive Code Listings", - text: "Edit, compile, and run the code listings found throughout Essential C#.", - }, - { - title: "Full Text Search", - text: "Search for keywords and phrases to easily find relevant information.", - }, - { - title: "Hyperlinking", - text: "Easily navigate to interesting and relevant sites as well as related sections in Essential C#.", - }, - { - title: "Table of Contents Filtering", - text: "The Table of Contents filter will let you narrow down the list of topics to help you quickly and easily find your destination.", - }, -]; - -const contentComingSoonList = [ - { - title: "records", - text: "New feature from C# 9.", - }, - { - title: "File Scoped namespaces", - text: "New feature from C# 10.", - }, - { - title: "using Statement Improvements", - text: "New feature from C# 10.", - }, - { - title: "Pattern Matching Improvements", - text: "Feature improvements from C# 11.", - }, - { - title: "required Members", - text: "New feature from C# 11.", - }, -]; - -const completedFeaturesList = [ - { - title: "Copying Header Hyperlinks", - text: "Easily copy a header URL to link to a book section.", - }, - { - title: "Home Page", - text: "Add a home page that features a short description of the book and a high level mindmap.", - }, - { - title: "Keyboard Shortcuts", - text: "Quickly navigate through the book via keyboard shortcuts (right/left arrows, 'n', 'p').", - }, -]; - -/** - * Find the path of TOC entries that lead to the current page. - * @param {TocItem[]} path - * @param {TocItem[]} items - * @returns {TocItem[] | undefined} path of items to the current page - * */ -function findCurrentPage(path, items) { - for (const item of items) { - const itemPath = [item, ...path]; - if ( - window.location.href.endsWith("/" + item.href) || - window.location.href.endsWith("/" + item.key) - ) { - return itemPath; - } - - const recursivePath = findCurrentPage(itemPath, item.items); - if (recursivePath) return recursivePath; - } -} - -function openSearch() { - const el = document - .getElementById("docsearch") - .querySelector(".DocSearch-Button"); - el.click(); -} - -const smallScreenSize = 768; - -const removeHashPath = (path) => { - if (!path) { - return null; - } - let index = path.indexOf("#"); - index = index > 0 ? index : path.length; - return path.substring(0, index); -}; -// v-bind dont like the # in the url -const nextPagePath = removeHashPath(NEXT_PAGE); -const previousPagePath = removeHashPath(PREVIOUS_PAGE); - -const app = createApp({ - setup() { - const { width: windowWidth } = useWindowSize(); - - const nextPageUrl = ref(nextPagePath); - const previousPageUrl = ref(previousPagePath); - - let snackbarTimeoutId = null; - const snackbarMessage = ref(); - const snackbarColor = ref(); - - function copyToClipboard(copyText) { - navigator.clipboard - .writeText(window.location.origin + "/" + copyText) - .then( - function () { - /* Success */ - snackbarColor.value = "white"; - snackbarMessage.value = "Copied url to clipboard!"; - }, - function (err) { - console.error("Could not copy text to clipboard: ", err); - snackbarColor.value = "red"; - snackbarMessage.value = - "Error: Could not copy text to clipboard: " + err; - } - ); - // Hide after 3 seconds - if (snackbarTimeoutId != null) { - clearTimeout(snackbarTimeoutId); - snackbarMessage.value = null; - } - snackbarTimeoutId = setTimeout( - () => (snackbarMessage.value = null), - 3000 - ); - } - - function goToPrevious() { - window.location.href = "/" + PREVIOUS_PAGE; - } - function goToNext() { - window.location.href = "/" + NEXT_PAGE; - } - - document.addEventListener("keydown", (e) => { - if (e.key == "ArrowRight") { - goToNext(); - } - - if (e.key == "ArrowLeft") { - goToPrevious(); - } - }); - - const sidebarShown = ref(false); - - const smallScreen = computed(() => { - return (windowWidth.value || 0) < smallScreenSize; - }); - - /** @type {import("vue").Ref<"toc" | "search">} */ - const sidebarTab = ref("toc"); - - const currentPage = findCurrentPage([], tocData) ?? []; - - const chapterParentPage = currentPage.find((parent) => parent.level === 0); - - const sectionTitle = ref(currentPage?.[0]?.title || "Essential C#"); - const expandedTocs = reactive(new Set()); - for (const item of currentPage) { - expandedTocs.add(item.key); - } - - // hide the sidebar when resizing to small screen - // to do: make it re emerge when going from small to big - watch(windowWidth, (newWidth, oldWidth) => { - //+ 50 so that the side bar diappears before the css media class changes the sidebar to take - // over the full screen - if (newWidth < smallScreenSize) { - sidebarShown.value = false; - } - // when making screen bigger reveal sidebar - else { - if (!sidebarShown.value) { - sidebarShown.value = true; - } - } - }); - - // prevent scrolling of the page when the sidebar is visible on small screens - watch(sidebarShown, (newValue, oldValue) => { - if (windowWidth.value <= smallScreenSize) { - if (newValue) { - document.body.classList.add("noScrollOnSmallScreen"); - } else { - document.body.classList.remove("noScrollOnSmallScreen"); - } - } - }); - - onMounted(() => { - if (windowWidth.value > smallScreenSize) { - sidebarShown.value = true; - } - - // Scroll the current selected page in the TOC into view of the TOC. - [...document.querySelectorAll(".current-section")] - .reverse()[0] - ?.scrollIntoView({ - behavior: "auto", - block: "center", - inline: "center", - }); - }); - - return { - previousPageUrl, - nextPageUrl, - goToPrevious, - goToNext, - openSearch, - - snackbarMessage, - snackbarColor, - copyToClipboard, - - contentComingSoonList, - featuresComingSoonList, - completedFeaturesList, - - sidebarShown, - sidebarTab, - - smallScreen, - - sectionTitle, - tocData, - expandedTocs, - currentPage, - chapterParentPage, - }; - }, -}); - -app.component("toc-tree", { - props: ["item", "expandedTocs", "currentPage"], - template: "#toc-tree", -}); - -app.mount("#app"); +import { + createApp, + ref, + reactive, + onMounted, + markRaw, + watch, + computed, +} from "vue"; +import { createVuetify } from "vuetify"; +import { useWindowSize } from "vue-window-size"; +import { useChatWidget } from "./chat-module.js"; +import { useTryDotNet } from "./trydotnet-module.js"; + +/** + * @typedef {Object} TocItem + * @prop {number} [level] + * @prop {string} [key] + * @prop {string} [href] + * @prop {string} [title] + * @prop {TocItem[]} [items] + */ +/** @type {TocItem} */ +const tocData = markRaw(TOC_DATA); + +//Add new content or features here: + +const featuresComingSoonList = [ + { + title: "AI Chat Assistant", + text: "Chat with an AI assistant that has access to Essential C# book content. Available as a floating widget on every page for contextual help while reading. Features streaming responses and markdown rendering.", + }, + { + title: "Client-side Compiler", + text: "Write, compile, and run code snippets right from your browser. Enjoy hands-on experience with the code as you go through the site.", + }, + { + title: "Interactive Code Listings", + text: "Edit, compile, and run the code listings found throughout Essential C#.", + }, + { + title: "Hyperlinking", + text: "Easily navigate to interesting and relevant sites as well as related sections in Essential C#.", + }, +]; + +const contentComingSoonList = [ + { + title: "Experimental attribute", + text: "New feature from C# 12.0.", + }, + { + title: "Source Generators", + text: "A newer .NET feature.", + }, + { + title: "C# 13.0 Features", + text: "Various new features coming in .C# 13.0", + }, +]; + +const completedFeaturesList = [ + { + title: "Copying Header Hyperlinks", + text: "Easily copy a header URL to link to a book section.", + }, + { + title: "Home Page", + text: "Add a home page that features a short description of the book and a high level mindmap.", + }, + { + title: "Keyboard Shortcuts", + text: "Quickly navigate through the book via keyboard shortcuts (right/left arrows, 'n', 'p').", + }, +]; + +/** + * Find the path of TOC entries that lead to the current page. + * @param {TocItem[]} path + * @param {TocItem[]} items + * @returns {TocItem[] | undefined} path of items to the current page + * */ +function findCurrentPage(path, items) { + for (const item of items) { + const itemPath = [item, ...path]; + if ( + window.location.href.endsWith("/" + item.href) || + window.location.href.endsWith("/" + item.key) + ) { + return itemPath; + } + + const recursivePath = findCurrentPage(itemPath, item.items); + if (recursivePath) return recursivePath; + } +} + +function openSearch() { + const el = document + .getElementById("docsearch") + .querySelector(".DocSearch-Button"); + el.click(); +} + +const smallScreenSize = 768; + +const removeHashPath = (path) => { + if (!path) { + return null; + } + let index = path.indexOf("#"); + index = index > 0 ? index : path.length; + return path.substring(0, index); +}; +// v-bind dont like the # in the url +const nextPagePath = removeHashPath(NEXT_PAGE); +const previousPagePath = removeHashPath(PREVIOUS_PAGE); + +const app = createApp({ + setup() { + const { width: windowWidth } = useWindowSize(); + + const nextPageUrl = ref(nextPagePath); + const previousPageUrl = ref(previousPagePath); + + let snackbarTimeoutId = null; + const snackbarMessage = ref(); + const snackbarColor = ref(); + + function copyToClipboard(copyText) { + let url; + + // If copyText contains a #, it's a full path with anchor (e.g., 'page#anchor') + // If copyText doesn't contain a #, it's just an anchor for the current page + if (copyText.includes('#')) { + // Full path case: construct URL with origin + path + url = window.location.origin + "/" + copyText; + } else { + // Anchor only case: use current page URL + anchor + const currentUrl = window.location.href.split('#')[0]; // Remove any existing anchor + url = currentUrl + "#" + copyText; + } + + let referralId = REFERRAL_ID; + if (referralId && referralId.trim()) { + url = addQueryParam(url, 'rid', referralId); + } + navigator.clipboard + .writeText(url) + .then( + function () { + /* Success */ + snackbarColor.value = "white"; + snackbarMessage.value = "Copied url to clipboard!"; + }, + function (err) { + console.error("Could not copy text to clipboard: ", err); + snackbarColor.value = "red"; + snackbarMessage.value = + "Error: Could not copy text to clipboard: " + err; + } + ); + // Hide after 3 seconds + if (snackbarTimeoutId != null) { + clearTimeout(snackbarTimeoutId); + snackbarMessage.value = null; + } + snackbarTimeoutId = setTimeout( + () => (snackbarMessage.value = null), + 3000 + ); + } + + function addQueryParam(url, key, value) { + let urlObj = new URL(url, window.location.origin); + urlObj.searchParams.set(key, value); + return urlObj.toString(); + } + + function goToPrevious() { + let previousPage = PREVIOUS_PAGE; + if (previousPage !== null) { + window.location.href = "/" + previousPage; + } + } + function goToNext() { + let nextPage = NEXT_PAGE; + if (nextPage !== null) { + window.location.href = "/" + nextPage; + } + } + + document.addEventListener("keydown", (e) => { + let selectionString = document.getSelection().toString(); + if (e.key == "ArrowRight") { + if (!selectionString) { + goToNext(); + } + } + + if (e.key == "ArrowLeft") { + if (!selectionString) { + goToPrevious(); + } + } + + if (e.code == "KeyM" && e.ctrlKey) { + toggleSidebar(); + } + }); + + const sidebarShown = ref(localStorage.getItem('sidebarShown')); + + const smallScreen = computed(() => { + return (windowWidth.value || 0) < smallScreenSize; + }); + + function toggleSidebar() { + sidebarShown.value = !sidebarShown.value; + localStorage.setItem('sidebarShown', sidebarShown.value); + } + + /** @type {import("vue").Ref<"toc" | "search">} */ + const sidebarTab = ref("toc"); + + const currentPage = findCurrentPage([], tocData) ?? []; + + const percentComplete = ref(PERCENT_COMPLETE); + + const chapterParentPage = currentPage.find((parent) => parent.level === 0); + + const sectionTitle = ref(currentPage?.[0]?.title || "Essential C#"); + const expandedTocs = reactive(new Set()); + for (const item of currentPage) { + expandedTocs.add(item.key); + } + + // hide the sidebar when resizing to small screen + // to do: make it re emerge when going from small to big + watch(windowWidth, (newWidth, oldWidth) => { + //+ 50 so that the side bar diappears before the css media class changes the sidebar to take + // over the full screen + // If a setting is set in storage already, follow that + if (sidebarShown.value === null) { + if (newWidth < smallScreenSize) { + sidebarShown.value = false; + } + // when making screen bigger reveal sidebar + else { + if (!sidebarShown.value) { + sidebarShown.value = true; + } + } + } + }); + + // prevent scrolling of the page when the sidebar is visible on small screens + watch(sidebarShown, (newValue, oldValue) => { + if (windowWidth.value <= smallScreenSize) { + if (newValue) { + document.body.classList.add("noScrollOnSmallScreen"); + } else { + document.body.classList.remove("noScrollOnSmallScreen"); + } + } + }); + + onMounted(() => { + // If a setting is set in storage already, follow that + if (sidebarShown.value === null) { + if (windowWidth.value > smallScreenSize) { + sidebarShown.value = true; + } + } + + // Scroll the current selected page in the TOC into view of the TOC. + [...document.querySelectorAll(".current-section")] + .reverse()[0] + ?.scrollIntoView({ + behavior: "auto", + block: "center", + inline: "center", + }); + }); + + const enableTocFilter = ref('none'); + const searchQuery = ref(''); + + const filteredTocData = computed(() => { + if (!searchQuery.value) { + return tocData; + } + const query = normalizeString(searchQuery.value); + return tocData.filter(item => filterItem(item, query)); + }); + + const isContentPage = computed(() => { + let path = window.location.pathname; + return path !== '/home' && path !== '/guidelines' && path !== '/about' && path !== '/announcements'; + }); + + function filterItem(item, query) { + let matches = normalizeString(item.title).includes(query); + if (item.items && item.items.length) { + const childMatches = item.items.some(child => filterItem(child, query)); + matches = matches || childMatches; + } + return matches; + } + + watch(searchQuery, (newQuery) => { + if (!newQuery) { + expandedTocs.clear(); + // If a search query is removed, open the TOC for the current page. + for (const item of currentPage) { + expandedTocs.add(item.key); + } + } + else { + expandedTocs.clear(); + const query = normalizeString(newQuery); + tocData.forEach(item => { + if (filterItem(item, query)) { + expandedTocs.add(item.key); + } + }); + } + }); + + function normalizeString(str) { + return str.replace(/[^\w\s]|_/g, "").replace(/\s+/g, " ").toLowerCase(); + } + + // Initialize chat functionality + const chatWidget = useChatWidget(); + + // Initialize TryDotNet code runner functionality + const tryDotNet = useTryDotNet(); + + return { + previousPageUrl, + nextPageUrl, + goToPrevious, + goToNext, + openSearch, + + snackbarMessage, + snackbarColor, + copyToClipboard, + + contentComingSoonList, + featuresComingSoonList, + completedFeaturesList, + + sidebarShown, + sidebarTab, + toggleSidebar, + + smallScreen, + + sectionTitle, + tocData, + expandedTocs, + currentPage, + percentComplete, + chapterParentPage, + + searchQuery, + filteredTocData, + enableTocFilter, + isContentPage, + + ...chatWidget, + ...tryDotNet + }; + }, +}); + +app.component("toc-tree", { + props: ["item", "expandedTocs", "currentPage"], + template: "#toc-tree", +}); + +// Create and configure Vuetify +const vuetify = createVuetify({ + theme: { + defaultTheme: 'light' + } +}); + +// Use Vuetify with the Vue app +app.use(vuetify); + +app.mount("#app"); \ No newline at end of file diff --git a/EssentialCSharp.Web/wwwroot/js/trydotnet-module.js b/EssentialCSharp.Web/wwwroot/js/trydotnet-module.js new file mode 100644 index 00000000..47345add --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/js/trydotnet-module.js @@ -0,0 +1,675 @@ +// TryDotNet Module - Vue.js composable for interactive code execution +import { ref, nextTick, onMounted, onUnmounted } from 'vue'; + +// Timeout durations (ms) +const HEALTH_CHECK_TIMEOUT = 5000; +const SESSION_CREATION_TIMEOUT = 20000; +const RUN_TIMEOUT = 30000; + +// User-friendly error messages +const ERROR_MESSAGES = { + serviceUnavailable: 'The code execution service is currently unavailable. Please try again later.', + serviceNotConfigured: 'Interactive code execution is not available at this time.', + sessionTimeout: 'The code editor took too long to load. The service may be temporarily unavailable.', + runTimeout: 'Code execution timed out. The service may be temporarily unavailable.', + editorNotFound: 'Could not initialize the code editor. Please try again.', + sessionNotInitialized: 'The code editor session is not ready. Please try reopening the code runner.', + fetchFailed: 'Could not load the listing source code. Please try again.', +}; + +/** + * Races a promise against a timeout. Rejects with the given message if the + * timeout fires first. + * @param {Promise} promise - The promise to race + * @param {number} ms - Timeout in milliseconds + * @param {string} timeoutMsg - Message for the timeout error + * @returns {Promise} + */ +function withTimeout(promise, ms, timeoutMsg) { + let timer; + const timeout = new Promise((_, reject) => { + timer = setTimeout(() => reject(new Error(timeoutMsg)), ms); + }); + return Promise.race([promise, timeout]).finally(() => clearTimeout(timer)); +} + +/** + * Checks whether the TryDotNet origin is configured and non-empty. + * @returns {boolean} + */ +function isTryDotNetConfigured() { + const origin = window.TRYDOTNET_ORIGIN; + return typeof origin === 'string' && origin.trim().length > 0; +} + +// ── Runnable-listings data (loaded once from chapter-listings.json) ────────── + +/** @type {Promise>|null} */ +let _runnableListingsPromise = null; + +/** + * Loads chapter-listings.json (once) and builds a Set of normalised + * "chapter.listing" keys, e.g. "1.3", "12.50". + * Only includes listings where both can_compile and can_run are true. + * @returns {Promise>} + */ +function loadRunnableListings() { + if (_runnableListingsPromise) return _runnableListingsPromise; + + _runnableListingsPromise = fetch('/js/chapter-listings.json') + .then(res => { + if (!res.ok) { + const msg = res.status === 404 + ? 'chapter-listings.json not found (404). The NuGet content package may not be restored β€” Run buttons will not be shown.' + : `Failed to load chapter-listings.json: ${res.status}`; + throw new Error(msg); + } + return res.json(); + }) + .then(data => { + const set = new Set(); + const chapters = data.chapters || {}; + for (const [, files] of Object.entries(chapters)) { + for (const fileObj of files) { + // fileObj is now { filename: "01.03.cs", can_compile: true, can_run: true } + if (!fileObj.can_compile || !fileObj.can_run) continue; // Skip listings that can't compile or can't run + + const filename = fileObj.filename; + // filename looks like "01.03.cs" β†’ chapter 1, listing 3 + const m = filename.match(/^(\d+)\.(\d+)\./); + if (m) { + set.add(`${parseInt(m[1], 10)}.${parseInt(m[2], 10)}`); + } + } + } + return set; + }) + .catch(err => { + console.warn('Could not load runnable listings:', err); + _runnableListingsPromise = null; // Allow retry on next call (e.g. transient network error) + return new Set(); // graceful degradation β€” no Run buttons + }); + + return _runnableListingsPromise; +} + +/** + * Strips #region / #endregion directive lines (INCLUDE, EXCLUDE, etc.) + * from source code while keeping the code between them intact. + * @param {string} code - Raw source code + * @returns {string} Code with region directive lines removed + */ +function stripRegionDirectives(code) { + return code.replace(/^\s*#(?:region|endregion)\s+(?:INCLUDE|EXCLUDE).*$/gm, '').trim(); +} + +/** + * Creates scaffolding for user code to run in the TryDotNet environment. + * @param {string} userCode - The user's C# code to wrap + * @returns {string} Scaffolded code with proper using statements and Main method + */ +function createScaffolding(userCode) { + return ` +namespace Program +{ + class Program + { + static void Main(string[] args) + { + #region controller +${userCode} + #endregion + } + } +}`; +} + +/** + * Dynamically loads a script and returns a promise that resolves when loaded. + * @param {string} url - URL of the script to load + * @param {string} globalName - Name of the global variable the script creates + * @param {number} timeLimit - Maximum time to wait for script load + * @returns {Promise} Promise resolving to the global object + */ +function loadLibrary(url, globalName, timeLimit = 15000) { + return new Promise((resolve, reject) => { + // Check if already loaded + if (globalName && window[globalName]) { + resolve(window[globalName]); + return; + } + + const timeout = setTimeout(() => { + reject(new Error(`${url} load timeout`)); + }, timeLimit); + + const script = document.createElement('script'); + script.src = url; + script.async = true; + script.defer = true; + script.crossOrigin = 'anonymous'; + + script.onload = () => { + clearTimeout(timeout); + if (globalName && !window[globalName]) { + reject(new Error(`${url} loaded but ${globalName} is undefined`)); + } else { + resolve(window[globalName]); + } + }; + + script.onerror = () => { + clearTimeout(timeout); + reject(new Error(`Failed to load ${url}`)); + }; + + document.head.appendChild(script); + }); +} + +/** + * Vue composable for TryDotNet code execution functionality. + * @returns {Object} Composable state and methods + */ +export function useTryDotNet() { + // State + const isCodeRunnerOpen = ref(false); + const codeRunnerLoading = ref(false); + const codeRunnerError = ref(null); + const codeRunnerOutput = ref(''); + const codeRunnerOutputError = ref(false); + const currentListingInfo = ref(null); + const isRunning = ref(false); + const isLibraryLoaded = ref(false); + + // Internal state (not exposed) + let trydotnet = null; + let session = null; + let editorElement = null; + let currentLoadedListing = null; // Track which listing is currently loaded + + /** + * Gets the TryDotNet origin URL from config. + * @returns {string} The TryDotNet service origin URL + */ + function getTryDotNetOrigin() { + return window.TRYDOTNET_ORIGIN; + } + + /** + * Performs a lightweight reachability check against the TryDotNet origin. + * Rejects with a user-friendly message when the service is unreachable. + * @returns {Promise} + */ + async function checkServiceHealth() { + const origin = getTryDotNetOrigin(); + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), HEALTH_CHECK_TIMEOUT); + + try { + // Check the actual script endpoint rather than the bare origin, + // which may not have a handler and would return 404. + const res = await fetch(`${origin}/api/trydotnet.min.js`, { + method: 'HEAD', + mode: 'no-cors', + signal: controller.signal, + }); + // mode: 'no-cors' gives an opaque response (status 0), which is fine + // β€” we only care that the network request didn't fail. + } catch { + throw new Error(ERROR_MESSAGES.serviceUnavailable); + } finally { + clearTimeout(timer); + } + } + + /** + * Loads the TryDotNet library from the service. + * Performs a health check first to fail fast. + * @returns {Promise} + */ + async function loadTryDotNetLibrary() { + if (isLibraryLoaded.value && trydotnet) { + return; + } + + if (!isTryDotNetConfigured()) { + throw new Error(ERROR_MESSAGES.serviceNotConfigured); + } + + // Fail fast if the service is unreachable + await checkServiceHealth(); + + const origin = getTryDotNetOrigin(); + const trydotnetUrl = `${origin}/api/trydotnet.min.js`; + + try { + trydotnet = await loadLibrary(trydotnetUrl, 'trydotnet', 15000); + if (!trydotnet) { + throw new Error(ERROR_MESSAGES.serviceUnavailable); + } + isLibraryLoaded.value = true; + } catch (error) { + console.error('Failed to load TryDotNet library:', error); + throw new Error(ERROR_MESSAGES.serviceUnavailable); + } + } + + /** + * Creates a TryDotNet session with the editor iframe and initial code. + * @param {HTMLElement} editorEl - The iframe element for the Monaco editor + * @param {string} userCode - The C# code to display in the editor + * @returns {Promise} + */ + async function createSession(editorEl, userCode) { + if (!trydotnet) { + throw new Error('TryDotNet library not loaded'); + } + + editorElement = editorEl; + + const hostOrigin = window.location.origin; + window.postMessage({ type: 'HostEditorReady', editorId: '0' }, hostOrigin); + + const fileName = 'Program.cs'; + const isComplete = isCompleteProgram(userCode); + const fileContent = isComplete ? userCode : createScaffolding(userCode); + const files = [{ name: fileName, content: fileContent }]; + const project = { package: 'console', files: files }; + const document = isComplete + ? fileName + : { fileName: fileName, region: 'controller' }; + + const configuration = { + hostOrigin: hostOrigin, + trydotnetOrigin: getTryDotNetOrigin(), + enableLogging: false + }; + + session = await withTimeout( + trydotnet.createSessionWithProjectAndOpenDocument( + configuration, + [editorElement], + window, + project, + document + ), + SESSION_CREATION_TIMEOUT, + ERROR_MESSAGES.sessionTimeout + ); + + // Subscribe to output events + session.subscribeToOutputEvents((event) => { + handleOutput(event); + }); + } + + /** + * Sets code in the Monaco editor. + * @param {string} userCode - The C# code to display in the editor + * @returns {Promise} + */ + async function setCode(userCode) { + if (!session || !trydotnet) { + throw new Error('Session not initialized'); + } + + const isComplete = isCompleteProgram(userCode); + const fileContent = isComplete ? userCode : createScaffolding(userCode); + const fileName = 'Program.cs'; + const files = [{ name: fileName, content: fileContent }]; + const project = await trydotnet.createProject({ + packageName: 'console', + files: files + }); + + await session.openProject(project); + + const defaultEditor = session.getTextEditor(); + const documentOptions = { + fileName: fileName, + editorId: defaultEditor.id() + }; + + // Only add region for scaffolded code + if (!isComplete) { + documentOptions.region = 'controller'; + } + + await session.openDocument(documentOptions); + } + + /** + * Runs the code currently in the editor. + * @returns {Promise} + */ + async function runCode() { + if (!session) { + codeRunnerOutput.value = ERROR_MESSAGES.sessionNotInitialized; + codeRunnerOutputError.value = true; + return; + } + + codeRunnerOutput.value = 'Running...'; + codeRunnerOutputError.value = false; + isRunning.value = true; + + try { + await withTimeout(session.run(), RUN_TIMEOUT, ERROR_MESSAGES.runTimeout); + } catch (error) { + codeRunnerOutput.value = error.message; + codeRunnerOutputError.value = true; + } finally { + isRunning.value = false; + } + } + + /** + * Clears the editor content. + */ + function clearEditor() { + if (!session) return; + + const textEditor = session.getTextEditor(); + if (textEditor) { + textEditor.setContent(''); + codeRunnerOutput.value = 'Editor cleared.'; + codeRunnerOutputError.value = false; + } + } + + /** + * Handles output events from the TryDotNet session. + * @param {Object} event - Output event from TryDotNet + */ + function handleOutput(event) { + if (event.exception) { + codeRunnerOutput.value = event.exception.join('\n'); + codeRunnerOutputError.value = true; + } else if (event.diagnostics && event.diagnostics.length > 0) { + // Handle compilation errors/warnings + const diagnosticMessages = event.diagnostics.map(d => { + const severity = d.severity || 'Error'; + const location = d.location ? `(${d.location})` : ''; + const id = d.id ? `${d.id}: ` : ''; + return `${severity} ${location}: ${id}${d.message}`; + }); + codeRunnerOutput.value = diagnosticMessages.join('\n'); + codeRunnerOutputError.value = true; + } else if (event.stderr && event.stderr.length > 0) { + // Handle standard error output + codeRunnerOutput.value = event.stderr.join('\n'); + codeRunnerOutputError.value = true; + } else if (event.stdout) { + codeRunnerOutput.value = event.stdout.join('\n'); + codeRunnerOutputError.value = false; + } else { + codeRunnerOutput.value = 'No output'; + codeRunnerOutputError.value = false; + } + isRunning.value = false; + } + + /** + * Checks if code is a complete C# program that doesn't need scaffolding. + * A program is "complete" when it contains a namespace declaration, OR + * when it defines any class with a static Main method. + * Top-level statement files (no class, no namespace) return false and + * will be wrapped by createScaffolding(). + * @param {string} code - Source code to check + * @returns {boolean} True if code is complete, false if it needs scaffolding + */ + function isCompleteProgram(code) { + // Check for explicit namespace declaration (most reliable indicator) + const hasNamespace = /namespace\s+\w+/i.test(code); + + // Check if any class has a static Main method + const hasClassWithMain = /class\s+\w+/.test(code) && + /static\s+(void|async\s+Task)\s+Main\s*\(/.test(code); + + return hasNamespace || hasClassWithMain; + } + + /** + * Fetches listing source code from the API. + * @param {string|number} chapter - Chapter number + * @param {string|number} listing - Listing number + * @returns {Promise} The listing source code (extracted snippet) + */ + async function fetchListingCode(chapter, listing) { + const response = await fetch(`/api/ListingSourceCode/chapter/${chapter}/listing/${listing}`); + if (!response.ok) { + throw new Error(ERROR_MESSAGES.fetchFailed); + } + const data = await response.json(); + const code = data.content || ''; + + // Complete programs (namespace or class+Main) are sent as-is, but + // with common usings prepended when the file has none β€” TryDotNet's + // 'console' package does not provide SDK implicit global usings. + // Top-level statement files get region directives stripped so the + // scaffolding wrapper doesn't contain raw #region lines. + if (isCompleteProgram(code)) { + return code; + } + return stripRegionDirectives(code); + } + + /** + * Opens the code runner panel with a specific listing. + * @param {string|number} chapter - Chapter number + * @param {string|number} listing - Listing number + * @param {string} title - Title to display + */ + async function openCodeRunner(chapter, listing, title) { + currentListingInfo.value = { chapter, listing, title }; + isCodeRunnerOpen.value = true; + codeRunnerLoading.value = true; + codeRunnerError.value = null; + codeRunnerOutput.value = 'Click "Run" to execute the code.'; + codeRunnerOutputError.value = false; + + const listingKey = `${chapter}.${listing}`; + + try { + // Load the library if not already loaded + if (!isLibraryLoaded.value) { + await loadTryDotNetLibrary(); + } + + // Wait for the panel to render and get the editor element + await nextTick(); + + const editorEl = document.querySelector('.code-runner-editor'); + if (!editorEl) { + throw new Error(ERROR_MESSAGES.editorNotFound); + } + + // Check if this listing is already loaded in the session + if (session && currentLoadedListing === listingKey) { + // Listing already loaded, just show the panel + codeRunnerLoading.value = false; + return; + } + + // Fetch the listing code + const code = await fetchListingCode(chapter, listing); + + // Create session if needed with the fetched code + if (!session) { + await createSession(editorEl, code); + currentLoadedListing = listingKey; + } else { + // Session exists, update the code + await setCode(code); + currentLoadedListing = listingKey; + } + + codeRunnerLoading.value = false; + } catch (error) { + console.error('Failed to open code runner:', error); + codeRunnerError.value = error.message || ERROR_MESSAGES.serviceUnavailable; + codeRunnerLoading.value = false; + } + } + + /** + * Retries opening the code runner after a failure. + * Resets the session so a fresh connection is attempted. + */ + function retryCodeRunner() { + // Reset session state so a fresh connection is attempted + session = null; + currentLoadedListing = null; + isLibraryLoaded.value = false; + trydotnet = null; + + if (currentListingInfo.value) { + const { chapter, listing, title } = currentListingInfo.value; + openCodeRunner(chapter, listing, title); + } + } + + /** + * Closes the code runner panel. + */ + function closeCodeRunner() { + isCodeRunnerOpen.value = false; + currentListingInfo.value = null; + // Note: We keep the session and currentLoadedListing to avoid recreating when reopened + } + + /** + * Clears the output console. + */ + function clearOutput() { + codeRunnerOutput.value = ''; + codeRunnerOutputError.value = false; + } + + /** + * Injects Run buttons into code block sections. + * Skipped entirely when TryDotNet origin is not configured. + * Only adds buttons for listings present in chapter-listings.json. + */ + async function injectRunButtons() { + if (!isTryDotNetConfigured()) { + return; // Don't show Run buttons when the service is not configured + } + + // Pre-load the runnable listings set so we can check membership below + const runnableSet = await loadRunnableListings(); + if (runnableSet.size === 0) { + return; // JSON failed to load or is empty β€” no buttons + } + + const codeBlocks = document.querySelectorAll('.code-block-section'); + + codeBlocks.forEach((block) => { + const heading = block.querySelector('.code-block-heading'); + if (!heading) return; + + // Skip if button already injected + if (heading.querySelector('.code-runner-btn')) return; + + // Parse chapter and listing numbers from the heading + // Format 1: Listing 1.22 + // Format 2: Listing 1.1: Title + let chapter = null; + let listing = null; + + // First, try to extract from the full heading text + // Pattern: "Listing 1.22" or "Listing 1.1:" + const headingText = heading.textContent; + const listingMatch = headingText.match(/Listing\s+(\d+)\.(\d+)/i); + + if (listingMatch) { + chapter = listingMatch[1]; + listing = listingMatch[2]; + } else { + // Fallback to old method for other formats + const spans = heading.querySelectorAll('span'); + + spans.forEach((span) => { + if (span.classList.contains('TBLNUM')) { + // Extract chapter number (format: "1." -> "1") + const match = span.textContent.match(/(\d+)\./); + if (match) { + chapter = match[1]; + } + } + if (span.classList.contains('CDTNUM') && chapter !== null && listing === null) { + // The CDTNUM after TBLNUM contains the listing number + const num = span.textContent.trim(); + if (/^\d+$/.test(num)) { + listing = num; + } + } + }); + } + + // Only add button for listings present in the curated JSON + if (chapter && listing && runnableSet.has(`${parseInt(chapter, 10)}.${parseInt(listing, 10)}`)) { + // Wrap existing content in a span to keep it together + const contentWrapper = document.createElement('span'); + while (heading.firstChild) { + contentWrapper.appendChild(heading.firstChild); + } + + // Make heading a flex container + heading.style.display = 'flex'; + heading.style.justifyContent = 'space-between'; + heading.style.alignItems = 'center'; + + // Add wrapped content back + heading.appendChild(contentWrapper); + + // Create run button + const runButton = document.createElement('button'); + runButton.className = 'code-runner-btn'; + runButton.type = 'button'; + runButton.title = `Run Listing ${chapter}.${listing}`; + runButton.innerHTML = ' Run'; + runButton.setAttribute('aria-label', `Run Listing ${chapter}.${listing}`); + + runButton.addEventListener('click', (e) => { + e.preventDefault(); + e.stopPropagation(); + openCodeRunner(chapter, listing, `Listing ${chapter}.${listing}`); + }); + + heading.appendChild(runButton); + } + }); + } + + // Lifecycle hooks + onMounted(() => { + // Inject run buttons after component mounts + nextTick(() => { + injectRunButtons(); + }); + }); + + // Return composable interface + return { + // State + isCodeRunnerOpen, + codeRunnerLoading, + codeRunnerError, + codeRunnerOutput, + codeRunnerOutputError, + currentListingInfo, + isRunning, + isLibraryLoaded, + + // Methods + openCodeRunner, + closeCodeRunner, + retryCodeRunner, + runCode, + clearEditor, + clearOutput, + injectRunButtons + }; +} diff --git a/EssentialCSharp.Web/wwwroot/lib/docsearch/style.css b/EssentialCSharp.Web/wwwroot/lib/docsearch/style.css new file mode 100644 index 00000000..68aad247 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/docsearch/style.css @@ -0,0 +1,2 @@ +/*! @docsearch/css 3.3.3 | MIT License | Β© Algolia, Inc. and contributors | https://docsearch.algolia.com */ +:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,0.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,0.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,0.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,0.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,0.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,0.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,0.5),0 -4px 8px 0 rgba(0,0,0,0.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"Β» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}} \ No newline at end of file diff --git a/EssentialCSharp.Web/wwwroot/lib/es-module-shims/LICENSE b/EssentialCSharp.Web/wwwroot/lib/es-module-shims/LICENSE new file mode 100644 index 00000000..e67426b5 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/es-module-shims/LICENSE @@ -0,0 +1,10 @@ +MIT License +----------- + +Copyright (C) 2018-2021 Guy Bedford + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/EssentialCSharp.Web/wwwroot/lib/es-module-shims/README.md b/EssentialCSharp.Web/wwwroot/lib/es-module-shims/README.md new file mode 100644 index 00000000..93743f00 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/es-module-shims/README.md @@ -0,0 +1,935 @@ +# ES Module Shims + +Polyfills import maps and other ES Modules features on top of the baseline native ESM support in browsers. + +With import maps now supported by all major browsers, ES Module Shims entirely bypasses processing for the [74% of users](https://caniuse.com/import-maps) with native import maps support. + +For the remaining users, the highly performant (see [benchmarks](#benchmarks)) production and [CSP-compatible](#csp-support) shim kicks in to rewrite module specifiers driven by the [Web Assembly ES Module Lexer](https://github.com/guybedford/es-module-lexer). + +The following modules features are polyfilled: + +* [Import Maps](#import-maps) polyfill. +* Dynamic `import()` shimming when necessary in eg older Firefox versions. +* `import.meta` and `import.meta.url`. +* [JSON](#json-modules) and [CSS modules](#css-modules) with import assertions (when enabled). +* [Wasm modules](#wasm-modules) when enabled. +* [`` is shimmed](#modulepreload) in browsers without import maps support. + +When running in shim mode, module rewriting is applied for all users and custom [resolve](#resolve-hook) and [fetch](#fetch-hook) hooks can be implemented allowing for custom resolution and streaming in-browser transform workflows. + +Because we are still using the native module loader the edge cases work out comprehensively, including: + +* Live bindings in ES modules +* Dynamic import expressions (`import('src/' + varname')`) +* Circular references, with the execption that live bindings are disabled for the first unexecuted circular parent. + +> [Built with](https://github.com/guybedford/es-module-shims/blob/main/chompfile.toml) [Chomp](https://chompbuild.com/) + +## Usage + +Include ES Module Shims with a `async` attribute on the script, then include an import map and module scripts normally: + +```html + + + + + + +``` + +## Polyfill Explainer + +When running the previous example in a browser without import maps support, the browser will output the following console error: + +``` +Uncaught TypeError: Failed to resolve module specifier "react". Relative references must start with either "/", "./", or "../". + at :1:15 +``` + +This error is important - it means that the native browser loader didn't execute any of the code at all because this error happens +at link time, and before execution time. And this is what allows the polyfill to be able to reexecute the modules and their dependencies +without risk of duplicate execution. + +The ES Module Shims polyfill will analyze the browser to see if it supports import maps. If it does, it doesn't do anything more, +otherwise it will analyze all module scripts on the page to see if any of them have bare specifier imports that will fail like this. +If one is found, it will then be reexecuted through ES Module Shims using its internal shimming of modules features. + +When the polyfill kicks in another console log message is output(which can be disabled or customized via the [polyfill hook](#polyfill-hook)): + +``` +^^ Module TypeError above is polyfilled and can be ignored ^^ +``` + +### Polyfill Edge Case: Dynamic Import + +Only static link-time errors are polyfilled, not runtime errors. + +Module feature errors that are not _static errors_ but rather _runtime errors_ will bypass the polyfill detection. + +For example: + +```html + +``` + +In the above, the native browser loader without import maps support will execute the above module, but fail the dynamic import. + +See the log output in various scenarios: + +* Native with Import Maps: `Static Ok`, `Dynamic Ok` +* Native without Import Maps: `Static Ok`, `Dynamic Fail` +* Native without Import Maps running ES Module Shims: `Static Ok`, `Dynamic Fail` + +ES Module Shims **does not polyfill the dynamic import**. The reason for this is that if it did, it would need to reexecute the entire outer module resulting in `Static Ok`, `Dynamic Fail`, `Static Ok`, `Dynamic Ok`. This _double execution_ would be a change of the normal execution in running code twice that would not be deemed suitable for calling it a polyfill. + +This is why it is advisable to always ensure modules use a bare specifier early to avoid non-execution. + +If a static failure is not possible and dynamic import must be used, one alternative is to use the `importShim` ES Module Shims top-level loader: + +```html + +``` + +`importShim` will automatically pass-through to the native dynamic import or polyfill as necessary, just like it does for script tags. + +### Polyfill Edge Case: Instance Sharing + +When running in polyfill mode, it can be thought of that are effectively two loaders running on the page - the ES Module Shims polyfill loader, and the native loader. + +Note that instances are not shared between these loaders for consistency and performance, since some browsers do not properly share the fetch cache and native loader cache resulting in a double fetch which would be inefficient. + +As a result, if you have two module graphs - one native and one polyfilled, they will not share the same dependency instance, for example: + +```html + + + +``` + +```dep +console.log('DEP'); +``` + +When polyfilling import maps, ES Module Shims will pick up on the second import failure and reexecute `/dep.js` as a new instance, logging `"DEP"` twice. + +For this reason it is important to always ensure all modules hit the polyfill path, either by having all graphs use import maps at the top-level, or via `importShim` directly. + +If you really need to support instance sharing with the native loader, a useful workaround is to use the [`skip` option](#skip) to list modules which should always be loaded via the native loader: + +```html + +``` + +The above would then fully cause dependency module instance to be shared between ES Module Shims and the native loader, with the polyfill then logging `"DEP"` only once. + +#### No Shim Scripts + +If the polyfill is analyzing or applying to a module script that doesn't need to or shouldn't be polyfilled, adding the `"noshim"` attribute to the script tag will ensure that ES Module Shims ignores processing this script entirely: + +```html + +``` + +### Polyfill Features + +If using more modern features like CSS Modules or JSON Modules, these need to be manually enabled via the [`polyfillEnable` init option](#polyfill-enable-option) to raise the native baseline from just checking import maps to also checking that browsers support these features: + +```html + +``` + +To verify when the polyfill is actively engaging as opposed to relying on the native loader, [a `polyfill` hook](#polyfill-hook) is also provided. + +## Shim Mode + +Shim mode is an alternative to polyfill mode and doesn't rely on native modules erroring - instead it is triggered by the existence of any ` + +``` + +All modules are still loaded with the native browser module loader, but with their specifiers rewritten then executed as Blob URLs, so there is a relatively minimal overhead to using a polyfill approach like this. + +#### Multiple Import Maps + +Multiple import maps are not currently supported in any native implementation, Chromium support is currently being tracked in https://bugs.chromium.org/p/chromium/issues/detail?id=927119. + +In polyfill mode, multiple import maps are therefore not supported. + +In shim mode, support for multiple `importmap-shim` scripts follows the [import map extensions](https://github.com/guybedford/import-maps-extensions) proposal. + +#### External Import Maps + +External import maps (using a `"src"` attribute) are not currently supported in any native implementation. + +In polyfill mode, external import maps are therefore not supported. + +In shim mode, external import maps are fully supported. + +#### Dynamic Import Maps + +Support for dynamically injecting import maps with JavaScript via eg: + +```js +document.body.appendChild(Object.assign(document.createElement('script'), { + type: 'importmap', + innerHTML: JSON.stringify({ imports: { x: './y.js' } }), +})); +``` + +is supported in Chromium, provided it is injected before any module loads and there is no other import map yet loaded (multiple import maps are not supported). + +Both modes in ES Module Shims support dynamic injection using DOM Mutation Observers. + +While in polyfill mode the same restrictions apply that multiple import maps, import maps with a `src` attribute, and import maps loaded after the first module load are not supported, in shim mode all of these behaviours are fully enabled for `"importmap-shim"`. + +#### Reading current import map state + +To make it easy to keep track of import map state, es-module-shims provides a `importShim.getImportMap` utility function, available only in shim mode. + +```js +const importMap = importShim.getImportMap(); + +// importMap will be an object in the same shape as the json in a importmap script +``` + +#### Setting current import map state +To make it easy to set the import map state, es-module-shims provides a `importShim.addImportMap` utility function, available only in shim mode. + +```js +// importMap will be an object in the same shape as the json in a importmap script +const importMap = { imports: {/*...*/}, scopes: {/*...*/} }; + +importShim.addImportMap(importMap); +``` + + +### Dynamic Import + +> Stability: Stable browser standard + +Dynamic `import(...)` within any modules loaded will be rewritten as `importShim(...)` automatically +providing full support for all es-module-shims features through dynamic import. + +To load code dynamically (say from the browser console), `importShim` can be called similarly: + +```js +importShim('/path/to/module.js').then(x => console.log(x)); +``` + +### import.meta.url + +> Stability: Stable browser standard + +`import.meta.url` provides the full URL of the current module within the context of the module execution. + +### modulepreload + +> Stability: WhatWG Standard, Single Browser Implementer + +Preloading of modules can be achieved by including a `` tag in the HTML or injecting it dynamically. + +This tag also supports the `"integrity"`, `"crossorigin"` and `"referrerpolicy"` attributes as supported on module scripts. + +This tag just initiates a fetch request in the browser and thus works equally as a preload polyfill in both shimmed and unshimmed modes, with integrity validation support. + +In browsers that don't support modulepreload, polyfilled preloading behaviour is provided using an early `fetch()` call with the same request options as the module script, resulting in network-level cache sharing. + +Unlike the browser specification, the modulepreload polyfill does not request dependency modules by default, in order to avoid unnecessary +code analysis in the polyfill scenarios, _it is always recommended to preload deep imports so that this feature shouldn't be necessary._ + +#### Preload shim + +When in shim mode, `` must be used to properly cache the preloaded modules. + +### CSP Support + +By default ES Module Shims provides full support for CSP by using the asm.js ES Module Lexer build. This is absolutely identical in performance to the Wasm version in Firefox and Chrome (in Safari the asm.js version is actually faster than Wasm). + +The CSP nonce to use for module scripts will be picked up from the first script on the page or via the [`nonce` init option](#nonce). + +A full example of such a CSP workflow is provided below: + +```html + + + + +``` + +#### Wasm Build + +To use the Web Assembly / non-CSP build of ES Module Shims, this is available as a self-contained single file at `es-module-shims/wasm` or `es-module-shims/dist/es-module-shims.wasm.js` in the package folder. + +### JSON Modules + +> Stability: WhatWG Standard, Single Browser Implementer + +In shim mode, JSON modules are always supported. In polyfill mode, JSON modules require the `polyfillEnable: ['json-modules']` [init option](#polyfill-enable-option). + +JSON Modules are currently supported in Chrome when using them via an import assertion: + +```html + +``` + +In addition JSON modules need to be served with a valid JSON content type. + +Checks for assertion failures are not currently included. + +### CSS Modules + +> Stability: WhatWG Standard, Single Browser Implementer + +In shim mode, CSS modules are always supported. In polyfill mode, CSS modules require the `polyfillEnable: ['css-modules']` [init option](#polyfill-enable-option). + +CSS Modules are currently supported in Chrome when using them via an import assertion: + +```html + +``` + +To support the polyfill or shim of this feature, the [Constructable Stylesheets polyfill](https://github.com/calebdwilliams/construct-style-sheets#readme) must be separately included in browsers not supporting [Constructable Stylesheets](https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/CSSStyleSheet) eg via: + +```html + +``` + +For more information see the [web.dev article](https://web.dev/css-module-scripts/). + +In addition CSS modules need to be served with a valid CSS content type. + +Checks for assertion failures are not currently included. + +### Wasm Modules + +> Stability: WebAssembly Standard, Unimplemented + +Implements the [WebAssembly ESM Integration](https://github.com/WebAssembly/esm-integration) spec (source phase imports omitted currently, tracking in https://github.com/guybedford/es-module-shims/issues/410). + +In shim mode, Wasm modules are always supported. In polyfill mode, Wasm modules require the `polyfillEnable: ['wasm-modules']` [init option](#polyfill-enable-option). + +WebAssembly module exports are made available as module exports and WebAssembly module imports will be resolved using the browser module loader. + +WebAssembly modules require native top-level await support to be polyfilled, see the [compatibility table](#browser-support) above. + +```html + +``` + +If using CSP, make sure to add `'unsafe-wasm-eval'` to `script-src` which is needed when the shim or polyfill engages, note this policy is much much safer than eval due to the Wasm secure sandbox. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#unsafe_webassembly_execution. + +### Resolve + +> Stability: Draft HTML PR + +`import.meta.resolve` provides a contextual resolver within modules. It is synchronous, changed from being formerly asynchronous due to following the [browser specification PR](https://github.com/whatwg/html/pull/5572). + +The second argument to `import.meta.resolve` permits a custom parent URL scope for the resolution (not currently in the browser spec), which defaults to `import.meta.url`. + +```js +// resolve a relative path to a module +var resolvedUrl = import.meta.resolve('./relative.js'); +// resolve a dependency from a module +var resolvedUrl = import.meta.resolve('dep'); +// resolve a path +var resolvedUrlPath = import.meta.resolve('dep/'); +// resolve with a custom parent scope +var resolvedUrl = import.meta.resolve('dep', 'https://site.com/another/scope'); +``` + +Node.js also implements a similar API, although it's in the process of shifting to a synchronous resolver. + +### Module Workers + +ES Module Shims can be used in module workers in browsers that provide dynamic import in worker environments, which at the moment are Chrome(80+), Edge(80+) and Safari(15+). + +By default, when there is no DOM present, ES Module Shims will switch into shim mode. An example of ES Module Shims usage through shim mode in web workers is provided below: + +```js +/** + * + * @param {string} aURL a string representing the URL of the module script the worker will execute. + * @returns {string} The string representing the URL of the script the worker will execute. + */ +function getWorkerScriptURL(aURL) { + // baseURL, esModuleShimsURL are considered to be known in advance + // esModuleShimsURL - must point to the non-CSP build of ES Module Shims, + // namely the `es-module-shim.wasm.js` output: es-module-shims/dist/es-module-shims.wasm.js + + return URL.createObjectURL(new Blob( + [ + `importScripts('${new URL(esModuleShimsURL, baseURL).href}'); + importShim.addImportMap(${JSON.stringify(importShim.getImportMap())}); + importShim('${new URL(aURL, baseURL).href}').catch(e => setTimeout(() => { throw e; }))` + ], + { type: 'application/javascript' })) +} + +const worker = new Worker(getWorkerScriptURL('myEsModule.js')); +``` + +> Web workers must use the non-CSP build of ES Module Shims via `es-module-shim.wasm.js` from the `dist/` folder, since the CSP build currently assumes a DOM. + +## Init Options + +Provide a `esmsInitOptions` on the global scope before `es-module-shims` is loaded to configure various aspects of the module loading process: + +* [enforceIntegrity](#enforce-integrity) +* [fetch](#fetch-hook) +* [mapOverrides](#overriding-import-map-entries) +* [modulepreload](#modulepreload) +* [noLoadEventRetriggers](#no-load-event-retriggers) +* [nonce](#nonce) +* [onerror](#error-hook) +* [onpolyfill](#polyfill-hook) +* [polyfillEnable](#polyfill-enable-option) +* [resolve](#resolve-hook) +* [revokeBlobURLs](#revoke-blob-urls) +* [shimMode](#shim-mode-option) +* [skip](#skip) + +```html + + +``` + +` +``` + +This can be convenient when using a CSP policy. Function strings correspond to global function names. + +### Shim Mode Option + +[Shim Mode](#shim-mode) can be overridden using the `shimMode` option: + +```html + +``` + +For example, if lazy loading ` +``` + +The above is necessary to enable CSS modules and JSON modules. + +#### Baseline Support Analysis Opt-Out + +The reason the `polyfillEnable` option is needed is because ES Module Shims implements a performance optimization where if a browser supports modern modules features to an expected baseline of import maps support, it will skip all polyfill source analysis resulting in full native passthrough performance. + +If the application code then tries to use modern features like CSS modules beyond this baseline it won't support those features. As a result all modules features which are considered newer or beyond the recommended baseline require explicit enabling. This common baseline itself will change to track the common future modules baseline supported by this project for each release cycle. + +This option can also be set to `true` to entirely disable the native passthrough system and ensure all sources are fetched and analyzed through ES Module Shims. This will still avoid duplicate execution since module graphs are still only reexecuted when they use unsupported native features, but there is a small extra cost in doing the analysis. + +### Enforce Integrity + +When enabled, `enforceIntegrity` will ensure that all modules loaded through ES Module Shims must have integrity defined either on a `` or on +a `` preload tag in shim mode. Modules without integrity will throw at fetch time. + +For example in the following, only the listed `app.js` and `dep.js` modules will be able to execute with the provided integrity: + +```html + +\ + + +``` + +Strong execution guarantees are only possible in shim mode since in polyfill mode it is not possible to stop the native loader from executing code without an integrity. + +Future versions of this option may provide support for origin-specific allow lists. + +### Nonce + +The `nonce` option allows setting a CSP nonce to be used with all script injections for full CSP compatibility supported by the [CSP build](#csp-build) of ES Module Shims. + +Alternatively, add a `blob:` URL policy with the CSP build to get CSP compatibility. + +```js + +``` + +### No Load Event Retriggers + +Because of the extra processing done by ES Module Shims it is possible for static module scripts to execute after the `DOMContentLoaded` or `readystatechange` events they expect, which can cause missed attachment. + +In order to ensure libraries that rely on these event still behave correctly, ES Module Shims will always double trigger these events that would normally have executed before the document ready state transition to completion, once all the static module scripts in the page have been completely executed through ES module shims. + +In such a case, this double event firing can be disabled with the `noLoadEventRetriggers` option: + +```js + + +``` + +### Skip + +When loading modules that you know will only use baseline modules features, it is possible to set a rule to explicitly opt-out modules from being polyfilled to always load and be referenced through the native loader only. This enables instance sharing with the native loader and also improves performance because those modules then do not need to be processed or transformed at all, so that only local application code is handled and not library code. + +The `skip` option supports a string regular expression or array of exact module URLs to check: + +```js + + +``` + +When passing an array, relative URLs or paths ending in `/` can be provided: + +```js + + +``` + +### Revoke Blob URLs + +When polyfilling the missing features `es-module-shims` would create in-memory blobs using `URL.createObjectURL()` for each processed module. +In most cases, memory footprint of these blobs is negligible so there is no need to call `URL.revokeObjectURL()` +for them, and we don't do that by default. + +That said, in some scenarios, e.g. when evaluating some continuously changing modules without a page reload, like in a web-based code editor, +you might want to reduce the growth of memory usage by revoking those blob URLs after they were already `import`ed. + +You can do that by enabling the `revokeBlobURLs` init option: + +```js + + +``` + +NOTE: revoking object URLs is not entirely free, while we are trying to be smart about it and make sure it doesn't +cause janks, we recommend enabling this option only if you have done the measurements and identified that you really need it. + +### Overriding import map entries + +When [dynamically injecting import maps](#dynamic-import-maps), an error will be thrown in both polyfill and shim modes if the new import map would override existing entries with a different value. + +It is possible to disable this behavior in shim mode by setting the `mapOverrides` option: + +```js + + + +``` + +This can be useful for HMR workflows. + +### Hooks + +#### Polyfill hook + +The polyfill hook is called when running in polyfill mode and the polyfill is kicking in instead of passing through to the native loader. + +This can be a useful way to verify that the native passthrough is working correctly in latest browsers for performance, while also allowing eg the ability to analyze or get metrics reports of how many users are getting the polyfill actively applying to their browser application loads. + +```js + + +``` + +The default hook will log a message to the console with `console.info` noting that polyfill mode is enabled and that the native error can be ignored. + +Overriding this hook with an empty function will disable the default polyfill log output. + +In the above, running in latest Chromium browsers, nothing will be logged, while running in an older browser that does not support newer features like import maps the console log will be output. + +#### Error hook + +You can provide a function to handle errors during the module loading process by providing an `onerror` option: + +```js + + +``` + +#### Import Hook + +The import hook is supported for both shim and polyfill modes and provides an async hook which can ensure any necessary work is done before a top-level module import or dynamic `import()` starts further processing. + +```js + +``` + +#### Resolve Hook + +The resolve hook is supported for both shim and polyfill modes and allows full customization of the resolver, while still having access to the original resolve function. + +Note that in polyfill mode the resolve hook may not be called for all modules when native passthrough is occurring and that it still will not affect +the native passthrough executions. + +If the resolve hook should apply for all modules in the entire module graph, make sure to set `polyfillEnable: true` to [disable the baseline support analysis opt-out](#baseline-support-analysis-opt-out). + +```js + +``` + +Support for an asynchronous resolve hook has been deprecated as of 1.5.0 and will be removed in the next major. + +Instead async work should be done with the import hook. + +#### Meta Hook + +The meta hook allows customizing the `import.meta` object in each module scope. + +The function takes as arguments the `import.meta` object itself (with `import.meta.url` an `import.meta.resolve` already present), and the URL of the module as its second argument. + +Example: + +```js + +``` + +Where within the module the following would be supported: + +```js +import assert from 'assert'; +assert.ok(import.meta.custom.startsWith('custom value')); +``` + +#### Fetch Hook + +The fetch hook is supported for shim mode only. + +The ES Module Shims fetch hook can be used to implement transform plugins. + +For example TypeScript support: + +```js + + +``` + +Because the dependency analysis applies by ES Module Shims takes care of ensuring all dependencies run through the same fetch hook, +the above is all that is needed to implement custom plugins. + +Streaming support is also provided, for example here is a hook with streaming support for JSON: + +```js +window.esmsInitOptions = { + shimMode: true, + fetch: async function (url, options) { + const res = await fetch(url, options); + if (!res.ok || !/^application\/json($|;)/.test(res.headers.get('content-type'))) + return res; + const reader = res.body.getReader(); + const headers = new Headers(res.headers); + headers.set('Content-Type', 'application/javascript'); + return new Response(new ReadableStream({ + async start (controller) { + let done, value; + controller.enqueue(new TextEncoder().encode('export default ')); + while (({ done, value } = await reader.read()) && !done) { + controller.enqueue(value); + } + controller.close(); + } + }), { headers }); + } +} +``` + +## Implementation Details + +### Import Rewriting + +* Sources are fetched, import specifiers are rewritten to reference exact URLs, and then executed as BlobURLs through the whole module graph. +* The [lexer](https://github.com/guybedford/es-module-lexer) handles the full language grammar including nested template strings, comments, regexes and division operator ambiguity based on backtracking. +* When executing a circular reference A -> B -> A, a shell module technique is used to acyclify into the graph A -> B -> A Shell, with A -> A Shell. The shell module exports an update function which is called by the original once after the last import statement, and again after the last statement of the source file. + +## Inspiration + +Huge thanks to Rich Harris for inspiring this approach with [Shimport](https://github.com/rich-harris/shimport). + +## License + +MIT diff --git a/EssentialCSharp.Web/wwwroot/lib/es-module-shims/dist/es-module-shims.js b/EssentialCSharp.Web/wwwroot/lib/es-module-shims/dist/es-module-shims.js new file mode 100644 index 00000000..b8dfba82 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/es-module-shims/dist/es-module-shims.js @@ -0,0 +1,974 @@ +/* ES Module Shims 1.8.3 */ +(function () { + + const hasWindow = typeof window !== 'undefined'; + const hasDocument = typeof document !== 'undefined'; + + const noop = () => {}; + + const optionsScript = hasDocument ? document.querySelector('script[type=esms-options]') : undefined; + + const esmsInitOptions = optionsScript ? JSON.parse(optionsScript.innerHTML) : {}; + Object.assign(esmsInitOptions, self.esmsInitOptions || {}); + + let shimMode = hasDocument ? !!esmsInitOptions.shimMode : true; + + const importHook = globalHook(shimMode && esmsInitOptions.onimport); + const resolveHook = globalHook(shimMode && esmsInitOptions.resolve); + let fetchHook = esmsInitOptions.fetch ? globalHook(esmsInitOptions.fetch) : fetch; + const metaHook = esmsInitOptions.meta ? globalHook(shimMode && esmsInitOptions.meta) : noop; + + const mapOverrides = esmsInitOptions.mapOverrides; + + let nonce = esmsInitOptions.nonce; + if (!nonce && hasDocument) { + const nonceElement = document.querySelector('script[nonce]'); + if (nonceElement) + nonce = nonceElement.nonce || nonceElement.getAttribute('nonce'); + } + + const onerror = globalHook(esmsInitOptions.onerror || noop); + const onpolyfill = esmsInitOptions.onpolyfill ? globalHook(esmsInitOptions.onpolyfill) : () => { + console.log('%c^^ Module TypeError above is polyfilled and can be ignored ^^', 'font-weight:900;color:#391'); + }; + + const { revokeBlobURLs, noLoadEventRetriggers, enforceIntegrity } = esmsInitOptions; + + function globalHook (name) { + return typeof name === 'string' ? self[name] : name; + } + + const enable = Array.isArray(esmsInitOptions.polyfillEnable) ? esmsInitOptions.polyfillEnable : []; + const cssModulesEnabled = enable.includes('css-modules'); + const jsonModulesEnabled = enable.includes('json-modules'); + const wasmModulesEnabled = enable.includes('wasm-modules'); + + const edge = !navigator.userAgentData && !!navigator.userAgent.match(/Edge\/\d+\.\d+/); + + const baseUrl = hasDocument + ? document.baseURI + : `${location.protocol}//${location.host}${location.pathname.includes('/') + ? location.pathname.slice(0, location.pathname.lastIndexOf('/') + 1) + : location.pathname}`; + + const createBlob = (source, type = 'text/javascript') => URL.createObjectURL(new Blob([source], { type })); + let { skip } = esmsInitOptions; + if (Array.isArray(skip)) { + const l = skip.map(s => new URL(s, baseUrl).href); + skip = s => l.some(i => i[i.length - 1] === '/' && s.startsWith(i) || s === i); + } + else if (typeof skip === 'string') { + const r = new RegExp(skip); + skip = s => r.test(s); + } else if (skip instanceof RegExp) { + skip = s => skip.test(s); + } + + const eoop = err => setTimeout(() => { throw err }); + + const throwError = err => { (self.reportError || hasWindow && window.safari && console.error || eoop)(err), void onerror(err); }; + + function fromParent (parent) { + return parent ? ` imported from ${parent}` : ''; + } + + let importMapSrcOrLazy = false; + + function setImportMapSrcOrLazy () { + importMapSrcOrLazy = true; + } + + // shim mode is determined on initialization, no late shim mode + if (!shimMode) { + if (document.querySelectorAll('script[type=module-shim],script[type=importmap-shim],link[rel=modulepreload-shim]').length) { + shimMode = true; + } + else { + let seenScript = false; + for (const script of document.querySelectorAll('script[type=module],script[type=importmap]')) { + if (!seenScript) { + if (script.type === 'module' && !script.ep) + seenScript = true; + } + else if (script.type === 'importmap' && seenScript) { + importMapSrcOrLazy = true; + break; + } + } + } + } + + const backslashRegEx = /\\/g; + + function asURL (url) { + try { + if (url.indexOf(':') !== -1) + return new URL(url).href; + } + catch (_) {} + } + + function resolveUrl (relUrl, parentUrl) { + return resolveIfNotPlainOrUrl(relUrl, parentUrl) || (asURL(relUrl) || resolveIfNotPlainOrUrl('./' + relUrl, parentUrl)); + } + + function resolveIfNotPlainOrUrl (relUrl, parentUrl) { + const hIdx = parentUrl.indexOf('#'), qIdx = parentUrl.indexOf('?'); + if (hIdx + qIdx > -2) + parentUrl = parentUrl.slice(0, hIdx === -1 ? qIdx : qIdx === -1 || qIdx > hIdx ? hIdx : qIdx); + if (relUrl.indexOf('\\') !== -1) + relUrl = relUrl.replace(backslashRegEx, '/'); + // protocol-relative + if (relUrl[0] === '/' && relUrl[1] === '/') { + return parentUrl.slice(0, parentUrl.indexOf(':') + 1) + relUrl; + } + // relative-url + else if (relUrl[0] === '.' && (relUrl[1] === '/' || relUrl[1] === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) || + relUrl.length === 1 && (relUrl += '/')) || + relUrl[0] === '/') { + const parentProtocol = parentUrl.slice(0, parentUrl.indexOf(':') + 1); + if (parentProtocol === 'blob:') { + throw new TypeError(`Failed to resolve module specifier "${relUrl}". Invalid relative url or base scheme isn't hierarchical.`); + } + // Disabled, but these cases will give inconsistent results for deep backtracking + //if (parentUrl[parentProtocol.length] !== '/') + // throw new Error('Cannot resolve'); + // read pathname from parent URL + // pathname taken to be part after leading "/" + let pathname; + if (parentUrl[parentProtocol.length + 1] === '/') { + // resolving to a :// so we need to read out the auth and host + if (parentProtocol !== 'file:') { + pathname = parentUrl.slice(parentProtocol.length + 2); + pathname = pathname.slice(pathname.indexOf('/') + 1); + } + else { + pathname = parentUrl.slice(8); + } + } + else { + // resolving to :/ so pathname is the /... part + pathname = parentUrl.slice(parentProtocol.length + (parentUrl[parentProtocol.length] === '/')); + } + + if (relUrl[0] === '/') + return parentUrl.slice(0, parentUrl.length - pathname.length - 1) + relUrl; + + // join together and split for removal of .. and . segments + // looping the string instead of anything fancy for perf reasons + // '../../../../../z' resolved to 'x/y' is just 'z' + const segmented = pathname.slice(0, pathname.lastIndexOf('/') + 1) + relUrl; + + const output = []; + let segmentIndex = -1; + for (let i = 0; i < segmented.length; i++) { + // busy reading a segment - only terminate on '/' + if (segmentIndex !== -1) { + if (segmented[i] === '/') { + output.push(segmented.slice(segmentIndex, i + 1)); + segmentIndex = -1; + } + continue; + } + // new segment - check if it is relative + else if (segmented[i] === '.') { + // ../ segment + if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) { + output.pop(); + i += 2; + continue; + } + // ./ segment + else if (segmented[i + 1] === '/' || i + 1 === segmented.length) { + i += 1; + continue; + } + } + // it is the start of a new segment + while (segmented[i] === '/') i++; + segmentIndex = i; + } + // finish reading out the last segment + if (segmentIndex !== -1) + output.push(segmented.slice(segmentIndex)); + return parentUrl.slice(0, parentUrl.length - pathname.length) + output.join(''); + } + } + + function resolveAndComposeImportMap (json, baseUrl, parentMap) { + const outMap = { imports: Object.assign({}, parentMap.imports), scopes: Object.assign({}, parentMap.scopes) }; + + if (json.imports) + resolveAndComposePackages(json.imports, outMap.imports, baseUrl, parentMap); + + if (json.scopes) + for (let s in json.scopes) { + const resolvedScope = resolveUrl(s, baseUrl); + resolveAndComposePackages(json.scopes[s], outMap.scopes[resolvedScope] || (outMap.scopes[resolvedScope] = {}), baseUrl, parentMap); + } + + return outMap; + } + + function getMatch (path, matchObj) { + if (matchObj[path]) + return path; + let sepIndex = path.length; + do { + const segment = path.slice(0, sepIndex + 1); + if (segment in matchObj) + return segment; + } while ((sepIndex = path.lastIndexOf('/', sepIndex - 1)) !== -1) + } + + function applyPackages (id, packages) { + const pkgName = getMatch(id, packages); + if (pkgName) { + const pkg = packages[pkgName]; + if (pkg === null) return; + return pkg + id.slice(pkgName.length); + } + } + + + function resolveImportMap (importMap, resolvedOrPlain, parentUrl) { + let scopeUrl = parentUrl && getMatch(parentUrl, importMap.scopes); + while (scopeUrl) { + const packageResolution = applyPackages(resolvedOrPlain, importMap.scopes[scopeUrl]); + if (packageResolution) + return packageResolution; + scopeUrl = getMatch(scopeUrl.slice(0, scopeUrl.lastIndexOf('/')), importMap.scopes); + } + return applyPackages(resolvedOrPlain, importMap.imports) || resolvedOrPlain.indexOf(':') !== -1 && resolvedOrPlain; + } + + function resolveAndComposePackages (packages, outPackages, baseUrl, parentMap) { + for (let p in packages) { + const resolvedLhs = resolveIfNotPlainOrUrl(p, baseUrl) || p; + if ((!shimMode || !mapOverrides) && outPackages[resolvedLhs] && (outPackages[resolvedLhs] !== packages[resolvedLhs])) { + throw Error(`Rejected map override "${resolvedLhs}" from ${outPackages[resolvedLhs]} to ${packages[resolvedLhs]}.`); + } + let target = packages[p]; + if (typeof target !== 'string') + continue; + const mapped = resolveImportMap(parentMap, resolveIfNotPlainOrUrl(target, baseUrl) || target, baseUrl); + if (mapped) { + outPackages[resolvedLhs] = mapped; + continue; + } + console.warn(`Mapping "${p}" -> "${packages[p]}" does not resolve`); + } + } + + let dynamicImport = !hasDocument && (0, eval)('u=>import(u)'); + + let supportsDynamicImport; + + const dynamicImportCheck = hasDocument && new Promise(resolve => { + const s = Object.assign(document.createElement('script'), { + src: createBlob('self._d=u=>import(u)'), + ep: true + }); + s.setAttribute('nonce', nonce); + s.addEventListener('load', () => { + if (!(supportsDynamicImport = !!(dynamicImport = self._d))) { + let err; + window.addEventListener('error', _err => err = _err); + dynamicImport = (url, opts) => new Promise((resolve, reject) => { + const s = Object.assign(document.createElement('script'), { + type: 'module', + src: createBlob(`import*as m from'${url}';self._esmsi=m`) + }); + err = undefined; + s.ep = true; + if (nonce) + s.setAttribute('nonce', nonce); + // Safari is unique in supporting module script error events + s.addEventListener('error', cb); + s.addEventListener('load', cb); + function cb (_err) { + document.head.removeChild(s); + if (self._esmsi) { + resolve(self._esmsi, baseUrl); + self._esmsi = undefined; + } + else { + reject(!(_err instanceof Event) && _err || err && err.error || new Error(`Error loading ${opts && opts.errUrl || url} (${s.src}).`)); + err = undefined; + } + } + document.head.appendChild(s); + }); + } + document.head.removeChild(s); + delete self._d; + resolve(); + }); + document.head.appendChild(s); + }); + + // support browsers without dynamic import support (eg Firefox 6x) + let supportsJsonAssertions = false; + let supportsCssAssertions = false; + + const supports = hasDocument && HTMLScriptElement.supports; + + let supportsImportMaps = supports && supports.name === 'supports' && supports('importmap'); + let supportsImportMeta = supportsDynamicImport; + let supportsWasmModules = false; + + const importMetaCheck = 'import.meta'; + const moduleCheck = 'import"x"'; + const cssModulesCheck = `assert{type:"css"}`; + const jsonModulesCheck = `assert{type:"json"}`; + + let featureDetectionPromise = Promise.resolve(dynamicImportCheck).then(() => { + if (!supportsDynamicImport) + return; + if (!hasDocument) + return Promise.all([ + supportsImportMaps || dynamicImport(createBlob(importMetaCheck)).then(() => supportsImportMeta = true, noop), + cssModulesEnabled && dynamicImport(createBlob(moduleCheck.replace('x', createBlob('', 'text/css')) + cssModulesCheck)).then(() => supportsCssAssertions = true, noop), + jsonModulesEnabled && dynamicImport(createBlob(moduleCheck.replace('x', createBlob('{}', 'text/json')) + jsonModulesCheck)).then(() => supportsJsonAssertions = true, noop), + wasmModulesEnabled && dynamicImport(createBlob(moduleCheck.replace('x', createBlob(new Uint8Array([0,97,115,109,1,0,0,0]), 'application/wasm')))).then(() => supportsWasmModules = true, noop), + ]); + + return new Promise(resolve => { + const iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + iframe.setAttribute('nonce', nonce); + function cb ({ data }) { + const isFeatureDetectionMessage = Array.isArray(data) && data[0] === 'esms'; + if (!isFeatureDetectionMessage) { + return; + } + supportsImportMaps = data[1]; + supportsImportMeta = data[2]; + supportsCssAssertions = data[3]; + supportsJsonAssertions = data[4]; + resolve(); + document.head.removeChild(iframe); + window.removeEventListener('message', cb, false); + } + window.addEventListener('message', cb, false); + + const importMapTest = ` + + +``` + +> note: useWindowSize handles a Resize Event only when it is in use. +> Even if it is called by multiple components, the Resize event is processed only once. +> If it is not used, it will not be handled. + +### Plugin + +Install plugin + +```TypeScript +import { createApp } from 'vue'; +import App from "./App.vue"; // your App component +import { VueWindowSizePlugin } from 'vue-window-size/plugin'; + +const app = createApp(App); +app.use(VueWindowSizePlugin); +``` + +Use with component + +```HTML + +``` + +### Mixin + +Use with component + +```TypeScript + + + +``` + +## Config for Option API + +### `delay` (option) + +- type: `Number` +- default: `33` + - About 30 FPS + +Change delay time of resize event. + +e.g. + +```TypeScript +import { createApp } from 'vue'; +import App from "./App.vue"; // your App component +import { VueWindowSizePlugin } from 'vue-window-size/plugin'; + +const app = createApp(App); +app.use(VueWindowSizePlugin, { + delay: 100, +}); +``` + +## Public API for Option API + +### `config(config: VueWindowSizeOptionApiConfig)` + +Same as config for Option API. + +```TypeScript +import { vueWindowSizeAPI } from 'vue-window-size/plugin'; // or 'vue-window-size/mixin' + +vueWindowSizeAPI.config({ + delay: 100, +}); +``` + +### `init()` + +Initialize the plugin. +Usually called automatically. +Please call it if you want to use it again after destroy. + +```JavaScript +import { vueWindowSizeAPI } from 'vue-window-size/plugin'; // or 'vue-window-size/mixin' + +vueWindowSizeAPI.init(); +``` + +### `destroy()` + +Remove the resize event. + +```JavaScript +import { vueWindowSizeAPI } from'vue-window-size/plugin'; // or 'vue-window-size/mixin' + +vueWindowSizeAPI.destroy(); +``` + +## FAQ + +### Why is there no Config in the Composition API? + +`useWindowSize` is a singleton and handles the resize event. +Therefore, using `useWindowSize(config)` will affect all components in used. +Due to the nature of the Composition API, this is not the desired behavior. +I also think that there are not many use cases that need to be set individually. +If requested, I will create a `useAtomicWindowSize(config)` that can be set atomically, so please create an issue. +Or create a factory function for `createUseWindowSize(config)`. + +### When is the removeEventListener called when using plugin and mixin?? + +vue-window-size adds addEventListener only once, even if it is used in mixin. +So basically you do not need to call removeEventListener. +If you want to call removeEventListener please call [destroy](#destroy) method. + +## Contribution + +If you find a bug or want to contribute to the code or documentation, you can help by submitting an [issue](https://github.com/mya-ake/vue-window-size/issues) or a [pull request](https://github.com/mya-ake/vue-window-size/pulls). + +## License + +[MIT](https://github.com/mya-ake/vue-window-size/blob/master/LICENSE) diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/dist/index.cjs b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/dist/index.cjs new file mode 100644 index 00000000..0801e062 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/dist/index.cjs @@ -0,0 +1 @@ +"use strict";var d=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var f=(t,e)=>{for(var i in e)d(t,i,{get:e[i],enumerable:!0})},W=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of S(e))!l.call(t,s)&&s!==i&&d(t,s,{get:()=>e[s],enumerable:!(r=z(e,s))||r.enumerable});return t};var O=t=>W(d({},"__esModule",{value:!0}),t);var x={};f(x,{useWindowSize:()=>E});module.exports=O(x);var n=require("vue");var u=typeof window<"u",y=()=>u?window.innerWidth:0,g=()=>u?window.innerHeight:0,j=t=>t??y(),R=t=>t??g(),b=t=>({width:j(t?.width),height:R(t?.height)});var c=t=>{let e=0,i=t(),r=(0,n.reactive)(b()),s=({width:p,height:m})=>{r.width=p,r.height=m};i.addObserver("composition-api",s);let w=()=>{++e},v=()=>{e=Math.max(e-1,0)};return()=>(e===0&&i.subscribe().dispatch(),w(),(0,n.onUnmounted)(()=>{v(),e===0&&i.unsubscribe()}),{width:(0,n.computed)(()=>r.width),height:(0,n.computed)(()=>r.height)})};var o=class{#e=new Map;#r;#s;#t=!1;#i;constructor(e){let{delay:i=33}=e??{};this.#r=i,this.#i=this.#d.bind(this)}addObserver(e,i){return this.#e.set(e,i),i(this.#n()),this}deleteObserver(e){return this.#e.delete(e),this}deleteObservers(){return this.#e.clear(),this}notifyObservers(e){return this.#e.forEach(i=>{i(e)}),this}subscribe(){return typeof window>"u"?this:this.#t?this:(window.addEventListener("resize",this.#i),window.addEventListener("orientationchange",this.#i),this.#t=!0,this)}unsubscribe(){return this.#t?(window.removeEventListener("resize",this.#i),window.removeEventListener("orientationchange",this.#i),this.#t=!1,this):this}setDelay(e){return this.#r=e,this}info(){return{delay:this.#r,subscribed:this.#t,observersCount:this.#e.size}}dispatch(){return this.#o(),this}#n(){return typeof window>"u"?{width:0,height:0}:{width:window.innerWidth,height:window.innerHeight}}#o(){let e=this.#n();this.notifyObservers(e)}#d(){clearTimeout(this.#s),window.setTimeout(()=>{},1),this.#s=window.setTimeout(()=>{this.#o()},this.#r)}};var h,a=()=>(h||(h=new o),h);var E=c(a);0&&(module.exports={useWindowSize}); diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/dist/index.d.ts b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/dist/index.d.ts new file mode 100644 index 00000000..93020774 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/dist/index.d.ts @@ -0,0 +1,8 @@ +import * as vue from 'vue'; + +declare const useWindowSize: () => { + width: vue.ComputedRef; + height: vue.ComputedRef; +}; + +export { useWindowSize }; diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/dist/index.js b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/dist/index.js new file mode 100644 index 00000000..c79b0e17 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/dist/index.js @@ -0,0 +1 @@ +import{reactive as f,computed as h,onUnmounted as W}from"vue";var o=typeof window<"u",m=()=>o?window.innerWidth:0,z=()=>o?window.innerHeight:0,S=i=>i??m(),l=i=>i??z(),d=i=>({width:S(i?.width),height:l(i?.height)});var u=i=>{let e=0,t=i(),r=f(d()),c=({width:v,height:p})=>{r.width=v,r.height=p};t.addObserver("composition-api",c);let a=()=>{++e},w=()=>{e=Math.max(e-1,0)};return()=>(e===0&&t.subscribe().dispatch(),a(),W(()=>{w(),e===0&&t.unsubscribe()}),{width:h(()=>r.width),height:h(()=>r.height)})};var s=class{#e=new Map;#r;#s;#t=!1;#i;constructor(e){let{delay:t=33}=e??{};this.#r=t,this.#i=this.#d.bind(this)}addObserver(e,t){return this.#e.set(e,t),t(this.#n()),this}deleteObserver(e){return this.#e.delete(e),this}deleteObservers(){return this.#e.clear(),this}notifyObservers(e){return this.#e.forEach(t=>{t(e)}),this}subscribe(){return typeof window>"u"?this:this.#t?this:(window.addEventListener("resize",this.#i),window.addEventListener("orientationchange",this.#i),this.#t=!0,this)}unsubscribe(){return this.#t?(window.removeEventListener("resize",this.#i),window.removeEventListener("orientationchange",this.#i),this.#t=!1,this):this}setDelay(e){return this.#r=e,this}info(){return{delay:this.#r,subscribed:this.#t,observersCount:this.#e.size}}dispatch(){return this.#o(),this}#n(){return typeof window>"u"?{width:0,height:0}:{width:window.innerWidth,height:window.innerHeight}}#o(){let e=this.#n();this.notifyObservers(e)}#d(){clearTimeout(this.#s),window.setTimeout(()=>{},1),this.#s=window.setTimeout(()=>{this.#o()},this.#r)}};var n,b=()=>(n||(n=new s),n);var N=u(b);export{N as useWindowSize}; diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/package.json b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/package.json new file mode 100644 index 00000000..feebf8ca --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/composition-api/package.json @@ -0,0 +1,31 @@ +{ + "name": "vue-window-size-composition-api", + "version": "1.0.0", + "type": "module", + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "packageManager": "yarn@3.3.1", + "scripts": { + "build": "tsup", + "test:unit": "vitest --dir src --run", + "test:integration": "vitest --dir tests --run" + }, + "devDependencies": { + "@types/node": "^18.11.18", + "@vitejs/plugin-vue": "^4.0.0", + "@vue/compiler-dom": "^3.2.45", + "@vue/runtime-core": "^3.2.45", + "@vue/test-utils": "^2.2.7", + "happy-dom": "^20.0.0", + "tsup": "^8.5.0", + "typescript": "^4.9.4", + "vite": "^7.1.5", + "vite-tsconfig-paths": "^4.0.3", + "vitest": "^0.27.1", + "vue": "^3.2.45" + }, + "peerDependencies": { + "vue": "^3.0 || ^2.7" + } +} diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/dist/index.cjs b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/dist/index.cjs new file mode 100644 index 00000000..bdbd93b5 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/dist/index.cjs @@ -0,0 +1 @@ +"use strict";var o=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var z=(i,e)=>{for(var t in e)o(i,t,{get:e[t],enumerable:!0})},f=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of v(e))!l.call(i,r)&&r!==t&&o(i,r,{get:()=>e[r],enumerable:!(n=m(e,r))||n.enumerable});return i};var S=i=>f(o({},"__esModule",{value:!0}),i);var j={};z(j,{vueWindowSizeAPI:()=>R,vueWindowSizeMixin:()=>g});module.exports=S(j);var c=require("vue");var b=typeof window<"u",W=()=>b?window.innerWidth:0,y=()=>b?window.innerHeight:0,x=i=>i??W(),O=i=>i??y(),w=i=>({width:x(i?.width),height:O(i?.height)});var a=i=>{let e=(0,c.reactive)(w()),t=({width:n,height:r})=>{e.width=n,e.height=r};return i().addObserver("option-api",t).subscribe(),{computed:{$windowWidth(){return e.width},$windowHeight(){return e.height}}}};var s=class{#e=new Map;#r;#n;#i=!1;#t;constructor(e){let{delay:t=33}=e??{};this.#r=t,this.#t=this.#d.bind(this)}addObserver(e,t){return this.#e.set(e,t),t(this.#s()),this}deleteObserver(e){return this.#e.delete(e),this}deleteObservers(){return this.#e.clear(),this}notifyObservers(e){return this.#e.forEach(t=>{t(e)}),this}subscribe(){return typeof window>"u"?this:this.#i?this:(window.addEventListener("resize",this.#t),window.addEventListener("orientationchange",this.#t),this.#i=!0,this)}unsubscribe(){return this.#i?(window.removeEventListener("resize",this.#t),window.removeEventListener("orientationchange",this.#t),this.#i=!1,this):this}setDelay(e){return this.#r=e,this}info(){return{delay:this.#r,subscribed:this.#i,observersCount:this.#e.size}}dispatch(){return this.#o(),this}#s(){return typeof window>"u"?{width:0,height:0}:{width:window.innerWidth,height:window.innerHeight}}#o(){let e=this.#s();this.notifyObservers(e)}#d(){clearTimeout(this.#n),window.setTimeout(()=>{},1),this.#n=window.setTimeout(()=>{this.#o()},this.#r)}};var d,u=()=>(d||(d=new s),d);var p=i=>({config(e){typeof e.delay=="number"&&i().setDelay(e.delay)},init(){i().subscribe()},destroy(){i().unsubscribe()}});var h,g=()=>(h||(h=a(u)),h),R=p(u);0&&(module.exports={vueWindowSizeAPI,vueWindowSizeMixin}); diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/dist/index.d.ts b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/dist/index.d.ts new file mode 100644 index 00000000..5ec3da75 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/dist/index.d.ts @@ -0,0 +1,26 @@ +type Config = { + delay?: number; +}; + +type Mixin = { + computed: { + $windowWidth: () => number; + $windowHeight: () => number; + }; +}; + +declare const vueWindowSizeMixin: () => Mixin; +declare const vueWindowSizeAPI: { + config(config: Config): void; + init(): void; + destroy(): void; +}; +/** types */ +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { + $windowWidth: number; + $windowHeight: number; + } +} + +export { vueWindowSizeAPI, vueWindowSizeMixin }; diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/dist/index.js b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/dist/index.js new file mode 100644 index 00000000..d7f96c26 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/dist/index.js @@ -0,0 +1 @@ +import{reactive as l}from"vue";var d=typeof window<"u",a=()=>d?window.innerWidth:0,p=()=>d?window.innerHeight:0,m=i=>i??a(),v=i=>i??p(),u=i=>({width:m(i?.width),height:v(i?.height)});var h=i=>{let e=l(u()),t=({width:w,height:c})=>{e.width=w,e.height=c};return i().addObserver("option-api",t).subscribe(),{computed:{$windowWidth(){return e.width},$windowHeight(){return e.height}}}};var r=class{#e=new Map;#r;#n;#i=!1;#t;constructor(e){let{delay:t=33}=e??{};this.#r=t,this.#t=this.#d.bind(this)}addObserver(e,t){return this.#e.set(e,t),t(this.#s()),this}deleteObserver(e){return this.#e.delete(e),this}deleteObservers(){return this.#e.clear(),this}notifyObservers(e){return this.#e.forEach(t=>{t(e)}),this}subscribe(){return typeof window>"u"?this:this.#i?this:(window.addEventListener("resize",this.#t),window.addEventListener("orientationchange",this.#t),this.#i=!0,this)}unsubscribe(){return this.#i?(window.removeEventListener("resize",this.#t),window.removeEventListener("orientationchange",this.#t),this.#i=!1,this):this}setDelay(e){return this.#r=e,this}info(){return{delay:this.#r,subscribed:this.#i,observersCount:this.#e.size}}dispatch(){return this.#o(),this}#s(){return typeof window>"u"?{width:0,height:0}:{width:window.innerWidth,height:window.innerHeight}}#o(){let e=this.#s();this.notifyObservers(e)}#d(){clearTimeout(this.#n),window.setTimeout(()=>{},1),this.#n=window.setTimeout(()=>{this.#o()},this.#r)}};var n,s=()=>(n||(n=new r),n);var b=i=>({config(e){typeof e.delay=="number"&&i().setDelay(e.delay)},init(){i().subscribe()},destroy(){i().unsubscribe()}});var o,M=()=>(o||(o=h(s)),o),V=b(s);export{V as vueWindowSizeAPI,M as vueWindowSizeMixin}; diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/package.json b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/package.json new file mode 100644 index 00000000..1791ceca --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/mixin/package.json @@ -0,0 +1,30 @@ +{ + "name": "vue-window-size-mixin", + "version": "1.0.0", + "type": "module", + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "packageManager": "yarn@3.3.1", + "scripts": { + "build": "tsup", + "test:integration": "vitest --dir tests --run" + }, + "devDependencies": { + "@types/node": "^18.11.18", + "@vitejs/plugin-vue": "^4.0.0", + "@vue/compiler-dom": "^3.2.45", + "@vue/runtime-core": "^3.2.45", + "@vue/test-utils": "^2.2.7", + "happy-dom": "^20.0.0", + "tsup": "^8.5.0", + "typescript": "^4.9.4", + "vite": "^7.1.5", + "vite-tsconfig-paths": "^4.0.3", + "vitest": "^0.27.1", + "vue": "^3.2.45" + }, + "peerDependencies": { + "vue": "^3.0 || ^2.7" + } +} diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/package.json b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/package.json new file mode 100644 index 00000000..b2ee673a --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/package.json @@ -0,0 +1,74 @@ +{ + "name": "vue-window-size", + "version": "2.0.0", + "description": "Reactivity window size for Vue.js.", + "type": "module", + "main": "./composition-api/dist/index.cjs", + "module": "./composition-api/dist/index.js", + "types": "./composition-api/dist/index.d.js", + "exports": { + ".": { + "import": "./composition-api/dist/index.js", + "types": "./composition-api/dist/index.d.js", + "require": "./composition-api/dist/index.cjs" + }, + "./plugin": { + "import": "./plugin/dist/index.js", + "types": "./plugin/dist/index.d.js", + "require": "./plugin/dist/index.cjs" + }, + "./mixin": { + "import": "./mixin/dist/index.js", + "types": "./mixin/dist/index.d.js", + "require": "./mixin/dist/index.cjs" + }, + "./package.json": "./package.json", + "./plugin/package.json": "./plugin/package.json", + "./mixin/package.json": "./mixin/package.json" + }, + "repository": "https://github.com/mya-ake/vue-window-size.git", + "bugs": { + "url": "https://github.com/mya-ake/vue-window-size/issues" + }, + "author": "mya-ake ", + "license": "MIT", + "packageManager": "yarn@3.3.1", + "scripts": { + "format": "prettier --write .", + "format:check": "prettier --check .", + "build": "nx run-many --target=build", + "test:unit": "nx run-many --target=test:unit", + "test:integration": "nx run-many --target=test:integration", + "prepare": "husky install" + }, + "devDependencies": { + "@types/node": "^18.11.18", + "@vitest/coverage-c8": "^0.27.1", + "@vue/compiler-dom": "^3.2.45", + "happy-dom": "^20.0.0", + "husky": "^8.0.3", + "lint-staged": "^13.1.0", + "nx": "^15.5.1", + "prettier": "^2.8.3", + "typescript": "^4.9.4" + }, + "peerDependencies": { + "vue": "^3.0 || ^2.7" + }, + "files": [ + "composition-api", + "plugin", + "mixin" + ], + "keywords": [ + "vue.js", + "window size" + ], + "lint-staged": { + "*.{js,ts,json,md,yml}": "prettier --write" + }, + "workspaces": [ + "packages/*", + "examples/*" + ] +} \ No newline at end of file diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/dist/index.cjs b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/dist/index.cjs new file mode 100644 index 00000000..911ce49e --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/dist/index.cjs @@ -0,0 +1 @@ +"use strict";var d=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var l=(i,e)=>{for(var t in e)d(i,t,{get:e[t],enumerable:!0})},f=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of m(e))!v.call(i,r)&&r!==t&&d(i,r,{get:()=>e[r],enumerable:!(n=p(e,r))||n.enumerable});return i};var z=i=>f(d({},"__esModule",{value:!0}),i);var j={};l(j,{VueWindowSizePlugin:()=>R,vueWindowSizeAPI:()=>O});module.exports=z(j);var w=require("vue");var h=typeof window<"u",S=()=>h?window.innerWidth:0,y=()=>h?window.innerHeight:0,W=i=>i??S(),g=i=>i??y(),b=i=>({width:W(i?.width),height:g(i?.height)});var c=i=>{let e=(0,w.reactive)(b()),t=({width:n,height:r})=>{e.width=n,e.height=r};return i().addObserver("option-api",t).subscribe(),{computed:{$windowWidth(){return e.width},$windowHeight(){return e.height}}}};var s=class{#e=new Map;#r;#n;#i=!1;#t;constructor(e){let{delay:t=33}=e??{};this.#r=t,this.#t=this.#d.bind(this)}addObserver(e,t){return this.#e.set(e,t),t(this.#s()),this}deleteObserver(e){return this.#e.delete(e),this}deleteObservers(){return this.#e.clear(),this}notifyObservers(e){return this.#e.forEach(t=>{t(e)}),this}subscribe(){return typeof window>"u"?this:this.#i?this:(window.addEventListener("resize",this.#t),window.addEventListener("orientationchange",this.#t),this.#i=!0,this)}unsubscribe(){return this.#i?(window.removeEventListener("resize",this.#t),window.removeEventListener("orientationchange",this.#t),this.#i=!1,this):this}setDelay(e){return this.#r=e,this}info(){return{delay:this.#r,subscribed:this.#i,observersCount:this.#e.size}}dispatch(){return this.#o(),this}#s(){return typeof window>"u"?{width:0,height:0}:{width:window.innerWidth,height:window.innerHeight}}#o(){let e=this.#s();this.notifyObservers(e)}#d(){clearTimeout(this.#n),window.setTimeout(()=>{},1),this.#n=window.setTimeout(()=>{this.#o()},this.#r)}};var u,o=()=>(u||(u=new s),u);var a=i=>({config(e){typeof e.delay=="number"&&i().setDelay(e.delay)},init(){i().subscribe()},destroy(){i().unsubscribe()}});var O=a(o);function x(i,{delay:e=33}={}){let t=c(o);o().setDelay(e),i.mixin({mixins:[t]})}var R={install:x};0&&(module.exports={VueWindowSizePlugin,vueWindowSizeAPI}); diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/dist/index.d.ts b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/dist/index.d.ts new file mode 100644 index 00000000..36c43642 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/dist/index.d.ts @@ -0,0 +1,24 @@ +import { App } from 'vue'; + +type Config = { + delay?: number; +}; + +declare const vueWindowSizeAPI: { + config(config: Config): void; + init(): void; + destroy(): void; +}; +declare function install(app: App, { delay }?: Config): void; +declare const VueWindowSizePlugin: { + install: typeof install; +}; +declare module 'vue' { + interface ComponentCustomProperties { + $windowWidth: number; + $windowHeight: number; + } +} +type VueWindowSizeOptionApiConfig = Config; + +export { VueWindowSizeOptionApiConfig, VueWindowSizePlugin, vueWindowSizeAPI }; diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/dist/index.js b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/dist/index.js new file mode 100644 index 00000000..34a8a14a --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/dist/index.js @@ -0,0 +1 @@ +import{reactive as v}from"vue";var o=typeof window<"u",c=()=>o?window.innerWidth:0,a=()=>o?window.innerHeight:0,p=i=>i??c(),m=i=>i??a(),d=i=>({width:p(i?.width),height:m(i?.height)});var u=i=>{let e=v(d()),t=({width:b,height:w})=>{e.width=b,e.height=w};return i().addObserver("option-api",t).subscribe(),{computed:{$windowWidth(){return e.width},$windowHeight(){return e.height}}}};var r=class{#e=new Map;#r;#n;#i=!1;#t;constructor(e){let{delay:t=33}=e??{};this.#r=t,this.#t=this.#d.bind(this)}addObserver(e,t){return this.#e.set(e,t),t(this.#s()),this}deleteObserver(e){return this.#e.delete(e),this}deleteObservers(){return this.#e.clear(),this}notifyObservers(e){return this.#e.forEach(t=>{t(e)}),this}subscribe(){return typeof window>"u"?this:this.#i?this:(window.addEventListener("resize",this.#t),window.addEventListener("orientationchange",this.#t),this.#i=!0,this)}unsubscribe(){return this.#i?(window.removeEventListener("resize",this.#t),window.removeEventListener("orientationchange",this.#t),this.#i=!1,this):this}setDelay(e){return this.#r=e,this}info(){return{delay:this.#r,subscribed:this.#i,observersCount:this.#e.size}}dispatch(){return this.#o(),this}#s(){return typeof window>"u"?{width:0,height:0}:{width:window.innerWidth,height:window.innerHeight}}#o(){let e=this.#s();this.notifyObservers(e)}#d(){clearTimeout(this.#n),window.setTimeout(()=>{},1),this.#n=window.setTimeout(()=>{this.#o()},this.#r)}};var s,n=()=>(s||(s=new r),s);var h=i=>({config(e){typeof e.delay=="number"&&i().setDelay(e.delay)},init(){i().subscribe()},destroy(){i().unsubscribe()}});var V=h(n);function l(i,{delay:e=33}={}){let t=u(n);n().setDelay(e),i.mixin({mixins:[t]})}var I={install:l};export{I as VueWindowSizePlugin,V as vueWindowSizeAPI}; diff --git a/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/package.json b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/package.json new file mode 100644 index 00000000..838a73c1 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/lib/vue-window-size/plugin/package.json @@ -0,0 +1,30 @@ +{ + "name": "vue-window-size-plugin", + "version": "1.0.0", + "type": "module", + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "packageManager": "yarn@3.3.1", + "scripts": { + "build": "tsup", + "test:integration": "vitest --dir tests --run" + }, + "devDependencies": { + "@types/node": "^18.11.18", + "@vitejs/plugin-vue": "^4.0.0", + "@vue/compiler-dom": "^3.2.45", + "@vue/runtime-core": "^3.2.45", + "@vue/test-utils": "^2.2.7", + "happy-dom": "^20.0.0", + "tsup": "^8.5.0", + "typescript": "^4.9.4", + "vite": "^7.1.5", + "vite-tsconfig-paths": "^4.0.3", + "vitest": "^0.27.1", + "vue": "^3.2.45" + }, + "peerDependencies": { + "vue": "^3.0 || ^2.7" + } +} diff --git a/README.md b/README.md index 54170429..071bc6ad 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,12 @@ ## Projects Overview -[EssentialCSharp.Web](https://github.com/IntelliTect/EssentialCSharp.Web/tree/main/EssentialCSharp.Web) - The site seen at [essentialcsharp.com](https://essentialcsharp.com/) +- [EssentialCSharp.Web](https://github.com/IntelliTect/EssentialCSharp.Web/tree/main/EssentialCSharp.Web) - The site seen at [essentialcsharp.com](https://essentialcsharp.com/) -## What You Will Need +For any bugs, questions, or anything else with specifically the code found inside the listings (listing examples code), please submit an issue at the [EssentialCSharp Repo](https://github.com/IntelliTect/EssentialCSharp). -- [Visual Studio](https://visualstudio.microsoft.com/) (or your preferred IDE) -- [.NET 7.0 SDK](https://dotnet.microsoft.com/en-us/download) - - If you already have .NET installed you can check the version by typing `dotnet --info` into cmd to make sure you have the right version +## Getting Started -## Startup Steps +For information on setting up your local development environment, please see the [Getting Started Guide](docs/getting-started.md). -To get the site that is seen at [essentialcsharp.com](https://essentialcsharp.com/): - -1. Clone Repository locally. -2. If you have do not have access to the private nuget feed, change the line `true` to `false` in [EssentialCSharp.Web/EssentialCSharp.Web.csproj](https://github.com/IntelliTect/EssentialCSharp.Web/blob/main/EssentialCSharp.Web/EssentialCSharp.Web.csproj) +Please use issues or discussions to report issues found. diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 00000000..75a12802 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,39 @@ +# Getting Started with EssentialCSharp.Web Development + +This guide will help you set up your local development environment for working on the Essential C# Web project. + +## What You Will Need + +- [Visual Studio](https://visualstudio.microsoft.com/) (or your preferred IDE) +- [.NET 10.0 SDK](https://dotnet.microsoft.com/download) + - If you already have .NET installed you can check the version by typing `dotnet --info` into cmd to make sure you have the right version + +## Startup Steps + +To get the site that is seen at [essentialcsharp.com](https://essentialcsharp.com/): + +1. Clone Repository locally. +2. Set any needed secrets +3. If you have do not have access to the private nuget feed, change the line `true` to `false` in [Directory.Packages.props](https://github.com/IntelliTect/EssentialCSharp.Web/blob/main/Directory.Packages.props). + +## Environment Prerequisites + +Make sure the following secrets are set: +In local development this ideally should be done using the dotnet secret manager. Additional information can be found at the [documentation](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets#set-a-secret) + +AuthMessageSender:SendFromName = "Hello World Team" +AuthMessageSender:SendFromEmail = "no-reply@email.com" +AuthMessageSender:SecretKey = alongstringofsecretsauce +AuthMessageSender:APIKey = anapikey +Authentication:Microsoft:ClientSecret = anotherimportantsecret +Authentication:Microsoft:ClientId = anotherimportantclient +Authentication:github:clientSecret = anotherimportantclientsecret +Authentication:github:clientId = anotherimportantclientid +HCaptcha:SiteKey = captchaSiteKey +HCaptcha:SecretKey = captchaSecretKey +APPLICATIONINSIGHTS_CONNECTION_STRING = "InstrumentationKey=your-instrumentation-key-here;IngestionEndpoint=https://region.in.applicationinsights.azure.com/;LiveEndpoint=https://region.livediagnostics.monitor.azure.com/" + +### Testing Secret Values + +Some Value Secrets for Testing/Development Purposes: +HCaptcha: https://docs.hcaptcha.com/#integration-testing-test-keys diff --git a/global.json b/global.json index 7f04897c..01560a7b 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,9 @@ { "sdk": { - "version": "7.0.103", + "version": "10.0.203", "rollForward": "latestMinor" + }, + "test": { + "runner": "Microsoft.Testing.Platform" } } \ No newline at end of file diff --git a/nuget.config b/nuget.config index 2d87f729..65bcde44 100644 --- a/nuget.config +++ b/nuget.config @@ -1,9 +1,17 @@ ο»Ώ - - - - - - + + + + + + + + + + + + + +