/* ============================================================
   THEME: anhungxadieu — the lecture deck
   ------------------------------------------------------------
   The same look the game wears, expressed as reveal.js tokens: a lesson read
   in a slide deck and a lesson read on the floor of the game should not look
   like two products. Carved dark hardwood, hammered brass, aged vellum.

   WHERE THE CANONICAL COPY LIVES: the palette below is duplicated from
   ../../testRaylib/test/testWebpack/src/theme_anhungxadieu.css, which is the
   game's copy and the one the sprites were generated against. The two are
   separate webpack builds in separate projects, and importing across that
   boundary would couple the platform's build to the game's source tree for the
   sake of nine hex values. Duplicated WITH AN OWNER NAMED beats a fragile
   cross-project import -- but they must be changed together, and the game's
   copy is the original.

   READABILITY FIRST. A deck is read for half an hour at a time, so the
   reading surface stays parchment-and-ink (#e6d3a8 on #2a1c0f, the pair the
   dialogue box already uses at length) and the wood is kept for chrome. Gold
   on parchment is unreadable and is used only on wood.
   ============================================================ */

:root {
  /* the shared palette — see the note above about the canonical copy */
  --axd-ink:        #2a1c0f;
  --axd-ink-soft:   #4a3520;
  --axd-paper:      #e6d3a8;
  --axd-paper-dark: #cdb47e;
  --axd-paper-edge: #a88a54;
  --axd-wood:       #3a2412;
  --axd-wood-dark:  #1c1007;
  --axd-wood-light: #6b4423;
  --axd-gold:       #e9d59a;
  --axd-gold-deep:  #b08a3c;

  /* ...mapped onto reveal's own tokens. Overrides the gainsboro/navy block in
     style.css, which is imported before this. */
  --r-background-color:           var(--axd-paper);
  --r-main-color:                 var(--axd-ink);
  --r-heading-color:              var(--axd-wood);
  --r-link-color:                 #8a5a1e;
  --r-link-color-dark:            #6b4423;
  --r-link-color-hover:           #b08a3c;
  --r-selection-background-color: rgba(176, 138, 60, 0.45);
  --r-selection-color:            var(--axd-ink);
}

/* The deck sits on paper, not on a flat fill: the same tile the dialogue box
   uses, so the two surfaces are literally the same material. Copied into this
   project's own assets rather than reached for across the tree. */
html,
.reveal-viewport {
  background-color: var(--axd-paper);
  background-image: url(./asset/resource/d7bfa383108c37af58aa6df43ea75f25.png);
  background-repeat: repeat;
  background-size: 512px 512px;
}

/* A slide that asks for the SHADER background gets the shader, not paper.
   `data-bg-shader` in the markdown makes bgShader.js put `bg-shader-on` on the
   body, and style.css already clears the viewport's background-COLOR so the GL
   canvas shows through. The paper image was only being occluded by that canvas
   -- true today, accidental, and wrong the moment the canvas fails to
   initialise. Stated instead: on those slides the paper steps aside.
   (res/lectures/test/test_01.md is such a deck, and it is what deck.html opens
   when no ?md= is given -- so "the slide background has no texture" is that
   deck working as designed, not the theme failing.) */
body.bg-shader-on.reveal-viewport,
body.bg-shader-on .reveal-viewport,
body.bg-shader-on {
  background-image: none;
}

/* Reveal paints a per-slide background layer over the viewport. Left opaque it
   would cover the paper with a flat fill -- the same symptom the 404 produced,
   from a different cause, which is why this is stated rather than left to
   default. A slide that WANTS its own background still declares one and that
   inline style wins. */
.reveal .backgrounds .slide-background,
.reveal .slide-background-content {
  background-color: transparent;
}

/* Headings are the carved-wood part of the page. */
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4 {
  color: var(--axd-wood);
  text-shadow: 0 1px 0 rgba(255, 248, 225, 0.55);
}

/* A rule under a heading, the way the panel has one under its question. */
.reveal h1,
.reveal h2 {
  border-bottom: 2px solid var(--axd-gold-deep);
  padding-bottom: 0.18em;
}

/* Code and quotes: sunk into the paper rather than floated on a dark card,
   which is what black.css does and what fought the parchment. */
.reveal pre,
.reveal code {
  color: var(--axd-ink);
  background: rgba(120, 90, 40, 0.10);
  border: 1px solid var(--axd-paper-edge);
  border-radius: 2px;
  text-shadow: none;
  box-shadow: none;
}
.reveal blockquote {
  color: var(--axd-ink-soft);
  background: rgba(120, 90, 40, 0.08);
  border-left: 4px solid var(--axd-gold-deep);
  box-shadow: none;
  font-style: normal;
}
.reveal table th {
  color: var(--axd-wood);
  border-bottom: 2px solid var(--axd-gold-deep);
}
.reveal table td { border-bottom: 1px solid var(--axd-paper-edge); }

/* MathJax paints with `currentColor`, which on this surface is the ink. That
   is the whole reason the reading colour had to stay dark-on-light: gold
   formulas on parchment would be the black-on-dark problem in reverse. */
.reveal mjx-container { color: inherit; }

/* Reveal's own chrome — arrows, progress, slide number — becomes brass. */
.reveal .controls { color: var(--axd-gold-deep); }
.reveal .progress { color: var(--axd-gold-deep); background: rgba(28, 16, 7, 0.25); }
.reveal .slide-number {
  background: linear-gradient(180deg, #7a4f28 0%, #3a2412 100%);
  color: var(--axd-gold);
  border-radius: 0;
}

/* Buttons the lecture pages put on the page (exercise, solution, dialogue).
   Wood plank, gold text -- the same object as a dialogue choice. */
/* ---- A BUTTON, defined ONCE ------------------------------------------
   Every button on the platform, in one rule. It was two for a while and it
   showed: the lecture and auth-bar buttons were written as a hand-rolled wood
   GRADIENT, before the sprites were shared across to this project, and the
   window buttons added later used the TEXTURE. Same word, two objects, and the
   difference is plain the moment they appear on one screen.

   Reveal's navigation controls are `button` elements too — they are excluded
   by name further down, which is why an arrow had a plank behind it. */
.reveal button,
button.lecture-btn,
.reveal a.home-btn,
.exercise-actions button,
.solution-actions button,
#k12AuthBar button,
.window button:not([aria-label="Close"]),
.window input[type=submit],
.window input[type=reset] {
  border: 10px solid transparent;
  border-image: url(./asset/resource/a65ecbf96ca1c17ef0d775bccab04d02.png) 16 fill stretch;
  background: none;
  border-radius: 0;
  box-shadow: none;
  color: var(--axd-gold);
  text-shadow: 0 1px 0 #000;
  padding: 1px 10px;
  min-height: 16px;
  overflow: visible;
  cursor: pointer;
  filter: none;
}
.reveal button:hover,
button.lecture-btn:hover,
.reveal a.home-btn:hover,
.exercise-actions button:hover,
.solution-actions button:hover,
#k12AuthBar button:hover,
.window button:not([aria-label="Close"]):hover:not(:disabled) {
  border-image-source: url(./asset/resource/3e54fab8a26a7cbdf7231b2702c1873c.png);
  filter: none;
}
.reveal button:active,
button.lecture-btn:active,
.reveal a.home-btn:active,
.exercise-actions button:active,
.solution-actions button:active,
#k12AuthBar button:active,
.window button:not([aria-label="Close"]):active:not(:disabled) {
  border-image-source: url(./asset/resource/3c58901631519f1c91da67188fcfe23d.png);
}


/* ============================================================
   The sign-in bar and the gate behind it
   ------------------------------------------------------------
   authGate.js injected its own <style> with a navy palette (#1a2432 bar,
   #3a5068 buttons, a #3a6ea5 field behind the dialog) — the last surface on
   the platform still choosing its own colours. Geometry stayed in that file;
   the look is here, like every other panel's.
   ============================================================ */
#k12AuthBar {
  background:
    linear-gradient(180deg, var(--axd-wood-light) 0%, var(--axd-wood) 40%,
                    var(--axd-wood-dark) 100%);
  border-bottom: 2px solid var(--axd-gold-deep);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
  color: var(--axd-paper);
  font-family: "Lesson Serif", "EB Garamond", "Times New Roman", serif;
}
#k12AuthEmail { color: var(--axd-gold); }
/* the auth bar's is the button above; only its size differs */
#k12AuthBar button { font-size: 12px; padding: 0 10px; }

