<?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>Music Education Archives - Canton Music Academy</title>
	<atom:link href="https://www.cantonmusicacademy.com/category/music-education/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Music Lessons for all ages</description>
	<lastBuildDate>Tue, 13 Oct 2026 14:54:55 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.cantonmusicacademy.com/wp-content/uploads/2023/02/cropped-canton-record-logo-150x150.jpg</url>
	<title>Music Education 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>G7 Blues Backing Track: 12-Bar Swing Blues in G (94 BPM)</title>
		<link>https://www.cantonmusicacademy.com/g7-blues-backing-track/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Thu, 31 Jul 2025 12:47:54 +0000</pubDate>
				<category><![CDATA[Guitar]]></category>
		<category><![CDATA[Music Education]]></category>
		<category><![CDATA[music education]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1716</guid>

					<description><![CDATA[<p>The 12-bar blues is one of the most important progressions in music, and it&#8217;s the best place to learn to improvise. Press play and jam along with our free G7 blues backing track: a relaxed swing blues in G at 94 BPM, made for Canton Music Academy students and teachers. KeyG Tempo94 BPM FeelSwing Form12-bar...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/g7-blues-backing-track/">G7 Blues Backing Track: 12-Bar Swing Blues in G (94 BPM)</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: G7 Blues Backing Track (rewrite)
  URL stays the same: /g7-blues-backing-track/
  WHERE: Posts → edit the post → delete all the old content blocks
  (including the old YouTube embed and image) → add ONE "Custom HTML" block →
  paste everything below → Update → Delete Cache.
  Post title (H1):          G7 Blues Backing Track: 12-Bar Swing Blues in G (94 BPM)
  Yoast SEO title:          G7 Blues Backing Track | 12-Bar Swing Blues in G, 94 BPM
  Yoast meta description:   Free G7 blues backing track: a 12-bar swing blues in G at 94 BPM.
                            Includes the chord chart, chord tones, and the best scales to solo with.
  Keep the current featured image (g7-backing-track.jpg). No scripts.
============================================================= -->
<style>
.cmg{--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:Montserrat,sans-serif}
.cmg *{box-sizing:border-box}
.cmg .lead{font-size:1.18rem;line-height:1.7;color:var(--ink)}
.cmg .vid{position:relative;aspect-ratio:16/9;border-radius:20px;overflow:hidden;background:#000;margin:10px 0 14px;box-shadow:0 16px 36px rgba(26,32,44,.16)}
.cmg .vid iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.cmg .facts{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:0 0 26px}
.cmg .facts div{background:var(--soft);border-radius:16px;padding:14px 12px;text-align:center}
.cmg .facts small{display:block;font-size:.72rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin-bottom:2px}
.cmg .facts b{font-size:1.1rem;color:var(--ink)}
.cmg .chart{display:grid;grid-template-columns:repeat(4,1fr);border:2px solid var(--ink);border-radius:16px;overflow:hidden;margin:18px 0 8px;background:#fff}
.cmg .chart div{position:relative;padding:22px 8px 18px;text-align:center;font-weight:700;font-size:1.25rem;color:var(--ink);border-right:1px solid var(--line);border-bottom:1px solid var(--line)}
.cmg .chart div:nth-child(4n){border-right:0}
.cmg .chart div:nth-child(n+9){border-bottom:0}
.cmg .chart div small{position:absolute;left:8px;top:6px;font-size:.68rem;font-weight:600;color:#a0aec0}
.cmg .chart .i{background:#eaf4fb}
.cmg .chart .iv{background:#fff8e8}
.cmg .chart .v{background:#f0faf4}
.cmg .key{display:flex;flex-wrap:wrap;gap:8px 16px;font-size:.85rem;color:var(--mut);margin:0 0 22px}
.cmg .key span:before{content:"";display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:6px;vertical-align:-1px;border:1px solid var(--line)}
.cmg .key .k1:before{background:#eaf4fb}.cmg .key .k4:before{background:#fff8e8}.cmg .key .k5:before{background:#f0faf4}
.cmg .tones{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:14px 0 22px}
.cmg .tones div{border:1px solid var(--line);border-radius:16px;padding:14px 16px;background:#fff}
.cmg .tones b{display:block;font-size:1.15rem;color:var(--ink)}
.cmg .tones span{color:var(--mut);font-size:.95rem;letter-spacing:.04em}
.cmg .scales{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin:16px 0 10px}
.cmg .sc{background:#fff;border:1px solid var(--line);border-radius:18px;padding:18px 20px}
.cmg .sc b{display:block;color:var(--ink);font-size:1.02rem;margin-bottom:6px}
.cmg .sc .notes{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 8px}
.cmg .sc .notes i{font-style:normal;background:var(--soft);border-radius:8px;padding:3px 9px;font-weight:700;font-size:.88rem;color:var(--ink)}
.cmg .sc .notes i.blue{background:#1A202C;color:#fff}
.cmg .sc p{margin:0;font-size:.92rem;color:var(--mut);line-height:1.55}
.cmg .two{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:16px 0 10px}
.cmg .two .col{background:var(--soft);border-radius:20px;padding:20px 22px}
.cmg .two h3{margin:0 0 10px!important;font-size:1.1rem!important}
.cmg .two ul{margin:0;padding-left:1.2em}
.cmg .two li{margin-bottom:.4em;font-size:.96rem}
.cmg .call{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:14px 20px;background:var(--ink);color:#fff;border-radius:22px;padding:24px 26px;margin:26px 0}
.cmg .call p{margin:0;color:#cbd5e0;font-size:.98rem}
.cmg .call p b{display:block;color:#fff;font-size:1.15rem}
.cmg .call a.btn{display:inline-block;background:var(--gold);color:var(--ink)!important;font-weight:700;padding:13px 24px;border-radius:999px;text-decoration:none!important;white-space:nowrap}
.cmg .call a.btn:hover{background:#fff}
.cmg .yt{display:inline-flex;align-items:center;gap:8px;background:#fff;border:1.5px solid var(--line);border-radius:999px;padding:10px 18px;font-weight:700;text-decoration:none!important;color:var(--ink)!important}
.cmg .yt:hover{border-color:#e00}
.cmg .yt span{color:#e00}
@media (max-width:640px){
  .cmg .facts{grid-template-columns:repeat(2,1fr)}
  .cmg .chart div{padding:20px 4px 14px;font-size:1.05rem}
  .cmg .tones{grid-template-columns:1fr}
  .cmg .scales,.cmg .two{grid-template-columns:1fr}
  .cmg .call{padding:22px 20px}
  .cmg .call a.btn{width:100%;text-align:center}
}
</style>

<div class="cmg">

<p class="lead">The 12-bar blues is one of the most important progressions in music, and it&#8217;s the best place to learn to improvise. Press play and jam along with our free G7 blues backing track: a relaxed swing blues in G at 94 BPM, made for Canton Music Academy students and teachers.</p>

<div class="vid">
  <iframe src="https://www.youtube.com/embed/GH13hZW-pEg" title="G7 Blues Backing Track: 12 Bar Swing Blues in G, 94 BPM" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div>

<div class="facts">
  <div><small>Key</small><b>G</b></div>
  <div><small>Tempo</small><b>94 BPM</b></div>
  <div><small>Feel</small><b>Swing</b></div>
  <div><small>Form</small><b>12-bar</b></div>
</div>

<h2>G7 Blues Chord Chart</h2>
<p>The track uses three dominant 7th chords, the I, IV and V of G: <b>G7, C7 and D7</b>. Count four beats per bar and follow along:</p>
<div class="chart" role="table" aria-label="12-bar blues in G chord chart">
  <div class="i"><small>1</small>G7</div><div class="i"><small>2</small>G7</div><div class="i"><small>3</small>G7</div><div class="i"><small>4</small>G7</div>
  <div class="iv"><small>5</small>C7</div><div class="iv"><small>6</small>C7</div><div class="i"><small>7</small>G7</div><div class="i"><small>8</small>G7</div>
  <div class="v"><small>9</small>D7</div><div class="iv"><small>10</small>C7</div><div class="i"><small>11</small>G7</div><div class="v"><small>12</small>D7</div>
</div>
<div class="key"><span class="k1">I chord (G7)</span><span class="k4">IV chord (C7)</span><span class="k5">V chord (D7)</span></div>
<p>Bar 12 on the D7 is the &#8220;turnaround.&#8221; It pulls you back to the top of the form, and the progression loops so you can keep playing.</p>

<h3>Chord tones</h3>
<div class="tones">
  <div><b>G7</b><span>G · B · D · F</span></div>
  <div><b>C7</b><span>C · E · G · B♭</span></div>
  <div><b>D7</b><span>D · F♯ · A · C</span></div>
</div>
<p>Landing a solo phrase on a chord tone of whichever chord is playing is one of the fastest ways to sound &#8220;inside&#8221; the changes.</p>

<h2>Best Scales to Solo Over a G Blues</h2>
<div class="scales">
  <div class="sc"><b>G minor pentatonic</b><div class="notes"><i>G</i><i>B♭</i><i>C</i><i>D</i><i>F</i></div><p>The classic blues-rock sound. Start here if you&#8217;re new to soloing. See our <a href="https://www.cantonmusicacademy.com/minor-pentatonic-scales/">minor pentatonic guide</a>.</p></div>
  <div class="sc"><b>G blues scale</b><div class="notes"><i>G</i><i>B♭</i><i>C</i><i class="blue">D♭</i><i>D</i><i>F</i></div><p>Minor pentatonic plus the &#8220;blue note&#8221; (D♭). Slide through it rather than landing on it.</p></div>
  <div class="sc"><b>G major pentatonic</b><div class="notes"><i>G</i><i>A</i><i>B</i><i>D</i><i>E</i></div><p>A brighter, sweeter sound, great for country-blues and B.B. King style phrases.</p></div>
  <div class="sc"><b>G Mixolydian</b><div class="notes"><i>G</i><i>A</i><i>B</i><i>C</i><i>D</i><i>E</i><i>F</i></div><p>The full scale behind a G7 chord, for jazzier lines. Learn more in <a href="https://www.cantonmusicacademy.com/why-should-i-learn-modes/">why learn modes</a>.</p></div>
</div>
<p>Try mixing the minor and major pentatonic: B♭ bent up toward B is one of the most classic blues moves there is.</p>

<h2>Why the 12-Bar Blues Matters</h2>
<p>The 12-bar blues isn&#8217;t just for blues. It&#8217;s the foundation of countless rock, jazz, pop and country songs. Practicing over it builds:</p>
<ul class="wp-block-list">
  <li>Steady rhythm and smooth chord changes</li>
  <li>A feel for song form, so you always know where you are</li>
  <li>Confidence improvising and soloing</li>
  <li>Ear training through repetition and feel</li>
</ul>

<h2>How to Use This Backing Track</h2>
<div class="two">
  <div class="col">
    <h3>🎸 For students</h3>
    <ul>
      <li>Strum or play a shuffle rhythm with the chords first</li>
      <li>Play the G minor pentatonic up and down in time</li>
      <li>Add bends, slides and short 2–4 note phrases</li>
      <li>Leave space: rests are part of a great solo</li>
    </ul>
  </div>
  <div class="col">
    <h3>🍎 For teachers</h3>
    <ul>
      <li>Use it as a warm-up or mid-lesson jam</li>
      <li>Trade call-and-response licks with your student</li>
      <li>Have students call out bar numbers as the form goes by</li>
      <li>Assign a scale position or technique to practice at home with the video</li>
    </ul>
  </div>
</div>

<h2>More Blues Backing Tracks</h2>
<p>We&#8217;re adding more keys, tempos and grooves to our 12-bar blues playlist. Subscribe so you don&#8217;t miss new tracks.</p>
<p><a class="yt" href="https://www.youtube.com/playlist?list=PL_IVaeJR0Mnn46HlTSHrimLDRXfrY5cU3" target="_blank" rel="noopener"><span aria-hidden="true">▶</span> 12-Bar Blues Backing Tracks playlist</a></p>
<p>Want the theory behind it all? Visit our <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">Guitar Music Theory Guide</a> for scales, chords and more.</p>

<div class="call">
  <p><b>Ready to really learn the blues?</b>Private guitar lessons in Canton for every level, from first chords to full solos.</p>
  <a class="btn" href="https://www.cantonmusicacademy.com/guitar-lessons-in-canton-mi/">Explore Guitar Lessons</a>
</div>

</div>
<p>The post <a href="https://www.cantonmusicacademy.com/g7-blues-backing-track/">G7 Blues Backing Track: 12-Bar Swing Blues in G (94 BPM)</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">1716</post-id>	</item>
		<item>
		<title>How to Read and Use a Circle of Fifths Chart for Music Theory Success</title>
		<link>https://www.cantonmusicacademy.com/circle-of-fifths-chart/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Mon, 14 Jul 2025 20:35:29 +0000</pubDate>
				<category><![CDATA[Music Education]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1650</guid>

					<description><![CDATA[<p>The circle of fifths is a map of every key in music. Tap any key below to see its key signature, its relative major or minor, its closest neighbors and the chords that belong to it, and hear how they sound. Loading the circle of fifths… What Is a Circle of Fifths Chart? A circle...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/circle-of-fifths-chart/">How to Read and Use a Circle of Fifths Chart for Music Theory Success</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Circle of Fifths Chart (interactive)
  URL stays the same: /circle-of-fifths-chart/
  WHERE: Posts → edit "How to Read and Use a Circle of Fifths Chart" → delete
  ALL old blocks (including the old chart image and the Random Chord
  Progression Generator code) → add ONE "Custom HTML" block → paste
  everything below → Update → Delete Cache.
  Yoast SEO title:        Interactive Circle of Fifths Chart + Free PDF | Canton Music Academy
  Yoast meta description: Tap any key on our interactive circle of fifths to see its key signature, relative minor and chords, and hear them. Plus a free printable circle of fifths PDF.
  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-cofgrid{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:20px;align-items:start}
.cmx-circ svg{width:100%;height:auto;display:block}
.cmx-cofsvg .seg{cursor:pointer;transition:fill .15s}
.cmx-cofsvg .seg:hover{fill-opacity:.85;stroke:#0477BF}
.cmx-cofsvg .seg:focus{outline:none;stroke:#F2B233;stroke-width:3}
.cmx-cofsvg .lab{font-family:"CMAcc",Montserrat,Arial,sans-serif}
.cmx-hint{text-align:center;color:var(--mut);font-size:.82rem!important;margin:6px 0 0!important}
.cmx-keypanel .cmx-big{font-size:clamp(1.8rem,4.5vw,2.4rem)}
.cmx-sigrow{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin:6px 0 4px}
.cmx-sigrow b{font-size:1.05rem}
.cmx-accs{color:var(--b);font-weight:800;letter-spacing:.04em}
.cmx-staffwrap svg{width:100%;max-width:300px;height:auto;display:block;margin:2px 0 4px}
.cmx-rel{margin:4px 0!important;font-weight:600;color:var(--ink)!important;font-size:.95rem!important}
.cmx-enh{margin:6px 0}
.cmx-btn.sm{padding:7px 14px;min-height:36px;font-size:.82rem}
.cmx-scale{margin:0 0 12px!important;font-size:1.05rem}
.cmx-chordrow{display:grid;grid-template-columns:repeat(7,1fr);gap:5px;margin:0 0 14px}
.cmx-chord{font-family:inherit;display:flex;flex-direction:column;align-items:center;background:#fff;border:1.5px solid var(--line);border-radius:12px;padding:8px 2px;cursor:pointer;min-width:0}
.cmx-chord b{font-size:.92rem;color:var(--ink);white-space:nowrap}
.cmx-chord small{font-size:.68rem;color:var(--mut);font-weight:700}
.cmx-chord:hover{border-color:var(--b)}
.cmx-keypanel .cmx-lbl{margin-top:10px}
@media (max-width:700px){
  .cmx-cofgrid{grid-template-columns:1fr}
  .cmx-chordrow{grid-template-columns:repeat(4,1fr)}
}

</style>

<div class="cmx">

<p class="cmx-lead">The circle of fifths is a map of every key in music. Tap any key below to see its key signature, its relative major or minor, its closest neighbors and the chords that belong to it, and hear how they sound.</p>

<div class="cmx-tool" id="cmx-cof"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the circle of fifths…</p></div>

<h2>What Is a Circle of Fifths Chart?</h2>
<p>A circle of fifths chart arranges the 12 keys of Western music in a circle, with each key a perfect fifth away from the next. It&#8217;s one of the most useful visual aids in music theory, giving you a quick reference for:</p>
<ul class="wp-block-list">
  <li>Key signatures (sharps and flats)</li>
  <li>Relative major and minor keys</li>
  <li>Harmonic relationships between keys</li>
  <li>Chord progression possibilities</li>
  <li>Transposing between keys</li>
</ul>
<p>Moving clockwise adds one sharp at a time (C, G, D, A, E, B, F♯), and moving counterclockwise adds one flat at a time (F, B♭, E♭, A♭, D♭, G♭). C major and A minor sit at the top because they have no sharps or flats. At the bottom, three keys have two names that sound the same, like F♯ and G♭.</p>

<h2>How to Read the Circle</h2>
<p><b>Outer ring:</b> major keys. <b>Inner ring:</b> each major key&#8217;s relative minor, which shares the same key signature. <b>Center numbers:</b> how many sharps or flats that key signature has.</p>
<p>The keys on either side of any key are its closest relatives. In C major, F is on one side (the IV chord) and G is on the other (the V chord). Together with their relative minors, those six keys are the ones music most often moves between, and the interactive chart highlights them for whichever key you choose.</p>

<h2>Practical Uses for a Circle of Fifths Chart</h2>
<figure class="wp-block-table"><table><thead><tr><th>Purpose</th><th>How it helps</th></tr></thead><tbody>
<tr><td>Identify key signatures</td><td>Quickly see the sharps or flats in any key</td></tr>
<tr><td>Understand harmony</td><td>Learn which chords naturally fit together</td></tr>
<tr><td>Transpose songs</td><td>Move music to a new key with confidence</td></tr>
<tr><td>Compose music</td><td>Find related keys for smooth key changes</td></tr>
<tr><td>Improvise</td><td>Build progressions from chords in the same key</td></tr>
</tbody></table></figure>

<h2>Why Visual Learners Love the Circle of Fifths</h2>
<p>Music theory can feel abstract when it&#8217;s only explained in words or memorized by rote. The circle of fifths turns key relationships into a picture you can see, and hearing the chords makes it stick. At Canton Music Academy we use it in lessons to help students break down songs, understand scales and intervals, and build theory knowledge that lasts.</p>

<h2>Download Your Free Printable Circle of Fifths Chart</h2>
<p>Want a copy for your practice space or lesson binder? Our clean, easy-to-read circle of fifths PDF highlights C major and A minor and labels the scale degrees, so it&#8217;s great for students, teachers and musicians alike.</p>
<p><a class="cmx-btn gold" href="https://www.cantonmusicacademy.com/wp-content/uploads/2025/07/circle-of-5ths.pdf" target="_blank" rel="noopener">⬇ Download the free circle of fifths PDF</a></p>

<h2>Circle of Fifths FAQ</h2>
<details><summary>Why is it called the circle of fifths?</summary><p>Because each key is a perfect fifth above the one before it as you move clockwise. After 12 steps you arrive back where you started, completing the circle.</p></details>
<details><summary>Does the circle of fifths apply to all instruments?</summary><p>Yes. Piano, guitar, brass, woodwinds and voice all use the same keys, so the chart works for any instrument.</p></details>
<details><summary>How is this different from a key signature chart?</summary><p>A key signature chart lists the sharps or flats in each key. The circle of fifths also shows how keys relate to each other, which makes it more useful for harmony, songwriting and transposing.</p></details>
<details><summary>What is a relative minor?</summary><p>Every major key has a relative minor that uses the same notes and key signature. It starts on the 6th note of the major scale; for example, the relative minor of C major is A minor.</p></details>
<details><summary>Is this suitable for beginners?</summary><p>Absolutely. Start by learning the order of sharps and flats, then use the chart to find the chords in songs you&#8217;re learning.</p></details>
<details><summary>Can I use this in my music classroom?</summary><p>Of course. Teachers are welcome to print the PDF and share this page with students.</p></details>

<p>Ready to put keys and chords together? Build and print your own progressions with our free <a href="https://www.cantonmusicacademy.com/chord-progression-builder/">Chord Progression Builder</a>, look up any chord with the <a href="https://www.cantonmusicacademy.com/chord-calculator/">Chord Spelling Calculator</a>, or work with a teacher in our <a href="https://www.cantonmusicacademy.com/music-lessons-in-canton-mi/">music lessons in Canton</a>.</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_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogSW50ZXJhY3RpdmUgQ2lyY2xlIG9mIEZpZnRocyDigJQgdXNlcyB3aW5kb3cuQ01LICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NteC1jb2YnKTsKICBpZiAoIXJvb3QgfHwgcm9vdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknKSkgcmV0dXJuOwogIHJvb3Quc2V0QXR0cmlidXRlKCdkYXRhLXJlYWR5JywgJzEnKTsKICB2YXIgSyA9IHdpbmRvdy5DTUssIGggPSBLLmgsIFMgPSBLLnN2Z0VsOwoKICB2YXIgTUFKID0gWydDJywgJ0cnLCAnRCcsICdBJywgJ0UnLCAnQicsICdGIycsICdEYicsICdBYicsICdFYicsICdCYicsICdGJ107CiAgdmFyIE1BSl9BTFQgPSB7IDU6ICdDYicsIDY6ICdHYicsIDc6ICdDIycgfTsKICB2YXIgTUlOID0gWydBJywgJ0UnLCAnQicsICdGIycsICdDIycsICdHIycsICdEIycsICdCYicsICdGJywgJ0MnLCAnRycsICdEJ107CiAgdmFyIE1JTl9BTFQgPSB7IDU6ICdBYicsIDY6ICdFYicsIDc6ICdBIycgfTsKICB2YXIgU0lHID0geyBDOiAwLCBHOiAxLCBEOiAyLCBBOiAzLCBFOiA0LCBCOiA1LCAnRiMnOiA2LCAnQyMnOiA3LCBGOiAtMSwgQmI6IC0yLCBFYjogLTMsIEFiOiAtNCwgRGI6IC01LCBHYjogLTYsIENiOiAtNyB9OwogIHZhciBTSEFSUFMgPSBbJ0YnLCAnQycsICdHJywgJ0QnLCAnQScsICdFJywgJ0InXSwgRkxBVFMgPSBbJ0InLCAnRScsICdBJywgJ0QnLCAnRycsICdDJywgJ0YnXTsKICB2YXIgTUFKX1NDQUxFID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgTUlOX1NDQUxFID0gWzAsIDIsIDMsIDUsIDcsIDgsIDEwXTsKICB2YXIgUk9NX01BSiA9IFsnSScsICdpaScsICdpaWknLCAnSVYnLCAnVicsICd2aScsICd2aWnCsCddLCBST01fTUlOID0gWydpJywgJ2lpwrAnLCAnSUlJJywgJ2l2JywgJ3YnLCAnVkknLCAnVklJJ107CiAgdmFyIHN0YXRlID0geyBpOiAwLCBtb2RlOiAnbWFqb3InLCBhbHQ6IGZhbHNlIH07CiAgKGZ1bmN0aW9uIGZyb21IYXNoKCkgewogICAgdmFyIG0gPSBsb2NhdGlvbi5oYXNoLm1hdGNoKC9rZXk9KFtBLUddWyNiXT8pKG0_KS8pOwogICAgaWYgKCFtKSByZXR1cm47CiAgICB2YXIgbWlub3IgPSBtWzJdID09PSAnbScsIGxpc3QgPSBtaW5vciA_IE1JTiA6IE1BSiwgYWx0cyA9IG1pbm9yID8gTUlOX0FMVCA6IE1BSl9BTFQ7CiAgICB2YXIgaSA9IGxpc3QuaW5kZXhPZihtWzFdKSwgYWx0ID0gZmFsc2U7CiAgICBpZiAoaSA8IDApIHsgZm9yICh2YXIgayBpbiBhbHRzKSBpZiAoYWx0c1trXSA9PT0gbVsxXSkgeyBpID0gK2s7IGFsdCA9IHRydWU7IH0gfQogICAgaWYgKGkgPj0gMCkgeyBzdGF0ZS5pID0gaTsgc3RhdGUubW9kZSA9IG1pbm9yID8gJ21pbm9yJyA6ICdtYWpvcic7IHN0YXRlLmFsdCA9IGFsdDsgfQogIH0pKCk7CiAgZnVuY3Rpb24gcHJldHR5KG4pIHsgcmV0dXJuIG4ucmVwbGFjZSgnIycsICfima8nKS5yZXBsYWNlKC9iJC8sICfima0nKTsgfQogIGZ1bmN0aW9uIHRvbmljTmFtZSgpIHsKICAgIHZhciBsaXN0ID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IE1BSiA6IE1JTiwgYWx0cyA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBNQUpfQUxUIDogTUlOX0FMVDsKICAgIHJldHVybiBzdGF0ZS5hbHQgJiYgYWx0c1tzdGF0ZS5pXSA_IGFsdHNbc3RhdGUuaV0gOiBsaXN0W3N0YXRlLmldOwogIH0KICBmdW5jdGlvbiByZWxNYWpvck5hbWUobWlub3JOYW1lLCBpKSB7IHZhciBhbHQgPSBzdGF0ZS5hbHQgJiYgTUFKX0FMVFtpXTsgcmV0dXJuIGFsdCA_IE1BSl9BTFRbaV0gOiBNQUpbaV07IH0KICBmdW5jdGlvbiBzaWdPZigpIHsKICAgIHZhciBtYWpOYW1lID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IHRvbmljTmFtZSgpIDogKHN0YXRlLmFsdCAmJiBNQUpfQUxUW3N0YXRlLmldID8gTUFKX0FMVFtzdGF0ZS5pXSA6IE1BSltzdGF0ZS5pXSk7CiAgICByZXR1cm4gU0lHW21hak5hbWVdOwogIH0KICBmdW5jdGlvbiBzY2FsZU5vdGVzKCkgewogICAgdmFyIHQgPSBLLnBhcnNlTm90ZSh0b25pY05hbWUoKSksIHNjID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IE1BSl9TQ0FMRSA6IE1JTl9TQ0FMRTsKICAgIHJldHVybiBzYy5tYXAoZnVuY3Rpb24gKHMsIGQpIHsgcmV0dXJuIEsuc3BlbGwodC5sICsgZCwgdC5wYyArIHMpOyB9KTsKICB9CiAgZnVuY3Rpb24gY2hvcmRzKCkgewogICAgdmFyIG5zID0gc2NhbGVOb3RlcygpLCBzYyA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBNQUpfU0NBTEUgOiBNSU5fU0NBTEU7CiAgICByZXR1cm4gbnMubWFwKGZ1bmN0aW9uIChuLCBkKSB7CiAgICAgIHZhciB0aGlyZCA9IChzY1soZCArIDIpICUgN10gLSBzY1tkXSArIDEyKSAlIDEyLCBmaWZ0aCA9IChzY1soZCArIDQpICUgN10gLSBzY1tkXSArIDEyKSAlIDEyOwogICAgICB2YXIgcSA9IHRoaXJkID09PSA0ID8gJycgOiBmaWZ0aCA9PT0gNiA_ICfCsCcgOiAnbSc7CiAgICAgIHJldHVybiB7IHJvb3Q6IG4sIG5hbWU6IG4ubmFtZSArIHEsIHJvbWFuOiAoc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IFJPTV9NQUogOiBST01fTUlOKVtkXSwgcGNzOiBbbi5wYywgbnNbKGQgKyAyKSAlIDddLnBjLCBuc1soZCArIDQpICUgN10ucGNdLCB0aGlyZDogdGhpcmQsIGZpZnRoOiBmaWZ0aCB9OwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIG1pZGlDaG9yZChjKSB7IHZhciByID0gNDggKyBjLnJvb3QucGM7IGlmIChyIDwgNTMpIHIgKz0gMTI7IHJldHVybiBbciwgciArIGMudGhpcmQsIHIgKyBjLmZpZnRoXTsgfQoKICAvKiAtLS0tLS0tLS0tIGNpcmNsZSAtLS0tLS0tLS0tICovCiAgdmFyIENYID0gMjAwLCBDWSA9IDIwMDsKICBmdW5jdGlvbiBhcmMocjEsIHIyLCBhMSwgYTIpIHsKICAgIGZ1bmN0aW9uIHAociwgYSkgeyByZXR1cm4gW0NYICsgciAqIE1hdGguc2luKGEpLCBDWSAtIHIgKiBNYXRoLmNvcyhhKV07IH0KICAgIHZhciBBID0gcChyMiwgYTEpLCBCID0gcChyMiwgYTIpLCBDID0gcChyMSwgYTIpLCBEID0gcChyMSwgYTEpOwogICAgcmV0dXJuICdNJyArIEFbMF0gKyAnICcgKyBBWzFdICsgJyBBJyArIHIyICsgJyAnICsgcjIgKyAnIDAgMCAxICcgKyBCWzBdICsgJyAnICsgQlsxXSArICcgTCcgKyBDWzBdICsgJyAnICsgQ1sxXSArICcgQScgKyByMSArICcgJyArIHIxICsgJyAwIDAgMCAnICsgRFswXSArICcgJyArIERbMV0gKyAnIFonOwogIH0KICBmdW5jdGlvbiBkcmF3Q2lyY2xlKCkgewogICAgdmFyIGVsID0gSy5zdmcoNDAwLCA0MDAsICdjbXgtY29mc3ZnJyk7CiAgICB2YXIgZmFtID0ge307IFtzdGF0ZS5pLCAoc3RhdGUuaSArIDEpICUgMTIsIChzdGF0ZS5pICsgMTEpICUgMTJdLmZvckVhY2goZnVuY3Rpb24gKGspIHsgZmFtW2tdID0gMTsgfSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEyOyBpKyspIHsKICAgICAgdmFyIGExID0gKGkgLSAwLjUpICogTWF0aC5QSSAvIDYsIGEyID0gKGkgKyAwLjUpICogTWF0aC5QSSAvIDYsIG1pZCA9IGkgKiBNYXRoLlBJIC8gNjsKICAgICAgdmFyIHNlbE1haiA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgJiYgaSA9PT0gc3RhdGUuaSwgc2VsTWluID0gc3RhdGUubW9kZSA9PT0gJ21pbm9yJyAmJiBpID09PSBzdGF0ZS5pOwogICAgICAoZnVuY3Rpb24gKGkpIHsKICAgICAgICB2YXIgcG0gPSBTKCdwYXRoJywgeyBkOiBhcmMoMTI4LCAxOTYsIGExLCBhMiksIGZpbGw6IHNlbE1haiA_ICcjMDQ3N0JGJyA6IGZhbVtpXSA_ICcjZDZlYWY4JyA6ICcjZmZmJywgc3Ryb2tlOiAnI2NiZDVlMScsICdzdHJva2Utd2lkdGgnOiAxLjIsICdjbGFzcyc6ICdzZWcnLCB0YWJpbmRleDogMCwgcm9sZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogcHJldHR5KE1BSltpXSkgKyAnIG1ham9yJyB9LCBlbCk7CiAgICAgICAgdmFyIHBuID0gUygncGF0aCcsIHsgZDogYXJjKDc4LCAxMjgsIGExLCBhMiksIGZpbGw6IHNlbE1pbiA_ICcjRjJCMjMzJyA6IGZhbVtpXSA_ICcjZmRmMGNmJyA6ICcjZjhmYWZjJywgc3Ryb2tlOiAnI2NiZDVlMScsICdzdHJva2Utd2lkdGgnOiAxLjIsICdjbGFzcyc6ICdzZWcnLCB0YWJpbmRleDogMCwgcm9sZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogcHJldHR5KE1JTltpXSkgKyAnIG1pbm9yJyB9LCBlbCk7CiAgICAgICAgZnVuY3Rpb24gcGljayhtb2RlKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHN0YXRlLmkgPSBpOyBzdGF0ZS5tb2RlID0gbW9kZTsgc3RhdGUuYWx0ID0gZmFsc2U7IHJlbmRlcigpOyBwbGF5UHJvZyh0cnVlKTsgfTsgfQogICAgICAgIHBtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcGljaygnbWFqb3InKSk7IHBuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcGljaygnbWlub3InKSk7CiAgICAgICAgW1twbSwgJ21ham9yJ10sIFtwbiwgJ21pbm9yJ11dLmZvckVhY2goZnVuY3Rpb24gKHgpIHsgeFswXS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnICcpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBwaWNrKHhbMV0pKCk7IH0gfSk7IH0pOwogICAgICB9KShpKTsKICAgICAgdmFyIHIxID0gMTYyLCByMiA9IDEwMywgc3ggPSBNYXRoLnNpbihtaWQpLCBzeSA9IC1NYXRoLmNvcyhtaWQpOwogICAgICB2YXIgbWFqTGFiID0gcHJldHR5KE1BSltpXSkgKyAoTUFKX0FMVFtpXSA_ICcvJyArIHByZXR0eShNQUpfQUxUW2ldKSA6ICcnKTsKICAgICAgUygndGV4dCcsIHsgeDogQ1ggKyByMSAqIHN4LCB5OiBDWSArIHIxICogc3kgKyA2LCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IE1BSl9BTFRbaV0gPyAxNSA6IDE5LCAnZm9udC13ZWlnaHQnOiA4MDAsIGZpbGw6IHNlbE1haiA_ICcjZmZmJyA6ICcjMUEyMDJDJywgJ3BvaW50ZXItZXZlbnRzJzogJ25vbmUnLCAnY2xhc3MnOiAnbGFiJyB9LCBlbCwgbWFqTGFiKTsKICAgICAgdmFyIG1pbkxhYiA9IHByZXR0eShNSU5baV0pLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXi4vLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KSArICdtJzsKICAgICAgaWYgKE1JTl9BTFRbaV0gPT09ICdFYicpIG1pbkxhYiA9ICdE4pmvbS9F4pmtbSc7CiAgICAgIFMoJ3RleHQnLCB7IHg6IENYICsgcjIgKiBzeCwgeTogQ1kgKyByMiAqIHN5ICsgNSwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiBtaW5MYWIubGVuZ3RoID4gNCA_IDEwLjUgOiAxNCwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiBzZWxNaW4gPyAnIzFBMjAyQycgOiAnIzMzNDE1NScsICdwb2ludGVyLWV2ZW50cyc6ICdub25lJywgJ2NsYXNzJzogJ2xhYicgfSwgZWwsIG1pbkxhYik7CiAgICAgIHZhciBzZyA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCAtNSwgLTQsIC0zLCAtMiwgLTFdW2ldOwogICAgICBTKCd0ZXh0JywgeyB4OiBDWCArIDY0ICogc3gsIHk6IENZICsgNjQgKiBzeSArIDQsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTAuNSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzk0YTNiOCcsICdwb2ludGVyLWV2ZW50cyc6ICdub25lJywgJ2NsYXNzJzogJ2xhYicgfSwgZWwsIHNnID09PSAwID8gJzAnIDogc2cgPiAwID8gc2cgKyAn4pmvJyA6ICgtc2cpICsgJ-KZrScpOwogICAgfQogICAgUygnY2lyY2xlJywgeyBjeDogQ1gsIGN5OiBDWSwgcjogNDQsIGZpbGw6ICcjMUEyMDJDJyB9LCBlbCk7CiAgICBTKCd0ZXh0JywgeyB4OiBDWCwgeTogQ1kgLSAyLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDEyLCAnZm9udC13ZWlnaHQnOiA4MDAsIGZpbGw6ICcjRjJCMjMzJywgJ2NsYXNzJzogJ2xhYicgfSwgZWwsICdDSVJDTEUnKTsKICAgIFMoJ3RleHQnLCB7IHg6IENYLCB5OiBDWSArIDEzLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDEwLCAnZm9udC13ZWlnaHQnOiA3MDAsIGZpbGw6ICcjZmZmJywgJ2NsYXNzJzogJ2xhYicgfSwgZWwsICdPRiBGSUZUSFMnKTsKICAgIHJldHVybiBlbDsKICB9CiAgLyogLS0tLS0tLS0tLSBrZXkgc2lnbmF0dXJlIHN0YWZmIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBhY2MoZWwsIHgsIHksIHNoYXJwKSB7CiAgICBpZiAoc2hhcnApIHsKICAgICAgUygnbGluZScsIHsgeDE6IHggLSAyLjUsIHkxOiB5IC0gMTAsIHgyOiB4IC0gMi41LCB5MjogeSArIDExLCBzdHJva2U6ICcjMUEyMDJDJywgJ3N0cm9rZS13aWR0aCc6IDEuNCB9LCBlbCk7CiAgICAgIFMoJ2xpbmUnLCB7IHgxOiB4ICsgMi41LCB5MTogeSAtIDExLCB4MjogeCArIDIuNSwgeTI6IHkgKyAxMCwgc3Ryb2tlOiAnIzFBMjAyQycsICdzdHJva2Utd2lkdGgnOiAxLjQgfSwgZWwpOwogICAgICBTKCdsaW5lJywgeyB4MTogeCAtIDYsIHkxOiB5IC0gMi41LCB4MjogeCArIDYsIHkyOiB5IC0gNSwgc3Ryb2tlOiAnIzFBMjAyQycsICdzdHJva2Utd2lkdGgnOiAzIH0sIGVsKTsKICAgICAgUygnbGluZScsIHsgeDE6IHggLSA2LCB5MTogeSArIDQuNSwgeDI6IHggKyA2LCB5MjogeSArIDIsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMyB9LCBlbCk7CiAgICB9IGVsc2UgewogICAgICBTKCdsaW5lJywgeyB4MTogeCAtIDMsIHkxOiB5IC0gMTYsIHgyOiB4IC0gMywgeTI6IHkgKyA1LCBzdHJva2U6ICcjMUEyMDJDJywgJ3N0cm9rZS13aWR0aCc6IDEuNiB9LCBlbCk7CiAgICAgIFMoJ3BhdGgnLCB7IGQ6ICdNJyArICh4IC0gMykgKyAnICcgKyAoeSAtIDEpICsgJyBDICcgKyAoeCArIDYpICsgJyAnICsgKHkgLSA3KSArICcgJyArICh4ICsgOCkgKyAnICcgKyAoeSArIDEpICsgJyAnICsgKHggLSAzKSArICcgJyArICh5ICsgNSksIGZpbGw6ICdub25lJywgc3Ryb2tlOiAnIzFBMjAyQycsICdzdHJva2Utd2lkdGgnOiAyLjQgfSwgZWwpOwogICAgfQogIH0KICBmdW5jdGlvbiBzdGFmZihzaWcpIHsKICAgIHZhciBlbCA9IEsuc3ZnKDI2MCwgOTYsICdjbXgtc3RhZmYnKSwgdG9wID0gMjQsIGcgPSAxMCwgeDAgPSA4OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIFMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHRvcCArIGkgKiBnLCB4MjogMjUyLCB5MjogdG9wICsgaSAqIGcsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS4yIH0sIGVsKTsKICAgIEsudHJlYmxlQ2xlZihlbCwgeDAgKyA2LCB0b3AgKyAzICogZywgZyk7CiAgICB2YXIgYm90dG9tID0gdG9wICsgNCAqIGcsIHBvc1MgPSBbOCwgNSwgOSwgNiwgMywgNywgNF0sIHBvc0YgPSBbNCwgNywgMywgNiwgMiwgNSwgMV07CiAgICB2YXIgbiA9IE1hdGguYWJzKHNpZyk7CiAgICBmb3IgKHZhciBrID0gMDsgayA8IG47IGsrKykgewogICAgICB2YXIgc3RlcCA9IHNpZyA-IDAgPyBwb3NTW2tdIDogcG9zRltrXTsKICAgICAgYWNjKGVsLCA2NiArIGsgKiAxNiwgYm90dG9tIC0gc3RlcCAqIChnIC8gMikgKyAwLCBzaWcgPiAwKTsKICAgIH0KICAgIHJldHVybiBlbDsKICB9CiAgdmFyIGVscyA9IHt9OwogIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgIHRyeSB7IGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsICcnLCAnI2tleT0nICsgdG9uaWNOYW1lKCkgKyAoc3RhdGUubW9kZSA9PT0gJ21pbm9yJyA_ICdtJyA6ICcnKSk7IH0gY2F0Y2ggKGUpIHt9CiAgICBlbHMuY2lyYy5pbm5lckhUTUwgPSAnJzsgZWxzLmNpcmMuYXBwZW5kQ2hpbGQoZHJhd0NpcmNsZSgpKTsKICAgIHZhciB0ID0gdG9uaWNOYW1lKCksIHNpZyA9IHNpZ09mKCksIG4gPSBNYXRoLmFicyhzaWcpOwogICAgdmFyIG1hak5hbWUgPSBzdGF0ZS5tb2RlID09PSAnbWFqb3InID8gdCA6IChzdGF0ZS5hbHQgJiYgTUFKX0FMVFtzdGF0ZS5pXSA_IE1BSl9BTFRbc3RhdGUuaV0gOiBNQUpbc3RhdGUuaV0pOwogICAgdmFyIG1pbk5hbWUgPSBzdGF0ZS5tb2RlID09PSAnbWlub3InID8gdCA6IChzdGF0ZS5hbHQgJiYgTUlOX0FMVFtzdGF0ZS5pXSA_IE1JTl9BTFRbc3RhdGUuaV0gOiBNSU5bc3RhdGUuaV0pOwogICAgZWxzLnRpdGxlLnRleHRDb250ZW50ID0gcHJldHR5KHQpICsgKHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyAnIG1ham9yJyA6ICcgbWlub3InKTsKICAgIHZhciBhY2NzID0gc2lnID09PSAwID8gJ05vIHNoYXJwcyBvciBmbGF0cycgOiAoc2lnID4gMCA_IFNIQVJQUy5zbGljZSgwLCBuKS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggKyAn4pmvJzsgfSkgOiBGTEFUUy5zbGljZSgwLCBuKS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggKyAn4pmtJzsgfSkpLmpvaW4oJyAgJyk7CiAgICBlbHMuc2lnLnRleHRDb250ZW50ID0gc2lnID09PSAwID8gJ05vIHNoYXJwcyBvciBmbGF0cycgOiBuICsgKHNpZyA-IDAgPyAobiA-IDEgPyAnIHNoYXJwcycgOiAnIHNoYXJwJykgOiAobiA-IDEgPyAnIGZsYXRzJyA6ICcgZmxhdCcpKTsKICAgIGVscy5hY2NzLnRleHRDb250ZW50ID0gc2lnID09PSAwID8gJycgOiBhY2NzOwogICAgZWxzLnN0YWZmLmlubmVySFRNTCA9ICcnOyBlbHMuc3RhZmYuYXBwZW5kQ2hpbGQoc3RhZmYoc2lnKSk7CiAgICBlbHMucmVsLnRleHRDb250ZW50ID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_ICdSZWxhdGl2ZSBtaW5vcjogJyArIHByZXR0eShtaW5OYW1lKSArICcgbWlub3InIDogJ1JlbGF0aXZlIG1ham9yOiAnICsgcHJldHR5KG1hak5hbWUpICsgJyBtYWpvcic7CiAgICB2YXIgYWx0cyA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBNQUpfQUxUIDogTUlOX0FMVCwgbGlzdCA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBNQUogOiBNSU47CiAgICBlbHMuZW5oLmlubmVySFRNTCA9ICcnOwogICAgaWYgKGFsdHNbc3RhdGUuaV0pIHsKICAgICAgdmFyIG90aGVyID0gc3RhdGUuYWx0ID8gbGlzdFtzdGF0ZS5pXSA6IGFsdHNbc3RhdGUuaV07CiAgICAgIGVscy5lbmguYXBwZW5kQ2hpbGQoaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1idG4gZ2hvc3Qgc20nLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IHN0YXRlLmFsdCA9ICFzdGF0ZS5hbHQ7IHJlbmRlcigpOyB9IH0sIFsnU2FtZSBzb3VuZCwgb3RoZXIgc3BlbGxpbmc6ICcgKyBwcmV0dHkob3RoZXIpICsgKHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyAnIG1ham9yJyA6ICcgbWlub3InKV0pKTsKICAgIH0KICAgIHZhciB0biA9IEsucGFyc2VOb3RlKHQpLCBJVm4gPSBLLnNwZWxsKHRuLmwgKyAzLCB0bi5wYyArIDUpLm5hbWUsIFZuID0gSy5zcGVsbCh0bi5sICsgNCwgdG4ucGMgKyA3KS5uYW1lOwogICAgdmFyIG5iID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IFtJVm4gKyAnIG1ham9yIChJViknLCBWbiArICcgbWFqb3IgKFYpJ10gOiBbSVZuICsgJyBtaW5vciAoaXYpJywgVm4gKyAnIG1pbm9yICh2KSddOwogICAgZWxzLm5icnMudGV4dENvbnRlbnQgPSAnTmVpZ2hib3JzOiAnICsgbmIuam9pbignIMK3ICcpOwogICAgZWxzLmNob3Jkcy5pbm5lckhUTUwgPSAnJzsKICAgIGNob3JkcygpLmZvckVhY2goZnVuY3Rpb24gKGMpIHsKICAgICAgZWxzLmNob3Jkcy5hcHBlbmRDaGlsZChoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWNob3JkJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBLLnBsYXkobWlkaUNob3JkKGMpLCAnYmxvY2snKTsgfSB9LCBbaCgnYicsIHsgdGV4dDogYy5uYW1lIH0pLCBoKCdzbWFsbCcsIHsgdGV4dDogYy5yb21hbiB9KV0pKTsKICAgIH0pOwogICAgZWxzLnNjYWxlLnRleHRDb250ZW50ID0gc2NhbGVOb3RlcygpLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5uYW1lOyB9KS5qb2luKCcg4oCTICcpOwogIH0KICBmdW5jdGlvbiBwbGF5U2NhbGUoKSB7CiAgICB2YXIgbnMgPSBzY2FsZU5vdGVzKCksIGJhc2UgPSA2MCArIG5zWzBdLnBjOyBpZiAoYmFzZSA-IDY2KSBiYXNlIC09IDEyOwogICAgdmFyIHNjID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IE1BSl9TQ0FMRSA6IE1JTl9TQ0FMRTsKICAgIEsucGxheShzYy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGJhc2UgKyB4OyB9KS5jb25jYXQoW2Jhc2UgKyAxMl0pLCAndXAnLCB7IHN0ZXA6IDAuMjgsIGR1cjogMC42IH0pOwogIH0KICBmdW5jdGlvbiBwbGF5UHJvZyhzaG9ydCkgewogICAgdmFyIGNzID0gY2hvcmRzKCksIGFjID0gSy5jdHgoKTsgaWYgKCFhYykgcmV0dXJuOwogICAgdmFyIHNlcSA9IHNob3J0ID8gWzBdIDogKHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBbMCwgMywgNCwgMF0gOiBbMCwgMywgNCwgMF0pOwogICAgc2VxLmZvckVhY2goZnVuY3Rpb24gKGQsIGspIHsKICAgICAgdmFyIGMgPSBjc1tkXTsKICAgICAgaWYgKCFzaG9ydCAmJiBzdGF0ZS5tb2RlID09PSAnbWlub3InICYmIGQgPT09IDQpIGMgPSB7IHJvb3Q6IGMucm9vdCwgdGhpcmQ6IDQsIGZpZnRoOiA3IH07CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBLLnBsYXkobWlkaUNob3JkKGMpLCAnc3RydW0nKTsgfSwgayAqIDcwMCk7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gYnVpbGQoKSB7CiAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgZWxzLmNpcmMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2lyYycgfSk7CiAgICBlbHMudGl0bGUgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtYmlnJyB9KTsKICAgIGVscy5zaWcgPSBoKCdiJyk7IGVscy5hY2NzID0gaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1hY2NzJyB9KTsKICAgIGVscy5zdGFmZiA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdGFmZndyYXAnIH0pOwogICAgZWxzLnJlbCA9IGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtcmVsJyB9KTsgZWxzLmVuaCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1lbmgnIH0pOyBlbHMubmJycyA9IGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtcmVsJyB9KTsKICAgIGVscy5jaG9yZHMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hvcmRyb3cnIH0pOyBlbHMuc2NhbGUgPSBoKCdiJyk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkIGNteC1jb2ZncmlkJyB9LCBbCiAgICAgIGgoJ2RpdicsIHt9LCBbZWxzLmNpcmMsIGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtaGludCcsIHRleHQ6ICdUYXAgdGhlIG91dGVyIHJpbmcgZm9yIG1ham9yIGtleXMsIHRoZSBpbm5lciByaW5nIGZvciBtaW5vciBrZXlzLicgfSldKSwKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWtleXBhbmVsJyB9LCBbCiAgICAgICAgZWxzLnRpdGxlLAogICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zaWdyb3cnIH0sIFtlbHMuc2lnLCBlbHMuYWNjc10pLAogICAgICAgIGVscy5zdGFmZiwgZWxzLnJlbCwgZWxzLmVuaCwgZWxzLm5icnMsCiAgICAgICAgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnU2NhbGUnIH0pLCBoKCdwJywgeyAnY2xhc3MnOiAnY214LXNjYWxlJyB9LCBbZWxzLnNjYWxlXSksCiAgICAgICAgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnQ2hvcmRzIGluIHRoaXMga2V5ICh0YXAgdG8gaGVhciknIH0pLCBlbHMuY2hvcmRzLAogICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1wbGF5JyB9LCBbCiAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBibHVlJywgb25jbGljazogcGxheVNjYWxlIH0sIFsn4pa2IFBsYXkgc2NhbGUnXSksCiAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCcsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgcGxheVByb2coZmFsc2UpOyB9IH0sIFtzdGF0ZS5tb2RlID09PSAnbWFqb3InID8gJ0kg4oCTIElWIOKAkyBWIOKAkyBJJyA6ICdpIOKAkyBpdiDigJMgViDigJMgaSddKQogICAgICAgIF0pCiAgICAgIF0pCiAgICBdKSk7CiAgICByZW5kZXIoKTsKICAgIHZhciBvYnMgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5jbXgtcGxheSAuZ2hvc3QnKTsKICAgIHZhciBvcmlnID0gcmVuZGVyOwogICAgcmVuZGVyID0gZnVuY3Rpb24gKCkgeyBvcmlnKCk7IG9icy50ZXh0Q29udGVudCA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyAnSSDigJMgSVYg4oCTIFYg4oCTIEknIDogJ2kg4oCTIGl2IOKAkyBWIOKAkyBpJzsgfTsKICAgIHJlbmRlcigpOwogIH0KICBidWlsZCgpOwp9KSgpOwo=".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/circle-of-fifths-chart/">How to Read and Use a Circle of Fifths Chart for Music Theory Success</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">1650</post-id>	</item>
	</channel>
</rss>
