<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Violin Lessons Archives - Canton Music Academy</title>
	<atom:link href="https://www.cantonmusicacademy.com/tag/violin-lessons/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Music Lessons for all ages</description>
	<lastBuildDate>Tue, 13 Oct 2026 16:13:58 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://www.cantonmusicacademy.com/wp-content/uploads/2023/02/cropped-canton-record-logo-150x150.jpg</url>
	<title>Violin Lessons Archives - Canton Music Academy</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">222841575</site>	<item>
		<title>Violin Size Guide: Find the Right Size Violin</title>
		<link>https://www.cantonmusicacademy.com/violin-size-guide/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Tue, 12 Aug 2025 03:31:56 +0000</pubDate>
				<category><![CDATA[Violin]]></category>
		<category><![CDATA[Violin Lessons]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1745</guid>

					<description><![CDATA[<p>Choosing the correct violin size makes playing more comfortable and learning much easier. A violin that&#8217;s too big strains the arm, wrist and fingers; one that fits lets a student focus on making music. Enter an arm length or a school grade below to find the right size. Loading the violin size finder… How to...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/violin-size-guide/">Violin Size Guide: Find the Right Size Violin</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Violin Size Guide (interactive)
  URL stays the same: /violin-size-guide/
  WHERE: Posts → edit "Violin Size Guide" → delete ALL old blocks (including
  the old image and table) → add ONE "Custom HTML" block → paste everything
  below → Update → Delete Cache.
  Post title (H1):        Violin Size Guide: Find the Right Size Violin
  Yoast SEO title:        Violin Size Chart: Find the Right Size by Age or Arm | Canton Music Academy
  Yoast meta description: What size violin does your child need? Use our free violin size finder by arm length or age, see the full chart from 1/8 to 4/4, and learn how to measure.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}
.cmx .wp-block-table{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 0 1.4em;max-width:100%}
@media (max-width:640px){
  .cmx table{font-size:.8rem}
  .cmx th,.cmx td{padding:7px 7px!important}
}

.cmx-step .cmx-chips{margin-left:auto}
.cmx-armbox{background:var(--soft);border-radius:18px;padding:16px 18px}
.cmx-armtop{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:6px}
.cmx-armrow{display:flex;align-items:center;justify-content:center;gap:18px;margin:4px 0 8px}
.cmx-armrow .cmx-btn{min-width:48px;justify-content:center;font-size:1.3rem;padding:4px 14px}
.cmx-readout{font-size:2.6rem;font-weight:800;letter-spacing:-.02em;min-width:150px;text-align:center;color:var(--ink)}
.cmx-range{width:100%;accent-color:#0477BF;height:28px;cursor:pointer}
.cmx-how{margin:10px 0 0;border:0;background:none;padding:0}
.cmx .cmx-how summary{padding:6px 0;font-size:.92rem;color:var(--b)}
.cmx .cmx-how summary:after{top:0}
.cmx-howin{display:flex;flex-wrap:wrap;align-items:center;gap:10px 20px;background:#fff;border-radius:14px;padding:12px 16px}
.cmx-howin svg{width:240px;max-width:100%;height:auto}
.cmx-howin ol{flex:1 1 220px;margin:0;padding-left:20px;font-size:.92rem;color:var(--ink)}
.cmx-howin li{margin:0 0 6px}
.cmx-ages{display:grid;grid-template-columns:repeat(8,1fr);gap:6px;margin:0 0 12px}
.cmx-age{font-family:inherit;display:flex;flex-direction:column;align-items:center;gap:2px;background:#fff;border:1.5px solid var(--line);border-radius:12px;padding:9px 2px;cursor:pointer;min-width:0}
.cmx-age b{font-size:.95rem;color:var(--ink)}
.cmx-age small{font-size:.66rem;color:var(--mut);font-weight:700;white-space:nowrap}
.cmx-age:hover{border-color:var(--b)}
.cmx-age.on{background:var(--b);border-color:var(--b)}
.cmx-age.on b,.cmx-age.on small{color:#fff}
.cmx-tall{display:inline-flex;align-items:center;gap:8px;font-weight:700;font-size:.92rem;cursor:pointer}
.cmx-tall input{width:20px;height:20px;accent-color:#0477BF}
.cmx-facts{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:14px 0 12px}
.cmx-fact{background:var(--soft);border-radius:12px;padding:8px 12px}
.cmx-fact span{display:block;font-size:.66rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--mut)}
.cmx-fact b{font-size:1rem}
.cmx-vnote{background:#fff8e8;border-left:5px solid var(--gold);border-radius:12px;padding:10px 14px;margin:0 0 14px!important;font-size:.93rem!important;color:var(--ink)!important}
.cmx-linewrap svg{display:block;width:100%;max-width:560px;height:auto;margin:0 auto}
.cmx-tap{text-align:center;color:var(--mut)!important;font-size:.8rem!important;margin:4px 0 0!important}
.cmx-btn.sm{padding:7px 14px;min-height:36px;font-size:.82rem}
.cmx-byline{color:var(--mut)!important;font-style:italic}
.cmx-cta{display:flex;flex-wrap:wrap;gap:10px;margin:14px 0 6px}
.cmx-dl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;background:var(--soft);border-radius:18px;padding:18px 20px;margin:18px 0}
.cmx-dl p{margin:0!important}
.cmx-dl b{display:block}
@media (max-width:640px){
  .cmx-ages{grid-template-columns:repeat(4,1fr)}
  .cmx-readout{font-size:2.1rem;min-width:110px}
  .cmx-facts{gap:6px}
  .cmx-fact{padding:7px 8px}
  .cmx-fact span{font-size:.56rem;letter-spacing:.03em}
  .cmx-fact b{font-size:.84rem}
}

</style>

<div class="cmx">

<p class="cmx-lead">Choosing the correct violin size makes playing more comfortable and learning much easier. A violin that&#8217;s too big strains the arm, wrist and fingers; one that fits lets a student focus on making music. Enter an arm length or a school grade below to find the right size.</p>

<div class="cmx-tool" id="cmx-vsz"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the violin size finder…</p></div>

<h2>How to Measure for a Violin</h2>
<ol>
<li>Have the player stand up straight and hold the <b>left arm straight out to the side</b>, parallel to the floor.</li>
<li>Measure from the <b>side of the neck to the middle of the palm</b>.</li>
<li>Find the measurement in the chart below. <b>If the player is between two sizes, choose the smaller one.</b></li>
</ol>
<p>A soft sewing tape works best. If you only have a hard tape measure or ruler, have a second person hold it along the arm.</p>

<h2>Violin Size Chart</h2>
<figure class="wp-block-table"><table><thead><tr><th>Grade</th><th>Typical age</th><th>Arm length</th><th>Violin size</th><th>Tall for age?</th></tr></thead><tbody>
<tr><td>K</td><td>5–6</td><td>16″+</td><td>1/8</td><td>Arms over 18″: 1/4</td></tr>
<tr><td>1</td><td>6–7</td><td>18″+</td><td>1/4</td><td>—</td></tr>
<tr><td>2</td><td>7–8</td><td>18″+</td><td>1/4</td><td>Arms over 20″: 1/2</td></tr>
<tr><td>3</td><td>8–9</td><td>20″+</td><td>1/2</td><td>—</td></tr>
<tr><td>4</td><td>9–10</td><td>20″+</td><td>1/2</td><td>Arms over 22″: 3/4</td></tr>
<tr><td>5</td><td>10–11</td><td>22″+</td><td>3/4</td><td>—</td></tr>
<tr><td>6</td><td>11–12</td><td>22″+</td><td>3/4</td><td>Arms over 23″: 4/4</td></tr>
<tr><td>7–Adult</td><td>12+</td><td>23″+</td><td>4/4 (full size)</td><td>—</td></tr>
</tbody></table></figure>

<h2>Why the Right Size Matters</h2>
<p>On a violin that&#8217;s too large, a student has to over-extend the left arm and stretch the fingers, which leads to tension, out-of-tune notes and frustration. A properly sized violin lets young players hold the instrument comfortably, reach the notes easily and build good posture from the start. Your teacher will check the fit at the first lesson.</p>

<h2>Renting vs. Buying</h2>
<p>Children usually move up a size every one to two years, so most families <b>rent</b> fractional violins until the student reaches full size. Many rental programs let you trade up as your child grows, and some put part of the rent toward a future purchase.</p>
<div class="cmx-dl">
  <p><b>Not ready to buy a violin yet?</b>Sweetwater offers affordable instrument rentals.</p>
  <a class="cmx-btn gold" href="https://www.sweetwater.com/instrument-rentals/" target="_blank" rel="noopener">See instrument rentals</a>
</div>

<h2>Violin Size FAQ</h2>
<details><summary>How often will my child need a new size?</summary><p>Typically every one to two years while they&#8217;re growing. Re-measure at the start of each school year, or whenever the violin starts to feel cramped.</p></details>
<details><summary>My child is between two sizes. Which should we choose?</summary><p>Always the smaller size. A violin that&#8217;s slightly small is still comfortable to play, while one that&#8217;s too big causes strain and makes good technique harder.</p></details>
<details><summary>What size violin does an adult need?</summary><p>Almost all adults play a full-size (4/4) violin. Adults with very small hands sometimes prefer a 7/8; your teacher can help you decide.</p></details>
<details><summary>Is viola sizing the same?</summary><p>No. Violas are sized by body length in inches (for example 15″ or 16″), not by fractions. If you&#8217;re starting viola, ask us and we&#8217;ll help you choose.</p></details>

<h2>Thinking About Violin Lessons?</h2>
<p>Finding the right size is the first step. We offer <a href="https://www.cantonmusicacademy.com/violin-lessons-in-canton-mi/">private violin lessons in Canton</a> for students of all ages and levels, covering technique, reading music and repertoire tailored to each student&#8217;s goals. Meet our <a href="https://www.cantonmusicacademy.com/violin-teachers-in-canton-mi/">violin teachers</a>, or explore <a href="https://www.cantonmusicacademy.com/viola-lessons-in-canton-mi/">viola</a> and <a href="https://www.cantonmusicacademy.com/cello-lessons-in-canton-mi/">cello lessons</a>.</p>
<div class="cmx-cta">
  <a class="cmx-btn blue" href="https://www.cantonmusicacademy.com/book-now/?instrument=violin">Book a violin lesson</a>
  <a class="cmx-btn ghost" href="https://www.cantonmusicacademy.com/violin-lessons-in-canton-mi/">About violin lessons</a>
</div>

<p class="cmx-byline">by Henry Bahrou – Guitarist, Music Theorist, Music Academy Director</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogVmlvbGluIHNpemUgZmluZGVyIOKAlCBhcm0gbGVuZ3RoIG9yIGFnZSB0byB2aW9saW4gc2l6ZS4gVXNlcyB3aW5kb3cuQ01LIChoLCBzdmcgaGVscGVycykgKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CiAgdmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY214LXZzeicpOwogIGlmICghcm9vdCB8fCByb290LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScpKSByZXR1cm47CiAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknLCAnMScpOwogIHZhciBLID0gd2luZG93LkNNSywgaCA9IEsuaCwgUyA9IEsuc3ZnRWw7CiAgLyogbWluID0gbWluaW11bSBhcm0gbGVuZ3RoIGluIGluY2hlcyAoQ2FudG9uIE11c2ljIEFjYWRlbXkgY2hhcnQpOyBib2R5ID0gYm9keSBsZW5ndGggaW4gaW5jaGVzICovCiAgdmFyIFNJWkVTID0gWwogICAgeyBpZDogJzEvOCcsIG1pbjogMTYsIGJvZHk6IDEwLCBjbTogMjUuNSwgYWdlczogJzXigJM2JywgZ3JhZGVzOiAnS2luZGVyZ2FydGVuJyB9LAogICAgeyBpZDogJzEvNCcsIG1pbjogMTgsIGJvZHk6IDExLCBjbTogMjgsIGFnZXM6ICc24oCTOCcsIGdyYWRlczogJzFzdOKAkzJuZCBncmFkZScgfSwKICAgIHsgaWQ6ICcxLzInLCBtaW46IDIwLCBib2R5OiAxMi41LCBjbTogMzEsIGFnZXM6ICc44oCTMTAnLCBncmFkZXM6ICczcmTigJM0dGggZ3JhZGUnIH0sCiAgICB7IGlkOiAnMy80JywgbWluOiAyMiwgYm9keTogMTMsIGNtOiAzMy41LCBhZ2VzOiAnMTDigJMxMicsIGdyYWRlczogJzV0aOKAkzZ0aCBncmFkZScgfSwKICAgIHsgaWQ6ICc0LzQnLCBtaW46IDIzLCBib2R5OiAxNCwgY206IDM1LjUsIGFnZXM6ICcxMiB0byBhZHVsdCcsIGdyYWRlczogJzd0aCBncmFkZSB0byBhZHVsdCcgfQogIF07CiAgLyogYWdlIHJvd3M6IHNpemUgaW5kZXgsIGFuZCB0aGUgInRhbGwgZm9yIGFnZSIgYnVtcCB3aXRoIHRoZSBhcm0gbGVuZ3RoIHRoYXQganVzdGlmaWVzIGl0ICovCiAgdmFyIEFHRVMgPSBbCiAgICB7IGc6ICdLJywgYTogJzXigJM2JywgczogMCwgdGFsbDogeyBzOiAxLCBhcm06IDE4IH0gfSwKICAgIHsgZzogJzFzdCcsIGE6ICc24oCTNycsIHM6IDEgfSwKICAgIHsgZzogJzJuZCcsIGE6ICc34oCTOCcsIHM6IDEsIHRhbGw6IHsgczogMiwgYXJtOiAyMCB9IH0sCiAgICB7IGc6ICczcmQnLCBhOiAnOOKAkzknLCBzOiAyIH0sCiAgICB7IGc6ICc0dGgnLCBhOiAnOeKAkzEwJywgczogMiwgdGFsbDogeyBzOiAzLCBhcm06IDIyIH0gfSwKICAgIHsgZzogJzV0aCcsIGE6ICcxMOKAkzExJywgczogMyB9LAogICAgeyBnOiAnNnRoJywgYTogJzEx4oCTMTInLCBzOiAzLCB0YWxsOiB7IHM6IDQsIGFybTogMjMgfSB9LAogICAgeyBnOiAnN3RoKycsIGE6ICcxMisnLCBzOiA0IH0KICBdOwogIHZhciBzdGF0ZSA9IHsgbW9kZTogJ2FybScsIHVuaXQ6ICdpbicsIGFybTogMjAuNSwgYWdlOiAzLCB0YWxsOiBmYWxzZSB9OwogIHRyeSB7IHZhciBzdiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NteC12c3onKSB8fCAnbnVsbCcpOyBpZiAoc3YgJiYgc3YudW5pdCkgc3RhdGUudW5pdCA9IHN2LnVuaXQ7IH0gY2F0Y2ggKGUpIHt9CgogIGZ1bmN0aW9uIGZtdEluKHYpIHsgdmFyIHcgPSBNYXRoLmZsb29yKHYgKyAxZS05KSwgZiA9IE1hdGgucm91bmQoKHYgLSB3KSAqIDQpOyB2YXIgZnIgPSBbJycsICfCvCcsICfCvScsICfCviddW2ZdIHx8ICcnOyBpZiAoZiA9PT0gNCkgeyB3Kys7IGZyID0gJyc7IH0gcmV0dXJuIHcgKyBmciArICfigLMnOyB9CiAgZnVuY3Rpb24gZm10TGVuKGluY2hlcykgeyByZXR1cm4gc3RhdGUudW5pdCA9PT0gJ2luJyA_IGZtdEluKGluY2hlcykgOiAoTWF0aC5yb3VuZChpbmNoZXMgKiAyLjU0ICogMikgLyAyKSArICcgY20nOyB9CiAgZnVuY3Rpb24gc2l6ZUZvckFybShhKSB7IHZhciBpZHggPSAtMTsgU0laRVMuZm9yRWFjaChmdW5jdGlvbiAocywgaSkgeyBpZiAoYSA-PSBzLm1pbiAtIDFlLTkpIGlkeCA9IGk7IH0pOyByZXR1cm4gaWR4OyB9CgogIC8qIC0tLS0tLS0tLS0gZHJhd2luZ3MgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHZpb2xpbihwYXJlbnQsIGN4LCBiYXNlWSwgTCwgb24pIHsKICAgIHZhciBnID0gUygnZycsIHt9LCBwYXJlbnQpLCB3MSA9IEwgKiAwLjQ3LCB3MiA9IEwgKiAwLjU4LCB0b3AgPSBiYXNlWSAtIEwsIGJvZHkgPSBvbiA_ICcjYzI0MTBjJyA6ICcjY2JkNWUxJywgZGFyayA9IG9uID8gJyM3YzJkMTInIDogJyM5NGEzYjgnOwogICAgdmFyIHBhdGggPSAnTScgKyBjeCArICcgJyArIHRvcCArCiAgICAgICcgQycgKyAoY3ggKyB3MSAqIDAuNTUpICsgJyAnICsgdG9wICsgJyAnICsgKGN4ICsgdzEgKiAwLjU1KSArICcgJyArICh0b3AgKyBMICogMC4zNikgKyAnICcgKyAoY3ggKyB3MSAqIDAuMykgKyAnICcgKyAodG9wICsgTCAqIDAuNCkgKwogICAgICAnIEMnICsgKGN4ICsgdzEgKiAwLjIyKSArICcgJyArICh0b3AgKyBMICogMC40NikgKyAnICcgKyAoY3ggKyB3MSAqIDAuMjIpICsgJyAnICsgKHRvcCArIEwgKiAwLjU0KSArICcgJyArIChjeCArIHcyICogMC4zMykgKyAnICcgKyAodG9wICsgTCAqIDAuNTgpICsKICAgICAgJyBDJyArIChjeCArIHcyICogMC41NikgKyAnICcgKyAodG9wICsgTCAqIDAuNjYpICsgJyAnICsgKGN4ICsgdzIgKiAwLjU2KSArICcgJyArIGJhc2VZICsgJyAnICsgY3ggKyAnICcgKyBiYXNlWSArCiAgICAgICcgQycgKyAoY3ggLSB3MiAqIDAuNTYpICsgJyAnICsgYmFzZVkgKyAnICcgKyAoY3ggLSB3MiAqIDAuNTYpICsgJyAnICsgKHRvcCArIEwgKiAwLjY2KSArICcgJyArIChjeCAtIHcyICogMC4zMykgKyAnICcgKyAodG9wICsgTCAqIDAuNTgpICsKICAgICAgJyBDJyArIChjeCAtIHcxICogMC4yMikgKyAnICcgKyAodG9wICsgTCAqIDAuNTQpICsgJyAnICsgKGN4IC0gdzEgKiAwLjIyKSArICcgJyArICh0b3AgKyBMICogMC40NikgKyAnICcgKyAoY3ggLSB3MSAqIDAuMykgKyAnICcgKyAodG9wICsgTCAqIDAuNCkgKwogICAgICAnIEMnICsgKGN4IC0gdzEgKiAwLjU1KSArICcgJyArICh0b3AgKyBMICogMC4zNikgKyAnICcgKyAoY3ggLSB3MSAqIDAuNTUpICsgJyAnICsgdG9wICsgJyAnICsgY3ggKyAnICcgKyB0b3AgKyAnWic7CiAgICBTKCdyZWN0JywgeyB4OiBjeCAtIEwgKiAwLjAzNSwgeTogdG9wIC0gTCAqIDAuNDgsIHdpZHRoOiBMICogMC4wNywgaGVpZ2h0OiBMICogMC41Miwgcng6IEwgKiAwLjAyLCBmaWxsOiBkYXJrIH0sIGcpOwogICAgUygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB0b3AgLSBMICogMC41NCwgcjogTCAqIDAuMDY1LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogZGFyaywgJ3N0cm9rZS13aWR0aCc6IEwgKiAwLjAzNSB9LCBnKTsKICAgIFMoJ3BhdGgnLCB7IGQ6IHBhdGgsIGZpbGw6IGJvZHkgfSwgZyk7CiAgICBTKCdyZWN0JywgeyB4OiBjeCAtIEwgKiAwLjA0LCB5OiB0b3AgLSBMICogMC4wMiwgd2lkdGg6IEwgKiAwLjA4LCBoZWlnaHQ6IEwgKiAwLjYsIHJ4OiBMICogMC4wMywgZmlsbDogZGFyayB9LCBnKTsKICAgIFstMSwgMV0uZm9yRWFjaChmdW5jdGlvbiAoc2QpIHsgUygncGF0aCcsIHsgZDogJ00nICsgKGN4ICsgc2QgKiBMICogMC4xMykgKyAnICcgKyAodG9wICsgTCAqIDAuNSkgKyAnIHEnICsgKHNkICogTCAqIDAuMDQpICsgJyAnICsgKEwgKiAwLjA5KSArICcgMCAnICsgKEwgKiAwLjIpLCBmaWxsOiAnbm9uZScsIHN0cm9rZTogZGFyaywgJ3N0cm9rZS13aWR0aCc6IEwgKiAwLjAxOCwgJ3N0cm9rZS1saW5lY2FwJzogJ3JvdW5kJyB9LCBnKTsgfSk7CiAgICBTKCdyZWN0JywgeyB4OiBjeCAtIEwgKiAwLjEyLCB5OiB0b3AgKyBMICogMC43Miwgd2lkdGg6IEwgKiAwLjI0LCBoZWlnaHQ6IEwgKiAwLjAzLCByeDogTCAqIDAuMDE1LCBmaWxsOiBkYXJrIH0sIGcpOwogICAgcmV0dXJuIGc7CiAgfQogIGZ1bmN0aW9uIGxpbmV1cChzZWwpIHsKICAgIHZhciBXID0gNTYwLCBIID0gMjM2LCBlbCA9IEsuc3ZnKFcsIEgsICdjbXgtbGluZXVwJyksIGJhc2UgPSAyMDY7CiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVmlvbGluIHNpemVzIGZyb20gMS84IHRvIGZ1bGwgc2l6ZSwgJyArIChzZWwgPj0gMCA_IFNJWkVTW3NlbF0uaWQgOiAnbm9uZScpICsgJyBoaWdobGlnaHRlZCcpOwogICAgU0laRVMuZm9yRWFjaChmdW5jdGlvbiAocywgaSkgewogICAgICB2YXIgY3ggPSA2MiArIGkgKiAxMDksIEwgPSBzLmJvZHkgKiA4LjIsIG9uID0gaSA9PT0gc2VsOwogICAgICBpZiAob24pIFMoJ3JlY3QnLCB7IHg6IGN4IC0gNTIsIHk6IDgsIHdpZHRoOiAxMDQsIGhlaWdodDogSCAtIDEwLCByeDogMTYsIGZpbGw6ICcjZmZmOGU4Jywgc3Ryb2tlOiAnI0YyQjIzMycsICdzdHJva2Utd2lkdGgnOiAyIH0sIGVsKTsKICAgICAgdmFyIGcgPSB2aW9saW4oZWwsIGN4LCBiYXNlIC0gMTIsIEwsIG9uKTsKICAgICAgZy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7CiAgICAgIGcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IHN0YXRlLm1vZGUgPSAnYXJtJzsgc3RhdGUuYXJtID0gcy5taW4gKyAwLjI1OyByZW5kZXIoKTsgfSk7CiAgICAgIFMoJ3RleHQnLCB7IHg6IGN4LCB5OiBiYXNlICsgMTQsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTUsICdmb250LXdlaWdodCc6IDgwMCwgZmlsbDogb24gPyAnIzFBMjAyQycgOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBzLmlkKTsKICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KICBmdW5jdGlvbiBtZWFzdXJlQXJ0KCkgewogICAgdmFyIGVsID0gSy5zdmcoMzAwLCAxNzAsICdjbXgtbWVhc3VyZScpOwogICAgZWwuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ01lYXN1cmUgZnJvbSB0aGUgc2lkZSBvZiB0aGUgbmVjayB0byB0aGUgbWlkZGxlIG9mIHRoZSBwYWxtIHdpdGggdGhlIGxlZnQgYXJtIHN0cmFpZ2h0IG91dCcpOwogICAgUygnY2lyY2xlJywgeyBjeDogMjQwLCBjeTogNDAsIHI6IDIwLCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOwogICAgUygncGF0aCcsIHsgZDogJ00yMjIgNzAgUTI0MCA2MCAyNTggNzAgTDI2NiAxNTAgTDIxNCAxNTAgWicsIGZpbGw6ICcjMUEyMDJDJyB9LCBlbCk7CiAgICBTKCdyZWN0JywgeyB4OiA0MCwgeTogNzQsIHdpZHRoOiAxOTAsIGhlaWdodDogMTUsIHJ4OiA3LjUsIGZpbGw6ICcjMUEyMDJDJyB9LCBlbCk7CiAgICBTKCdlbGxpcHNlJywgeyBjeDogMzQsIGN5OiA4MSwgcng6IDE2LCByeTogMTEsIGZpbGw6ICcjMUEyMDJDJyB9LCBlbCk7CiAgICBTKCdsaW5lJywgeyB4MTogMjI4LCB5MTogMTEwLCB4MjogMzQsIHkyOiAxMTAsIHN0cm9rZTogJyNGMkIyMzMnLCAnc3Ryb2tlLXdpZHRoJzogMywgJ3N0cm9rZS1kYXNoYXJyYXknOiAnNiA1JyB9LCBlbCk7CiAgICBbMjI4LCAzNF0uZm9yRWFjaChmdW5jdGlvbiAoeCkgeyBTKCdsaW5lJywgeyB4MTogeCwgeTE6IDEwMCwgeDI6IHgsIHkyOiAxMjAsIHN0cm9rZTogJyNGMkIyMzMnLCAnc3Ryb2tlLXdpZHRoJzogMyB9LCBlbCk7IH0pOwogICAgUygnY2lyY2xlJywgeyBjeDogMzQsIGN5OiA4MSwgcjogNCwgZmlsbDogJyNGMkIyMzMnIH0sIGVsKTsKICAgIFMoJ2NpcmNsZScsIHsgY3g6IDIyOCwgY3k6IDc2LCByOiA0LCBmaWxsOiAnI0YyQjIzMycgfSwgZWwpOwogICAgUygndGV4dCcsIHsgeDogMTMxLCB5OiAxMzQsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDgwMCwgZmlsbDogJyNiNzc5MWYnLCAnZm9udC1mYW1pbHknOiAnTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgJ25lY2sg4oaSIG1pZGRsZSBvZiBwYWxtJyk7CiAgICByZXR1cm4gZWw7CiAgfQoKICB2YXIgZWxzID0ge307CiAgZnVuY3Rpb24gY2hpcChsYWJlbCwgb24sIGZuLCBjbHMpIHsgcmV0dXJuIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtY2hpcCcgKyAob24gPyAnIG9uJyA6ICcnKSArIChjbHMgPyAnICcgKyBjbHMgOiAnJyksICdhcmlhLXByZXNzZWQnOiBvbiA_ICd0cnVlJyA6ICdmYWxzZScsIG9uY2xpY2s6IGZuIH0sIFtsYWJlbF0pOyB9CiAgZnVuY3Rpb24gc2F2ZSgpIHsgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NteC12c3onLCBKU09OLnN0cmluZ2lmeSh7IHVuaXQ6IHN0YXRlLnVuaXQgfSkpOyB9IGNhdGNoIChlKSB7fSB9CgogIGZ1bmN0aW9uIHJlc3VsdCgpIHsKICAgIHZhciBpZHgsIG5vdGUgPSAnJywgc3ViID0gJyc7CiAgICBpZiAoc3RhdGUubW9kZSA9PT0gJ2FybScpIHsKICAgICAgaWR4ID0gc2l6ZUZvckFybShzdGF0ZS5hcm0pOwogICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgIHJldHVybiB7IGlkeDogLTEsIGJpZzogJ1NtYWxsZXIgdGhhbiAxLzgnLCBzdWI6ICdBcm0gbGVuZ3RoIHVuZGVyICcgKyBmbXRMZW4oMTYpLCBub3RlOiAnVmVyeSB5b3VuZyBwbGF5ZXJzICh1c3VhbGx5IGFnZXMgM-KAkzUpIHVzZSBhIDEvMTAgb3IgMS8xNiB2aW9saW4uIEFzayB1cyBiZWZvcmUgYnV5aW5nIG9yIHJlbnRpbmcgc28geW91ciB0ZWFjaGVyIGNhbiBjaGVjayB0aGUgZml0IGluIHBlcnNvbi4nIH07CiAgICAgIH0KICAgICAgdmFyIG54ID0gU0laRVNbaWR4ICsgMV07CiAgICAgIHN1YiA9ICdBcm0gbGVuZ3RoICcgKyBmbXRMZW4oc3RhdGUuYXJtKSArICcgwrcgZml0cyBhcm1zICcgKyBmbXRMZW4oU0laRVNbaWR4XS5taW4pICsgKG54ID8gJyB0byBqdXN0IHVuZGVyICcgKyBmbXRMZW4obngubWluKSA6ICcgYW5kIGxvbmdlcicpOwogICAgICBpZiAobnggJiYgbngubWluIC0gc3RhdGUuYXJtIDw9IDAuNSkgbm90ZSA9ICdDbG9zZSB0byBhICcgKyBueC5pZCArICcuIFN0YXkgd2l0aCB0aGUgJyArIFNJWkVTW2lkeF0uaWQgKyAnIGZvciBub3cgKGJldHdlZW4gc2l6ZXMsIGFsd2F5cyBjaG9vc2UgdGhlIHNtYWxsZXIgb25lKSBhbmQgbWVhc3VyZSBhZ2FpbiBpbiAzIHRvIDYgbW9udGhzLic7CiAgICAgIGVsc2UgaWYgKGlkeCA9PT0gNCkgbm90ZSA9ICdGdWxsIHNpemUgZml0cyBtb3N0IHBsYXllcnMgZnJvbSBhYm91dCBhZ2UgMTIgdGhyb3VnaCBhZHVsdC4gQWR1bHRzIHdpdGggc21hbGwgaGFuZHMgc29tZXRpbWVzIHByZWZlciBhIDcvODsgeW91ciB0ZWFjaGVyIGNhbiBoZWxwIHlvdSBkZWNpZGUuJzsKICAgICAgZWxzZSBub3RlID0gJ0tpZHMgdXN1YWxseSBtb3ZlIHVwIGEgc2l6ZSBldmVyeSAxIHRvIDIgeWVhcnMuIFJlLW1lYXN1cmUgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2Nob29sIHllYXIuJzsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBBID0gQUdFU1tzdGF0ZS5hZ2VdLCB1c2VUYWxsID0gc3RhdGUudGFsbCAmJiBBLnRhbGw7CiAgICAgIGlkeCA9IHVzZVRhbGwgPyBBLnRhbGwucyA6IEEuczsKICAgICAgc3ViID0gKEEuZyA9PT0gJ0snID8gJ0tpbmRlcmdhcnRlbicgOiBBLmcgPT09ICc3dGgrJyA_ICc3dGggZ3JhZGUgdG8gYWR1bHQnIDogQS5nICsgJyBncmFkZScpICsgJyDCtyB0eXBpY2FsIGFnZSAnICsgQS5hOwogICAgICBpZiAodXNlVGFsbCkgbm90ZSA9ICdUYWxsIGZvciB0aGVpciBhZ2U_IE9ubHkgbW92ZSB1cCBpZiB0aGVpciBhcm0gbWVhc3VyZXMgb3ZlciAnICsgZm10TGVuKEEudGFsbC5hcm0pICsgJy4gQSBxdWljayBtZWFzdXJlbWVudCBpcyB0aGUgYmVzdCB3YXkgdG8gYmUgc3VyZS4nOwogICAgICBlbHNlIGlmIChzdGF0ZS50YWxsKSBub3RlID0gJ0F0IHRoaXMgYWdlLCBoZWlnaHQgdXN1YWxseSBkb2VzbuKAmXQgY2hhbmdlIHRoZSBzaXplLiBNZWFzdXJlIHRoZSBhcm0gdG8gYmUgc3VyZS4nOwogICAgICBlbHNlIG5vdGUgPSAnQWdlIGlzIG9ubHkgYSBzdGFydGluZyBwb2ludC4gS2lkcyBncm93IGF0IGRpZmZlcmVudCByYXRlcywgc28gbWVhc3VyZSB0aGUgYXJtIGlmIHlvdSBjYW4uJzsKICAgIH0KICAgIHZhciBzID0gU0laRVNbaWR4XTsKICAgIHJldHVybiB7IGlkeDogaWR4LCBiaWc6IChzLmlkID09PSAnNC80JyA_ICdGdWxsIHNpemUgKDQvNCknIDogcy5pZCArICcgc2l6ZScpICsgJyB2aW9saW4nLCBzdWI6IHN1Yiwgbm90ZTogbm90ZSwgYm9keTogcyB9OwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgZWxzLm1vZGVzLmlubmVySFRNTCA9ICcnOwogICAgW1snYXJtJywgJ_Cfk48gIEkgbWVhc3VyZWQgdGhlIGFybSddLCBbJ2FnZScsICfwn46SICBJIG9ubHkga25vdyB0aGUgYWdlJ11dLmZvckVhY2goZnVuY3Rpb24gKG8pIHsgZWxzLm1vZGVzLmFwcGVuZENoaWxkKGNoaXAob1sxXSwgc3RhdGUubW9kZSA9PT0gb1swXSwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5tb2RlID0gb1swXTsgcmVuZGVyKCk7IH0pKTsgfSk7CiAgICBlbHMuYXJtQm94LnN0eWxlLmRpc3BsYXkgPSBzdGF0ZS5tb2RlID09PSAnYXJtJyA_ICcnIDogJ25vbmUnOwogICAgZWxzLmFnZUJveC5zdHlsZS5kaXNwbGF5ID0gc3RhdGUubW9kZSA9PT0gJ2FnZScgPyAnJyA6ICdub25lJzsKICAgIGVscy51bml0cy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ2luJywgJ0luY2hlcyddLCBbJ2NtJywgJ2NtJ11dLmZvckVhY2goZnVuY3Rpb24gKG8pIHsgZWxzLnVuaXRzLmFwcGVuZENoaWxkKGNoaXAob1sxXSwgc3RhdGUudW5pdCA9PT0gb1swXSwgZnVuY3Rpb24gKCkgeyBzdGF0ZS51bml0ID0gb1swXTsgc2F2ZSgpOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBlbHMuc2xpZGVyKSBlbHMuc2xpZGVyLnZhbHVlID0gc3RhdGUuYXJtOwogICAgZWxzLnJlYWRvdXQudGV4dENvbnRlbnQgPSBmbXRMZW4oc3RhdGUuYXJtKTsKICAgIGVscy5hZ2VzLmlubmVySFRNTCA9ICcnOwogICAgQUdFUy5mb3JFYWNoKGZ1bmN0aW9uIChBLCBpKSB7CiAgICAgIGVscy5hZ2VzLmFwcGVuZENoaWxkKGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYWdlJyArIChzdGF0ZS5hZ2UgPT09IGkgPyAnIG9uJyA6ICcnKSwgJ2FyaWEtcHJlc3NlZCc6IHN0YXRlLmFnZSA9PT0gaSA_ICd0cnVlJyA6ICdmYWxzZScsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgc3RhdGUuYWdlID0gaTsgcmVuZGVyKCk7IH0gfSwgW2goJ2InLCB7IHRleHQ6IEEuZyB9KSwgaCgnc21hbGwnLCB7IHRleHQ6ICdhZ2UgJyArIEEuYSB9KV0pKTsKICAgIH0pOwogICAgZWxzLnRhbGwuY2hlY2tlZCA9IHN0YXRlLnRhbGw7CgogICAgdmFyIHIgPSByZXN1bHQoKTsKICAgIGVscy5iaWcudGV4dENvbnRlbnQgPSByLmJpZzsKICAgIGVscy5zdWIudGV4dENvbnRlbnQgPSByLnN1YjsKICAgIGVscy5ub3RlLnRleHRDb250ZW50ID0gci5ub3RlOwogICAgZWxzLnNwZWNzLmlubmVySFRNTCA9ICcnOwogICAgaWYgKHIuYm9keSkgW1snQm9keSBsZW5ndGgnLCBzdGF0ZS51bml0ID09PSAnaW4nID8gZm10SW4oci5ib2R5LmJvZHkpIDogci5ib2R5LmNtICsgJyBjbSddLCBbJ1R5cGljYWwgYWdlJywgci5ib2R5LmFnZXNdLCBbJ1VzdWFsbHknLCByLmJvZHkuZ3JhZGVzXV0uZm9yRWFjaChmdW5jdGlvbiAoeCkgewogICAgICBlbHMuc3BlY3MuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWZhY3QnIH0sIFtoKCdzcGFuJywgeyB0ZXh0OiB4WzBdIH0pLCBoKCdiJywgeyB0ZXh0OiB4WzFdIH0pXSkpOwogICAgfSk7CiAgICBlbHMubGluZS5pbm5lckhUTUwgPSAnJzsgZWxzLmxpbmUuYXBwZW5kQ2hpbGQobGluZXVwKHIuaWR4KSk7CiAgfQoKICBmdW5jdGlvbiBidWlsZCgpIHsKICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICBlbHMubW9kZXMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hpcHMnIH0pOyBlbHMudW5pdHMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hpcHMnIH0pOwogICAgZWxzLnJlYWRvdXQgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtcmVhZG91dCcgfSk7CiAgICBlbHMuc2xpZGVyID0gaCgnaW5wdXQnLCB7IHR5cGU6ICdyYW5nZScsIG1pbjogMTQsIG1heDogMjcsIHN0ZXA6IDAuMjUsICdhcmlhLWxhYmVsJzogJ0FybSBsZW5ndGggaW4gaW5jaGVzJywgJ2NsYXNzJzogJ2NteC1yYW5nZScsIG9uaW5wdXQ6IGZ1bmN0aW9uIChlKSB7IHN0YXRlLmFybSA9ICtlLnRhcmdldC52YWx1ZTsgcmVuZGVyKCk7IH0gfSk7CiAgICB2YXIgbWludXMgPSBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCBzbScsICdhcmlhLWxhYmVsJzogJ1Nob3J0ZXInLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IHN0YXRlLmFybSA9IE1hdGgubWF4KDE0LCBzdGF0ZS5hcm0gLSAoc3RhdGUudW5pdCA9PT0gJ2luJyA_IDAuMjUgOiAwLjUgLyAyLjU0KSk7IHJlbmRlcigpOyB9IH0sIFsn4oiSJ10pOwogICAgdmFyIHBsdXMgPSBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCBzbScsICdhcmlhLWxhYmVsJzogJ0xvbmdlcicsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgc3RhdGUuYXJtID0gTWF0aC5taW4oMjcsIHN0YXRlLmFybSArIChzdGF0ZS51bml0ID09PSAnaW4nID8gMC4yNSA6IDAuNSAvIDIuNTQpKTsgcmVuZGVyKCk7IH0gfSwgWycrJ10pOwogICAgZWxzLmFybUJveCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1hcm1ib3gnIH0sIFsKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWFybXRvcCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgc3R5bGU6ICdtYXJnaW46MCcsIHRleHQ6ICdBcm0gbGVuZ3RoJyB9KSwgZWxzLnVuaXRzXSksCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1hcm1yb3cnIH0sIFttaW51cywgZWxzLnJlYWRvdXQsIHBsdXNdKSwKICAgICAgZWxzLnNsaWRlciwKICAgICAgaCgnZGV0YWlscycsIHsgJ2NsYXNzJzogJ2NteC1ob3cnIH0sIFtoKCdzdW1tYXJ5JywgeyB0ZXh0OiAnSG93IGRvIEkgbWVhc3VyZT8nIH0pLCBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtaG93aW4nIH0sIFttZWFzdXJlQXJ0KCksIGgoJ29sJywge30sIFsKICAgICAgICBoKCdsaScsIHsgdGV4dDogJ1N0YW5kIHVwIHN0cmFpZ2h0IGFuZCBob2xkIHRoZSBsZWZ0IGFybSBzdHJhaWdodCBvdXQgdG8gdGhlIHNpZGUsIHBhcmFsbGVsIHRvIHRoZSBmbG9vci4nIH0pLAogICAgICAgIGgoJ2xpJywgeyB0ZXh0OiAnTWVhc3VyZSBmcm9tIHRoZSBzaWRlIG9mIHRoZSBuZWNrIHRvIHRoZSBtaWRkbGUgb2YgdGhlIHBhbG0uJyB9KSwKICAgICAgICBoKCdsaScsIHsgdGV4dDogJ0JldHdlZW4gdHdvIHNpemVzPyBBbHdheXMgY2hvb3NlIHRoZSBzbWFsbGVyIG9uZS4nIH0pCiAgICAgIF0pXSldKQogICAgXSk7CiAgICBlbHMuYWdlcyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1hZ2VzJyB9KTsKICAgIGVscy50YWxsID0gaCgnaW5wdXQnLCB7IHR5cGU6ICdjaGVja2JveCcsIG9uY2hhbmdlOiBmdW5jdGlvbiAoZSkgeyBzdGF0ZS50YWxsID0gZS50YXJnZXQuY2hlY2tlZDsgcmVuZGVyKCk7IH0gfSk7CiAgICBlbHMuYWdlQm94ID0gaCgnZGl2Jywge30sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdTY2hvb2wgZ3JhZGUnIH0pLCBlbHMuYWdlcywgaCgnbGFiZWwnLCB7ICdjbGFzcyc6ICdjbXgtdGFsbCcgfSwgW2Vscy50YWxsLCAnIFRhbGwgZm9yIHRoZWlyIGFnZSddKV0pOwogICAgZWxzLmJpZyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1iaWcnIH0pOyBlbHMuc3ViID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXN1YicgfSk7CiAgICBlbHMuc3BlY3MgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtZmFjdHMnIH0pOyBlbHMubm90ZSA9IGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtdm5vdGUnIH0pOyBlbHMubGluZSA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1saW5ld3JhcCcgfSk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkJyB9LCBbCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdGVwJyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1uJywgdGV4dDogJzEnIH0pLCBoKCdiJywgeyB0ZXh0OiAnSG93IHdvdWxkIHlvdSBsaWtlIHRvIGZpbmQgdGhlIHNpemU_JyB9KV0pLAogICAgICBlbHMubW9kZXMsCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdGVwJyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1uJywgdGV4dDogJzInIH0pLCBoKCdiJywgeyB0ZXh0OiAnRW50ZXIgdGhlIGRldGFpbHMnIH0pXSksCiAgICAgIGVscy5hcm1Cb3gsIGVscy5hZ2VCb3gKICAgIF0pKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNhcmQgY214LXJlc3VsdCcgfSwgWwogICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdSZWNvbW1lbmRlZCBzaXplJyB9KSwgZWxzLmJpZywgZWxzLnN1YiwgZWxzLnNwZWNzLCBlbHMubm90ZSwgZWxzLmxpbmUsCiAgICAgIGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtdGFwJywgdGV4dDogJ1RhcCBhIHZpb2xpbiB0byBzZWUgdGhhdCBzaXplLicgfSkKICAgIF0pKTsKICAgIHJlbmRlcigpOwogIH0KICBidWlsZCgpOwp9KSgpOwo=".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/violin-size-guide/">Violin Size Guide: Find the Right Size Violin</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1745</post-id>	</item>
	</channel>
</rss>
