Skip to Content
Home » Blog » Car Accidents » How Do I Get a Copy of a Florida Crash Report?

Apr
2026

How Do I Get a Copy of a Florida Crash Report?

on Car Accidents

Quick Answer: Get Your Report in Minutes

The fastest way is through the Florida Crash Portal (FLHSMV) — it costs $12 and you’ll get the report instantly as a PDF download. If you don’t want to pay, call your auto insurance company and request a free copy. Note: If your crash just occurred, the report may not be available yet — officers have up to 10 days to submit it.

Which Method Is Right for You?

Call us today at (305) 694-2676 or contact us online for a free case evaluation. Hablamos español.
Representative

Answer a quick question to find the best way to get your crash report.

Were you (or a family member) directly involved in the accident?


Buy It Online ($12) — Instant Download

The Florida Crash Portal is your best option. You’ll have the report in minutes. Follow the step-by-step guide below to walk through the process.

Call Your Insurance Company — Free

First, check if the Driver Exchange of Information you received at the scene already has what you need — it may be enough to file your claim without the full crash report.

If you do need the full report, your auto insurer already purchased a copy. Call the claims number on your insurance card and ask them to email or mail it to you. Note: This can take several days.

Need it faster? You can always buy it online for $12.

Your Attorney Will Get It for You

If you’ve hired a car accident lawyer, they will purchase the crash report on your behalf as soon as it’s available. Ask your attorney’s office for a copy.

If you don’t have an attorney yet, we’d be happy to provide you a copy of the report during our consultation. Call us at (305) 694-2676.

You May Still Be Eligible

Florida law allows certain parties to purchase crash reports, including legal representatives, insurance agents, and media outlets. Visit the Florida Crash Portal eligibility page and select the exemption that applies to you.

Driver Exchange vs. Crash Report: What’s the Difference?

Many people confuse the document they received from the police officer at the scene with the official crash report. They are two different documents that serve different purposes.

Given at the Scene

Driver Exchange of Information

  • Handed to you by the officer on-site
  • Names & addresses of drivers and vehicle owners
  • Insurance policy numbers
  • Date, time, and location of the accident
  • Free — you already have this
Generated Later

Florida Crash Report

  • Completed by the officer after investigating
  • Description and diagram of how the crash occurred
  • Witness names, addresses, and phone numbers
  • Traffic citations or tickets issued
  • $12 — purchased from the Florida Crash Portal

Bottom line: The driver exchange has enough info to file insurance claims. The crash report is most useful when there’s a dispute about how the accident happened, when you need witness information, or when your attorney needs it for your case.

Before You Start: What You’ll Need

Make sure you have these items ready before purchasing your crash report online.

  • Driver’s license number (yours or the involved party’s)
  • Last name of a driver involved in the accident
  • Approximate date of the crash
  • Credit or debit card for payment ($12.00)
  • Email address (for passcode verification & download link)
✅ You’re all set! Follow the step-by-step guide below to purchase your report.

Step-by-Step: Buy a Florida Crash Report

Get started with your complimentary case evaluation today; call us at (305) 694-2676 or reach us online using our secure contact form.
Representative

Step 1 of 11

Visit the Florida Crash Portal

Go to services.flhsmv.gov/CrashReportPurchasing. You’ll see the fees and additional information page.

Review the information, then click the green “Accept” button at the bottom-right of the page.

Step 1 of 11
FLHSMV crash portal fees and information page showing the Accept button
Click to enlarge

Select Your Eligibility Exemption

On the Eligibility page, select the reason you’re purchasing the crash report:

  • “Party involved in a crash” — if you were a driver or passenger
  • “Legal representative of a party involved” — if you’re an attorney or work for a law firm

Then enter your driver’s license state and number under Proof of Eligibility, and click “Accept.”

Step 2 of 11
Eligibility page with exemption options and proof of eligibility fields
Click to enlarge

Choose Your Search Method

The portal gives you three ways to find your crash report. Choose the one that works best for you — we recommend searching by Last Name as it’s the easiest.

See the tabs below this guide for details on each search method.

Step 3 of 11
Search method options: Report Number, VIN Number, or Last Name
Click to enlarge

Enter Your Search Details

If searching by Last Name: type the last name of a person involved in the accident, select the crash date, and fill in the auto-generated captcha characters. The County field is optional.

Click the blue “Search” button when ready.

Step 4 of 11
Search form for last name, crash date, and captcha
Click to enlarge

Find and Select Your Report

Review the search results. In larger counties like Miami-Dade or Broward, there may be multiple results for common last names. Use the street name where your accident occurred to identify the correct report.

Click “Add to Cart” next to the correct report.

Step 5 of 11
Search results showing crash reports with Add to Cart buttons
Click to enlarge

Open Your Shopping Cart

After adding the report to your cart, you’ll see the shopping cart icon update at the top of the page. Click on the shopping cart to proceed to checkout.

Step 6 of 11
Shopping cart icon showing 1 item added
Click to enlarge

Enter Your Email and Get a Passcode

Type your email address and click the blue “Generate Passcode” button. Check your inbox for an email from DoNotReply@flhsmv.gov containing your one-time passcode.

Step 7 of 11
Email entry and Generate Passcode button
Click to enlarge

Enter the Passcode

Enter the passcode you received via email and click the blue “Submit” button.

Step 8 of 11
Passcode entry field with Submit button
Click to enlarge

Confirm Your Order

Review the report details to make sure it’s the correct accident. If everything looks right, click the green “Proceed to Payment” button.

Step 9 of 11
Order confirmation page with Proceed to Payment button
Click to enlarge

Enter Payment Information

Enter your credit or debit card information and click the red “Next” button.

Step 10 of 11
Payment information form with credit card fields
Click to enlarge

You’ll then see a confirmation screen. Review your payment details and click the red “Submit” button to complete the purchase.

Step 10 of 11 — Confirm Payment
Payment verification screen with Submit button
Click to enlarge

Download Your Crash Report

Once payment is processed, click the blue “Download” button to save your crash report. The report will download as a PDF file inside a ZIP folder.

A download link will also be emailed to you. You have 48 hours to download the report.

Step 11 of 11
Download page with blue Download button
Click to enlarge

Search Method Details

The Florida Crash Portal lets you search for your report using any of these three methods:



Search by Last Name (Recommended)

Enter the last name of any driver or vehicle owner involved in the crash. You’ll also need to provide the crash date and complete a captcha.

The County field is optional but can help narrow results if the last name is common.

Tip: If multiple results appear, match the correct report by comparing the street name where your accident occurred.

Search by VIN Number

Enter the Vehicle Identification Number (VIN) of any vehicle involved in the crash. You can find the VIN on your vehicle registration, insurance card, or on a metal plate at the base of the windshield on the driver’s side.

Tip: This method is useful if a name search isn’t returning results — sometimes a typo in the officer’s report can prevent a last name match. The VIN provides an alternative, often more accurate way to locate the report.

Search by Report Number

If the responding police officer gave you a report number (also called a case number), you can enter it directly. This is the fastest search method since it returns an exact match.

Tip: The report number is usually printed on the Driver Exchange of Information sheet the officer gave you at the scene.

How to Read Your Florida Crash Report

Once you have your crash report, here’s what each section means and where to find the information that matters most.

The top of the first page contains the basic identifying information for the crash:

  • HSMV Crash Report Number — The unique state-assigned number. Use this to reference or look up the report later.
  • Reporting Agency Case Number — The local police or sheriff’s internal case number. Use this if you need to contact the responding agency.
  • Crash Date & Time — When the accident occurred. Verify this matches your recollection.
  • County/City of Crash — The jurisdiction where the accident happened. This determines which court has venue if a lawsuit is filed.
  • Long Form vs. Short Form — A “Long Form” is a full investigation report. A “Short Form” (also called a driver self-report) is filed when law enforcement did not respond to the scene. Long forms carry more weight with insurance companies.

This section describes the conditions at the time of the crash. Insurance adjusters and attorneys review this closely because road and weather conditions can affect fault determinations:

  • Roadway Surface Condition — Whether the road was dry, wet, icy, or had debris. Codes 1–8 indicate the condition (1 = Dry, 2 = Wet, etc.).
  • Weather Condition — Clear, cloudy, rain, fog, etc. Poor weather doesn’t excuse negligent driving, but it provides context.
  • Light Condition — Daylight, dusk, dawn, or dark (with or without street lighting). Important in visibility-related crashes.
  • Type of Intersection — Whether the crash occurred at a four-way intersection, T-intersection, roundabout, or non-intersection. This helps establish right-of-way.
  • Manner of Collision — How the vehicles made contact: front-to-rear (rear-end), angle, sideswipe, head-on, etc. A “Front to Rear” collision, for example, almost always places fault on the rear driver.

