# REMINDERS SINCE IT'S BEEN A MONTH
# insert new code chunk by entering Ctrl+Alt+I
# the preview shows you a rendered HTML copy of the contents of the editor
# unlike *Knit*, *Preview* does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed
Using the Hadamard Matrix in Quantum Computing with Shor’s
Algorithm
Shor’s algorithm primarily involves period finding using quantum
circuits, and one of the key components in constructing these circuits
is the Hadamard gate (or matrix). The Hadamard gate is used to create
superpositions, which are essential for quantum parallelism.
Here’s a simplified step-by-step explanation of how the Hadamard
matrix is used within the context of Shor’s algorithm:
1. Initialization and Superposition
The Hadamard matrix (or gate) is applied to each qubit to create a
superposition of all possible states. For an \(n\)-qubit register, this transforms the
state \(|0\rangle^{\otimes n}\) into an
equal superposition of all \(2^n\)
basis states.
Hadamard Gate (H):
\[
H = \frac{1}{\sqrt{2}} \begin{pmatrix}
1 & 1 \\
1 & -1
\end{pmatrix}
\]
For an \(n\)-qubit system, the
Hadamard operation \(H^{\otimes n}\)
creates the superposition:
\[
|0\rangle^{\otimes n} \xrightarrow{H^{\otimes n}} \frac{1}{\sqrt{2^n}}
\sum_{x=0}^{2^n-1} |x\rangle
\]
2. Modular Exponentiation
A quantum circuit is used to perform modular exponentiation, which is
a key step in Shor’s algorithm for creating a periodic function. This
step does not directly involve the Hadamard gate but sets up the state
for period finding.
4. Measurement and Classical Post-Processing
Finally, after applying the QFT, the qubits are measured. The
measurement results are processed classically to determine the period
\(r\). If \(r\) is even, classical algorithms are used
to find the factors of \(N\).
Example Using a Simple 2-Qubit System
Here’s a concrete example using a simple 2-qubit system to
demonstrate the creation of superposition and the role of Hadamard
gates:
Step 1: Initialization
\[
|00\rangle
\]
Step 2: Apply Hadamard Gates
\[
H \otimes H |00\rangle = \frac{1}{2} (|00\rangle + |01\rangle +
|10\rangle + |11\rangle)
\]
This creates an equal superposition of all possible states for 2
qubits.
Step 3: Modular Exponentiation
Assume we perform some operation \(U_f\) such that:
\[
U_f |x\rangle |0\rangle = |x\rangle |f(x)\rangle
\]
For our example, let’s simplify and assume \(f(x)\) maps the states in a certain
periodic fashion.
Step 4: Apply QFT
\[
\text{QFT} \left(\frac{1}{2} (|00\rangle + |01\rangle + |10\rangle +
|11\rangle)\right)
\]
Applying the QFT will transform the state into another superposition
state, which encodes the period information.
Step 5: Measurement
Measure the qubits to collapse the state to a basis state that gives
information about the period.
Step 6: Classical Post-Processing
Using the measured results, apply classical algorithms to determine
the period \(r\) and use it to find the
factors of \(N\).
Conclusion
The Hadamard gate is crucial in Shor’s algorithm for creating the
initial superposition of states and is also used in the QFT to extract
periodicity information. By leveraging the principles of quantum
superposition and interference, Shor’s algorithm achieves a significant
speedup for factoring large integers compared to classical
algorithms.
Understanding BELL STATES:
Key Points and Summary of Bell States
Bell States: Bell states are specific quantum states
of two qubits that represent the simplest and most powerful examples of
quantum entanglement. They are fundamental in quantum information theory
and are used to demonstrate the peculiar properties of entanglement.
Types of Bell States: There are four Bell states,
each representing a different type of entangled state:
- Φ⁺: \(|\Phi^+\rangle =
\frac{1}{\sqrt{2}} (|00\rangle + |11\rangle)\)
- Φ⁻: \(|\Phi^-\rangle =
\frac{1}{\sqrt{2}} (|00\rangle - |11\rangle)\)
- Ψ⁺: \(|\Psi^+\rangle =
\frac{1}{\sqrt{2}} (|01\rangle + |10\rangle)\)
- Ψ⁻: \(|\Psi^-\rangle =
\frac{1}{\sqrt{2}} (|01\rangle - |10\rangle)\)
Applications: - Quantum
Teleportation: Transmitting quantum information over distances.
- Quantum Cryptography: Secure communication methods. -
Entanglement-Based Protocols: Foundations of many
quantum algorithms and protocols.
Further Understanding of Bell States
Entangled States: Bell states are specific
examples of maximally entangled two-qubit states. Entanglement is a
fundamental concept in quantum mechanics where the state of one qubit
cannot be described independently of the other.
Four Bell States: There are four distinct Bell
states, denoted as:
- |Φ+⟩ = (|00⟩ + |11⟩)/√2
- |Φ-⟩ = (|00⟩ - |11⟩)/√2
- |Ψ+⟩ = (|01⟩ + |10⟩)/√2
- |Ψ-⟩ = (|01⟩ - |10⟩)/√2
Creation of Bell States: Bell states can be
created using specific quantum circuits involving Hadamard (H) and
controlled-NOT (CNOT) gates.
Measurement of Bell States: Measuring one qubit
in a Bell state instantly determines the state of the other qubit,
regardless of the distance between them. This is a key feature of
entanglement.
Significance in Quantum Information: Bell states
are essential in quantum information theory and have applications in
quantum teleportation, superdense coding, and quantum key
distribution.
Bell’s Theorem: The existence of Bell states and
their properties challenge the concept of local realism, a classical
notion that physical properties exist independently of measurement and
that information cannot travel faster than light.
More Bell States
Definition of Bell States: The four Bell states
are specific entangled states of two qubits. They are maximally
entangled, meaning the qubits are strongly correlated and cannot be
described independently.
Notation and Representation: The Bell states are
denoted as
- \(\ket{\Phi^+}\)
- \(\ket{\Phi^-}\)
- \(\ket{\Psi^+}\)
- \(\ket{\Psi^-}\) Each state is a
superposition of the computational basis states of the two qubits.
Properties:
- Orthonormal: The Bell states form an orthonormal
basis for the four-dimensional Hilbert space of two qubits. This means
they are mutually perpendicular and have unit length.
- Measurement Outcomes: Measuring a Bell state in the
computational basis always results in one of the four possible outcomes
with equal probability (25%).
- Entanglement: Bell states exhibit perfect
correlations between measurement outcomes of the two qubits.
Creation:
- Bell states can be created using quantum gates like the Hadamard (H)
gate and the Controlled-NOT (CNOT) gate.
- For example, applying a Hadamard gate to the first qubit and then a
CNOT gate with the first qubit as control and the second as target will
create the \(\ket{\Phi^+}\) state.
Significance:
- Bell states are fundamental resources for quantum information
processing.
- They are used in quantum teleportation, superdense coding, and other
quantum protocols.
- They play a crucial role in understanding quantum entanglement and
its applications.
(https://learning.quantum.ibm.com/course/basics-of-quantum-information/multiple-systems#bell-states).
python
from qiskit import QuantumCircuit
Create a quantum circuit with 2 qubits: qc =
QuantumCircuit(2)
Apply Hadamard gate to the first qubit:
qc.h(0)
Apply CNOT gate, controlled by qubit 0 and targeting qubit 1:
qc.cx(0, 1)
Apply Z gate to qubit 0: qc.z(0)
Apply X gate to qubit 1: qc.x(1)
Don’t change any code past this line:
qc.measure_all()
qc.draw(‘mpl’)
Explanation:
Initialization: We start with both qubits in the
state |0⟩.
Hadamard Gate (H): Applying the Hadamard gate to
the first qubit creates a superposition:
|0⟩ -> (|0⟩ + |1⟩) / √2
The overall state of the two qubits is now:
(|00⟩ + |10⟩) / √2
CNOT Gate: The Controlled-NOT (CNOT) gate acts
on the second qubit, controlled by the first. If the first qubit is |1⟩,
it flips the second qubit. This gives us:
(|00⟩ + |11⟩) / √2
Z Gate: The Z gate on the first qubit introduces
a relative phase of -1 to the |1⟩ component of the first qubit:
(|00⟩ - |11⟩) / √2
X Gate: The X gate on the second qubit flips it
from |0⟩ to |1⟩ or vice versa:
(|01⟩ - |10⟩) / √2
This final state is the |ψ⁻⟩ Bell state:
|ψ⁻⟩ = (|01⟩ - |10⟩) / √2
Key Points:
- Entanglement: The Bell state is an entangled state,
meaning the two qubits are inextricably linked and their states cannot
be described independently.
- Measurement: If you measure both qubits in the
computational basis (|0⟩ and |1⟩), you’ll always get opposite results
(01 or 10) with equal probability.
LS0tDQp0aXRsZTogIkhhZGFtYXJkIE1hdHJpeCBpbiBRUSINCmF1dGhvcjogIkplc3NpY2EgTWNQaGF1bCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0Ka25pdF9yb290X2RpcjogIkM6L1VzZXJzL0plc3NpY2EgTS9EZXNrdG9wIg0KLS0tDQoNCg0KDQoNCmBgYHtyfQ0KIyBSRU1JTkRFUlMgU0lOQ0UgSVQnUyBCRUVOIEEgTU9OVEgNCiMgaW5zZXJ0IG5ldyBjb2RlIGNodW5rIGJ5IGVudGVyaW5nIEN0cmwrQWx0K0kNCiMgdGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yDQojICB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZA0KYGBgDQoNCiMjIyBVc2luZyB0aGUgSGFkYW1hcmQgTWF0cml4IGluIFF1YW50dW0gQ29tcHV0aW5nIHdpdGggU2hvcidzIEFsZ29yaXRobQ0KDQpTaG9yJ3MgYWxnb3JpdGhtIHByaW1hcmlseSBpbnZvbHZlcyBwZXJpb2QgZmluZGluZyB1c2luZyBxdWFudHVtIGNpcmN1aXRzLCBhbmQgb25lIG9mIHRoZSBrZXkgY29tcG9uZW50cyBpbiBjb25zdHJ1Y3RpbmcgdGhlc2UgY2lyY3VpdHMgaXMgdGhlIEhhZGFtYXJkIGdhdGUgKG9yIG1hdHJpeCkuIFRoZSBIYWRhbWFyZCBnYXRlIGlzIHVzZWQgdG8gY3JlYXRlIHN1cGVycG9zaXRpb25zLCB3aGljaCBhcmUgZXNzZW50aWFsIGZvciBxdWFudHVtIHBhcmFsbGVsaXNtLg0KDQpIZXJl4oCZcyBhIHNpbXBsaWZpZWQgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGUgSGFkYW1hcmQgbWF0cml4IGlzIHVzZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIFNob3IncyBhbGdvcml0aG06DQoNCiMjIyMgMS4gKipJbml0aWFsaXphdGlvbiBhbmQgU3VwZXJwb3NpdGlvbioqDQoNClRoZSBIYWRhbWFyZCBtYXRyaXggKG9yIGdhdGUpIGlzIGFwcGxpZWQgdG8gZWFjaCBxdWJpdCB0byBjcmVhdGUgYSBzdXBlcnBvc2l0aW9uIG9mIGFsbCBwb3NzaWJsZSBzdGF0ZXMuIEZvciBhbiBcKCBuIFwpLXF1Yml0IHJlZ2lzdGVyLCB0aGlzIHRyYW5zZm9ybXMgdGhlIHN0YXRlIFwofDBccmFuZ2xlXntcb3RpbWVzIG59XCkgaW50byBhbiBlcXVhbCBzdXBlcnBvc2l0aW9uIG9mIGFsbCBcKCAyXm4gXCkgYmFzaXMgc3RhdGVzLg0KDQoqKkhhZGFtYXJkIEdhdGUgKEgpOioqDQoNClxbDQpIID0gXGZyYWN7MX17XHNxcnR7Mn19IFxiZWdpbntwbWF0cml4fQ0KMSAmIDEgXFwNCjEgJiAtMQ0KXGVuZHtwbWF0cml4fQ0KXF0NCg0KRm9yIGFuIFwoIG4gXCktcXViaXQgc3lzdGVtLCB0aGUgSGFkYW1hcmQgb3BlcmF0aW9uIFwoIEhee1xvdGltZXMgbn0gXCkgY3JlYXRlcyB0aGUgc3VwZXJwb3NpdGlvbjoNCg0KXFsNCnwwXHJhbmdsZV57XG90aW1lcyBufSBceHJpZ2h0YXJyb3d7SF57XG90aW1lcyBufX0gXGZyYWN7MX17XHNxcnR7Ml5ufX0gXHN1bV97eD0wfV57Ml5uLTF9IHx4XHJhbmdsZQ0KXF0NCg0KIyMjIyAyLiAqKk1vZHVsYXIgRXhwb25lbnRpYXRpb24qKg0KDQpBIHF1YW50dW0gY2lyY3VpdCBpcyB1c2VkIHRvIHBlcmZvcm0gbW9kdWxhciBleHBvbmVudGlhdGlvbiwgd2hpY2ggaXMgYSBrZXkgc3RlcCBpbiBTaG9yJ3MgYWxnb3JpdGhtIGZvciBjcmVhdGluZyBhIHBlcmlvZGljIGZ1bmN0aW9uLiBUaGlzIHN0ZXAgZG9lcyBub3QgZGlyZWN0bHkgaW52b2x2ZSB0aGUgSGFkYW1hcmQgZ2F0ZSBidXQgc2V0cyB1cCB0aGUgc3RhdGUgZm9yIHBlcmlvZCBmaW5kaW5nLg0KDQojIyMjIDMuICoqUXVhbnR1bSBGb3VyaWVyIFRyYW5zZm9ybSAoUUZUKSoqDQoNCkFmdGVyIHRoZSBtb2R1bGFyIGV4cG9uZW50aWF0aW9uLCB0aGUgcXVhbnR1bSBzdGF0ZSBlbmNvZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwZXJpb2Qgb2YgdGhlIGZ1bmN0aW9uIFwoIGYoeCkgPSBhXnggXG1vZCBOIFwpLiBUbyBleHRyYWN0IHRoaXMgcGVyaW9kLCB0aGUgUXVhbnR1bSBGb3VyaWVyIFRyYW5zZm9ybSAoUUZUKSBpcyBhcHBsaWVkLiBUaGUgUUZUIHVzZXMgSGFkYW1hcmQgZ2F0ZXMgYWxvbmcgd2l0aCBjb250cm9sbGVkIHBoYXNlIHNoaWZ0cy4NCg0KVGhlIFFGVCBpcyBkZWZpbmVkIGFzOg0KDQpcWw0KXHRleHR7UUZUfSB8eFxyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyXm59fSBcc3VtX3trPTB9XnsyXm4tMX0gZV57MlxwaSBpIHggayAvIDJebn0gfGtccmFuZ2xlDQpcXQ0KDQoqKkV4YW1wbGUgUXVhbnR1bSBDaXJjdWl0IGZvciBRRlQ6KioNCkZvciBhIDMtcXViaXQgc3lzdGVtLCB0aGUgUUZUIGNpcmN1aXQgaW52b2x2ZXMgSGFkYW1hcmQgZ2F0ZXMgYW5kIGNvbnRyb2xsZWQgcm90YXRpb25zIChvbWl0dGluZyBkZXRhaWxzIGZvciBicmV2aXR5KToNCg0KMS4gQXBwbHkgSGFkYW1hcmQgdG8gdGhlIGZpcnN0IHF1Yml0Lg0KMi4gQXBwbHkgY29udHJvbGxlZCBwaGFzZSBzaGlmdHMgdG8gdGhlIGZpcnN0IHF1Yml0IGNvbmRpdGlvbmVkIG9uIHRoZSBzZWNvbmQgYW5kIHRoaXJkIHF1Yml0cy4NCjMuIEFwcGx5IEhhZGFtYXJkIHRvIHRoZSBzZWNvbmQgcXViaXQsIGZvbGxvd2VkIGJ5IGNvbnRyb2xsZWQgcGhhc2Ugc2hpZnRzLg0KNC4gQXBwbHkgSGFkYW1hcmQgdG8gdGhlIHRoaXJkIHF1Yml0Lg0KDQojIyMjIDQuICoqTWVhc3VyZW1lbnQgYW5kIENsYXNzaWNhbCBQb3N0LVByb2Nlc3NpbmcqKg0KDQpGaW5hbGx5LCBhZnRlciBhcHBseWluZyB0aGUgUUZULCB0aGUgcXViaXRzIGFyZSBtZWFzdXJlZC4gVGhlIG1lYXN1cmVtZW50IHJlc3VsdHMgYXJlIHByb2Nlc3NlZCBjbGFzc2ljYWxseSB0byBkZXRlcm1pbmUgdGhlIHBlcmlvZCBcKCByIFwpLiBJZiBcKCByIFwpIGlzIGV2ZW4sIGNsYXNzaWNhbCBhbGdvcml0aG1zIGFyZSB1c2VkIHRvIGZpbmQgdGhlIGZhY3RvcnMgb2YgXCggTiBcKS4NCg0KIyMjIEV4YW1wbGUgVXNpbmcgYSBTaW1wbGUgMi1RdWJpdCBTeXN0ZW0NCg0KSGVyZeKAmXMgYSBjb25jcmV0ZSBleGFtcGxlIHVzaW5nIGEgc2ltcGxlIDItcXViaXQgc3lzdGVtIHRvIGRlbW9uc3RyYXRlIHRoZSBjcmVhdGlvbiBvZiBzdXBlcnBvc2l0aW9uIGFuZCB0aGUgcm9sZSBvZiBIYWRhbWFyZCBnYXRlczoNCg0KKipTdGVwIDE6IEluaXRpYWxpemF0aW9uKioNCg0KXFsNCnwwMFxyYW5nbGUNClxdDQoNCioqU3RlcCAyOiBBcHBseSBIYWRhbWFyZCBHYXRlcyoqDQoNClxbDQpIIFxvdGltZXMgSCB8MDBccmFuZ2xlID0gXGZyYWN7MX17Mn0gKHwwMFxyYW5nbGUgKyB8MDFccmFuZ2xlICsgfDEwXHJhbmdsZSArIHwxMVxyYW5nbGUpDQpcXQ0KDQpUaGlzIGNyZWF0ZXMgYW4gZXF1YWwgc3VwZXJwb3NpdGlvbiBvZiBhbGwgcG9zc2libGUgc3RhdGVzIGZvciAyIHF1Yml0cy4NCg0KKipTdGVwIDM6IE1vZHVsYXIgRXhwb25lbnRpYXRpb24qKg0KDQpBc3N1bWUgd2UgcGVyZm9ybSBzb21lIG9wZXJhdGlvbiBcKCBVX2YgXCkgc3VjaCB0aGF0Og0KDQpcWw0KVV9mIHx4XHJhbmdsZSB8MFxyYW5nbGUgPSB8eFxyYW5nbGUgfGYoeClccmFuZ2xlDQpcXQ0KDQpGb3Igb3VyIGV4YW1wbGUsIGxldOKAmXMgc2ltcGxpZnkgYW5kIGFzc3VtZSBcKCBmKHgpIFwpIG1hcHMgdGhlIHN0YXRlcyBpbiBhIGNlcnRhaW4gcGVyaW9kaWMgZmFzaGlvbi4NCg0KKipTdGVwIDQ6IEFwcGx5IFFGVCoqDQoNClxbDQpcdGV4dHtRRlR9IFxsZWZ0KFxmcmFjezF9ezJ9ICh8MDBccmFuZ2xlICsgfDAxXHJhbmdsZSArIHwxMFxyYW5nbGUgKyB8MTFccmFuZ2xlKVxyaWdodCkNClxdDQoNCkFwcGx5aW5nIHRoZSBRRlQgd2lsbCB0cmFuc2Zvcm0gdGhlIHN0YXRlIGludG8gYW5vdGhlciBzdXBlcnBvc2l0aW9uIHN0YXRlLCB3aGljaCBlbmNvZGVzIHRoZSBwZXJpb2QgaW5mb3JtYXRpb24uDQoNCioqU3RlcCA1OiBNZWFzdXJlbWVudCoqDQoNCk1lYXN1cmUgdGhlIHF1Yml0cyB0byBjb2xsYXBzZSB0aGUgc3RhdGUgdG8gYSBiYXNpcyBzdGF0ZSB0aGF0IGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwZXJpb2QuDQoNCioqU3RlcCA2OiBDbGFzc2ljYWwgUG9zdC1Qcm9jZXNzaW5nKioNCg0KVXNpbmcgdGhlIG1lYXN1cmVkIHJlc3VsdHMsIGFwcGx5IGNsYXNzaWNhbCBhbGdvcml0aG1zIHRvIGRldGVybWluZSB0aGUgcGVyaW9kIFwoIHIgXCkgYW5kIHVzZSBpdCB0byBmaW5kIHRoZSBmYWN0b3JzIG9mIFwoIE4gXCkuDQoNCiMjIyBDb25jbHVzaW9uDQoNClRoZSBIYWRhbWFyZCBnYXRlIGlzIGNydWNpYWwgaW4gU2hvcidzIGFsZ29yaXRobSBmb3IgY3JlYXRpbmcgdGhlIGluaXRpYWwgc3VwZXJwb3NpdGlvbiBvZiBzdGF0ZXMgYW5kIGlzIGFsc28gdXNlZCBpbiB0aGUgUUZUIHRvIGV4dHJhY3QgcGVyaW9kaWNpdHkgaW5mb3JtYXRpb24uIEJ5IGxldmVyYWdpbmcgdGhlIHByaW5jaXBsZXMgb2YgcXVhbnR1bSBzdXBlcnBvc2l0aW9uIGFuZCBpbnRlcmZlcmVuY2UsIFNob3IncyBhbGdvcml0aG0gYWNoaWV2ZXMgYSBzaWduaWZpY2FudCBzcGVlZHVwIGZvciBmYWN0b3JpbmcgbGFyZ2UgaW50ZWdlcnMgY29tcGFyZWQgdG8gY2xhc3NpY2FsIGFsZ29yaXRobXMuDQoNCg0KDQoNCiMgVW5kZXJzdGFuZGluZyBCRUxMIFNUQVRFUzoNCiMjIyBLZXkgUG9pbnRzIGFuZCBTdW1tYXJ5IG9mIEJlbGwgU3RhdGVzDQoNCioqQmVsbCBTdGF0ZXM6KioNCkJlbGwgc3RhdGVzIGFyZSBzcGVjaWZpYyBxdWFudHVtIHN0YXRlcyBvZiB0d28gcXViaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBzaW1wbGVzdCBhbmQgbW9zdCBwb3dlcmZ1bCBleGFtcGxlcyBvZiBxdWFudHVtIGVudGFuZ2xlbWVudC4gVGhleSBhcmUgZnVuZGFtZW50YWwgaW4gcXVhbnR1bSBpbmZvcm1hdGlvbiB0aGVvcnkgYW5kIGFyZSB1c2VkIHRvIGRlbW9uc3RyYXRlIHRoZSBwZWN1bGlhciBwcm9wZXJ0aWVzIG9mIGVudGFuZ2xlbWVudC4NCg0KKipUeXBlcyBvZiBCZWxsIFN0YXRlczoqKg0KVGhlcmUgYXJlIGZvdXIgQmVsbCBzdGF0ZXMsIGVhY2ggcmVwcmVzZW50aW5nIGEgZGlmZmVyZW50IHR5cGUgb2YgZW50YW5nbGVkIHN0YXRlOg0KDQoxLiAqKs6m4oG6OioqIFwofFxQaGleK1xyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyfX0gKHwwMFxyYW5nbGUgKyB8MTFccmFuZ2xlKVwpDQoyLiAqKs6m4oG7OioqIFwofFxQaGleLVxyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyfX0gKHwwMFxyYW5nbGUgLSB8MTFccmFuZ2xlKVwpDQozLiAqKs6o4oG6OioqIFwofFxQc2leK1xyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyfX0gKHwwMVxyYW5nbGUgKyB8MTBccmFuZ2xlKVwpDQo0LiAqKs6o4oG7OioqIFwofFxQc2leLVxyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyfX0gKHwwMVxyYW5nbGUgLSB8MTBccmFuZ2xlKVwpDQoNCioqQXBwbGljYXRpb25zOioqDQotICoqUXVhbnR1bSBUZWxlcG9ydGF0aW9uOioqIFRyYW5zbWl0dGluZyBxdWFudHVtIGluZm9ybWF0aW9uIG92ZXIgZGlzdGFuY2VzLg0KLSAqKlF1YW50dW0gQ3J5cHRvZ3JhcGh5OioqIFNlY3VyZSBjb21tdW5pY2F0aW9uIG1ldGhvZHMuDQotICoqRW50YW5nbGVtZW50LUJhc2VkIFByb3RvY29sczoqKiBGb3VuZGF0aW9ucyBvZiBtYW55IHF1YW50dW0gYWxnb3JpdGhtcyBhbmQgcHJvdG9jb2xzLg0KDQojIyBGdXJ0aGVyIFVuZGVyc3RhbmRpbmcgb2YgQmVsbCBTdGF0ZXMNCg0KMS4gKipFbnRhbmdsZWQgU3RhdGVzOioqIEJlbGwgc3RhdGVzIGFyZSBzcGVjaWZpYyBleGFtcGxlcyBvZiBtYXhpbWFsbHkgZW50YW5nbGVkIHR3by1xdWJpdCBzdGF0ZXMuIEVudGFuZ2xlbWVudCBpcyBhIGZ1bmRhbWVudGFsIGNvbmNlcHQgaW4gcXVhbnR1bSBtZWNoYW5pY3Mgd2hlcmUgdGhlIHN0YXRlIG9mIG9uZSBxdWJpdCBjYW5ub3QgYmUgZGVzY3JpYmVkIGluZGVwZW5kZW50bHkgb2YgdGhlIG90aGVyLg0KDQoyLiAqKkZvdXIgQmVsbCBTdGF0ZXM6KiogVGhlcmUgYXJlIGZvdXIgZGlzdGluY3QgQmVsbCBzdGF0ZXMsIGRlbm90ZWQgYXM6IA0KICAgLSAgfM6mK+KfqSA9ICh8MDDin6kgKyB8MTHin6kpL+KImjIgDQogICAtICB8zqYt4p+pID0gKHwwMOKfqSAtIHwxMeKfqSkv4oiaMg0KICAgLSAgfM6oK+KfqSA9ICh8MDHin6kgKyB8MTDin6kpL+KImjINCiAgIC0gIHzOqC3in6kgPSAofDAx4p+pIC0gfDEw4p+pKS/iiJoyDQoNCjMuICoqQ3JlYXRpb24gb2YgQmVsbCBTdGF0ZXM6KiogQmVsbCBzdGF0ZXMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgc3BlY2lmaWMgcXVhbnR1bSBjaXJjdWl0cyBpbnZvbHZpbmcgSGFkYW1hcmQgKEgpIGFuZCBjb250cm9sbGVkLU5PVCAoQ05PVCkgZ2F0ZXMuDQoNCjQuICoqTWVhc3VyZW1lbnQgb2YgQmVsbCBTdGF0ZXM6KiogIE1lYXN1cmluZyBvbmUgcXViaXQgaW4gYSBCZWxsIHN0YXRlIGluc3RhbnRseSBkZXRlcm1pbmVzIHRoZSBzdGF0ZSBvZiB0aGUgb3RoZXIgcXViaXQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlbS4gVGhpcyBpcyBhIGtleSBmZWF0dXJlIG9mIGVudGFuZ2xlbWVudC4NCg0KNS4gKipTaWduaWZpY2FuY2UgaW4gUXVhbnR1bSBJbmZvcm1hdGlvbjoqKiBCZWxsIHN0YXRlcyBhcmUgZXNzZW50aWFsIGluIHF1YW50dW0gaW5mb3JtYXRpb24gdGhlb3J5IGFuZCBoYXZlIGFwcGxpY2F0aW9ucyBpbiBxdWFudHVtIHRlbGVwb3J0YXRpb24sIHN1cGVyZGVuc2UgY29kaW5nLCBhbmQgcXVhbnR1bSBrZXkgZGlzdHJpYnV0aW9uLg0KDQo2LiAqKkJlbGwncyBUaGVvcmVtOioqIFRoZSBleGlzdGVuY2Ugb2YgQmVsbCBzdGF0ZXMgYW5kIHRoZWlyIHByb3BlcnRpZXMgY2hhbGxlbmdlIHRoZSBjb25jZXB0IG9mIGxvY2FsIHJlYWxpc20sIGEgY2xhc3NpY2FsIG5vdGlvbiB0aGF0IHBoeXNpY2FsIHByb3BlcnRpZXMgZXhpc3QgaW5kZXBlbmRlbnRseSBvZiBtZWFzdXJlbWVudCBhbmQgdGhhdCBpbmZvcm1hdGlvbiBjYW5ub3QgdHJhdmVsIGZhc3RlciB0aGFuIGxpZ2h0Lg0KDQoNCiMjIE1vcmUgQmVsbCBTdGF0ZXMNCg0KMS4gKipEZWZpbml0aW9uIG9mIEJlbGwgU3RhdGVzOioqICBUaGUgZm91ciBCZWxsIHN0YXRlcyBhcmUgc3BlY2lmaWMgZW50YW5nbGVkIHN0YXRlcyBvZiB0d28gcXViaXRzLiBUaGV5IGFyZSBtYXhpbWFsbHkgZW50YW5nbGVkLCBtZWFuaW5nIHRoZSBxdWJpdHMgYXJlIHN0cm9uZ2x5IGNvcnJlbGF0ZWQgYW5kIGNhbm5vdCBiZSBkZXNjcmliZWQgaW5kZXBlbmRlbnRseS4NCg0KMi4gKipOb3RhdGlvbiBhbmQgUmVwcmVzZW50YXRpb246KiogVGhlIEJlbGwgc3RhdGVzIGFyZSBkZW5vdGVkIGFzICANCiAgICogXChca2V0e1xQaGleK31cKQ0KICAgKiBcKFxrZXR7XFBoaV4tfVwpDQogICAqIFwoXGtldHtcUHNpXit9XCkNCiAgICogXChca2V0e1xQc2leLX1cKQ0KICAgRWFjaCBzdGF0ZSBpcyBhIHN1cGVycG9zaXRpb24gb2YgdGhlIGNvbXB1dGF0aW9uYWwgYmFzaXMgc3RhdGVzIG9mIHRoZSB0d28gcXViaXRzLg0KDQozLiAqKlByb3BlcnRpZXM6KioNCiAgICAqICoqT3J0aG9ub3JtYWw6KiogVGhlIEJlbGwgc3RhdGVzIGZvcm0gYW4gb3J0aG9ub3JtYWwgYmFzaXMgZm9yIHRoZSBmb3VyLWRpbWVuc2lvbmFsIEhpbGJlcnQgc3BhY2Ugb2YgdHdvIHF1Yml0cy4gVGhpcyBtZWFucyB0aGV5IGFyZSBtdXR1YWxseSBwZXJwZW5kaWN1bGFyIGFuZCBoYXZlIHVuaXQgbGVuZ3RoLg0KICAgICogKipNZWFzdXJlbWVudCBPdXRjb21lczoqKiBNZWFzdXJpbmcgYSBCZWxsIHN0YXRlIGluIHRoZSBjb21wdXRhdGlvbmFsIGJhc2lzIGFsd2F5cyByZXN1bHRzIGluIG9uZSBvZiB0aGUgZm91ciBwb3NzaWJsZSBvdXRjb21lcyB3aXRoIGVxdWFsIHByb2JhYmlsaXR5ICgyNSUpLg0KICAgICogKipFbnRhbmdsZW1lbnQ6KiogQmVsbCBzdGF0ZXMgZXhoaWJpdCBwZXJmZWN0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIG1lYXN1cmVtZW50IG91dGNvbWVzIG9mIHRoZSB0d28gcXViaXRzLg0KDQo0LiAqKkNyZWF0aW9uOioqDQogICAgKiBCZWxsIHN0YXRlcyBjYW4gYmUgY3JlYXRlZCB1c2luZyBxdWFudHVtIGdhdGVzIGxpa2UgdGhlIEhhZGFtYXJkIChIKSBnYXRlIGFuZCB0aGUgQ29udHJvbGxlZC1OT1QgKENOT1QpIGdhdGUuICANCiAgICAqIEZvciBleGFtcGxlLCBhcHBseWluZyBhIEhhZGFtYXJkIGdhdGUgdG8gdGhlIGZpcnN0IHF1Yml0IGFuZCB0aGVuIGEgQ05PVCBnYXRlIHdpdGggdGhlIGZpcnN0IHF1Yml0IGFzIGNvbnRyb2wgYW5kIHRoZSBzZWNvbmQgYXMgdGFyZ2V0IHdpbGwgY3JlYXRlIHRoZSBcKFxrZXR7XFBoaV4rfVwpIHN0YXRlLg0KDQo1LiAqKlNpZ25pZmljYW5jZToqKg0KICAgICogQmVsbCBzdGF0ZXMgYXJlIGZ1bmRhbWVudGFsIHJlc291cmNlcyBmb3IgcXVhbnR1bSBpbmZvcm1hdGlvbiBwcm9jZXNzaW5nLg0KICAgICogVGhleSBhcmUgdXNlZCBpbiBxdWFudHVtIHRlbGVwb3J0YXRpb24sIHN1cGVyZGVuc2UgY29kaW5nLCBhbmQgb3RoZXIgcXVhbnR1bSBwcm90b2NvbHMuDQogICAgKiBUaGV5IHBsYXkgYSBjcnVjaWFsIHJvbGUgaW4gdW5kZXJzdGFuZGluZyBxdWFudHVtIGVudGFuZ2xlbWVudCBhbmQgaXRzIGFwcGxpY2F0aW9ucy4gDQoNCg0KDQoNCg0KDQooaHR0cHM6Ly9sZWFybmluZy5xdWFudHVtLmlibS5jb20vY291cnNlL2Jhc2ljcy1vZi1xdWFudHVtLWluZm9ybWF0aW9uL211bHRpcGxlLXN5c3RlbXMjYmVsbC1zdGF0ZXMpLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQojIHB5dGhvbg0KZnJvbSBxaXNraXQgaW1wb3J0IFF1YW50dW1DaXJjdWl0DQoNCiAgMS4gQ3JlYXRlIGEgcXVhbnR1bSBjaXJjdWl0IHdpdGggMiBxdWJpdHM6DQogICAgICAqKnFjID0gUXVhbnR1bUNpcmN1aXQoMikqKg0KDQogIDIuIEFwcGx5IEhhZGFtYXJkIGdhdGUgdG8gdGhlIGZpcnN0IHF1Yml0Og0KICAgICAgKipxYy5oKDApKioNCg0KICAzLiBBcHBseSBDTk9UIGdhdGUsIGNvbnRyb2xsZWQgYnkgcXViaXQgMCBhbmQgdGFyZ2V0aW5nIHF1Yml0IDE6DQogICAgICAqKnFjLmN4KDAsIDEpKioNCg0KICA0LiBBcHBseSBaIGdhdGUgdG8gcXViaXQgMDoNCiAgICAgICoqcWMueigwKSoqDQoNCiAgNS4gQXBwbHkgWCBnYXRlIHRvIHF1Yml0IDE6DQogICAgICAqKnFjLngoMSkqKg0KDQogIDYuIERvbid0IGNoYW5nZSBhbnkgY29kZSBwYXN0IHRoaXMgbGluZToNCiAgICAgICoqcWMubWVhc3VyZV9hbGwoKSoqDQogICAgICAqKnFjLmRyYXcoJ21wbCcpKioNCg0KDQoqKkV4cGxhbmF0aW9uOioqDQoNCjEuICoqSW5pdGlhbGl6YXRpb246KiogV2Ugc3RhcnQgd2l0aCBib3RoIHF1Yml0cyBpbiB0aGUgc3RhdGUgfDDin6kuDQoyLiAqKkhhZGFtYXJkIEdhdGUgKEgpOioqIEFwcGx5aW5nIHRoZSBIYWRhbWFyZCBnYXRlIHRvIHRoZSBmaXJzdCBxdWJpdCBjcmVhdGVzIGEgc3VwZXJwb3NpdGlvbjoNCiAgIGBgYA0KICAgfDDin6kgLT4gKHww4p+pICsgfDHin6kpIC8g4oiaMg0KICAgYGBgDQogICBUaGUgb3ZlcmFsbCBzdGF0ZSBvZiB0aGUgdHdvIHF1Yml0cyBpcyBub3c6IA0KICAgYGBgDQogICAofDAw4p+pICsgfDEw4p+pKSAvIOKImjINCiAgIGBgYA0KMy4gKipDTk9UIEdhdGU6KiogVGhlIENvbnRyb2xsZWQtTk9UIChDTk9UKSBnYXRlIGFjdHMgb24gdGhlIHNlY29uZCBxdWJpdCwgY29udHJvbGxlZCBieSB0aGUgZmlyc3QuIElmIHRoZSBmaXJzdCBxdWJpdCBpcyB8MeKfqSwgaXQgZmxpcHMgdGhlIHNlY29uZCBxdWJpdC4gVGhpcyBnaXZlcyB1czoNCiAgIGBgYA0KICAgKHwwMOKfqSArIHwxMeKfqSkgLyDiiJoyICAgDQogICBgYGANCjQuICoqWiBHYXRlOioqIFRoZSBaIGdhdGUgb24gdGhlIGZpcnN0IHF1Yml0IGludHJvZHVjZXMgYSByZWxhdGl2ZSBwaGFzZSBvZiAtMSB0byB0aGUgfDHin6kgY29tcG9uZW50IG9mIHRoZSBmaXJzdCBxdWJpdDoNCiAgICBgYGANCiAgICAofDAw4p+pIC0gfDEx4p+pKSAvIOKImjINCiAgICBgYGANCjUuICoqWCBHYXRlOioqIFRoZSBYIGdhdGUgb24gdGhlIHNlY29uZCBxdWJpdCBmbGlwcyBpdCBmcm9tIHww4p+pIHRvIHwx4p+pIG9yIHZpY2UgdmVyc2E6DQogICBgYGANCiAgICh8MDHin6kgLSB8MTDin6kpIC8g4oiaMiANCiAgIGBgYA0KDQpUaGlzIGZpbmFsIHN0YXRlIGlzIHRoZSB8z4jigbvin6kgQmVsbCBzdGF0ZToNCg0KYGBgDQp8z4jigbvin6kgPSAofDAx4p+pIC0gfDEw4p+pKSAvIOKImjINCmBgYA0KDQoqKktleSBQb2ludHM6KioNCg0KKiAqKkVudGFuZ2xlbWVudDoqKiBUaGUgQmVsbCBzdGF0ZSBpcyBhbiBlbnRhbmdsZWQgc3RhdGUsIG1lYW5pbmcgdGhlIHR3byBxdWJpdHMgYXJlIGluZXh0cmljYWJseSBsaW5rZWQgYW5kIHRoZWlyIHN0YXRlcyBjYW5ub3QgYmUgZGVzY3JpYmVkIGluZGVwZW5kZW50bHkuDQoqICoqTWVhc3VyZW1lbnQ6KiogSWYgeW91IG1lYXN1cmUgYm90aCBxdWJpdHMgaW4gdGhlIGNvbXB1dGF0aW9uYWwgYmFzaXMgKHww4p+pIGFuZCB8MeKfqSksIHlvdSdsbCBhbHdheXMgZ2V0IG9wcG9zaXRlIHJlc3VsdHMgKDAxIG9yIDEwKSB3aXRoIGVxdWFsIHByb2JhYmlsaXR5Lg0KDQo=