Qubit Procedure (Standard HS DNA protocol)
- Set up the required number of 0.5-mL tubes for standards and samples. The Qubit® RNA HS Assay requires 2 standards.
- Label the tube lids.
- Prepare the Qubit® working solution by diluting the Qubit® DNA HS Reagent 1:200 in Qubit® DNA HS Buffer. Use a clean plastic tube each time you prepare Qubit® working solution. Do not mix the working solution in a glass container.
- Add 190 μL of Qubit® working solution to each of the tubes used for standards.
- Add 10 μL of each Qubit® standard to the appropriate tube, then mix by vortexing 2–3 seconds. Be careful not to create bubbles.
- Add Qubit® working solution to individual assay tubes so that the final volume in each tube after adding sample is 200 μL.
- Add each sample to the assay tubes containing the correct volume of Qubit® working solution, then mix by vortexing 2–3 seconds. The final volume in each tube should be 200 μL.
- Allow all tubes to incubate at room temperature for 2 minutes.
- On the Home screen of the Qubit® 3.0 Fluorometer, press DNA, then select DNA: High Sensitivity as the assay type. The “Read standards” screen is displayed. Press Read Standards to proceed.
- Insert the tube containing Standard #1 into the sample chamber, close the lid, then press Read standard. When the reading is complete (~3 seconds), remove Standard #1.
- Insert the tube containing Standard #2 into the sample chamber, close the lid, then press Read standard. When the reading is complete, remove Standard #2.
- Press Run samples.
- On the assay screen, select the sample volume and units
- Insert a sample tube into the sample chamber, close the lid, then press Read tube. When the reading is complete (~3 seconds), remove the sample tube.
- Repeat step last step until all samples have been read
Plate Reader Procedure
Prepare the first standard Combine 20uL of 100ug/mL lambda DNA from the Quant-IT PicoGreen dsDNA assay kit (Fisher P7589) with 980uL 1X TE to create a 2ug/mL standard.
This is Standard 1 which will have a final concentration of 1 ug/mL
Prepare the 200 fold dilution of pico dye to be kept in the dark
Prepare the rest of the standards
Combine 10uL of Standard 1 with 990uL 1X TE. This is standard 2 with a final concentration of 0.1 ug/mL.
Combine 1uL of Standard 1 with 999uL 1X TE. This is standard 3 with a final concentration of 0.01 ng/mL.
Add 1000uL 1X TE to a new tube. This is standard 4 with a concentration of 0 ug/mL.
Prep a standards plate
Place 100uL of each standard in separate wells on a separate plate for standards only.
Prepare the samples and load the plates
Add 99uL 1xTE to all of the sample wells of the sample plates.
Add 100uL of standards to the standards plate.
Add 1uL of each sample to each sample well of sample plates.
Add 100ul pico dilution to every well that contains either a standard or a sample, pipet up and down to mix.
Incubate at room temperature for at least 5 minutes in the dark (MRS stacks the plates one on top of the other and then puts foil seal tape on the top plate).
Read the plates on the plate reader
Turn on the SpectraMax plate reader.
Open the SoftMax Pro (v. 6.4) software
Click open > Documents > Michelle > pico.sda
Adjust the number of plates to match this batch including the standards plate (the last plate should be the standards plate).
- For plates containing samples, select the plate, click on the template editor, highlight all of the wells, click Unknowns from the window pane on the right, click on the series button in the bottom pane, make sure “top to bottom” is selected, make sure it is 1 x by 1 y, and the dilution factor should be set to 200 / 1.
The last plate should be the standards plate, the value of these standards is the qubit value divided by 2 (because you used 100ul of the standard and 100ul of the pico dye mix, diluting the standard in half.)
For any empty wells or wells you don’t want to read, select “plate blank”
Click on the first plate (corresponding to your plate 1), and click read.
- If “read” is not available, make sure the spectramax is connected to the software (left most button) and that you have selected the plate.
Once the plate has been read and the drawer opens, put in the next plate, click on the corresponding plate number in the software, and click read.
Once the standard plate has been read, double check the expected values of the standards and the calculated values of the standards. Double check the standard curve. Does it all look good or are the values way off? Remove standards that don’t fit the curve and consider re-doing the entire plate run if the standards don’t line up well. Hopefully everything jives.
Once all of the plates have been read, click on the blue plate icon in the top left and click “save as” and save as the “date_full” to indicate that the report contains all of the plates for that day. This is an sda file that can only be opened in the softmax pro software but is helpful for checking machine settings or recreating what you did.
Click the blue plate icon again and select “export”, check the “unknowns” box, and save as the same name as in step 6. This is a text file that contains the data you will import into the database.
Copy of protocol from plate reader:
Quantitation of double-stranded DNA using Quant-iT PicoGreen Reagent Invitrogen (Molecular Probes)
MATERIALS
- Quant-iT PicoGreen dsDNA Assay Kit, including lambda DNA standard (Invitrogen cat. #P7589 or P11496)
- Black 96-well plate (Greiner Bio-One, cat. # 655096)
- Brown or amber (light-blocking) microcentrifuge tubes
METHODS
Set up the protocol:
Select Wells to Read and Assay Plate Type by clicking on “Settings” and locating the options on the left side of the screen.
Click the Template button to open a window where you can assign wells of the microplate to pre-set template groups using the drop-down menu to select the appropriate template group. There are preconfigured template groups in the PicoGreen Fluorescence protocol including Standards, Unknowns, and Unknowns_NoDiln (for undiluted samples). Assigning wells to pre-set template groups populates group tables in the protocol with the corresponding data acquired when the microplate is read.
Prepare the assay
The method for this assay follows the instructions in the product information sheet for Quant-iT PicoGreen dsDNA Reagent and Kits from Molecular Probes, except that the assay volume is proportionately reduced from 2.0 mL to 200 uL to fit a 96-well microplate format.
- Prepare 1X TE buffer (10 mM Tris-HCl, 1 mM EDTA, pH 7.5) by diluting the concentrated buffer from the kit 20-fold with distilled DNase-free water, as required by Molecular Probes.
- Prepare an aqueous working solution of Quant-iT PicoGreen reagent by making a 200-fold dilution of the concentrated DMSO solution in TE buffer (prepared above). Preparation of the solution in a plastic container, rather than glass, is recommended, as the reagent may adsorb to glass surfaces. Protect the solution from light by using amber or brown tubes, or by covering with foil. This solution should be used within a few hours of its preparation.
- DNA standard curve: Prepare a 2 µg/mL stock solution of dsDNA in TE. The lambda DNA standard provided with the kit can be diluted 50-fold in TE to make the 2 µg/mL solution. Note: in some cases it may be preferable to make the standard curve using DNA similar to the type being assayed.
- A high-range standard curve may be prepared from 1 ng/mL to 1 µg/mL, or a low-range standard curve may be prepared from 25 pg/mL to 25 ng/mL. For the high-range curve, follow the dilution scheme shown in the PicoGreen product insert; for the low-range curve, dilute the 2 µg/mL solution 40-fold to yield a 50 ng/mL solution, and refer to the alternative dilution scheme in the product insert.
- Pipet standards into a solid black 96-well microplate at 100 µL per well, preferably in triplicate. Be sure to include a set of buffer blank wells containing TE only (no DNA).
- Add 100 µL of the aqueous working solution of Quant-iT PicoGreen reagent to each well. Mix well by trituration or plate shaker and incubate for 2 to 5 minutes at room temperature, protected from light.
Read the microplate
- Make sure the purple plate adapter is in the microplate reader drawer. Place the microplate in the drawer.
- Click the Read button in the SoftMax Pro software. The instrument will read the plate and the relative fluorescence units will be displayed in the Plate section of the protocol.
Analyze the data
- After the microplate has been read, the relative fluorescence units (RFUs) will be displayed in the Plate section. The data will be analyzed in the Group Tables that were created when the template was set up.
- Standards assigned in the Template (and thus displayed in the Standards group table) will be automatically plotted in the Standard Curve section of the protocol. A linear curve fit is applied by default, but a log-log fit may be used when plotting a standard curve over a wide dynamic range. Curve fits are chosen from the drop-down Curve Fit menu in the graph section’s tool bar.
Import the data from the plate reader to the database
Once you have completed all of the steps in the quant_prep.pdf, it is time to import the data into the database and make a note for your lab notebook
Read in quantification results
- Open the plate reader results file and pull in the data
For this round only opening the txt file in excel and changing the names of the samples that are in sample numbers higher than the test samples in the standards plate.
- Connect names of samples from database
Double check that the number of rows for each plate is what is expected
Write these changes into the database
LS0tCnRpdGxlOiAiRE5BIFF1YW50aWZpY2F0aW9uIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKcGFyYW1zOgogIG51bV9zYW1wbGVzOiAxNjAKICBudW1fc3RkczogOAotLS0KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCmBgYHtyfQppZihwYXJhbXMkbnVtX3NhbXBsZXMgPCAyMCl7CnF1YW50IDwtIHRyaWJibGUofml0ZW0sIH5xdWFudGl0eSwgCiAgICAgICAgICAgICAgICAgInF1Yml0X3R1YmVzIiwgcGFyYW1zJG51bV9zYW1wbGVzICsgMiwKICAgICAgICAgICAgICAgICAicXViaXRfZHllX3VsIiwgcGFyYW1zJG51bV9zYW1wbGVzICsgMiwKICAgICAgICAgICAgICAgICAicXViaXRfYnVmZmVyX3VsIiwgMTk5ICogKHBhcmFtcyRudW1fc2FtcGxlcyArIDIpLAogICAgICAgICAgICAgICAgICJxdWJpdF9zdGQxX3VsIiwgMTAsCiAgICAgICAgICAgICAgICAgInF1Yml0X3N0ZDJfdWwiLCAxMCwgCiAgICAgICAgICAgICAgICAgInRpcHNfMTAiLCBwYXJhbXMkbnVtX3NhbXBsZXMgKyAyLAogICAgICAgICAgICAgICAgICJ0aXBzXzEwMCIsIDEsCiAgICAgICAgICAgICAgICAgInRpcHNfMTAwMCIsIDIsCiAgICAgICAgICAgICAgICAgInR1YmVzXzEuN21sIiwgMSkKfWVsc2V7CnF1YW50IDwtIHRyaWJibGUofml0ZW0sIH5xdWFudGl0eSwKICAgICAgICAgICAgICAgICAidHViZXNfMS43bWwiLCA0LCAKICAgICAgICAgICAgICAgICAiMXhfdGVfYnVmZmVyX3VsIiwgOTgwICsgKHBhcmFtcyRudW1fc2FtcGxlcyArIHBhcmFtcyRudW1fc3RkcykqMTAwLAogICAgICAgICAgICAgICAgICIxMDBfdWcvbWxfbGFtYmRhX2RuYV91bCIsIDIwLAogICAgICAgICAgICAgICAgICJwaWNvX3VsIiwgKHBhcmFtcyRudW1fc2FtcGxlcyArIHBhcmFtcyRudW1fc3RkcykqMTAwLzIwMCwgCiAgICAgICAgICAgICAgICAgImdyZW5pZXJfcGxhdGVzIiwgY2VpbGluZygocGFyYW1zJG51bV9zYW1wbGVzICsgcGFyYW1zJG51bV9zdGRzKS85NiksIAogICAgICAgICAgICAgICAgICJ0aXBzXzEwMCIsMyArIChwYXJhbXMkbnVtX3NhbXBsZXMgKiAyKSArIHBhcmFtcyRudW1fc3RkcywKICAgICAgICAgICAgICAgICAidGlwc18xMCIsIDIgKyBwYXJhbXMkbnVtX3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgInRpcHNfMTAwMCIsNCkKfQpgYGAKCiMjIFF1Yml0IFByb2NlZHVyZSAoU3RhbmRhcmQgSFMgRE5BIHByb3RvY29sKQotIFNldCB1cCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIDAuNS1tTCB0dWJlcyBmb3Igc3RhbmRhcmRzIGFuZCBzYW1wbGVzLiBUaGUgUXViaXTCriBSTkEgSFMgQXNzYXkgcmVxdWlyZXMgMiBzdGFuZGFyZHMuCi0gTGFiZWwgdGhlIHR1YmUgbGlkcy4KLSBQcmVwYXJlIHRoZSBRdWJpdMKuIHdvcmtpbmcgc29sdXRpb24gYnkgZGlsdXRpbmcgdGhlIFF1Yml0wq4gRE5BIEhTIFJlYWdlbnQgMToyMDAgaW4gUXViaXTCriBETkEgSFMgQnVmZmVyLiBVc2UgYSBjbGVhbiBwbGFzdGljIHR1YmUgZWFjaCB0aW1lIHlvdSBwcmVwYXJlIFF1Yml0wq4gd29ya2luZyBzb2x1dGlvbi4gKipEbyBub3QgbWl4IHRoZSB3b3JraW5nIHNvbHV0aW9uIGluIGEgZ2xhc3MgY29udGFpbmVyLioqCi0gQWRkIDE5MCDOvEwgb2YgUXViaXTCriB3b3JraW5nIHNvbHV0aW9uIHRvIGVhY2ggb2YgdGhlIHR1YmVzIHVzZWQgZm9yIHN0YW5kYXJkcy4KLSBBZGQgMTAgzrxMIG9mIGVhY2ggUXViaXTCriBzdGFuZGFyZCB0byB0aGUgYXBwcm9wcmlhdGUgdHViZSwgdGhlbiBtaXggYnkgdm9ydGV4aW5nIDLigJMzIHNlY29uZHMuIEJlIGNhcmVmdWwgbm90IHRvIGNyZWF0ZSBidWJibGVzLgotIEFkZCBRdWJpdMKuIHdvcmtpbmcgc29sdXRpb24gdG8gaW5kaXZpZHVhbCBhc3NheSB0dWJlcyBzbyB0aGF0IHRoZSBmaW5hbCB2b2x1bWUgaW4gZWFjaCB0dWJlIGFmdGVyIGFkZGluZyBzYW1wbGUgaXMgMjAwIM68TC4KLSBBZGQgZWFjaCBzYW1wbGUgdG8gdGhlIGFzc2F5IHR1YmVzIGNvbnRhaW5pbmcgdGhlIGNvcnJlY3Qgdm9sdW1lIG9mIFF1Yml0wq4gd29ya2luZyBzb2x1dGlvbiwgdGhlbiBtaXggYnkgdm9ydGV4aW5nIDLigJMzIHNlY29uZHMuIFRoZSBmaW5hbCB2b2x1bWUgaW4gZWFjaCB0dWJlIHNob3VsZCBiZSAyMDAgzrxMLgotIEFsbG93IGFsbCB0dWJlcyB0byBpbmN1YmF0ZSBhdCByb29tIHRlbXBlcmF0dXJlIGZvciAyIG1pbnV0ZXMuCi0gT24gdGhlIEhvbWUgc2NyZWVuIG9mIHRoZSBRdWJpdMKuIDMuMCBGbHVvcm9tZXRlciwgcHJlc3MgRE5BLCB0aGVuIHNlbGVjdCBETkE6IEhpZ2ggU2Vuc2l0aXZpdHkgYXMgdGhlIGFzc2F5IHR5cGUuIFRoZSDigJxSZWFkIHN0YW5kYXJkc+KAnSBzY3JlZW4gaXMgZGlzcGxheWVkLiBQcmVzcyBSZWFkIFN0YW5kYXJkcyB0byBwcm9jZWVkLgotIEluc2VydCB0aGUgdHViZSBjb250YWluaW5nIFN0YW5kYXJkICMxIGludG8gdGhlIHNhbXBsZSBjaGFtYmVyLCBjbG9zZSB0aGUgbGlkLCB0aGVuIHByZXNzIFJlYWQgc3RhbmRhcmQuIFdoZW4gdGhlIHJlYWRpbmcgaXMgY29tcGxldGUgKH4zIHNlY29uZHMpLCByZW1vdmUgU3RhbmRhcmQgIzEuCi0gSW5zZXJ0IHRoZSB0dWJlIGNvbnRhaW5pbmcgU3RhbmRhcmQgIzIgaW50byB0aGUgc2FtcGxlIGNoYW1iZXIsIGNsb3NlIHRoZSBsaWQsIHRoZW4gcHJlc3MgUmVhZCBzdGFuZGFyZC4gV2hlbiB0aGUgcmVhZGluZyBpcyBjb21wbGV0ZSwgcmVtb3ZlIFN0YW5kYXJkICMyLgotIFByZXNzIFJ1biBzYW1wbGVzLgotIE9uIHRoZSBhc3NheSBzY3JlZW4sIHNlbGVjdCB0aGUgc2FtcGxlIHZvbHVtZSBhbmQgdW5pdHMKLSBJbnNlcnQgYSBzYW1wbGUgdHViZSBpbnRvIHRoZSBzYW1wbGUgY2hhbWJlciwgY2xvc2UgdGhlIGxpZCwgdGhlbiBwcmVzcyBSZWFkIHR1YmUuIFdoZW4gdGhlIHJlYWRpbmcgaXMgY29tcGxldGUgKH4zIHNlY29uZHMpLCByZW1vdmUgdGhlIHNhbXBsZSB0dWJlLgotIFJlcGVhdCBzdGVwIGxhc3Qgc3RlcCB1bnRpbCBhbGwgc2FtcGxlcyBoYXZlIGJlZW4gcmVhZAoKIyMgUGxhdGUgUmVhZGVyIFByb2NlZHVyZQoqKlByZXBhcmUgdGhlIGZpcnN0IHN0YW5kYXJkKioKQ29tYmluZSAyMHVMIG9mIDEwMHVnL21MIGxhbWJkYSBETkEgZnJvbSB0aGUgUXVhbnQtSVQgUGljb0dyZWVuIGRzRE5BIGFzc2F5IGtpdCAoRmlzaGVyIFA3NTg5KSB3aXRoIDk4MHVMIDFYIFRFIHRvIGNyZWF0ZSBhIDJ1Zy9tTCBzdGFuZGFyZC4gIApUaGlzIGlzIFN0YW5kYXJkIDEgd2hpY2ggd2lsbCBoYXZlIGEgZmluYWwgY29uY2VudHJhdGlvbiBvZiAxIHVnL21MCgoqKlByZXBhcmUgdGhlIDIwMCBmb2xkIGRpbHV0aW9uIG9mIHBpY28gZHllIHRvIGJlIGtlcHQgaW4gdGhlIGRhcmsqKiAgCgpgYGB7ciBldmFsPUZBTFNFfQpmaW5hbF92b2wgPC0gcGFyYW1zJG51bV9wbGF0ZXMqOTYqMS4xKjIwMC8yCmBgYAogCjwhLS0gQ29tYmluZSBgciAjZmluYWxfdm9sLzIwMGB1TCBwaWNvIGNvbmNlbnRyYXRlIHdpdGggYHIgI2ZpbmFsX3ZvbC8xMDAwYG1MIDFYIFRFLiAgIC0tPgoKKipQcmVwYXJlIHRoZSByZXN0IG9mIHRoZSBzdGFuZGFyZHMqKiAgCgoxLiBDb21iaW5lIDEwdUwgb2YgU3RhbmRhcmQgMSB3aXRoIDk5MHVMIDFYIFRFLiAgVGhpcyBpcyBzdGFuZGFyZCAyIHdpdGggYSBmaW5hbCBjb25jZW50cmF0aW9uIG9mIDAuMSB1Zy9tTC4gIAoKMS4gQ29tYmluZSAxdUwgb2YgU3RhbmRhcmQgMSB3aXRoIDk5OXVMIDFYIFRFLiBUaGlzIGlzIHN0YW5kYXJkIDMgd2l0aCBhIGZpbmFsIGNvbmNlbnRyYXRpb24gb2YgMC4wMSBuZy9tTC4gIAoKMS4gQWRkIDEwMDB1TCAxWCBURSB0byBhIG5ldyB0dWJlLiBUaGlzIGlzIHN0YW5kYXJkIDQgd2l0aCBhIGNvbmNlbnRyYXRpb24gb2YgMCB1Zy9tTC4gIAoKKipQcmVwIGEgc3RhbmRhcmRzIHBsYXRlICoqICAKUGxhY2UgMTAwdUwgb2YgZWFjaCBzdGFuZGFyZCBpbiBzZXBhcmF0ZSB3ZWxscyBvbiBhIHNlcGFyYXRlIHBsYXRlIGZvciBzdGFuZGFyZHMgb25seS4KCgoqKlByZXBhcmUgdGhlIHNhbXBsZXMgYW5kIGxvYWQgdGhlIHBsYXRlcyoqICAKCjEuIEFkZCA5OXVMIDF4VEUgdG8gYWxsIG9mIHRoZSBzYW1wbGUgd2VsbHMgb2YgdGhlIHNhbXBsZSBwbGF0ZXMuIAoKMS4gQWRkIDEwMHVMIG9mIHN0YW5kYXJkcyB0byB0aGUgc3RhbmRhcmRzIHBsYXRlLiAgCgoxLiBBZGQgMXVMIG9mIGVhY2ggc2FtcGxlIHRvIGVhY2ggc2FtcGxlIHdlbGwgb2Ygc2FtcGxlIHBsYXRlcy4gIAoKMS4gQWRkIDEwMHVsIHBpY28gZGlsdXRpb24gdG8gZXZlcnkgd2VsbCB0aGF0IGNvbnRhaW5zIGVpdGhlciBhIHN0YW5kYXJkIG9yIGEgc2FtcGxlLCBwaXBldCB1cCBhbmQgZG93biB0byBtaXguICAKCjEuIEluY3ViYXRlIGF0IHJvb20gdGVtcGVyYXR1cmUgZm9yIGF0IGxlYXN0IDUgbWludXRlcyBpbiB0aGUgZGFyayAoTVJTIHN0YWNrcyB0aGUgcGxhdGVzIG9uZSBvbiB0b3Agb2YgdGhlIG90aGVyIGFuZCB0aGVuIHB1dHMgZm9pbCBzZWFsIHRhcGUgb24gdGhlIHRvcCBwbGF0ZSkuICAKCgoqKlJlYWQgdGhlIHBsYXRlcyBvbiB0aGUgcGxhdGUgcmVhZGVyKiogIAoKMS4gVHVybiBvbiB0aGUgU3BlY3RyYU1heCBwbGF0ZSByZWFkZXIuICAKCjIuIE9wZW4gdGhlIFNvZnRNYXggUHJvICh2LiA2LjQpIHNvZnR3YXJlICAKCjIuIENsaWNrIG9wZW4gPiBEb2N1bWVudHMgPiBNaWNoZWxsZSA+IHBpY28uc2RhICAKCjMuIEFkanVzdCB0aGUgbnVtYmVyIG9mIHBsYXRlcyB0byBtYXRjaCB0aGlzIGJhdGNoIGluY2x1ZGluZyB0aGUgc3RhbmRhcmRzIHBsYXRlICh0aGUgbGFzdCBwbGF0ZSBzaG91bGQgYmUgdGhlIHN0YW5kYXJkcyBwbGF0ZSkuICAKCiAgICAtIEZvciBwbGF0ZXMgY29udGFpbmluZyBzYW1wbGVzLCBzZWxlY3QgdGhlIHBsYXRlLCBjbGljayBvbiB0aGUgdGVtcGxhdGUgZWRpdG9yLCBoaWdobGlnaHQgYWxsIG9mIHRoZSB3ZWxscywgY2xpY2sgVW5rbm93bnMgZnJvbSB0aGUgd2luZG93IHBhbmUgb24gdGhlIHJpZ2h0LCBjbGljayBvbiB0aGUgc2VyaWVzIGJ1dHRvbiBpbiB0aGUgYm90dG9tIHBhbmUsIG1ha2Ugc3VyZSAidG9wIHRvIGJvdHRvbSIgaXMgc2VsZWN0ZWQsIG1ha2Ugc3VyZSBpdCBpcyAxIHggYnkgMSB5LCBhbmQgdGhlIGRpbHV0aW9uIGZhY3RvciBzaG91bGQgYmUgc2V0IHRvIDIwMCAvIDEuICAKICAgIC0gVGhlIGxhc3QgcGxhdGUgc2hvdWxkIGJlIHRoZSBzdGFuZGFyZHMgcGxhdGUsIHRoZSB2YWx1ZSBvZiB0aGVzZSBzdGFuZGFyZHMgaXMgdGhlIHF1Yml0IHZhbHVlIGRpdmlkZWQgYnkgMiAoYmVjYXVzZSB5b3UgdXNlZCAxMDB1bCBvZiB0aGUgc3RhbmRhcmQgYW5kIDEwMHVsIG9mIHRoZSBwaWNvIGR5ZSBtaXgsIGRpbHV0aW5nIHRoZSBzdGFuZGFyZCBpbiBoYWxmLikgIAoKICAgIC0gRm9yIGFueSBlbXB0eSB3ZWxscyBvciB3ZWxscyB5b3UgZG9uJ3Qgd2FudCB0byByZWFkLCBzZWxlY3QgInBsYXRlIGJsYW5rIiAKCjUuIENsaWNrIG9uIHRoZSBmaXJzdCBwbGF0ZSAoY29ycmVzcG9uZGluZyB0byB5b3VyIHBsYXRlIDEpLCBhbmQgY2xpY2sgcmVhZC4gIAoKICAgIC0gSWYgInJlYWQiIGlzIG5vdCBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgc3BlY3RyYW1heCBpcyBjb25uZWN0ZWQgdG8gdGhlIHNvZnR3YXJlIChsZWZ0IG1vc3QgYnV0dG9uKSBhbmQgdGhhdCB5b3UgaGF2ZSBzZWxlY3RlZCB0aGUgcGxhdGUuICAKCjUuIE9uY2UgdGhlIHBsYXRlIGhhcyBiZWVuIHJlYWQgYW5kIHRoZSBkcmF3ZXIgb3BlbnMsIHB1dCBpbiB0aGUgbmV4dCBwbGF0ZSwgY2xpY2sgb24gdGhlIGNvcnJlc3BvbmRpbmcgcGxhdGUgbnVtYmVyIGluIHRoZSBzb2Z0d2FyZSwgYW5kIGNsaWNrIHJlYWQuICAKCjYuIE9uY2UgdGhlIHN0YW5kYXJkIHBsYXRlIGhhcyBiZWVuIHJlYWQsIGRvdWJsZSBjaGVjayB0aGUgZXhwZWN0ZWQgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZHMgYW5kIHRoZSBjYWxjdWxhdGVkIHZhbHVlcyBvZiB0aGUgc3RhbmRhcmRzLiAgRG91YmxlIGNoZWNrIHRoZSBzdGFuZGFyZCBjdXJ2ZS4gIERvZXMgaXQgYWxsIGxvb2sgZ29vZCBvciBhcmUgdGhlIHZhbHVlcyB3YXkgb2ZmPyAgUmVtb3ZlIHN0YW5kYXJkcyB0aGF0IGRvbid0IGZpdCB0aGUgY3VydmUgYW5kIGNvbnNpZGVyIHJlLWRvaW5nIHRoZSBlbnRpcmUgcGxhdGUgcnVuIGlmIHRoZSBzdGFuZGFyZHMgZG9uJ3QgbGluZSB1cCB3ZWxsLiAgSG9wZWZ1bGx5IGV2ZXJ5dGhpbmcgaml2ZXMuICAKCjYuIE9uY2UgYWxsIG9mIHRoZSBwbGF0ZXMgaGF2ZSBiZWVuIHJlYWQsIGNsaWNrIG9uIHRoZSBibHVlIHBsYXRlIGljb24gaW4gdGhlIHRvcCBsZWZ0IGFuZCBjbGljayAic2F2ZSBhcyIgYW5kIHNhdmUgYXMgdGhlICJkYXRlX2Z1bGwiIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlcG9ydCBjb250YWlucyBhbGwgb2YgdGhlIHBsYXRlcyBmb3IgdGhhdCBkYXkuICBUaGlzIGlzIGFuIHNkYSBmaWxlIHRoYXQgY2FuIG9ubHkgYmUgb3BlbmVkIGluIHRoZSBzb2Z0bWF4IHBybyBzb2Z0d2FyZSBidXQgaXMgaGVscGZ1bCBmb3IgY2hlY2tpbmcgbWFjaGluZSBzZXR0aW5ncyBvciByZWNyZWF0aW5nIHdoYXQgeW91IGRpZC4gIAoKNy4gQ2xpY2sgdGhlIGJsdWUgcGxhdGUgaWNvbiBhZ2FpbiBhbmQgc2VsZWN0ICJleHBvcnQiLCBjaGVjayB0aGUgInVua25vd25zIiBib3gsIGFuZCBzYXZlIGFzIHRoZSBzYW1lIG5hbWUgYXMgaW4gc3RlcCA2LiAgVGhpcyBpcyBhIHRleHQgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHlvdSB3aWxsIGltcG9ydCBpbnRvIHRoZSBkYXRhYmFzZS4KCiMjIyBDb3B5IG9mIHByb3RvY29sIGZyb20gcGxhdGUgcmVhZGVyOgpRdWFudGl0YXRpb24gb2YgZG91YmxlLXN0cmFuZGVkIEROQSB1c2luZyBRdWFudC1pVCBQaWNvR3JlZW4gUmVhZ2VudApJbnZpdHJvZ2VuIChNb2xlY3VsYXIgUHJvYmVzKQoKIyMjIyBNQVRFUklBTFMgIAotIFF1YW50LWlUIFBpY29HcmVlbiBkc0ROQSBBc3NheSBLaXQsIGluY2x1ZGluZyBsYW1iZGEgRE5BIHN0YW5kYXJkIChJbnZpdHJvZ2VuIGNhdC4gI1A3NTg5IG9yICBQMTE0OTYpICAKLSBCbGFjayA5Ni13ZWxsIHBsYXRlIChHcmVpbmVyIEJpby1PbmUsIGNhdC4gIyA2NTUwOTYpICAKLSBCcm93biBvciBhbWJlciAobGlnaHQtYmxvY2tpbmcpIG1pY3JvY2VudHJpZnVnZSB0dWJlcwoKIyMjIyBNRVRIT0RTClNldCB1cCB0aGUgcHJvdG9jb2w6ICAKCi0gU2VsZWN0IFdlbGxzIHRvIFJlYWQgYW5kIEFzc2F5IFBsYXRlIFR5cGUgYnkgY2xpY2tpbmcgb24gIlNldHRpbmdzIiBhbmQgbG9jYXRpbmcgdGhlIG9wdGlvbnMgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2NyZWVuLiAgCgotIENsaWNrIHRoZSBUZW1wbGF0ZSBidXR0b24gdG8gb3BlbiBhIHdpbmRvdyB3aGVyZSB5b3UgY2FuIGFzc2lnbiB3ZWxscyBvZiB0aGUgbWljcm9wbGF0ZSB0byBwcmUtc2V0IHRlbXBsYXRlIGdyb3VwcyB1c2luZyB0aGUgZHJvcC1kb3duIG1lbnUgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBncm91cC4gIFRoZXJlIGFyZSBwcmVjb25maWd1cmVkIHRlbXBsYXRlIGdyb3VwcyBpbiB0aGUgUGljb0dyZWVuIEZsdW9yZXNjZW5jZSBwcm90b2NvbCBpbmNsdWRpbmcgU3RhbmRhcmRzLCBVbmtub3ducywgYW5kIFVua25vd25zX05vRGlsbiAoZm9yIHVuZGlsdXRlZCBzYW1wbGVzKS4gIEFzc2lnbmluZyB3ZWxscyB0byBwcmUtc2V0IHRlbXBsYXRlIGdyb3VwcyBwb3B1bGF0ZXMgZ3JvdXAgdGFibGVzIGluIHRoZSBwcm90b2NvbCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgYWNxdWlyZWQgd2hlbiB0aGUgbWljcm9wbGF0ZSBpcyByZWFkLgoKIyMjIyBQcmVwYXJlIHRoZSBhc3NheQpUaGUgbWV0aG9kIGZvciB0aGlzIGFzc2F5IGZvbGxvd3MgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgcHJvZHVjdCBpbmZvcm1hdGlvbiBzaGVldCBmb3IgUXVhbnQtaVQgUGljb0dyZWVuIGRzRE5BIFJlYWdlbnQgYW5kIEtpdHMgZnJvbSBNb2xlY3VsYXIgUHJvYmVzLCBleGNlcHQgdGhhdCB0aGUgYXNzYXkgdm9sdW1lIGlzIHByb3BvcnRpb25hdGVseSByZWR1Y2VkIGZyb20gMi4wIG1MIHRvIDIwMCB1TCB0byBmaXQgYSA5Ni13ZWxsIG1pY3JvcGxhdGUgZm9ybWF0LgoKLSBQcmVwYXJlIDFYIFRFIGJ1ZmZlciAoMTAgbU0gVHJpcy1IQ2wsIDEgbU0gRURUQSwgcEggNy41KSBieSBkaWx1dGluZyB0aGUgY29uY2VudHJhdGVkIGJ1ZmZlciBmcm9tIHRoZSBraXQgMjAtZm9sZCB3aXRoIGRpc3RpbGxlZCBETmFzZS1mcmVlIHdhdGVyLCBhcyByZXF1aXJlZCBieSBNb2xlY3VsYXIgUHJvYmVzLiAgCi0gUHJlcGFyZSBhbiBhcXVlb3VzIHdvcmtpbmcgc29sdXRpb24gb2YgUXVhbnQtaVQgUGljb0dyZWVuIHJlYWdlbnQgYnkgbWFraW5nIGEgMjAwLWZvbGQgZGlsdXRpb24gb2YgdGhlIGNvbmNlbnRyYXRlZCBETVNPIHNvbHV0aW9uIGluIFRFIGJ1ZmZlciAocHJlcGFyZWQgYWJvdmUpLiAgUHJlcGFyYXRpb24gb2YgdGhlIHNvbHV0aW9uIGluIGEgcGxhc3RpYyBjb250YWluZXIsIHJhdGhlciB0aGFuIGdsYXNzLCBpcyByZWNvbW1lbmRlZCwgYXMgdGhlIHJlYWdlbnQgbWF5IGFkc29yYiB0byBnbGFzcyBzdXJmYWNlcy4gIFByb3RlY3QgdGhlIHNvbHV0aW9uIGZyb20gbGlnaHQgYnkgdXNpbmcgYW1iZXIgb3IgYnJvd24gdHViZXMsIG9yIGJ5IGNvdmVyaW5nIHdpdGggZm9pbC4gIFRoaXMgc29sdXRpb24gc2hvdWxkIGJlIHVzZWQgd2l0aGluIGEgZmV3IGhvdXJzIG9mIGl0cyBwcmVwYXJhdGlvbi4gIAotIEROQSBzdGFuZGFyZCBjdXJ2ZTogUHJlcGFyZSBhIDIgwrVnL21MIHN0b2NrIHNvbHV0aW9uIG9mIGRzRE5BIGluIFRFLiAgVGhlIGxhbWJkYSBETkEgc3RhbmRhcmQgcHJvdmlkZWQgd2l0aCB0aGUga2l0IGNhbiBiZSBkaWx1dGVkIDUwLWZvbGQgaW4gVEUgdG8gbWFrZSB0aGUgMiDCtWcvbUwgc29sdXRpb24uICBOb3RlOiBpbiBzb21lIGNhc2VzIGl0IG1heSBiZSBwcmVmZXJhYmxlIHRvIG1ha2UgdGhlIHN0YW5kYXJkIGN1cnZlIHVzaW5nIEROQSBzaW1pbGFyIHRvIHRoZSB0eXBlIGJlaW5nIGFzc2F5ZWQuICAKLSBBIGhpZ2gtcmFuZ2Ugc3RhbmRhcmQgY3VydmUgbWF5IGJlIHByZXBhcmVkIGZyb20gMSBuZy9tTCB0byAxIMK1Zy9tTCwgb3IgYSBsb3ctcmFuZ2Ugc3RhbmRhcmQgY3VydmUgbWF5IGJlIHByZXBhcmVkIGZyb20gMjUgcGcvbUwgdG8gMjUgbmcvbUwuICBGb3IgdGhlIGhpZ2gtcmFuZ2UgY3VydmUsIGZvbGxvdyB0aGUgZGlsdXRpb24gc2NoZW1lIHNob3duIGluIHRoZSBQaWNvR3JlZW4gcHJvZHVjdCBpbnNlcnQ7IGZvciB0aGUgbG93LXJhbmdlIGN1cnZlLCBkaWx1dGUgdGhlIDIgwrVnL21MIHNvbHV0aW9uIDQwLWZvbGQgdG8geWllbGQgYSA1MCBuZy9tTCBzb2x1dGlvbiwgYW5kIHJlZmVyIHRvIHRoZSBhbHRlcm5hdGl2ZSBkaWx1dGlvbiBzY2hlbWUgaW4gdGhlIHByb2R1Y3QgaW5zZXJ0LiAgCi0gUGlwZXQgc3RhbmRhcmRzIGludG8gYSBzb2xpZCBibGFjayA5Ni13ZWxsIG1pY3JvcGxhdGUgYXQgMTAwIMK1TCBwZXIgd2VsbCwgcHJlZmVyYWJseSBpbiB0cmlwbGljYXRlLiAgQmUgc3VyZSB0byBpbmNsdWRlIGEgc2V0IG9mIGJ1ZmZlciBibGFuayB3ZWxscyBjb250YWluaW5nIFRFIG9ubHkgKG5vIEROQSkuICAKLSBBZGQgMTAwIMK1TCBvZiB0aGUgYXF1ZW91cyB3b3JraW5nIHNvbHV0aW9uIG9mIFF1YW50LWlUIFBpY29HcmVlbiByZWFnZW50IHRvIGVhY2ggd2VsbC4gIE1peCB3ZWxsIGJ5IHRyaXR1cmF0aW9uIG9yIHBsYXRlIHNoYWtlciBhbmQgaW5jdWJhdGUgZm9yICAyIHRvIDUgbWludXRlcyBhdCByb29tIHRlbXBlcmF0dXJlLCBwcm90ZWN0ZWQgZnJvbSBsaWdodC4KCiMjIyMgUmVhZCB0aGUgbWljcm9wbGF0ZSAgCi0gTWFrZSBzdXJlIHRoZSBwdXJwbGUgcGxhdGUgYWRhcHRlciBpcyBpbiB0aGUgbWljcm9wbGF0ZSByZWFkZXIgZHJhd2VyLiAgUGxhY2UgdGhlIG1pY3JvcGxhdGUgaW4gdGhlIGRyYXdlci4gIAotIENsaWNrIHRoZSBSZWFkIGJ1dHRvbiBpbiB0aGUgU29mdE1heCBQcm8gc29mdHdhcmUuIFRoZSBpbnN0cnVtZW50IHdpbGwgcmVhZCB0aGUgcGxhdGUgYW5kIHRoZSByZWxhdGl2ZSBmbHVvcmVzY2VuY2UgdW5pdHMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFBsYXRlIHNlY3Rpb24gb2YgdGhlIHByb3RvY29sLgoKIAojIyMjIEFuYWx5emUgdGhlIGRhdGEgIAotIEFmdGVyIHRoZSBtaWNyb3BsYXRlIGhhcyBiZWVuIHJlYWQsIHRoZSByZWxhdGl2ZSBmbHVvcmVzY2VuY2UgdW5pdHMgKFJGVXMpIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQbGF0ZSBzZWN0aW9uLiAgVGhlIGRhdGEgd2lsbCBiZSBhbmFseXplZCBpbiB0aGUgR3JvdXAgVGFibGVzIHRoYXQgd2VyZSBjcmVhdGVkIHdoZW4gdGhlIHRlbXBsYXRlIHdhcyBzZXQgdXAuICAKLSBTdGFuZGFyZHMgYXNzaWduZWQgaW4gdGhlIFRlbXBsYXRlIChhbmQgdGh1cyBkaXNwbGF5ZWQgaW4gdGhlIFN0YW5kYXJkcyBncm91cCB0YWJsZSkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHBsb3R0ZWQgaW4gdGhlIFN0YW5kYXJkIEN1cnZlIHNlY3Rpb24gb2YgdGhlIHByb3RvY29sLiAgQSBsaW5lYXIgY3VydmUgZml0IGlzIGFwcGxpZWQgYnkgZGVmYXVsdCwgYnV0IGEgbG9nLWxvZyBmaXQgbWF5IGJlIHVzZWQgd2hlbiBwbG90dGluZyBhIHN0YW5kYXJkIGN1cnZlIG92ZXIgYSB3aWRlIGR5bmFtaWMgcmFuZ2UuICBDdXJ2ZSBmaXRzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZHJvcC1kb3duIEN1cnZlIEZpdCBtZW51IGluIHRoZSBncmFwaCBzZWN0aW9uJ3MgdG9vbCBiYXIuCgojIyBJbXBvcnQgdGhlIGRhdGEgZnJvbSB0aGUgcGxhdGUgcmVhZGVyIHRvIHRoZSBkYXRhYmFzZQpPbmNlIHlvdSBoYXZlIGNvbXBsZXRlZCBhbGwgb2YgdGhlIHN0ZXBzIGluIHRoZSBxdWFudF9wcmVwLnBkZiwgaXQgaXMgdGltZSB0byBpbXBvcnQgdGhlIGRhdGEgaW50byB0aGUgZGF0YWJhc2UgYW5kIG1ha2UgYSBub3RlIGZvciB5b3VyIGxhYiBub3RlYm9vawoKKipSZWFkIGluIHF1YW50aWZpY2F0aW9uIHJlc3VsdHMqKiAgCgoxLiBPcGVuIHRoZSBwbGF0ZSByZWFkZXIgcmVzdWx0cyBmaWxlIGFuZCBwdWxsIGluIHRoZSBkYXRhICAKCjwhLS0gIyB0cmllZCB0byB1c2UgcmVhZHIgaGVyZSBidXQgaXQgcmV0dXJucyBhbGwgTkFzIGZvciB0aGUgdGFibGUgLS0+CjwhLS0gIyBkYXQxIDwtIHJlYWRfdGFibGUoZmlsZSwgc2tpcCA9IDYsIG5fbWF4ID0gODgsIGNvbF9uYW1lcyA9IGMoIlNhbXBsZSIsIAkiV2VsbHMiLCAJIlJGVV9WYWx1ZXMiLCAJIkNvbmNlbnRyYXRpb24iLCAJIk1lYW5fQ29uYyIsIAkiU0QiLCAJIkNWIiwgCSJEaWx1dGlvbiIsIAkiQWRqQ29uYyIJKSkgLS0+CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGV2YWw9RkFMU0V9CiMgZGV0ZXJtaW5lIG51bWJlciBvZiBsaW5lcyB0byBza2lwIGJlZm9yZSBkYXRhIGJlZ2lucwpzdHJzIDwtIHJlYWRMaW5lcyhwYXJhbXMkZmlsZSwgc2tpcE51bCA9IFQpCiMgYWRkIHRoZSBcdCdzIGZvciB0aGlzIHJvdW5kIG9ubHksIGV4Y2VsIGFkZGVkIHRoZW0gaW4KbGluZXN0b3NraXAgPC0gd2hpY2goc3RycyA9PSAiR3JvdXA6IFVua25vd25zIikgIyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIHNraXAKbnVtX2xpbmVzIDwtIGFzLm51bWVyaWMoc3Vic3RyKHBhcmFtcyRsYXN0X3NhbXBsZSwgMiwgNSkpIC0gYXMubnVtZXJpYyhzdWJzdHIocGFyYW1zJGZpcnN0X3NhbXBsZSwgMiwgNSkpICsgMQpgYGAKRm9yIHRoaXMgcm91bmQgb25seSBvcGVuaW5nIHRoZSB0eHQgZmlsZSBpbiBleGNlbCBhbmQgY2hhbmdpbmcgdGhlIG5hbWVzIG9mIHRoZSBzYW1wbGVzIHRoYXQgYXJlIGluIHNhbXBsZSBudW1iZXJzIGhpZ2hlciB0aGFuIHRoZSB0ZXN0IHNhbXBsZXMgaW4gdGhlIHN0YW5kYXJkcyBwbGF0ZS4gIAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGV2YWw9RkFMU0V9CiMgY3JlYXRlIGEgdGFibGUgdGhhdCBjb250YWlucyB3ZWxsIGxvY2F0aW9ucyBhbmQgcXVhbnRpdGllcwpkYXQgPC0gcmVhZC50YWJsZSh0ZXh0PXN0cnMsICBza2lwID0gbGluZXN0b3NraXAsIHNlcCA9ICJcdCIsIGhlYWRlciA9IFQsIGZpbGwgPSBULCBzdHJpbmdzQXNGYWN0b3JzID0gRiwgbnJvd3MgPSBudW1fbGluZXMpICU+JSAKICByZW5hbWUod2VsbCA9IFdlbGxzKSAlPiUgCiAgbXV0YXRlKFNhbXBsZSA9IGFzLm51bWVyaWMoU2FtcGxlKSkgJT4lCiAgYXJyYW5nZShTYW1wbGUpICU+JSAKICBzZWxlY3QoU2FtcGxlLCB3ZWxsLCBBZGpDb25jKQpgYGAKMi4gQ29ubmVjdCBuYW1lcyBvZiBzYW1wbGVzIGZyb20gZGF0YWJhc2UKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0KIyBwdWxsIGluIHRoZSBmdWxsIGRhdGFiYXNlIHRhYmxlCmRiX2RhdCA8LSBkYlJlYWRUYWJsZShsYWIsIHBhcmFtcyR0eXBlKQoKIyBzZWxlY3QgeW91ciBzYW1wbGVzCmlmIChwYXJhbXMkdHlwZSA9PSAiZXh0cmFjdGlvbiIpewogIHNhbXAgPC0gZGJfZGF0ICU+JQogICAgc2VsZWN0KGNvbnRhaW5zKCJpZCIpLCB3ZWxsLCBwbGF0ZSkgJT4lIAogICAgIyBuYXJyb3cgZG93biB0aGUgcmVzdWx0cyB0byBqdXN0IHRoaXMgYmF0Y2gKICAgIGZpbHRlcihleHRyYWN0aW9uX2lkID49IHBhcmFtcyRmaXJzdF9zYW1wbGUsIAogICAgICAgICAgIGV4dHJhY3Rpb25faWQgPD0gcGFyYW1zJGxhc3Rfc2FtcGxlKSAlPiUgCiAgICAjIHB1bGwgb3V0IGNvbCBhbmQgcm93IHNvIHRoYXQgdGhlIHNhbXBsZXMgY2FuIGJlIHNvcnRlZCAobm90IGFsd2F5cyBpbiBwbGF0ZXMgaW4gaWQgb3JkZXIpCiAgICBtdXRhdGUocm93ID0gc3Vic3RyKHdlbGwsIDEsIDEpLCAKICAgICAgICAgICBjb2wgPSBzdWJzdHIod2VsbCwgMiwgMykpICU+JSAKICAgICMgc29ydCBieSBwbGF0ZSwgdGhlbiBjb2wsIHRoZW4gcm93CiAgICBhcnJhbmdlKHBsYXRlLCBjb2wsIHJvdykgCn0KCmlmIChwYXJhbXMkdHlwZSA9PSAiZGlnZXN0Iil7CiAgc2FtcCA8LSBkYl9kYXQgJT4lCiAgICBzZWxlY3QoY29udGFpbnMoImlkIiksIHdlbGwsIHBsYXRlKSAlPiUgCiAgICAjIG5hcnJvdyBkb3duIHRoZSByZXN1bHRzIHRvIGp1c3QgdGhpcyBiYXRjaAogICAgZmlsdGVyKGRpZ2VzdF9pZCA+PSBwYXJhbXMkZmlyc3Rfc2FtcGxlLCAKICAgICAgICAgICBkaWdlc3RfaWQgPD0gcGFyYW1zJGxhc3Rfc2FtcGxlKSAlPiUgCiAgICAjIHB1bGwgb3V0IGNvbCBhbmQgcm93IHNvIHRoYXQgdGhlIHNhbXBsZXMgY2FuIGJlIHNvcnRlZCAobm90IGFsd2F5cyBpbiBwbGF0ZXMgaW4gaWQgb3JkZXIpCiAgICBtdXRhdGUocm93ID0gc3Vic3RyKHdlbGwsIDEsIDEpLCAKICAgICAgICAgICBjb2wgPSBzdWJzdHIod2VsbCwgMiwgMykpICU+JSAKICAgICMgc29ydCBieSBwbGF0ZSwgdGhlbiBjb2wsIHRoZW4gcm93CiAgICBhcnJhbmdlKHBsYXRlLCBjb2wsIHJvdykgCn0KCiAjIGRlZmluZSB0aGUgcGxhdGVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhpcyBncm91cAogIHBsYXRlcyA8LSBzYW1wICU+JQogICAgc2VsZWN0KHBsYXRlKSAlPiUKICAgIGRpc3RpbmN0KCkgJT4lCiAgICBhcnJhbmdlKHBsYXRlKQoKICAjIGF0dGFjaCB0aGVzZSBwbGF0ZXMgdG8gdGhlIHF1YW50IGRhdGEKICBkYXQkcGxhdGUgPC0gTkEKICBmb3IgKGkgaW4gMTpucm93KHBsYXRlcykpewogICAgeCA9IGkqOTYKICAgIHkgPSB4IC0gOTUKICAgIGRhdCA8LSBkYXQgJT4lCiAgbXV0YXRlKHBsYXRlID0gaWZlbHNlKFNhbXBsZSA+PSB5ICYgU2FtcGxlIDw9IHgsIHBsYXRlcyRwbGF0ZVtpXSwgcGxhdGUpKQogIH0KCiAgCiAgc2FtcCA8LSBzYW1wICU+JSAKICAgICMgZ2V0IHJpZCBvZiBleHRyYSBjb2x1bW5zCiAgICBzZWxlY3QoLXJvdywgLWNvbCkKCiMgam9pbiB0aGUgaWRzIHRvIHRoZSBxdWFudGlmaWNhdGlvbiBkYXRhCnF1YW50MSA8LSBsZWZ0X2pvaW4oc2FtcCwgZGF0LCBieSA9IGMoInBsYXRlIiwgIndlbGwiKSkgJT4lCiAgc2VsZWN0KGNvbnRhaW5zKCJpZCIpLCBBZGpDb25jKSAlPiUKICAjIHJlbmFtZSB0aGUgcXVhbnQgY29sdW1uIHNvIGl0IGNhbiBiZSBqb2luZWQgdG8gdGhlIGRiCiAgcmVuYW1lKHF1YW50ID0gQWRqQ29uYykgJT4lIAogICMgcmVtb3ZlIGFueSBlbXB0eSB3ZWxscwogIGZpbHRlcighaXMubmEocXVhbnQpKQprYWJsZShxdWFudDEsIGxvbmd0YWJsZSA9IFQpICU+JSAKICBrYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSAicmVwZWF0X2hlYWRlciIpCgoKIyB0aGUgZW50aXJlIHRhYmxlIHdhcyBwdWxsZWQgaW4gYXMgZGF0IGFib3ZlCmlmIChwYXJhbXMkaWQgPT0gImV4dHJhY3Rpb25faWQiKXsKICBjaGFuZ2UgPC0gZGJfZGF0ICU+JQogICAgZmlsdGVyKGV4dHJhY3Rpb25faWQgJWluJSBxdWFudDEkZXh0cmFjdGlvbl9pZCkgICU+JQogICAgIyBkb24ndCBicmluZyBpbiB0aGUgcXVhbnQgY29sdW1uLCB3aWxsIGFkZCB0aGF0IGhlcmUKICAgIHNlbGVjdCgtcXVhbnQpIAp9CmlmIChwYXJhbXMkaWQgPT0gImRpZ2VzdF9pZCIpewogIGNoYW5nZSA8LSBkYl9kYXQgJT4lCiAgICBmaWx0ZXIoZGlnZXN0X2lkICVpbiUgcXVhbnQxJGRpZ2VzdF9pZCkgICU+JQogICAgIyBkb24ndCBicmluZyBpbiB0aGUgcXVhbnQgY29sdW1uLCB3aWxsIGFkZCB0aGF0IGhlcmUKICAgIHNlbGVjdCgtcXVhbnQpIAp9CgojIGFkZCBpbiB0aGUgbmV3IHF1YW50cwppZHMgPC0gY2hhbmdlICU+JQogIHNlbGVjdChjb250YWlucygiaWQiKSkKY2hhbmdlIDwtIGxlZnRfam9pbihjaGFuZ2UsIHF1YW50MSwgYnkgPSBjKG5hbWVzKGlkcykpKQoKZGJfZGF0IDwtIGNoYW5nZV9yb3dzKGRiX2RhdCwgY2hhbmdlLCBwYXJhbXMkaWQpCmBgYApEb3VibGUgY2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIGVhY2ggcGxhdGUgaXMgd2hhdCBpcyBleHBlY3RlZAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXZhbD1GQUxTRX0KY2hlY2sgPC0gZGF0ICU+JQogIGdyb3VwX2J5KHBsYXRlKSAlPiUgCiAgc3VtbWFyaXNlKHJvd3MgPSBuKCkpCmthYmxlKGNoZWNrKSAlPiUgCiAga2FibGVfc3R5bGluZygpCmBgYApXcml0ZSB0aGVzZSBjaGFuZ2VzIGludG8gdGhlIGRhdGFiYXNlCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGV2YWw9RkFMU0V9CiMgZGJXcml0ZVRhYmxlKGxhYiwgcGFyYW1zJHR5cGUsIGRiX2RhdCwgcm93Lm5hbWVzID0gRiwgb3ZlcndyaXRlID0gVCkKIyBkYkRpc2Nvbm5lY3QobGFiKQpgYGAK