/* The field behind the sign-in dialog: the paper the rest of the site is on,
   dimmed, rather than a flat blue nobody chose twice. */
#k12AuthGate {
  background:
    linear-gradient(rgba(28, 16, 7, 0.55), rgba(28, 16, 7, 0.55)),
    url(./asset/resource/d7bfa383108c37af58aa6df43ea75f25.png) repeat;
  background-size: auto, 512px 512px;
  color: var(--axd-ink);
}

/* ============================================================
   Reveal's navigation arrows: an arrow, and nothing behind it
   ------------------------------------------------------------
   `.reveal button` in this file gave every button a wooden plank, and reveal's
   controls ARE buttons — so the corner arrow arrived sitting on a plaque it
   never asked for. It is a control, not an object: chevron only, no plank, no
   frame, and brass so it reads on parchment.
   ============================================================ */
/* reveal's own controls are icon buttons, not planks: the arrows and the
   autoplay resume overlay. Named so it is a decision rather than an accident
   of which rule happened to match. */
.reveal .resume-button,
.reveal .controls button,
.reveal .controls .navigate-left,
.reveal .controls .navigate-right,
.reveal .controls .navigate-up,
.reveal .controls .navigate-down {
  background: none !important;
  border: 0 !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  filter: none;
}
/* reveal draws the arrowhead with borders on .controls-arrow; recolouring the
   container is not enough, the triangle has its own border-colour. */
.reveal .controls .controls-arrow {
  border-color: var(--axd-gold-deep);
  opacity: 0.55;
  transition: opacity 0.15s, border-color 0.15s;
}
.reveal .controls button:hover .controls-arrow,
.reveal .controls .navigate-left:hover .controls-arrow,
.reveal .controls .navigate-right:hover .controls-arrow,
.reveal .controls .navigate-up:hover .controls-arrow,
.reveal .controls .navigate-down:hover .controls-arrow {
  border-color: var(--axd-gold);
  opacity: 1;
}
.reveal .controls .enabled .controls-arrow { opacity: 0.75; }


/* ============================================================
   Headings in the reading face
   ------------------------------------------------------------
   fonts.css sets --r-heading-font to Thuy_san (Be Vietnam Pro), a sans, while
   the body runs in Thuy_serif (EB Garamond). On parchment the sans heading
   reads as a different document sitting on top of the page. Both go to the
   serif; --k12-h1-font with them, or the biggest heading on the site is the
   one still in the old face.
   ============================================================ */
:root {
  --r-heading-font: Thuy_serif;
  --k12-h1-font:    Thuy_serif;
  /* black.css sets this to `uppercase`. A Vietnamese heading in all caps loses
     the shape of its tone marks and reads shouted; in a serif it also loses the
     ascender/descender rhythm the face is drawn for. */
  --r-heading-text-transform: none;
}
.reveal h1, .reveal h2, .reveal h3,
.reveal h4, .reveal h5, .reveal h6 { text-transform: none; }
.reveal h1, .reveal h2, .reveal h3, .reveal h4,
.reveal h5, .reveal h6 {
  font-family: var(--r-heading-font);
  letter-spacing: 0.01em;
}

/* ============================================================
   The 98.css window family, on the platform too
   ------------------------------------------------------------
   The lecture's in-slide dialogue (lectureDialogue.js) is built as a 98.css
   window: `.window` + `.title-bar` + `.window-body`. Untouched it arrives with
   the Windows blue gradient in the middle of a parchment slide. The game
   already dresses this exact markup — same rules, same sprite, so the two
   cannot drift.

   Geometry stays in style.css (max-width, portrait size, the 34px line); this
   is surface only.
   ============================================================ */