Each vehicle involved in the crash gets its own section. Here you’ll find:

  • Vehicle Number (1, 2, etc.) — The officer assigns each vehicle a number. These numbers correspond to the crash diagram, so “Vehicle 1” in the narrative is the same as “V1” on the diagram.
  • Driver Name, Address, DOB, and DL Number — Identifying information for each driver. Check for accuracy — misspellings are common and can cause problems later.
  • Insurance Information — The policy number and insurance company for each vehicle. This is the information you’ll need to file a claim.
  • Vehicle Year, Make, Model, VIN — Identifies the specific vehicle. Useful for confirming correct vehicles are listed.
  • Vehicle Damage Area — A coded diagram showing where on the vehicle the damage occurred (front, rear, left side, etc.).
  • Contributing Cause (Driver) — The officer’s assessment of what each driver did wrong, if anything. Common codes include “Failed to yield right-of-way,” “Careless driving,” “Followed too closely,” and “No improper action.” This is one of the most important fields for determining fault.
Important: The contributing cause assigned by the officer is not a legal finding of fault — it’s the officer’s initial assessment. It can be challenged, but insurance companies rely heavily on it.

Every person involved — drivers, passengers, pedestrians, and cyclists — is listed with:

  • Injury Severity — Classified using a standardized scale:
    • 1 – None (O) — No visible injuries
    • 2 – Possible (C) — Complaint of pain but no visible injury
    • 3 – Non-Incapacitating (B) — Visible injury (bruises, cuts) but person can still function
    • 4 – Incapacitating (A) — Serious injury preventing normal activity (broken bones, etc.)
    • 5 – Fatal (K) — Death resulted from the crash
  • Seating Position — Where the person was seated in the vehicle. This can be relevant for injury claims.
  • Safety Equipment — Whether the person was wearing a seatbelt, using a child seat, or wearing a helmet. Florida’s seatbelt laws can affect comparative fault in some cases.
  • Transported By — Whether the person was taken to a hospital by ambulance, helicopter, or private vehicle, and which hospital. This documents the immediate medical response.

The crash diagram is a hand-drawn or computer-generated illustration by the investigating officer showing:

  • Road layout — The shape of the roadway, lanes, intersections, and traffic controls (stop signs, signals)
  • Vehicle positions — Where each vehicle was before, during, and after the impact, labeled as V1, V2, etc.
  • Direction of travel — Arrows showing which way each vehicle was moving
  • Point of impact — Usually marked with an “X” or “POI”
  • Final rest positions — Where the vehicles ended up after the collision
  • North arrow — Compass orientation to help you understand the layout
Tip: Compare the diagram to your own memory of the crash. If the diagram doesn’t match what happened, this is important information to share with your attorney — diagrams are sometimes inaccurate, especially in complex multi-vehicle crashes.

The narrative is the officer’s written summary of how the crash occurred. This is often the most important section of the entire report because it tells the story in plain language. Look for:

  • Sequence of events — What happened first, second, and so on. The officer will describe each vehicle’s actions leading up to the collision.
  • Fault language — Phrases like “Vehicle 1 failed to yield” or “Driver 2 was traveling at a high rate of speed” indicate who the officer believes caused the crash.
  • Statements from drivers — The officer may quote what each driver said at the scene. Be aware that anything you told the officer is documented here.
  • Witness accounts — Summaries of what witnesses observed, which can corroborate or contradict the drivers’ statements.
Important: The narrative reflects the officer’s interpretation based on evidence at the scene. If you believe it contains errors, an attorney can help you gather additional evidence (surveillance footage, witness interviews, accident reconstruction) to challenge it.

If any driver was issued a traffic citation (ticket) at the scene, it will be documented in the report. This section shows:

  • Florida Statute violated — The specific law the driver is accused of breaking (e.g., 316.0895 for following too closely, 316.123 for failure to yield)
  • Which driver was cited — Corresponds to the vehicle numbers (V1, V2)
  • Charge description — A plain-language description of the violation

A citation is strong evidence of fault but is not conclusive. Conversely, the absence of a citation doesn’t mean a driver wasn’t at fault — officers sometimes choose not to issue tickets even when a violation occurred.

The report lists the names, addresses, and phone numbers of any witnesses the officer spoke with at the scene. This information is valuable because:

  • Independent witnesses who saw the crash can support your version of events
  • Witness contact information may be difficult or impossible to obtain later if not documented in the report
  • Your attorney can interview witnesses to build a stronger case
Note: Not all witnesses are listed. Some leave the scene before the officer can speak with them. If you know of a witness who isn’t in the report, write down their information as soon as possible.

Frequently Asked Questions

Call your auto insurance company and ask them to send you a copy of the report. All auto insurance companies purchase police accident reports whenever their insured (or their insured’s vehicle) is involved in an accident. The insurance adjuster handling your claim will email, mail, or fax you a copy of the report.

Disclaimer: Many auto insurance companies are extremely slow and you may need to wait several days to receive the report. If you purchase the report directly from the Florida Crash Portal, you will receive it immediately.

In most cases, you do not need a copy of the accident report. If you were involved in an accident in Florida, the reporting police officer should have provided all parties with a printed Driver Exchange of Information. That document contains everything you need to file insurance claims, including:

  • Date and time of accident
  • Location of accident
  • Names and addresses of drivers involved
  • Names and addresses of the vehicle owners
  • Insurance policy numbers for the vehicles involved

However, the accident report is useful when it’s unclear how the accident occurred. The report includes additional details such as:

  • A description of how the accident occurred
  • A diagram depicting how the accident occurred
  • Names, addresses, and phone numbers of all witnesses
  • Descriptions of any traffic citations or “tickets” issued

No. If you hire a car accident lawyer to represent you for injuries sustained in an accident, your lawyer will purchase a copy of the report as soon as it is uploaded onto the Florida Crash Portal. If you would like a copy, your attorney should provide you with one.

Under Section 316.066, Florida Statutes, law enforcement officers are required to submit a “Long Form” crash report within 10 days after the investigation is completed. Most reports appear on the Florida Crash Portal within a few days of the accident, but more complex crashes (multiple vehicles, serious injuries, fatalities) can take longer to investigate before the 10-day submission window even begins.

If your crash just occurred and you can’t find the report, check back daily — it will be uploaded once the officer completes the investigation and submits it. Don’t assume it’s missing after just a day or two.

In some cases, it can take longer than 10 days. If the report still hasn’t appeared after 10 days, call the Records Division of the specific agency that responded to your accident — whether that’s the local Police Department, County Sheriff’s Office, or Florida Highway Patrol. They can tell you if the report is still being processed or if there’s a data entry issue (such as a misspelled name) preventing it from showing up in your search results.

Were You Injured in a Florida Car Accident?

If you were injured in a crash and are weighing your options, we will be happy to obtain a copy of the crash report for you at no cost as part of your free consultation. During the consultation, we will send you a copy of the report by email or text message if you prefer, explain what it means for you, and advise you on your options.

Call (305) 694-2676 for a Free Consultation

Enlarged screenshot

