Burn Surface Area Calculator – Estimate TBSA Quickly

 

When a person gets burned, doctors must quickly understand how much of the body is affected. This is important because the size of the burn helps decide the type of treatment, the amount of fluids needed, and how serious the injury is.

The measurement used for this purpose is called Total Body Surface Area (TBSA). It shows the percentage of the body that has been burned.

A Burn Surface Area Calculator makes this process fast and easy. Instead of guessing or using paper charts, healthcare workers can select the burned body parts, and the calculator gives the TBSA percentage instantly.

This guide explains what burn surface area is, how the calculator works, the methods used, and how to estimate burn size step by step.

What the Burn Surface Area Calculator Is

A Burn Surface Area Calculator is a medical tool that estimates the percentage of the body affected by burns. It uses standard medical rules like the Rule of Nines and the Lund & Browder chart.

This calculator is used by:

  • Doctors

  • Nurses

  • Emergency responders

  • Medical students

  • First aid trainers

It helps them make quick and accurate decisions in burn treatment.

How the Burn Surface Area Calculator Works

The calculator divides the human body into different regions. Each region represents a certain percentage of the total body surface.

Related Calculator:  Window Area Calculator | Window & Door Sizing Calculator

When you select the burned areas, the calculator adds the percentages together to give the total burned surface area.

Common Inputs

Most burn surface area calculators ask for:

  • Burned body parts (head, arms, legs, chest, back, etc.)

  • Patient age (adult or child)

  • Sometimes burn depth (optional)

Output Results

The calculator shows:

  • TBSA percentage

  • Sometimes estimated burned area in square meters

This helps guide treatment decisions.

Key Methods Used

Rule of Nines (Adults)

The adult body is divided into sections:

  • Head and neck: 9%

  • Each arm: 9%

  • Front of torso: 18%

  • Back of torso: 18%

  • Each leg: 18%

  • Genital area: 1%

To calculate TBSA:

\text{TBSA %} = 9 + 9 + 18 + \dots

This method is quick and easy.

Lund & Browder Chart (Children)

Children have different body proportions. Their heads are larger compared to adults.

The Lund & Browder chart adjusts percentages based on age. It gives more accurate results for infants and children.

Converting % to Actual Area

If Body Surface Area (BSA) is known:

\text{Burned Area} = \text{TBSA %} \times \text{BSA}

Where BSA can be calculated as:

BSA = \sqrt{\frac{Height \times Weight}{3600}}

Step-by-Step Examples

Example 1: Adult Burn

Burned areas:

  • Right arm (9%)

  • Front torso (18%)

\text{TBSA} = 9 + 18 = 27%

Example 2: Child Burn

Burned areas:

  • Head

  • Left leg

Related Calculator:  Flat Area Calculator – Find the Area of Any Flat Surface

Using Lund & Browder chart, the calculator gives:

\text{TBSA} = 22%

Example 3: Convert to Area

If BSA = 1.8 m² and TBSA = 30%

\text{Burned Area} = 0.30 \times 1.8 = 0.54 \text{ m}^2

Features of a Burn Surface Area Calculator

Fast Assessment

Gives instant results.

Medical Accuracy

Uses standard burn charts.

Child & Adult Support

Adjusts for age.

Easy Interface

Simple body selection.

Helpful for Emergencies

Supports quick decisions.

Uses and Applications

Burn surface area calculators are very important in emergency medicine. Doctors use TBSA to decide how much IV fluid a patient needs. Large burns require more fluids to prevent shock.

In hospital burn units, TBSA helps classify burns as minor, moderate, or severe. This guides treatment plans, surgery decisions, and patient monitoring.

Medical students and nurses also use burn calculators for training. It helps them learn how to assess burns accurately.

Helpful Tips

Identify All Burned Areas

Check both front and back.

Use Correct Age Group

Children need special charts.

Do Not Guess

Always calculate properly.

Consider Burn Depth

Deep burns need urgent care.

Common Mistakes

Using Adult Rules for Children

This causes errors.

Forgetting Small Areas

Every percent matters.

Estimating by Eye

Always use the calculator.

Ignoring Back or Sides

Check the whole body.

Related Calculator:  Area of Enclosed Region Calculator – Find the Area Inside Curved Boundaries

FAQs

What is TBSA?

It is the percent of body burned.

Why is TBSA important?

It guides treatment.

Is the Rule of Nines accurate?

Yes, for adults.

What about children?

Use Lund & Browder chart.

Is the calculator reliable?

Yes, with correct inputs.

Final Words

A Burn Surface Area Calculator is a life-saving medical tool. It helps healthcare workers measure burns quickly and accurately.

By understanding TBSA and using the right methods, doctors can give better treatment, improve recovery, and save lives.

