How does bcrypt check work for password validation?
The Ultimate Authoritative Guide to Bcrypt Check for Password Validation
By [Your Name/Title], Cybersecurity Lead
Executive Summary
This guide provides an exhaustive and authoritative explanation of how Bcrypt's check mechanism validates passwords, emphasizing its security robustness and practical implementation. We will delve into the underlying cryptographic principles, explore common use cases, and contextualize Bcrypt within global industry standards.
In the realm of cybersecurity, the secure storage and validation of user credentials are paramount. Passwords, while often the first line of defense, are notoriously vulnerable to various attacks if not handled with the utmost care. Traditional methods of password storage, such as simple hashing or reversible encryption, are now considered dangerously inadequate. The advent of strong, adaptive, and salting cryptographic hash functions has revolutionized password security. Among these, Bcrypt stands out as a superior choice for its inherent resistance to brute-force and rainbow table attacks, primarily due to its adaptive nature and the intelligent incorporation of a salt.
This document focuses on the critical aspect of password validation using Bcrypt: the "check" operation. We will dissect how Bcrypt's unique algorithm ensures that a submitted password matches a previously stored hash, without ever needing to expose the original plaintext password. Our core tool for this exploration will be the conceptual understanding of the `bcrypt-check` operation, a fundamental function found in most Bcrypt implementations. By understanding the mechanics of this check, security professionals, developers, and system administrators can make informed decisions about their authentication systems, thereby significantly enhancing their security posture.
We will cover:
- The foundational principles of Bcrypt and its cryptographic strengths.
- A deep technical dive into the `bcrypt-check` process, including the role of the salt, cost factor, and the actual hashing algorithm.
- Practical scenarios illustrating the application of Bcrypt checks in real-world systems.
- Alignment with international security standards and best practices.
- A multilingual code vault to demonstrate implementation across different programming languages.
- An outlook on the future of password hashing and Bcrypt's continued relevance.
This guide is intended to be a comprehensive resource, equipping readers with the knowledge necessary to confidently implement and manage secure password authentication using Bcrypt.
Deep Technical Analysis: How Bcrypt Check Works for Password Validation
This section demystifies the inner workings of the Bcrypt check mechanism, revealing the cryptographic elegance that makes it a gold standard for password validation.
The Bcrypt Algorithm: A Foundation of Security
Bcrypt is a password hashing function developed by Niels Provos and David M'Raïhi in 1999. It's designed to be computationally expensive, making it resistant to brute-force attacks. Unlike traditional hashing algorithms like MD5 or SHA-1, which are optimized for speed, Bcrypt is deliberately slow. This slowness is not a flaw but a core feature. Bcrypt is based on the Blowfish cipher, a symmetric encryption algorithm, and it incorporates several key elements to enhance security:
- Salting: Each password hash generated by Bcrypt includes a unique, randomly generated salt. This salt is concatenated with the password before hashing. The purpose of salting is to prevent attackers from using pre-computed tables of hashes (rainbow tables) to crack passwords. Even if two users have the same password, their stored hashes will be different due to the unique salt.
- Cost Factor (Work Factor): Bcrypt allows for a configurable "cost factor" or "work factor." This factor determines the number of iterations the algorithm performs. A higher cost factor means more computational effort is required to generate the hash, and consequently, to verify it. This makes brute-force attacks significantly more time-consuming and expensive for attackers. The cost factor is typically represented as a power of 2 (e.g., 2^10, 2^12).
- Adaptive Hashing: The cost factor can be increased over time as computing power grows. This "adaptive" nature ensures that Bcrypt remains resistant to brute-force attacks even as hardware technology advances.
The Bcrypt Check Operation: A Step-by-Step Breakdown
The core of password validation with Bcrypt lies in the `bcrypt-check` operation (often represented by functions like `bcrypt.compare` in various libraries). This operation takes two inputs: the plaintext password provided by the user during login and the previously stored Bcrypt hash. The magic happens in how these inputs are processed to determine a match.
Here's a detailed breakdown of the `bcrypt-check` process:
-
Extraction of Salt and Cost Factor:
The stored Bcrypt hash is not just a string of random characters; it's a structured representation. The `bcrypt-check` function first parses this stored hash. From the hash string, it extracts two crucial pieces of information:
- The salt that was used to generate this specific hash.
- The cost factor (work factor) that was applied during its generation.
- Re-Hashing the Provided Password: The plaintext password submitted by the user during the login attempt is then taken. This password is combined with the extracted salt.
- Applying the Cost Factor: The combination of the provided password and the extracted salt is then subjected to the Bcrypt hashing algorithm. Crucially, the extracted cost factor dictates the number of rounds (iterations) the algorithm will perform. This means the algorithm will repeatedly apply the Blowfish cipher and other transformations, making the hashing process computationally intensive, just as it was when the original hash was created.
- Comparing the Generated Hash with the Stored Hash: After the re-hashing process is complete, a new hash is generated from the provided plaintext password and the extracted salt, using the extracted cost factor. This newly generated hash is then compared, character by character, with the original stored Bcrypt hash.
-
Result of the Comparison:
- If the newly generated hash exactly matches the stored hash, it signifies that the provided plaintext password is correct. The authentication process proceeds.
- If there is any difference between the newly generated hash and the stored hash, it means the provided plaintext password is incorrect. The authentication fails.
The Importance of the Cost Factor and Salt
It's vital to understand why this process is secure:
- No Plaintext Exposure: The original password is never stored, and the `bcrypt-check` operation never needs to access it in plaintext form after the initial hashing. The comparison is always between two generated hashes.
- Salt Prevents Rainbow Table Attacks: Because each hash has a unique salt, an attacker cannot use pre-computed tables. Even if they manage to steal a database of hashes, each hash would need to be cracked individually with its specific salt.
- Cost Factor Thwarts Brute-Force: The computationally expensive nature of Bcrypt, dictated by the cost factor, makes it infeasible for attackers to try millions or billions of password combinations per second. As computing power increases, the cost factor can be raised to maintain this resistance.
- Adaptive Security: The ability to update the cost factor for newly generated hashes ensures long-term security. When migrating to new systems or when hardware capabilities advance, administrators can increase the cost factor for all new password hashes, future-proofing the system.
Structure of a Bcrypt Hash
A typical Bcrypt hash string often looks like this:
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZ2.U.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0.pTq81K.0