LyogPT09PT0gU0NPUEVEIFNUWUxFUyDigJQgYWxsIHVuZGVyIC5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgPT09PT0gKi8KCi8qIEhpZGUgdGhlbWUtaW5qZWN0ZWQgQ1RBIGluc2lkZSB0aGlzIHBvc3QgKi8KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCAubC1jb250YWluZXIsCi5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgLnRleHQtY29udGVudCAudHJpYW5nbGUgewogIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IHsKICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIE94eWdlbiwgVWJ1bnR1LCBzYW5zLXNlcmlmOwogIGNvbG9yOiAjMzMzOwogIGxpbmUtaGVpZ2h0OiAxLjc7CiAgbWF4LXdpZHRoOiA4MjBweDsKICBtYXJnaW46IDAgYXV0bzsKICBwYWRkaW5nOiAyMHB4Owp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgKiwKLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCAqOjpiZWZvcmUsCi5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgKjo6YWZ0ZXIgewogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCBidXR0b246Zm9jdXMsCi5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgYTpmb2N1cywKLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCBsaTpmb2N1cyB7CiAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50OwogIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKfQoucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IGgyIHsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50OwogIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7CiAgbWFyZ2luOiAycmVtIDAgMXJlbSAhaW1wb3J0YW50OwogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZThlY2YxICFpbXBvcnRhbnQ7CiAgcGFkZGluZy1ib3R0b206IDAuNXJlbSAhaW1wb3J0YW50Owp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgaDMgewogIGNvbG9yOiAjMWIzYTVjICFpbXBvcnRhbnQ7CiAgZm9udC1zaXplOiAxLjI1cmVtICFpbXBvcnRhbnQ7CiAgbWFyZ2luOiAxLjVyZW0gMCAwLjc1cmVtICFpbXBvcnRhbnQ7Cn0KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCBwIHsKICBtYXJnaW46IDAgMCAxcmVtOwp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgYSB7CiAgY29sb3I6ICMxYjNhNWM7CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCBhOmhvdmVyIHsKICBjb2xvcjogIzI5ODBiOTsKfQoKLyogLS0tLS0tLS0tLSBRVUlDSyBBTlNXRVIgSEVSTyBCT1ggLS0tLS0tLS0tLSAqLwoucGlwLWhlcm8tYm94IHsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMWIzYTVjIDAlLCAjMjM0YjczIDEwMCUpOwogIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgYm9yZGVyLXJhZGl1czogMTJweDsKICBwYWRkaW5nOiAyOHB4IDMycHg7CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKICBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMjcsNTgsOTIsMC4xOCk7Cn0KLnBpcC1oZXJvLWJveCBoMiB7CiAgZm9udC1zaXplOiAxLjc1cmVtOwogIG1hcmdpbjogMCAwIDEycHg7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICBsaW5lLWhlaWdodDogMS4zOwogIGJvcmRlci1ib3R0b206IG5vbmU7CiAgcGFkZGluZy1ib3R0b206IDA7Cn0KLnBpcC1oZXJvLWJveCAucGlwLWhlcm8tYW5zd2VyIHsKICBmb250LXNpemU6IDEuMDVyZW07CiAgbWFyZ2luLWJvdHRvbTogMThweDsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIG9wYWNpdHk6IDE7CiAgbGluZS1oZWlnaHQ6IDEuNjsKfQoucGlwLWhlcm8tYm94IC5waXAtaGVyby1hY3Rpb25zIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtd3JhcDogd3JhcDsKICBnYXA6IDEycHg7Cn0KLnBpcC1oZXJvLWJveCAucGlwLWJ0biB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBnYXA6IDhweDsKICBwYWRkaW5nOiAxMnB4IDI0cHg7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgZm9udC1zaXplOiAwLjk1cmVtOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xNXMsIGJveC1zaGFkb3cgMC4xNXM7CiAgY3Vyc29yOiBwb2ludGVyOwogIGJvcmRlcjogbm9uZTsKfQoucGlwLWhlcm8tYm94IC5waXAtYnRuOmhvdmVyIHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMik7Cn0KLnBpcC1idG4tcHJpbWFyeSB7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50Owp9CgovKiAtLS0tLS0tLS0tIERFQ0lTSU9OIFRPT0wgLS0tLS0tLS0tLSAqLwoucGlwLWRlY2lzaW9uLXRvb2wgewogIGJhY2tncm91bmQ6ICNmN2Y5ZmI7CiAgYm9yZGVyOiAycHggc29saWQgI2UwZTdlZjsKICBib3JkZXItcmFkaXVzOiAxMnB4OwogIHBhZGRpbmc6IDI4cHggMzJweDsKICBtYXJnaW4tYm90dG9tOiAycmVtOwp9Ci5waXAtZGVjaXNpb24tdG9vbCBoMiB7CiAgYm9yZGVyOiBub25lOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luLXRvcDogMDsKICBmb250LXNpemU6IDEuMzVyZW07Cn0KLnBpcC1kZWNpc2lvbi1xdWVzdGlvbiB7CiAgZm9udC1zaXplOiAxLjA1cmVtOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgbWFyZ2luLWJvdHRvbTogMTJweDsKICBjb2xvcjogIzFiM2E1YzsKfQoucGlwLWRlY2lzaW9uLW9wdGlvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IDEwcHg7CiAgbWFyZ2luLWJvdHRvbTogOHB4Owp9Ci5waXAtZGVjaXNpb24tYnRuIHsKICBkaXNwbGF5OiBibG9jazsKICB3aWR0aDogMTAwJTsKICB0ZXh0LWFsaWduOiBsZWZ0OwogIHBhZGRpbmc6IDE0cHggMjBweDsKICBib3JkZXI6IDJweCBzb2xpZCAjZDBkOGU0ICFpbXBvcnRhbnQ7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIGJhY2tncm91bmQ6ICNmZmYgIWltcG9ydGFudDsKICBmb250LXNpemU6IDAuOTVyZW07CiAgY3Vyc29yOiBwb2ludGVyOwogIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICBjb2xvcjogIzMzMyAhaW1wb3J0YW50OwogIGZvbnQtZmFtaWx5OiBpbmhlcml0Owp9Ci5waXAtZGVjaXNpb24tYnRuOmhvdmVyIHsKICBib3JkZXItY29sb3I6ICMxYjNhNWM7CiAgYmFja2dyb3VuZDogI2YwZjRmODsKfQoucGlwLWRlY2lzaW9uLWJ0bi5zZWxlY3RlZCB7CiAgYm9yZGVyLWNvbG9yOiAjMWIzYTVjOwogIGJhY2tncm91bmQ6ICNlYWYwZjc7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoucGlwLWRlY2lzaW9uLXJlc3VsdCB7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBib3JkZXI6IDJweCBzb2xpZCAjMWIzYTVjOwogIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgcGFkZGluZzogMjBweCAyNHB4OwogIG1hcmdpbi10b3A6IDE2cHg7CiAgZGlzcGxheTogbm9uZTsKfQoucGlwLWRlY2lzaW9uLXJlc3VsdC52aXNpYmxlIHsKICBkaXNwbGF5OiBibG9jazsKICBhbmltYXRpb246IHBpcEZhZGVJbiAwLjNzIGVhc2U7Cn0KLnBpcC1kZWNpc2lvbi1yZXN1bHQgaDMgewogIG1hcmdpbi10b3A6IDA7CiAgY29sb3I6ICMxYjNhNWM7Cn0KLnBpcC1kZWNpc2lvbi1yZXN0YXJ0IHsKICBtYXJnaW4tdG9wOiAxMnB4OwogIHBhZGRpbmc6IDhweCAxNnB4OwogIGJhY2tncm91bmQ6ICNmMGY0ZjggIWltcG9ydGFudDsKICBib3JkZXI6IDFweCBzb2xpZCAjZDBkOGU0ICFpbXBvcnRhbnQ7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXNpemU6IDAuODVyZW07CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgY29sb3I6ICM1NTU7Cn0KLnBpcC1kZWNpc2lvbi1yZXN0YXJ0OmhvdmVyIHsKICBiYWNrZ3JvdW5kOiAjZTRlYWYwOwp9CgovKiAtLS0tLS0tLS0tIENIRUNLTElTVCAtLS0tLS0tLS0tICovCi5waXAtY2hlY2tsaXN0IHsKICBiYWNrZ3JvdW5kOiAjZmZmYmYwOwogIGJvcmRlcjogMnB4IHNvbGlkICNmMGU0YzQ7CiAgYm9yZGVyLXJhZGl1czogMTJweDsKICBwYWRkaW5nOiAyNHB4IDI4cHg7CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoucGlwLWNoZWNrbGlzdCBoMiB7CiAgYm9yZGVyOiBub25lOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luLXRvcDogMDsKICBmb250LXNpemU6IDEuMjVyZW07CiAgY29sb3I6ICM4YTZkMjA7Cn0KLnBpcC1jaGVja2xpc3Qtc3VidGV4dCB7CiAgZm9udC1zaXplOiAwLjlyZW07CiAgY29sb3I6ICM4YTZkMjA7CiAgbWFyZ2luLWJvdHRvbTogMTZweDsKfQoucGlwLWNoZWNrbGlzdC1pdGVtcyB7CiAgbGlzdC1zdHlsZTogbm9uZSAhaW1wb3J0YW50OwogIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICBtYXJnaW46IDAgIWltcG9ydGFudDsKfQoucGlwLWNoZWNrbGlzdC1pdGVtcyBsaSB7CiAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiAxMnB4OwogIHBhZGRpbmc6IDEwcHggMCAhaW1wb3J0YW50OwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBlNGM0OwogIGZvbnQtc2l6ZTogMC45NXJlbTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgbGlzdC1zdHlsZTogbm9uZSAhaW1wb3J0YW50OwogIGJhY2tncm91bmQtaW1hZ2U6IG5vbmUgIWltcG9ydGFudDsKfQoucGlwLWNoZWNrbGlzdC1pdGVtcyBsaTo6YmVmb3JlLAoucGlwLWNoZWNrbGlzdC1pdGVtcyBsaTo6bWFya2VyIHsKICBjb250ZW50OiBub25lICFpbXBvcnRhbnQ7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5waXAtY2hlY2tsaXN0LWl0ZW1zIGxpOmxhc3QtY2hpbGQgewogIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KLnBpcC1jaGVjay1ib3ggewogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMjJweDsKICBib3JkZXI6IDJweCBzb2xpZCAjYzliOTdhOwogIGJvcmRlci1yYWRpdXM6IDRweDsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgZmxleC1zaHJpbms6IDA7CiAgdHJhbnNpdGlvbjogYWxsIDAuMTVzOwogIGZvbnQtc2l6ZTogMTRweDsKICBjb2xvcjogdHJhbnNwYXJlbnQ7Cn0KLnBpcC1jaGVja2xpc3QtaXRlbXMgbGkuY2hlY2tlZCAucGlwLWNoZWNrLWJveCB7CiAgYmFja2dyb3VuZDogIzFiM2E1YzsKICBib3JkZXItY29sb3I6ICMxYjNhNWM7CiAgY29sb3I6ICNmZmY7Cn0KLnBpcC1jaGVja2xpc3QtaXRlbXMgbGkuY2hlY2tlZCBzcGFuOmxhc3QtY2hpbGQgewogIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwogIG9wYWNpdHk6IDAuNTsKfQoucGlwLWNoZWNrbGlzdC1yZWFkeSB7CiAgZGlzcGxheTogbm9uZTsKICBtYXJnaW4tdG9wOiAxNnB4OwogIHBhZGRpbmc6IDEycHggMjBweDsKICBiYWNrZ3JvdW5kOiAjZThmNWU5OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBjb2xvcjogIzJlN2QzMjsKICBmb250LXdlaWdodDogNjAwOwogIGZvbnQtc2l6ZTogMC45NXJlbTsKICBhbmltYXRpb246IHBpcEZhZGVJbiAwLjNzIGVhc2U7Cn0KLnBpcC1jaGVja2xpc3QtcmVhZHkudmlzaWJsZSB7CiAgZGlzcGxheTogYmxvY2s7Cn0KCi8qIC0tLS0tLS0tLS0gU1RFUCBXSVpBUkQgLS0tLS0tLS0tLSAqLwoucGlwLXdpemFyZCB7CiAgYm9yZGVyOiAycHggc29saWQgI2UwZTdlZjsKICBib3JkZXItcmFkaXVzOiAxMnB4OwogIG92ZXJmbG93OiBoaWRkZW47CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoucGlwLXdpemFyZC1oZWFkZXIgewogIGJhY2tncm91bmQ6ICMxYjNhNWM7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICBwYWRkaW5nOiAxOHB4IDI4cHg7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBmbGV4LXdyYXA6IHdyYXA7CiAgZ2FwOiAxMHB4Owp9Ci5waXAtd2l6YXJkLWhlYWRlciBoMiB7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogMDsKICBib3JkZXI6IG5vbmU7CiAgZm9udC1zaXplOiAxLjJyZW07Cn0KLnBpcC13aXphcmQtc3RlcC1pbmRpY2F0b3IgewogIGZvbnQtc2l6ZTogMC44NXJlbTsKICBvcGFjaXR5OiAwLjg1OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoucGlwLXByb2dyZXNzLWJhciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiA0cHg7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjIpOwp9Ci5waXAtcHJvZ3Jlc3MtZmlsbCB7CiAgaGVpZ2h0OiAxMDAlOwogIGJhY2tncm91bmQ6ICM1ZGFkZTI7CiAgdHJhbnNpdGlvbjogd2lkdGggMC4zNXMgZWFzZTsKICBib3JkZXItcmFkaXVzOiAwIDJweCAycHggMDsKfQoucGlwLXdpemFyZC1ib2R5IHsKICBwYWRkaW5nOiAyOHB4OwogIGJhY2tncm91bmQ6ICNmZmY7CiAgbWluLWhlaWdodDogMjAwcHg7Cn0KLnBpcC1zdGVwIHsKICBkaXNwbGF5OiBub25lOwogIGFuaW1hdGlvbjogcGlwRmFkZUluIDAuM3MgZWFzZTsKfQoucGlwLXN0ZXAuYWN0aXZlIHsKICBkaXNwbGF5OiBibG9jazsKfQoucGlwLXN0ZXAtdGl0bGUgewogIGZvbnQtc2l6ZTogMS4xcmVtOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgY29sb3I6ICMxYjNhNWM7CiAgbWFyZ2luLWJvdHRvbTogMTRweDsKfQoucGlwLXN0ZXAgcCB7CiAgbWFyZ2luLWJvdHRvbTogMTJweDsKfQoucGlwLXN0ZXAtaW1nLXdyYXBwZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBtYXJnaW46IDE4cHggMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIG92ZXJmbG93OiBoaWRkZW47CiAgYm9yZGVyOiAxcHggc29saWQgI2UwZTdlZjsKICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMnM7Cn0KLnBpcC1zdGVwLWltZy13cmFwcGVyOmhvdmVyIHsKICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwwLDAsMC4xMik7Cn0KLnBpcC1zdGVwLWltZy13cmFwcGVyIGltZyB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiBhdXRvOwogIGRpc3BsYXk6IGJsb2NrOwp9Ci5waXAtc3RlcC1iYWRnZSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMTJweDsKICBsZWZ0OiAxMnB4OwogIGJhY2tncm91bmQ6ICMxYjNhNWM7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICBmb250LXNpemU6IDAuNzVyZW07CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBwYWRkaW5nOiA0cHggMTJweDsKICBib3JkZXItcmFkaXVzOiAyMHB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5waXAtem9vbS1oaW50IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgYm90dG9tOiAxMnB4OwogIHJpZ2h0OiAxMnB4OwogIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIGZvbnQtc2l6ZTogMC43NXJlbTsKICBwYWRkaW5nOiA0cHggMTBweDsKICBib3JkZXItcmFkaXVzOiA0cHg7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgb3BhY2l0eTogMDsKICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7Cn0KLnBpcC1zdGVwLWltZy13cmFwcGVyOmhvdmVyIC5waXAtem9vbS1oaW50IHsKICBvcGFjaXR5OiAxOwp9Ci5waXAtd2l6YXJkLWZvb3RlciB7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBwYWRkaW5nOiAxOHB4IDI4cHg7CiAgYmFja2dyb3VuZDogI2Y3ZjlmYjsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2UwZTdlZjsKfQoucGlwLW5hdi1idG4gewogIHBhZGRpbmc6IDEwcHggMjRweDsKICBib3JkZXItcmFkaXVzOiA4cHg7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBmb250LXNpemU6IDAuOXJlbTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYm9yZGVyOiAycHggc29saWQgIzFiM2E1YzsKICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KLnBpcC1uYXYtYnRuLXByZXYgewogIGJhY2tncm91bmQ6ICNmZmYgIWltcG9ydGFudDsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50Owp9Ci5waXAtbmF2LWJ0bi1wcmV2OmhvdmVyIHsKICBiYWNrZ3JvdW5kOiAjZjBmNGY4ICFpbXBvcnRhbnQ7Cn0KLnBpcC1uYXYtYnRuLXByZXY6ZGlzYWJsZWQgewogIG9wYWNpdHk6IDAuMzsKICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9Ci5waXAtbmF2LWJ0bi1uZXh0IHsKICBiYWNrZ3JvdW5kOiAjMWIzYTVjICFpbXBvcnRhbnQ7CiAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoucGlwLW5hdi1idG4tbmV4dDpob3ZlciB7CiAgYmFja2dyb3VuZDogIzIzNGI3MyAhaW1wb3J0YW50Owp9Ci5waXAtc3RlcC1kb3RzIHsKICBkaXNwbGF5OiBmbGV4OwogIGdhcDogNnB4Owp9Ci5waXAtc3RlcC1kb3QgewogIHdpZHRoOiAxMHB4OwogIGhlaWdodDogMTBweDsKICBib3JkZXItcmFkaXVzOiA1MCU7CiAgYmFja2dyb3VuZDogI2QwZDhlNDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdHJhbnNpdGlvbjogYWxsIDAuMnM7CiAgYm9yZGVyOiBub25lOwogIHBhZGRpbmc6IDA7Cn0KLnBpcC1zdGVwLWRvdC5hY3RpdmUgewogIGJhY2tncm91bmQ6ICMxYjNhNWM7CiAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpOwp9Ci5waXAtc3RlcC1kb3QuY29tcGxldGVkIHsKICBiYWNrZ3JvdW5kOiAjNWRhZGUyOwp9CgovKiAtLS0tLS0tLS0tIFRBQkJFRCBTRUFSQ0ggTUVUSE9EUyAtLS0tLS0tLS0tICovCi5waXAtdGFicyB7CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoucGlwLXRhYnMtbmF2IHsKICBkaXNwbGF5OiBmbGV4OwogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZTBlN2VmOwogIG1hcmdpbi1ib3R0b206IDA7Cn0KLnBpcC10YWItYnRuIHsKICBwYWRkaW5nOiAxMnB4IDI0cHg7CiAgZm9udC1zaXplOiAwLjlyZW07CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBib3JkZXI6IDJweCBzb2xpZCAjZTBlN2VmICFpbXBvcnRhbnQ7CiAgYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50OwogIGJhY2tncm91bmQ6ICNmN2Y5ZmIgIWltcG9ydGFudDsKICBjb2xvcjogIzY2NiAhaW1wb3J0YW50OwogIGN1cnNvcjogcG9pbnRlcjsKICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDAgMDsKICBtYXJnaW4tYm90dG9tOiAtMnB4OwogIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICBmb250LWZhbWlseTogaW5oZXJpdDsKfQoucGlwLXRhYi1idG46aG92ZXIgewogIGJhY2tncm91bmQ6ICNlZWYyZjYgIWltcG9ydGFudDsKICBjb2xvcjogIzMzMyAhaW1wb3J0YW50Owp9Ci5waXAtdGFiLWJ0bi5hY3RpdmUgewogIGJhY2tncm91bmQ6ICNmZmYgIWltcG9ydGFudDsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50OwogIGJvcmRlci1jb2xvcjogIzFiM2E1YzsKICBib3JkZXItYm90dG9tOiAycHggc29saWQgI2ZmZjsKfQoucGlwLXRhYi1wYW5lbCB7CiAgZGlzcGxheTogbm9uZTsKICBwYWRkaW5nOiAyNHB4OwogIGJvcmRlcjogMnB4IHNvbGlkICNlMGU3ZWY7CiAgYm9yZGVyLXRvcDogbm9uZTsKICBib3JkZXItcmFkaXVzOiAwIDAgMTBweCAxMHB4OwogIGJhY2tncm91bmQ6ICNmZmY7CiAgYW5pbWF0aW9uOiBwaXBGYWRlSW4gMC4yNXMgZWFzZTsKfQoucGlwLXRhYi1wYW5lbC5hY3RpdmUgewogIGRpc3BsYXk6IGJsb2NrOwp9Ci5waXAtdGFiLXBhbmVsIC5waXAtdGlwIHsKICBiYWNrZ3JvdW5kOiAjZWFmMGY3OwogIGJvcmRlci1sZWZ0OiA0cHggc29saWQgIzFiM2E1YzsKICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgYm9yZGVyLXJhZGl1czogMCA2cHggNnB4IDA7CiAgZm9udC1zaXplOiAwLjlyZW07CiAgbWFyZ2luLXRvcDogOHB4Owp9CgovKiAtLS0tLS0tLS0tIEZBUSBBQ0NPUkRJT04gLS0tLS0tLS0tLSAqLwoucGlwLWFjY29yZGlvbiB7CiAgbWFyZ2luLWJvdHRvbTogMnJlbTsKfQoucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IC5waXAtYWNjb3JkaW9uLWl0ZW0sCi5waXAtYWNjb3JkaW9uLWl0ZW0gewogIGJvcmRlcjogMnB4IHNvbGlkICNlMGU3ZWYgIWltcG9ydGFudDsKICBib3JkZXItcmFkaXVzOiAxMHB4ICFpbXBvcnRhbnQ7CiAgbWFyZ2luLWJvdHRvbTogMTBweCAhaW1wb3J0YW50OwogIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OwogIG1pbi1oZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKfQovKiBLaWxsIGVtcHR5IDxwPiB0YWdzIGluamVjdGVkIGJ5IHdwYXV0b3AgaW5zaWRlIGFjY29yZGlvbiBpdGVtcyAqLwoucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IC5waXAtYWNjb3JkaW9uLWl0ZW0gPiBwLAoucGlwLWFjY29yZGlvbi1pdGVtID4gcCB7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogIG1hcmdpbjogMCAhaW1wb3J0YW50OwogIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICBoZWlnaHQ6IDAgIWltcG9ydGFudDsKICBsaW5lLWhlaWdodDogMCAhaW1wb3J0YW50Owp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgLnBpcC1hY2NvcmRpb24gYnV0dG9uLnBpcC1hY2NvcmRpb24taGVhZGVyLAoucGlwLWFjY29yZGlvbi1oZWFkZXIgewogIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7CiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICBwYWRkaW5nOiAxNHB4IDUwcHggMTRweCAyMHB4ICFpbXBvcnRhbnQ7CiAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgYmFja2dyb3VuZDogI2ZmZiAhaW1wb3J0YW50OwogIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogIGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDsKICBmb250LXNpemU6IDEuMDVyZW0gIWltcG9ydGFudDsKICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7CiAgY29sb3I6ICMxYjNhNWMgIWltcG9ydGFudDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdGV4dC1hbGlnbjogbGVmdCAhaW1wb3J0YW50OwogIHRleHQtdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7CiAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbCAhaW1wb3J0YW50OwogIGxpbmUtaGVpZ2h0OiAxLjQgIWltcG9ydGFudDsKICBtaW4taGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIE94eWdlbiwgVWJ1bnR1LCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7Cn0KLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCAucGlwLWFjY29yZGlvbiBidXR0b24ucGlwLWFjY29yZGlvbi1oZWFkZXI6aG92ZXIsCi5waXAtYWNjb3JkaW9uLWhlYWRlcjpob3ZlciB7CiAgYmFja2dyb3VuZDogI2Y3ZjlmYiAhaW1wb3J0YW50Owp9Ci5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgLnBpcC1hY2NvcmRpb24tYXJyb3csCi5waXAtYWNjb3JkaW9uLWFycm93IHsKICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICByaWdodDogMjRweCAhaW1wb3J0YW50OwogIHRvcDogNTAlICFpbXBvcnRhbnQ7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpICFpbXBvcnRhbnQ7CiAgZm9udC1zaXplOiAxLjJyZW0gIWltcG9ydGFudDsKICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7Cn0KLnBpcC1hY2NvcmRpb24taXRlbS5vcGVuIC5waXAtYWNjb3JkaW9uLWFycm93IHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDE4MGRlZykgIWltcG9ydGFudDsKfQoucGlwLWFjY29yZGlvbi1ib2R5IHsKICBtYXgtaGVpZ2h0OiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjM1cyBlYXNlOwp9Ci5waXAtYWNjb3JkaW9uLWJvZHktaW5uZXIgewogIHBhZGRpbmc6IDAgMjRweCAyMHB4Owp9Ci5waXAtYWNjb3JkaW9uLWJvZHktaW5uZXIgdWwgewogIHBhZGRpbmctbGVmdDogMjBweCAhaW1wb3J0YW50OwogIG1hcmdpbjogOHB4IDA7CiAgbGlzdC1zdHlsZS10eXBlOiBkaXNjICFpbXBvcnRhbnQ7Cn0KLnBpcC1hY2NvcmRpb24tYm9keS1pbm5lciBsaSB7CiAgbWFyZ2luLWJvdHRvbTogNnB4OwogIGxpc3Qtc3R5bGUtdHlwZTogZGlzYyAhaW1wb3J0YW50OwogIGJhY2tncm91bmQtaW1hZ2U6IG5vbmUgIWltcG9ydGFudDsKfQoucGlwLWFjY29yZGlvbi1ib2R5LWlubmVyIGxpOjpiZWZvcmUgewogIGNvbnRlbnQ6IG5vbmUgIWltcG9ydGFudDsKfQoucGlwLWFjY29yZGlvbi1ib2R5LWlubmVyIC5waXAtZGlzY2xhaW1lciB7CiAgYmFja2dyb3VuZDogI2ZmZjhlMTsKICBib3JkZXItbGVmdDogNHB4IHNvbGlkICNmOWE4MjU7CiAgcGFkZGluZzogMTJweCAxNnB4OwogIGJvcmRlci1yYWRpdXM6IDAgNnB4IDZweCAwOwogIGZvbnQtc2l6ZTogMC45cmVtOwogIG1hcmdpbi10b3A6IDEycHg7Cn0KCi8qIC0tLS0tLS0tLS0gTEVHQUwgV0FSTklORyBDQUxMT1VUIC0tLS0tLS0tLS0gKi8KLnBpcC1sZWdhbC13YXJuaW5nIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDgpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7CiAgcGFkZGluZzogMTRweCAxOHB4OwogIGJvcmRlci1yYWRpdXM6IDZweDsKICBmb250LXNpemU6IDAuOHJlbTsKICBsaW5lLWhlaWdodDogMS43OwogIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNik7CiAgbWFyZ2luLXRvcDogMThweDsKICBtYXJnaW4tYm90dG9tOiA2cHg7Cn0KLnBpcC1sZWdhbC13YXJuaW5nIHN0cm9uZyB7CiAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC43NSk7Cn0KCi8qIC0tLS0tLS0tLS0gSU5KVVJFRCBDVEEgQk9YIC0tLS0tLS0tLS0gKi8KLnBpcC1pbmp1cmVkLWN0YSB7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzFiM2E1YyAwJSwgIzIzNGI3MyAxMDAlKTsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgcGFkZGluZzogMjhweCAzMnB4OwogIG1hcmdpbi1ib3R0b206IDJyZW07CiAgYm94LXNoYWRvdzogMCA0cHggMjBweCByZ2JhKDI3LDU4LDkyLDAuMTgpOwp9Ci5waXAtaW5qdXJlZC1jdGEgaDIgewogIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgbWFyZ2luOiAwIDAgMTJweDsKICBwYWRkaW5nOiAwOwogIGJvcmRlcjogbm9uZTsKICBmb250LXNpemU6IDEuMzVyZW07Cn0KLnBpcC1pbmp1cmVkLWN0YSBwIHsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIG9wYWNpdHk6IDE7CiAgbGluZS1oZWlnaHQ6IDEuNjsKICBtYXJnaW4tYm90dG9tOiAxNHB4Owp9Ci5waXAtaW5qdXJlZC1jdGEgLnBpcC1idG4gewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZ2FwOiA4cHg7CiAgcGFkZGluZzogMTJweCAyNHB4OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBmb250LXdlaWdodDogNjAwOwogIGZvbnQtc2l6ZTogMC45NXJlbTsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzLCBib3gtc2hhZG93IDAuMTVzOwogIGN1cnNvcjogcG9pbnRlcjsKICBib3JkZXI6IG5vbmU7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBjb2xvcjogIzFiM2E1YyAhaW1wb3J0YW50Owp9Ci5waXAtaW5qdXJlZC1jdGEgLnBpcC1idG46aG92ZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwwLDAsMC4yKTsKfQoKLyogLS0tLS0tLS0tLSBET0NVTUVOVCBDT01QQVJJU09OIC0tLS0tLS0tLS0gKi8KLnBpcC1jb21wYXJpc29uIHsKICBtYXJnaW4tYm90dG9tOiAycmVtOwp9Ci5waXAtY29tcGFyaXNvbiA+IHAgewogIG1hcmdpbi1ib3R0b206IDE2cHg7Cn0KLnBpcC1jb21wYXJpc29uLWdyaWQgewogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogIGdhcDogMTZweDsKfQoucGlwLWNvbXBhcmlzb24tY2FyZCB7CiAgYm9yZGVyLXJhZGl1czogMTBweDsKICBwYWRkaW5nOiAyMnB4IDI0cHg7CiAgYm9yZGVyOiAycHggc29saWQgI2UwZTdlZjsKfQoucGlwLWNvbXBhcmlzb24tY2FyZC5jYXJkLWV4Y2hhbmdlIHsKICBiYWNrZ3JvdW5kOiAjZjdmOWZiOwogIGJvcmRlci1jb2xvcjogI2QwZDhlNDsKfQoucGlwLWNvbXBhcmlzb24tY2FyZC5jYXJkLXJlcG9ydCB7CiAgYmFja2dyb3VuZDogI2VhZjBmNzsKICBib3JkZXItY29sb3I6ICMxYjNhNWM7Cn0KLnBpcC1jb21wYXJpc29uLWNhcmQgaDMgewogIG1hcmdpbi10b3A6IDA7CiAgZm9udC1zaXplOiAxLjA1cmVtOwp9Ci5waXAtY29tcGFyaXNvbi1jYXJkIC5waXAtY2FyZC1sYWJlbCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMC43NXJlbTsKICBmb250LXdlaWdodDogNzAwOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogIHBhZGRpbmc6IDNweCAxMHB4OwogIGJvcmRlci1yYWRpdXM6IDRweDsKICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9Ci5jYXJkLWV4Y2hhbmdlIC5waXAtY2FyZC1sYWJlbCB7CiAgYmFja2dyb3VuZDogI2QwZDhlNDsKICBjb2xvcjogIzRhNTU2ODsKfQouY2FyZC1yZXBvcnQgLnBpcC1jYXJkLWxhYmVsIHsKICBiYWNrZ3JvdW5kOiAjMWIzYTVjOwogIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7Cn0KLnBpcC1jb21wYXJpc29uLWNhcmQgdWwgewogIHBhZGRpbmctbGVmdDogMThweCAhaW1wb3J0YW50OwogIG1hcmdpbjogMTBweCAwIDA7CiAgZm9udC1zaXplOiAwLjlyZW07CiAgbGlzdC1zdHlsZS10eXBlOiBkaXNjICFpbXBvcnRhbnQ7Cn0KLnBpcC1jb21wYXJpc29uLWNhcmQgbGkgewogIG1hcmdpbi1ib3R0b206IDZweDsKICBsaXN0LXN0eWxlLXR5cGU6IGRpc2MgIWltcG9ydGFudDsKICBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7Cn0KLnBpcC1jb21wYXJpc29uLWNhcmQgbGk6OmJlZm9yZSB7CiAgY29udGVudDogbm9uZSAhaW1wb3J0YW50Owp9Ci5waXAtY29tcGFyaXNvbi1ib3R0b20gewogIG1hcmdpbi10b3A6IDE0cHg7CiAgcGFkZGluZzogMTJweCAxNnB4OwogIGJhY2tncm91bmQ6ICNlYWYwZjc7CiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjMWIzYTVjOwogIGJvcmRlci1yYWRpdXM6IDAgNnB4IDZweCAwOwogIGZvbnQtc2l6ZTogMC45cmVtOwp9Ci8qIC0tLS0tLS0tLS0gTElHSFRCT1ggLS0tLS0tLS0tLSAqLwoucGlwLWxpZ2h0Ym94LW92ZXJsYXkgewogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDA7CiAgbGVmdDogMDsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjg1KTsKICB6LWluZGV4OiAxMDAwMDA7CiAgZGlzcGxheTogbm9uZTsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmc6IDMwcHg7CiAgY3Vyc29yOiB6b29tLW91dDsKfQoucGlwLWxpZ2h0Ym94LW92ZXJsYXkub3BlbiB7CiAgZGlzcGxheTogZmxleDsKfQoucGlwLWxpZ2h0Ym94LW92ZXJsYXkgaW1nIHsKICBtYXgtd2lkdGg6IDk1JTsKICBtYXgtaGVpZ2h0OiA5MHZoOwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBib3gtc2hhZG93OiAwIDhweCA0MHB4IHJnYmEoMCwwLDAsMC41KTsKfQoucGlwLWxpZ2h0Ym94LWNsb3NlIHsKICBwb3NpdGlvbjogZml4ZWQ7CiAgdG9wOiAyMHB4OwogIHJpZ2h0OiAyOHB4OwogIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgIWltcG9ydGFudDsKICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogIGZvbnQtc2l6ZTogMnJlbTsKICB3aWR0aDogNDhweDsKICBoZWlnaHQ6IDQ4cHg7CiAgYm9yZGVyLXJhZGl1czogNTAlOwogIGN1cnNvcjogcG9pbnRlcjsKICB6LWluZGV4OiAxMDAwMDE7CiAgZGlzcGxheTogbm9uZTsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7Cn0KLnBpcC1saWdodGJveC1jbG9zZTpob3ZlciB7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjMpICFpbXBvcnRhbnQ7Cn0KLnBpcC1saWdodGJveC1vdmVybGF5Lm9wZW4gKyAucGlwLWxpZ2h0Ym94LWNsb3NlLAoucGlwLWxpZ2h0Ym94LWNsb3NlLm9wZW4gewogIGRpc3BsYXk6IGZsZXg7Cn0KCi8qIC0tLS0tLS0tLS0gQU5JTUFUSU9OUyAtLS0tLS0tLS0tICovCkBrZXlmcmFtZXMgcGlwRmFkZUluIHsKICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH0KICB0byB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfQp9CgovKiAtLS0tLS0tLS0tIFJFU1BPTlNJVkUgLS0tLS0tLS0tLSAqLwpAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAucGlwLWNvbXBhcmlzb24tZ3JpZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICB9CiAgLnBpcC13aXphcmQtYm9keSB7CiAgICBwYWRkaW5nOiAyMnB4OwogIH0KICAucGlwLXRhYi1idG4gewogICAgcGFkZGluZzogMTFweCAxOHB4OwogICAgZm9udC1zaXplOiAwLjg1cmVtOwogIH0KfQpAbWVkaWEgKG1heC13aWR0aDogNjQwcHgpIHsKICAucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0IHsKICAgIHBhZGRpbmc6IDEycHg7CiAgfQogIC5waXAtaGVyby1ib3ggewogICAgcGFkZGluZzogMjJweCAyMHB4OwogIH0KICAucGlwLWhlcm8tYm94IGgyIHsKICAgIGZvbnQtc2l6ZTogMS4zNXJlbTsKICB9CiAgLnBpcC1oZXJvLWJveCAucGlwLWJ0biB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICB9CiAgLnBpcC13aXphcmQtYm9keSB7CiAgICBwYWRkaW5nOiAyMHB4OwogIH0KICAucGlwLXdpemFyZC1mb290ZXIgewogICAgcGFkZGluZzogMTRweCAxOHB4OwogIH0KICAucGlwLXN0ZXAtZG90cyB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KICAucGlwLXRhYi1idG4gewogICAgcGFkZGluZzogMTBweCAxNHB4OwogICAgZm9udC1zaXplOiAwLjhyZW07CiAgfQogIC5waXAtdGFicy1uYXYgewogICAgb3ZlcmZsb3cteDogYXV0bzsKICB9Cn0=
LyogLS0tLS0tLS0tLSBERUNJU0lPTiBUT09MIC0tLS0tLS0tLS0gKi8KZnVuY3Rpb24gcmVzZXREZWNpc2lvblRvb2woKSB7CiAgdmFyIHN0ZXBzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlY2lzaW9uVG9vbCAucGlwLWRlY2lzaW9uLXN0ZXAnKTsKICB2YXIgcmVzdWx0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNkZWNpc2lvblRvb2wgLnBpcC1kZWNpc2lvbi1yZXN1bHQnKTsKICB2YXIgYnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNkZWNpc2lvblRvb2wgLnBpcC1kZWNpc2lvbi1idG4nKTsKICBzdGVwcy5mb3JFYWNoKGZ1bmN0aW9uKHMsIGkpIHsgcy5zdHlsZS5kaXNwbGF5ID0gaSA9PT0gMCA/ICdibG9jaycgOiAnbm9uZSc7IH0pOwogIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbihyKSB7IHIuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyB9KTsKICBidG5zLmZvckVhY2goZnVuY3Rpb24oYikgeyBiLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7IH0pOwp9Cgpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVjaXNpb25Ub29sIC5waXAtZGVjaXNpb24tYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHsKICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgIHZhciBuZXh0ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmV4dCcpOwogICAgdmFyIGN1cnJlbnRTdGVwID0gdGhpcy5jbG9zZXN0KCcucGlwLWRlY2lzaW9uLXN0ZXAnKTsKICAgIC8vIGhpZ2hsaWdodAogICAgY3VycmVudFN0ZXAucXVlcnlTZWxlY3RvckFsbCgnLnBpcC1kZWNpc2lvbi1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGIpIHsgYi5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpOyB9KTsKICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsKCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICBjdXJyZW50U3RlcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBpZiAobmV4dC5zdGFydHNXaXRoKCdyZXN1bHQtJykpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuZXh0KS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlY2lzaW9uVG9vbCAucGlwLWRlY2lzaW9uLXN0ZXBbZGF0YS1zdGVwPSInICsgbmV4dCArICciXScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICB9CiAgICB9LCAyMDApOwogIH0pOwp9KTsKCi8qIC0tLS0tLS0tLS0gREVDSVNJT04gVE9PTCBSRVNUQVJUIChldmVudCBkZWxlZ2F0aW9uKSAtLS0tLS0tLS0tICovCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWNpc2lvblRvb2wnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwaXAtZGVjaXNpb24tcmVzdGFydCcpKSB7CiAgICByZXNldERlY2lzaW9uVG9vbCgpOwogIH0KfSk7CgovKiAtLS0tLS0tLS0tIENIRUNLTElTVCAoZXZlbnQgZGVsZWdhdGlvbikgLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiB0b2dnbGVDaGVjayhsaSkgewogIGxpLmNsYXNzTGlzdC50b2dnbGUoJ2NoZWNrZWQnKTsKICB2YXIgaXNDaGVja2VkID0gbGkuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2VkJyk7CiAgbGkuc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCBpc0NoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICB2YXIgdG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2hlY2tsaXN0IGxpJykubGVuZ3RoOwogIHZhciBjaGVja2VkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NoZWNrbGlzdCBsaS5jaGVja2VkJykubGVuZ3RoOwogIHZhciByZWFkeUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrbGlzdFJlYWR5Jyk7CiAgaWYgKGNoZWNrZWQgPT09IHRvdGFsKSB7CiAgICByZWFkeUVsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsKICB9IGVsc2UgewogICAgcmVhZHlFbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7CiAgfQp9Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hlY2tsaXN0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgdmFyIGxpID0gZS50YXJnZXQuY2xvc2VzdCgnbGknKTsKICBpZiAobGkpIHRvZ2dsZUNoZWNrKGxpKTsKfSk7Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hlY2tsaXN0JykuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsKICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykgewogICAgdmFyIGxpID0gZS50YXJnZXQuY2xvc2VzdCgnbGknKTsKICAgIGlmIChsaSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRvZ2dsZUNoZWNrKGxpKTsKICAgIH0KICB9Cn0pOwoKLyogLS0tLS0tLS0tLSBTVEVQIFdJWkFSRCAtLS0tLS0tLS0tICovCnZhciB3aXphcmRDdXJyZW50ID0gMTsKdmFyIHdpemFyZFRvdGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3dpemFyZEJvZHkgLnBpcC1zdGVwJykubGVuZ3RoOwoKLy8gQnVpbGQgZG90cwooZnVuY3Rpb24oKSB7CiAgdmFyIGRvdHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2l6YXJkRG90cycpOwogIGZvciAodmFyIGkgPSAxOyBpIDw9IHdpemFyZFRvdGFsOyBpKyspIHsKICAgIHZhciBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGRvdC5jbGFzc05hbWUgPSAncGlwLXN0ZXAtZG90JyArIChpID09PSAxID8gJyBhY3RpdmUnIDogJycpOwogICAgZG90LnNldEF0dHJpYnV0ZSgnZGF0YS1zdGVwJywgaSk7CiAgICBkb3Quc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0dvIHRvIHN0ZXAgJyArIGkpOwogICAgZG90LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnR28gdG8gc3RlcCAnICsgaSk7CiAgICBkb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgZ29Ub1N0ZXAocGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RlcCcpKSk7CiAgICB9KTsKICAgIGRvdHNDb250YWluZXIuYXBwZW5kQ2hpbGQoZG90KTsKICB9Cn0pKCk7CgpmdW5jdGlvbiBnb1RvU3RlcChuKSB7CiAgaWYgKG4gPCAxIHx8IG4gPiB3aXphcmRUb3RhbCkgcmV0dXJuOwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN3aXphcmRCb2R5IC5waXAtc3RlcCcpLmZvckVhY2goZnVuY3Rpb24ocykgeyBzLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOyB9KTsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjd2l6YXJkQm9keSAucGlwLXN0ZXBbZGF0YS1zdGVwPSInICsgbiArICciXScpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogIHdpemFyZEN1cnJlbnQgPSBuOwogIHVwZGF0ZVdpemFyZFVJKCk7Cn0KCmZ1bmN0aW9uIHdpemFyZE5hdihkaXIpIHsKICBnb1RvU3RlcCh3aXphcmRDdXJyZW50ICsgZGlyKTsKfQoKZnVuY3Rpb24gdXBkYXRlV2l6YXJkVUkoKSB7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dpemFyZEluZGljYXRvcicpLnRleHRDb250ZW50ID0gJ1N0ZXAgJyArIHdpemFyZEN1cnJlbnQgKyAnIG9mICcgKyB3aXphcmRUb3RhbDsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2l6YXJkUHJvZ3Jlc3MnKS5zdHlsZS53aWR0aCA9ICgod2l6YXJkQ3VycmVudCAvIHdpemFyZFRvdGFsKSAqIDEwMCkgKyAnJSc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dpemFyZFByZXYnKS5kaXNhYmxlZCA9IHdpemFyZEN1cnJlbnQgPT09IDE7CiAgdmFyIG5leHRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2l6YXJkTmV4dCcpOwogIG5leHRCdG4udGV4dENvbnRlbnQgPSB3aXphcmRDdXJyZW50ID09PSB3aXphcmRUb3RhbCA/ICdWaXNpdCBGbG9yaWRhIENyYXNoIFBvcnRhbCBcdTIxOTInIDogJ05leHQgXHUyMTkyJzsKICAvLyBVcGRhdGUgZG90cwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waXAtc3RlcC1kb3QnKS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsKICAgIHZhciBzID0gcGFyc2VJbnQoZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RlcCcpKTsKICAgIGQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJywgJ2NvbXBsZXRlZCcpOwogICAgaWYgKHMgPT09IHdpemFyZEN1cnJlbnQpIGQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICBlbHNlIGlmIChzIDwgd2l6YXJkQ3VycmVudCkgZC5jbGFzc0xpc3QuYWRkKCdjb21wbGV0ZWQnKTsKICB9KTsKfQoKLyogLS0tLS0tLS0tLSBXSVpBUkQgTkFWIChldmVudCBkZWxlZ2F0aW9uKSAtLS0tLS0tLS0tICovCmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5waXAtd2l6YXJkLWZvb3RlcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogIHZhciBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcucGlwLW5hdi1idG4tcHJldicpOwogIGlmIChidG4gJiYgIWJ0bi5kaXNhYmxlZCkgewogICAgd2l6YXJkTmF2KC0xKTsKICAgIHJldHVybjsKICB9CiAgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLnBpcC1uYXYtYnRuLW5leHQnKTsKICBpZiAoYnRuKSB7CiAgICBpZiAod2l6YXJkQ3VycmVudCA9PT0gd2l6YXJkVG90YWwpIHsKICAgICAgd2luZG93Lm9wZW4oJ2h0dHBzOi8vc2VydmljZXMuZmxoc212Lmdvdi9DcmFzaFJlcG9ydFB1cmNoYXNpbmcvJywgJ19ibGFuaycpOwogICAgfSBlbHNlIHsKICAgICAgd2l6YXJkTmF2KDEpOwogICAgfQogIH0KfSk7CgovKiAtLS0tLS0tLS0tIFdJWkFSRCBLRVlCT0FSRCBOQVYgLS0tLS0tLS0tLSAqLwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogIHZhciB3aXphcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2l6YXJkJyk7CiAgaWYgKCF3aXphcmQpIHJldHVybjsKICB2YXIgaGFzRm9jdXMgPSB3aXphcmQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7CiAgaWYgKCFoYXNGb2N1cykgcmV0dXJuOwogIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHsKICAgIHdpemFyZE5hdigtMSk7CiAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7CiAgICBpZiAod2l6YXJkQ3VycmVudCA9PT0gd2l6YXJkVG90YWwpIHJldHVybjsKICAgIHdpemFyZE5hdigxKTsKICB9Cn0pOwoKLyogLS0tLS0tLS0tLSBUQUJTIChldmVudCBkZWxlZ2F0aW9uKSAtLS0tLS0tLS0tICovCmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5waXAtdGFicy1uYXYnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICB2YXIgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLnBpcC10YWItYnRuJyk7CiAgaWYgKCFidG4pIHJldHVybjsKICB2YXIgcGFuZWxJZCA9IGJ0bi5nZXRBdHRyaWJ1dGUoJ2FyaWEtY29udHJvbHMnKTsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGlwLXRhYi1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGIpIHsKICAgIGIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICBiLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICdmYWxzZScpOwogIH0pOwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waXAtdGFiLXBhbmVsJykuZm9yRWFjaChmdW5jdGlvbihwKSB7IHAuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7IH0pOwogIGJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ3RydWUnKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYW5lbElkKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKfSk7CgovKiAtLS0tLS0tLS0tIEFDQ09SRElPTiAoZXZlbnQgZGVsZWdhdGlvbikgLS0tLS0tLS0tLSAqLwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGlwLWFjY29yZGlvbicpLmZvckVhY2goZnVuY3Rpb24oYWNjb3JkaW9uKSB7CiAgYWNjb3JkaW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgdmFyIGhlYWRlciA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5waXAtYWNjb3JkaW9uLWhlYWRlcicpOwogICAgaWYgKCFoZWFkZXIpIHJldHVybjsKICAgIHZhciBpdGVtID0gaGVhZGVyLnBhcmVudEVsZW1lbnQ7CiAgICB2YXIgYm9keSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLnBpcC1hY2NvcmRpb24tYm9keScpOwogICAgdmFyIGlzT3BlbiA9IGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJyk7CgogICAgLy8gQ2xvc2UgYWxsIGl0ZW1zIHdpdGhpbiB0aGlzIGFjY29yZGlvbiBvbmx5CiAgICBhY2NvcmRpb24ucXVlcnlTZWxlY3RvckFsbCgnLnBpcC1hY2NvcmRpb24taXRlbScpLmZvckVhY2goZnVuY3Rpb24oYWkpIHsKICAgICAgYWkuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgICBhaS5xdWVyeVNlbGVjdG9yKCcucGlwLWFjY29yZGlvbi1ib2R5Jykuc3R5bGUubWF4SGVpZ2h0ID0gbnVsbDsKICAgICAgYWkucXVlcnlTZWxlY3RvcignLnBpcC1hY2NvcmRpb24taGVhZGVyJykuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7CiAgICB9KTsKCiAgICBpZiAoIWlzT3BlbikgewogICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsKICAgICAgYm9keS5zdHlsZS5tYXhIZWlnaHQgPSBib2R5LnNjcm9sbEhlaWdodCArICdweCc7CiAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpOwogICAgfQogIH0pOwp9KTsKCi8qIC0tLS0tLS0tLS0gTElHSFRCT1ggLS0tLS0tLS0tLSAqLwpmdW5jdGlvbiBvcGVuTGlnaHRib3god3JhcHBlcikgewogIHZhciBpbWdTcmMgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpLnNyYzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hJbWcnKS5zcmMgPSBpbWdTcmM7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpZ2h0Ym94T3ZlcmxheScpLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hDbG9zZScpLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsKICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb3NwZXItaW50ZXJhY3RpdmUtcG9zdCcpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWdodGJveENsb3NlJykuZm9jdXMoKTsKfQoKZnVuY3Rpb24gY2xvc2VMaWdodGJveCgpIHsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hPdmVybGF5JykuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWdodGJveENsb3NlJykuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0JykucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpOwp9CgovKiBMaWdodGJveCBldmVudCBkZWxlZ2F0aW9uIG9uIC5wcm9zcGVyLWludGVyYWN0aXZlLXBvc3QgZm9yIGltZyB3cmFwcGVyIGNsaWNrcyAqLwpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvc3Blci1pbnRlcmFjdGl2ZS1wb3N0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgdmFyIHdyYXBwZXIgPSBlLnRhcmdldC5jbG9zZXN0KCcucGlwLXN0ZXAtaW1nLXdyYXBwZXInKTsKICBpZiAod3JhcHBlcikgb3BlbkxpZ2h0Ym94KHdyYXBwZXIpOwp9KTsKCi8qIExpZ2h0Ym94IG92ZXJsYXkgYW5kIGNsb3NlIGJ1dHRvbiAqLwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hPdmVybGF5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICBjbG9zZUxpZ2h0Ym94KCk7Cn0pOwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlnaHRib3hDbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgY2xvc2VMaWdodGJveCgpOwp9KTsKCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7CiAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xvc2VMaWdodGJveCgpOwp9KTs=