Similar Posts

  • Heat Exchanger Area Calculator — Find Required Heat Transfer Surface

    Heat Exchanger Area Calculator HE Area Calculator Design using LMTD Method Counter-Flow Parallel-Flow Temperatures (°C) Hot Inlet ($T_{h,in}$) Hot Outlet ($T_{h,out}$) Cold Inlet ($T_{c,in}$) Cold Outlet ($T_{c,out}$) Design Parameters Heat Duty ($Q$) (kW) Design U-Value ($W/m^2K$) LMTD — °C Required Area — $m^2$ Heat Duty — kW $\Delta T_1$: —, $\Delta T_2$: — Formula: $Area…

  • Cylinder Surface Area Calculator — Total & Lateral Area Tool

    Cylinder Surface Area Calculator Cylinder Calculator Surface Area, Volume for Tanks & Pipes. Calculation Mode Standard Open Tank Hollow Pipe Radius / Diameter Radius (r) Diameter (d) inftcmm Inner Dimension (Thickness handled by Radius diff) Height (h) Total Surface Area — sq in Lateral Area — sq in Base Area — sq in Volume —…

  • Area of Definite Integral Calculator – Calculate Area Under the Curve Easily

    // Base64 Content var b64 = “PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KCjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgPHRpdGxlPkRlZmluaXRlIEludGVncmFsIENhbGN1bGF0b3I8L3RpdGxlPgogICAgPHN0eWxlPgogICAgICAgIDpyb290IHsKICAgICAgICAgICAgLS1wcmltYXJ5OiAjMTk2N2QyOwogICAgICAgICAgICAtLXByaW1hcnktbGlnaHQ6ICNlOGYwZmU7CiAgICAgICAgICAgIC0tc3VjY2Vzcy1jb2xvcjogIzM0YTg1MzsKICAgICAgICAgICAgLyogR3JlZW4gZm9yIFBvc2l0aXZlIEFyZWEgKi8KICAgICAgICAgICAgLS1kYW5nZXItY29sb3I6ICNlYTQzMzU7CiAgICAgICAgICAgIC8qIFJlZCBmb3IgTmVnYXRpdmUgQXJlYSAqLwogICAgICAgICAgICAtLXRleHQtbWFpbjogIzIwMjEyNDsKICAgICAgICAgICAgLS10ZXh0LXN1YjogIzVmNjM2ODsKICAgICAgICAgICAgLS1iZy1jb2xvcjogI2Y4ZjlmYTsKICAgICAgICAgICAgLS1jYXJkLWJnOiAjZmZmZmZmOwogICAgICAgICAgICAtLWJvcmRlcjogI2RhZGNlMDsKICAgICAgICB9CgogICAgICAgICogewogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsIFRpbWVzLCBzZXJpZjsKICAgICAgICAgICAgLyogTWF0aC1saWtlIGZvbnQgZm9yIGZvcm11bGFzICovCiAgICAgICAgfQoKICAgICAgICBib2R5IHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmctY29sb3IpOwogICAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICAgICAgLyogVUkgZm9udCAqLwogICAgICAgIH0KCiAgICAgICAgLmNhbGMtd3JhcHBlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIG1heC13aWR0aDogODAwcHg7CiAgICAgICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgIGdhcDogMzBweDsKICAgICAgICB9CgogICAgICAgIGgyIHsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS10ZXh0LW1haW4pOwogICAgICAgICAgICBmb250LWZhbWlseTogJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB9CgogICAgICAgIC5kZXNjIHsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBjb2xvcjogdmFyKC0tdGV4dC1zdWIpOwogICAgICAgICAgICBmb250LXNpemU6IDAuOTVyZW07CiAgICAgICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjVweDsKICAgICAgICB9CgogICAgICAgIC8qIEZvcm11bGEgSW5wdXQgQXJlYSAqLwogICAgICAgIC5mb3JtdWxhLWNvbnRhaW5lciB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMS41cmVtOwogICAgICAgIH0KCiAgICAgICAgLmludGVncmFsLXN5bWJvbCB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogNHJlbTsKICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS10ZXh0LW1haW4pOwogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTVweDsKICAgICAgICB9CgogICAgICAgIC5saW1pdHMtY29sIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAtMjVweDsKICAgICAgICAgICAgLyogUHVsbCBjbG9zZXIgdG8gaW50ZWdyYWwgc3ltYm9sICovCiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTVweDsKICAgICAgICAgICAgei1pbmRleDogMTsKICAgICAgICB9CgogICAgICAgIC5saW1pdC1pbnB1dCB7CiAgICAgICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC45cmVtOwogICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7CiAgICAgICAgfQoKICAgICAgICAubGltaXQtaW5wdXQ6Zm9jdXMgewogICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXByaW1hcnkpOwogICAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIH0KCiAgICAgICAgLmZ1bmN0aW9uLWdyb3VwIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgZ2FwOiAxMHB4OwogICAgICAgIH0KCiAgICAgICAgLmZ1bmMtaW5wdXQgewogICAgICAgICAgICB3aWR0aDogMjUwcHg7CiAgICAgICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICAgICAgZm9udC1zaXplOiAxLjJyZW07CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgICAgICB9CgogICAgICAgIC5mdW5jLWlucHV0OmZvY3VzIHsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5KTsKICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICB9CgogICAgICAgIC5keC1sYWJlbCB7CiAgICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgICAgICB9CgogICAgICAgIC8qIENvbnRyb2xzICovCiAgICAgICAgLmNvbnRyb2xzIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICAgIGdhcDogMTVweDsKICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIH0KCiAgICAgICAgLmJ0biB7CiAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgICAgcGFkZGluZzogMTBweCAyNHB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4OwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMXJlbTsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7CiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICAgIH0KCiAgICAgICAgLmJ0bi1wcmltYXJ5IHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcHJpbWFyeSk7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICB9CgogICAgICAgIC5idG4tcHJpbWFyeTpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxNTU3YjA7CiAgICAgICAgfQoKICAgICAgICAuYnRuLW91dGxpbmUgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgICAgICAgICAgY29sb3I6IHZhcigtLXRleHQtc3ViKTsKICAgICAgICB9CgogICAgICAgIC5idG4tb3V0bGluZTpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmMWYzZjQ7CiAgICAgICAgfQoKICAgICAgICAuaW5mLWJ0biB7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBzZXJpZjsKICAgICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgICAgICBmb250LXNpemU6IDEuMnJlbTsKICAgICAgICB9CgogICAgICAgIC8qIEdyYXBoICovCiAgICAgICAgLmdyYXBoLWFyZWEgewogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgfQoKICAgICAgICAubGVnZW5kIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICAgIGdhcDogMjBweDsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjlyZW07CiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS10ZXh0LXN1Yik7CiAgICAgICAgfQoKICAgICAgICAubGVnZW5kLWl0ZW0gewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBnYXA6IDVweDsKICAgICAgICB9CgogICAgICAgIC5kb3QgewogICAgICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICAgICAgaGVpZ2h0OiAxMHB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgfQoKICAgICAgICAvKiBPdXRwdXQgKi8KICAgICAgICAucmVzdWx0LXBhbmVsIHsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWxpZ2h0KTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgICAgICAvKiBIaWRkZW4gaW5pdGlhbCAqLwogICAgICAgIH0KCiAgICAgICAgLnJlc3VsdC1wYW5lbC5zaG93IHsKICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgIGFuaW1hdGlvbjogZmFkZVVwIDAuNHM7CiAgICAgICAgfQoKICAgICAgICAubWFpbi1hbnMgewogICAgICAgICAgICBmb250LXNpemU6IDIuNXJlbTsKICAgICAgICAgICAgY29sb3I6IHZhcigtLXByaW1hcnkpOwogICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICAgICAgbWFyZ2luOiAxMHB4IDA7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJywgc2VyaWY7CiAgICAgICAgfQoKICAgICAgICAuc3ViLWFucyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgICBnYXA6IDMwcHg7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC45cmVtOwogICAgICAgICAgICBjb2xvcjogdmFyKC0tdGV4dC1tYWluKTsKICAgICAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgICB9CgogICAgICAgIC5zdWItYm94IHN0cm9uZyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICAgICAgfQoKICAgICAgICAuZXJyb3ItbXNnIHsKICAgICAgICAgICAgY29sb3I6ICNkOTMwMjU7CiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CgogICAgICAgIEBrZXlmcmFtZXMgZmFkZVVwIHsKICAgICAgICAgICAgZnJvbSB7CiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwcHgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0byB7CiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgICAgICAgLmZvcm11bGEtY29udGFpbmVyIHsKICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgICAgICBwYWRkaW5nOiAzMHB4IDEwcHg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC5saW1pdHMtY29sIHsKICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgIG1hcmdpbjogMTBweCAwOwogICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1ldmVubHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC5pbnRlZ3JhbC1zeW1ib2wgewogICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogSGlkZSBjb21wbGljYXRlZCBzeW1ib2wgb24gdGlueSBzY3JlZW5zLCBmYWxsYmFjayBsYXlvdXQgKi8KICAgICAgICAgICAgLmZvcm11bGEtY29udGFpbmVyOjpiZWZvcmUgewogICAgICAgICAgICAgICAgY29udGVudDogIkludCBmcm9tIGEgdG8gYiBvZjoiOwogICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgICAgICAgICAgZm9udC1zaXplOiAxcmVtOwogICAgICAgICAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgICAgICAgICAgICBmb250LWZhbWlseTogJ1NlZ29lIFVJJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLmZ1bmMtaW5wdXQgewogICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cgo8Ym9keT4KCiAgICA8ZGl2IGNsYXNzPSJjYWxjLXdyYXBwZXIiPgogICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+CiAgICAgICAgICAgIDxoMj5EZWZpbml0ZSBJbnRlZ3JhbCBDYWxjdWxhdG9yPC9oMj4KICAgICAgICAgICAgPHAgY2xhc3M9ImRlc2MiPkNhbGN1bGF0ZSB0aGUgbmV0IHNpZ25lZCBhcmVhICgkXGludCBmKHgpZHgkKSB3aXRoIGltcHJvcGVyIGludGVncmFsIHN1cHBvcnQuPC9wPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIEZvcm11bGEgVUkgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9ybXVsYS1jb250YWluZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnRlZ3JhbC1zeW1ib2wiPuKIqzwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW1pdHMtY29sIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0ibGltaXQtaW5wdXQiIGlkPSJsaW1pdF9iIiBwbGFjZWhvbGRlcj0iYiIgdmFsdWU9IjIiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJsaW1pdC1pbnB1dCIgaWQ9ImxpbWl0X2EiIHBsYWNlaG9sZGVyPSJhIiB2YWx1ZT0iLTEiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZnVuY3Rpb24tZ3JvdXAiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmdW5jLWlucHV0IiBpZD0iZnVuYyIgdmFsdWU9InheMyIgcGxhY2Vob2xkZXI9ImYoeCkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImR4LWxhYmVsIj5keCA9IDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lIGluZi1idG4iIG9uY2xpY2s9InNldExpbWl0KCdsaW1pdF9hJywgJy1pbmYnKSI+LeKInjwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUgaW5mLWJ0biIgb25jbGljaz0ic2V0TGltaXQoJ2xpbWl0X2InLCAnaW5mJykiPuKInjwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUiIG9uY2xpY2s9InNldEZ1bmMoJ3Npbih4KScpIj5zaW4oeCk8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lIiBvbmNsaWNrPSJzZXRGdW5jKCcxL3heMicpIj4xL3jCsjwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG9uY2xpY2s9ImNhbGN1bGF0ZSgpIj5DYWxjdWxhdGUgSW50ZWdyYWw8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItbXNnIiBpZD0iZXJyb3JfbXNnIj48L2Rpdj4KCiAgICAgICAgPCEtLSBWaXN1YWxpemF0aW9uIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImdyYXBoLWFyZWEiPgogICAgICAgICAgICA8Y2FudmFzIGlkPSJwbG90Q2FudmFzIj48L2NhbnZhcz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtaXRlbSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb3QiIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLXN1Y2Nlc3MtY29sb3IpOyBvcGFjaXR5OjAuMyI+PC9kaXY+IFBvc2l0aXZlIEFyZWEKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1pdGVtIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvdCIgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tZGFuZ2VyLWNvbG9yKTsgb3BhY2l0eTowLjMiPjwvZGl2PiBOZWdhdGl2ZSBBcmVhCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtaXRlbSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb3QiIHN0eWxlPSJiYWNrZ3JvdW5kOiMwMDA7IGhlaWdodDoycHg7Ij48L2Rpdj4gQXhpcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPCEtLSBSZXN1bHRzIC0tPgogICAgICAgIDxkaXYgY2xhc3M9InJlc3VsdC1wYW5lbCIgaWQ9InJlc3VsdF9wYW5lbCI+CiAgICAgICAgICAgIDxkaXY+UmVzdWx0IChOZXQgU2lnbmVkIEFyZWEpOjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYWluLWFucyIgaWQ9Im1haW5fcmVzdWx0Ij4tLTwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWFucyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItYm94Ij4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPkdlb21ldHJpYyBBcmVhPC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9Imdlb19hcmVhIj4tLTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MC44ZW07IGNvbG9yOiM2NjYiPihUb3RhbCBhcmVhIHNoYWRlZCk8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWJveCI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5WaXN1YWwgSW50ZXJwcmV0YXRpb248L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0idmlzdWFsX2Rlc2MiPi0tPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgICAvKiAtLS0gTWF0aCBMb2dpYyAtLS0gKi8KICAgICAgICAvLyBBU1QtYmFzZWQgUGFyc2VyIHRvIGF2b2lkICduZXcgRnVuY3Rpb24nIG9yICdldmFsJyAoRmlyZWZveC9TZWN1cml0eSBzYWZlKQogICAgICAgIGNvbnN0IE1hdGhFbmdpbmUgPSAoKCkgPT4gewogICAgICAgICAgICBjb25zdCBUb2tlbiA9IHsgTnVtYmVyOiAxLCBJZGVudGlmaWVyOiAyLCBPcGVyYXRvcjogMywgTFBhcmVuOiA0LCBSUGFyZW46IDUsIEVPRjogNiB9OwoKICAgICAgICAgICAgZnVuY3Rpb24gdG9rZW5pemUoc3RyKSB7CiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbnMgPSBbXTsKICAgICAgICAgICAgICAgIGxldCBpID0gMDsKICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgc3RyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBzdHJbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKC9ccy8udGVzdChjaGFyKSkgeyBpKys7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKC9bMC05Ll0vLnRlc3QoY2hhcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IHN0ci5sZW5ndGggJiYgL1swLTkuXS8udGVzdChzdHJbaV0pKSBudW0gKz0gc3RyW2krK107CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW4uTnVtYmVyLCB2YWx1ZTogcGFyc2VGbG9hdChudW0pIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoL1thLXpBLVpdLy50ZXN0KGNoYXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IHN0ci5sZW5ndGggJiYgL1thLXpBLVowLTldLy50ZXN0KHN0cltpXSkpIGlkICs9IHN0cltpKytdOwogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFRva2VuLklkZW50aWZpZXIsIHZhbHVlOiBpZC50b0xvd2VyQ2FzZSgpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWycrJywgJy0nLCAnKicsICcvJywgJ14nXS5pbmNsdWRlcyhjaGFyKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFRva2VuLk9wZXJhdG9yLCB2YWx1ZTogY2hhciB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJygnKSB7IHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW4uTFBhcmVuIH0pOyBpKys7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGFyID09PSAnKScpIHsgdG9rZW5zLnB1c2goeyB0eXBlOiBUb2tlbi5SUGFyZW4gfSk7IGkrKzsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgeyBpKys7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogVG9rZW4uRU9GIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2xhc3MgUGFyc2VyIHsKICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHRva2VucykgeyB0aGlzLnRva2VucyA9IHRva2VuczsgdGhpcy5wb3MgPSAwOyB9CiAgICAgICAgICAgICAgICBwZWVrKCkgeyByZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5wb3NdOyB9CiAgICAgICAgICAgICAgICBjb25zdW1lKCkgeyByZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5wb3MrK107IH0KCiAgICAgICAgICAgICAgICBwYXJzZUV4cHJlc3Npb24oKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgPSB0aGlzLnBhcnNlVGVybSgpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLnBlZWsoKS52YWx1ZSA9PT0gJysnIHx8IHRoaXMucGVlaygpLnZhbHVlID09PSAnLScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3AgPSB0aGlzLmNvbnN1bWUoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLnBhcnNlVGVybSgpOwogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0geyB0eXBlOiAnQmluYXJ5Jywgb3AsIGxlZnQsIHJpZ2h0IH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyc2VUZXJtKCkgewogICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gdGhpcy5wYXJzZUZhY3RvcigpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLnBlZWsoKS52YWx1ZSA9PT0gJyonIHx8IHRoaXMucGVlaygpLnZhbHVlID09PSAnLycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3AgPSB0aGlzLmNvbnN1bWUoKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLnBhcnNlRmFjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSB7IHR5cGU6ICdCaW5hcnknLCBvcCwgbGVmdCwgcmlnaHQgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwYXJzZUZhY3RvcigpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCA9IHRoaXMucGFyc2VCYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGVlaygpLnZhbHVlID09PSAnXicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5wYXJzZUZhY3RvcigpOyAvLyBSaWdodC1hc3NvYyBmb3IgcG93ZXI/IFNpbXBsZSBwYXJzZXI6IGxlZnQtYXNzb2MgdXN1YWxseSwgYnV0IGxldCdzIGRvIGltbWVkaWF0ZSByaWdodCBmb3IgeF4yCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSB7IHR5cGU6ICdCaW5hcnknLCBvcDogJ14nLCBsZWZ0LCByaWdodCB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBhcnNlQmFzZSgpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wZWVrKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQudHlwZSA9PT0gVG9rZW4uTnVtYmVyKSByZXR1cm4geyB0eXBlOiAnTGl0ZXJhbCcsIHZhbHVlOiB0aGlzLmNvbnN1bWUoKS52YWx1ZSB9OwogICAgICAgICAgICAgICAgICAgIGlmICh0LnR5cGUgPT09IFRva2VuLklkZW50aWZpZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY29uc3VtZSgpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wZWVrKCkudHlwZSA9PT0gVG9rZW4uTFBhcmVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdDYWxsJywgbmFtZSwgYXJnIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICd4JykgcmV0dXJuIHsgdHlwZTogJ1ZhcicsIG5hbWU6ICd4JyB9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ3BpJykgcmV0dXJuIHsgdHlwZTogJ0xpdGVyYWwnLCB2YWx1ZTogTWF0aC5QSSB9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2UnKSByZXR1cm4geyB0eXBlOiAnTGl0ZXJhbCcsIHZhbHVlOiBNYXRoLkUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdpbmYnIHx8IG5hbWUgPT09ICdpbmZpbml0eScpIHJldHVybiB7IHR5cGU6ICdMaXRlcmFsJywgdmFsdWU6IEluZmluaXR5IH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdWYXInLCBuYW1lIH07IC8vIEZhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0LnR5cGUgPT09IFRva2VuLkxQYXJlbikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHQudmFsdWUgPT09ICctJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ1VuYXJ5Jywgb3A6ICctJywgYXJnOiB0aGlzLnBhcnNlQmFzZSgpIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdMaXRlcmFsJywgdmFsdWU6IDAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBhcnNlKCkgeyByZXR1cm4gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTsgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBldmFsdWF0ZShub2RlLCB4KSB7CiAgICAgICAgICAgICAgICBpZiAoIW5vZGUpIHJldHVybiAwOwogICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0xpdGVyYWwnKSByZXR1cm4gbm9kZS52YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdWYXInKSByZXR1cm4geDsKICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdCaW5hcnknKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbCA9IGV2YWx1YXRlKG5vZGUubGVmdCwgeCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IGV2YWx1YXRlKG5vZGUucmlnaHQsIHgpOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS5vcCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcrJzogcmV0dXJuIGwgKyByOyBjYXNlICctJzogcmV0dXJuIGwgLSByOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzogcmV0dXJuIGwgKiByOyBjYXNlICcvJzogcmV0dXJuIGwgLyByOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdeJzogcmV0dXJuIE1hdGgucG93KGwsIHIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdVbmFyeScpIHJldHVybiAtZXZhbHVhdGUobm9kZS5hcmcsIHgpOwogICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGwnKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnID0gZXZhbHVhdGUobm9kZS5hcmcsIHgpOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Npbic6IHJldHVybiBNYXRoLnNpbihhcmcpOyBjYXNlICdjb3MnOiByZXR1cm4gTWF0aC5jb3MoYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGFuJzogcmV0dXJuIE1hdGgudGFuKGFyZyk7IGNhc2UgJ3NxcnQnOiByZXR1cm4gTWF0aC5zcXJ0KGFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xvZyc6IHJldHVybiBNYXRoLmxvZzEwKGFyZyk7IGNhc2UgJ2xuJzogcmV0dXJuIE1hdGgubG9nKGFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2V4cCc6IHJldHVybiBNYXRoLmV4cChhcmcpOyBjYXNlICdhYnMnOiByZXR1cm4gTWF0aC5hYnMoYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYXRhbic6IHJldHVybiBNYXRoLmF0YW4oYXJnKTsgY2FzZSAnYXNpbic6IHJldHVybiBNYXRoLmFzaW4oYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNvcyc6IHJldHVybiBNYXRoLmFjb3MoYXJnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGNvbXBpbGU6IChzdHIpID0+IHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZShzdHIudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIodG9rZW5zKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXN0ID0gcGFyc2VyLnBhcnNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoeCkgPT4gZXZhbHVhdGUoYXN0LCB4KTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IHJldHVybiAoeCkgPT4gTmFOOyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZjogKHN0ciwgeCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIE9uZS1zaG90IGV2YWwKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZShzdHIudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIodG9rZW5zKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXN0ID0gcGFyc2VyLnBhcnNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZShhc3QsIHgpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIE5hTjsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0pKCk7CgogICAgICAgIC8qIC0tLSBJbnRlZ3JhdGlvbiBDb3JlIC0tLSAqLwogICAgICAgIC8vIFN0YW5kYXJkIEFkYXB0aXZlIFNpbXBzb24ncwogICAgICAgIGZ1bmN0aW9uIGFkYXB0aXZlU2ltcHNvbnMoZiwgYSwgYiwgZXBzID0gMWUtNikgewogICAgICAgICAgICBjb25zdCBtaWQgPSAoYSArIGIpIC8gMjsKICAgICAgICAgICAgY29uc3QgaCA9IChiIC0gYSkgLyAyOwogICAgICAgICAgICBjb25zdCBmYSA9IGYoYSksIGZiID0gZihiKSwgZm1pZCA9IGYobWlkKTsKICAgICAgICAgICAgY29uc3QgUyA9IChoIC8gMykgKiAoZmEgKyA0ICogZm1pZCArIGZiKTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlY3Vyc2UobCwgciwgZXBzLCBTX3dob2xlLCBkZXB0aCkgewogICAgICAgICAgICAgICAgaWYgKGRlcHRoID4gMTUpIHJldHVybiBTX3dob2xlOwogICAgICAgICAgICAgICAgY29uc3QgbSA9IChsICsgcikgLyAyOwogICAgICAgICAgICAgICAgY29uc3QgaCA9IChyIC0gbCkgLyAyOwogICAgICAgICAgICAgICAgY29uc3QgZmwgPSBmKGwpLCBmciA9IGYociksIGZtID0gZihtKTsKICAgICAgICAgICAgICAgIGNvbnN0IExTID0gKGggLyA2KSAqIChmbCArIDQgKiBmKChsICsgbSkgLyAyKSArIGZtKTsKICAgICAgICAgICAgICAgIGNvbnN0IFJTID0gKGggLyA2KSAqIChmbSArIDQgKiBmKChtICsgcikgLyAyKSArIGZyKTsKCiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoTFMgKyBSUyAtIFNfd2hvbGUpIDw9IDE1ICogZXBzKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBMUyArIFJTICsgKExTICsgUlMgLSBTX3dob2xlKSAvIDE1OwogICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2UobCwgbSwgZXBzIC8gMiwgTFMsIGRlcHRoICsgMSkgKyByZWN1cnNlKG0sIHIsIGVwcyAvIDIsIFJTLCBkZXB0aCArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWN1cnNlKGEsIGIsIGVwcywgUywgMCk7CiAgICAgICAgfQoKICAgICAgICAvKiAtLS0gTWFpbiBDYWxjdWxhdG9yIC0tLSAqLwogICAgICAgIGZ1bmN0aW9uIHNldExpbWl0KGlkLCB2YWwpIHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnZhbHVlID0gdmFsOyB9CiAgICAgICAgZnVuY3Rpb24gc2V0RnVuYyh2YWwpIHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bmMnKS52YWx1ZSA9IHZhbDsgfQoKICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7CiAgICAgICAgICAgIGNvbnN0IGZ1bmNTdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVuYycpLnZhbHVlOwogICAgICAgICAgICBsZXQgYVN0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaW1pdF9hJykudmFsdWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgbGV0IGJTdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGltaXRfYicpLnZhbHVlLnRvTG93ZXJDYXNlKCk7CgogICAgICAgICAgICAvLyBQYXJzZSBsaW1pdHMKICAgICAgICAgICAgY29uc3QgcGFyc2VMaW1pdCA9IChzKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAocy5pbmNsdWRlcygnLWluZicpKSByZXR1cm4gLUluZmluaXR5OwogICAgICAgICAgICAgICAgaWYgKHMuaW5jbHVkZXMoJ2luZicpKSByZXR1cm4gSW5maW5pdHk7CiAgICAgICAgICAgICAgICBpZiAocy5pbmNsdWRlcygncGknKSkgcmV0dXJuIE1hdGguUEkgKiAocGFyc2VGbG9hdChzLnJlcGxhY2UoJ3BpJywgJycpKSB8fCAxKTsKICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHMpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgYSA9IHBhcnNlTGltaXQoYVN0cik7CiAgICAgICAgICAgIGNvbnN0IGIgPSBwYXJzZUxpbWl0KGJTdHIpOwoKICAgICAgICAgICAgY29uc3QgZiA9IE1hdGhFbmdpbmUuY29tcGlsZShmdW5jU3RyKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGYoMSkpKSB7IHNob3dFcnJvcigiSW52YWxpZCBGdW5jdGlvbiBTeW50YXgiKTsgcmV0dXJuOyB9CgogICAgICAgICAgICBoaWRlRXJyb3IoKTsKCiAgICAgICAgICAgIC8vIENoZWNrIGltcHJvcGVyCiAgICAgICAgICAgIGxldCByZXN1bHQgPSAwOwogICAgICAgICAgICBsZXQgZ2VvQXJlYSA9IDA7IC8vIEFwcHJveCBnZW9tZXRyaWMgYXJlYQogICAgICAgICAgICBsZXQgaXNJbXByb3BlciA9ICFpc0Zpbml0ZShhKSB8fCAhaXNGaW5pdGUoYik7CgogICAgICAgICAgICBpZiAoaXNJbXByb3BlcikgewogICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtYXRpb246IHggPSB0YW4odCksIGR4ID0gc2VjXjIodCkgZHQKICAgICAgICAgICAgICAgIC8vIExpbWl0cyBtYXAgdmlhIGFyY3Rhbi4KICAgICAgICAgICAgICAgIC8vIC1pbmYgLT4gLXBpLzIsIGluZiAtPiBwaS8yCiAgICAgICAgICAgICAgICBjb25zdCB0X2EgPSAoYSA9PT0gLUluZmluaXR5KSA/IC1NYXRoLlBJIC8gMiA6IE1hdGguYXRhbihhKTsKICAgICAgICAgICAgICAgIGNvbnN0IHRfYiA9IChiID09PSBJbmZpbml0eSkgPyBNYXRoLlBJIC8gMiA6IE1hdGguYXRhbihiKTsKCiAgICAgICAgICAgICAgICAvLyBJbnRlZ3JhbmQ6IGYodGFuKHQpKSAqIHNlY14yKHQpCiAgICAgICAgICAgICAgICBjb25zdCBpbnRlZ3JhbmQgPSAodCkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGYoTWF0aC50YW4odCkpICogKDEgLyBNYXRoLnBvdyhNYXRoLmNvcyh0KSwgMikpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Zpbml0ZSh2YWwpID8gdmFsIDogMDsgLy8gSGFuZGxlIHNpbmd1bGFyaXR5CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgYWJzSW50ZWdyYW5kID0gKHQpID0+IE1hdGguYWJzKGludGVncmFuZCh0KSk7CgogICAgICAgICAgICAgICAgLy8gVXNlIHNsaWdodGx5IG9mZnNldCBsaW1pdHMgdG8gYXZvaWQgTmFOIGF0ICsvLSBwaS8yIGV4YWN0bHkKICAgICAgICAgICAgICAgIGNvbnN0IGVwcyA9IDFlLTU7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBhZGFwdGl2ZVNpbXBzb25zKGludGVncmFuZCwgdF9hICsgZXBzLCB0X2IgLSBlcHMpOwogICAgICAgICAgICAgICAgZ2VvQXJlYSA9IGFkYXB0aXZlU2ltcHNvbnMoYWJzSW50ZWdyYW5kLCB0X2EgKyBlcHMsIHRfYiAtIGVwcyk7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gU3RhbmRhcmQKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFkYXB0aXZlU2ltcHNvbnMoZiwgYSwgYik7CiAgICAgICAgICAgICAgICBjb25zdCBhYnNGID0gKHgpID0+IE1hdGguYWJzKGYoeCkpOwogICAgICAgICAgICAgICAgZ2VvQXJlYSA9IGFkYXB0aXZlU2ltcHNvbnMoYWJzRiwgYSwgYik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERpc3BsYXkKICAgICAgICAgICAgY29uc3QgcmVzUGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0X3BhbmVsJyk7CiAgICAgICAgICAgIHJlc1BhbmVsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTsKICAgICAgICAgICAgcmVzUGFuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CgogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbl9yZXN1bHQnKS5pbm5lclRleHQgPSByZXN1bHQudG9GaXhlZCg1KTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dlb19hcmVhJykuaW5uZXJUZXh0ID0gZ2VvQXJlYS50b0ZpeGVkKDUpOwoKICAgICAgICAgICAgLy8gSW50ZXJwcmV0YXRpb24KICAgICAgICAgICAgbGV0IGRlc2MgPSAiTmV0IEFyZWEgaXMgIjsKICAgICAgICAgICAgaWYgKE1hdGguYWJzKHJlc3VsdCkgPCAxZS01KSBkZXNjICs9ICJ6ZXJvIChBcmVhcyBjYW5jZWxsZWQgb3V0KSI7CiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA+IDApIGRlc2MgKz0gInBvc2l0aXZlIChNb3JlIGFyZWEgYWJvdmUgYXhpcykiOwogICAgICAgICAgICBlbHNlIGRlc2MgKz0gIm5lZ2F0aXZlIChNb3JlIGFyZWEgYmVsb3cgYXhpcykiOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlzdWFsX2Rlc2MnKS5pbm5lclRleHQgPSBkZXNjOwoKICAgICAgICAgICAgZHJhdyhmLCBhLCBiLCBpc0ltcHJvcGVyKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpIHsKICAgICAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3JfbXNnJyk7CiAgICAgICAgICAgIGVsLmlubmVyVGV4dCA9IG1zZzsKICAgICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBoaWRlRXJyb3IoKSB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvcl9tc2cnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyB9CgogICAgICAgIC8qIC0tLSBWaXN1YWxpemVyIC0tLSAqLwogICAgICAgIGZ1bmN0aW9uIGRyYXcoZiwgYSwgYiwgaXNJbXByb3BlcikgewogICAgICAgICAgICBjb25zdCBjdnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGxvdENhbnZhcycpOwogICAgICAgICAgICBjb25zdCBjdHggPSBjdnMuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgY29uc3QgdyA9IGN2cy5wYXJlbnRFbGVtZW50LmNsaWVudFdpZHRoOwogICAgICAgICAgICBjb25zdCBoID0gY3ZzLnBhcmVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgICAgICAgICBjdnMud2lkdGggPSB3OyBjdnMuaGVpZ2h0ID0gaDsKCiAgICAgICAgICAgIC8vIERldGVybWluZSBWaWV3cG9ydAogICAgICAgICAgICBsZXQgdmlld0EgPSBpc0Zpbml0ZShhKSA/IGEgOiAtMTA7CiAgICAgICAgICAgIGxldCB2aWV3QiA9IGlzRmluaXRlKGIpID8gYiA6IDEwOwogICAgICAgICAgICBpZiAoTWF0aC5hYnModmlld0IgLSB2aWV3QSkgPCAxKSB7IHZpZXdBIC09IDI7IHZpZXdCICs9IDI7IH0KCiAgICAgICAgICAgIGNvbnN0IHBhZCA9ICh2aWV3QiAtIHZpZXdBKSAqIDAuMjsKICAgICAgICAgICAgY29uc3QgeE1pbiA9IHZpZXdBIC0gcGFkOwogICAgICAgICAgICBjb25zdCB4TWF4ID0gdmlld0IgKyBwYWQ7CiAgICAgICAgICAgIGNvbnN0IHhSYW5nZSA9IHhNYXggLSB4TWluOwoKICAgICAgICAgICAgLy8gU2FtcGxlIGZvciBZIHNjYWxlCiAgICAgICAgICAgIGxldCB5TWluID0gMCwgeU1heCA9IDA7CiAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSB4UmFuZ2UgLyAxMDA7CiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gc3RlcCkgewogICAgICAgICAgICAgICAgY29uc3QgeSA9IGYoeCk7CiAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUoeSkgJiYgTWF0aC5hYnMoeSkgPCAxMDApIHsgLy8gUmVqZWN0IGFzeW1wdG90ZXMKICAgICAgICAgICAgICAgICAgICB5TWluID0gTWF0aC5taW4oeU1pbiwgeSk7CiAgICAgICAgICAgICAgICAgICAgeU1heCA9IE1hdGgubWF4KHlNYXgsIHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh5TWF4IDwgMSkgeU1heCA9IDE7IGlmICh5TWluID4gLTEpIHlNaW4gPSAtMTsKICAgICAgICAgICAgY29uc3QgeVJhbmdlID0gKHlNYXggLSB5TWluKSAqIDEuMjsKICAgICAgICAgICAgY29uc3QgeU1pZCA9ICh5TWF4ICsgeU1pbikgLyAyOwoKICAgICAgICAgICAgLy8gVHJhbnNmb3JtcwogICAgICAgICAgICBjb25zdCB0b0N4ID0gKHgpID0+ICh4IC0geE1pbikgLyAoeE1heCAtIHhNaW4pICogdzsKICAgICAgICAgICAgY29uc3QgdG9DeSA9ICh5KSA9PiBoIC0gKHkgLSAoeU1pZCAtIHlSYW5nZSAvIDIpKSAvIHlSYW5nZSAqIGg7CgogICAgICAgICAgICAvLyBEcmF3IEF4aXMKICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJyMwMDAnOwogICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMTsKCiAgICAgICAgICAgIC8vIFggQXhpcwogICAgICAgICAgICBjb25zdCB5MCA9IHRvQ3koMCk7CiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbygwLCB5MCk7IGN0eC5saW5lVG8odywgeTApOyBjdHguc3Ryb2tlKCk7CgogICAgICAgICAgICAvLyBZIEF4aXMKICAgICAgICAgICAgY29uc3QgeDAgPSB0b0N4KDApOwogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7IGN0eC5tb3ZlVG8oeDAsIDApOyBjdHgubGluZVRvKHgwLCBoKTsgY3R4LnN0cm9rZSgpOwoKICAgICAgICAgICAgLy8gRHJhdyBGdW5jdGlvbgogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjMTk2N2QyJzsKICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDI7CgogICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlOwogICAgICAgICAgICBmb3IgKGxldCBweCA9IDA7IHB4IDw9IHc7IHB4KyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IHggPSB4TWluICsgKHB4IC8gdykgKiB4UmFuZ2U7CiAgICAgICAgICAgICAgICBjb25zdCB5ID0gZih4KTsKICAgICAgICAgICAgICAgIGNvbnN0IHB5ID0gdG9DeSh5KTsKICAgICAgICAgICAgICAgIGlmICghaXNGaW5pdGUoeSkpIHsgZmlyc3QgPSB0cnVlOyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7IGN0eC5tb3ZlVG8ocHgsIHB5KTsgZmlyc3QgPSBmYWxzZTsgfQogICAgICAgICAgICAgICAgZWxzZSBjdHgubGluZVRvKHB4LCBweSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3R4LnN0cm9rZSgpOwoKICAgICAgICAgICAgLy8gU2hhZGUgQXJlYQogICAgICAgICAgICAvLyBTaGFkZSBwb3NpdGl2ZSAoR3JlZW4pIGFuZCBuZWdhdGl2ZSAoUmVkKSBzZXBhcmF0ZWx5CiAgICAgICAgICAgIGNvbnN0IGRyYXdMaW1pdEEgPSBpc0Zpbml0ZShhKSA/IGEgOiB4TWluOwogICAgICAgICAgICBjb25zdCBkcmF3TGltaXRCID0gaXNGaW5pdGUoYikgPyBiIDogeE1heDsKCiAgICAgICAgICAgIGNvbnN0IHNoYWRlU3RlcCA9IChkcmF3TGltaXRCIC0gZHJhd0xpbWl0QSkgLyAyMDA7CgogICAgICAgICAgICBmb3IgKGxldCB4ID0gZHJhd0xpbWl0QTsgeCA8IGRyYXdMaW1pdEI7IHggKz0gc2hhZGVTdGVwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuZXh0WCA9IHggKyBzaGFkZVN0ZXA7CiAgICAgICAgICAgICAgICBjb25zdCB5ID0gZih4KTsKICAgICAgICAgICAgICAgIGNvbnN0IG55ID0gZihuZXh0WCk7CgogICAgICAgICAgICAgICAgY29uc3QgcHgxID0gdG9DeCh4KSwgcHkxID0gdG9DeSh5KTsKICAgICAgICAgICAgICAgIGNvbnN0IHB4MiA9IHRvQ3gobmV4dFgpLCBweTIgPSB0b0N5KG55KTsKICAgICAgICAgICAgICAgIGNvbnN0IHBCYXNlMSA9IHRvQ3koMCk7CgogICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhweDEsIHBCYXNlMSk7CiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHB4MSwgcHkxKTsKICAgICAgICAgICAgICAgIGN0eC5saW5lVG8ocHgyLCBweTIpOwogICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhweDIsIHBCYXNlMSk7CiAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7CgogICAgICAgICAgICAgICAgaWYgKHkgPj0gMCkgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDUyLCAxNjgsIDgzLCAwLjMpJzsKICAgICAgICAgICAgICAgIGVsc2UgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDIzNCwgNjcsIDUzLCAwLjMpJzsKICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIExpbWl0IExpbmVzCiAgICAgICAgICAgIGN0eC5zZXRMaW5lRGFzaChbNSwgNV0pOwogICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnIzY2Nic7CiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShhKSkgewogICAgICAgICAgICAgICAgY29uc3QgeGEgPSB0b0N4KGEpOwogICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpOyBjdHgubW92ZVRvKHhhLCAwKTsgY3R4LmxpbmVUbyh4YSwgaCk7IGN0eC5zdHJva2UoKTsKICAgICAgICAgICAgICAgIGN0eC5maWxsVGV4dCgiYSIsIHhhICsgMiwgeTAgLSAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNGaW5pdGUoYikpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHhiID0gdG9DeChiKTsKICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbyh4YiwgMCk7IGN0eC5saW5lVG8oeGIsIGgpOyBjdHguc3Ryb2tlKCk7CiAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQoImIiLCB4YiArIDIsIHkwIC0gMik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEluaXQgVmlzdWFscwogICAgICAgIGNhbGN1bGF0ZSgpOyAvLyBEZW1vCiAgICA8L3NjcmlwdD4KCjwvYm9keT4KCjwvaHRtbD4=”; var htmlContent = “”; try { htmlContent = atob(b64); } catch (e) { console.error(“Base64 decode failed”, e); wrapper.innerHTML = ” Error loading calculator. “; return; } // Create Iframe var iframe = document.createElement(‘iframe’); iframe.style.width = “100%”; iframe.style.border = “none”; iframe.style.overflow = “hidden”; iframe.scrolling = “no”; iframe.style.minHeight = “400px”;…