.window {
  /* paper inside the frame, matching the game's panel -- the wood fill left a
     brown margin around the page for no reason */
  background: url(./asset/resource/d7bfa383108c37af58aa6df43ea75f25.png) repeat;
  background-size: 512px 512px;
  border: 14px solid transparent;
  /* STRETCH, not round. The frame's edge ornament is a single drawn run, not a
     repeating motif -- measured: every self-similarity peak beyond the fine
     beading is NEGATIVE (-0.26 at 106px, -0.55 at 167px). `round` therefore
     tiles something that does not tile, and the join shows as a repeated
     segment along the top edge, which is exactly what it looked like. Stretched
     across a 14px border the run is continuous and the distortion is invisible
     at that thickness. */
  border-image: url(./asset/resource/77128bc3657c3d3eabbbf14cb61455b8.png) 72 stretch;
  border-radius: 0;
  box-shadow: 0 12px 34px rgba(0, 0, 0, 0.55);
  color: var(--axd-paper);
}
.window > .title-bar {
  background: linear-gradient(180deg, #7a4f28 0%, #4a2d15 45%, #33200e 100%);
  border-bottom: 2px solid var(--axd-gold-deep);
}
.title-bar-text {
  color: var(--axd-gold);
  text-shadow: 0 1px 0 #000;
  font-family: var(--r-heading-font);
  letter-spacing: 0.03em;
}
.window-body { background: none; color: var(--axd-ink); }

/* The dialogue's body is a page, not a grey panel: parchment under the words,
   which is what the box is FOR on a slide about a broken bridge. */
.k12-dialogue-body {
  background:
    radial-gradient(ellipse at 50% 40%, rgba(255, 248, 225, 0.35), transparent 70%),
    url(./asset/resource/d7bfa383108c37af58aa6df43ea75f25.png) repeat;
  background-size: auto, 512px 512px;
  border: 1px solid var(--axd-paper-edge);
  padding: 18px;
  margin: 0;
}
.k12-dialogue-line { color: var(--axd-ink); }

/* Window buttons are the one rule above. The CLOSE box stays the deliberate
   exception, here and in the game: 98.css draws its glyph as a background
   image, so a border-image paints over it and the box stretches. */
.window .title-bar-controls button,
.window button[aria-label="Close"] {
  border: 1px solid var(--axd-gold-deep) !important;
  border-image: none !important;
  background: linear-gradient(180deg, #7a4f28 0%, #4a2d15 60%, #33200e 100%);
  width: 20px; height: 18px; min-height: 0; min-width: 0; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
}
.window .title-bar-controls button::after,
.window button[aria-label="Close"]::after {
  content: "✕"; font-size: 11px; line-height: 1; color: var(--axd-gold);
}


/* ============================================================
   NO BUTTON MAY HAVE INVISIBLE TEXT
   ------------------------------------------------------------
   98.css styles every button as

       button, input[type=reset], input[type=submit] {
         color: transparent;
         text-shadow: 0 0 #222;
       }

   -- the label you see is the SHADOW, and the text itself is transparent. That
   is how it gets a crisp pixel edge, and it is a trap for any theme laid over
   it: a button this theme does not explicitly colour does not come out in the
   wrong colour, it comes out with NO TEXT AT ALL, dark shadow on dark wood.
   Nothing warns; the DOM says the label is right there.

   It cost `#shortcut-btn` a whole session of "the text is missing", and it was
   going to cost the next control anyone adds. So it is neutralised ONCE, for
   everything, at the lowest possible specificity -- every rule above overrides
   it, and nothing can fall through to transparent again.
   ============================================================ */
button,
input[type=reset],
input[type=submit] {
  color: var(--axd-gold);
  text-shadow: 0 1px 0 #000;
}

/*# sourceURL=webpack://./src/theme_anhungxadieu.css */
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL3NyYy90aGVtZV9hbmh1bmd4YWRpZXUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpRUFvQmlFOztBQUVqRTtFQUNFLHFFQUFxRTtFQUNyRSx5QkFBeUI7RUFDekIseUJBQXlCO0VBQ3pCLHlCQUF5QjtFQUN6Qix5QkFBeUI7RUFDekIseUJBQXlCO0VBQ3pCLHlCQUF5QjtFQUN6Qix5QkFBeUI7RUFDekIseUJBQXlCO0VBQ3pCLHlCQUF5QjtFQUN6Qix5QkFBeUI7O0VBRXpCO2dEQUM4QztFQUM5QyxnREFBZ0Q7RUFDaEQsOENBQThDO0VBQzlDLCtDQUErQztFQUMvQyx1Q0FBdUM7RUFDdkMsdUNBQXVDO0VBQ3ZDLHVDQUF1QztFQUN2Qyx3REFBd0Q7RUFDeEQsOENBQThDO0FBQ2hEOztBQUVBOztrRUFFa0U7QUFDbEU7O0VBRUUsa0NBQWtDO0VBQ2xDLHlEQUF1RDtFQUN2RCx5QkFBeUI7RUFDekIsNEJBQTRCO0FBQzlCOztBQUVBOzs7Ozs7OztzREFRc0Q7QUFDdEQ7OztFQUdFLHNCQUFzQjtBQUN4Qjs7QUFFQTs7Ozt1QkFJdUI7QUFDdkI7O0VBRUUsNkJBQTZCO0FBQy9COztBQUVBLG1EQUFtRDtBQUNuRDs7OztFQUlFLHNCQUFzQjtFQUN0Qiw4Q0FBOEM7QUFDaEQ7O0FBRUEsMEVBQTBFO0FBQzFFOztFQUVFLDZDQUE2QztFQUM3QyxzQkFBc0I7QUFDeEI7O0FBRUE7Z0VBQ2dFO0FBQ2hFOztFQUVFLHFCQUFxQjtFQUNyQixtQ0FBbUM7RUFDbkMsdUNBQXVDO0VBQ3ZDLGtCQUFrQjtFQUNsQixpQkFBaUI7RUFDakIsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSwwQkFBMEI7RUFDMUIsbUNBQW1DO0VBQ25DLDJDQUEyQztFQUMzQyxnQkFBZ0I7RUFDaEIsa0JBQWtCO0FBQ3BCO0FBQ0E7RUFDRSxzQkFBc0I7RUFDdEIsNkNBQTZDO0FBQy9DO0FBQ0EsbUJBQW1CLDhDQUE4QyxFQUFFOztBQUVuRTs7eUVBRXlFO0FBQ3pFLHdCQUF3QixjQUFjLEVBQUU7O0FBRXhDLDBFQUEwRTtBQUMxRSxvQkFBb0IsMkJBQTJCLEVBQUU7QUFDakQsb0JBQW9CLDJCQUEyQixFQUFFLGlDQUFpQyxFQUFFO0FBQ3BGO0VBQ0UsNkRBQTZEO0VBQzdELHNCQUFzQjtFQUN0QixnQkFBZ0I7QUFDbEI7O0FBRUE7bUVBQ21FO0FBQ25FOzs7Ozs7Ozt1RUFRdUU7QUFDdkU7Ozs7Ozs7OztFQVNFLDhCQUE4QjtFQUM5QixxRUFBb0U7RUFDcEUsZ0JBQWdCO0VBQ2hCLGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0VBQ3RCLHlCQUF5QjtFQUN6QixpQkFBaUI7RUFDakIsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtFQUNqQixlQUFlO0VBQ2YsWUFBWTtBQUNkO0FBQ0E7Ozs7Ozs7RUFPRSw0REFBNEQ7RUFDNUQsWUFBWTtBQUNkO0FBQ0E7Ozs7Ozs7RUFPRSw0REFBNEQ7QUFDOUQ7OztBQUdBOzs7Ozs7O2lFQU9pRTtBQUNqRTtFQUNFOzs4Q0FFNEM7RUFDNUMsNkNBQTZDO0VBQzdDLHlDQUF5QztFQUN6Qyx1QkFBdUI7RUFDdkIsb0VBQW9FO0FBQ3RFO0FBQ0EsZ0JBQWdCLHNCQUFzQixFQUFFO0FBQ3hDLDhEQUE4RDtBQUM5RCxxQkFBcUIsZUFBZSxFQUFFLGVBQWUsRUFBRTs7QUFFdkQ7d0RBQ3dEO0FBQ3hEO0VBQ0U7O2tEQUU4QztFQUM5QyxrQ0FBa0M7RUFDbEMscUJBQXFCO0FBQ3ZCOztBQUVBOzs7Ozs7O2lFQU9pRTtBQUNqRTs7cUNBRXFDO0FBQ3JDOzs7Ozs7RUFNRSwyQkFBMkI7RUFDM0Isb0JBQW9CO0VBQ3BCLDJCQUEyQjtFQUMzQiwyQkFBMkI7RUFDM0IsWUFBWTtBQUNkO0FBQ0E7cUVBQ3FFO0FBQ3JFO0VBQ0Usa0NBQWtDO0VBQ2xDLGFBQWE7RUFDYiw2Q0FBNkM7QUFDL0M7QUFDQTs7Ozs7RUFLRSw2QkFBNkI7RUFDN0IsVUFBVTtBQUNaO0FBQ0EsNkNBQTZDLGFBQWEsRUFBRTs7O0FBRzVEOzs7Ozs7OztpRUFRaUU7QUFDakU7RUFDRSw0QkFBNEI7RUFDNUIsNEJBQTRCO0VBQzVCOzt1REFFcUQ7RUFDckQsZ0NBQWdDO0FBQ2xDO0FBQ0E7cUNBQ3FDLG9CQUFvQixFQUFFO0FBQzNEOztFQUVFLGtDQUFrQztFQUNsQyxzQkFBc0I7QUFDeEI7O0FBRUE7Ozs7Ozs7Ozs7O2lFQVdpRTtBQUNqRTtFQUNFO2lEQUMrQztFQUMvQywwREFBd0Q7RUFDeEQsNEJBQTRCO0VBQzVCLDhCQUE4QjtFQUM5Qjs7Ozs7O3lCQU11QjtFQUN2QixnRUFBK0Q7RUFDL0QsZ0JBQWdCO0VBQ2hCLDJDQUEyQztFQUMzQyx1QkFBdUI7QUFDekI7QUFDQTtFQUNFLDBFQUEwRTtFQUMxRSw2Q0FBNkM7QUFDL0M7QUFDQTtFQUNFLHNCQUFzQjtFQUN0Qix5QkFBeUI7RUFDekIsa0NBQWtDO0VBQ2xDLHNCQUFzQjtBQUN4QjtBQUNBLGVBQWUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUU7O0FBRXhEO21FQUNtRTtBQUNuRTtFQUNFOztrREFFOEM7RUFDOUMsa0NBQWtDO0VBQ2xDLHVDQUF1QztFQUN2QyxhQUFhO0VBQ2IsU0FBUztBQUNYO0FBQ0EscUJBQXFCLHFCQUFxQixFQUFFOztBQUU1Qzs7bUVBRW1FO0FBQ25FOztFQUVFLGlEQUFpRDtFQUNqRCw2QkFBNkI7RUFDN0IsMEVBQTBFO0VBQzFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxVQUFVO0VBQ2xFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QjtBQUNwRTtBQUNBOztFQUVFLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLHNCQUFzQjtBQUN2RTs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lFQW9CaUU7QUFDakU7OztFQUdFLHNCQUFzQjtFQUN0Qix5QkFBeUI7QUFDM0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFRIRU1FOiBhbmh1bmd4YWRpZXUg4oCUIHRoZSBsZWN0dXJlIGRlY2tcbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgVGhlIHNhbWUgbG9vayB0aGUgZ2FtZSB3ZWFycywgZXhwcmVzc2VkIGFzIHJldmVhbC5qcyB0b2tlbnM6IGEgbGVzc29uIHJlYWRcbiAgIGluIGEgc2xpZGUgZGVjayBhbmQgYSBsZXNzb24gcmVhZCBvbiB0aGUgZmxvb3Igb2YgdGhlIGdhbWUgc2hvdWxkIG5vdCBsb29rXG4gICBsaWtlIHR3byBwcm9kdWN0cy4gQ2FydmVkIGRhcmsgaGFyZHdvb2QsIGhhbW1lcmVkIGJyYXNzLCBhZ2VkIHZlbGx1bS5cblxuICAgV0hFUkUgVEhFIENBTk9OSUNBTCBDT1BZIExJVkVTOiB0aGUgcGFsZXR0ZSBiZWxvdyBpcyBkdXBsaWNhdGVkIGZyb21cbiAgIC4uLy4uL3Rlc3RSYXlsaWIvdGVzdC90ZXN0V2VicGFjay9zcmMvdGhlbWVfYW5odW5neGFkaWV1LmNzcywgd2hpY2ggaXMgdGhlXG4gICBnYW1lJ3MgY29weSBhbmQgdGhlIG9uZSB0aGUgc3ByaXRlcyB3ZXJlIGdlbmVyYXRlZCBhZ2FpbnN0LiBUaGUgdHdvIGFyZVxuICAgc2VwYXJhdGUgd2VicGFjayBidWlsZHMgaW4gc2VwYXJhdGUgcHJvamVjdHMsIGFuZCBpbXBvcnRpbmcgYWNyb3NzIHRoYXRcbiAgIGJvdW5kYXJ5IHdvdWxkIGNvdXBsZSB0aGUgcGxhdGZvcm0ncyBidWlsZCB0byB0aGUgZ2FtZSdzIHNvdXJjZSB0cmVlIGZvciB0aGVcbiAgIHNha2Ugb2YgbmluZSBoZXggdmFsdWVzLiBEdXBsaWNhdGVkIFdJVEggQU4gT1dORVIgTkFNRUQgYmVhdHMgYSBmcmFnaWxlXG4gICBjcm9zcy1wcm9qZWN0IGltcG9ydCAtLSBidXQgdGhleSBtdXN0IGJlIGNoYW5nZWQgdG9nZXRoZXIsIGFuZCB0aGUgZ2FtZSdzXG4gICBjb3B5IGlzIHRoZSBvcmlnaW5hbC5cblxuICAgUkVBREFCSUxJVFkgRklSU1QuIEEgZGVjayBpcyByZWFkIGZvciBoYWxmIGFuIGhvdXIgYXQgYSB0aW1lLCBzbyB0aGVcbiAgIHJlYWRpbmcgc3VyZmFjZSBzdGF5cyBwYXJjaG1lbnQtYW5kLWluayAoI2U2ZDNhOCBvbiAjMmExYzBmLCB0aGUgcGFpciB0aGVcbiAgIGRpYWxvZ3VlIGJveCBhbHJlYWR5IHVzZXMgYXQgbGVuZ3RoKSBhbmQgdGhlIHdvb2QgaXMga2VwdCBmb3IgY2hyb21lLiBHb2xkXG4gICBvbiBwYXJjaG1lbnQgaXMgdW5yZWFkYWJsZSBhbmQgaXMgdXNlZCBvbmx5IG9uIHdvb2QuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuOnJvb3Qge1xuICAvKiB0aGUgc2hhcmVkIHBhbGV0dGUg4oCUIHNlZSB0aGUgbm90ZSBhYm92ZSBhYm91dCB0aGUgY2Fub25pY2FsIGNvcHkgKi9cbiAgLS1heGQtaW5rOiAgICAgICAgIzJhMWMwZjtcbiAgLS1heGQtaW5rLXNvZnQ6ICAgIzRhMzUyMDtcbiAgLS1heGQtcGFwZXI6ICAgICAgI2U2ZDNhODtcbiAgLS1heGQtcGFwZXItZGFyazogI2NkYjQ3ZTtcbiAgLS1heGQtcGFwZXItZWRnZTogI2E4OGE1NDtcbiAgLS1heGQtd29vZDogICAgICAgIzNhMjQxMjtcbiAgLS1heGQtd29vZC1kYXJrOiAgIzFjMTAwNztcbiAgLS1heGQtd29vZC1saWdodDogIzZiNDQyMztcbiAgLS1heGQtZ29sZDogICAgICAgI2U5ZDU5YTtcbiAgLS1heGQtZ29sZC1kZWVwOiAgI2IwOGEzYztcblxuICAvKiAuLi5tYXBwZWQgb250byByZXZlYWwncyBvd24gdG9rZW5zLiBPdmVycmlkZXMgdGhlIGdhaW5zYm9yby9uYXZ5IGJsb2NrIGluXG4gICAgIHN0eWxlLmNzcywgd2hpY2ggaXMgaW1wb3J0ZWQgYmVmb3JlIHRoaXMuICovXG4gIC0tci1iYWNrZ3JvdW5kLWNvbG9yOiAgICAgICAgICAgdmFyKC0tYXhkLXBhcGVyKTtcbiAgLS1yLW1haW4tY29sb3I6ICAgICAgICAgICAgICAgICB2YXIoLS1heGQtaW5rKTtcbiAgLS1yLWhlYWRpbmctY29sb3I6ICAgICAgICAgICAgICB2YXIoLS1heGQtd29vZCk7XG4gIC0tci1saW5rLWNvbG9yOiAgICAgICAgICAgICAgICAgIzhhNWExZTtcbiAgLS1yLWxpbmstY29sb3ItZGFyazogICAgICAgICAgICAjNmI0NDIzO1xuICAtLXItbGluay1jb2xvci1ob3ZlcjogICAgICAgICAgICNiMDhhM2M7XG4gIC0tci1zZWxlY3Rpb24tYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxNzYsIDEzOCwgNjAsIDAuNDUpO1xuICAtLXItc2VsZWN0aW9uLWNvbG9yOiAgICAgICAgICAgIHZhcigtLWF4ZC1pbmspO1xufVxuXG4vKiBUaGUgZGVjayBzaXRzIG9uIHBhcGVyLCBub3Qgb24gYSBmbGF0IGZpbGw6IHRoZSBzYW1lIHRpbGUgdGhlIGRpYWxvZ3VlIGJveFxuICAgdXNlcywgc28gdGhlIHR3byBzdXJmYWNlcyBhcmUgbGl0ZXJhbGx5IHRoZSBzYW1lIG1hdGVyaWFsLiBDb3BpZWQgaW50byB0aGlzXG4gICBwcm9qZWN0J3Mgb3duIGFzc2V0cyByYXRoZXIgdGhhbiByZWFjaGVkIGZvciBhY3Jvc3MgdGhlIHRyZWUuICovXG5odG1sLFxuLnJldmVhbC12aWV3cG9ydCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWF4ZC1wYXBlcik7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIi4uL3Jlc291cmNlcy9VSS9wYXBlcl90aWxlLnBuZ1wiKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdDtcbiAgYmFja2dyb3VuZC1zaXplOiA1MTJweCA1MTJweDtcbn1cblxuLyogQSBzbGlkZSB0aGF0IGFza3MgZm9yIHRoZSBTSEFERVIgYmFja2dyb3VuZCBnZXRzIHRoZSBzaGFkZXIsIG5vdCBwYXBlci5cbiAgIGBkYXRhLWJnLXNoYWRlcmAgaW4gdGhlIG1hcmtkb3duIG1ha2VzIGJnU2hhZGVyLmpzIHB1dCBgYmctc2hhZGVyLW9uYCBvbiB0aGVcbiAgIGJvZHksIGFuZCBzdHlsZS5jc3MgYWxyZWFkeSBjbGVhcnMgdGhlIHZpZXdwb3J0J3MgYmFja2dyb3VuZC1DT0xPUiBzbyB0aGUgR0xcbiAgIGNhbnZhcyBzaG93cyB0aHJvdWdoLiBUaGUgcGFwZXIgaW1hZ2Ugd2FzIG9ubHkgYmVpbmcgb2NjbHVkZWQgYnkgdGhhdCBjYW52YXNcbiAgIC0tIHRydWUgdG9kYXksIGFjY2lkZW50YWwsIGFuZCB3cm9uZyB0aGUgbW9tZW50IHRoZSBjYW52YXMgZmFpbHMgdG9cbiAgIGluaXRpYWxpc2UuIFN0YXRlZCBpbnN0ZWFkOiBvbiB0aG9zZSBzbGlkZXMgdGhlIHBhcGVyIHN0ZXBzIGFzaWRlLlxuICAgKHJlcy9sZWN0dXJlcy90ZXN0L3Rlc3RfMDEubWQgaXMgc3VjaCBhIGRlY2ssIGFuZCBpdCBpcyB3aGF0IGRlY2suaHRtbCBvcGVuc1xuICAgd2hlbiBubyA/bWQ9IGlzIGdpdmVuIC0tIHNvIFwidGhlIHNsaWRlIGJhY2tncm91bmQgaGFzIG5vIHRleHR1cmVcIiBpcyB0aGF0XG4gICBkZWNrIHdvcmtpbmcgYXMgZGVzaWduZWQsIG5vdCB0aGUgdGhlbWUgZmFpbGluZy4pICovXG5ib2R5LmJnLXNoYWRlci1vbi5yZXZlYWwtdmlld3BvcnQsXG5ib2R5LmJnLXNoYWRlci1vbiAucmV2ZWFsLXZpZXdwb3J0LFxuYm9keS5iZy1zaGFkZXItb24ge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xufVxuXG4vKiBSZXZlYWwgcGFpbnRzIGEgcGVyLXNsaWRlIGJhY2tncm91bmQgbGF5ZXIgb3ZlciB0aGUgdmlld3BvcnQuIExlZnQgb3BhcXVlIGl0XG4gICB3b3VsZCBjb3ZlciB0aGUgcGFwZXIgd2l0aCBhIGZsYXQgZmlsbCAtLSB0aGUgc2FtZSBzeW1wdG9tIHRoZSA0MDQgcHJvZHVjZWQsXG4gICBmcm9tIGEgZGlmZmVyZW50IGNhdXNlLCB3aGljaCBpcyB3aHkgdGhpcyBpcyBzdGF0ZWQgcmF0aGVyIHRoYW4gbGVmdCB0b1xuICAgZGVmYXVsdC4gQSBzbGlkZSB0aGF0IFdBTlRTIGl0cyBvd24gYmFja2dyb3VuZCBzdGlsbCBkZWNsYXJlcyBvbmUgYW5kIHRoYXRcbiAgIGlubGluZSBzdHlsZSB3aW5zLiAqL1xuLnJldmVhbCAuYmFja2dyb3VuZHMgLnNsaWRlLWJhY2tncm91bmQsXG4ucmV2ZWFsIC5zbGlkZS1iYWNrZ3JvdW5kLWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLyogSGVhZGluZ3MgYXJlIHRoZSBjYXJ2ZWQtd29vZCBwYXJ0IG9mIHRoZSBwYWdlLiAqL1xuLnJldmVhbCBoMSxcbi5yZXZlYWwgaDIsXG4ucmV2ZWFsIGgzLFxuLnJldmVhbCBoNCB7XG4gIGNvbG9yOiB2YXIoLS1heGQtd29vZCk7XG4gIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNDgsIDIyNSwgMC41NSk7XG59XG5cbi8qIEEgcnVsZSB1bmRlciBhIGhlYWRpbmcsIHRoZSB3YXkgdGhlIHBhbmVsIGhhcyBvbmUgdW5kZXIgaXRzIHF1ZXN0aW9uLiAqL1xuLnJldmVhbCBoMSxcbi5yZXZlYWwgaDIge1xuICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYXhkLWdvbGQtZGVlcCk7XG4gIHBhZGRpbmctYm90dG9tOiAwLjE4ZW07XG59XG5cbi8qIENvZGUgYW5kIHF1b3Rlczogc3VuayBpbnRvIHRoZSBwYXBlciByYXRoZXIgdGhhbiBmbG9hdGVkIG9uIGEgZGFyayBjYXJkLFxuICAgd2hpY2ggaXMgd2hhdCBibGFjay5jc3MgZG9lcyBhbmQgd2hhdCBmb3VnaHQgdGhlIHBhcmNobWVudC4gKi9cbi5yZXZlYWwgcHJlLFxuLnJldmVhbCBjb2RlIHtcbiAgY29sb3I6IHZhcigtLWF4ZC1pbmspO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDEyMCwgOTAsIDQwLCAwLjEwKTtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYXhkLXBhcGVyLWVkZ2UpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIHRleHQtc2hhZG93OiBub25lO1xuICBib3gtc2hhZG93OiBub25lO1xufVxuLnJldmVhbCBibG9ja3F1b3RlIHtcbiAgY29sb3I6IHZhcigtLWF4ZC1pbmstc29mdCk7XG4gIGJhY2tncm91bmQ6IHJnYmEoMTIwLCA5MCwgNDAsIDAuMDgpO1xuICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHZhcigtLWF4ZC1nb2xkLWRlZXApO1xuICBib3gtc2hhZG93OiBub25lO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG59XG4ucmV2ZWFsIHRhYmxlIHRoIHtcbiAgY29sb3I6IHZhcigtLWF4ZC13b29kKTtcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWF4ZC1nb2xkLWRlZXApO1xufVxuLnJldmVhbCB0YWJsZSB0ZCB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1heGQtcGFwZXItZWRnZSk7IH1cblxuLyogTWF0aEpheCBwYWludHMgd2l0aCBgY3VycmVudENvbG9yYCwgd2hpY2ggb24gdGhpcyBzdXJmYWNlIGlzIHRoZSBpbmsuIFRoYXRcbiAgIGlzIHRoZSB3aG9sZSByZWFzb24gdGhlIHJlYWRpbmcgY29sb3VyIGhhZCB0byBzdGF5IGRhcmstb24tbGlnaHQ6IGdvbGRcbiAgIGZvcm11bGFzIG9uIHBhcmNobWVudCB3b3VsZCBiZSB0aGUgYmxhY2stb24tZGFyayBwcm9ibGVtIGluIHJldmVyc2UuICovXG4ucmV2ZWFsIG1qeC1jb250YWluZXIgeyBjb2xvcjogaW5oZXJpdDsgfVxuXG4vKiBSZXZlYWwncyBvd24gY2hyb21lIOKAlCBhcnJvd3MsIHByb2dyZXNzLCBzbGlkZSBudW1iZXIg4oCUIGJlY29tZXMgYnJhc3MuICovXG4ucmV2ZWFsIC5jb250cm9scyB7IGNvbG9yOiB2YXIoLS1heGQtZ29sZC1kZWVwKTsgfVxuLnJldmVhbCAucHJvZ3Jlc3MgeyBjb2xvcjogdmFyKC0tYXhkLWdvbGQtZGVlcCk7IGJhY2tncm91bmQ6IHJnYmEoMjgsIDE2LCA3LCAwLjI1KTsgfVxuLnJldmVhbCAuc2xpZGUtbnVtYmVyIHtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgIzdhNGYyOCAwJSwgIzNhMjQxMiAxMDAlKTtcbiAgY29sb3I6IHZhcigtLWF4ZC1nb2xkKTtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLyogQnV0dG9ucyB0aGUgbGVjdHVyZSBwYWdlcyBwdXQgb24gdGhlIHBhZ2UgKGV4ZXJjaXNlLCBzb2x1dGlvbiwgZGlhbG9ndWUpLlxuICAgV29vZCBwbGFuaywgZ29sZCB0ZXh0IC0tIHRoZSBzYW1lIG9iamVjdCBhcyBhIGRpYWxvZ3VlIGNob2ljZS4gKi9cbi8qIC0tLS0gQSBCVVRUT04sIGRlZmluZWQgT05DRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIEV2ZXJ5IGJ1dHRvbiBvbiB0aGUgcGxhdGZvcm0sIGluIG9uZSBydWxlLiBJdCB3YXMgdHdvIGZvciBhIHdoaWxlIGFuZCBpdFxuICAgc2hvd2VkOiB0aGUgbGVjdHVyZSBhbmQgYXV0aC1iYXIgYnV0dG9ucyB3ZXJlIHdyaXR0ZW4gYXMgYSBoYW5kLXJvbGxlZCB3b29kXG4gICBHUkFESUVOVCwgYmVmb3JlIHRoZSBzcHJpdGVzIHdlcmUgc2hhcmVkIGFjcm9zcyB0byB0aGlzIHByb2plY3QsIGFuZCB0aGVcbiAgIHdpbmRvdyBidXR0b25zIGFkZGVkIGxhdGVyIHVzZWQgdGhlIFRFWFRVUkUuIFNhbWUgd29yZCwgdHdvIG9iamVjdHMsIGFuZCB0aGVcbiAgIGRpZmZlcmVuY2UgaXMgcGxhaW4gdGhlIG1vbWVudCB0aGV5IGFwcGVhciBvbiBvbmUgc2NyZWVuLlxuXG4gICBSZXZlYWwncyBuYXZpZ2F0aW9uIGNvbnRyb2xzIGFyZSBgYnV0dG9uYCBlbGVtZW50cyB0b28g4oCUIHRoZXkgYXJlIGV4Y2x1ZGVkXG4gICBieSBuYW1lIGZ1cnRoZXIgZG93biwgd2hpY2ggaXMgd2h5IGFuIGFycm93IGhhZCBhIHBsYW5rIGJlaGluZCBpdC4gKi9cbi5yZXZlYWwgYnV0dG9uLFxuYnV0dG9uLmxlY3R1cmUtYnRuLFxuLnJldmVhbCBhLmhvbWUtYnRuLFxuLmV4ZXJjaXNlLWFjdGlvbnMgYnV0dG9uLFxuLnNvbHV0aW9uLWFjdGlvbnMgYnV0dG9uLFxuI2sxMkF1dGhCYXIgYnV0dG9uLFxuLndpbmRvdyBidXR0b246bm90KFthcmlhLWxhYmVsPVwiQ2xvc2VcIl0pLFxuLndpbmRvdyBpbnB1dFt0eXBlPXN1Ym1pdF0sXG4ud2luZG93IGlucHV0W3R5cGU9cmVzZXRdIHtcbiAgYm9yZGVyOiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItaW1hZ2U6IHVybChcIi4uL3Jlc291cmNlcy9VSS9idXR0b25faWRsZS5wbmdcIikgMTYgZmlsbCBzdHJldGNoO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBib3gtc2hhZG93OiBub25lO1xuICBjb2xvcjogdmFyKC0tYXhkLWdvbGQpO1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMCAjMDAwO1xuICBwYWRkaW5nOiAxcHggMTBweDtcbiAgbWluLWhlaWdodDogMTZweDtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZmlsdGVyOiBub25lO1xufVxuLnJldmVhbCBidXR0b246aG92ZXIsXG5idXR0b24ubGVjdHVyZS1idG46aG92ZXIsXG4ucmV2ZWFsIGEuaG9tZS1idG46aG92ZXIsXG4uZXhlcmNpc2UtYWN0aW9ucyBidXR0b246aG92ZXIsXG4uc29sdXRpb24tYWN0aW9ucyBidXR0b246aG92ZXIsXG4jazEyQXV0aEJhciBidXR0b246aG92ZXIsXG4ud2luZG93IGJ1dHRvbjpub3QoW2FyaWEtbGFiZWw9XCJDbG9zZVwiXSk6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICBib3JkZXItaW1hZ2Utc291cmNlOiB1cmwoXCIuLi9yZXNvdXJjZXMvVUkvYnV0dG9uX2hvdmVyLnBuZ1wiKTtcbiAgZmlsdGVyOiBub25lO1xufVxuLnJldmVhbCBidXR0b246YWN0aXZlLFxuYnV0dG9uLmxlY3R1cmUtYnRuOmFjdGl2ZSxcbi5yZXZlYWwgYS5ob21lLWJ0bjphY3RpdmUsXG4uZXhlcmNpc2UtYWN0aW9ucyBidXR0b246YWN0aXZlLFxuLnNvbHV0aW9uLWFjdGlvbnMgYnV0dG9uOmFjdGl2ZSxcbiNrMTJBdXRoQmFyIGJ1dHRvbjphY3RpdmUsXG4ud2luZG93IGJ1dHRvbjpub3QoW2FyaWEtbGFiZWw9XCJDbG9zZVwiXSk6YWN0aXZlOm5vdCg6ZGlzYWJsZWQpIHtcbiAgYm9yZGVyLWltYWdlLXNvdXJjZTogdXJsKFwiLi4vcmVzb3VyY2VzL1VJL2J1dHRvbl9wcmVzcy5wbmdcIik7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBUaGUgc2lnbi1pbiBiYXIgYW5kIHRoZSBnYXRlIGJlaGluZCBpdFxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBhdXRoR2F0ZS5qcyBpbmplY3RlZCBpdHMgb3duIDxzdHlsZT4gd2l0aCBhIG5hdnkgcGFsZXR0ZSAoIzFhMjQzMiBiYXIsXG4gICAjM2E1MDY4IGJ1dHRvbnMsIGEgIzNhNmVhNSBmaWVsZCBiZWhpbmQgdGhlIGRpYWxvZykg4oCUIHRoZSBsYXN0IHN1cmZhY2Ugb25cbiAgIHRoZSBwbGF0Zm9ybSBzdGlsbCBjaG9vc2luZyBpdHMgb3duIGNvbG91cnMuIEdlb21ldHJ5IHN0YXllZCBpbiB0aGF0IGZpbGU7XG4gICB0aGUgbG9vayBpcyBoZXJlLCBsaWtlIGV2ZXJ5IG90aGVyIHBhbmVsJ3MuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiNrMTJBdXRoQmFyIHtcbiAgYmFja2dyb3VuZDpcbiAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCB2YXIoLS1heGQtd29vZC1saWdodCkgMCUsIHZhcigtLWF4ZC13b29kKSA0MCUsXG4gICAgICAgICAgICAgICAgICAgIHZhcigtLWF4ZC13b29kLWRhcmspIDEwMCUpO1xuICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYXhkLWdvbGQtZGVlcCk7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNDUpO1xuICBjb2xvcjogdmFyKC0tYXhkLXBhcGVyKTtcbiAgZm9udC1mYW1pbHk6IFwiTGVzc29uIFNlcmlmXCIsIFwiRUIgR2FyYW1vbmRcIiwgXCJUaW1lcyBOZXcgUm9tYW5cIiwgc2VyaWY7XG59XG4jazEyQXV0aEVtYWlsIHsgY29sb3I6IHZhcigtLWF4ZC1nb2xkKTsgfVxuLyogdGhlIGF1dGggYmFyJ3MgaXMgdGhlIGJ1dHRvbiBhYm92ZTsgb25seSBpdHMgc2l6ZSBkaWZmZXJzICovXG4jazEyQXV0aEJhciBidXR0b24geyBmb250LXNpemU6IDEycHg7IHBhZGRpbmc6IDAgMTBweDsgfVxuXG4vKiBUaGUgZmllbGQgYmVoaW5kIHRoZSBzaWduLWluIGRpYWxvZzogdGhlIHBhcGVyIHRoZSByZXN0IG9mIHRoZSBzaXRlIGlzIG9uLFxuICAgZGltbWVkLCByYXRoZXIgdGhhbiBhIGZsYXQgYmx1ZSBub2JvZHkgY2hvc2UgdHdpY2UuICovXG4jazEyQXV0aEdhdGUge1xuICBiYWNrZ3JvdW5kOlxuICAgIGxpbmVhci1ncmFkaWVudChyZ2JhKDI4LCAxNiwgNywgMC41NSksIHJnYmEoMjgsIDE2LCA3LCAwLjU1KSksXG4gICAgdXJsKFwiLi4vcmVzb3VyY2VzL1VJL3BhcGVyX3RpbGUucG5nXCIpIHJlcGVhdDtcbiAgYmFja2dyb3VuZC1zaXplOiBhdXRvLCA1MTJweCA1MTJweDtcbiAgY29sb3I6IHZhcigtLWF4ZC1pbmspO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFJldmVhbCdzIG5hdmlnYXRpb24gYXJyb3dzOiBhbiBhcnJvdywgYW5kIG5vdGhpbmcgYmVoaW5kIGl0XG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIGAucmV2ZWFsIGJ1dHRvbmAgaW4gdGhpcyBmaWxlIGdhdmUgZXZlcnkgYnV0dG9uIGEgd29vZGVuIHBsYW5rLCBhbmQgcmV2ZWFsJ3NcbiAgIGNvbnRyb2xzIEFSRSBidXR0b25zIOKAlCBzbyB0aGUgY29ybmVyIGFycm93IGFycml2ZWQgc2l0dGluZyBvbiBhIHBsYXF1ZSBpdFxuICAgbmV2ZXIgYXNrZWQgZm9yLiBJdCBpcyBhIGNvbnRyb2wsIG5vdCBhbiBvYmplY3Q6IGNoZXZyb24gb25seSwgbm8gcGxhbmssIG5vXG4gICBmcmFtZSwgYW5kIGJyYXNzIHNvIGl0IHJlYWRzIG9uIHBhcmNobWVudC5cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyogcmV2ZWFsJ3Mgb3duIGNvbnRyb2xzIGFyZSBpY29uIGJ1dHRvbnMsIG5vdCBwbGFua3M6IHRoZSBhcnJvd3MgYW5kIHRoZVxuICAgYXV0b3BsYXkgcmVzdW1lIG92ZXJsYXkuIE5hbWVkIHNvIGl0IGlzIGEgZGVjaXNpb24gcmF0aGVyIHRoYW4gYW4gYWNjaWRlbnRcbiAgIG9mIHdoaWNoIHJ1bGUgaGFwcGVuZWQgdG8gbWF0Y2guICovXG4ucmV2ZWFsIC5yZXN1bWUtYnV0dG9uLFxuLnJldmVhbCAuY29udHJvbHMgYnV0dG9uLFxuLnJldmVhbCAuY29udHJvbHMgLm5hdmlnYXRlLWxlZnQsXG4ucmV2ZWFsIC5jb250cm9scyAubmF2aWdhdGUtcmlnaHQsXG4ucmV2ZWFsIC5jb250cm9scyAubmF2aWdhdGUtdXAsXG4ucmV2ZWFsIC5jb250cm9scyAubmF2aWdhdGUtZG93biB7XG4gIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDtcbiAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7XG4gIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgYm9yZGVyLXJhZGl1czogMCAhaW1wb3J0YW50O1xuICBmaWx0ZXI6IG5vbmU7XG59XG4vKiByZXZlYWwgZHJhd3MgdGhlIGFycm93aGVhZCB3aXRoIGJvcmRlcnMgb24gLmNvbnRyb2xzLWFycm93OyByZWNvbG91cmluZyB0aGVcbiAgIGNvbnRhaW5lciBpcyBub3QgZW5vdWdoLCB0aGUgdHJpYW5nbGUgaGFzIGl0cyBvd24gYm9yZGVyLWNvbG91ci4gKi9cbi5yZXZlYWwgLmNvbnRyb2xzIC5jb250cm9scy1hcnJvdyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tYXhkLWdvbGQtZGVlcCk7XG4gIG9wYWNpdHk6IDAuNTU7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMsIGJvcmRlci1jb2xvciAwLjE1cztcbn1cbi5yZXZlYWwgLmNvbnRyb2xzIGJ1dHRvbjpob3ZlciAuY29udHJvbHMtYXJyb3csXG4ucmV2ZWFsIC5jb250cm9scyAubmF2aWdhdGUtbGVmdDpob3ZlciAuY29udHJvbHMtYXJyb3csXG4ucmV2ZWFsIC5jb250cm9scyAubmF2aWdhdGUtcmlnaHQ6aG92ZXIgLmNvbnRyb2xzLWFycm93LFxuLnJldmVhbCAuY29udHJvbHMgLm5hdmlnYXRlLXVwOmhvdmVyIC5jb250cm9scy1hcnJvdyxcbi5yZXZlYWwgLmNvbnRyb2xzIC5uYXZpZ2F0ZS1kb3duOmhvdmVyIC5jb250cm9scy1hcnJvdyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tYXhkLWdvbGQpO1xuICBvcGFjaXR5OiAxO1xufVxuLnJldmVhbCAuY29udHJvbHMgLmVuYWJsZWQgLmNvbnRyb2xzLWFycm93IHsgb3BhY2l0eTogMC43NTsgfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgSGVhZGluZ3MgaW4gdGhlIHJlYWRpbmcgZmFjZVxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICBmb250cy5jc3Mgc2V0cyAtLXItaGVhZGluZy1mb250IHRvIFRodXlfc2FuIChCZSBWaWV0bmFtIFBybyksIGEgc2Fucywgd2hpbGVcbiAgIHRoZSBib2R5IHJ1bnMgaW4gVGh1eV9zZXJpZiAoRUIgR2FyYW1vbmQpLiBPbiBwYXJjaG1lbnQgdGhlIHNhbnMgaGVhZGluZ1xuICAgcmVhZHMgYXMgYSBkaWZmZXJlbnQgZG9jdW1lbnQgc2l0dGluZyBvbiB0b3Agb2YgdGhlIHBhZ2UuIEJvdGggZ28gdG8gdGhlXG4gICBzZXJpZjsgLS1rMTItaDEtZm9udCB3aXRoIHRoZW0sIG9yIHRoZSBiaWdnZXN0IGhlYWRpbmcgb24gdGhlIHNpdGUgaXMgdGhlXG4gICBvbmUgc3RpbGwgaW4gdGhlIG9sZCBmYWNlLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG46cm9vdCB7XG4gIC0tci1oZWFkaW5nLWZvbnQ6IFRodXlfc2VyaWY7XG4gIC0tazEyLWgxLWZvbnQ6ICAgIFRodXlfc2VyaWY7XG4gIC8qIGJsYWNrLmNzcyBzZXRzIHRoaXMgdG8gYHVwcGVyY2FzZWAuIEEgVmlldG5hbWVzZSBoZWFkaW5nIGluIGFsbCBjYXBzIGxvc2VzXG4gICAgIHRoZSBzaGFwZSBvZiBpdHMgdG9uZSBtYXJrcyBhbmQgcmVhZHMgc2hvdXRlZDsgaW4gYSBzZXJpZiBpdCBhbHNvIGxvc2VzIHRoZVxuICAgICBhc2NlbmRlci9kZXNjZW5kZXIgcmh5dGhtIHRoZSBmYWNlIGlzIGRyYXduIGZvci4gKi9cbiAgLS1yLWhlYWRpbmctdGV4dC10cmFuc2Zvcm06IG5vbmU7XG59XG4ucmV2ZWFsIGgxLCAucmV2ZWFsIGgyLCAucmV2ZWFsIGgzLFxuLnJldmVhbCBoNCwgLnJldmVhbCBoNSwgLnJldmVhbCBoNiB7IHRleHQtdHJhbnNmb3JtOiBub25lOyB9XG4ucmV2ZWFsIGgxLCAucmV2ZWFsIGgyLCAucmV2ZWFsIGgzLCAucmV2ZWFsIGg0LFxuLnJldmVhbCBoNSwgLnJldmVhbCBoNiB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1yLWhlYWRpbmctZm9udCk7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAxZW07XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgVGhlIDk4LmNzcyB3aW5kb3cgZmFtaWx5LCBvbiB0aGUgcGxhdGZvcm0gdG9vXG4gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgIFRoZSBsZWN0dXJlJ3MgaW4tc2xpZGUgZGlhbG9ndWUgKGxlY3R1cmVEaWFsb2d1ZS5qcykgaXMgYnVpbHQgYXMgYSA5OC5jc3NcbiAgIHdpbmRvdzogYC53aW5kb3dgICsgYC50aXRsZS1iYXJgICsgYC53aW5kb3ctYm9keWAuIFVudG91Y2hlZCBpdCBhcnJpdmVzIHdpdGhcbiAgIHRoZSBXaW5kb3dzIGJsdWUgZ3JhZGllbnQgaW4gdGhlIG1pZGRsZSBvZiBhIHBhcmNobWVudCBzbGlkZS4gVGhlIGdhbWVcbiAgIGFscmVhZHkgZHJlc3NlcyB0aGlzIGV4YWN0IG1hcmt1cCDigJQgc2FtZSBydWxlcywgc2FtZSBzcHJpdGUsIHNvIHRoZSB0d29cbiAgIGNhbm5vdCBkcmlmdC5cblxuICAgR2VvbWV0cnkgc3RheXMgaW4gc3R5bGUuY3NzIChtYXgtd2lkdGgsIHBvcnRyYWl0IHNpemUsIHRoZSAzNHB4IGxpbmUpOyB0aGlzXG4gICBpcyBzdXJmYWNlIG9ubHkuXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi53aW5kb3cge1xuICAvKiBwYXBlciBpbnNpZGUgdGhlIGZyYW1lLCBtYXRjaGluZyB0aGUgZ2FtZSdzIHBhbmVsIC0tIHRoZSB3b29kIGZpbGwgbGVmdCBhXG4gICAgIGJyb3duIG1hcmdpbiBhcm91bmQgdGhlIHBhZ2UgZm9yIG5vIHJlYXNvbiAqL1xuICBiYWNrZ3JvdW5kOiB1cmwoXCIuLi9yZXNvdXJjZXMvVUkvcGFwZXJfdGlsZS5wbmdcIikgcmVwZWF0O1xuICBiYWNrZ3JvdW5kLXNpemU6IDUxMnB4IDUxMnB4O1xuICBib3JkZXI6IDE0cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIC8qIFNUUkVUQ0gsIG5vdCByb3VuZC4gVGhlIGZyYW1lJ3MgZWRnZSBvcm5hbWVudCBpcyBhIHNpbmdsZSBkcmF3biBydW4sIG5vdCBhXG4gICAgIHJlcGVhdGluZyBtb3RpZiAtLSBtZWFzdXJlZDogZXZlcnkgc2VsZi1zaW1pbGFyaXR5IHBlYWsgYmV5b25kIHRoZSBmaW5lXG4gICAgIGJlYWRpbmcgaXMgTkVHQVRJVkUgKC0wLjI2IGF0IDEwNnB4LCAtMC41NSBhdCAxNjdweCkuIGByb3VuZGAgdGhlcmVmb3JlXG4gICAgIHRpbGVzIHNvbWV0aGluZyB0aGF0IGRvZXMgbm90IHRpbGUsIGFuZCB0aGUgam9pbiBzaG93cyBhcyBhIHJlcGVhdGVkXG4gICAgIHNlZ21lbnQgYWxvbmcgdGhlIHRvcCBlZGdlLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgaXQgbG9va2VkIGxpa2UuIFN0cmV0Y2hlZFxuICAgICBhY3Jvc3MgYSAxNHB4IGJvcmRlciB0aGUgcnVuIGlzIGNvbnRpbnVvdXMgYW5kIHRoZSBkaXN0b3J0aW9uIGlzIGludmlzaWJsZVxuICAgICBhdCB0aGF0IHRoaWNrbmVzcy4gKi9cbiAgYm9yZGVyLWltYWdlOiB1cmwoXCIuLi9yZXNvdXJjZXMvVUkvcGFuZWxfZnJhbWUucG5nXCIpIDcyIHN0cmV0Y2g7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIGJveC1zaGFkb3c6IDAgMTJweCAzNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7XG4gIGNvbG9yOiB2YXIoLS1heGQtcGFwZXIpO1xufVxuLndpbmRvdyA+IC50aXRsZS1iYXIge1xuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCAjN2E0ZjI4IDAlLCAjNGEyZDE1IDQ1JSwgIzMzMjAwZSAxMDAlKTtcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWF4ZC1nb2xkLWRlZXApO1xufVxuLnRpdGxlLWJhci10ZXh0IHtcbiAgY29sb3I6IHZhcigtLWF4ZC1nb2xkKTtcbiAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgIzAwMDtcbiAgZm9udC1mYW1pbHk6IHZhcigtLXItaGVhZGluZy1mb250KTtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDNlbTtcbn1cbi53aW5kb3ctYm9keSB7IGJhY2tncm91bmQ6IG5vbmU7IGNvbG9yOiB2YXIoLS1heGQtaW5rKTsgfVxuXG4vKiBUaGUgZGlhbG9ndWUncyBib2R5IGlzIGEgcGFnZSwgbm90IGEgZ3JleSBwYW5lbDogcGFyY2htZW50IHVuZGVyIHRoZSB3b3JkcyxcbiAgIHdoaWNoIGlzIHdoYXQgdGhlIGJveCBpcyBGT1Igb24gYSBzbGlkZSBhYm91dCBhIGJyb2tlbiBicmlkZ2UuICovXG4uazEyLWRpYWxvZ3VlLWJvZHkge1xuICBiYWNrZ3JvdW5kOlxuICAgIHJhZGlhbC1ncmFkaWVudChlbGxpcHNlIGF0IDUwJSA0MCUsIHJnYmEoMjU1LCAyNDgsIDIyNSwgMC4zNSksIHRyYW5zcGFyZW50IDcwJSksXG4gICAgdXJsKFwiLi4vcmVzb3VyY2VzL1VJL3BhcGVyX3RpbGUucG5nXCIpIHJlcGVhdDtcbiAgYmFja2dyb3VuZC1zaXplOiBhdXRvLCA1MTJweCA1MTJweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYXhkLXBhcGVyLWVkZ2UpO1xuICBwYWRkaW5nOiAxOHB4O1xuICBtYXJnaW46IDA7XG59XG4uazEyLWRpYWxvZ3VlLWxpbmUgeyBjb2xvcjogdmFyKC0tYXhkLWluayk7IH1cblxuLyogV2luZG93IGJ1dHRvbnMgYXJlIHRoZSBvbmUgcnVsZSBhYm92ZS4gVGhlIENMT1NFIGJveCBzdGF5cyB0aGUgZGVsaWJlcmF0ZVxuICAgZXhjZXB0aW9uLCBoZXJlIGFuZCBpbiB0aGUgZ2FtZTogOTguY3NzIGRyYXdzIGl0cyBnbHlwaCBhcyBhIGJhY2tncm91bmRcbiAgIGltYWdlLCBzbyBhIGJvcmRlci1pbWFnZSBwYWludHMgb3ZlciBpdCBhbmQgdGhlIGJveCBzdHJldGNoZXMuICovXG4ud2luZG93IC50aXRsZS1iYXItY29udHJvbHMgYnV0dG9uLFxuLndpbmRvdyBidXR0b25bYXJpYS1sYWJlbD1cIkNsb3NlXCJdIHtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYXhkLWdvbGQtZGVlcCkgIWltcG9ydGFudDtcbiAgYm9yZGVyLWltYWdlOiBub25lICFpbXBvcnRhbnQ7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsICM3YTRmMjggMCUsICM0YTJkMTUgNjAlLCAjMzMyMDBlIDEwMCUpO1xuICB3aWR0aDogMjBweDsgaGVpZ2h0OiAxOHB4OyBtaW4taGVpZ2h0OiAwOyBtaW4td2lkdGg6IDA7IHBhZGRpbmc6IDA7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cbi53aW5kb3cgLnRpdGxlLWJhci1jb250cm9scyBidXR0b246OmFmdGVyLFxuLndpbmRvdyBidXR0b25bYXJpYS1sYWJlbD1cIkNsb3NlXCJdOjphZnRlciB7XG4gIGNvbnRlbnQ6IFwi4pyVXCI7IGZvbnQtc2l6ZTogMTFweDsgbGluZS1oZWlnaHQ6IDE7IGNvbG9yOiB2YXIoLS1heGQtZ29sZCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBOTyBCVVRUT04gTUFZIEhBVkUgSU5WSVNJQkxFIFRFWFRcbiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgOTguY3NzIHN0eWxlcyBldmVyeSBidXR0b24gYXNcblxuICAgICAgIGJ1dHRvbiwgaW5wdXRbdHlwZT1yZXNldF0sIGlucHV0W3R5cGU9c3VibWl0XSB7XG4gICAgICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgICB0ZXh0LXNoYWRvdzogMCAwICMyMjI7XG4gICAgICAgfVxuXG4gICAtLSB0aGUgbGFiZWwgeW91IHNlZSBpcyB0aGUgU0hBRE9XLCBhbmQgdGhlIHRleHQgaXRzZWxmIGlzIHRyYW5zcGFyZW50LiBUaGF0XG4gICBpcyBob3cgaXQgZ2V0cyBhIGNyaXNwIHBpeGVsIGVkZ2UsIGFuZCBpdCBpcyBhIHRyYXAgZm9yIGFueSB0aGVtZSBsYWlkIG92ZXJcbiAgIGl0OiBhIGJ1dHRvbiB0aGlzIHRoZW1lIGRvZXMgbm90IGV4cGxpY2l0bHkgY29sb3VyIGRvZXMgbm90IGNvbWUgb3V0IGluIHRoZVxuICAgd3JvbmcgY29sb3VyLCBpdCBjb21lcyBvdXQgd2l0aCBOTyBURVhUIEFUIEFMTCwgZGFyayBzaGFkb3cgb24gZGFyayB3b29kLlxuICAgTm90aGluZyB3YXJuczsgdGhlIERPTSBzYXlzIHRoZSBsYWJlbCBpcyByaWdodCB0aGVyZS5cblxuICAgSXQgY29zdCBgI3Nob3J0Y3V0LWJ0bmAgYSB3aG9sZSBzZXNzaW9uIG9mIFwidGhlIHRleHQgaXMgbWlzc2luZ1wiLCBhbmQgaXQgd2FzXG4gICBnb2luZyB0byBjb3N0IHRoZSBuZXh0IGNvbnRyb2wgYW55b25lIGFkZHMuIFNvIGl0IGlzIG5ldXRyYWxpc2VkIE9OQ0UsIGZvclxuICAgZXZlcnl0aGluZywgYXQgdGhlIGxvd2VzdCBwb3NzaWJsZSBzcGVjaWZpY2l0eSAtLSBldmVyeSBydWxlIGFib3ZlIG92ZXJyaWRlc1xuICAgaXQsIGFuZCBub3RoaW5nIGNhbiBmYWxsIHRocm91Z2ggdG8gdHJhbnNwYXJlbnQgYWdhaW4uXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbmJ1dHRvbixcbmlucHV0W3R5cGU9cmVzZXRdLFxuaW5wdXRbdHlwZT1zdWJtaXRdIHtcbiAgY29sb3I6IHZhcigtLWF4ZC1nb2xkKTtcbiAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgIzAwMDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= */