/*! Copyright (c) 2026 InfoBeans | infobeans.ai | @InfoBeans */
@charset "UTF-8";
/**
 * Home 2026 dedicated style bundle.
 */
/* InfoBeans Web Concept Style Sheet */
/* ==========================================
   0. Pin host guard — scroll-behavior
   ==========================================

   This page hosts three ScrollTrigger pins (#story, #what-we-ship,
   #video-fold). A pinned fold is only coherent while the scroll position can
   be read and written instantly: js/home.js parks the ship deck and the video
   sequence on band midpoints, and GSAP itself moves the scrollbar during pin
   setup and on every refresh. CSS smooth-scroll animates those writes, so
   progress and the rendered card disagree for the length of the animation and
   the stepper acts on the band being travelled THROUGH rather than the one it
   asked for — the fold steps a card and then walks it back.

   custom.css only ever REMOVED `scroll-behavior: smooth` (see the note in its
   `html, body` rule). Removing is not overriding. Standalone that is enough,
   because nothing else sets the property — but on WordPress every page's CSS
   is concatenated into one LiteSpeed bundle, and the investors page carries a
   bare `html { scroll-behavior: smooth }`. It is unscoped, so it applies to
   the homepage too: staging computes `smooth` on <html> where the static build
   computes `auto`. That is the single environmental difference between the two
   builds on this page. GSAP then makes it worse — its refresh cycle restores
   the value it detected as an INLINE style, so after the first refresh <html>
   carries `style="scroll-behavior: smooth"` and no ordinary rule can outrank it.

   Hence `!important`, and hence keying off the sections themselves rather than
   a `body.page-…` class: the WordPress build cannot be relied on to emit page
   classes, but the markup is always there. Same doctrine (and same reasoning)
   as the ib-pin-host mixin in assets/scss/pages/_utils.scss, which every other
   pinned page on the site already uses; the homepage predates it and was the
   one pinned page still relying on omission.

   Only the scroll-behavior assertion is taken from that mixin. Its other three
   (overflow-x/height/min-height) fix problems this page does not have —
   custom.css already sets overflow-x: clip and min-height: 100% on html/body,
   and the story fold's centring math is measured against those exact values.

   Explicit `behavior: 'smooth'` in a scrollIntoView/scrollTo call still wins
   over this rule (per CSSOM-View an explicit behavior overrides the computed
   property), so the indicator click handlers in js/home.js keep animating. */
html:has(#story),
html:has(#what-we-ship),
html:has(#video-fold) {
  scroll-behavior: auto !important;
}

/* Android-only page-scroll freeze while a pinned deck fold (What We Ship /
   Video) is on screen — toggled by js/home-smootheer-1.js (apSetDeckLock /
   apClearDeckLock). Android runs on native scroll, where a single hard fling
   would otherwise skip straight through the deck; frozen, its cards step by
   swipe instead. `!important` so it outranks the inline `overflow` the overlay
   scroll-locks (ship popup, mobile drawer) set and clear, and so it beats
   custom.css's `html { overflow-x: clip }`. Never added on desktop or iOS. */
html.ap-deck-locked,
html.ap-deck-locked body {
  overflow: hidden !important;
}

/* ==========================================
   6. Fold Structure (Full Viewport snap)
   ========================================== */
.folds-container {
  width: 100%;
}

.fold {
  width: 100%;
  height: 100vh;
  display: flex !important;
  /* added importamt to override wordpress style */
  align-items: center;
  position: relative;
  overflow: hidden;
  padding-top: 84px;
  /* account for header and top bar */
  /* Each fold paints its own background instead of letting the page show
     through. Identical to the colour <body> already uses, so nothing changes
     visually — but a fold is no longer transparent, so while GSAP is still
     building its pins on a slow load (or a scroll lands mid-build) two folds
     that briefly overlap cover each other cleanly instead of rendering one
     section's text straight through the other's. */
  background-color: var(--bg-primary);
  /* Confines every z-index inside a fold to that fold. Without a stacking
     context here, inner values escape to the root: .ship-carousel-wrapper
     (z-index 100) and .ship-slide (z-index 3) were competing page-wide, which
     is why the ship carousel painted ON TOP of the story fold's text rather
     than staying inside its own section. Folds now stack purely in source
     order, later over earlier.
     isolation (not contain/transform) on purpose: it creates a stacking
     context WITHOUT creating a containing block, so position:fixed children
     — the expanded ship slide, the mobile portal — still resolve against the
     viewport exactly as before. */
  isolation: isolate;
}

.fold-content {
  max-width: 762px;
  margin: 0 auto;
}

@media (max-width: 1024px) {
  .fold {
    padding-top: 96px;
  }
}
/* ==========================================
   7. Typography Play (Selfless Act / Diwali story)
   ========================================== */
/* Story section: 100vh, clipped.
   The fold's own box does the initial vertical centering (see
   .story-parent .custom-container below), so the block renders in its final
   position on the very first paint with no script involved. GSAP y on
   fold-content takes over once js/home.js runs (it adds .is-js-fitted) and
   adjusts as content grows — content then extends downward, never upward.

   padding-bottom MUST equal FOLD_BOTTOM_RESERVE in js/home.js. That constant is
   the only slice of this padding js/home.js reserves for the "WHAT WE DO"
   indicator — the rest it lends to the content — so any other value here makes
   the CSS centering box and the JS availH disagree, and the block jumps by half
   the difference the moment home.js re-measures. The indicator itself is
   absolutely positioned (.indicators-wrapper), so it is unaffected by this. */
.story-parent {
  padding-bottom: 56px;
  overflow: hidden !important;
  align-items: flex-start;
  /* Fades from the section's own peach into the next section's cream so the
     handoff to .who-we-are-parent (plain --bg-primary) reads as one continuous
     surface instead of a hard seam. Start stop moved from 76.96% to 65.85% —
     roughly 100px earlier on the ~900px fold this was tuned for — to stretch
     the fade over a longer run instead of compressing it into the last
     stretch of the section. */
  background: linear-gradient(180deg, #ffefd1 65.85%, #fff9ed 100%);
}

/* Height is deliberately NOT !important, and carries the extra .folds-container
   specificity instead. GSAP pins this fold by writing the measured height as an
   INLINE style on the section; an !important declaration beats inline, so the
   box kept rendering at 100vh while its pin-spacer only reserved the measured
   height. On mobile those two are not the same number — 100vh resolves against
   the large viewport (address bar hidden) while GSAP measures the current one —
   and the difference showed up as blank space above the pinned story. The
   ancestor selector still outranks anything the WordPress theme sets on
   `section`, which is why the !important was there in the first place. */
.folds-container .story-parent {
  height: 100vh;
  /* dvh, not vh, is what the CSS centring below has to measure against: 100vh
     resolves to the LARGE viewport (address bar hidden) while js/home.js sizes
     everything from window.innerHeight — the current one. On a phone at load
     those differ by the height of the address bar, and centring in a box that
     much too tall drops the block half that distance below where home.js then
     puts it. dvh tracks innerHeight exactly, so both agree on first paint. Once
     GSAP pins the section it writes its own measured height inline, which wins
     over this — so the value only governs the pre-pin frames. vh above stays as
     the fallback for browsers without dvh support. */
  /* stylelint-disable-next-line declaration-block-no-duplicate-properties */
  height: 100dvh;
}

/* CSS-only first-paint layout.
   The container is exactly availH tall (fold height − padding-top − the 56px
   reserve above), which is the same box js/home.js measures against, and it
   centres fold-content inside it. That is byte-for-byte the position
   fitFoldContent() computes, so when home.js runs there is nothing to correct:
   no jump, and if home.js never loads at all (or a CMS strips inline scripts)
   the fold still renders centred instead of top-anchored.
   `safe center` keeps overflow spilling downward only, so a viewport too short
   for the block never clips the title off the top. */
.story-parent .custom-container {
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  /* `safe center` is the progressive-enhancement pass: browsers that don't parse
     the safe keyword drop this line and keep plain `center` above. Not a real
     duplicate — the pair is the fallback. */
  /* stylelint-disable-next-line declaration-block-no-duplicate-properties */
  justify-content: safe center;
}

/* Handoff: js/home.js adds .is-js-fitted the moment it takes ownership of the
   vertical position. From then on the GSAP y transform is the single source of
   truth — leaving the CSS centring on would stack on top of it and offset the
   block by half the free space. */
.story-parent.is-js-fitted .custom-container {
  justify-content: flex-start;
}

/* Bounds fold-content at availH before any measurement runs: the scroll-body is
   the only child allowed to give (min-height: 0 + overflow: hidden), so long
   opening paragraphs clip inside the reading window instead of pushing
   story-meta past the fold. Same guarantee js/home.js's max-height cap provides
   — the cap it computes later equals what this layout already produced, so it
   lands as a no-op. */
.story-parent .fold-content {
  display: flex;
  flex-direction: column;
  max-height: 100%;
  min-height: 0;
  /* As a flex item its `margin: 0 auto` (css above) would otherwise size it to
     fit-content instead of filling up to max-width — keeps the 762px column
     identical to the block-layout version. */
  width: 100%;
}

/* story-scroll-body clips the paragraphs — story-meta lives below it so the
   avatar's negative margin-left is never clipped by overflow-x. max-height is
   set by JS to keep fold-content bounded at availH, ensuring story-meta is
   always fully visible.

   overflow is HIDDEN, not auto: as a native scroll container it swallowed wheel
   and touch gestures over the paragraphs, so the pinned section's own scroll
   (which drives the reveal) fought it. Hidden still leaves the element
   programmatically scrollable, which is all js/home.js needs — it tweens
   scrollTop itself after each para is revealed. */
.story-scroll-body {
  overflow: hidden;
  scrollbar-width: none;
  -ms-overflow-style: none;
  /* Shrink-only (never auto-grow): at rest the reading window keeps its natural
     height, so the opening block stays a compact, centred group and story-meta
     is not pushed to the fold's bottom edge before the reader has scrolled. It
     only gives when fold-content would otherwise exceed availH, which is what
     makes the max-height: 100% above bite here rather than overflowing.
     js/home.js does grow it, once, on the first reveal — via an explicit height
     (frozenH, sized against the fold so short paragraphs still get a full-height
     reading band), which the transition below carries. flex-grow stays 0 so that
     step is the script's decision alone and never happens implicitly. */
  flex: 0 1 auto;
  min-height: 0;
  /* spacing between the last para and Ritesh below */
  margin-bottom: 12px;
  /* The one step this box takes — js/home.js pins it to an explicit height on
     the first reveal, and that used to land in a single frame, so story-meta
     (Ritesh + the caption underneath) teleported down. Transitioning it makes
     the box grow into its new size instead, and because home.js kicks off its
     fold-content re-centre on the same frame with a matching 0.6s, the two
     read as one motion rather than a jump plus a correction.

     Animating height is normally off-limits here — it costs a layout pass per
     frame — but this fires exactly twice in the fold's life (once on the way
     down, once on the way back), never per scroll frame.

     The curve is GSAP's power2.out expressed as a bezier, deliberately: that
     is the ease fitFoldContent() tweens fold-content with, and the two run
     together. On different curves they drift apart mid-flight and you see two
     motions; on the same one they read as a single move. */
  transition: height 0.6s cubic-bezier(0.215, 0.61, 0.355, 1);
}

.story-scroll-body::-webkit-scrollbar {
  display: none;
}

/* Touch: the height step is applied instantly (js/home-smootheer-1.js passes
   IS_COARSE_POINTER through fitFoldContent). This kills the matching 0.6s CSS
   height tween so it can't run WHILE the pinned scroll is still scrubbing
   .story-desc-wrapper — the two motions overlapping is the "jerks while
   reading" on iOS. Desktop keeps the eased grow. */
@media (pointer: coarse) {
  .story-scroll-body {
    transition: none;
  }
}
/* Mobile uses the same pinned scroll reveal as desktop, and the same
   padding-bottom: js/home.js reserves FOLD_BOTTOM_RESERVE (56px) at every
   breakpoint, so a larger value here would only desync the CSS centring box
   from the JS availH — see the .story-parent rule above. */
.story-parent .story-title {
  font-size: clamp(28px, 2.78vw, 48px);
  font-weight: 300;
  line-height: clamp(38px, 3.7vw, 64px);
  letter-spacing: 0;
  max-width: 900px;
  margin-bottom: 24px;
  /* Gradient Text Styling from Figma */
  background: linear-gradient(90.03deg, #284cba 0%, #ea1b3d 56.87%);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
  -webkit-text-fill-color: transparent;
}

/* Strikethrough Play Styling */
.title-strike {
  position: relative;
  display: inline-block;
  color: #eb2c00;
  -webkit-text-fill-color: #eb2c00;
  font-weight: 300;
  white-space: nowrap;
  background: none;
  background-clip: unset;
}

.strike-line {
  position: absolute;
  left: 0;
  top: 52%;
  width: 0;
  height: 4px;
  background-color: #eb2c00;
  border-radius: 2px;
}

.title-highlight {
  color: var(--accent-red);
  -webkit-text-fill-color: #eb2c00;
  display: inline-block;
  background: none;
  background-clip: unset;
  opacity: 0;
}

/* ==========================================
   7b. Who We Are Statement fold
   ========================================== */
/* Carries the extra .folds-container specificity (same trick as
   .folds-container .story-parent above) instead of !important. This fold is
   never pinned, so nothing writes an inline height here — the only thing that
   can resurrect .fold's `height: 100vh` is source order: a partially-downloaded
   stylesheet that parsed `.fold` but not this rule yet, or the WordPress build
   concatenating this file ahead of the base `.fold` block. On mobile that
   rendered a full viewport of empty peach above the heading. The ancestor
   selector wins regardless of order, and still outranks any bare `section`
   rule the theme sets. */
.folds-container .who-we-are-parent {
  background: var(--bg-primary);
  /* Overrides .fold's 100vh — this is a short statement block, not a full-screen
     fold, so it should size to its own content instead of forcing a full
     viewport of empty space above/below the heading. */
  height: auto;
  min-height: 0;
  padding-top: 0;
  padding-bottom: 0;
}

.who-we-are-title {
  font-family: var(--font-primary);
  font-weight: 300;
  font-size: clamp(18px, 4vw, 28px);
  line-height: clamp(26px, 5.5vw, 38px);
  letter-spacing: 0;
  text-align: left;
  color: var(--text-primary);
  max-width: 680px;
  position: relative;
  /* Same left shift as .story-meta's margin-left (the avatar row above) — both
     computed from the shared .fold-content edge, so the TEXT lands exactly
     under the avatar photo's own left edge instead of guessing at a fixed
     offset. The accent line sits further left, off the text's own box (see
     ::before below), so it doesn't push the text off that alignment. */
  margin-left: clamp(-48px, -2.78vw, -28px);
}

.who-we-are-title::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: -24px;
  width: 1px;
  background-color: #eddab8;
}

.who-we-are-title .gradient-text {
  background: linear-gradient(90.03deg, #284cba 0%, #ea1b3d 56.87%);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
  -webkit-text-fill-color: transparent;
}

/* js/home.js travels the story by transforming THIS element, not by setting
   scrollTop on .story-scroll-body above it — text is not layer-backed, so
   scrolling it repaints every line, once per frame, for the whole length of
   the pin. will-change keeps the wrapper on its own compositor layer so that
   per-frame move is a composite instead. The clipping still comes from
   .story-scroll-body's overflow: hidden, exactly as before. */
.story-desc-wrapper {
  will-change: transform;
  /* Pin the wrapper to its own compositor layer from first paint, not only
     once JS starts transforming it. On iOS Safari a will-change hint alone can
     leave the layer un-promoted until the first transform lands, and the
     promotion itself — mid-scroll — is a visible hitch. translateZ(0) forces
     it up front; backface-visibility:hidden stops the sub-pixel text
     re-rasterisation that reads as the story "shivering" while being read.
     js/home-smootheer-1.js overwrites transform with its translate3d each
     frame, so this is only the resting value. */
  transform: translateZ(0);
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}

/* --story-desc-gap is the ONE definition of the space between paragraphs. The
   hidden / revealed / measuring states below all resolve their margin from it,
   so what js/home.js measures is always what the browser renders. Hardcoding
   12px in those states meant mobile (15px here) rendered gaps the measuring
   pass never saw, and the scrub ended short — clipping the last line. */
.story-desc {
  --story-desc-gap: 12px;
  font-size: clamp(16px, 1.39vw, 24px);
  font-weight: 250;
  line-height: 1.66;
  color: #000;
  max-width: 760px;
  margin-bottom: var(--story-desc-gap);
}

/* Paras 3+ are hidden on load — height:0 reserves no space.
   NOTE: the number 3 must equal INITIAL_VISIBLE_PARAS + 1 in home.js. */
.story-desc-wrapper .story-desc:nth-child(n+3) {
  height: 0;
  overflow: hidden;
  opacity: 0;
  transform: translateY(24px);
  margin-top: 0;
  margin-bottom: 0;
  /* Matched to the box's height transition and fitFoldContent()'s tween —
     same 0.6s, same curve — so the paragraph arriving, the box growing and
     the block re-centring are one motion. At 0.7s on a different ease the
     paragraph was still settling after the other two had stopped, which is
     what made the third one feel like it landed separately. */
  transition: opacity 0.6s cubic-bezier(0.215, 0.61, 0.355, 1), transform 0.6s cubic-bezier(0.215, 0.61, 0.355, 1);
}

/* Scroll-revealed — same specificity, placed after :nth-child so it wins on source order. */
.story-desc-wrapper .story-desc.is-visible {
  height: auto;
  overflow: visible;
  opacity: 1;
  transform: translateY(0);
  margin-top: 0;
  margin-bottom: var(--story-desc-gap);
}

/* Measurement pass (js/home.js): every para is briefly laid out at the height
   it will have once revealed, so the reveal points and scroll travel can be
   read in one batch. Geometry only — opacity and transform are left alone, so
   nothing animates and the pass, reverted in the same frame, is never painted.
   Last of the three rules, so it wins on source order. */
.story-desc-wrapper.is-measuring .story-desc {
  height: auto;
  overflow: visible;
  margin-top: 0;
  margin-bottom: var(--story-desc-gap);
}

/* Cue for the paras hidden by :nth-child(n+3) above — without it, nothing
   signals there's more of the story to reveal by scrolling. Hidden by
   default; js/home.js adds .is-visible only while text remains to reveal. */
/* The cue's line box and bottom margin are reserved at all times — it fades
   and slides, but never collapses. It used to toggle height 0 <-> auto and
   margin 0 <-> clamp(), so hiding it at the end of the story shrank
   .fold-content and dragged .story-meta up with it. Space stays claimed;
   only opacity/transform animate (composite-only, no reflow). */
.story-scroll-cue {
  font-weight: 300;
  font-size: 12px;
  line-height: 18px;
  color: #eb4c5e;
  /* Gap down to .story-meta (the avatar row). Reserved at all times — see the
     note above — so shrinking it does not just tighten the visual spacing, it
     hands the difference back to the reading window: storyAvailH() measures
     fold-content, and a shorter cue margin means more room for story lines. */
  margin: 0 0 32px;
  opacity: 0;
  transform: translateY(10px);
  will-change: transform, opacity;
  transition: opacity 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94), transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.story-scroll-cue.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* Story Metadata & Author Details */
.story-meta {
  display: flex;
  align-items: center;
  gap: clamp(10px, 0.93vw, 16px);
  position: relative;
  padding-top: 2px;
  margin-left: clamp(-48px, -2.78vw, -28px);
  max-width: 300px;
  cursor: pointer;
}

.story-meta::before {
  content: "";
  position: absolute;
  top: 0;
  left: 49px;
  width: 44px;
  height: 1.5px;
  background-color: #ffefd1;
}

.avatar-wrapper {
  width: 32px;
  height: 34px;
  border-radius: 50% 50% 0 0;
  overflow: hidden;
  background-color: #0b1415;
}

.avatar-img {
  width: 100%;
  height: 100%;
  -o-object-fit: cover;
     object-fit: cover;
}

.story-author-details {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  line-height: 18px;
  font-weight: 300;
  text-transform: uppercase;
  color: #676775;
  margin-top: clamp(10px, 0.93vw, 16px);
}

.story-dot {
  color: #676775;
  font-size: clamp(11px, 1.04vw, 18px);
}

/* Avatar Expanded Overlay CSS */
.avatar-expanded-overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 2000;
  pointer-events: none;
  overflow: hidden;
}

.avatar-expanded-overlay.is-open {
  pointer-events: auto;
}

.avatar-expanded-overlay .expanded-bg {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #0b1415;
  transform: scaleX(0);
  transform-origin: center center;
  opacity: 0;
  z-index: 1;
  /* Close: bg fades out after avatar collapses, then strip snaps away */
  transition: opacity 0.4s ease 0.3s, transform 0s linear 0.7s;
}

.avatar-expanded-overlay.is-open .expanded-bg {
  transform: scaleX(1);
  opacity: 1;
  /* Open: avatar expands first, then bg fades + expands in behind it */
  transition: opacity 0.5s ease 0.3s, transform 0.5s cubic-bezier(0.16, 1, 0.3, 1) 0.3s;
}

.expanded-avatar-container {
  /* Fixed at final size and position; JS sets transform-origin to the avatar
     location so scale(0)→scale(1) appears to grow from the avatar. */
  position: fixed;
  left: 50%;
  top: 50%;
  /* width: min(80vw, 712px); */
  width: 100%;
  height: 100%;
  /* border-radius: 300px 300px 0 0; */
  overflow: hidden;
  z-index: 2;
  transform: translate(-50%, -50%) scale(0);
  will-change: transform;
  /* Close: spring collapse — mirrors the open spring expansion */
  transition: transform 0.55s cubic-bezier(0.16, 1, 0.3, 1), border-radius 0.55s cubic-bezier(0.16, 1, 0.3, 1);
}

/* Left-side scrim over the photo — keeps expanded-avatar-text legible
   regardless of the underlying image, without flattening the portrait on
   the right where the subject sits. Paints above .expanded-avatar-img
   (later in the container's own stacking context) but stays below the
   text/close button, which are separate siblings with higher z-index. */
.expanded-avatar-container::after {
  content: "";
  position: absolute;
  inset: 0;
  /* background: linear-gradient(
    to right,
    rgba(16, 26, 27, .75) 0%,
    rgba(16, 26, 27, .55) 35%,
    rgba(16, 26, 27, 0) 60%
  ); */
  background: #101a1b;
  opacity: 0.3;
  pointer-events: none;
}

.avatar-expanded-overlay.is-open .expanded-avatar-container {
  transform: translate(-50%, -50%) scale(1);
  transition: transform 0.65s cubic-bezier(0.16, 1, 0.3, 1), border-radius 0.65s cubic-bezier(0.16, 1, 0.3, 1);
  background: #0b1415;
}

/* Hard-capped to the right 60% of the viewport — NOT left to fill the full
   width and rely on object-position/letterboxing to keep clear of the text.
   That was aspect-ratio-dependent: whenever the viewport's aspect ratio is
   narrower than the photo's own (true for most window shapes, since the
   source photos are landscape), object-fit:contain has no horizontal slack
   to push around and the image fills 100% width regardless of
   object-position — so the subject's on-screen position drifted with the
   viewport's height (bottom-anchored image + a vertically-centered text
   block), and on short/squat windows the text could end up level with a
   wide part of the face. Confining the image to a fixed column removes
   that height-dependency; 60% keeps the photo at a natural size on real
   laptop/desktop widths (which run wide, not short) while still leaving
   the text column (max ~43% of viewport, see .expanded-avatar-text)
   guaranteed clearance down to ~1200px. Narrower desktop widths
   (1025-1199px, e.g. a deliberately shrunk browser) get a tighter margin
   here — acceptable since that's not a realistic laptop viewport. */
.expanded-avatar-img {
  position: absolute;
  top: 0;
  right: 0;
  width: 60%;
  height: 100%;
  -o-object-fit: contain;
     object-fit: contain;
  -o-object-position: right bottom;
     object-position: right bottom;
  transform: scale(1.1);
  transform-origin: right center;
  transition: transform 0.4s ease;
}

.avatar-expanded-overlay.is-open .expanded-avatar-img {
  transform: scale(1);
}

.expanded-avatar-text {
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  text-align: left;
  z-index: 3;
  color: #fff;
  opacity: 0;
  width: clamp(260px, 38vw, 591px);
  margin-left: clamp(24px, 5vw, 96px);
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.8);
  transition: opacity 0.2s ease 0s;
  /* close: fast, no delay */
}

.avatar-expanded-overlay.is-open .expanded-avatar-text {
  opacity: 1;
  transition: opacity 0.4s ease 0.8s;
  /* open: after bg has expanded */
}

.expanded-name {
  font-size: 72px;
  line-height: 88px;
  font-weight: 250;
  margin-bottom: 8px;
  letter-spacing: 2.88px;
}

.expanded-role {
  margin-bottom: 40px;
  font-size: 24px;
  font-weight: 500;
  line-height: 40px;
}

.expanded-quote {
  font-size: 24px;
  font-weight: 500;
  line-height: 40px;
  max-width: 590px;
}

.expanded-close {
  position: absolute;
  top: 48px;
  right: 48px;
  width: 40px;
  height: 40px;
  z-index: 10;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.2s ease 0s;
  /* close: fast, no delay */
  display: flex;
  align-items: center;
  justify-content: center;
}

.expanded-close i {
  font-size: 24px;
  color: #fff;
  transition: transform 0.3s ease;
}

.expanded-close .ib-icon {
  width: 24px;
  height: 24px;
  color: #fff;
  transition: transform 0.3s ease;
}

.expanded-close:hover i,
.expanded-close:hover .ib-icon {
  transform: scale(1.1);
}

.avatar-expanded-overlay.is-open .expanded-close {
  opacity: 1;
  transition: opacity 0.3s ease 0.8s;
  /* open: after bg has expanded */
}

@media (max-width: 1024px) {
  .expanded-avatar-container {
    width: 100vw;
    height: 100vh;
    border-radius: 0;
    top: auto;
    bottom: 0;
    left: 50%;
    transform: translate(-50%, 0%) scale(0);
  }

  /* Open order is reversed on mobile: the bg must be in place before the
     avatar (object-fit:contain, bottom-anchored — see base rule) scales up
     over it, so there's no flash of the container's own background. */
  .avatar-expanded-overlay.is-open .expanded-bg {
    transition: opacity 0.35s ease 0s, transform 0s linear 0s;
    /* pure fade — no scaleX strip on mobile */
  }

  .avatar-expanded-overlay.is-open .expanded-avatar-container {
    transform: translate(-50%, 0%) scale(1);
    transition: transform 0.65s cubic-bezier(0.16, 1, 0.3, 1) 0.25s, border-radius 0.65s cubic-bezier(0.16, 1, 0.3, 1) 0.25s;
  }

  /* Stacked layout: the photo is pinned to a hard vh-capped band at the
     bottom (not left to float at whatever height object-fit:contain
     happens to land on) so its visible top edge can never climb into the
     text zone above it — this holds regardless of the viewport's aspect
     ratio (tall phone vs. near-square tablet window), unlike the previous
     approach which relied on aspect-ratio-dependent transform percentages
     and broke on wider/shorter windows (e.g. 1010x980). */
  .expanded-avatar-img {
    position: absolute;
    top: auto;
    right: auto;
    left: 0;
    bottom: 0;
    width: 100%;
    height: 60vh;
    -o-object-position: center bottom;
       object-position: center bottom;
    transform: scale(1.08);
    transform-origin: center bottom;
  }

  .avatar-expanded-overlay.is-open .expanded-avatar-img {
    transform: scale(1.15);
  }

  /* Text owns the guaranteed-clear band above the photo's 60vh cap —
     centered within it via flex instead of the old percentage-transform
     guesswork, so it can't drift into the photo's territory. */
  .expanded-avatar-text {
    left: 50%;
    top: 0;
    width: 100%;
    height: 40vh;
    max-width: none;
    padding: 0 24px;
    margin: 0;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    text-align: center;
    transform: translateX(-50%);
  }

  .expanded-name {
    font-size: 48px;
    line-height: 52px;
    letter-spacing: 1.92px;
  }

  .expanded-role {
    margin-bottom: 28px;
    font-size: 16px;
    line-height: 26px;
    text-transform: uppercase;
  }

  .expanded-quote {
    font-size: 16px;
    font-weight: 300;
    line-height: 26px;
    max-width: 290px;
    margin: 0 auto;
  }

  .expanded-close {
    inset: auto auto 24px 50%;
    transform: translateX(-50%);
    width: 48px;
    height: 48px;
  }

  .expanded-close i {
    font-size: 48px;
  }

  .expanded-close .ib-icon {
    width: 32px;
    height: 32px;
  }
}
/* Responsive Typography Adjustments */
@media (min-width: 769px) and (max-width: 1024px) {
  .story-title {
    font-size: 60px;
    letter-spacing: -2px;
  }

  .story-desc {
    font-size: 18px;
  }
}
@media (max-width: 768px) {
  .fold.active .story-title {
    font-size: 32px;
    line-height: 43px;
    letter-spacing: -1px;
    margin-bottom: 24px;
  }

  .story-desc {
    /* Set the token, not margin-bottom — every paragraph state reads it, so
       the measuring pass in js/home.js picks up the mobile gap too. */
    --story-desc-gap: 15px;
    font-size: 16px;
  }

  .strike-line {
    height: 3px;
  }

  .story-desc-wrapper {
    margin-bottom: 0;
  }
}
/* ==========================================
   8. Scroll Indicator
   ========================================== */
.indicators-wrapper {
  position: absolute;
  bottom: 32px;
  left: 50%;
  transform: translateX(-50%);
  width: 100%;
  max-width: var(--container-width-padd);
  /* mirrors .custom-container */
  padding: 0 40px;
  /* mirrors .custom-container */
  box-sizing: border-box;
  display: flex;
  align-items: center;
  z-index: 10;
  transition: opacity 0.25s ease;
}

/* Indicators are only meaningful while their own fold is the active one —
   once ScrollTrigger moves past it (fold loses .active), hide them instantly
   instead of letting them ride along as the fold scrolls out of view.
   !important is required because GSAP sets an inline opacity/visibility
   style on .what-we-do-indicator for the timed reveal. */
.fold:not(.active) .indicators-wrapper {
  opacity: 0 !important;
  visibility: hidden !important;
  pointer-events: none !important;
}

.what-we-do-indicator {
  margin-left: auto;
  /* pushes to container right edge */
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 10px;
  padding-right: 5px;
  opacity: 0;
  visibility: hidden;
  cursor: pointer;
}

.what-we-do-indicator .ib-icon,
.what-we-ship-indicator .ib-icon {
  color: var(--accent-red);
}

@media (max-width: 768px) {
  .indicators-wrapper {
    padding: 0 24px;
  }
}
@media (max-width: 768px) {
  .what-we-do-indicator {
    display: none;
  }
}
.what-we-ship-indicator {
  margin-left: auto;
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 10px;
  padding-right: 5px;
  text-decoration: none;
  color: inherit;
  cursor: pointer;
}

@media (max-width: 1024px) {
  .what-we-ship-indicator {
    display: none;
  }
}
/* 4th Tab More Dots */
.what-we-ship-parent .more-dots {
  display: flex;
  gap: 6px;
  align-items: center;
  justify-content: center;
  height: 25px;
}

.what-we-ship-parent .more-dots .dot {
  width: 6px;
  height: 6px;
  background-color: #969696;
}

/* .what-we-ship-parent .more-dots .dot {
  background-color: var(--accent-red);

} */
.what-we-ship-parent .ship-tab.active .dot {
  background-color: var(--accent-red);
}

.what-we-ship-parent .red-arrow {
  color: var(--accent-red);
  font-size: 14px;
}

@keyframes fade-in {
  0% {
    opacity: 0;
    visibility: hidden;
  }
  100% {
    opacity: 1;
    visibility: visible;
  }
}
.scroll-icon {
  animation: bounce-up-down 2s ease-in-out infinite;
}

@keyframes bounce-up-down {
  0%, 100% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(10px);
  }
}
.scroll-text {
  font-size: 14px;
  line-height: 18px;
  color: #969696;
  font-weight: 300;
}

/* ==========================================
   9. Scroll Animations & Transitions
   ========================================== */
/* Animations Triggered When Section is Active */
.fold.active .story-title {
  opacity: 1;
  transform: translateY(0);
  transition-delay: 0.2s;
}

/* No `animation` here, deliberately — that is what made the avatar row blink
   two or three times on load.

   .story-meta has no hidden base state, so the fade-in keyframes were the only
   thing that ever took it to opacity 0, and a CSS animation restarts from 0%
   every time its element is re-inserted into the DOM. #story is re-inserted
   repeatedly during startup: ScrollTrigger wraps the section in a .pin-spacer
   when the pin is created (js/home.js, initAllScrollTriggers on
   document.fonts.ready), and swaps it in and out of that spacer again on each
   refresh as the later pins are built. Every one of those replayed the 0.2s
   fade — read as a flash, because the row was already on screen.

   Same class of bug as the strike-line/highlight note below: anything inside a
   pinned section that must animate exactly once belongs on a GSAP timeline
   (which writes inline styles and is indifferent to re-parenting), never on a
   CSS animation. The two declarations left are the .active pair kept for
   symmetry with .story-title above; both are no-ops against the base state. */
.fold.active .story-meta {
  opacity: 1;
  transform: translateY(0);
}

/* NOTE: the strike-line draw + "lives" highlight reveal are now driven by a
   GSAP timeline (storyTitleTl in js/app.js) that replays each time the story
   fold becomes active. This fixes the load case where #story already carries
   .active, so the old CSS transition never replayed on first paint. */
@media (max-width: 1024px) {
  .story-meta {
    margin-left: 0;
  }

  .story-meta::before {
    background-color: #9797a4;
    left: 44px;
    height: 1px;
  }

  /* Matches .story-meta's own reset above — same shared-edge reasoning. */
  .who-we-are-title {
    margin-left: 0;
  }
}
@media (max-width: 768px) {
  /* Desktop's -24px pulls the line out to the left of the text box, which is
     fine against the desktop container's wide side padding but runs the line
     straight into (and past) the narrower mobile container padding, clipping
     it out of view. Pinning it to the box's own edge lands it on the same
     spot .who-we-are-title's text (and the avatar photo above) already sit
     at on mobile — see the margin-left: 0 reset above — so it stays visible
     instead of disappearing off-container. */
  .who-we-are-title::before {
    left: 0;
  }

  /* The line landing flush on the text's own edge (left: 0 above) means the
     text needs its own gap now, since desktop got its gap for free from the
     line sitting off-box at -24px instead. */
  .who-we-are-title {
    padding-left: 12px;
  }
}
/* ==========================================
   10. Enterprise Partner Fold
   ========================================== */
.enterprize-partner-parent .partner-container {
  position: relative;
  height: 100%;
  display: flex !important;
  align-items: center;
  justify-content: space-between;
}

/* partner-content and badge-ribbon reveal is driven by GSAP in home.js */
.enterprize-partner-parent .partner-content {
  max-width: 1000px;
  margin: 0;
}

.partner-tags {
  display: flex;
  gap: 40px;
  margin-bottom: 24px;
  font-size: 18px;
  font-weight: 300;
  color: var(--text-secondary);
  letter-spacing: 0.5px;
  text-transform: uppercase;
}

.enterprize-partner-parent .partner-title {
  font-size: clamp(43px, 4.17vw, 72px);
  font-weight: 250;
  line-height: clamp(52px, 5.09vw, 88px);
  letter-spacing: -2px;
  margin-bottom: 64px;
}

.enterprize-partner-parent .partner-title .gradient-text {
  background: linear-gradient(90deg, #284cba 0%, #7b4397 30%, #ea1b3d 100%);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
  -webkit-text-fill-color: transparent;
  display: block;
}

.enterprize-partner-parent .partner-title .dark-text {
  color: var(--font-primary);
  font-size: clamp(66px, 6.48vw, 112px);
  font-weight: 400;
  line-height: clamp(69px, 6.71vw, 116px);
  display: block;
  margin-top: 16px;
}

.enterprize-partner-parent .challenge-input-container {
  position: relative;
  max-width: 800px;
  margin-top: 40px;
}

.enterprize-partner-parent .challenge-input {
  width: 100%;
  border: none;
  background: transparent;
  font-size: 24px;
  font-family: var(--font-primary);
  color: var(--text-primary);
  padding: 16px 40px 16px 0;
  outline: none;
  font-weight: 300;
}

.enterprize-partner-parent .challenge-input::-moz-placeholder {
  color: var(--text-secondary);
  opacity: 0.7;
}

.enterprize-partner-parent .challenge-input::placeholder {
  color: var(--text-secondary);
  opacity: 0.7;
}

.enterprize-partner-parent textarea.challenge-input {
  display: block;
  resize: none;
  overflow: hidden;
  line-height: 1.4;
  height: calc(1.4em + 32px);
  /* one text line + vertical padding */
}

.enterprize-partner-parent .challenge-submit {
  position: absolute;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  background: transparent;
  border: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
}

.enterprize-partner-parent .challenge-submit:hover {
  opacity: 0.8;
}

.enterprize-partner-parent .gradient-line {
  height: 4px;
  width: 100%;
  background: linear-gradient(90deg, #284cba 0%, #ea1b3d 100%);
  margin-top: 8px;
}

/* Outer mask — the ONLY thing that animates for the "unroll" reveal.
   badge-ribbon inside it never transforms or clips dynamically, so its
   permanent notch silhouette + content render as ONE static banner; the wrap
   just reveals more of that static banner top-down via clip-path. This is
   deliberately a single combined effect (one clip, one thing moving) —
   an earlier version animated the ribbon's own scaleY *and* an inner
   content clip-path separately, which visibly read as two overlapping
   layers instead of one unroll. */
.enterprize-partner-parent .award-badge-wrap {
  position: relative;
  overflow: hidden;
  margin-top: -28px;
  /* hangs higher from top — was on .badge-ribbon */
}

.enterprize-partner-parent .badge-ribbon {
  position: relative;
  width: 280px;
  background-color: #faebd2;
  /* yellowish background matching screenshot */
  border-top: 3px solid #c99b40;
  /* Golden line at the very top */
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: clamp(47px, 4.63vw, 80px) clamp(18px, 1.74vw, 30px) clamp(80px, 8.1vw, 140px);
  z-index: 5;
  clip-path: polygon(0 0, 100% 0, 100% 100%, 50% calc(100% - 25px), 0 100%);
}

/* Tracks the current unrolled edge — fades in as it leaves the fixed top
   axle (the gold border-top), fades out again once fully revealed. */
.enterprize-partner-parent .ribbon-edge-shadow {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 22px;
  background: linear-gradient(to bottom, rgba(32, 20, 4, 0.3), rgba(32, 20, 4, 0));
  opacity: 0;
  pointer-events: none;
  z-index: 6;
}

.enterprize-partner-parent .wow-moment-header {
  display: flex;
  flex-direction: column;
  align-items: center;
  margin-bottom: 24px;
}

.enterprize-partner-parent .gold-line {
  width: 40px;
  height: 1px;
  background-color: #bf8208;
  margin-bottom: 12px;
}

.enterprize-partner-parent .wow-moment-text {
  color: #bf8208;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 2px;
}

.enterprize-partner-parent .award-badge-icon {
  width: 100%;
  max-width: clamp(107px, 10.42vw, 180px);
  height: auto;
  -o-object-fit: contain;
     object-fit: contain;
  margin-bottom: clamp(14px, 1.39vw, 24px);
}

.enterprize-partner-parent .award-badge-text {
  text-align: center;
}

.enterprize-partner-parent .award-badge-text p {
  color: #a41f35;
  /* dark red */
  font-size: 18px;
  line-height: 1.5;
  font-weight: 500;
}

/* Responsive */
@media (max-width: 1024px) {
  .enterprize-partner-parent .partner-container {
    flex-direction: column;
    padding: 40px 20px;
    align-items: flex-start;
  }

  .enterprize-partner-parent .award-badge-wrap {
    width: 100%;
    margin-top: 40px;
    margin-right: 0;
  }

  .enterprize-partner-parent .badge-ribbon {
    width: 100%;
    max-width: none;
    margin-right: 0;
    clip-path: none;
    border-radius: 8px;
    border-top: none;
    display: grid;
    grid-template-areas: "header header" "icon text";
    grid-template-columns: 70px 1fr;
    gap: 16px 5px;
    padding: 24px 20px;
  }

  .enterprize-partner-parent .wow-moment-header {
    grid-area: header;
    flex-direction: row;
    justify-content: flex-start;
    margin-bottom: 0;
  }

  .enterprize-partner-parent .gold-line {
    margin-bottom: 0;
    margin-right: 16px;
    width: 42px;
    height: 2px;
  }

  .enterprize-partner-parent .award-badge-icon {
    grid-area: icon;
    max-width: 90%;
    margin-bottom: 0;
  }
}
@media (min-width: 769px) and (max-width: 1024px) {
  .enterprize-partner-parent .partner-title {
    font-size: 42px;
    line-height: 50px;
    letter-spacing: 1px;
  }

  .enterprize-partner-parent .partner-title .dark-text {
    font-size: 80px;
    line-height: 84px;
  }

  .enterprize-partner-parent .badge-ribbon {
    grid-template-columns: 175px 1fr;
    gap: 16px 5px;
  }

  .enterprize-partner-parent .award-badge-text p {
    font-size: 32px;
    line-height: 1.4;
    text-align: left;
  }

  .enterprize-partner-parent .award-badge-text p br {
    display: none;
  }
}
@media (max-width: 768px) {
  /* Phone only — tablet (769-1024px) is left on the base .fold `height: 100vh`,
     which fits there. On a phone that fixed height + .fold's `overflow: hidden`
     clips: the column (tags + two-line title + challenge field + WOW banner)
     can run taller than the visible viewport, and on iOS 100vh is the LARGE
     viewport on top of that, so the bottom of the banner is cut off.
     Fix: drop the fixed height for a 100dvh floor so the section can grow to
     its content and the page just scrolls — nothing clipped. The layout the
     design wants is kept: copy pinned to the top, banner to the bottom. That is
     `space-between` (inherited from the base .partner-container rule), and it
     needs a container taller than its content to open that gap — so
     .partner-container keeps a viewport-tall min-height (was height: 100%,
     which no longer resolves once the section is auto-height) but switches to
     height: auto so it can still grow past that when the content is long, with
     the banner riding the bottom edge the whole way. Extra .folds-container
     specificity, no !important — same reasoning as .story-parent. */
  .folds-container .enterprize-partner-parent {
    height: auto;
    min-height: 100vh;
    /* stylelint-disable-next-line declaration-block-no-duplicate-properties */
    min-height: 100svh;
  }

  .enterprize-partner-parent .partner-container {
    height: auto;
    /* 84px = .fold's padding-top (header clearance); the rest of the fold's
       height is this container's to fill. */
    min-height: calc(100vh - 84px);
    /* stylelint-disable-next-line declaration-block-no-duplicate-properties */
    min-height: calc(100svh - 84px);
  }

  .enterprize-partner-parent .partner-title {
    font-size: 32px;
    line-height: 40px;
    letter-spacing: 1px;
    margin-bottom: 24px;
  }

  .enterprize-partner-parent .partner-tags {
    gap: 16px;
    font-size: 12px;
    flex-wrap: wrap;
    margin-bottom: 16px;
  }

  .enterprize-partner-parent .challenge-input {
    font-size: 16px;
    padding: 12px 40px 12px 0;
  }

  .enterprize-partner-parent textarea.challenge-input {
    height: calc(1.4em + 24px);
  }

  .enterprize-partner-parent .partner-title .dark-text {
    font-size: 40px;
    line-height: 44px;
  }

  .enterprize-partner-parent .challenge-input-container {
    margin-top: 10px;
  }

  .enterprize-partner-parent .award-badge-wrap {
    margin-top: 20px;
  }

  .enterprize-partner-parent .badge-ribbon {
    padding: 16px;
    gap: 12px 5px;
  }

  .enterprize-partner-parent .award-badge-text {
    grid-area: text;
    text-align: left;
    display: flex;
    align-items: center;
    margin-left: -5px;
  }

  .enterprize-partner-parent .award-badge-text p {
    font-size: 15px;
    line-height: 1.3;
  }

  .enterprize-partner-parent .award-badge-text p br {
    display: none;
  }
}
@media (max-width: 400px) {
  .enterprize-partner-parent .partner-tags {
    gap: 16px;
    font-size: 11px;
  }
}
/* Short viewport, tablet + desktop (>=769px) — same clip that the <=768px
   block above fixes for phones: .fold's fixed `height: 100vh` + `overflow:
   hidden` chops the top of the partner column / WOW banner whenever the
   content is taller than a stubby laptop or split-screen window. Gated on
   `max-height` (not width) so a normal-height desktop is never touched — the
   common case keeps byte-for-byte its current pinned behaviour.
   When it does apply: let the section grow to its content and the page
   scroll. 769-1024px has no pin (syncEpPin only builds it >=1025px), so this
   is purely CSS there. At >=1025px GSAP's pin measures the taller height and
   `pinSpacing` reserves it; the reveal timeline fires once on entry off its
   own clock and doesn't care about the pin distance, so nothing desyncs.
   `min-height` keeps the container viewport-tall so `space-between` still
   opens the copy-top / banner-bottom gap; `height: auto` lets it grow past
   that for long content. */
@media (min-width: 769px) and (max-height: 900px) {
  .folds-container .enterprize-partner-parent {
    height: auto;
    min-height: 100vh;
  }

  .enterprize-partner-parent .partner-container {
    height: auto;
    min-height: calc(100vh - 84px);
    padding-top: 40px;
    padding-bottom: 40px;
  }
}
/* ==========================================
   10.5. Ship Fold
   ========================================== */
.what-we-ship-parent .ship-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100%;
  /* padding-top: 40px; */
}

.what-we-ship-parent .ship-title {
  color: var(--accent-red);
  font-size: 32px;
  font-weight: 300;
  margin-bottom: 40px;
}

.what-we-ship-parent .ship-carousel-wrapper {
  position: relative;
  width: 100%;
  max-width: 1300px;
  height: min(540px, 100svh - 270px);
  flex-shrink: 0;
  margin-bottom: 60px;
  z-index: 100;
}

/* Horizontal swipe (js/home.js, ≤1023px) is ours; vertical panning stays the
   browser's — it is what drives the pin.
   Without this declaration the browser has to assume a touch MIGHT pan in any
   direction, so it starts a scroll as soon as the finger moves and every
   touchmove after that is cancelable: false. The swipe handler's preventDefault()
   then arrives too late to stop the page moving and Chrome logs
   "[Intervention] Ignored attempt to cancel a touchmove event with
   cancelable=false". Declaring pan-y up front removes the ambiguity: a
   horizontal-dominant gesture is never claimed for scrolling, so it stays
   cancelable and the swipe wins cleanly.
   pinch-zoom is listed so the declaration does not cost the user zoom on the
   card; the bare pan-y line above is the fallback for browsers that don't
   parse the two-value form. */
@media (max-width: 1024px) {
  .what-we-ship-parent .ship-carousel-wrapper {
    touch-action: pan-y;
    /* stylelint-disable-next-line declaration-block-no-duplicate-properties */
    touch-action: pan-y pinch-zoom;
  }
}
.what-we-ship-parent .ship-slide {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #000;
  overflow: hidden;
  z-index: 3;
  display: flex;
  flex-direction: column;
  padding: 0;
  border-radius: 0;
  /* One duration + one curve for every animated property, so a step reads
     identically whichever direction it is played in. The old split (transform
     1.5s / opacity 1s) made a card finish fading 500ms before it finished
     moving, and box-shadow — untransitioned — snapped on the first frame.
     This is the shared baseline. Two states override it with a curve suited to
     what that direction actually shows on screen — the departing card's exit
     and the arriving card's entry, both further down and both desktop-scoped.
     Every duration here must stay <= SHIP_SLIDE_TRANSITION_MS in js/home.js
     (1300), which is the hold between steps; anything longer has its tail cut
     off by the next step during a continuous walk. */
  transition: transform 1.2s cubic-bezier(0.16, 1, 0.3, 1), opacity 1.2s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 1.2s cubic-bezier(0.16, 1, 0.3, 1);
  opacity: 0;
  transform: translate3d(0, 100%, 0);
  pointer-events: none;
  will-change: transform, opacity;
}

/* Suppresses the transition above for the deck's very first paint at page
   load (js/home-smootheer-1.js) — see the comment at that call site for why
   the reveal it would otherwise play is a real animation racing the clock
   from page load, not from arrival at this fold. */
.what-we-ship-parent.is-first-paint .ship-slide {
  transition: none;
}

/* Applied briefly by js/home-smootheer-1.js when a fast wheel/trackpad
   gesture snaps the deck straight to the edge card, skipping every card in
   between — the full 1.2s above is tuned for a single-card step and reads as
   laggy for a jump that can cross several cards' worth of visual distance in
   one go. Overriding only transition-duration (not the full shorthand) keeps
   the shared curve/property list above untouched — see its comment for why
   they're unified. */
.what-we-ship-parent.is-fast-transition .ship-slide {
  transition-duration: 0.3s;
}

.what-we-ship-parent .ship-slide.discover-slide {
  /* background: linear-gradient(
    61.8705deg,
    #462f82 0.31813%,
    #b5418b 56.31%,
    #f16f58 92.454%
  ); */
  background: linear-gradient(95.64deg, #462f82 5.86%, #b5418b 53%, #f16f58 96.65%);
  display: flex;
  align-items: center;
  justify-content: center;
}

.what-we-ship-parent .ship-discover-content {
  text-align: center;
  color: #fff;
  width: 100%;
  max-width: 800px;
  padding: 40px;
}

.what-we-ship-parent .discover-title {
  font-size: 20px;
  font-weight: 400;
  margin-bottom: 24px;
}

.what-we-ship-parent .discover-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  justify-content: center;
  margin-bottom: 40px;
}

.what-we-ship-parent .discover-tag {
  background: rgba(0, 0, 0, 0.2);
  padding: 12px 16px;
  border-radius: 0;
  font-size: 16px;
  line-height: 1;
  font-weight: 300;
  gap: 10px;
  cursor: pointer;
  transition: background 0.3s ease, backdrop-filter 0.3s ease;
}

/* hover: hover only — on touch (iPhone/Safari) :hover sticks to the last-tapped
   element until the next tap elsewhere, which left one discover-tag on the final
   ship card wearing the notched clip-path while its siblings stayed rectangular. */
@media (hover: hover) {
  .what-we-ship-parent .discover-tag:hover {
    background: rgba(0, 0, 0, 0.5);
    backdrop-filter: blur(12px);
    clip-path: polygon(9px 0, 100% 0, 100% calc(100% - 9px), calc(100% - 9px) 100%, 0 100%, 0 9px);
  }
}
.what-we-ship-parent .discover-tag i {
  font-size: 12px;
}

.what-we-ship-parent .view-all-stories,
.what-we-ship-parent .ship-view-story {
  color: #fff;
  font-size: 16px;
  line-height: 26px;
  font-weight: 500;
  display: inline-flex;
  align-items: center;
  gap: 24px;
  text-transform: uppercase;
  text-decoration: underline;
}

.what-we-ship-parent .view-all-stories .ib-icon,
.what-we-ship-parent .ship-view-story .ib-icon {
  transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.what-we-ship-parent .view-all-stories:hover .ib-icon,
.what-we-ship-parent .ship-view-story:hover .ib-icon {
  transform: translateX(4px);
}

/* Every deck state below is keyed off data-pos — each card's index MINUS the
   active card's index, written by renderShipStack() in js/home.js and clamped
   to the range the stylesheet knows about:

     -2   already gone      -1   the card just left
      0   active             1   first card peeking out below it
      2   second card peeking out
      3   everything further back, parked on the last visible stack slot

   That is what makes the deck length a property of the markup: six rules cover
   four cards and forty alike, and adding a .ship-slide needs no CSS at all. */
.what-we-ship-parent .ship-slide[data-pos="0"] {
  opacity: 1;
  transform: translate3d(0, 0, 0);
  pointer-events: auto;
  z-index: 4;
}

.what-we-ship-parent .ship-slide[data-pos="-1"],
.what-we-ship-parent .ship-slide[data-pos="-2"] {
  opacity: 1;
  transform: translate3d(0, -100vh, 0);
  box-shadow: none;
  /* Above the card that just took its place (active is z-index 4).
     This is what makes a downward step read as smoothly as an upward one.
     A departing card carries the whole 100vh of the motion, but without a
     z-index of its own it fell back to .ship-slide's base z-index: 3 — i.e.
     BEHIND the newly-active card, which is opaque and very nearly the same
     size (stack pos 1 rests at scale(0.967) translate3d(0,26px,0)). So the
     only moving element was occluded for the first stretch of its travel and
     appeared to pop out from behind the deck rather than fly off it.
     Going the other way the moving card IS the active one, so it was always
     on top and always fully visible — which is the whole of why up felt
     smooth and down did not. Exiting over the deck mirrors that. */
  z-index: 5;
}

/* Exit curve for the departing card — desktop deck only.
   Scoped to ≥1024px because below that the carousel is a horizontal swipe
   deck: the same "past" selectors above are re-pointed to translateX and
   their feel is driven by the gesture, so they keep the shared curve.

   A transition is read from the state being animated TO, so this governs only
   the downward step (active → past). Going back up the card animates into the
   ACTIVE state and keeps the shared curve — that direction already reads well
   and is deliberately left alone.

   Why it needs its own curve: the card travels 100vh (~900px) but the frame it
   leaves is only 540px, so it is out of sight after 60% of the distance. The
   shared cubic-bezier(0.16, 1, 0.3, 1) is an expo-out — it covers 445px in the
   first 120ms and clears the frame in ~159ms, spending the remaining ~87% of
   the 1.2s travelling where nobody can see it. The duration was never the
   problem; almost none of it was on screen, which is why the step read as a
   snap however long it was made.

   cubic-bezier(0.37, 0, 0.63, 1) is easeInOutSine — symmetric, no front
   loading. It clears the frame at 56% of whatever duration it is given, so
   the time actually spent on screen scales with the number below instead of
   being swallowed by the off-screen tail.

   All three properties are re-declared because `transition` is a shorthand:
   naming only transform here would drop the other two and let box-shadow snap
   on the first frame, which is the bug the shared rule calls out.

   1s, trimmed from the 1.2s this started at: that is ~563ms of visible exit
   (against ~159ms before any of this) with a ~31px lift-off in the first
   120ms. Shorter than the shared 1.2s on .ship-slide on purpose — the exit
   carries essentially all of a downward step's motion, while the arriving
   card only moves 26px, so the two do not need to finish together and the
   exit reads better slightly tighter.

   SHIP_SLIDE_TRANSITION_MS in js/home.js (1300) is the ceiling, not a target:
   it paces steps, and an exit longer than that dwell would let a second card
   start leaving while this one is still on its way out. Anything at or below
   it is safe to set here alone; going above it means raising the JS constant
   too. */
@media (min-width: 1025px) {
  .what-we-ship-parent .ship-slide[data-pos="-1"],
.what-we-ship-parent .ship-slide[data-pos="-2"] {
    transition: transform 1s cubic-bezier(0.37, 0, 0.63, 1), opacity 1s cubic-bezier(0.37, 0, 0.63, 1), box-shadow 1s cubic-bezier(0.37, 0, 0.63, 1);
  }
}
/* Entry curve for the arriving card — desktop deck only, and the mirror of the
   exit block above. This governs everything animating INTO the active state:
   the upward step's 100vh drop from -100vh, and the downward step's 26px
   settle as the next card is promoted out of the deck.

   NOT given the exit's easeInOutSine, deliberately. An entry has the opposite
   geometry to an exit: the card starts 100vh above and is off screen for the
   first 40% of its travel, so a symmetric curve holds it out of frame for
   ~568ms and the step reads as lag rather than smoothness. An arriving card
   has to appear promptly and then settle.

   Measured over the 900px drop at this duration:
     expo-out (0.16, 1, 0.3, 1)   appears  99ms, but lunges 419px in 120ms
     easeOutCubic (0.33, 1, .68)  appears 203ms, lunges 228px in 120ms
     easeInOutSine (exit curve)   appears 568ms  <- the lag case

   easeOutCubic keeps the prompt arrival that made this direction read well
   already, while halving the opening lunge that made it feel thrown rather
   than placed. 1.3s, up from the shared 1.2s, spreads the settle further.

   All three properties re-declared — `transition` is a shorthand, and naming
   only transform would drop the others and let box-shadow snap. */
@media (min-width: 1025px) {
  .what-we-ship-parent .ship-slide[data-pos="0"] {
    transition: transform 1.3s cubic-bezier(0.33, 1, 0.68, 1), opacity 1.3s cubic-bezier(0.33, 1, 0.68, 1), box-shadow 1.3s cubic-bezier(0.33, 1, 0.68, 1);
  }
}
.what-we-ship-parent .ship-video-bg {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  -o-object-fit: cover;
     object-fit: cover;
  z-index: -1;
  opacity: 0.8;
  /* Background decoration only — never a tap target. Without this, iOS Safari
     routes the first tap on a card to the video's native play/pause instead of
     the card's expand handler ("hard to click / first tap plays / second tap
     flickers"). */
  pointer-events: none;
  transform: scale(1);
  transform-origin: right top;
  transition: transform 1.5s cubic-bezier(0.16, 1, 0.3, 1);
}

.what-we-ship-parent .ship-slide.expanded .ship-video-bg {
  transform: scale(2.8);
  transform-origin: right bottom;
}

.what-we-ship-parent .ship-slide-content {
  position: relative;
  z-index: 2;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: row;
}

.what-we-ship-parent .ship-expanded-overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(-105.89deg, #462f82 -0.32%, #b5418b 56.31%, #f16f58 92.45%);
  background-blend-mode: screen, normal;
  opacity: 1;
  pointer-events: none;
  z-index: 0;
  /* Slight delay so the panel slides in first */
  transition: opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1) 0.35s;
}

/* Desktop: rest the overlay at .85 so the video reads through the tint.
   Mobile keeps the full opacity 1. */
@media (min-width: 1025px) {
  .what-we-ship-parent .ship-expanded-overlay {
    opacity: 0.85;
  }
}
.what-we-ship-parent .ship-slide.expanded {
  z-index: 100;
}

.what-we-ship-parent .ship-content-left {
  padding: 40px;
  display: flex;
  flex-direction: column;
  width: 100%;
  height: 100%;
  transition: width 0.8s cubic-bezier(0.16, 1, 0.3, 1), padding 0.8s cubic-bezier(0.16, 1, 0.3, 1);
  cursor: pointer;
}

.what-we-ship-parent .ship-slide.expanded .ship-content-left {
  /* width: 30%; */
  width: 286px;
  padding-right: 40px;
}

.what-we-ship-parent .ship-content-expanded {
  position: absolute;
  top: 0;
  right: 0;
  display: flex;
  flex-direction: row;
  width: calc(100% - 285px);
  height: 100%;
  /* transform: translate3d(100%, 0, 0); */
  transform: translate3d(calc(100% - 19px), 0, 0);
  transition: transform 0.6s ease-in-out;
  padding: 40px 30px 40px 60px;
}

.what-we-ship-parent .ship-slide.expanded .ship-content-expanded {
  transform: translate3d(0, 0, 0);
  transition: transform 0.6s ease-in-out;
}

.what-we-ship-parent .ship-col-middle,
.what-we-ship-parent .ship-col-right {
  display: flex;
  flex-direction: column;
  width: 50%;
  padding-right: 30px;
  color: #fff;
  position: relative;
  z-index: 1;
}

.what-we-ship-parent .ship-col-right {
  position: relative;
}

.what-we-ship-parent .ship-detail-section {
  margin-bottom: 16px;
}

.what-we-ship-parent .ship-detail-section h4 {
  font-size: 24px;
  font-weight: 600;
  margin-bottom: 10px;
}

.what-we-ship-parent .ship-detail-section p {
  font-size: 13px;
  font-weight: 300;
  line-height: 1.5;
  margin-bottom: 12px;
  opacity: 0.9;
}

.what-we-ship-parent .ship-arrow-btn {
  position: absolute;
  bottom: 0;
  right: 0;
  font-size: 32px;
  color: #fff;
  cursor: pointer;
}

/* Text badge variant — glass chip with notched corners instead of a logo image */
.what-we-ship-parent .ship-client-logo {
  display: flex;
  align-self: flex-start;
  width: auto;
  height: 40px;
  align-items: center;
  justify-content: center;
  background: rgba(255, 255, 255, 0.9490196078);
  backdrop-filter: blur(12px);
  clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px);
  font-family: var(--font-heading);
  font-weight: 400;
  font-size: 16px;
  line-height: 1;
  letter-spacing: -0.02em;
  text-align: center;
  text-transform: uppercase;
  color: #373742;
  padding: 8px 16px;
}

.what-we-ship-parent .ship-slide.expanded .ship-client-logo {
  font-size: 14px;
}

.what-we-ship-parent .ship-main-text {
  margin-top: auto;
  transition: opacity 0.18s ease;
}

.what-we-ship-parent .ship-main-text.ship-fade-out,
.what-we-ship-parent .ship-tags.ship-fade-out {
  opacity: 0;
}

.ship-close-mobile {
  display: none;
  color: #e6e6ed;
}

/* Desktop close button — top-right of the slide, shown only while expanded.
   .ship-arrow-btn is no longer a close trigger (it's the "View True Story"
   nav link now), so desktop needs its own explicit close affordance. */
.ship-close-desktop {
  display: none;
  color: #e6e6ed;
}

@media (min-width: 1025px) {
  .what-we-ship-parent .ship-slide.expanded .ship-close-desktop {
    display: flex;
    align-items: center;
    justify-content: center;
    position: absolute;
    top: 24px;
    right: 24px;
    width: 36px;
    height: 36px;
    gap: 8px;
    padding: 12px;
    box-sizing: border-box;
    background: transparent;
    border: none;
    box-shadow: 0 0 2px 0 rgba(47, 47, 57, 0.2);
    cursor: pointer;
    z-index: 5;
  }
}
.what-we-ship-parent .ship-main-text h3 {
  color: #fff;
  font-size: 36px;
  font-weight: 600;
  line-height: 1.2;
  margin-bottom: 16px;
  max-width: 886px;
  transition: opacity 0.18s ease;
}

.what-we-ship-parent .ship-slide.expanded .ship-main-text h3 {
  font-size: 20px;
}

.what-we-ship-parent .ship-slide.expanded .ship-main-text h3 br {
  display: none;
}

.what-we-ship-parent .ship-tags {
  display: flex;
  gap: 16px;
  transition: opacity 0.18s ease;
}

.what-we-ship-parent .ship-slide.expanded .ship-tags {
  flex-direction: column;
  align-items: flex-start;
  gap: 10px;
}

.what-we-ship-parent .ship-tag {
  background: rgba(255, 255, 255, 0.2);
  color: #fff;
  padding: 2px 8px;
  font-size: 12px;
}

/* ============================================================
   SHIP SLIDE — EXPAND CHOREOGRAPHY (desktop only, >= 1024px)

   Timed against the click handler in js/home.js (section 8):
     t=0ms    .ship-fade-out added   → title + tags fade out (0.18s)
     t=180ms  .expanded toggled      → layout snaps while text is invisible
     t=380ms  .ship-fade-out removed → title + tags fade back in

   The logo is the one piece NOT covered by that fade window — it stays
   visible the whole way through — so nothing here may start it (or the
   column that carries it) from an offset state at t=180ms. Every keyframe
   below either begins at rest or begins while its element is invisible.
   Layout is untouched — only transform/opacity animate.
   ============================================================ */
@media (min-width: 1025px) {
  .what-we-ship-parent .ship-slide {
    /* Shared with the width/padding transition on .ship-content-left, so the
       content motion and the panel expansion always run on the same curve. */
    --ship-expand-dur: .8s;
    --ship-expand-ease: cubic-bezier(.16, 1, .3, 1);
  }

  /* --- Left column: drifts with the panel as it narrows and returns to rest.
         Starts and ends at translate zero, so the still-visible logo it
         carries is never snapped to an offset when .expanded lands. --- */
  .what-we-ship-parent .ship-content-left {
    will-change: transform;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-content-left {
    animation: ship-left-settle var(--ship-expand-dur) cubic-bezier(0.45, 0, 0.55, 1) both;
  }

  @keyframes ship-left-settle {
    0% {
      transform: translate3d(0, 0, 0);
    }
    45% {
      transform: translate3d(-10px, 0, 0);
    }
    100% {
      transform: translate3d(0, 0, 0);
    }
  }
  /* --- Client logo: no keyframe. It is visible across the whole toggle, so
         any animation with a `from` state would read as a jump at t=180ms.
         Instead its 16px → 14px type change simply interpolates on the
         expansion duration and curve — continuous from wherever it is. --- */
  .what-we-ship-parent .ship-client-logo {
    transition: font-size var(--ship-expand-dur) var(--ship-expand-ease), padding var(--ship-expand-dur) var(--ship-expand-ease);
  }

  /* --- Headline: fade only. The fast 0.18s fade-out is kept exactly as it
         was; the fade back in at t=380ms runs long and soft so the title
         resolves into the narrowed column instead of blinking on. --- */
  .what-we-ship-parent .ship-main-text {
    will-change: opacity;
    transition: opacity 0.65s var(--ship-expand-ease) 0.05s;
  }

  .what-we-ship-parent .ship-main-text.ship-fade-out {
    transition: opacity 0.18s ease;
  }

  /* --- Tags: row folding into a stack. flex-direction can't tween, so the
         snap is left where it already is (hidden behind the fade) and the
         motion is rebuilt as a FLIP: each chip starts offset to roughly
         where it sat in the row — up and to the right of its new slot — and
         travels into the column. Chip 1 barely moves, which is exactly what
         a folding row does. Offsets scale off the chip's own index, so the
         count is free to change. --- */
  .what-we-ship-parent .ship-slide.expanded .ship-tag {
    --ship-tag-i: 0;
    will-change: transform, opacity;
    animation: ship-tag-fold 0.6s var(--ship-expand-ease) both;
    /* 0.2s = the moment .ship-fade-out lifts and the row becomes visible */
    animation-delay: calc(0.2s + var(--ship-tag-i) * 0.06s);
  }

  .what-we-ship-parent .ship-slide.expanded .ship-tag:nth-child(2) {
    --ship-tag-i: 1;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-tag:nth-child(3) {
    --ship-tag-i: 2;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-tag:nth-child(4) {
    --ship-tag-i: 3;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-tag:nth-child(5) {
    --ship-tag-i: 4;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-tag:nth-child(6) {
    --ship-tag-i: 5;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-tag:nth-child(7) {
    --ship-tag-i: 6;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-tag:nth-child(8) {
    --ship-tag-i: 7;
  }

  @keyframes ship-tag-fold {
    from {
      opacity: 0;
      /* ~90px = average chip width + the 16px row gap it used to sit behind;
         ~28px = stacked row pitch (12px chip + 10px column gap). */
      transform: translate3d(calc(var(--ship-tag-i) * 90px), calc(var(--ship-tag-i) * -28px), 0);
    }
    to {
      opacity: 1;
      transform: translate3d(0, 0, 0);
    }
  }
}
.what-we-ship-parent .ship-right-strip {
  position: absolute;
  right: 0;
  top: 0;
  height: 100%;
  width: 19px;
  z-index: 4;
  cursor: pointer;
  /* Centres the label instead of nudging it with a hardcoded offset, so the
     copy inside is free to get longer or shorter without drifting out of the
     19px strip. */
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform 0.9s ease-in-out;
  /* transition: all .5s cubic-bezier(.16, 1, .3, 1);
  background: linear-gradient(
    105.09deg,
    rgb(70, 47, 130, .5) -.32%,
    rgb(181, 65, 139, .5) 56.31%,
    rgb(241, 111, 88, .5) 92.45% 
  ); */
}

.what-we-ship-parent .ship-slide.expanded .ship-right-strip {
  opacity: 0;
  visibility: hidden;
  transform: translateX(20px);
}

.what-we-ship-parent .ship-vertical-text {
  writing-mode: vertical-rl;
  transform: rotate(180deg);
  color: #fff;
  font-size: 12px;
  letter-spacing: 1px;
  white-space: nowrap;
  /* Last-resort guard: copy longer than the strip is tall trims instead of
     bleeding past the card edges. */
  max-height: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* dynamic stack effect handled below in @media (min-width: 1024px) */
.what-we-ship-parent .ship-tabs {
  display: flex;
  /* Wraps rather than overflowing once the deck carries more tabs than fit on
     one row. A four-card deck still renders on a single line, so this costs
     nothing today and stops a longer one pushing the strip off the container. */
  flex-wrap: wrap;
  gap: 40px;
  justify-content: center;
  align-items: center;
  width: 100%;
  margin-bottom: 24px;
}

#what-we-ship {
  height: auto;
  min-height: 100vh;
  overflow: hidden;
  margin-bottom: 0;
  padding-bottom: 0;
}

.what-we-ship-parent .ship-tab {
  color: #676775;
  font-size: 16px;
  font-weight: 300;
  cursor: pointer;
  position: relative;
  transition: all 0.3s ease;
}

/* The strip used to name every tab index against every deck index, which is
   why a fifth card meant new CSS. renderShipStack() in js/home.js now marks the
   one tab that matches the rendered card, so the pairing lives where the deck
   length already does. */
.what-we-ship-parent .ship-tab.active {
  color: var(--accent-red);
  font-weight: 600;
}

.what-we-ship-parent .ship-tab.active .tab-dots,
.what-we-ship-parent .ship-tab.active .more-dots {
  opacity: 1;
  visibility: visible;
}

.what-we-ship-parent .tab-dots {
  position: absolute;
  bottom: -5px;
  left: 50%;
  transform: translateX(-50%);
  color: var(--accent-red);
  font-size: 24px;
  line-height: 10px;
  opacity: 0;
  visibility: hidden;
  transition: all 0.3s ease;
}

/* ── Card stack: the active card plus the next two peek out below it ──
   Exactly three cards are ever on screen, however many the deck holds. The
   fourth position (data-pos="3") is where every remaining card waits, parked on
   the last visible slot and invisible, so it RISES into the stack as the deck
   walks forward rather than fading in from nowhere. Geometry is per stack
   position, never per card index. */
@media (min-width: 1025px) {
  /* Stack pos 1 — the card directly behind the active one */
  .what-we-ship-parent .ship-slide[data-pos="1"] {
    opacity: 0.5;
    z-index: 3;
    pointer-events: none;
    /* Deliberately the original deck geometry — the look was signed off as-is.
       Worth knowing when touching it: this resting offset doubles as the
       arriving card's travel distance, since a card promoted to active animates
       from here to translate3d(0,0,0). At 26px that is a very small move spread
       over the full transition, so on a downward step essentially all of the
       motion belongs to the DEPARTING card and its 100vh exit.
       That asymmetry is fine in itself — the up step is the mirror image, with
       all the motion on the arriving card. What used to break it was stacking,
       not geometry: the departing card had no z-index of its own and sat behind
       this one while it moved. It now exits above the deck (see z-index on the
       -100vh rule above), so both directions show their moving card in full.
       Timing is shared: the unified 1.2s transition on .ship-slide and
       SHIP_SLIDE_TRANSITION_MS in js/home.js — change one, change the other. */
    transform: scale(0.967) translate3d(0, 26px, 0);
  }

  /* Stack pos 2 — second and last card visible behind the active one.
     SHIP_STACK_DEPTH in js/home.js is 2 because of this rule; raising one means
     raising the other and adding the matching step here. */
  .what-we-ship-parent .ship-slide[data-pos="2"] {
    opacity: 0.5;
    transform: scale(0.935) translate3d(0, 50px, 0);
    z-index: 2;
    pointer-events: none;
  }

  /* The waiting room — every card further back than the visible stack.
     It sits ON pos 2's geometry rather than at translate3d(0,0,0) so that being
     promoted into the deck is a 24px rise like every other step, not a
     travel-free cross-fade. Nothing here is per-card, so a deck of twenty
     renders exactly like a deck of three. */
  .what-we-ship-parent .ship-slide[data-pos="3"] {
    opacity: 0;
    transform: scale(0.935) translate3d(0, 50px, 0);
    z-index: 1;
    pointer-events: none;
  }

  /* The closing gradient card is a full-bleed panel, not a case-study card, so
     it never peeks out of the stack — but it still TRAVELS like one, keeping
     whatever geometry its stack position gives it, so it rises into place on
     the same motion as the rest. Written against the card's own class rather
     than its index, which is what keeps it correct wherever it sits in the
     deck. */
  .what-we-ship-parent .ship-slide.discover-slide[data-pos="1"],
.what-we-ship-parent .ship-slide.discover-slide[data-pos="2"],
.what-we-ship-parent .ship-slide.discover-slide[data-pos="3"] {
    opacity: 0;
  }
}
@media (max-width: 1440px) {
  #what-we-ship {
    margin-bottom: 0;
    padding-bottom: 0;
  }

  .what-we-ship-parent .ship-container {
    /* padding-top: 20px; */
  }

  .what-we-ship-parent .ship-title {
    margin-bottom: 20px;
  }
}
/* ==========================================
   RESPONSIVE — Ship Fold (Mobile ≤ 1023px)
   ========================================== */
@media (max-width: 1024px) {
  #what-we-ship {
    /* dvh, not vh — same reason as .story-parent above. On iOS 100vh resolves
       to the LARGE viewport (address bar hidden), so on a phone with the bar
       showing the section runs ~110px taller than what's on screen. Centred
       content (see .ship-container) then sits that much too low and the tab
       strip below the card falls behind the browser's bottom toolbar — "the
       nav is gone and the section is stuck". dvh tracks the current viewport,
       so the strip stays on screen. GSAP writes its own measured height inline
       once the fold pins, so this only governs the pre-pin frames. vh stays as
       the fallback for browsers without dvh. */
    height: 100vh;
    /* stylelint-disable-next-line declaration-block-no-duplicate-properties */
    height: 100dvh;
    overflow: hidden;
    margin-bottom: 0;
    padding-top: 110px;
    padding-bottom: 25px;
  }

  .what-we-ship-parent .ship-container {
    align-items: flex-start;
    /* Centred while pinned — but `safe`, so it only centres while the title +
          card + tab strip actually fit. If they'd total more than the visible
          height (short phone, browser chrome showing) the safe keyword falls back
          to start alignment instead of splitting the overflow top AND bottom,
          which is what used to push the tab strip off screen. Lowering the card
    floor to 380px (see .ship-carousel-wrapper below) is what buys the slack
          to centre on a normal handset in the first place.
          Progressive-enhancement pair, same as .story-parent .custom-container:
          browsers that don't parse `safe` drop the second line and keep plain
          `center`. */
    justify-content: center;
    /* stylelint-disable-next-line declaration-block-no-duplicate-properties */
    justify-content: safe center;
    padding: 0;
  }

  .what-we-ship-parent .ship-title {
    font-size: 28px;
    line-height: 38px;
    padding-left: 24px;
    padding-right: 24px;
    margin-bottom: 20px;
  }

  /* Carousel: taller card, overflow hidden so peek stays inside.

     clamp, not max: the viewport term is what sizes the card on a normal
     handset, the 435px floor stops it collapsing on a short one, and the 540px
     ceiling is the same cap desktop carries. Without that ceiling the card kept
     growing on a tall tablet, which is the one viewport where 100svh - 280px
     clears 540 on its own. Mobile overrides the ceiling below. */
  .what-we-ship-parent .ship-carousel-wrapper {
    height: clamp(435px, 100svh - 280px, 540px);
    margin-bottom: 0;
    overflow: hidden;
    /* Vertical pans stay native — the pin's own scroll must keep working
       untouched. Horizontal is handed to the swipe handler in home.js, which
       is what stops the browser from committing to a diagonal drag as a page
       scroll before the gesture's axis has been resolved. */
    touch-action: pan-y;
  }

  /* All slides: 24px inset each side creates the peek gaps.
     Left gap (0→24px) = prev card peeks.  Right gap (n-24px→n) = next card peeks.
     Default (not-yet-seen) state uses translateX so all transitions are horizontal. */
  .what-we-ship-parent .ship-slide {
    left: 24px;
    width: calc(100% - 48px);
    padding: 20px 30px 20px 20px;
    border-radius: 0;
    box-shadow: none;
    opacity: 0;
    transform: translateX(calc(100% + 2px)) scale(0.95);
    /* Mobile is a single horizontal translateX slide, not the desktop stack
       with its matched departing/arriving curves (those are min-width: 1025px
       scoped). 0.5s is plenty for that one move and lets the touch step dwell
       in js/home-smootheer-1.js (SHIP_SLIDE_TRANSITION_MS = 620 on coarse
       pointers) come down with it — which is what stops the deck feeling
       stuck / still walking after the finger lifts. Stays under that 620ms
       ceiling. */
    transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.5s cubic-bezier(0.16, 1, 0.3, 1);
    /* iOS: keep each slide on its own stable GPU layer through the translateX.
       Without this the layer is re-promoted per step and Safari flashes the
       whole card (worse with the <video> inside it) — the "slide changed but
       the page blinks" report. translateZ(0) is folded into the resting
       transform above via the JS-set data-pos rules; backface-visibility is
       the part that actually stops the sub-pixel re-raster flash. */
    backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
  }

  /* Discover (closing) panel has no right strip, so drop the extra right
     inset the case-study slides carry and sit on an even 20px all round. */
  .what-we-ship-parent .ship-slide.discover-slide {
    padding: 20px;
  }

  .what-we-ship-parent .ship-video-bg {
    /* Same layer-stability fix for the video that rides inside the slide. */
    backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
    will-change: transform;
  }

  .what-we-ship-parent .ship-right-strip {
    top: auto;
    bottom: 0;
    width: 26px;
    height: auto;
    padding-block: 16px;
    max-height: 100%;
    background: #f16f58;
  }

  .what-we-ship-parent .ship-client-logo {
    font-size: 14px;
    height: 32px;
  }

  .what-we-ship-parent .ship-main-text h3 {
    font-size: 20px;
    line-height: 1.3;
    margin-bottom: 12px;
  }

  .what-we-ship-parent .ship-main-text h3 br {
    display: none;
  }

  .what-we-ship-parent .ship-tags {
    flex-flow: row wrap;
    gap: 8px;
  }

  .what-we-ship-parent .ship-tag {
    font-size: 11px;
    padding: 3px 8px;
  }

  .what-we-ship-parent .ship-card-stack {
    display: none;
  }

  /* Arrow button hidden in default (non-expanded) card view */
  .what-we-ship-parent .ship-arrow-btn {
    display: none;
  }

  /* When a slide is expanded, collapse all other slides so peek cards
     don't bleed over the fixed popup */
  .what-we-ship-parent .ship-carousel-wrapper:has(.ship-slide.expanded) .ship-slide:not(.expanded) {
    opacity: 0 !important;
    visibility: hidden !important;
    pointer-events: none !important;
  }

  /* ─────────────────────────────────────────────────────────────
     Horizontal slide states — override all desktop translateY
     ───────────────────────────────────────────────────────────── */
  /* Same data-pos keys as the desktop deck (see the block up at the active-card
     rule), re-pointed to horizontal travel. Three cards are on screen here too
     — the active one plus a peek on each side — so the mobile deck scales with
     the markup for free as well. */
  /* Active slide */
  .what-we-ship-parent .ship-slide[data-pos="0"] {
    opacity: 1;
    transform: translateX(0) scale(1);
    pointer-events: auto;
    z-index: 4;
  }

  /* Everything already passed beyond the peek — hidden, off left */
  .what-we-ship-parent .ship-slide[data-pos="-2"] {
    opacity: 0;
    transform: translateX(calc(-100% - 12px)) scale(1);
  }

  /* PREV PEEK — immediately adjacent previous card, visible on left edge */
  .what-we-ship-parent .ship-slide[data-pos="-1"] {
    opacity: 0.5;
    transform: translateX(calc(-100% - 4px)) scale(0.95);
    pointer-events: none;
    z-index: 3;
  }

  /* NEXT PEEK — immediately adjacent next card, visible on right edge.
     Cards further ahead (data-pos 2 and 3) keep .ship-slide's own resting
     state: parked off the right edge at opacity 0, ready to slide in. */
  .what-we-ship-parent .ship-slide[data-pos="1"] {
    opacity: 0.5;
    transform: translateX(calc(100% + 4px)) scale(0.95);
    pointer-events: none;
    z-index: 3;
  }

  /* ── Tabs: 2 visible at a time, active pinned to left, sits at section bottom ── */
  .what-we-ship-parent .ship-tabs {
    overflow: hidden;
    gap: 0;
    padding: 0;
    justify-content: flex-start;
    align-items: stretch;
    /* Single row here, whatever the deck length: the strip is a horizontal
       track that renderShipStack() slides via --ship-tab-shift, so the base
       flex-wrap: wrap would break it into extra rows instead of scrolling. */
    flex-wrap: nowrap;
    /* Small fixed gap under the card. Was visually handled by
       justify-content:center's slack on .ship-container; now that the column
       is top-anchored the strip would butt against the card without this. */
    margin-top: 16px;
    margin-bottom: 0;
    flex-shrink: 0;
    padding-left: 24px;
  }

  .what-we-ship-parent .ship-tab {
    min-width: 50%;
    flex-shrink: 0;
    font-size: 12px;
    white-space: nowrap;
    padding: 14px 24px;
    text-align: left;
    transition: transform 0.3s ease;
    color: var(--text-gray);
  }

  .what-we-ship-parent .more-dots {
    bottom: 10px;
    visibility: visible;
    opacity: 1;
  }

  .what-we-ship-parent .more-dots .dot {
    width: 5px;
    height: 5px;
    background-color: #969696;
  }

  .what-we-ship-parent .ship-tab.active .more-dots .dot {
    background-color: var(--accent-red);
  }

  /* Slides the whole strip so the active tab stays on screen.
     renderShipStack() in js/home.js owns the distance: one tab width per card
     passed, with the active tab on the leading edge going forward and the
     trailing edge coming back (two tabs are visible at a time at min-width:
     50%). One declaration instead of one per card index. */
  .what-we-ship-parent .ship-tabs .ship-tab {
    transform: translateX(var(--ship-tab-shift, 0));
  }

  /* Dots indicator hidden on mobile (overflow:hidden on .ship-tabs clips them) */
  .what-we-ship-parent .tab-dots {
    display: none;
  }

  /* ── Discover slide ── */
  .what-we-ship-parent .ship-discover-content {
    padding: 24px 16px;
    text-align: center;
  }

  .what-we-ship-parent .discover-title {
    font-size: 14px;
    line-height: 22px;
    font-weight: 300;
    margin-bottom: 20px;
    text-align: center;
  }

  .what-we-ship-parent .discover-tags {
    flex-direction: column;
    gap: 8px;
    justify-content: flex-start;
    margin-bottom: 28px;
  }

  .what-we-ship-parent .discover-tag {
    width: 100%;
    font-size: 12px;
    line-height: 18px;
    padding: 10px 16px;
    text-align: center;
  }

  .what-we-ship-parent .view-all-stories {
    font-size: 14px;
  }

  /* ══════════════════════════════════════════════════════════════
     MOBILE PORTAL — slide is detached from the carousel and appended
     to <body> so position:fixed is viewport-relative and z-index sits
     above the header (1000) in the root stacking context.
     The portal keeps .what-we-ship-parent so all inner selectors apply.
     ══════════════════════════════════════════════════════════════ */
  .ship-mobile-portal {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100dvh;
    z-index: 1001;
    pointer-events: none;
    /* pan-y, not none. touch-action is evaluated across the whole ancestor
       chain, so `none` here also killed touch scrolling inside
       .ship-content-expanded — the What/Why/How copy was unreachable on a
       phone. Vertical panning is allowed and contained by overscroll-behavior
       below; horizontal swipes stay blocked so the gesture can't reach the
       carousel underneath. */
    touch-action: pan-y;
    overscroll-behavior: none;
  }

  .ship-mobile-portal:has(.ship-slide.expanded) {
    pointer-events: auto;
  }

  /* ══════════════════════════════════════════════════════════════
     EXPANDED POPUP  (two-section layout)
     ══════════════════════════════════════════════════════════════
     TOP  42% — video bg + heading, no scroll
     BOT  58% — gradient + What/Why/How text, scrollable internally
     × close button is absolutely positioned inside .ship-slide-content
     (which is position:relative) so it sits ABOVE the scroll area and
     never moves when the user scrolls the text.
     ══════════════════════════════════════════════════════════════ */
  /* Popup: full screen, NO outer scroll */
  .what-we-ship-parent .ship-slide.expanded {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100dvh;
    z-index: 101;
    overflow: hidden;
    padding: 0;
    border-radius: 0;
    transform: none !important;
    opacity: 1 !important;
    pointer-events: auto !important;
    display: flex;
    flex-direction: column;
    background: #20212a;
    transition: none;
  }

  /* Video: behind ship-content-left (162px), centered */
  .what-we-ship-parent .ship-slide.expanded .ship-video-bg {
    height: 162px;
    width: 100%;
    position: absolute;
    top: 0;
    left: 0;
    -o-object-fit: cover;
       object-fit: cover;
    -o-object-position: center center;
       object-position: center center;
    z-index: 0;
  }

  /* Gradient: light tint at top (heading stays readable over video),
     solid colour from ~30% down (covers the scrollable text section) */
  .what-we-ship-parent .ship-slide.expanded .ship-expanded-overlay {
    opacity: 1;
    visibility: visible;
    background: linear-gradient(-106.1deg, #462f82 -0.31%, #b5418b 56.67%, #f16f58 93.04%);
    display: none;
  }

  /* Slide content: full-height flex column, positioned so × button can anchor here */
  .what-we-ship-parent .ship-slide.expanded .ship-slide-content {
    position: relative;
    z-index: 2;
    display: flex;
    flex-direction: column;
    height: 100%;
  }

  .what-we-ship-parent .ship-content-left {
    padding: 0;
  }

  /* TOP SECTION — fixed 162px, video shows through the overlay behind it */
  .what-we-ship-parent .ship-slide.expanded .ship-content-left {
    flex-shrink: 0;
    height: 162px;
    width: 100% !important;
    padding: 24px;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    cursor: auto;
  }

  /* Logo hidden in popup */
  .what-we-ship-parent .ship-slide.expanded .ship-client-logo {
    display: none;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-main-text {
    margin-top: 0;
    position: relative;
    overflow: hidden;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-main-text h3 {
    font-size: 14px;
    line-height: 22px;
    margin-bottom: 0;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-tags {
    display: none;
  }

  /* BOTTOM SECTION — scrollable text
     position: static ensures .ship-arrow-btn's absolute ref skips this
     and anchors to .ship-slide-content instead */
  .what-we-ship-parent .ship-slide.expanded .ship-content-expanded {
    flex: 1 1 0;
    min-height: 0;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    /* Keeps the swipe inside the popup: without containment, reaching either
       end of this copy chains the remaining scroll to the page behind, which
       moves the pinned What-we-ship fold while the popup hides it. */
    overscroll-behavior: contain;
    position: relative !important;
    width: 100% !important;
    height: auto;
    transform: none !important;
    display: flex !important;
    flex-direction: column !important;
    padding: 20px 20px 40px;
    transition: opacity 0.6s;
    opacity: 1;
    background: linear-gradient(-106.1deg, #462f82 -0.31%, #b5418b 56.67%, #f16f58 93.04%);
  }

  .what-we-ship-parent .ship-expanded-overlay {
    opacity: 0;
  }

  .what-we-ship-parent .ship-content-expanded {
    transition: opacity 0.6s;
    opacity: 0;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-col-middle,
.what-we-ship-parent .ship-slide.expanded .ship-col-right {
    width: 100%;
    padding-right: 0;
    position: static;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-detail-section {
    margin-bottom: 24px;
  }

  .what-we-ship-parent .ship-slide.expanded .ship-detail-section h4 {
    font-size: 20px;
    margin-bottom: 8px;
  }

  /* Arrow button: show in expanded state as a plain arrow (keep natural style) */
  .what-we-ship-parent .ship-slide.expanded .ship-arrow-btn {
    display: block;
    position: static;
    margin-top: 16px;
    margin-left: auto;
  }

  /* Mobile close button — shown only when slide is expanded */
  .what-we-ship-parent .ship-slide.expanded .ship-close-mobile {
    display: flex;
    align-items: center;
    justify-content: center;
    float: right;
    width: 36px;
    height: 36px;
    margin-left: 10px;
    margin-bottom: 4px;
    background: transparent;
    border: 1px solid rgba(255, 255, 255, 0.35);
    cursor: pointer;
    flex-shrink: 0;
  }
}
/* Ship carousel — mobile ceiling + a lower floor.
   Same viewport term as the ≤1023px rule above; the cap drops 540px → 457px and
   the floor drops 435px → 380px. The lower floor matters on short handsets
   (small iPhones, and any device once the browser chrome is showing): at 435px
   the card + title + tab strip together overflowed 100dvh and the tabs fell
  under the bottom toolbar. 380px lets the card give up some height so the whole
   fold stays on screen while keeping the last slide from being cut off;
   `calc(100svh - 280px)` is still what sizes it on a
   normal phone. Split at 768/769 — the page's one mobile/tablet boundary — so
   neither range claims 768px twice.
   Must stay AFTER the ≤1023px block — it overrides by source order, not by
   specificity, since both selectors are identical. */
@media (max-width: 768px) {
  .what-we-ship-parent .ship-carousel-wrapper {
    height: clamp(380px, 100svh - 280px, 457px);
  }

  /* Tighten the gap between the card and the tab strip on phones only —
     tablet keeps the 16px set in the ≤1024px block. */
  .what-we-ship-parent .ship-tabs {
    margin-top: 4px;
  }
}
/* ==========================================
   11. Video Fold
   ========================================== */
#video-fold {
  background: #2e2f36 url(../static/assets/images/latest/grain.png);
  display: flex;
  justify-content: center;
  align-items: center;
  transition: background 1.2s cubic-bezier(0.16, 1, 0.3, 1);
}

/* Same iOS fix .story-parent and #what-we-ship already carry — this fold was
   the one pinned section still left on the base .fold `height: 100vh`. On iOS
   100vh resolves to the LARGE viewport (address bar hidden), so on a phone with
   the bar showing the fold runs ~60-110px taller than the visible area; the
   video + text centred by the flexbox above then sit that far off the visual
   centre, and once the address bar collapses mid-scroll the stale height leaves
   the block ABOVE centre ("does not stop at the centre"). dvh tracks the
   current viewport so first paint is centred. No !important — GSAP writes its
   own measured height inline once the fold pins and that must still win; vh
   stays as the fallback for browsers without dvh. */
#video-fold {
  height: 100vh;
  /* stylelint-disable-next-line declaration-block-no-duplicate-properties */
  height: 100dvh;
}

#video-fold:has([data-final]) {
  background: var(--bg-primary);
}

.video-feature-parent .video-layout-container {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  gap: 60px;
  width: 100%;
  position: relative;
  /* Without this, the 60px→0 gap at slide 4 (below) snaps instantly instead
     of easing — since gap repositions every grid/flex track, an untransitioned
     jump here shifts the video box and both text columns all at once. */
  transition: gap 1.5s cubic-bezier(0.16, 1, 0.3, 1);
}

.video-feature-parent .video-text-left {
  flex: 0 1 auto;
  text-align: left;
  color: #fff;
  /* Matches the 1.5s pace of .video-box-container/.video-box/.video-text-right
     so the slide 3→4 reveal moves as one synchronized motion — this used to
     run at 0.65s, finishing well before the video box, which read as the
     text snapping ahead while the box kept animating around it. */
  transition: transform 1.5s cubic-bezier(0.16, 1, 0.3, 1), opacity 1.5s cubic-bezier(0.16, 1, 0.3, 1);
  will-change: transform, opacity;
  z-index: 10;
  position: relative;
  left: 0;
  display: flex;
  align-items: center;
  gap: 15px;
}

.video-feature-parent [data-final] .video-text-left {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) scale(3);
  font-weight: 600;
  margin: 0;
  z-index: 20;
}

.video-feature-parent [data-final] .video-text-left .text-slide {
  font-weight: 600;
}

/* The second "We" belongs to the last text-slide and is for mobile only, where
   slide 4 hides the static .we-text-start and shows this one in its place (see
   the ≤768px block). Everywhere else the static one supplies the word, so this
   copy must never show.
   It used to be hidden only at slides 3 and 4, which left it live at 0-2 —
   scrolling back up dropped the state into that range and the duplicate "We"
   appeared in the last slide as it travelled through the window. Hiding it
   unconditionally is what the desktop layout always wanted; mobile's slide-4
   rule carries an extra attribute selector, so it still wins where it applies. */
.video-feature-parent .video-text-left .text-slide .we-text-last {
  display: none;
}

.video-feature-parent .video-text-left h3 {
  font-size: 28px;
  font-weight: 300;
  line-height: 38px;
  margin: 0;
  transition: transform 0.65s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.65s cubic-bezier(0.16, 1, 0.3, 1);
  text-align: left;
}

.video-feature-parent .video-text-left .text-red {
  color: var(--accent-red);
  margin-left: 8px;
}

.video-feature-parent .video-text-left .static-text {
  transition: opacity 1.5s, color 1.5s, transform 1.5s cubic-bezier(0.16, 1, 0.3, 1);
}

/* .video-feature-parent .video-text-left .static-text,
.video-feature-parent [data-final] .video-text-left .static-text {
  background: linear-gradient(90deg, #2c4cb7, #5a419a);
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
  font-weight: 600;
} */
.video-feature-parent [data-final] .video-text-left .static-text {
  font-weight: 600;
  transform: translate(10px, 0);
}

.video-feature-parent .scrolling-title {
  display: inline-flex;
  align-items: flex-start;
}

/* The one-line window the left-hand column scrolls through.
   --vf-line-h is the slot height, and it OWNS this fold's vertical rhythm: the
   window, every line's box and the scroller's travel per state all derive from
   it. The value declared here is the desktop default, correct for the copy this
   fold shipped with (two lines at 38px); measureVideoLines() in js/home.js
   replaces it inline with the tallest line's real height once fonts are ready
   and again on resize. That is what lets editorial copy run to one, two or
   three visual lines without a stylesheet edit — and why nothing below may
   hardcode a height again.
   Declared on the CONTAINER rather than the wrapper so both the window and the
   lines inside it can read the same value. */
.video-feature-parent .text-scroll-container {
  --vf-line-h: 76px;
  display: inline-block;
  height: var(--vf-line-h);
  position: relative;
  clip-path: inset(-500% -50% 0 -50%);
}

/* The line scroller used to carry one hardcoded translate per state, which is
   what pinned this fold to exactly four lines. It now travels by ONE line pitch
   per state:

     --vf-text-step   the pitch — .text-slide's height plus this wrapper's gap.
                      Re-declared in every breakpoint that changes either.
     --vf-text-index  which line is in the window. Written on #video-fold by
                      renderVideoState() in js/home.js.

   Add or remove a .text-slide and the travel follows on its own. The one thing
   to keep true is the pitch: if copy ever wraps to a second visual line, raise
   .text-slide's height and this step together. */
.video-feature-parent .text-scroll-wrapper {
  --vf-line-gap: 30px;
  --vf-text-step: calc(var(--vf-line-h) + var(--vf-line-gap));
  --vf-text-shift: calc(var(--vf-text-step) * var(--vf-text-index, 0) * -1);
  display: flex;
  flex-direction: column;
  gap: var(--vf-line-gap);
  transform: translateY(var(--vf-text-shift));
  transition: transform 1.5s cubic-bezier(0.16, 1, 0.3, 1);
  will-change: transform;
}

/* Every line occupies one uniform slot, so the scroller's travel is one pitch
   per state whatever the copy says. line-height stays a design choice per
   breakpoint; the slot height follows the copy. */
.video-feature-parent .text-slide {
  height: var(--vf-line-h);
  line-height: 38px;
  display: flex;
  align-items: flex-start;
  transition: opacity 0.65s cubic-bezier(0.16, 1, 0.3, 1);
}

/* Measurement pass only — js/home.js adds .is-measuring-lines to #video-fold,
   reads each line's natural height, and takes it off again inside the same
   task, so no frame is ever painted in this state. Releasing the slot height is
   the whole point: a line pinned to --vf-line-h can only ever report
   --vf-line-h back. */
.video-feature-parent.is-measuring-lines .text-slide {
  height: auto;
}

/* Lines already scrolled past. data-pos is written per element by
   renderVideoState() in js/home.js and means the same thing everywhere in this
   fold: -1 behind, 0 the one on show, 1 still to come. Nothing counts. */
.video-feature-parent .text-slide[data-pos="-1"] {
  opacity: 0.3;
}

/* The closing state drops them out entirely — only the last line survives it. */
.video-feature-parent [data-final] .text-slide[data-pos="-1"] {
  opacity: 0;
}

.video-feature-parent [data-final] .text-scroll-wrapper {
  transform: translate(10px, var(--vf-text-shift));
}

/* Outline stroke on "create" — only while slide 4 ("...create wow!") is active */
.video-feature-parent [data-final] .gradient-shadow {
  position: relative;
  z-index: 1;
}

.video-feature-parent [data-final] .gradient-shadow::before {
  content: attr(data-text);
  position: absolute;
  top: 0;
  left: 0;
  z-index: -1;
  background: linear-gradient(90deg, #284cba 0%, #ea1b3d 72.87%);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
  filter: blur(0);
  transform: translate(1px, 1px);
  opacity: 0.9;
}

/* Box height is tiered — see the steps below .video-box. This base value is the
   ≥1024px tier; the tablet and mobile media queries further down override it. */
.video-box-container {
  flex: 0 0 50%;
  max-width: 800px;
  position: relative;
  height: 380px;
  overflow: visible;
  display: block;
  transition: flex 1.5s cubic-bezier(0.16, 1, 0.3, 1), max-width 1.5s cubic-bezier(0.16, 1, 0.3, 1), height 1.5s cubic-bezier(0.16, 1, 0.3, 1), transform 1.5s cubic-bezier(0.16, 1, 0.3, 1);
  will-change: transform;
}

.video-feature-parent .video-box-wrapper {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.video-feature-parent .video-box {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 380px;
  background-color: #000;
  clip-path: polygon(20px 0, 100% 0, 100% calc(100% - 20px), calc(100% - 20px) 100%, 0 100%, 0 20px);
  overflow: hidden;
  display: flex;
  justify-content: center;
  align-items: center;
  opacity: 0;
  /* Entrance is a pure translate (+ the opacity fade below). It deliberately
     carries NO scale.
     The centre video is a cross-origin YouTube <iframe>, which the browser
     always composites on its own surface, and --yt-inflate makes that surface
     ~3x taller than the visible box. A `scale` on this ancestor forces the
     browser to re-sample that oversized surface every frame of the transition
     (per Chrome's re-raster-on-scale behaviour), and its centre tile boundary
     — the video's vertical middle — shows a 1-2px seam for the length of the
     transition, gone the instant scale settles. A translate does not trigger
     that re-sample. Dropping the `scale(.9) -> scale(1)` accent (it was a ~10%
     zoom, barely readable under a full-viewport slide) removes the seam at its
     source with no cover, no delay, and no change to timing, easing, the
     slide distance, opacity, clip-path, or the closing states.
     Keep it translate-only unless the crop stops needing an oversized iframe. */
  transform: translate3d(0, 100vh, 0);
  /* clip-path + transform still rasterise a frame apart on the chamfered top
     edge during the slide; backface-visibility pins this to its own stable
     compositor layer so the painted edge and the clip polygon stay in
     lockstep (was first added for that 1px edge seam on first entrance). */
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  /* One transition for both directions — the active and passed rules declare
     no transition of their own, so a box animates on this whichever way the
     fold is being scrolled.

     easeOutQuart rather than the expo-out used elsewhere on the page. Still an
     ease-out, so the box arrives promptly — it has to, see the handoff note on
     the passed-box rule — but expo-out threw 375px of the 900px travel into
     the first 120ms and that opening whip is what read as unsmooth. Quart
     opens at 258px, just under a third gentler.

     This curve is chosen against a measured budget, not by feel. The cost of
     a flatter curve is the window where the outgoing and incoming boxes are
     both visible in the fold (nothing clips them — see the passed-box note):

       expo-out  lunge 375px   overlap 181ms   <- was fine
       quint     lunge 297px   overlap 218ms
       quart     lunge 258px   overlap 266ms   <- here
       cubic     lunge 200px   overlap 341ms
       quad      lunge 138px   overlap 455ms
       (the easeInOutSine attempt that visibly showed two videos: ~778ms)

     Anything flatter than quart spends the remaining budget fast for very
     little extra smoothness. Duration is the other lever and is deliberately
     NOT used: it scales the overlap proportionally AND raises VIDEO_STATE_MS,
     which makes the paced walk fall further behind a fast scroll through the
     +=400% pin — that shows up as snapping, which reads as less smooth, not
     more.

     opacity is deliberately SHORTER than transform — do not "unify" them the
     way .ship-slide does. This fold shows one video at a time in a single
     window and .video-box-container is overflow:visible, so a box that is
     still fading is a box you can see the outgoing one through. The short fade
     is what keeps the handoff to a single visible box.

     1.5s must stay <= VIDEO_STATE_MS in js/home.js (1550), the hold between
     states — anything longer has its tail cut off by the next step, and any
     increase here scales the overlap above proportionally. */
  transition: opacity 0.6s cubic-bezier(0.25, 1, 0.5, 1), clip-path 1.5s cubic-bezier(0.25, 1, 0.5, 1), height 1.5s cubic-bezier(0.25, 1, 0.5, 1), transform 1.5s cubic-bezier(0.25, 1, 0.5, 1);
  will-change: opacity, transform;
}

/* Suppresses the transitions above (and on .right-text-slide / .text-slide,
   further down) for the fold's very first paint at page load
   (js/home-smootheer-1.js) — same reasoning and pattern as the ship
   carousel's is-first-paint (see its comment in this file). Only the three
   elements renderVideoState(0) actually touches at setup: .video-box-
   container's own transition is never triggered by that call, so it is
   deliberately left out here. */
.video-feature-parent.is-first-paint .video-box,
.video-feature-parent.is-first-paint .right-text-slide,
.video-feature-parent.is-first-paint .text-slide {
  transition: none;
}

/* Height tiers. The box and its container are always the same height — the
   container reserves the space in the grid track, the box paints inside it, and
   a mismatch would let the clip-path chamfer drift off the reserved area.
   ≥1024px 380px (the base rule above) · ≥1200px 450px · ≥1400px 515px.
   Kept ahead of the [data-final] overrides further down, which are more
   specific and so still win when the fold reaches its closing state. */
@media (min-width: 1200px) {
  .video-feature-parent .video-box-container,
.video-feature-parent .video-box {
    height: 450px;
  }
}
@media (min-width: 1400px) {
  .video-feature-parent .video-box-container,
.video-feature-parent .video-box {
    height: 515px;
  }
}
/* 8-point %-only clip-path so this box has a vertex-matched shape to morph
   from in the closing state — browsers can't smoothly interpolate
   polygon() between mismatched vertex counts/units, they snap instead.
   Scoped to desktop (>=1024px) only — tablet/mobile have their own chamfer
   size (36px / 28px) defined further down and must not inherit this one. */
@media (min-width: 1025px) {
  .video-feature-parent .video-box:last-child {
    clip-path: polygon(3% 0, 50% 0, 100% 0, 100% 96%, 97% 100%, 50% 100%, 0 100%, 0 4%);
  }
}
.video-feature-parent [data-final] .video-box:last-child {
  aspect-ratio: auto;
  clip-path: polygon(26% 0, 88% 0, 100% 0, 81% 91%, 73% 100%, 6% 100%, 0 100%, 18% 9%);
}

/* Active box — fully in view. The last box holds through the two closing
   states; renderVideoState() clamps for that, so nothing here has to know how
   many boxes the markup ships.

   The :not([data-pos]) half is the FIRST PAINT, before renderVideoState() has
   stamped anything. Every .video-box is authored identically — the markup here
   is generated by one loop over the items, so it cannot carry a per-item
   starting attribute — and the base rule below parks an unstamped box off
   screen. Without this the opening video would be invisible until DOM-ready and
   would then slide up from a viewport below on load. :first-child says "the
   item the sequence opens on" in pure position terms, which is true whatever
   the loop emits, and it stops matching the moment JS stamps data-pos. Both
   halves resolve to the same values, so the handover is not a transition. */
.video-feature-parent .video-box[data-pos="0"],
.video-feature-parent .video-box:first-child:not([data-pos]) {
  opacity: 1;
  transform: translate3d(0, 0, 0);
}

/* Passed boxes — slide out above, no opacity change.
   Boxes still waiting keep .video-box's own resting state (parked a viewport
   below at opacity 0), so there is no third rule to write. */
.video-feature-parent .video-box[data-pos="-1"] {
  opacity: 1;
  transform: translate3d(0, calc(-100vh - 90px), 0);
}

/* WHY THE DEPARTING BOX IS NOT TUNED LIKE .ship-slide's
   The two look like the same problem and are not. The ship deck is a visible
   card STACK, so its departing card was given a z-index above the deck and a
   symmetric curve to make its exit legible. Doing either here shows two videos
   at once, because this fold is a single-window handoff and
   .video-box-container is overflow:visible — nothing clips a box that is still
   on its way out.

   The shared expo-out is what keeps that handoff clean. Measured over the
   ~990px exit and ~900px entry with a 450px box:
     departing clears the frame  134ms
     arriving becomes visible    152ms   -> an 18ms gap, one box at a time
   Swapping in easeInOutSine (departing visible to 707ms) against easeOutCubic
   (arriving from 310ms) opens that into ~400ms of both boxes on screen, and
   stretching the 0.6s opacity to match the transform lets the outgoing box
   show straight through the incoming one on top of that.

   So: leave the curve, the z-index and the opacity duration alone unless the
   container starts clipping. Any change that keeps the outgoing box on screen
   longer has to be paid for by clipping it somewhere, not by easing. */
.video-feature-parent .dummy-video {
  width: 100%;
  height: 100%;
  /* contain (not cover) so the frame never crops the video — any letterboxing
     shows the box's own #000 background as a fixed black border instead. */
  -o-object-fit: contain;
     object-fit: contain;
  display: block;
  transition: width 1.5s cubic-bezier(0.16, 1, 0.3, 1), height 1.5s cubic-bezier(0.16, 1, 0.3, 1);
}

.video-feature-parent [data-final] .video-box:last-child .dummy-video {
  height: 250px;
  width: 99%;
}

/* ═══════════════════════════════════════════════════════════════════════════
   YOUTUBE PLAYER — chrome-free embed
   YouTube ignores controls=0 for parts of its UI (title bar, share/watch-on-
   YouTube overlay, big play button, end cards), so three independent layers
   stack up instead of relying on embed params alone:

     .yt-frame   crops an over-tall iframe — YouTube anchors its title bar and
                 control bar to the player's top/bottom edges, which now sit a
                 full container height outside the visible window
     .yt-poster  opaque until the first PLAYING event, then lifted for good —
                 covers the thumbnail, the big play button and the buffering
                 spinner, and nothing after that (a pause keeps its own frame)
     .yt-shield  swallows every pointer/touch event, so the player never sees a
                 hover and never fades its title / share overlay in

   Control bar (.yt-controls) is injected by js/yt-video-fold.js.
   ═══════════════════════════════════════════════════════════════════════════ */
.video-feature-parent .yt-player-container {
  /* Crop depth, as a multiple of the video's own height. The iframe is this
     many times taller than the video it renders, centred, so YouTube's chrome
     — which is anchored to the player's top and bottom edges — ends up well
     outside the box. 3 leaves a full video-height margin above and below.
     Set to 1 to disable the crop (useful when isolating a rendering issue). */
  --yt-inflate: 3;
  /* Legacy fallback values, used only where container queries are missing */
  --yt-inflate-pct: 200%;
  --yt-offset: -50%;
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  background-color: #000;
}

.video-feature-parent .yt-frame {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

/* Fallback sizing for browsers without container queries: a full-width iframe,
   inflated vertically. Correct wherever the box is narrower than 16:9 (all
   desktop states), crops top and bottom where it is wider (tablet/mobile).
   !important beats the inline width/height the YT API injects on the iframe. */
.video-feature-parent .yt-player-container iframe {
  position: absolute !important;
  top: var(--yt-offset) !important;
  left: 0 !important;
  width: 100% !important;
  height: var(--yt-inflate-pct) !important;
  border: none !important;
  pointer-events: none !important;
}

/* Contain, at every breakpoint.
   The box is a wide, short rectangle below 1024px (e.g. 691x240 at tablet, far
   wider than 16:9), so a full-width iframe renders the video taller than the
   box and the overflow clips it — the "cover" crop. Sizing the iframe to the
   *contained* 16:9 width instead makes the video height-constrained there, so
   the whole frame is always visible.

   Above 1024px the box is narrower than 16:9, min() picks 100cqw and the result
   is identical to the fallback — this is not a desktop change.

   The iframe is still --yt-inflate times taller than the video it renders, so
   the chrome crop survives: the video letterboxes inside that taller box and
   YouTube's bars sit outside the container. */
@supports (container-type: size) {
  .video-feature-parent .yt-player-container {
    container-type: size;
  }

  /* --yt-video-w is declared here rather than on the container because cq units
     resolve against the nearest *ancestor* container — an element can't query
     itself. Declared on the iframe, they resolve against .yt-player-container.
     It is the width of the largest 16:9 video that fits the box in both axes. */
  .video-feature-parent .yt-player-container iframe {
    --yt-video-w: min(100cqw, calc(100cqh * 16 / 9));
    top: 50% !important;
    left: 50% !important;
    width: var(--yt-video-w) !important;
    height: calc(var(--yt-video-w) * 9 / 16 * var(--yt-inflate)) !important;
    transform: translate(-50%, -50%) !important;
  }

  /* Cover, below 1024px.
     Containing the video is what produced the black pillars down both sides
     here: the box is a wide, short rectangle (roughly 850x240 at tablet,
     390x225 at mobile) and min() picks the height-constrained width, leaving
     the 16:9 video too narrow to reach either edge.

     max() sizes it to the *covering* width instead — the video always spans
     the full box and the surplus height is clipped by .yt-frame, so the box
     is filled edge to edge with no bars. The chrome crop is unaffected: the
     iframe is still --yt-inflate times taller than the video it renders, so
     YouTube's title and control bars stay far outside the visible window. */
  @media (max-width: 1024px) {
    .video-feature-parent .yt-player-container iframe {
      --yt-video-w: max(100cqw, calc(100cqh * 16 / 9));
    }
  }
}
/* Poster — set background-image inline for a custom still, otherwise flat black
   matching .video-box, so there is no visible transition at load.

   It covers the UNSTARTED player only. .has-started is latched on by
   js/yt-video-fold.js the first time the player paints a frame and is never
   removed, so the poster lifts once and stays lifted: a paused video shows the
   frame it stopped on, not a black panel. Uncovering is a slow fade; the instant
   `transition: none` below only governs the state it opens in. */
.video-feature-parent .yt-poster {
  position: absolute;
  inset: 0;
  z-index: 2;
  background-color: #000;
  background-position: center;
  /* contain, to match how the video itself is fitted — a cover poster would
     crop where the video doesn't, and the swap would visibly jump */
  background-size: contain;
  background-repeat: no-repeat;
  opacity: 1;
  transition: none;
  pointer-events: none;
}

.video-feature-parent .yt-player-container.is-playing .yt-poster,
.video-feature-parent .yt-player-container.has-started .yt-poster {
  opacity: 0;
  transition: opacity 0.45s cubic-bezier(0.16, 1, 0.3, 1);
}

/* Resume cover — js/yt-video-fold.js's coverForResume()/uncoverResume().
   Re-opaques the poster for a short, capped window while a player that has
   already started is resuming from a full stop, masking the torn frame a
   YouTube embed can hand back for an instant while its decoder catches up.
   One class more specific than the has-started/is-playing rule above so it
   wins for exactly as long as .is-resuming is present; removing the class
   falls straight back to that rule's own .45s fade, so the reveal is a soft
   fade-out rather than a hard cut. transition:none here only governs how the
   cover snaps back ON — it must be instant, not a fade-in of black over the
   live picture. */
.video-feature-parent .yt-player-container.is-resuming .yt-poster {
  opacity: 1;
  transition: none;
}

/* Shield — transparent hit target above the iframe */
.video-feature-parent .yt-shield {
  position: absolute;
  inset: 0;
  z-index: 3;
  cursor: pointer;
}

/* ─── Idle play badge — shown only when autoplay is blocked ─────────────────
   Deliberately NOT shown on an ordinary pause. There the video keeps its own
   frame (the poster stays lifted once .has-started latches) and the control bar
   already carries a play button, so a second one on top of the picture is just
   something in the way.

   What is left is the state that genuinely strands the visitor: autoplay
   refused before a single frame was painted, where the poster is still an
   opaque black panel and nothing else on screen can start playback. Over that
   panel the badge has nothing to cover, so it keeps its own modest size —
   js/yt-video-fold.js decides when it appears. */
.video-feature-parent .yt-idle-play {
  position: absolute;
  top: 50%;
  left: 50%;
  z-index: 4;
  display: grid;
  place-items: center;
  width: 72px;
  height: 72px;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: rgba(234, 27, 61, 0.92);
  color: #fff;
  opacity: 0;
  transform: translate3d(-50%, -50%, 0) scale(0.85);
  transition: opacity 0.4s cubic-bezier(0.16, 1, 0.3, 1), transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
  cursor: pointer;
  pointer-events: none;
}

.video-feature-parent .yt-player-container.is-idle .yt-idle-play {
  opacity: 1;
  transform: translate3d(-50%, -50%, 0) scale(1);
  pointer-events: auto;
}

.video-feature-parent .yt-idle-play svg {
  width: 30px;
  height: 30px;
  margin-left: 3px;
  fill: currentcolor;
}

/* ─── Custom control bar ───────────────────────────────────────────────────── */
.video-feature-parent .yt-controls {
  position: absolute;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 5;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 34px 18px 14px;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.78), rgba(0, 0, 0, 0));
  font-family: var(--font-body, "Figtree", sans-serif);
  opacity: 0;
  transform: translate3d(0, 100%, 0);
  /* Slower on the way out than on the way in — an abrupt disappearance reads
     as a glitch, while a slow arrival reads as lag. */
  transition: opacity 0.45s cubic-bezier(0.16, 1, 0.3, 1), transform 0.45s cubic-bezier(0.16, 1, 0.3, 1);
  will-change: opacity, transform;
  pointer-events: none;
}

/* Visibility is owned by js/yt-video-fold.js, not by :hover — the bar has to
   fade out after a spell of inactivity even while the pointer is still resting
   on the video, and :focus-within would pin it open after every click. */
.video-feature-parent .yt-player-container.is-controls-visible .yt-controls {
  opacity: 1;
  transform: translate3d(0, 0, 0);
  pointer-events: auto;
  transition: opacity 0.22s cubic-bezier(0.16, 1, 0.3, 1), transform 0.22s cubic-bezier(0.16, 1, 0.3, 1);
}

/* touch-action: manipulation opts the buttons out of double-tap-zoom detection,
   so a tap dispatches its click immediately instead of after the browser has
   waited to see whether a second tap follows. */
.video-feature-parent .yt-btn,
.video-feature-parent .yt-idle-play {
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
}

.video-feature-parent .yt-btn {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 32px;
  height: 32px;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: transparent;
  color: #fff;
  cursor: pointer;
  transition: background 0.25s ease, transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.video-feature-parent .yt-btn:hover {
  background: rgba(255, 255, 255, 0.16);
  transform: scale(1.08);
}

.video-feature-parent .yt-btn svg {
  width: 18px;
  height: 18px;
  fill: currentcolor;
  pointer-events: none;
}

.video-feature-parent .yt-btn:focus-visible,
.video-feature-parent .yt-progress:focus-visible,
.video-feature-parent .yt-idle-play:focus-visible {
  outline: 2px solid #ea1b3d;
  outline-offset: 3px;
}

/* Progress — 16px tall hit area with a 4px visual track inside */
.video-feature-parent .yt-progress {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  height: 16px;
  cursor: pointer;
  touch-action: none;
}

.video-feature-parent .yt-progress__track {
  position: relative;
  width: 100%;
  height: 4px;
  border-radius: 2px;
  background: rgba(255, 255, 255, 0.28);
  overflow: hidden;
  transition: height 0.2s ease;
}

.video-feature-parent .yt-progress:hover .yt-progress__track,
.video-feature-parent .yt-progress.is-seeking .yt-progress__track {
  height: 6px;
}

.video-feature-parent .yt-progress__fill {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: #ea1b3d;
  transform: scaleX(0);
  transform-origin: left center;
  will-change: transform;
}

.video-feature-parent .yt-time {
  flex: 0 0 auto;
  display: flex;
  gap: 4px;
  color: #fff;
  font-size: 12px;
  font-weight: 400;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.02em;
  -webkit-user-select: none;
     -moz-user-select: none;
          user-select: none;
}

.video-feature-parent .yt-time__sep {
  opacity: 0.55;
}

/* Global audio widget — a single instance that js/yt-video-fold.js re-parents
   into whichever control bar is on screen. There is deliberately no per-video
   copy of it, so mute and volume can only ever mean one thing in this section. */
.video-feature-parent .yt-audio {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: 2px;
}

.video-feature-parent .yt-volume {
  flex: 0 0 auto;
  width: 72px;
  height: 5px;
  accent-color: #ea1b3d;
  cursor: pointer;
}

/* Fullscreen button — last item in the bar, after the audio widget */
.video-feature-parent .yt-btn--fs {
  margin-left: 2px;
}

/* This fold's whole layout (card heights, chamfer sizes, the entrance/exit
   animation) is built portrait-first below 1024px. Fullscreen forces
   landscape on a touch device, which fights that layout directly and, on
   Android, was confirmed to leave the carousel on a different slide than the
   one the visitor was watching after closing fullscreen. js/yt-video-fold.js
   still builds this button whenever the Fullscreen API is available (see its
   own comment on fsBtn) — it's disabled here instead of at construction time
   specifically so it stays live: a desktop window resized narrower than
   1024px mid-session hides it exactly like a phone always does, and widening
   back past it brings it straight back, with no reload and no extra JS. */
@media (max-width: 1024px) {
  .video-feature-parent .yt-btn--fs {
    display: none;
  }
}
/* ─── Fullscreen ────────────────────────────────────────────────────────────
   js/yt-video-fold.js expands .yt-player-container, not the iframe, so the
   crop, the poster, the shield and the control bar all come with it.

   The UA stylesheet's own :fullscreen rules (position: fixed; inset: 0) lose to
   any author rule regardless of specificity, and `position: relative` above is
   exactly such a rule — so the fullscreen geometry has to be restated here or
   the element expands to nothing. The prefixed selector is a separate rule on
   purpose: one unrecognised selector invalidates an entire selector list. */
.video-feature-parent .yt-player-container:fullscreen {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
}

/* Safari below 16.4 only understands the prefixed spelling, so the prefix is
   load-bearing here — dropping it leaves the selector matching nothing, since
   ":full-screen" is neither the standard name nor the WebKit one. */
/* stylelint-disable-next-line selector-no-vendor-prefix */
.video-feature-parent .yt-player-container:-webkit-full-screen {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
}

/* Controls scale up with the surface — the same bar at 18px padding reads as a
   sliver across a 27" screen. The container query that sizes the iframe needs
   no change: it resolves against the element, which is now the viewport. */
.video-feature-parent .yt-player-container.is-fullscreen .yt-controls {
  gap: 18px;
  padding: 64px 34px 26px;
}

.video-feature-parent .yt-player-container.is-fullscreen .yt-btn {
  width: 42px;
  height: 42px;
}

.video-feature-parent .yt-player-container.is-fullscreen .yt-btn svg {
  width: 24px;
  height: 24px;
}

.video-feature-parent .yt-player-container.is-fullscreen .yt-progress__track {
  height: 5px;
}

.video-feature-parent .yt-player-container.is-fullscreen .yt-volume {
  width: 96px;
}

.video-feature-parent .yt-player-container.is-fullscreen .yt-time {
  font-size: 14px;
}

@media (max-width: 768px) {
  .video-feature-parent .yt-controls {
    gap: 8px;
    padding: 28px 12px 10px;
  }

  /* Wider hit area for fingers — the icon inside keeps its size */
  .video-feature-parent .yt-btn {
    width: 40px;
    height: 40px;
  }

  /* Volume slider is redundant next to the OS volume keys on touch devices */
  .video-feature-parent .yt-volume {
    display: none;
  }

  .video-feature-parent .yt-time {
    font-size: 11px;
  }

  .video-feature-parent .yt-idle-play {
    width: 58px;
    height: 58px;
  }
}
.video-feature-parent .video-text-right {
  /* Travel for the line transition below. A percentage of each line's OWN
     height, not a pixel distance — the lines all stretch to the same grid
     cell, so 100% is exactly one line-slot at every breakpoint and nothing
     has to be re-tuned when the copy changes. */
  --rt-rise: 100%;
  flex: 0 1 auto;
  text-align: left;
  color: #d1d1d5;
  transition: opacity 1.5s cubic-bezier(0.16, 1, 0.3, 1), width 1.5s cubic-bezier(0.16, 1, 0.3, 1);
  overflow: hidden;
}

.video-feature-parent [data-final] .video-text-right {
  opacity: 0;
  width: 0;
  margin: 0;
  padding: 0;
}

.video-feature-parent .right-text-mask {
  position: relative;
}

.video-feature-parent .right-text-container {
  display: grid;
  /* One explicit column pinned to the mask width — the lines wrap inside the
     text column instead of the track widening to their max-content. */
  grid-template-columns: minmax(0, 1fr);
}

.video-feature-parent .right-text-slide {
  /* Every line in the same cell: the stack is self-sizing. */
  grid-area: 1/1;
  font-size: 20px;
  font-weight: 300;
  line-height: 1.7;
  margin: 0;
  /* Rest state = parked a full slot below, waiting to slide up into place. */
  opacity: 0;
  transform: translate3d(0, var(--rt-rise), 0);
  will-change: transform, opacity;
  transition: transform 1.5s cubic-bezier(0.16, 1, 0.3, 1), opacity 1.5s cubic-bezier(0.16, 1, 0.3, 1);
}

/* Same pairing as the active video box above: the stamped state, plus the
   first-paint fallback for markup a loop emitted without a starting position. */
.video-feature-parent .right-text-slide[data-pos="0"],
.video-feature-parent .right-text-slide:first-child:not([data-pos]) {
  opacity: 1;
  transform: translate3d(0, 0, 0);
}

/* Lines already read — slid a full slot up and faded out, so stepping back
   up the fold reverses through the same motion instead of dropping in from
   below. The overflow: hidden on .video-text-right is what hides the travel
   in and out of the slot. */
.video-feature-parent .right-text-slide[data-pos="-1"] {
  transform: translate3d(0, calc(var(--rt-rise) * -1), 0);
}

/* Every state except the closing one — :not([data-final]) rather than naming
   them, so the row layout holds however long the sequence runs. */
.video-feature-parent .video-layout-container:not([data-final]) {
  display: grid;
  grid-template-columns: 280px 1fr 236px;
}

/* 1024-1400px — hand space back to the video.
   The default 280px text column and 60px gaps take 636px of the row before the
   video gets any, which at 1024 leaves its 1fr track barely 300px wide. A
   narrower left column and tighter gaps free that space for the video, without
   touching the ≥1400px sizes where there is room to spare.
   display: grid is inherited from the rule above — only the track sizes and
   the gap differ here. */
@media (min-width: 1025px) and (max-width: 1400px) {
  .video-feature-parent .video-layout-container:not([data-final]) {
    grid-template-columns: 250px 1fr 236px;
  }
}
/* Gap steps back up with the viewport across that range — the tighter the row,
   the less it can spare between columns. Both blocks target the container
   itself rather than the layout rules above, and the closing state keeps its own
   gap: 0 (more specific), so the closing state still collapses the row. */
@media (min-width: 1025px) and (max-width: 1199px) {
  .video-feature-parent .video-layout-container {
    gap: 20px;
  }
}
@media (min-width: 1200px) and (max-width: 1400px) {
  .video-feature-parent .video-layout-container {
    gap: 30px;
  }
}
@media (min-width: 1025px) {
  .video-feature-parent [data-final].video-layout-container {
    gap: 0;
  }

  .video-feature-parent .video-box-container {
    transition: none;
  }

  /* Real flex/max-width/height resize (not transform:scale) — the middle grid
     column's actual rendered width varies with viewport (it's a 1fr track
     capped at 800px, not a fixed 800px), so a static scale factor computed
     from an assumed 800px base produced the wrong final size on most
     viewports (e.g. 287px instead of 338px), causing the overlay text to
     visibly overflow the video. Real max-width/height stays correct at any
     viewport at the cost of some iframe re-layout cost during the resize. */
  .video-feature-parent [data-final] .video-box-container {
    flex: 0 0 338px;
    max-width: 338px;
    height: 260px;
    transform: translate(0, -42px);
  }

  .video-feature-parent [data-final] .video-box:last-child {
    height: 260px;
  }

  .video-feature-parent [data-final] .video-box:last-child .dummy-video {
    height: 260px;
  }

  .video-feature-parent [data-final] .text-scroll-wrapper {
    transform: translate(19px, calc(var(--vf-text-shift) + 4px));
  }

  .video-feature-parent [data-final] .video-text-left .static-text {
    transform: translate(19px, 4px);
  }

  .video-feature-parent [data-final] .video-text-left h3 {
    font-size: 27px;
  }
}
@media (max-width: 1024px) {
  .video-feature-parent .video-layout-container:not([data-final]) {
    display: flex;
  }

  /* iOS: hold the moving box + its <video> on stable GPU layers through the
     state transitions, so Safari doesn't flash the whole fold on each step
     ("slide changed but the page blinks"). Same fix as .ship-slide. */
  .video-feature-parent .video-box,
.video-feature-parent .dummy-video,
.video-feature-parent .text-scroll-wrapper {
    backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
  }
}
@media (min-width: 769px) and (max-width: 1024px) {
  .video-feature-parent .video-layout-container {
    flex-direction: column;
    gap: 30px;
  }

  .video-feature-parent [data-final] .video-text-left {
    transform: translate(-44%, -58%) scale(3);
  }

  /* Locked to the video's own 16:9 ratio at this height (240 * 16/9 = 426.67)
     and centred, so the player fills the box exactly — nothing to letterbox
     and nothing to crop. The 90% cap keeps it inside the gutters on narrow
     tablets. */
  .video-feature-parent .video-box-container {
    width: min(90%, 426.6666666667px);
    flex: 0 0 auto;
    height: 240px;
    margin-inline: auto;
  }

  .video-feature-parent .video-box {
    height: 240px;
  }

  .video-feature-parent .video-text-left,
.video-feature-parent .video-text-right {
    text-align: center;
  }

  /* No margin-left nudge here — it pinned the closing card to the left edge
     while desktop and mobile both centre theirs. align-self matches how the
     mobile rule below centres the same card. */
  .video-feature-parent [data-final] .video-box-container {
    position: absolute;
    flex: 0 0 245px;
    max-width: 340px;
    height: 245px;
    top: 50%;
    margin-top: -38px;
    left: 50%;
    transform: translate(-50%, -50%);
  }

  .video-feature-parent [data-final] .text-scroll-wrapper {
    transform: translate(10px, calc(var(--vf-text-shift) + 4px));
  }

  .video-feature-parent [data-final] .video-text-left .static-text {
    transform: translate(15px, 4px);
  }

  .video-feature-parent [data-final] .gradient-shadow {
    margin-left: 5px;
  }
}
/* ==========================================
   RESPONSIVE — Ship Fold (Mobile ≤ 768px)
   ========================================== */
@media (max-width: 768px) {
  /* ── Video Feature Fold ── */
  .video-feature-parent .video-layout-container {
    flex-direction: column;
    gap: 24px;
  }

  /* Same 16:9 lock as tablet (225 * 16/9 = 400), capped to the full width so it
     never overflows a narrow phone. */
  .video-feature-parent .video-box-container {
    width: min(100%, 400px);
    flex: 0 0 auto;
    height: 225px;
    margin-inline: auto;
  }

  .video-feature-parent .video-box {
    height: 225px;
  }

  .video-feature-parent .video-text-left h3 {
    font-size: 20px;
    line-height: 28px;
  }

  .video-feature-parent .video-text-left,
.video-feature-parent .video-text-right {
    width: 100%;
  }

  .video-feature-parent .video-text-left {
    max-width: 320px;
    margin: 0 auto;
    text-align: left;
  }

  .video-feature-parent .video-text-right {
    text-align: center;
    /* Drop `width` from the eased transition on phones. The closing state
       collapses this column to width:0 (snapped — see [data-final] below);
       scrolling BACK OUT removes data-final and the base `width 1.5s` then
       animated the column open from 0 → 100%, re-wrapping the line every
       frame — the "text expands / changes" judder reported on the reverse
       scroll from "We create wow!" to the last video. Width now snaps in
       both directions; only the fade is eased. Tablet/desktop keep the base
       transition. */
    transition: opacity 1.5s cubic-bezier(0.16, 1, 0.3, 1);
  }

  .video-feature-parent .right-text-slide {
    font-size: 18px;
    line-height: 30px;
  }

  .video-feature-parent .video-text-right br,
.video-feature-parent .text-slide br {
    display: none;
  }

  /* min-height, not height. The lines are grid-stacked in one cell so the
     column already self-sizes to the tallest of them — but a fixed height
     overrode that and clipped any entry that ran to a third line. This keeps
     the 76px the layout reserves today and lets longer copy grow the block
     instead of losing the tail of it. */
  .video-feature-parent .right-text-mask {
    min-height: 76px;
    max-width: 320px;
    margin: 0 auto;
  }

  /* No white-space: nowrap here any more. It guaranteed a single line while
     the slot was pinned at 28px, but with editorial copy it guaranteed
     horizontal OVERFLOW instead — the window is an inline-block sized to
     max-content, so a long line simply ran past the 320px column and out
     through the clip-path's 50% side bleed. Wrapping is safe now that the slot
     measures itself: two visual lines make a taller slot rather than a broken
     one. min-width: 0 lets the window actually shrink inside .scrolling-title's
     inline-flex row, which is what gives the text something to wrap against. */
  .video-feature-parent .text-slide {
    line-height: 28px;
  }

  .video-feature-parent .text-scroll-container {
    --vf-line-h: 28px;
    min-width: 0;
    max-width: 100%;
  }

  .video-feature-parent [data-final] .text-scroll-container {
    clip-path: none;
  }

  /* Line pitch for this breakpoint. The base rule up top does the travel and
     the slot measures itself — only the gap between lines changes here. */
  .video-feature-parent .text-scroll-wrapper {
    --vf-line-gap: 14px;
  }

  /* The closing card doesn't clip here (.text-scroll-container drops its
     clip-path above) and every earlier line has faded out, so the last line is
     PARKED at a fixed offset from the window rather than scrolled up to. Adding
     the shift back keeps that offset the same whatever the line count is —
     the alternative, a bare translate, silently re-tunes itself every time a
     line is added. */
  .video-feature-parent [data-final] .text-scroll-wrapper {
    transform: translateY(calc(var(--vf-text-shift) + 85px));
  }

  /* ── Slide 4 — mobile overrides ── */
  /* Gap 0 + height 0 on text-right → container height = video box height (196px)
     so top:50% on the absolute text lands exactly at the video center */
  .video-feature-parent [data-final] .video-text-left .text-slide {
    font-size: 40px;
    line-height: 42px;
  }

  .video-feature-parent [data-final] .video-text-left .static-text.we-text-start {
    display: none;
  }

  .video-feature-parent [data-final] .video-text-left .text-slide .we-text-last {
    display: block;
  }

  .video-feature-parent .video-layout-container[data-final] {
    gap: 0;
    width: 310px;
    transition: none;
  }

  .video-feature-parent [data-final] .video-text-left {
    transform: translate(-50%, -150px) scale(1);
    transition: none;
  }

  .video-feature-parent [data-final] .video-box-container {
    flex: 0 0 auto;
    width: 130px;
    height: 196px;
    max-width: 100%;
    transform: none;
    align-self: center;
    transition: none;
  }

  .video-feature-parent [data-final] .video-box:last-child {
    height: 131px;
    width: 166px;
    transition: none;
  }

  .video-feature-parent [data-final] .video-box-wrapper {
    left: -26px;
    top: -6px;
    transition: none;
  }

  .video-feature-parent [data-final] .video-box:last-child .dummy-video {
    height: 196px;
  }

  .video-feature-parent [data-final] .video-text-right {
    width: 0;
    height: 0;
    padding: 0;
    margin: 0;
    overflow: hidden;
  }
}
/* newsllter success message */
.newsletter-response .cd-application-form__success {
  margin: 0;
  font-family: var(--font-primary);
  font-weight: 300;
  font-size: max(1.125rem, 12px);
  line-height: 1.6666666667;
  letter-spacing: 0;
  color: #0d8244;
}

.newsletter-response .cd-application-form__success[hidden] {
  display: none;
}

/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vc3R5bGVzL2hvbWUtbWFpbi5jc3MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaG9tZS1tYWluLnNjc3MiLCJ3ZWJwYWNrOi8vL2NvbW1vbi9ob21lLnNjc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIb21lIDIwMjYgZGVkaWNhdGVkIHN0eWxlIGJ1bmRsZS5cbiAqL1xuQGltcG9ydCBcIi4vY29tbW9uL2hvbWUuc2Nzc1wiO1xuIiwiLyogSW5mb0JlYW5zIFdlYiBDb25jZXB0IFN0eWxlIFNoZWV0ICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgMC4gUGluIGhvc3QgZ3VhcmQg4oCUIHNjcm9sbC1iZWhhdmlvclxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgIFRoaXMgcGFnZSBob3N0cyB0aHJlZSBTY3JvbGxUcmlnZ2VyIHBpbnMgKCNzdG9yeSwgI3doYXQtd2Utc2hpcCxcbiAgICN2aWRlby1mb2xkKS4gQSBwaW5uZWQgZm9sZCBpcyBvbmx5IGNvaGVyZW50IHdoaWxlIHRoZSBzY3JvbGwgcG9zaXRpb24gY2FuXG4gICBiZSByZWFkIGFuZCB3cml0dGVuIGluc3RhbnRseToganMvaG9tZS5qcyBwYXJrcyB0aGUgc2hpcCBkZWNrIGFuZCB0aGUgdmlkZW9cbiAgIHNlcXVlbmNlIG9uIGJhbmQgbWlkcG9pbnRzLCBhbmQgR1NBUCBpdHNlbGYgbW92ZXMgdGhlIHNjcm9sbGJhciBkdXJpbmcgcGluXG4gICBzZXR1cCBhbmQgb24gZXZlcnkgcmVmcmVzaC4gQ1NTIHNtb290aC1zY3JvbGwgYW5pbWF0ZXMgdGhvc2Ugd3JpdGVzLCBzb1xuICAgcHJvZ3Jlc3MgYW5kIHRoZSByZW5kZXJlZCBjYXJkIGRpc2FncmVlIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24gYW5kXG4gICB0aGUgc3RlcHBlciBhY3RzIG9uIHRoZSBiYW5kIGJlaW5nIHRyYXZlbGxlZCBUSFJPVUdIIHJhdGhlciB0aGFuIHRoZSBvbmUgaXRcbiAgIGFza2VkIGZvciDigJQgdGhlIGZvbGQgc3RlcHMgYSBjYXJkIGFuZCB0aGVuIHdhbGtzIGl0IGJhY2suXG5cbiAgIGN1c3RvbS5jc3Mgb25seSBldmVyIFJFTU9WRUQgYHNjcm9sbC1iZWhhdmlvcjogc21vb3RoYCAoc2VlIHRoZSBub3RlIGluIGl0c1xuICAgYGh0bWwsIGJvZHlgIHJ1bGUpLiBSZW1vdmluZyBpcyBub3Qgb3ZlcnJpZGluZy4gU3RhbmRhbG9uZSB0aGF0IGlzIGVub3VnaCxcbiAgIGJlY2F1c2Ugbm90aGluZyBlbHNlIHNldHMgdGhlIHByb3BlcnR5IOKAlCBidXQgb24gV29yZFByZXNzIGV2ZXJ5IHBhZ2UncyBDU1NcbiAgIGlzIGNvbmNhdGVuYXRlZCBpbnRvIG9uZSBMaXRlU3BlZWQgYnVuZGxlLCBhbmQgdGhlIGludmVzdG9ycyBwYWdlIGNhcnJpZXMgYVxuICAgYmFyZSBgaHRtbCB7IHNjcm9sbC1iZWhhdmlvcjogc21vb3RoIH1gLiBJdCBpcyB1bnNjb3BlZCwgc28gaXQgYXBwbGllcyB0b1xuICAgdGhlIGhvbWVwYWdlIHRvbzogc3RhZ2luZyBjb21wdXRlcyBgc21vb3RoYCBvbiA8aHRtbD4gd2hlcmUgdGhlIHN0YXRpYyBidWlsZFxuICAgY29tcHV0ZXMgYGF1dG9gLiBUaGF0IGlzIHRoZSBzaW5nbGUgZW52aXJvbm1lbnRhbCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3b1xuICAgYnVpbGRzIG9uIHRoaXMgcGFnZS4gR1NBUCB0aGVuIG1ha2VzIGl0IHdvcnNlIOKAlCBpdHMgcmVmcmVzaCBjeWNsZSByZXN0b3Jlc1xuICAgdGhlIHZhbHVlIGl0IGRldGVjdGVkIGFzIGFuIElOTElORSBzdHlsZSwgc28gYWZ0ZXIgdGhlIGZpcnN0IHJlZnJlc2ggPGh0bWw+XG4gICBjYXJyaWVzIGBzdHlsZT1cInNjcm9sbC1iZWhhdmlvcjogc21vb3RoXCJgIGFuZCBubyBvcmRpbmFyeSBydWxlIGNhbiBvdXRyYW5rIGl0LlxuXG4gICBIZW5jZSBgIWltcG9ydGFudGAsIGFuZCBoZW5jZSBrZXlpbmcgb2ZmIHRoZSBzZWN0aW9ucyB0aGVtc2VsdmVzIHJhdGhlciB0aGFuXG4gICBhIGBib2R5LnBhZ2Ut4oCmYCBjbGFzczogdGhlIFdvcmRQcmVzcyBidWlsZCBjYW5ub3QgYmUgcmVsaWVkIG9uIHRvIGVtaXQgcGFnZVxuICAgY2xhc3NlcywgYnV0IHRoZSBtYXJrdXAgaXMgYWx3YXlzIHRoZXJlLiBTYW1lIGRvY3RyaW5lIChhbmQgc2FtZSByZWFzb25pbmcpXG4gICBhcyB0aGUgaWItcGluLWhvc3QgbWl4aW4gaW4gYXNzZXRzL3Njc3MvcGFnZXMvX3V0aWxzLnNjc3MsIHdoaWNoIGV2ZXJ5IG90aGVyXG4gICBwaW5uZWQgcGFnZSBvbiB0aGUgc2l0ZSBhbHJlYWR5IHVzZXM7IHRoZSBob21lcGFnZSBwcmVkYXRlcyBpdCBhbmQgd2FzIHRoZVxuICAgb25lIHBpbm5lZCBwYWdlIHN0aWxsIHJlbHlpbmcgb24gb21pc3Npb24uXG5cbiAgIE9ubHkgdGhlIHNjcm9sbC1iZWhhdmlvciBhc3NlcnRpb24gaXMgdGFrZW4gZnJvbSB0aGF0IG1peGluLiBJdHMgb3RoZXIgdGhyZWVcbiAgIChvdmVyZmxvdy14L2hlaWdodC9taW4taGVpZ2h0KSBmaXggcHJvYmxlbXMgdGhpcyBwYWdlIGRvZXMgbm90IGhhdmUg4oCUXG4gICBjdXN0b20uY3NzIGFscmVhZHkgc2V0cyBvdmVyZmxvdy14OiBjbGlwIGFuZCBtaW4taGVpZ2h0OiAxMDAlIG9uIGh0bWwvYm9keSxcbiAgIGFuZCB0aGUgc3RvcnkgZm9sZCdzIGNlbnRyaW5nIG1hdGggaXMgbWVhc3VyZWQgYWdhaW5zdCB0aG9zZSBleGFjdCB2YWx1ZXMuXG5cbiAgIEV4cGxpY2l0IGBiZWhhdmlvcjogJ3Ntb290aCdgIGluIGEgc2Nyb2xsSW50b1ZpZXcvc2Nyb2xsVG8gY2FsbCBzdGlsbCB3aW5zXG4gICBvdmVyIHRoaXMgcnVsZSAocGVyIENTU09NLVZpZXcgYW4gZXhwbGljaXQgYmVoYXZpb3Igb3ZlcnJpZGVzIHRoZSBjb21wdXRlZFxuICAgcHJvcGVydHkpLCBzbyB0aGUgaW5kaWNhdG9yIGNsaWNrIGhhbmRsZXJzIGluIGpzL2hvbWUuanMga2VlcCBhbmltYXRpbmcuICovXG5odG1sOmhhcygjc3RvcnkpLFxuaHRtbDpoYXMoI3doYXQtd2Utc2hpcCksXG5odG1sOmhhcygjdmlkZW8tZm9sZCkge1xuICBzY3JvbGwtYmVoYXZpb3I6IGF1dG8gIWltcG9ydGFudDtcbn1cblxuLyogQW5kcm9pZC1vbmx5IHBhZ2Utc2Nyb2xsIGZyZWV6ZSB3aGlsZSBhIHBpbm5lZCBkZWNrIGZvbGQgKFdoYXQgV2UgU2hpcCAvXG4gICBWaWRlbykgaXMgb24gc2NyZWVuIOKAlCB0b2dnbGVkIGJ5IGpzL2hvbWUtc21vb3RoZWVyLTEuanMgKGFwU2V0RGVja0xvY2sgL1xuICAgYXBDbGVhckRlY2tMb2NrKS4gQW5kcm9pZCBydW5zIG9uIG5hdGl2ZSBzY3JvbGwsIHdoZXJlIGEgc2luZ2xlIGhhcmQgZmxpbmdcbiAgIHdvdWxkIG90aGVyd2lzZSBza2lwIHN0cmFpZ2h0IHRocm91Z2ggdGhlIGRlY2s7IGZyb3plbiwgaXRzIGNhcmRzIHN0ZXAgYnlcbiAgIHN3aXBlIGluc3RlYWQuIGAhaW1wb3J0YW50YCBzbyBpdCBvdXRyYW5rcyB0aGUgaW5saW5lIGBvdmVyZmxvd2AgdGhlIG92ZXJsYXlcbiAgIHNjcm9sbC1sb2NrcyAoc2hpcCBwb3B1cCwgbW9iaWxlIGRyYXdlcikgc2V0IGFuZCBjbGVhciwgYW5kIHNvIGl0IGJlYXRzXG4gICBjdXN0b20uY3NzJ3MgYGh0bWwgeyBvdmVyZmxvdy14OiBjbGlwIH1gLiBOZXZlciBhZGRlZCBvbiBkZXNrdG9wIG9yIGlPUy4gKi9cbmh0bWwuYXAtZGVjay1sb2NrZWQsXG5odG1sLmFwLWRlY2stbG9ja2VkIGJvZHkge1xuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgNi4gRm9sZCBTdHJ1Y3R1cmUgKEZ1bGwgVmlld3BvcnQgc25hcClcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLmZvbGRzLWNvbnRhaW5lciB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uZm9sZCB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMHZoO1xuICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IC8qIGFkZGVkIGltcG9ydGFtdCB0byBvdmVycmlkZSB3b3JkcHJlc3Mgc3R5bGUgKi9cbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwYWRkaW5nLXRvcDogODRweDsgLyogYWNjb3VudCBmb3IgaGVhZGVyIGFuZCB0b3AgYmFyICovXG5cbiAgLyogRWFjaCBmb2xkIHBhaW50cyBpdHMgb3duIGJhY2tncm91bmQgaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBwYWdlIHNob3dcbiAgICAgdGhyb3VnaC4gSWRlbnRpY2FsIHRvIHRoZSBjb2xvdXIgPGJvZHk+IGFscmVhZHkgdXNlcywgc28gbm90aGluZyBjaGFuZ2VzXG4gICAgIHZpc3VhbGx5IOKAlCBidXQgYSBmb2xkIGlzIG5vIGxvbmdlciB0cmFuc3BhcmVudCwgc28gd2hpbGUgR1NBUCBpcyBzdGlsbFxuICAgICBidWlsZGluZyBpdHMgcGlucyBvbiBhIHNsb3cgbG9hZCAob3IgYSBzY3JvbGwgbGFuZHMgbWlkLWJ1aWxkKSB0d28gZm9sZHNcbiAgICAgdGhhdCBicmllZmx5IG92ZXJsYXAgY292ZXIgZWFjaCBvdGhlciBjbGVhbmx5IGluc3RlYWQgb2YgcmVuZGVyaW5nIG9uZVxuICAgICBzZWN0aW9uJ3MgdGV4dCBzdHJhaWdodCB0aHJvdWdoIHRoZSBvdGhlcidzLiAqL1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZy1wcmltYXJ5KTtcblxuICAvKiBDb25maW5lcyBldmVyeSB6LWluZGV4IGluc2lkZSBhIGZvbGQgdG8gdGhhdCBmb2xkLiBXaXRob3V0IGEgc3RhY2tpbmdcbiAgICAgY29udGV4dCBoZXJlLCBpbm5lciB2YWx1ZXMgZXNjYXBlIHRvIHRoZSByb290OiAuc2hpcC1jYXJvdXNlbC13cmFwcGVyXG4gICAgICh6LWluZGV4IDEwMCkgYW5kIC5zaGlwLXNsaWRlICh6LWluZGV4IDMpIHdlcmUgY29tcGV0aW5nIHBhZ2Utd2lkZSwgd2hpY2hcbiAgICAgaXMgd2h5IHRoZSBzaGlwIGNhcm91c2VsIHBhaW50ZWQgT04gVE9QIG9mIHRoZSBzdG9yeSBmb2xkJ3MgdGV4dCByYXRoZXJcbiAgICAgdGhhbiBzdGF5aW5nIGluc2lkZSBpdHMgb3duIHNlY3Rpb24uIEZvbGRzIG5vdyBzdGFjayBwdXJlbHkgaW4gc291cmNlXG4gICAgIG9yZGVyLCBsYXRlciBvdmVyIGVhcmxpZXIuXG4gICAgIGlzb2xhdGlvbiAobm90IGNvbnRhaW4vdHJhbnNmb3JtKSBvbiBwdXJwb3NlOiBpdCBjcmVhdGVzIGEgc3RhY2tpbmdcbiAgICAgY29udGV4dCBXSVRIT1VUIGNyZWF0aW5nIGEgY29udGFpbmluZyBibG9jaywgc28gcG9zaXRpb246Zml4ZWQgY2hpbGRyZW5cbiAgICAg4oCUIHRoZSBleHBhbmRlZCBzaGlwIHNsaWRlLCB0aGUgbW9iaWxlIHBvcnRhbCDigJQgc3RpbGwgcmVzb2x2ZSBhZ2FpbnN0IHRoZVxuICAgICB2aWV3cG9ydCBleGFjdGx5IGFzIGJlZm9yZS4gKi9cbiAgaXNvbGF0aW9uOiBpc29sYXRlO1xufVxuXG4uZm9sZC1jb250ZW50IHtcbiAgbWF4LXdpZHRoOiA3NjJweDtcbiAgbWFyZ2luOiAwIGF1dG87XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiAxMDI0cHgpIHtcbiAgLmZvbGQge1xuICAgIHBhZGRpbmctdG9wOiA5NnB4O1xuICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgNy4gVHlwb2dyYXBoeSBQbGF5IChTZWxmbGVzcyBBY3QgLyBEaXdhbGkgc3RvcnkpXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogU3Rvcnkgc2VjdGlvbjogMTAwdmgsIGNsaXBwZWQuXG4gICBUaGUgZm9sZCdzIG93biBib3ggZG9lcyB0aGUgaW5pdGlhbCB2ZXJ0aWNhbCBjZW50ZXJpbmcgKHNlZVxuICAgLnN0b3J5LXBhcmVudCAuY3VzdG9tLWNvbnRhaW5lciBiZWxvdyksIHNvIHRoZSBibG9jayByZW5kZXJzIGluIGl0cyBmaW5hbFxuICAgcG9zaXRpb24gb24gdGhlIHZlcnkgZmlyc3QgcGFpbnQgd2l0aCBubyBzY3JpcHQgaW52b2x2ZWQuIEdTQVAgeSBvblxuICAgZm9sZC1jb250ZW50IHRha2VzIG92ZXIgb25jZSBqcy9ob21lLmpzIHJ1bnMgKGl0IGFkZHMgLmlzLWpzLWZpdHRlZCkgYW5kXG4gICBhZGp1c3RzIGFzIGNvbnRlbnQgZ3Jvd3Mg4oCUIGNvbnRlbnQgdGhlbiBleHRlbmRzIGRvd253YXJkLCBuZXZlciB1cHdhcmQuXG5cbiAgIHBhZGRpbmctYm90dG9tIE1VU1QgZXF1YWwgRk9MRF9CT1RUT01fUkVTRVJWRSBpbiBqcy9ob21lLmpzLiBUaGF0IGNvbnN0YW50IGlzXG4gICB0aGUgb25seSBzbGljZSBvZiB0aGlzIHBhZGRpbmcganMvaG9tZS5qcyByZXNlcnZlcyBmb3IgdGhlIFwiV0hBVCBXRSBET1wiXG4gICBpbmRpY2F0b3Ig4oCUIHRoZSByZXN0IGl0IGxlbmRzIHRvIHRoZSBjb250ZW50IOKAlCBzbyBhbnkgb3RoZXIgdmFsdWUgaGVyZSBtYWtlc1xuICAgdGhlIENTUyBjZW50ZXJpbmcgYm94IGFuZCB0aGUgSlMgYXZhaWxIIGRpc2FncmVlLCBhbmQgdGhlIGJsb2NrIGp1bXBzIGJ5IGhhbGZcbiAgIHRoZSBkaWZmZXJlbmNlIHRoZSBtb21lbnQgaG9tZS5qcyByZS1tZWFzdXJlcy4gVGhlIGluZGljYXRvciBpdHNlbGYgaXNcbiAgIGFic29sdXRlbHkgcG9zaXRpb25lZCAoLmluZGljYXRvcnMtd3JhcHBlciksIHNvIGl0IGlzIHVuYWZmZWN0ZWQgYnkgdGhpcy4gKi9cbi5zdG9yeS1wYXJlbnQge1xuICBwYWRkaW5nLWJvdHRvbTogNTZweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblxuICAvKiBGYWRlcyBmcm9tIHRoZSBzZWN0aW9uJ3Mgb3duIHBlYWNoIGludG8gdGhlIG5leHQgc2VjdGlvbidzIGNyZWFtIHNvIHRoZVxuICAgICBoYW5kb2ZmIHRvIC53aG8td2UtYXJlLXBhcmVudCAocGxhaW4gLS1iZy1wcmltYXJ5KSByZWFkcyBhcyBvbmUgY29udGludW91c1xuICAgICBzdXJmYWNlIGluc3RlYWQgb2YgYSBoYXJkIHNlYW0uIFN0YXJ0IHN0b3AgbW92ZWQgZnJvbSA3Ni45NiUgdG8gNjUuODUlIOKAlFxuICAgICByb3VnaGx5IDEwMHB4IGVhcmxpZXIgb24gdGhlIH45MDBweCBmb2xkIHRoaXMgd2FzIHR1bmVkIGZvciDigJQgdG8gc3RyZXRjaFxuICAgICB0aGUgZmFkZSBvdmVyIGEgbG9uZ2VyIHJ1biBpbnN0ZWFkIG9mIGNvbXByZXNzaW5nIGl0IGludG8gdGhlIGxhc3RcbiAgICAgc3RyZXRjaCBvZiB0aGUgc2VjdGlvbi4gKi9cbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgI2ZmZWZkMSA2NS44NSUsICNmZmY5ZWQgMTAwJSk7XG59XG5cbi8qIEhlaWdodCBpcyBkZWxpYmVyYXRlbHkgTk9UICFpbXBvcnRhbnQsIGFuZCBjYXJyaWVzIHRoZSBleHRyYSAuZm9sZHMtY29udGFpbmVyXG4gICBzcGVjaWZpY2l0eSBpbnN0ZWFkLiBHU0FQIHBpbnMgdGhpcyBmb2xkIGJ5IHdyaXRpbmcgdGhlIG1lYXN1cmVkIGhlaWdodCBhcyBhblxuICAgSU5MSU5FIHN0eWxlIG9uIHRoZSBzZWN0aW9uOyBhbiAhaW1wb3J0YW50IGRlY2xhcmF0aW9uIGJlYXRzIGlubGluZSwgc28gdGhlXG4gICBib3gga2VwdCByZW5kZXJpbmcgYXQgMTAwdmggd2hpbGUgaXRzIHBpbi1zcGFjZXIgb25seSByZXNlcnZlZCB0aGUgbWVhc3VyZWRcbiAgIGhlaWdodC4gT24gbW9iaWxlIHRob3NlIHR3byBhcmUgbm90IHRoZSBzYW1lIG51bWJlciDigJQgMTAwdmggcmVzb2x2ZXMgYWdhaW5zdFxuICAgdGhlIGxhcmdlIHZpZXdwb3J0IChhZGRyZXNzIGJhciBoaWRkZW4pIHdoaWxlIEdTQVAgbWVhc3VyZXMgdGhlIGN1cnJlbnQgb25lIOKAlFxuICAgYW5kIHRoZSBkaWZmZXJlbmNlIHNob3dlZCB1cCBhcyBibGFuayBzcGFjZSBhYm92ZSB0aGUgcGlubmVkIHN0b3J5LiBUaGVcbiAgIGFuY2VzdG9yIHNlbGVjdG9yIHN0aWxsIG91dHJhbmtzIGFueXRoaW5nIHRoZSBXb3JkUHJlc3MgdGhlbWUgc2V0cyBvblxuICAgYHNlY3Rpb25gLCB3aGljaCBpcyB3aHkgdGhlICFpbXBvcnRhbnQgd2FzIHRoZXJlIGluIHRoZSBmaXJzdCBwbGFjZS4gKi9cbi5mb2xkcy1jb250YWluZXIgLnN0b3J5LXBhcmVudCB7XG4gIGhlaWdodDogMTAwdmg7XG5cbiAgLyogZHZoLCBub3QgdmgsIGlzIHdoYXQgdGhlIENTUyBjZW50cmluZyBiZWxvdyBoYXMgdG8gbWVhc3VyZSBhZ2FpbnN0OiAxMDB2aFxuICAgICByZXNvbHZlcyB0byB0aGUgTEFSR0Ugdmlld3BvcnQgKGFkZHJlc3MgYmFyIGhpZGRlbikgd2hpbGUganMvaG9tZS5qcyBzaXplc1xuICAgICBldmVyeXRoaW5nIGZyb20gd2luZG93LmlubmVySGVpZ2h0IOKAlCB0aGUgY3VycmVudCBvbmUuIE9uIGEgcGhvbmUgYXQgbG9hZFxuICAgICB0aG9zZSBkaWZmZXIgYnkgdGhlIGhlaWdodCBvZiB0aGUgYWRkcmVzcyBiYXIsIGFuZCBjZW50cmluZyBpbiBhIGJveCB0aGF0XG4gICAgIG11Y2ggdG9vIHRhbGwgZHJvcHMgdGhlIGJsb2NrIGhhbGYgdGhhdCBkaXN0YW5jZSBiZWxvdyB3aGVyZSBob21lLmpzIHRoZW5cbiAgICAgcHV0cyBpdC4gZHZoIHRyYWNrcyBpbm5lckhlaWdodCBleGFjdGx5LCBzbyBib3RoIGFncmVlIG9uIGZpcnN0IHBhaW50LiBPbmNlXG4gICAgIEdTQVAgcGlucyB0aGUgc2VjdGlvbiBpdCB3cml0ZXMgaXRzIG93biBtZWFzdXJlZCBoZWlnaHQgaW5saW5lLCB3aGljaCB3aW5zXG4gICAgIG92ZXIgdGhpcyDigJQgc28gdGhlIHZhbHVlIG9ubHkgZ292ZXJucyB0aGUgcHJlLXBpbiBmcmFtZXMuIHZoIGFib3ZlIHN0YXlzIGFzXG4gICAgIHRoZSBmYWxsYmFjayBmb3IgYnJvd3NlcnMgd2l0aG91dCBkdmggc3VwcG9ydC4gKi9cbiAgLyogc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlY2xhcmF0aW9uLWJsb2NrLW5vLWR1cGxpY2F0ZS1wcm9wZXJ0aWVzICovXG4gIGhlaWdodDogMTAwZHZoO1xufVxuXG4vKiBDU1Mtb25seSBmaXJzdC1wYWludCBsYXlvdXQuXG4gICBUaGUgY29udGFpbmVyIGlzIGV4YWN0bHkgYXZhaWxIIHRhbGwgKGZvbGQgaGVpZ2h0IOKIkiBwYWRkaW5nLXRvcCDiiJIgdGhlIDU2cHhcbiAgIHJlc2VydmUgYWJvdmUpLCB3aGljaCBpcyB0aGUgc2FtZSBib3gganMvaG9tZS5qcyBtZWFzdXJlcyBhZ2FpbnN0LCBhbmQgaXRcbiAgIGNlbnRyZXMgZm9sZC1jb250ZW50IGluc2lkZSBpdC4gVGhhdCBpcyBieXRlLWZvci1ieXRlIHRoZSBwb3NpdGlvblxuICAgZml0Rm9sZENvbnRlbnQoKSBjb21wdXRlcywgc28gd2hlbiBob21lLmpzIHJ1bnMgdGhlcmUgaXMgbm90aGluZyB0byBjb3JyZWN0OlxuICAgbm8ganVtcCwgYW5kIGlmIGhvbWUuanMgbmV2ZXIgbG9hZHMgYXQgYWxsIChvciBhIENNUyBzdHJpcHMgaW5saW5lIHNjcmlwdHMpXG4gICB0aGUgZm9sZCBzdGlsbCByZW5kZXJzIGNlbnRyZWQgaW5zdGVhZCBvZiB0b3AtYW5jaG9yZWQuXG4gICBgc2FmZSBjZW50ZXJgIGtlZXBzIG92ZXJmbG93IHNwaWxsaW5nIGRvd253YXJkIG9ubHksIHNvIGEgdmlld3BvcnQgdG9vIHNob3J0XG4gICBmb3IgdGhlIGJsb2NrIG5ldmVyIGNsaXBzIHRoZSB0aXRsZSBvZmYgdGhlIHRvcC4gKi9cbi5zdG9yeS1wYXJlbnQgLmN1c3RvbS1jb250YWluZXIge1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXG4gIC8qIGBzYWZlIGNlbnRlcmAgaXMgdGhlIHByb2dyZXNzaXZlLWVuaGFuY2VtZW50IHBhc3M6IGJyb3dzZXJzIHRoYXQgZG9uJ3QgcGFyc2VcbiAgICAgdGhlIHNhZmUga2V5d29yZCBkcm9wIHRoaXMgbGluZSBhbmQga2VlcCBwbGFpbiBgY2VudGVyYCBhYm92ZS4gTm90IGEgcmVhbFxuICAgICBkdXBsaWNhdGUg4oCUIHRoZSBwYWlyIGlzIHRoZSBmYWxsYmFjay4gKi9cbiAgLyogc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlY2xhcmF0aW9uLWJsb2NrLW5vLWR1cGxpY2F0ZS1wcm9wZXJ0aWVzICovXG4gIGp1c3RpZnktY29udGVudDogc2FmZSBjZW50ZXI7XG59XG5cbi8qIEhhbmRvZmY6IGpzL2hvbWUuanMgYWRkcyAuaXMtanMtZml0dGVkIHRoZSBtb21lbnQgaXQgdGFrZXMgb3duZXJzaGlwIG9mIHRoZVxuICAgdmVydGljYWwgcG9zaXRpb24uIEZyb20gdGhlbiBvbiB0aGUgR1NBUCB5IHRyYW5zZm9ybSBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZlxuICAgdHJ1dGgg4oCUIGxlYXZpbmcgdGhlIENTUyBjZW50cmluZyBvbiB3b3VsZCBzdGFjayBvbiB0b3Agb2YgaXQgYW5kIG9mZnNldCB0aGVcbiAgIGJsb2NrIGJ5IGhhbGYgdGhlIGZyZWUgc3BhY2UuICovXG4uc3RvcnktcGFyZW50LmlzLWpzLWZpdHRlZCAuY3VzdG9tLWNvbnRhaW5lciB7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbn1cblxuLyogQm91bmRzIGZvbGQtY29udGVudCBhdCBhdmFpbEggYmVmb3JlIGFueSBtZWFzdXJlbWVudCBydW5zOiB0aGUgc2Nyb2xsLWJvZHkgaXNcbiAgIHRoZSBvbmx5IGNoaWxkIGFsbG93ZWQgdG8gZ2l2ZSAobWluLWhlaWdodDogMCArIG92ZXJmbG93OiBoaWRkZW4pLCBzbyBsb25nXG4gICBvcGVuaW5nIHBhcmFncmFwaHMgY2xpcCBpbnNpZGUgdGhlIHJlYWRpbmcgd2luZG93IGluc3RlYWQgb2YgcHVzaGluZ1xuICAgc3RvcnktbWV0YSBwYXN0IHRoZSBmb2xkLiBTYW1lIGd1YXJhbnRlZSBqcy9ob21lLmpzJ3MgbWF4LWhlaWdodCBjYXAgcHJvdmlkZXNcbiAgIOKAlCB0aGUgY2FwIGl0IGNvbXB1dGVzIGxhdGVyIGVxdWFscyB3aGF0IHRoaXMgbGF5b3V0IGFscmVhZHkgcHJvZHVjZWQsIHNvIGl0XG4gICBsYW5kcyBhcyBhIG5vLW9wLiAqL1xuLnN0b3J5LXBhcmVudCAuZm9sZC1jb250ZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgbWF4LWhlaWdodDogMTAwJTtcbiAgbWluLWhlaWdodDogMDtcblxuICAvKiBBcyBhIGZsZXggaXRlbSBpdHMgYG1hcmdpbjogMCBhdXRvYCAoY3NzIGFib3ZlKSB3b3VsZCBvdGhlcndpc2Ugc2l6ZSBpdCB0b1xuICAgICBmaXQtY29udGVudCBpbnN0ZWFkIG9mIGZpbGxpbmcgdXAgdG8gbWF4LXdpZHRoIOKAlCBrZWVwcyB0aGUgNzYycHggY29sdW1uXG4gICAgIGlkZW50aWNhbCB0byB0aGUgYmxvY2stbGF5b3V0IHZlcnNpb24uICovXG4gIHdpZHRoOiAxMDAlO1xufVxuXG4vKiBzdG9yeS1zY3JvbGwtYm9keSBjbGlwcyB0aGUgcGFyYWdyYXBocyDigJQgc3RvcnktbWV0YSBsaXZlcyBiZWxvdyBpdCBzbyB0aGVcbiAgIGF2YXRhcidzIG5lZ2F0aXZlIG1hcmdpbi1sZWZ0IGlzIG5ldmVyIGNsaXBwZWQgYnkgb3ZlcmZsb3cteC4gbWF4LWhlaWdodCBpc1xuICAgc2V0IGJ5IEpTIHRvIGtlZXAgZm9sZC1jb250ZW50IGJvdW5kZWQgYXQgYXZhaWxILCBlbnN1cmluZyBzdG9yeS1tZXRhIGlzXG4gICBhbHdheXMgZnVsbHkgdmlzaWJsZS5cblxuICAgb3ZlcmZsb3cgaXMgSElEREVOLCBub3QgYXV0bzogYXMgYSBuYXRpdmUgc2Nyb2xsIGNvbnRhaW5lciBpdCBzd2FsbG93ZWQgd2hlZWxcbiAgIGFuZCB0b3VjaCBnZXN0dXJlcyBvdmVyIHRoZSBwYXJhZ3JhcGhzLCBzbyB0aGUgcGlubmVkIHNlY3Rpb24ncyBvd24gc2Nyb2xsXG4gICAod2hpY2ggZHJpdmVzIHRoZSByZXZlYWwpIGZvdWdodCBpdC4gSGlkZGVuIHN0aWxsIGxlYXZlcyB0aGUgZWxlbWVudFxuICAgcHJvZ3JhbW1hdGljYWxseSBzY3JvbGxhYmxlLCB3aGljaCBpcyBhbGwganMvaG9tZS5qcyBuZWVkcyDigJQgaXQgdHdlZW5zXG4gICBzY3JvbGxUb3AgaXRzZWxmIGFmdGVyIGVhY2ggcGFyYSBpcyByZXZlYWxlZC4gKi9cbi5zdG9yeS1zY3JvbGwtYm9keSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHNjcm9sbGJhci13aWR0aDogbm9uZTtcbiAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lO1xuXG4gIC8qIFNocmluay1vbmx5IChuZXZlciBhdXRvLWdyb3cpOiBhdCByZXN0IHRoZSByZWFkaW5nIHdpbmRvdyBrZWVwcyBpdHMgbmF0dXJhbFxuICAgICBoZWlnaHQsIHNvIHRoZSBvcGVuaW5nIGJsb2NrIHN0YXlzIGEgY29tcGFjdCwgY2VudHJlZCBncm91cCBhbmQgc3RvcnktbWV0YVxuICAgICBpcyBub3QgcHVzaGVkIHRvIHRoZSBmb2xkJ3MgYm90dG9tIGVkZ2UgYmVmb3JlIHRoZSByZWFkZXIgaGFzIHNjcm9sbGVkLiBJdFxuICAgICBvbmx5IGdpdmVzIHdoZW4gZm9sZC1jb250ZW50IHdvdWxkIG90aGVyd2lzZSBleGNlZWQgYXZhaWxILCB3aGljaCBpcyB3aGF0XG4gICAgIG1ha2VzIHRoZSBtYXgtaGVpZ2h0OiAxMDAlIGFib3ZlIGJpdGUgaGVyZSByYXRoZXIgdGhhbiBvdmVyZmxvd2luZy5cbiAgICAganMvaG9tZS5qcyBkb2VzIGdyb3cgaXQsIG9uY2UsIG9uIHRoZSBmaXJzdCByZXZlYWwg4oCUIHZpYSBhbiBleHBsaWNpdCBoZWlnaHRcbiAgICAgKGZyb3plbkgsIHNpemVkIGFnYWluc3QgdGhlIGZvbGQgc28gc2hvcnQgcGFyYWdyYXBocyBzdGlsbCBnZXQgYSBmdWxsLWhlaWdodFxuICAgICByZWFkaW5nIGJhbmQpLCB3aGljaCB0aGUgdHJhbnNpdGlvbiBiZWxvdyBjYXJyaWVzLiBmbGV4LWdyb3cgc3RheXMgMCBzbyB0aGF0XG4gICAgIHN0ZXAgaXMgdGhlIHNjcmlwdCdzIGRlY2lzaW9uIGFsb25lIGFuZCBuZXZlciBoYXBwZW5zIGltcGxpY2l0bHkuICovXG4gIGZsZXg6IDAgMSBhdXRvO1xuICBtaW4taGVpZ2h0OiAwO1xuXG4gIC8qIHNwYWNpbmcgYmV0d2VlbiB0aGUgbGFzdCBwYXJhIGFuZCBSaXRlc2ggYmVsb3cgKi9cbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcblxuICAvKiBUaGUgb25lIHN0ZXAgdGhpcyBib3ggdGFrZXMg4oCUIGpzL2hvbWUuanMgcGlucyBpdCB0byBhbiBleHBsaWNpdCBoZWlnaHQgb25cbiAgICAgdGhlIGZpcnN0IHJldmVhbCwgYW5kIHRoYXQgdXNlZCB0byBsYW5kIGluIGEgc2luZ2xlIGZyYW1lLCBzbyBzdG9yeS1tZXRhXG4gICAgIChSaXRlc2ggKyB0aGUgY2FwdGlvbiB1bmRlcm5lYXRoKSB0ZWxlcG9ydGVkIGRvd24uIFRyYW5zaXRpb25pbmcgaXQgbWFrZXNcbiAgICAgdGhlIGJveCBncm93IGludG8gaXRzIG5ldyBzaXplIGluc3RlYWQsIGFuZCBiZWNhdXNlIGhvbWUuanMga2lja3Mgb2ZmIGl0c1xuICAgICBmb2xkLWNvbnRlbnQgcmUtY2VudHJlIG9uIHRoZSBzYW1lIGZyYW1lIHdpdGggYSBtYXRjaGluZyAwLjZzLCB0aGUgdHdvXG4gICAgIHJlYWQgYXMgb25lIG1vdGlvbiByYXRoZXIgdGhhbiBhIGp1bXAgcGx1cyBhIGNvcnJlY3Rpb24uXG5cbiAgICAgQW5pbWF0aW5nIGhlaWdodCBpcyBub3JtYWxseSBvZmYtbGltaXRzIGhlcmUg4oCUIGl0IGNvc3RzIGEgbGF5b3V0IHBhc3MgcGVyXG4gICAgIGZyYW1lIOKAlCBidXQgdGhpcyBmaXJlcyBleGFjdGx5IHR3aWNlIGluIHRoZSBmb2xkJ3MgbGlmZSAob25jZSBvbiB0aGUgd2F5XG4gICAgIGRvd24sIG9uY2Ugb24gdGhlIHdheSBiYWNrKSwgbmV2ZXIgcGVyIHNjcm9sbCBmcmFtZS5cblxuICAgICBUaGUgY3VydmUgaXMgR1NBUCdzIHBvd2VyMi5vdXQgZXhwcmVzc2VkIGFzIGEgYmV6aWVyLCBkZWxpYmVyYXRlbHk6IHRoYXRcbiAgICAgaXMgdGhlIGVhc2UgZml0Rm9sZENvbnRlbnQoKSB0d2VlbnMgZm9sZC1jb250ZW50IHdpdGgsIGFuZCB0aGUgdHdvIHJ1blxuICAgICB0b2dldGhlci4gT24gZGlmZmVyZW50IGN1cnZlcyB0aGV5IGRyaWZ0IGFwYXJ0IG1pZC1mbGlnaHQgYW5kIHlvdSBzZWUgdHdvXG4gICAgIG1vdGlvbnM7IG9uIHRoZSBzYW1lIG9uZSB0aGV5IHJlYWQgYXMgYSBzaW5nbGUgbW92ZS4gKi9cbiAgdHJhbnNpdGlvbjogaGVpZ2h0IC42cyBjdWJpYy1iZXppZXIoLjIxNSwgLjYxLCAuMzU1LCAxKTtcbn1cblxuLnN0b3J5LXNjcm9sbC1ib2R5Ojotd2Via2l0LXNjcm9sbGJhciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIFRvdWNoOiB0aGUgaGVpZ2h0IHN0ZXAgaXMgYXBwbGllZCBpbnN0YW50bHkgKGpzL2hvbWUtc21vb3RoZWVyLTEuanMgcGFzc2VzXG4gICBJU19DT0FSU0VfUE9JTlRFUiB0aHJvdWdoIGZpdEZvbGRDb250ZW50KS4gVGhpcyBraWxscyB0aGUgbWF0Y2hpbmcgMC42cyBDU1NcbiAgIGhlaWdodCB0d2VlbiBzbyBpdCBjYW4ndCBydW4gV0hJTEUgdGhlIHBpbm5lZCBzY3JvbGwgaXMgc3RpbGwgc2NydWJiaW5nXG4gICAuc3RvcnktZGVzYy13cmFwcGVyIOKAlCB0aGUgdHdvIG1vdGlvbnMgb3ZlcmxhcHBpbmcgaXMgdGhlIFwiamVya3Mgd2hpbGVcbiAgIHJlYWRpbmdcIiBvbiBpT1MuIERlc2t0b3Aga2VlcHMgdGhlIGVhc2VkIGdyb3cuICovXG5AbWVkaWEgKHBvaW50ZXI6IGNvYXJzZSkge1xuICAuc3Rvcnktc2Nyb2xsLWJvZHkge1xuICAgIHRyYW5zaXRpb246IG5vbmU7XG4gIH1cbn1cblxuLyogTW9iaWxlIHVzZXMgdGhlIHNhbWUgcGlubmVkIHNjcm9sbCByZXZlYWwgYXMgZGVza3RvcCwgYW5kIHRoZSBzYW1lXG4gICBwYWRkaW5nLWJvdHRvbToganMvaG9tZS5qcyByZXNlcnZlcyBGT0xEX0JPVFRPTV9SRVNFUlZFICg1NnB4KSBhdCBldmVyeVxuICAgYnJlYWtwb2ludCwgc28gYSBsYXJnZXIgdmFsdWUgaGVyZSB3b3VsZCBvbmx5IGRlc3luYyB0aGUgQ1NTIGNlbnRyaW5nIGJveFxuICAgZnJvbSB0aGUgSlMgYXZhaWxIIOKAlCBzZWUgdGhlIC5zdG9yeS1wYXJlbnQgcnVsZSBhYm92ZS4gKi9cblxuLnN0b3J5LXBhcmVudCAuc3RvcnktdGl0bGUge1xuICBmb250LXNpemU6IGNsYW1wKDI4cHgsIDIuNzh2dywgNDhweCk7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIGxpbmUtaGVpZ2h0OiBjbGFtcCgzOHB4LCAzLjd2dywgNjRweCk7XG4gIGxldHRlci1zcGFjaW5nOiAwO1xuICBtYXgtd2lkdGg6IDkwMHB4O1xuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuXG4gIC8qIEdyYWRpZW50IFRleHQgU3R5bGluZyBmcm9tIEZpZ21hICovXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MC4wM2RlZywgIzI4NGNiYSAwJSwgI2VhMWIzZCA1Ni44NyUpO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHRleHQ7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4vKiBTdHJpa2V0aHJvdWdoIFBsYXkgU3R5bGluZyAqL1xuLnRpdGxlLXN0cmlrZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogI2ViMmMwMDtcbiAgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6ICNlYjJjMDA7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGJhY2tncm91bmQtY2xpcDogdW5zZXQ7XG59XG5cbi5zdHJpa2UtbGluZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMDtcbiAgdG9wOiA1MiU7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ViMmMwMDtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xufVxuXG4udGl0bGUtaGlnaGxpZ2h0IHtcbiAgY29sb3I6IHZhcigtLWFjY2VudC1yZWQpO1xuICAtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogI2ViMmMwMDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHVuc2V0O1xuICBvcGFjaXR5OiAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIDdiLiBXaG8gV2UgQXJlIFN0YXRlbWVudCBmb2xkXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogQ2FycmllcyB0aGUgZXh0cmEgLmZvbGRzLWNvbnRhaW5lciBzcGVjaWZpY2l0eSAoc2FtZSB0cmljayBhc1xuICAgLmZvbGRzLWNvbnRhaW5lciAuc3RvcnktcGFyZW50IGFib3ZlKSBpbnN0ZWFkIG9mICFpbXBvcnRhbnQuIFRoaXMgZm9sZCBpc1xuICAgbmV2ZXIgcGlubmVkLCBzbyBub3RoaW5nIHdyaXRlcyBhbiBpbmxpbmUgaGVpZ2h0IGhlcmUg4oCUIHRoZSBvbmx5IHRoaW5nIHRoYXRcbiAgIGNhbiByZXN1cnJlY3QgLmZvbGQncyBgaGVpZ2h0OiAxMDB2aGAgaXMgc291cmNlIG9yZGVyOiBhIHBhcnRpYWxseS1kb3dubG9hZGVkXG4gICBzdHlsZXNoZWV0IHRoYXQgcGFyc2VkIGAuZm9sZGAgYnV0IG5vdCB0aGlzIHJ1bGUgeWV0LCBvciB0aGUgV29yZFByZXNzIGJ1aWxkXG4gICBjb25jYXRlbmF0aW5nIHRoaXMgZmlsZSBhaGVhZCBvZiB0aGUgYmFzZSBgLmZvbGRgIGJsb2NrLiBPbiBtb2JpbGUgdGhhdFxuICAgcmVuZGVyZWQgYSBmdWxsIHZpZXdwb3J0IG9mIGVtcHR5IHBlYWNoIGFib3ZlIHRoZSBoZWFkaW5nLiBUaGUgYW5jZXN0b3JcbiAgIHNlbGVjdG9yIHdpbnMgcmVnYXJkbGVzcyBvZiBvcmRlciwgYW5kIHN0aWxsIG91dHJhbmtzIGFueSBiYXJlIGBzZWN0aW9uYFxuICAgcnVsZSB0aGUgdGhlbWUgc2V0cy4gKi9cbi5mb2xkcy1jb250YWluZXIgLndoby13ZS1hcmUtcGFyZW50IHtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctcHJpbWFyeSk7XG5cbiAgLyogT3ZlcnJpZGVzIC5mb2xkJ3MgMTAwdmgg4oCUIHRoaXMgaXMgYSBzaG9ydCBzdGF0ZW1lbnQgYmxvY2ssIG5vdCBhIGZ1bGwtc2NyZWVuXG4gICAgIGZvbGQsIHNvIGl0IHNob3VsZCBzaXplIHRvIGl0cyBvd24gY29udGVudCBpbnN0ZWFkIG9mIGZvcmNpbmcgYSBmdWxsXG4gICAgIHZpZXdwb3J0IG9mIGVtcHR5IHNwYWNlIGFib3ZlL2JlbG93IHRoZSBoZWFkaW5nLiAqL1xuICBoZWlnaHQ6IGF1dG87XG4gIG1pbi1oZWlnaHQ6IDA7XG4gIHBhZGRpbmctdG9wOiAwO1xuICBwYWRkaW5nLWJvdHRvbTogMDtcbn1cblxuLndoby13ZS1hcmUtdGl0bGUge1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1wcmltYXJ5KTtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgZm9udC1zaXplOiBjbGFtcCgxOHB4LCA0dncsIDI4cHgpO1xuICBsaW5lLWhlaWdodDogY2xhbXAoMjZweCwgNS41dncsIDM4cHgpO1xuICBsZXR0ZXItc3BhY2luZzogMDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgY29sb3I6IHZhcigtLXRleHQtcHJpbWFyeSk7XG4gIG1heC13aWR0aDogNjgwcHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAvKiBTYW1lIGxlZnQgc2hpZnQgYXMgLnN0b3J5LW1ldGEncyBtYXJnaW4tbGVmdCAodGhlIGF2YXRhciByb3cgYWJvdmUpIOKAlCBib3RoXG4gICAgIGNvbXB1dGVkIGZyb20gdGhlIHNoYXJlZCAuZm9sZC1jb250ZW50IGVkZ2UsIHNvIHRoZSBURVhUIGxhbmRzIGV4YWN0bHlcbiAgICAgdW5kZXIgdGhlIGF2YXRhciBwaG90bydzIG93biBsZWZ0IGVkZ2UgaW5zdGVhZCBvZiBndWVzc2luZyBhdCBhIGZpeGVkXG4gICAgIG9mZnNldC4gVGhlIGFjY2VudCBsaW5lIHNpdHMgZnVydGhlciBsZWZ0LCBvZmYgdGhlIHRleHQncyBvd24gYm94IChzZWVcbiAgICAgOjpiZWZvcmUgYmVsb3cpLCBzbyBpdCBkb2Vzbid0IHB1c2ggdGhlIHRleHQgb2ZmIHRoYXQgYWxpZ25tZW50LiAqL1xuICBtYXJnaW4tbGVmdDogY2xhbXAoLTQ4cHgsIC0yLjc4dncsIC0yOHB4KTtcbn1cblxuLndoby13ZS1hcmUtdGl0bGU6OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBib3R0b206IDA7XG4gIGxlZnQ6IC0yNHB4O1xuICB3aWR0aDogMXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRkYWI4O1xufVxuXG4ud2hvLXdlLWFyZS10aXRsZSAuZ3JhZGllbnQtdGV4dCB7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MC4wM2RlZywgIzI4NGNiYSAwJSwgI2VhMWIzZCA1Ni44NyUpO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHRleHQ7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4vKiBqcy9ob21lLmpzIHRyYXZlbHMgdGhlIHN0b3J5IGJ5IHRyYW5zZm9ybWluZyBUSElTIGVsZW1lbnQsIG5vdCBieSBzZXR0aW5nXG4gICBzY3JvbGxUb3Agb24gLnN0b3J5LXNjcm9sbC1ib2R5IGFib3ZlIGl0IOKAlCB0ZXh0IGlzIG5vdCBsYXllci1iYWNrZWQsIHNvXG4gICBzY3JvbGxpbmcgaXQgcmVwYWludHMgZXZlcnkgbGluZSwgb25jZSBwZXIgZnJhbWUsIGZvciB0aGUgd2hvbGUgbGVuZ3RoIG9mXG4gICB0aGUgcGluLiB3aWxsLWNoYW5nZSBrZWVwcyB0aGUgd3JhcHBlciBvbiBpdHMgb3duIGNvbXBvc2l0b3IgbGF5ZXIgc28gdGhhdFxuICAgcGVyLWZyYW1lIG1vdmUgaXMgYSBjb21wb3NpdGUgaW5zdGVhZC4gVGhlIGNsaXBwaW5nIHN0aWxsIGNvbWVzIGZyb21cbiAgIC5zdG9yeS1zY3JvbGwtYm9keSdzIG92ZXJmbG93OiBoaWRkZW4sIGV4YWN0bHkgYXMgYmVmb3JlLiAqL1xuLnN0b3J5LWRlc2Mtd3JhcHBlciB7XG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07XG5cbiAgLyogUGluIHRoZSB3cmFwcGVyIHRvIGl0cyBvd24gY29tcG9zaXRvciBsYXllciBmcm9tIGZpcnN0IHBhaW50LCBub3Qgb25seVxuICAgICBvbmNlIEpTIHN0YXJ0cyB0cmFuc2Zvcm1pbmcgaXQuIE9uIGlPUyBTYWZhcmkgYSB3aWxsLWNoYW5nZSBoaW50IGFsb25lIGNhblxuICAgICBsZWF2ZSB0aGUgbGF5ZXIgdW4tcHJvbW90ZWQgdW50aWwgdGhlIGZpcnN0IHRyYW5zZm9ybSBsYW5kcywgYW5kIHRoZVxuICAgICBwcm9tb3Rpb24gaXRzZWxmIOKAlCBtaWQtc2Nyb2xsIOKAlCBpcyBhIHZpc2libGUgaGl0Y2guIHRyYW5zbGF0ZVooMCkgZm9yY2VzXG4gICAgIGl0IHVwIGZyb250OyBiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbiBzdG9wcyB0aGUgc3ViLXBpeGVsIHRleHRcbiAgICAgcmUtcmFzdGVyaXNhdGlvbiB0aGF0IHJlYWRzIGFzIHRoZSBzdG9yeSBcInNoaXZlcmluZ1wiIHdoaWxlIGJlaW5nIHJlYWQuXG4gICAgIGpzL2hvbWUtc21vb3RoZWVyLTEuanMgb3ZlcndyaXRlcyB0cmFuc2Zvcm0gd2l0aCBpdHMgdHJhbnNsYXRlM2QgZWFjaFxuICAgICBmcmFtZSwgc28gdGhpcyBpcyBvbmx5IHRoZSByZXN0aW5nIHZhbHVlLiAqL1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi8qIC0tc3RvcnktZGVzYy1nYXAgaXMgdGhlIE9ORSBkZWZpbml0aW9uIG9mIHRoZSBzcGFjZSBiZXR3ZWVuIHBhcmFncmFwaHMuIFRoZVxuICAgaGlkZGVuIC8gcmV2ZWFsZWQgLyBtZWFzdXJpbmcgc3RhdGVzIGJlbG93IGFsbCByZXNvbHZlIHRoZWlyIG1hcmdpbiBmcm9tIGl0LFxuICAgc28gd2hhdCBqcy9ob21lLmpzIG1lYXN1cmVzIGlzIGFsd2F5cyB3aGF0IHRoZSBicm93c2VyIHJlbmRlcnMuIEhhcmRjb2RpbmdcbiAgIDEycHggaW4gdGhvc2Ugc3RhdGVzIG1lYW50IG1vYmlsZSAoMTVweCBoZXJlKSByZW5kZXJlZCBnYXBzIHRoZSBtZWFzdXJpbmdcbiAgIHBhc3MgbmV2ZXIgc2F3LCBhbmQgdGhlIHNjcnViIGVuZGVkIHNob3J0IOKAlCBjbGlwcGluZyB0aGUgbGFzdCBsaW5lLiAqL1xuLnN0b3J5LWRlc2Mge1xuICAtLXN0b3J5LWRlc2MtZ2FwOiAxMnB4O1xuXG4gIGZvbnQtc2l6ZTogY2xhbXAoMTZweCwgMS4zOXZ3LCAyNHB4KTtcbiAgZm9udC13ZWlnaHQ6IDI1MDtcbiAgbGluZS1oZWlnaHQ6IDEuNjY7XG4gIGNvbG9yOiAjMDAwO1xuICBtYXgtd2lkdGg6IDc2MHB4O1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zdG9yeS1kZXNjLWdhcCk7XG59XG5cbi8qIFBhcmFzIDMrIGFyZSBoaWRkZW4gb24gbG9hZCDigJQgaGVpZ2h0OjAgcmVzZXJ2ZXMgbm8gc3BhY2UuXG4gICBOT1RFOiB0aGUgbnVtYmVyIDMgbXVzdCBlcXVhbCBJTklUSUFMX1ZJU0lCTEVfUEFSQVMgKyAxIGluIGhvbWUuanMuICovXG4uc3RvcnktZGVzYy13cmFwcGVyIC5zdG9yeS1kZXNjOm50aC1jaGlsZChuICsgMykge1xuICBoZWlnaHQ6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyNHB4KTtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcblxuICAvKiBNYXRjaGVkIHRvIHRoZSBib3gncyBoZWlnaHQgdHJhbnNpdGlvbiBhbmQgZml0Rm9sZENvbnRlbnQoKSdzIHR3ZWVuIOKAlFxuICAgICBzYW1lIDAuNnMsIHNhbWUgY3VydmUg4oCUIHNvIHRoZSBwYXJhZ3JhcGggYXJyaXZpbmcsIHRoZSBib3ggZ3Jvd2luZyBhbmRcbiAgICAgdGhlIGJsb2NrIHJlLWNlbnRyaW5nIGFyZSBvbmUgbW90aW9uLiBBdCAwLjdzIG9uIGEgZGlmZmVyZW50IGVhc2UgdGhlXG4gICAgIHBhcmFncmFwaCB3YXMgc3RpbGwgc2V0dGxpbmcgYWZ0ZXIgdGhlIG90aGVyIHR3byBoYWQgc3RvcHBlZCwgd2hpY2ggaXNcbiAgICAgd2hhdCBtYWRlIHRoZSB0aGlyZCBvbmUgZmVlbCBsaWtlIGl0IGxhbmRlZCBzZXBhcmF0ZWx5LiAqL1xuICB0cmFuc2l0aW9uOlxuICAgIG9wYWNpdHkgLjZzIGN1YmljLWJlemllciguMjE1LCAuNjEsIC4zNTUsIDEpLFxuICAgIHRyYW5zZm9ybSAuNnMgY3ViaWMtYmV6aWVyKC4yMTUsIC42MSwgLjM1NSwgMSk7XG59XG5cbi8qIFNjcm9sbC1yZXZlYWxlZCDigJQgc2FtZSBzcGVjaWZpY2l0eSwgcGxhY2VkIGFmdGVyIDpudGgtY2hpbGQgc28gaXQgd2lucyBvbiBzb3VyY2Ugb3JkZXIuICovXG4uc3RvcnktZGVzYy13cmFwcGVyIC5zdG9yeS1kZXNjLmlzLXZpc2libGUge1xuICBoZWlnaHQ6IGF1dG87XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLXN0b3J5LWRlc2MtZ2FwKTtcbn1cblxuLyogTWVhc3VyZW1lbnQgcGFzcyAoanMvaG9tZS5qcyk6IGV2ZXJ5IHBhcmEgaXMgYnJpZWZseSBsYWlkIG91dCBhdCB0aGUgaGVpZ2h0XG4gICBpdCB3aWxsIGhhdmUgb25jZSByZXZlYWxlZCwgc28gdGhlIHJldmVhbCBwb2ludHMgYW5kIHNjcm9sbCB0cmF2ZWwgY2FuIGJlXG4gICByZWFkIGluIG9uZSBiYXRjaC4gR2VvbWV0cnkgb25seSDigJQgb3BhY2l0eSBhbmQgdHJhbnNmb3JtIGFyZSBsZWZ0IGFsb25lLCBzb1xuICAgbm90aGluZyBhbmltYXRlcyBhbmQgdGhlIHBhc3MsIHJldmVydGVkIGluIHRoZSBzYW1lIGZyYW1lLCBpcyBuZXZlciBwYWludGVkLlxuICAgTGFzdCBvZiB0aGUgdGhyZWUgcnVsZXMsIHNvIGl0IHdpbnMgb24gc291cmNlIG9yZGVyLiAqL1xuLnN0b3J5LWRlc2Mtd3JhcHBlci5pcy1tZWFzdXJpbmcgLnN0b3J5LWRlc2Mge1xuICBoZWlnaHQ6IGF1dG87XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICBtYXJnaW4tdG9wOiAwO1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zdG9yeS1kZXNjLWdhcCk7XG59XG5cbi8qIEN1ZSBmb3IgdGhlIHBhcmFzIGhpZGRlbiBieSA6bnRoLWNoaWxkKG4rMykgYWJvdmUg4oCUIHdpdGhvdXQgaXQsIG5vdGhpbmdcbiAgIHNpZ25hbHMgdGhlcmUncyBtb3JlIG9mIHRoZSBzdG9yeSB0byByZXZlYWwgYnkgc2Nyb2xsaW5nLiBIaWRkZW4gYnlcbiAgIGRlZmF1bHQ7IGpzL2hvbWUuanMgYWRkcyAuaXMtdmlzaWJsZSBvbmx5IHdoaWxlIHRleHQgcmVtYWlucyB0byByZXZlYWwuICovXG5cbi8qIFRoZSBjdWUncyBsaW5lIGJveCBhbmQgYm90dG9tIG1hcmdpbiBhcmUgcmVzZXJ2ZWQgYXQgYWxsIHRpbWVzIOKAlCBpdCBmYWRlc1xuICAgYW5kIHNsaWRlcywgYnV0IG5ldmVyIGNvbGxhcHNlcy4gSXQgdXNlZCB0byB0b2dnbGUgaGVpZ2h0IDAgPC0+IGF1dG8gYW5kXG4gICBtYXJnaW4gMCA8LT4gY2xhbXAoKSwgc28gaGlkaW5nIGl0IGF0IHRoZSBlbmQgb2YgdGhlIHN0b3J5IHNocmFua1xuICAgLmZvbGQtY29udGVudCBhbmQgZHJhZ2dlZCAuc3RvcnktbWV0YSB1cCB3aXRoIGl0LiBTcGFjZSBzdGF5cyBjbGFpbWVkO1xuICAgb25seSBvcGFjaXR5L3RyYW5zZm9ybSBhbmltYXRlIChjb21wb3NpdGUtb25seSwgbm8gcmVmbG93KS4gKi9cbi5zdG9yeS1zY3JvbGwtY3VlIHtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMThweDtcbiAgY29sb3I6ICNlYjRjNWU7XG5cbiAgLyogR2FwIGRvd24gdG8gLnN0b3J5LW1ldGEgKHRoZSBhdmF0YXIgcm93KS4gUmVzZXJ2ZWQgYXQgYWxsIHRpbWVzIOKAlCBzZWUgdGhlXG4gICAgIG5vdGUgYWJvdmUg4oCUIHNvIHNocmlua2luZyBpdCBkb2VzIG5vdCBqdXN0IHRpZ2h0ZW4gdGhlIHZpc3VhbCBzcGFjaW5nLCBpdFxuICAgICBoYW5kcyB0aGUgZGlmZmVyZW5jZSBiYWNrIHRvIHRoZSByZWFkaW5nIHdpbmRvdzogc3RvcnlBdmFpbEgoKSBtZWFzdXJlc1xuICAgICBmb2xkLWNvbnRlbnQsIGFuZCBhIHNob3J0ZXIgY3VlIG1hcmdpbiBtZWFucyBtb3JlIHJvb20gZm9yIHN0b3J5IGxpbmVzLiAqL1xuICBtYXJnaW46IDAgMCAzMnB4O1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTBweCk7XG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIHRyYW5zaXRpb246XG4gICAgb3BhY2l0eSAuNXMgY3ViaWMtYmV6aWVyKC4yNSwgLjQ2LCAuNDUsIC45NCksXG4gICAgdHJhbnNmb3JtIC41cyBjdWJpYy1iZXppZXIoLjI1LCAuNDYsIC40NSwgLjk0KTtcbn1cblxuLnN0b3J5LXNjcm9sbC1jdWUuaXMtdmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbn1cblxuLyogU3RvcnkgTWV0YWRhdGEgJiBBdXRob3IgRGV0YWlscyAqL1xuLnN0b3J5LW1ldGEge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IGNsYW1wKDEwcHgsIC45M3Z3LCAxNnB4KTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nLXRvcDogMnB4O1xuICBtYXJnaW4tbGVmdDogY2xhbXAoLTQ4cHgsIC0yLjc4dncsIC0yOHB4KTtcbiAgbWF4LXdpZHRoOiAzMDBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uc3RvcnktbWV0YTo6YmVmb3JlIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDQ5cHg7XG4gIHdpZHRoOiA0NHB4O1xuICBoZWlnaHQ6IDEuNXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZmQxO1xufVxuXG4uYXZhdGFyLXdyYXBwZXIge1xuICB3aWR0aDogMzJweDtcbiAgaGVpZ2h0OiAzNHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCUgNTAlIDAgMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzBiMTQxNTtcbn1cblxuLmF2YXRhci1pbWcge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvYmplY3QtZml0OiBjb3Zlcjtcbn1cblxuLnN0b3J5LWF1dGhvci1kZXRhaWxzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGNvbG9yOiAjNjc2Nzc1O1xuICBtYXJnaW4tdG9wOiBjbGFtcCgxMHB4LCAuOTN2dywgMTZweCk7XG59XG5cbi5zdG9yeS1kb3Qge1xuICBjb2xvcjogIzY3Njc3NTtcbiAgZm9udC1zaXplOiBjbGFtcCgxMXB4LCAxLjA0dncsIDE4cHgpO1xufVxuXG4vKiBBdmF0YXIgRXhwYW5kZWQgT3ZlcmxheSBDU1MgKi9cbi5hdmF0YXItZXhwYW5kZWQtb3ZlcmxheSB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB6LWluZGV4OiAyMDAwO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmF2YXRhci1leHBhbmRlZC1vdmVybGF5LmlzLW9wZW4ge1xuICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLmF2YXRhci1leHBhbmRlZC1vdmVybGF5IC5leHBhbmRlZC1iZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMGIxNDE1O1xuICB0cmFuc2Zvcm06IHNjYWxlWCgwKTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjtcbiAgb3BhY2l0eTogMDtcbiAgei1pbmRleDogMTtcblxuICAvKiBDbG9zZTogYmcgZmFkZXMgb3V0IGFmdGVyIGF2YXRhciBjb2xsYXBzZXMsIHRoZW4gc3RyaXAgc25hcHMgYXdheSAqL1xuICB0cmFuc2l0aW9uOlxuICAgIG9wYWNpdHkgLjRzIGVhc2UgLjNzLFxuICAgIHRyYW5zZm9ybSAwcyBsaW5lYXIgLjdzO1xufVxuXG4uYXZhdGFyLWV4cGFuZGVkLW92ZXJsYXkuaXMtb3BlbiAuZXhwYW5kZWQtYmcge1xuICB0cmFuc2Zvcm06IHNjYWxlWCgxKTtcbiAgb3BhY2l0eTogMTtcblxuICAvKiBPcGVuOiBhdmF0YXIgZXhwYW5kcyBmaXJzdCwgdGhlbiBiZyBmYWRlcyArIGV4cGFuZHMgaW4gYmVoaW5kIGl0ICovXG4gIHRyYW5zaXRpb246XG4gICAgb3BhY2l0eSAuNXMgZWFzZSAuM3MsXG4gICAgdHJhbnNmb3JtIC41cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSkgLjNzO1xufVxuXG4uZXhwYW5kZWQtYXZhdGFyLWNvbnRhaW5lciB7XG5cbiAgLyogRml4ZWQgYXQgZmluYWwgc2l6ZSBhbmQgcG9zaXRpb247IEpTIHNldHMgdHJhbnNmb3JtLW9yaWdpbiB0byB0aGUgYXZhdGFyXG4gICAgIGxvY2F0aW9uIHNvIHNjYWxlKDAp4oaSc2NhbGUoMSkgYXBwZWFycyB0byBncm93IGZyb20gdGhlIGF2YXRhci4gKi9cbiAgcG9zaXRpb246IGZpeGVkO1xuICBsZWZ0OiA1MCU7XG4gIHRvcDogNTAlO1xuXG4gIC8qIHdpZHRoOiBtaW4oODB2dywgNzEycHgpOyAqL1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuXG4gIC8qIGJvcmRlci1yYWRpdXM6IDMwMHB4IDMwMHB4IDAgMDsgKi9cbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgei1pbmRleDogMjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMCk7XG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07XG5cbiAgLyogQ2xvc2U6IHNwcmluZyBjb2xsYXBzZSDigJQgbWlycm9ycyB0aGUgb3BlbiBzcHJpbmcgZXhwYW5zaW9uICovXG4gIHRyYW5zaXRpb246XG4gICAgdHJhbnNmb3JtIC41NXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpLFxuICAgIGJvcmRlci1yYWRpdXMgLjU1cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSk7XG59XG5cbi8qIExlZnQtc2lkZSBzY3JpbSBvdmVyIHRoZSBwaG90byDigJQga2VlcHMgZXhwYW5kZWQtYXZhdGFyLXRleHQgbGVnaWJsZVxuICAgcmVnYXJkbGVzcyBvZiB0aGUgdW5kZXJseWluZyBpbWFnZSwgd2l0aG91dCBmbGF0dGVuaW5nIHRoZSBwb3J0cmFpdCBvblxuICAgdGhlIHJpZ2h0IHdoZXJlIHRoZSBzdWJqZWN0IHNpdHMuIFBhaW50cyBhYm92ZSAuZXhwYW5kZWQtYXZhdGFyLWltZ1xuICAgKGxhdGVyIGluIHRoZSBjb250YWluZXIncyBvd24gc3RhY2tpbmcgY29udGV4dCkgYnV0IHN0YXlzIGJlbG93IHRoZVxuICAgdGV4dC9jbG9zZSBidXR0b24sIHdoaWNoIGFyZSBzZXBhcmF0ZSBzaWJsaW5ncyB3aXRoIGhpZ2hlciB6LWluZGV4LiAqL1xuLmV4cGFuZGVkLWF2YXRhci1jb250YWluZXI6OmFmdGVyIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcblxuICAvKiBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoXG4gICAgdG8gcmlnaHQsXG4gICAgcmdiYSgxNiwgMjYsIDI3LCAuNzUpIDAlLFxuICAgIHJnYmEoMTYsIDI2LCAyNywgLjU1KSAzNSUsXG4gICAgcmdiYSgxNiwgMjYsIDI3LCAwKSA2MCVcbiAgKTsgKi9cbiAgYmFja2dyb3VuZDogIzEwMWExYjtcbiAgb3BhY2l0eTogLjM7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uYXZhdGFyLWV4cGFuZGVkLW92ZXJsYXkuaXMtb3BlbiAuZXhwYW5kZWQtYXZhdGFyLWNvbnRhaW5lciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEpO1xuICB0cmFuc2l0aW9uOlxuICAgIHRyYW5zZm9ybSAuNjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKSxcbiAgICBib3JkZXItcmFkaXVzIC42NXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpO1xuICBiYWNrZ3JvdW5kOiAjMGIxNDE1O1xufVxuXG4vKiBIYXJkLWNhcHBlZCB0byB0aGUgcmlnaHQgNjAlIG9mIHRoZSB2aWV3cG9ydCDigJQgTk9UIGxlZnQgdG8gZmlsbCB0aGUgZnVsbFxuICAgd2lkdGggYW5kIHJlbHkgb24gb2JqZWN0LXBvc2l0aW9uL2xldHRlcmJveGluZyB0byBrZWVwIGNsZWFyIG9mIHRoZSB0ZXh0LlxuICAgVGhhdCB3YXMgYXNwZWN0LXJhdGlvLWRlcGVuZGVudDogd2hlbmV2ZXIgdGhlIHZpZXdwb3J0J3MgYXNwZWN0IHJhdGlvIGlzXG4gICBuYXJyb3dlciB0aGFuIHRoZSBwaG90bydzIG93biAodHJ1ZSBmb3IgbW9zdCB3aW5kb3cgc2hhcGVzLCBzaW5jZSB0aGVcbiAgIHNvdXJjZSBwaG90b3MgYXJlIGxhbmRzY2FwZSksIG9iamVjdC1maXQ6Y29udGFpbiBoYXMgbm8gaG9yaXpvbnRhbCBzbGFja1xuICAgdG8gcHVzaCBhcm91bmQgYW5kIHRoZSBpbWFnZSBmaWxscyAxMDAlIHdpZHRoIHJlZ2FyZGxlc3Mgb2ZcbiAgIG9iamVjdC1wb3NpdGlvbiDigJQgc28gdGhlIHN1YmplY3QncyBvbi1zY3JlZW4gcG9zaXRpb24gZHJpZnRlZCB3aXRoIHRoZVxuICAgdmlld3BvcnQncyBoZWlnaHQgKGJvdHRvbS1hbmNob3JlZCBpbWFnZSArIGEgdmVydGljYWxseS1jZW50ZXJlZCB0ZXh0XG4gICBibG9jayksIGFuZCBvbiBzaG9ydC9zcXVhdCB3aW5kb3dzIHRoZSB0ZXh0IGNvdWxkIGVuZCB1cCBsZXZlbCB3aXRoIGFcbiAgIHdpZGUgcGFydCBvZiB0aGUgZmFjZS4gQ29uZmluaW5nIHRoZSBpbWFnZSB0byBhIGZpeGVkIGNvbHVtbiByZW1vdmVzXG4gICB0aGF0IGhlaWdodC1kZXBlbmRlbmN5OyA2MCUga2VlcHMgdGhlIHBob3RvIGF0IGEgbmF0dXJhbCBzaXplIG9uIHJlYWxcbiAgIGxhcHRvcC9kZXNrdG9wIHdpZHRocyAod2hpY2ggcnVuIHdpZGUsIG5vdCBzaG9ydCkgd2hpbGUgc3RpbGwgbGVhdmluZ1xuICAgdGhlIHRleHQgY29sdW1uIChtYXggfjQzJSBvZiB2aWV3cG9ydCwgc2VlIC5leHBhbmRlZC1hdmF0YXItdGV4dClcbiAgIGd1YXJhbnRlZWQgY2xlYXJhbmNlIGRvd24gdG8gfjEyMDBweC4gTmFycm93ZXIgZGVza3RvcCB3aWR0aHNcbiAgICgxMDI1LTExOTlweCwgZS5nLiBhIGRlbGliZXJhdGVseSBzaHJ1bmsgYnJvd3NlcikgZ2V0IGEgdGlnaHRlciBtYXJnaW5cbiAgIGhlcmUg4oCUIGFjY2VwdGFibGUgc2luY2UgdGhhdCdzIG5vdCBhIHJlYWxpc3RpYyBsYXB0b3Agdmlld3BvcnQuICovXG4uZXhwYW5kZWQtYXZhdGFyLWltZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgd2lkdGg6IDYwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvYmplY3QtZml0OiBjb250YWluO1xuICBvYmplY3QtcG9zaXRpb246IHJpZ2h0IGJvdHRvbTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuNHMgZWFzZTtcbn1cblxuLmF2YXRhci1leHBhbmRlZC1vdmVybGF5LmlzLW9wZW4gLmV4cGFuZGVkLWF2YXRhci1pbWcge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xufVxuXG4uZXhwYW5kZWQtYXZhdGFyLXRleHQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHotaW5kZXg6IDM7XG4gIGNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwO1xuICB3aWR0aDogY2xhbXAoMjYwcHgsIDM4dncsIDU5MXB4KTtcbiAgbWFyZ2luLWxlZnQ6IGNsYW1wKDI0cHgsIDV2dywgOTZweCk7XG4gIHRleHQtc2hhZG93OiAwIDJweCAxMHB4IHJnYigwLCAwLCAwLCAuOCk7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjJzIGVhc2UgMHM7IC8qIGNsb3NlOiBmYXN0LCBubyBkZWxheSAqL1xufVxuXG4uYXZhdGFyLWV4cGFuZGVkLW92ZXJsYXkuaXMtb3BlbiAuZXhwYW5kZWQtYXZhdGFyLXRleHQge1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC40cyBlYXNlIC44czsgLyogb3BlbjogYWZ0ZXIgYmcgaGFzIGV4cGFuZGVkICovXG59XG5cbi5leHBhbmRlZC1uYW1lIHtcbiAgZm9udC1zaXplOiA3MnB4O1xuICBsaW5lLWhlaWdodDogODhweDtcbiAgZm9udC13ZWlnaHQ6IDI1MDtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBsZXR0ZXItc3BhY2luZzogMi44OHB4O1xufVxuXG4uZXhwYW5kZWQtcm9sZSB7XG4gIG1hcmdpbi1ib3R0b206IDQwcHg7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG59XG5cbi5leHBhbmRlZC1xdW90ZSB7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIG1heC13aWR0aDogNTkwcHg7XG59XG5cbi5leHBhbmRlZC1jbG9zZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA0OHB4O1xuICByaWdodDogNDhweDtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgei1pbmRleDogMTA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuMnMgZWFzZSAwczsgLyogY2xvc2U6IGZhc3QsIG5vIGRlbGF5ICovXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uZXhwYW5kZWQtY2xvc2UgaSB7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgY29sb3I6ICNmZmY7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuM3MgZWFzZTtcbn1cblxuLmV4cGFuZGVkLWNsb3NlIC5pYi1pY29uIHtcbiAgd2lkdGg6IDI0cHg7XG4gIGhlaWdodDogMjRweDtcbiAgY29sb3I6ICNmZmY7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuM3MgZWFzZTtcbn1cblxuLmV4cGFuZGVkLWNsb3NlOmhvdmVyIGksXG4uZXhwYW5kZWQtY2xvc2U6aG92ZXIgLmliLWljb24ge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG59XG5cbi5hdmF0YXItZXhwYW5kZWQtb3ZlcmxheS5pcy1vcGVuIC5leHBhbmRlZC1jbG9zZSB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2UgLjhzOyAvKiBvcGVuOiBhZnRlciBiZyBoYXMgZXhwYW5kZWQgKi9cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDEwMjRweCkge1xuICAuZXhwYW5kZWQtYXZhdGFyLWNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDEwMHZ3O1xuICAgIGhlaWdodDogMTAwdmg7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICB0b3A6IGF1dG87XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAwJSkgc2NhbGUoMCk7XG4gIH1cblxuICAvKiBPcGVuIG9yZGVyIGlzIHJldmVyc2VkIG9uIG1vYmlsZTogdGhlIGJnIG11c3QgYmUgaW4gcGxhY2UgYmVmb3JlIHRoZVxuICAgICBhdmF0YXIgKG9iamVjdC1maXQ6Y29udGFpbiwgYm90dG9tLWFuY2hvcmVkIOKAlCBzZWUgYmFzZSBydWxlKSBzY2FsZXMgdXBcbiAgICAgb3ZlciBpdCwgc28gdGhlcmUncyBubyBmbGFzaCBvZiB0aGUgY29udGFpbmVyJ3Mgb3duIGJhY2tncm91bmQuICovXG4gIC5hdmF0YXItZXhwYW5kZWQtb3ZlcmxheS5pcy1vcGVuIC5leHBhbmRlZC1iZyB7XG4gICAgdHJhbnNpdGlvbjpcbiAgICAgIG9wYWNpdHkgLjM1cyBlYXNlIDBzLFxuICAgICAgdHJhbnNmb3JtIDBzIGxpbmVhciAwczsgLyogcHVyZSBmYWRlIOKAlCBubyBzY2FsZVggc3RyaXAgb24gbW9iaWxlICovXG4gIH1cblxuICAuYXZhdGFyLWV4cGFuZGVkLW92ZXJsYXkuaXMtb3BlbiAuZXhwYW5kZWQtYXZhdGFyLWNvbnRhaW5lciB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMCUpIHNjYWxlKDEpO1xuICAgIHRyYW5zaXRpb246XG4gICAgICB0cmFuc2Zvcm0gLjY1cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSkgLjI1cyxcbiAgICAgIGJvcmRlci1yYWRpdXMgLjY1cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSkgLjI1cztcbiAgfVxuXG4gIC8qIFN0YWNrZWQgbGF5b3V0OiB0aGUgcGhvdG8gaXMgcGlubmVkIHRvIGEgaGFyZCB2aC1jYXBwZWQgYmFuZCBhdCB0aGVcbiAgICAgYm90dG9tIChub3QgbGVmdCB0byBmbG9hdCBhdCB3aGF0ZXZlciBoZWlnaHQgb2JqZWN0LWZpdDpjb250YWluXG4gICAgIGhhcHBlbnMgdG8gbGFuZCBvbikgc28gaXRzIHZpc2libGUgdG9wIGVkZ2UgY2FuIG5ldmVyIGNsaW1iIGludG8gdGhlXG4gICAgIHRleHQgem9uZSBhYm92ZSBpdCDigJQgdGhpcyBob2xkcyByZWdhcmRsZXNzIG9mIHRoZSB2aWV3cG9ydCdzIGFzcGVjdFxuICAgICByYXRpbyAodGFsbCBwaG9uZSB2cy4gbmVhci1zcXVhcmUgdGFibGV0IHdpbmRvdyksIHVubGlrZSB0aGUgcHJldmlvdXNcbiAgICAgYXBwcm9hY2ggd2hpY2ggcmVsaWVkIG9uIGFzcGVjdC1yYXRpby1kZXBlbmRlbnQgdHJhbnNmb3JtIHBlcmNlbnRhZ2VzXG4gICAgIGFuZCBicm9rZSBvbiB3aWRlci9zaG9ydGVyIHdpbmRvd3MgKGUuZy4gMTAxMHg5ODApLiAqL1xuICAuZXhwYW5kZWQtYXZhdGFyLWltZyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogYXV0bztcbiAgICByaWdodDogYXV0bztcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDYwdmg7XG4gICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXIgYm90dG9tO1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wOCk7XG4gICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGJvdHRvbTtcbiAgfVxuXG4gIC5hdmF0YXItZXhwYW5kZWQtb3ZlcmxheS5pcy1vcGVuIC5leHBhbmRlZC1hdmF0YXItaW1nIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMTUpO1xuICB9XG5cbiAgLyogVGV4dCBvd25zIHRoZSBndWFyYW50ZWVkLWNsZWFyIGJhbmQgYWJvdmUgdGhlIHBob3RvJ3MgNjB2aCBjYXAg4oCUXG4gICAgIGNlbnRlcmVkIHdpdGhpbiBpdCB2aWEgZmxleCBpbnN0ZWFkIG9mIHRoZSBvbGQgcGVyY2VudGFnZS10cmFuc2Zvcm1cbiAgICAgZ3Vlc3N3b3JrLCBzbyBpdCBjYW4ndCBkcmlmdCBpbnRvIHRoZSBwaG90bydzIHRlcnJpdG9yeS4gKi9cbiAgLmV4cGFuZGVkLWF2YXRhci10ZXh0IHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDB2aDtcbiAgICBtYXgtd2lkdGg6IG5vbmU7XG4gICAgcGFkZGluZzogMCAyNHB4O1xuICAgIG1hcmdpbjogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB9XG5cbiAgLmV4cGFuZGVkLW5hbWUge1xuICAgIGZvbnQtc2l6ZTogNDhweDtcbiAgICBsaW5lLWhlaWdodDogNTJweDtcbiAgICBsZXR0ZXItc3BhY2luZzogMS45MnB4O1xuICB9XG5cbiAgLmV4cGFuZGVkLXJvbGUge1xuICAgIG1hcmdpbi1ib3R0b206IDI4cHg7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyNnB4O1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIH1cblxuICAuZXhwYW5kZWQtcXVvdGUge1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBmb250LXdlaWdodDogMzAwO1xuICAgIGxpbmUtaGVpZ2h0OiAyNnB4O1xuICAgIG1heC13aWR0aDogMjkwcHg7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gIH1cblxuICAuZXhwYW5kZWQtY2xvc2Uge1xuICAgIGluc2V0OiBhdXRvIGF1dG8gMjRweCA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgIHdpZHRoOiA0OHB4O1xuICAgIGhlaWdodDogNDhweDtcbiAgfVxuXG4gIC5leHBhbmRlZC1jbG9zZSBpIHtcbiAgICBmb250LXNpemU6IDQ4cHg7XG4gIH1cblxuICAuZXhwYW5kZWQtY2xvc2UgLmliLWljb24ge1xuICAgIHdpZHRoOiAzMnB4O1xuICAgIGhlaWdodDogMzJweDtcbiAgfVxufVxuXG4vKiBSZXNwb25zaXZlIFR5cG9ncmFwaHkgQWRqdXN0bWVudHMgKi9cbkBtZWRpYSAobWluLXdpZHRoOiA3NjlweCkgYW5kIChtYXgtd2lkdGg6IDEwMjRweCkge1xuICAuc3RvcnktdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogNjBweDtcbiAgICBsZXR0ZXItc3BhY2luZzogLTJweDtcbiAgfVxuXG4gIC5zdG9yeS1kZXNjIHtcbiAgICBmb250LXNpemU6IDE4cHg7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gIC5mb2xkLmFjdGl2ZSAuc3RvcnktdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMzJweDtcbiAgICBsaW5lLWhlaWdodDogNDNweDtcbiAgICBsZXR0ZXItc3BhY2luZzogLTFweDtcbiAgICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICB9XG5cbiAgLnN0b3J5LWRlc2Mge1xuXG4gICAgLyogU2V0IHRoZSB0b2tlbiwgbm90IG1hcmdpbi1ib3R0b20g4oCUIGV2ZXJ5IHBhcmFncmFwaCBzdGF0ZSByZWFkcyBpdCwgc29cbiAgICAgICB0aGUgbWVhc3VyaW5nIHBhc3MgaW4ganMvaG9tZS5qcyBwaWNrcyB1cCB0aGUgbW9iaWxlIGdhcCB0b28uICovXG4gICAgLS1zdG9yeS1kZXNjLWdhcDogMTVweDtcblxuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgfVxuXG4gIC5zdHJpa2UtbGluZSB7XG4gICAgaGVpZ2h0OiAzcHg7XG4gIH1cblxuICAuc3RvcnktZGVzYy13cmFwcGVyIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgOC4gU2Nyb2xsIEluZGljYXRvclxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4uaW5kaWNhdG9ycy13cmFwcGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDMycHg7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiB2YXIoLS1jb250YWluZXItd2lkdGgtcGFkZCk7IC8qIG1pcnJvcnMgLmN1c3RvbS1jb250YWluZXIgKi9cbiAgcGFkZGluZzogMCA0MHB4OyAvKiBtaXJyb3JzIC5jdXN0b20tY29udGFpbmVyICovXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHotaW5kZXg6IDEwO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4yNXMgZWFzZTtcbn1cblxuLyogSW5kaWNhdG9ycyBhcmUgb25seSBtZWFuaW5nZnVsIHdoaWxlIHRoZWlyIG93biBmb2xkIGlzIHRoZSBhY3RpdmUgb25lIOKAlFxuICAgb25jZSBTY3JvbGxUcmlnZ2VyIG1vdmVzIHBhc3QgaXQgKGZvbGQgbG9zZXMgLmFjdGl2ZSksIGhpZGUgdGhlbSBpbnN0YW50bHlcbiAgIGluc3RlYWQgb2YgbGV0dGluZyB0aGVtIHJpZGUgYWxvbmcgYXMgdGhlIGZvbGQgc2Nyb2xscyBvdXQgb2Ygdmlldy5cbiAgICFpbXBvcnRhbnQgaXMgcmVxdWlyZWQgYmVjYXVzZSBHU0FQIHNldHMgYW4gaW5saW5lIG9wYWNpdHkvdmlzaWJpbGl0eVxuICAgc3R5bGUgb24gLndoYXQtd2UtZG8taW5kaWNhdG9yIGZvciB0aGUgdGltZWQgcmV2ZWFsLiAqL1xuLmZvbGQ6bm90KC5hY3RpdmUpIC5pbmRpY2F0b3JzLXdyYXBwZXIge1xuICBvcGFjaXR5OiAwICFpbXBvcnRhbnQ7XG4gIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50O1xuICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4ud2hhdC13ZS1kby1pbmRpY2F0b3Ige1xuICBtYXJnaW4tbGVmdDogYXV0bzsgLyogcHVzaGVzIHRvIGNvbnRhaW5lciByaWdodCBlZGdlICovXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTBweDtcbiAgcGFkZGluZy1yaWdodDogNXB4O1xuICBvcGFjaXR5OiAwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLndoYXQtd2UtZG8taW5kaWNhdG9yIC5pYi1pY29uLFxuLndoYXQtd2Utc2hpcC1pbmRpY2F0b3IgLmliLWljb24ge1xuICBjb2xvcjogdmFyKC0tYWNjZW50LXJlZCk7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAuaW5kaWNhdG9ycy13cmFwcGVyIHtcbiAgICBwYWRkaW5nOiAwIDI0cHg7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gIC53aGF0LXdlLWRvLWluZGljYXRvciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4ud2hhdC13ZS1zaGlwLWluZGljYXRvciB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDEwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogaW5oZXJpdDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7XG4gIC53aGF0LXdlLXNoaXAtaW5kaWNhdG9yIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi8qIDR0aCBUYWIgTW9yZSBEb3RzICovXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAubW9yZS1kb3RzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA2cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBoZWlnaHQ6IDI1cHg7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5tb3JlLWRvdHMgLmRvdCB7XG4gIHdpZHRoOiA2cHg7XG4gIGhlaWdodDogNnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTY5Njk2O1xufVxuXG4vKiAud2hhdC13ZS1zaGlwLXBhcmVudCAubW9yZS1kb3RzIC5kb3Qge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hY2NlbnQtcmVkKTtcblxufSAqL1xuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10YWIuYWN0aXZlIC5kb3Qge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hY2NlbnQtcmVkKTtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnJlZC1hcnJvdyB7XG4gIGNvbG9yOiB2YXIoLS1hY2NlbnQtcmVkKTtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG5Aa2V5ZnJhbWVzIGZhZGUtaW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIH1cblxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIH1cbn1cblxuLnNjcm9sbC1pY29uIHtcbiAgYW5pbWF0aW9uOiBib3VuY2UtdXAtZG93biAycyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbn1cblxuQGtleWZyYW1lcyBib3VuY2UtdXAtZG93biB7XG4gIDAlLFxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gIH1cblxuICA1MCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMHB4KTtcbiAgfVxufVxuXG4uc2Nyb2xsLXRleHQge1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxOHB4O1xuICBjb2xvcjogIzk2OTY5NjtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICA5LiBTY3JvbGwgQW5pbWF0aW9ucyAmIFRyYW5zaXRpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogQW5pbWF0aW9ucyBUcmlnZ2VyZWQgV2hlbiBTZWN0aW9uIGlzIEFjdGl2ZSAqL1xuLmZvbGQuYWN0aXZlIC5zdG9yeS10aXRsZSB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgdHJhbnNpdGlvbi1kZWxheTogLjJzO1xufVxuXG4vKiBObyBgYW5pbWF0aW9uYCBoZXJlLCBkZWxpYmVyYXRlbHkg4oCUIHRoYXQgaXMgd2hhdCBtYWRlIHRoZSBhdmF0YXIgcm93IGJsaW5rXG4gICB0d28gb3IgdGhyZWUgdGltZXMgb24gbG9hZC5cblxuICAgLnN0b3J5LW1ldGEgaGFzIG5vIGhpZGRlbiBiYXNlIHN0YXRlLCBzbyB0aGUgZmFkZS1pbiBrZXlmcmFtZXMgd2VyZSB0aGUgb25seVxuICAgdGhpbmcgdGhhdCBldmVyIHRvb2sgaXQgdG8gb3BhY2l0eSAwLCBhbmQgYSBDU1MgYW5pbWF0aW9uIHJlc3RhcnRzIGZyb20gMCVcbiAgIGV2ZXJ5IHRpbWUgaXRzIGVsZW1lbnQgaXMgcmUtaW5zZXJ0ZWQgaW50byB0aGUgRE9NLiAjc3RvcnkgaXMgcmUtaW5zZXJ0ZWRcbiAgIHJlcGVhdGVkbHkgZHVyaW5nIHN0YXJ0dXA6IFNjcm9sbFRyaWdnZXIgd3JhcHMgdGhlIHNlY3Rpb24gaW4gYSAucGluLXNwYWNlclxuICAgd2hlbiB0aGUgcGluIGlzIGNyZWF0ZWQgKGpzL2hvbWUuanMsIGluaXRBbGxTY3JvbGxUcmlnZ2VycyBvblxuICAgZG9jdW1lbnQuZm9udHMucmVhZHkpLCBhbmQgc3dhcHMgaXQgaW4gYW5kIG91dCBvZiB0aGF0IHNwYWNlciBhZ2FpbiBvbiBlYWNoXG4gICByZWZyZXNoIGFzIHRoZSBsYXRlciBwaW5zIGFyZSBidWlsdC4gRXZlcnkgb25lIG9mIHRob3NlIHJlcGxheWVkIHRoZSAwLjJzXG4gICBmYWRlIOKAlCByZWFkIGFzIGEgZmxhc2gsIGJlY2F1c2UgdGhlIHJvdyB3YXMgYWxyZWFkeSBvbiBzY3JlZW4uXG5cbiAgIFNhbWUgY2xhc3Mgb2YgYnVnIGFzIHRoZSBzdHJpa2UtbGluZS9oaWdobGlnaHQgbm90ZSBiZWxvdzogYW55dGhpbmcgaW5zaWRlIGFcbiAgIHBpbm5lZCBzZWN0aW9uIHRoYXQgbXVzdCBhbmltYXRlIGV4YWN0bHkgb25jZSBiZWxvbmdzIG9uIGEgR1NBUCB0aW1lbGluZVxuICAgKHdoaWNoIHdyaXRlcyBpbmxpbmUgc3R5bGVzIGFuZCBpcyBpbmRpZmZlcmVudCB0byByZS1wYXJlbnRpbmcpLCBuZXZlciBvbiBhXG4gICBDU1MgYW5pbWF0aW9uLiBUaGUgdHdvIGRlY2xhcmF0aW9ucyBsZWZ0IGFyZSB0aGUgLmFjdGl2ZSBwYWlyIGtlcHQgZm9yXG4gICBzeW1tZXRyeSB3aXRoIC5zdG9yeS10aXRsZSBhYm92ZTsgYm90aCBhcmUgbm8tb3BzIGFnYWluc3QgdGhlIGJhc2Ugc3RhdGUuICovXG4uZm9sZC5hY3RpdmUgLnN0b3J5LW1ldGEge1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG59XG5cbi8qIE5PVEU6IHRoZSBzdHJpa2UtbGluZSBkcmF3ICsgXCJsaXZlc1wiIGhpZ2hsaWdodCByZXZlYWwgYXJlIG5vdyBkcml2ZW4gYnkgYVxuICAgR1NBUCB0aW1lbGluZSAoc3RvcnlUaXRsZVRsIGluIGpzL2FwcC5qcykgdGhhdCByZXBsYXlzIGVhY2ggdGltZSB0aGUgc3RvcnlcbiAgIGZvbGQgYmVjb21lcyBhY3RpdmUuIFRoaXMgZml4ZXMgdGhlIGxvYWQgY2FzZSB3aGVyZSAjc3RvcnkgYWxyZWFkeSBjYXJyaWVzXG4gICAuYWN0aXZlLCBzbyB0aGUgb2xkIENTUyB0cmFuc2l0aW9uIG5ldmVyIHJlcGxheWVkIG9uIGZpcnN0IHBhaW50LiAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDEwMjRweCkge1xuICAuc3RvcnktbWV0YSB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gIH1cblxuICAuc3RvcnktbWV0YTo6YmVmb3JlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTc5N2E0O1xuICAgIGxlZnQ6IDQ0cHg7XG4gICAgaGVpZ2h0OiAxcHg7XG4gIH1cblxuICAvKiBNYXRjaGVzIC5zdG9yeS1tZXRhJ3Mgb3duIHJlc2V0IGFib3ZlIOKAlCBzYW1lIHNoYXJlZC1lZGdlIHJlYXNvbmluZy4gKi9cbiAgLndoby13ZS1hcmUtdGl0bGUge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuXG4gIC8qIERlc2t0b3AncyAtMjRweCBwdWxscyB0aGUgbGluZSBvdXQgdG8gdGhlIGxlZnQgb2YgdGhlIHRleHQgYm94LCB3aGljaCBpc1xuICAgICBmaW5lIGFnYWluc3QgdGhlIGRlc2t0b3AgY29udGFpbmVyJ3Mgd2lkZSBzaWRlIHBhZGRpbmcgYnV0IHJ1bnMgdGhlIGxpbmVcbiAgICAgc3RyYWlnaHQgaW50byAoYW5kIHBhc3QpIHRoZSBuYXJyb3dlciBtb2JpbGUgY29udGFpbmVyIHBhZGRpbmcsIGNsaXBwaW5nXG4gICAgIGl0IG91dCBvZiB2aWV3LiBQaW5uaW5nIGl0IHRvIHRoZSBib3gncyBvd24gZWRnZSBsYW5kcyBpdCBvbiB0aGUgc2FtZVxuICAgICBzcG90IC53aG8td2UtYXJlLXRpdGxlJ3MgdGV4dCAoYW5kIHRoZSBhdmF0YXIgcGhvdG8gYWJvdmUpIGFscmVhZHkgc2l0XG4gICAgIGF0IG9uIG1vYmlsZSDigJQgc2VlIHRoZSBtYXJnaW4tbGVmdDogMCByZXNldCBhYm92ZSDigJQgc28gaXQgc3RheXMgdmlzaWJsZVxuICAgICBpbnN0ZWFkIG9mIGRpc2FwcGVhcmluZyBvZmYtY29udGFpbmVyLiAqL1xuICAud2hvLXdlLWFyZS10aXRsZTo6YmVmb3JlIHtcbiAgICBsZWZ0OiAwO1xuICB9XG5cbiAgLyogVGhlIGxpbmUgbGFuZGluZyBmbHVzaCBvbiB0aGUgdGV4dCdzIG93biBlZGdlIChsZWZ0OiAwIGFib3ZlKSBtZWFucyB0aGVcbiAgICAgdGV4dCBuZWVkcyBpdHMgb3duIGdhcCBub3csIHNpbmNlIGRlc2t0b3AgZ290IGl0cyBnYXAgZm9yIGZyZWUgZnJvbSB0aGVcbiAgICAgbGluZSBzaXR0aW5nIG9mZi1ib3ggYXQgLTI0cHggaW5zdGVhZC4gKi9cbiAgLndoby13ZS1hcmUtdGl0bGUge1xuICAgIHBhZGRpbmctbGVmdDogMTJweDtcbiAgfVxufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIDEwLiBFbnRlcnByaXNlIFBhcnRuZXIgRm9sZFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAucGFydG5lci1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG5cbi8qIHBhcnRuZXItY29udGVudCBhbmQgYmFkZ2UtcmliYm9uIHJldmVhbCBpcyBkcml2ZW4gYnkgR1NBUCBpbiBob21lLmpzICovXG5cbi5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5wYXJ0bmVyLWNvbnRlbnQge1xuICBtYXgtd2lkdGg6IDEwMDBweDtcbiAgbWFyZ2luOiAwO1xufVxuXG4ucGFydG5lci10YWdzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA0MHB4O1xuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7XG4gIGxldHRlci1zcGFjaW5nOiAuNXB4O1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAucGFydG5lci10aXRsZSB7XG4gIGZvbnQtc2l6ZTogY2xhbXAoNDNweCwgNC4xN3Z3LCA3MnB4KTtcbiAgZm9udC13ZWlnaHQ6IDI1MDtcbiAgbGluZS1oZWlnaHQ6IGNsYW1wKDUycHgsIDUuMDl2dywgODhweCk7XG4gIGxldHRlci1zcGFjaW5nOiAtMnB4O1xuICBtYXJnaW4tYm90dG9tOiA2NHB4O1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAucGFydG5lci10aXRsZSAuZ3JhZGllbnQtdGV4dCB7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgIzI4NGNiYSAwJSwgIzdiNDM5NyAzMCUsICNlYTFiM2QgMTAwJSk7XG4gIGJhY2tncm91bmQtY2xpcDogdGV4dDtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuICAtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAucGFydG5lci10aXRsZSAuZGFyay10ZXh0IHtcbiAgY29sb3I6IHZhcigtLWZvbnQtcHJpbWFyeSk7XG4gIGZvbnQtc2l6ZTogY2xhbXAoNjZweCwgNi40OHZ3LCAxMTJweCk7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGxpbmUtaGVpZ2h0OiBjbGFtcCg2OXB4LCA2LjcxdncsIDExNnB4KTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi10b3A6IDE2cHg7XG59XG5cbi5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5jaGFsbGVuZ2UtaW5wdXQtY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXgtd2lkdGg6IDgwMHB4O1xuICBtYXJnaW4tdG9wOiA0MHB4O1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuY2hhbGxlbmdlLWlucHV0IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtcHJpbWFyeSk7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LXByaW1hcnkpO1xuICBwYWRkaW5nOiAxNnB4IDQwcHggMTZweCAwO1xuICBvdXRsaW5lOiBub25lO1xuICBmb250LXdlaWdodDogMzAwO1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuY2hhbGxlbmdlLWlucHV0OjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7XG4gIG9wYWNpdHk6IC43O1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCB0ZXh0YXJlYS5jaGFsbGVuZ2UtaW5wdXQge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcmVzaXplOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBsaW5lLWhlaWdodDogMS40O1xuICBoZWlnaHQ6IGNhbGMoMS40ZW0gKyAzMnB4KTsgLyogb25lIHRleHQgbGluZSArIHZlcnRpY2FsIHBhZGRpbmcgKi9cbn1cblxuLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLmNoYWxsZW5nZS1zdWJtaXQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAwO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuY2hhbGxlbmdlLXN1Ym1pdDpob3ZlciB7XG4gIG9wYWNpdHk6IC44O1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuZ3JhZGllbnQtbGluZSB7XG4gIGhlaWdodDogNHB4O1xuICB3aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjMjg0Y2JhIDAlLCAjZWExYjNkIDEwMCUpO1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi8qIE91dGVyIG1hc2sg4oCUIHRoZSBPTkxZIHRoaW5nIHRoYXQgYW5pbWF0ZXMgZm9yIHRoZSBcInVucm9sbFwiIHJldmVhbC5cbiAgIGJhZGdlLXJpYmJvbiBpbnNpZGUgaXQgbmV2ZXIgdHJhbnNmb3JtcyBvciBjbGlwcyBkeW5hbWljYWxseSwgc28gaXRzXG4gICBwZXJtYW5lbnQgbm90Y2ggc2lsaG91ZXR0ZSArIGNvbnRlbnQgcmVuZGVyIGFzIE9ORSBzdGF0aWMgYmFubmVyOyB0aGUgd3JhcFxuICAganVzdCByZXZlYWxzIG1vcmUgb2YgdGhhdCBzdGF0aWMgYmFubmVyIHRvcC1kb3duIHZpYSBjbGlwLXBhdGguIFRoaXMgaXNcbiAgIGRlbGliZXJhdGVseSBhIHNpbmdsZSBjb21iaW5lZCBlZmZlY3QgKG9uZSBjbGlwLCBvbmUgdGhpbmcgbW92aW5nKSDigJRcbiAgIGFuIGVhcmxpZXIgdmVyc2lvbiBhbmltYXRlZCB0aGUgcmliYm9uJ3Mgb3duIHNjYWxlWSAqYW5kKiBhbiBpbm5lclxuICAgY29udGVudCBjbGlwLXBhdGggc2VwYXJhdGVseSwgd2hpY2ggdmlzaWJseSByZWFkIGFzIHR3byBvdmVybGFwcGluZ1xuICAgbGF5ZXJzIGluc3RlYWQgb2Ygb25lIHVucm9sbC4gKi9cbi5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5hd2FyZC1iYWRnZS13cmFwIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBtYXJnaW4tdG9wOiAtMjhweDsgLyogaGFuZ3MgaGlnaGVyIGZyb20gdG9wIOKAlCB3YXMgb24gLmJhZGdlLXJpYmJvbiAqL1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuYmFkZ2UtcmliYm9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMjgwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWViZDI7IC8qIHllbGxvd2lzaCBiYWNrZ3JvdW5kIG1hdGNoaW5nIHNjcmVlbnNob3QgKi9cbiAgYm9yZGVyLXRvcDogM3B4IHNvbGlkICNjOTliNDA7IC8qIEdvbGRlbiBsaW5lIGF0IHRoZSB2ZXJ5IHRvcCAqL1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiBjbGFtcCg0N3B4LCA0LjYzdncsIDgwcHgpIGNsYW1wKDE4cHgsIDEuNzR2dywgMzBweClcbiAgICBjbGFtcCg4MHB4LCA4LjF2dywgMTQwcHgpO1xuICB6LWluZGV4OiA1O1xuICBjbGlwLXBhdGg6IHBvbHlnb24oMCAwLCAxMDAlIDAsIDEwMCUgMTAwJSwgNTAlIGNhbGMoMTAwJSAtIDI1cHgpLCAwIDEwMCUpO1xufVxuXG4vKiBUcmFja3MgdGhlIGN1cnJlbnQgdW5yb2xsZWQgZWRnZSDigJQgZmFkZXMgaW4gYXMgaXQgbGVhdmVzIHRoZSBmaXhlZCB0b3BcbiAgIGF4bGUgKHRoZSBnb2xkIGJvcmRlci10b3ApLCBmYWRlcyBvdXQgYWdhaW4gb25jZSBmdWxseSByZXZlYWxlZC4gKi9cbi5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5yaWJib24tZWRnZS1zaGFkb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMjJweDtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiKDMyLCAyMCwgNCwgLjMpLCByZ2IoMzIsIDIwLCA0LCAwKSk7XG4gIG9wYWNpdHk6IDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiA2O1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAud293LW1vbWVudC1oZWFkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuZ29sZC1saW5lIHtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogMXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmY4MjA4O1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAud293LW1vbWVudC10ZXh0IHtcbiAgY29sb3I6ICNiZjgyMDg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IDJweDtcbn1cblxuLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLmF3YXJkLWJhZGdlLWljb24ge1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiBjbGFtcCgxMDdweCwgMTAuNDJ2dywgMTgwcHgpO1xuICBoZWlnaHQ6IGF1dG87XG4gIG9iamVjdC1maXQ6IGNvbnRhaW47XG4gIG1hcmdpbi1ib3R0b206IGNsYW1wKDE0cHgsIDEuMzl2dywgMjRweCk7XG59XG5cbi5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5hd2FyZC1iYWRnZS10ZXh0IHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuYXdhcmQtYmFkZ2UtdGV4dCBwIHtcbiAgY29sb3I6ICNhNDFmMzU7IC8qIGRhcmsgcmVkICovXG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLyogUmVzcG9uc2l2ZSAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDEwMjRweCkge1xuICAuZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAucGFydG5lci1jb250YWluZXIge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcGFkZGluZzogNDBweCAyMHB4O1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLmF3YXJkLWJhZGdlLXdyYXAge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbi10b3A6IDQwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLmJhZGdlLXJpYmJvbiB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWF4LXdpZHRoOiBub25lO1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICBjbGlwLXBhdGg6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIGJvcmRlci10b3A6IG5vbmU7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOlxuICAgICAgXCJoZWFkZXIgaGVhZGVyXCJcbiAgICAgIFwiaWNvbiB0ZXh0XCI7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA3MHB4IDFmcjtcbiAgICBnYXA6IDE2cHggNXB4O1xuICAgIHBhZGRpbmc6IDI0cHggMjBweDtcbiAgfVxuXG4gIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC53b3ctbW9tZW50LWhlYWRlciB7XG4gICAgZ3JpZC1hcmVhOiBoZWFkZXI7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxuXG4gIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5nb2xkLWxpbmUge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xuICAgIHdpZHRoOiA0MnB4O1xuICAgIGhlaWdodDogMnB4O1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLmF3YXJkLWJhZGdlLWljb24ge1xuICAgIGdyaWQtYXJlYTogaWNvbjtcbiAgICBtYXgtd2lkdGg6IDkwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG5cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OXB4KSBhbmQgKG1heC13aWR0aDogMTAyNHB4KSB7XG4gIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5wYXJ0bmVyLXRpdGxlIHtcbiAgICBmb250LXNpemU6IDQycHg7XG4gICAgbGluZS1oZWlnaHQ6IDUwcHg7XG4gICAgbGV0dGVyLXNwYWNpbmc6IDFweDtcbiAgfVxuXG4gIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5wYXJ0bmVyLXRpdGxlIC5kYXJrLXRleHQge1xuICAgIGZvbnQtc2l6ZTogODBweDtcbiAgICBsaW5lLWhlaWdodDogODRweDtcbiAgfVxuXG4gIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5iYWRnZS1yaWJib24ge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTc1cHggMWZyO1xuICAgIGdhcDogMTZweCA1cHg7XG4gIH1cblxuICAuZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuYXdhcmQtYmFkZ2UtdGV4dCBwIHtcbiAgICBmb250LXNpemU6IDMycHg7XG4gICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLmF3YXJkLWJhZGdlLXRleHQgcCBiciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcblxuICAvKiBQaG9uZSBvbmx5IOKAlCB0YWJsZXQgKDc2OS0xMDI0cHgpIGlzIGxlZnQgb24gdGhlIGJhc2UgLmZvbGQgYGhlaWdodDogMTAwdmhgLFxuICAgICB3aGljaCBmaXRzIHRoZXJlLiBPbiBhIHBob25lIHRoYXQgZml4ZWQgaGVpZ2h0ICsgLmZvbGQncyBgb3ZlcmZsb3c6IGhpZGRlbmBcbiAgICAgY2xpcHM6IHRoZSBjb2x1bW4gKHRhZ3MgKyB0d28tbGluZSB0aXRsZSArIGNoYWxsZW5nZSBmaWVsZCArIFdPVyBiYW5uZXIpXG4gICAgIGNhbiBydW4gdGFsbGVyIHRoYW4gdGhlIHZpc2libGUgdmlld3BvcnQsIGFuZCBvbiBpT1MgMTAwdmggaXMgdGhlIExBUkdFXG4gICAgIHZpZXdwb3J0IG9uIHRvcCBvZiB0aGF0LCBzbyB0aGUgYm90dG9tIG9mIHRoZSBiYW5uZXIgaXMgY3V0IG9mZi5cbiAgICAgRml4OiBkcm9wIHRoZSBmaXhlZCBoZWlnaHQgZm9yIGEgMTAwZHZoIGZsb29yIHNvIHRoZSBzZWN0aW9uIGNhbiBncm93IHRvXG4gICAgIGl0cyBjb250ZW50IGFuZCB0aGUgcGFnZSBqdXN0IHNjcm9sbHMg4oCUIG5vdGhpbmcgY2xpcHBlZC4gVGhlIGxheW91dCB0aGVcbiAgICAgZGVzaWduIHdhbnRzIGlzIGtlcHQ6IGNvcHkgcGlubmVkIHRvIHRoZSB0b3AsIGJhbm5lciB0byB0aGUgYm90dG9tLiBUaGF0IGlzXG4gICAgIGBzcGFjZS1iZXR3ZWVuYCAoaW5oZXJpdGVkIGZyb20gdGhlIGJhc2UgLnBhcnRuZXItY29udGFpbmVyIHJ1bGUpLCBhbmQgaXRcbiAgICAgbmVlZHMgYSBjb250YWluZXIgdGFsbGVyIHRoYW4gaXRzIGNvbnRlbnQgdG8gb3BlbiB0aGF0IGdhcCDigJQgc29cbiAgICAgLnBhcnRuZXItY29udGFpbmVyIGtlZXBzIGEgdmlld3BvcnQtdGFsbCBtaW4taGVpZ2h0ICh3YXMgaGVpZ2h0OiAxMDAlLFxuICAgICB3aGljaCBubyBsb25nZXIgcmVzb2x2ZXMgb25jZSB0aGUgc2VjdGlvbiBpcyBhdXRvLWhlaWdodCkgYnV0IHN3aXRjaGVzIHRvXG4gICAgIGhlaWdodDogYXV0byBzbyBpdCBjYW4gc3RpbGwgZ3JvdyBwYXN0IHRoYXQgd2hlbiB0aGUgY29udGVudCBpcyBsb25nLCB3aXRoXG4gICAgIHRoZSBiYW5uZXIgcmlkaW5nIHRoZSBib3R0b20gZWRnZSB0aGUgd2hvbGUgd2F5LiBFeHRyYSAuZm9sZHMtY29udGFpbmVyXG4gICAgIHNwZWNpZmljaXR5LCBubyAhaW1wb3J0YW50IOKAlCBzYW1lIHJlYXNvbmluZyBhcyAuc3RvcnktcGFyZW50LiAqL1xuICAuZm9sZHMtY29udGFpbmVyIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IHtcbiAgICBoZWlnaHQ6IGF1dG87XG4gICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgLyogc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlY2xhcmF0aW9uLWJsb2NrLW5vLWR1cGxpY2F0ZS1wcm9wZXJ0aWVzICovXG4gICAgbWluLWhlaWdodDogMTAwc3ZoO1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLnBhcnRuZXItY29udGFpbmVyIHtcbiAgICBoZWlnaHQ6IGF1dG87XG5cbiAgICAvKiA4NHB4ID0gLmZvbGQncyBwYWRkaW5nLXRvcCAoaGVhZGVyIGNsZWFyYW5jZSk7IHRoZSByZXN0IG9mIHRoZSBmb2xkJ3NcbiAgICAgICBoZWlnaHQgaXMgdGhpcyBjb250YWluZXIncyB0byBmaWxsLiAqL1xuICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSA4NHB4KTtcbiAgICAvKiBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVjbGFyYXRpb24tYmxvY2stbm8tZHVwbGljYXRlLXByb3BlcnRpZXMgKi9cbiAgICBtaW4taGVpZ2h0OiBjYWxjKDEwMHN2aCAtIDg0cHgpO1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLnBhcnRuZXItdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMzJweDtcbiAgICBsaW5lLWhlaWdodDogNDBweDtcbiAgICBsZXR0ZXItc3BhY2luZzogMXB4O1xuICAgIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gIH1cblxuICAuZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAucGFydG5lci10YWdzIHtcbiAgICBnYXA6IDE2cHg7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLmNoYWxsZW5nZS1pbnB1dCB7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIHBhZGRpbmc6IDEycHggNDBweCAxMnB4IDA7XG4gIH1cblxuICAuZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCB0ZXh0YXJlYS5jaGFsbGVuZ2UtaW5wdXQge1xuICAgIGhlaWdodDogY2FsYygxLjRlbSArIDI0cHgpO1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLnBhcnRuZXItdGl0bGUgLmRhcmstdGV4dCB7XG4gICAgZm9udC1zaXplOiA0MHB4O1xuICAgIGxpbmUtaGVpZ2h0OiA0NHB4O1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLmNoYWxsZW5nZS1pbnB1dC1jb250YWluZXIge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gIH1cblxuICAuZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuYXdhcmQtYmFkZ2Utd3JhcCB7XG4gICAgbWFyZ2luLXRvcDogMjBweDtcbiAgfVxuXG4gIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5iYWRnZS1yaWJib24ge1xuICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgZ2FwOiAxMnB4IDVweDtcbiAgfVxuXG4gIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5hd2FyZC1iYWRnZS10ZXh0IHtcbiAgICBncmlkLWFyZWE6IHRleHQ7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luLWxlZnQ6IC01cHg7XG4gIH1cblxuICAuZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCAuYXdhcmQtYmFkZ2UtdGV4dCBwIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG4gICAgbGluZS1oZWlnaHQ6IDEuMztcbiAgfVxuXG4gIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5hd2FyZC1iYWRnZS10ZXh0IHAgYnIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDQwMHB4KSB7XG4gIC5lbnRlcnByaXplLXBhcnRuZXItcGFyZW50IC5wYXJ0bmVyLXRhZ3Mge1xuICAgIGdhcDogMTZweDtcbiAgICBmb250LXNpemU6IDExcHg7XG4gIH1cbn1cblxuLyogU2hvcnQgdmlld3BvcnQsIHRhYmxldCArIGRlc2t0b3AgKD49NzY5cHgpIOKAlCBzYW1lIGNsaXAgdGhhdCB0aGUgPD03NjhweFxuICAgYmxvY2sgYWJvdmUgZml4ZXMgZm9yIHBob25lczogLmZvbGQncyBmaXhlZCBgaGVpZ2h0OiAxMDB2aGAgKyBgb3ZlcmZsb3c6XG4gICBoaWRkZW5gIGNob3BzIHRoZSB0b3Agb2YgdGhlIHBhcnRuZXIgY29sdW1uIC8gV09XIGJhbm5lciB3aGVuZXZlciB0aGVcbiAgIGNvbnRlbnQgaXMgdGFsbGVyIHRoYW4gYSBzdHViYnkgbGFwdG9wIG9yIHNwbGl0LXNjcmVlbiB3aW5kb3cuIEdhdGVkIG9uXG4gICBgbWF4LWhlaWdodGAgKG5vdCB3aWR0aCkgc28gYSBub3JtYWwtaGVpZ2h0IGRlc2t0b3AgaXMgbmV2ZXIgdG91Y2hlZCDigJQgdGhlXG4gICBjb21tb24gY2FzZSBrZWVwcyBieXRlLWZvci1ieXRlIGl0cyBjdXJyZW50IHBpbm5lZCBiZWhhdmlvdXIuXG4gICBXaGVuIGl0IGRvZXMgYXBwbHk6IGxldCB0aGUgc2VjdGlvbiBncm93IHRvIGl0cyBjb250ZW50IGFuZCB0aGUgcGFnZVxuICAgc2Nyb2xsLiA3NjktMTAyNHB4IGhhcyBubyBwaW4gKHN5bmNFcFBpbiBvbmx5IGJ1aWxkcyBpdCA+PTEwMjVweCksIHNvIHRoaXNcbiAgIGlzIHB1cmVseSBDU1MgdGhlcmUuIEF0ID49MTAyNXB4IEdTQVAncyBwaW4gbWVhc3VyZXMgdGhlIHRhbGxlciBoZWlnaHQgYW5kXG4gICBgcGluU3BhY2luZ2AgcmVzZXJ2ZXMgaXQ7IHRoZSByZXZlYWwgdGltZWxpbmUgZmlyZXMgb25jZSBvbiBlbnRyeSBvZmYgaXRzXG4gICBvd24gY2xvY2sgYW5kIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgcGluIGRpc3RhbmNlLCBzbyBub3RoaW5nIGRlc3luY3MuXG4gICBgbWluLWhlaWdodGAga2VlcHMgdGhlIGNvbnRhaW5lciB2aWV3cG9ydC10YWxsIHNvIGBzcGFjZS1iZXR3ZWVuYCBzdGlsbFxuICAgb3BlbnMgdGhlIGNvcHktdG9wIC8gYmFubmVyLWJvdHRvbSBnYXA7IGBoZWlnaHQ6IGF1dG9gIGxldHMgaXQgZ3JvdyBwYXN0XG4gICB0aGF0IGZvciBsb25nIGNvbnRlbnQuICovXG5AbWVkaWEgKG1pbi13aWR0aDogNzY5cHgpIGFuZCAobWF4LWhlaWdodDogOTAwcHgpIHtcbiAgLmZvbGRzLWNvbnRhaW5lciAuZW50ZXJwcml6ZS1wYXJ0bmVyLXBhcmVudCB7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIG1pbi1oZWlnaHQ6IDEwMHZoO1xuICB9XG5cbiAgLmVudGVycHJpemUtcGFydG5lci1wYXJlbnQgLnBhcnRuZXItY29udGFpbmVyIHtcbiAgICBoZWlnaHQ6IGF1dG87XG4gICAgbWluLWhlaWdodDogY2FsYygxMDB2aCAtIDg0cHgpO1xuICAgIHBhZGRpbmctdG9wOiA0MHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiA0MHB4O1xuICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgMTAuNS4gU2hpcCBGb2xkXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBoZWlnaHQ6IDEwMCU7XG5cbiAgLyogcGFkZGluZy10b3A6IDQwcHg7ICovXG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXRpdGxlIHtcbiAgY29sb3I6IHZhcigtLWFjY2VudC1yZWQpO1xuICBmb250LXNpemU6IDMycHg7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIG1hcmdpbi1ib3R0b206IDQwcHg7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWNhcm91c2VsLXdyYXBwZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IDEzMDBweDtcbiAgaGVpZ2h0OiBtaW4oNTQwcHgsIGNhbGMoMTAwc3ZoIC0gMjcwcHgpKTtcbiAgZmxleC1zaHJpbms6IDA7XG4gIG1hcmdpbi1ib3R0b206IDYwcHg7XG4gIHotaW5kZXg6IDEwMDtcbn1cblxuLyogSG9yaXpvbnRhbCBzd2lwZSAoanMvaG9tZS5qcywg4omkMTAyM3B4KSBpcyBvdXJzOyB2ZXJ0aWNhbCBwYW5uaW5nIHN0YXlzIHRoZVxuICAgYnJvd3NlcidzIOKAlCBpdCBpcyB3aGF0IGRyaXZlcyB0aGUgcGluLlxuICAgV2l0aG91dCB0aGlzIGRlY2xhcmF0aW9uIHRoZSBicm93c2VyIGhhcyB0byBhc3N1bWUgYSB0b3VjaCBNSUdIVCBwYW4gaW4gYW55XG4gICBkaXJlY3Rpb24sIHNvIGl0IHN0YXJ0cyBhIHNjcm9sbCBhcyBzb29uIGFzIHRoZSBmaW5nZXIgbW92ZXMgYW5kIGV2ZXJ5XG4gICB0b3VjaG1vdmUgYWZ0ZXIgdGhhdCBpcyBjYW5jZWxhYmxlOiBmYWxzZS4gVGhlIHN3aXBlIGhhbmRsZXIncyBwcmV2ZW50RGVmYXVsdCgpXG4gICB0aGVuIGFycml2ZXMgdG9vIGxhdGUgdG8gc3RvcCB0aGUgcGFnZSBtb3ZpbmcgYW5kIENocm9tZSBsb2dzXG4gICBcIltJbnRlcnZlbnRpb25dIElnbm9yZWQgYXR0ZW1wdCB0byBjYW5jZWwgYSB0b3VjaG1vdmUgZXZlbnQgd2l0aFxuICAgY2FuY2VsYWJsZT1mYWxzZVwiLiBEZWNsYXJpbmcgcGFuLXkgdXAgZnJvbnQgcmVtb3ZlcyB0aGUgYW1iaWd1aXR5OiBhXG4gICBob3Jpem9udGFsLWRvbWluYW50IGdlc3R1cmUgaXMgbmV2ZXIgY2xhaW1lZCBmb3Igc2Nyb2xsaW5nLCBzbyBpdCBzdGF5c1xuICAgY2FuY2VsYWJsZSBhbmQgdGhlIHN3aXBlIHdpbnMgY2xlYW5seS5cbiAgIHBpbmNoLXpvb20gaXMgbGlzdGVkIHNvIHRoZSBkZWNsYXJhdGlvbiBkb2VzIG5vdCBjb3N0IHRoZSB1c2VyIHpvb20gb24gdGhlXG4gICBjYXJkOyB0aGUgYmFyZSBwYW4teSBsaW5lIGFib3ZlIGlzIHRoZSBmYWxsYmFjayBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndFxuICAgcGFyc2UgdGhlIHR3by12YWx1ZSBmb3JtLiAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDEwMjRweCkge1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1jYXJvdXNlbC13cmFwcGVyIHtcbiAgICB0b3VjaC1hY3Rpb246IHBhbi15O1xuXG4gICAgLyogc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlY2xhcmF0aW9uLWJsb2NrLW5vLWR1cGxpY2F0ZS1wcm9wZXJ0aWVzICovXG4gICAgdG91Y2gtYWN0aW9uOiBwYW4teSBwaW5jaC16b29tO1xuICB9XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQ6ICMwMDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHotaW5kZXg6IDM7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG5cbiAgLyogT25lIGR1cmF0aW9uICsgb25lIGN1cnZlIGZvciBldmVyeSBhbmltYXRlZCBwcm9wZXJ0eSwgc28gYSBzdGVwIHJlYWRzXG4gICAgIGlkZW50aWNhbGx5IHdoaWNoZXZlciBkaXJlY3Rpb24gaXQgaXMgcGxheWVkIGluLiBUaGUgb2xkIHNwbGl0ICh0cmFuc2Zvcm1cbiAgICAgMS41cyAvIG9wYWNpdHkgMXMpIG1hZGUgYSBjYXJkIGZpbmlzaCBmYWRpbmcgNTAwbXMgYmVmb3JlIGl0IGZpbmlzaGVkXG4gICAgIG1vdmluZywgYW5kIGJveC1zaGFkb3cg4oCUIHVudHJhbnNpdGlvbmVkIOKAlCBzbmFwcGVkIG9uIHRoZSBmaXJzdCBmcmFtZS5cbiAgICAgVGhpcyBpcyB0aGUgc2hhcmVkIGJhc2VsaW5lLiBUd28gc3RhdGVzIG92ZXJyaWRlIGl0IHdpdGggYSBjdXJ2ZSBzdWl0ZWQgdG9cbiAgICAgd2hhdCB0aGF0IGRpcmVjdGlvbiBhY3R1YWxseSBzaG93cyBvbiBzY3JlZW4g4oCUIHRoZSBkZXBhcnRpbmcgY2FyZCdzIGV4aXRcbiAgICAgYW5kIHRoZSBhcnJpdmluZyBjYXJkJ3MgZW50cnksIGJvdGggZnVydGhlciBkb3duIGFuZCBib3RoIGRlc2t0b3Atc2NvcGVkLlxuICAgICBFdmVyeSBkdXJhdGlvbiBoZXJlIG11c3Qgc3RheSA8PSBTSElQX1NMSURFX1RSQU5TSVRJT05fTVMgaW4ganMvaG9tZS5qc1xuICAgICAoMTMwMCksIHdoaWNoIGlzIHRoZSBob2xkIGJldHdlZW4gc3RlcHM7IGFueXRoaW5nIGxvbmdlciBoYXMgaXRzIHRhaWwgY3V0XG4gICAgIG9mZiBieSB0aGUgbmV4dCBzdGVwIGR1cmluZyBhIGNvbnRpbnVvdXMgd2Fsay4gKi9cbiAgdHJhbnNpdGlvbjpcbiAgICB0cmFuc2Zvcm0gMS4ycyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSksXG4gICAgb3BhY2l0eSAxLjJzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKSxcbiAgICBib3gtc2hhZG93IDEuMnMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwMCUsIDApO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbn1cblxuLyogU3VwcHJlc3NlcyB0aGUgdHJhbnNpdGlvbiBhYm92ZSBmb3IgdGhlIGRlY2sncyB2ZXJ5IGZpcnN0IHBhaW50IGF0IHBhZ2VcbiAgIGxvYWQgKGpzL2hvbWUtc21vb3RoZWVyLTEuanMpIOKAlCBzZWUgdGhlIGNvbW1lbnQgYXQgdGhhdCBjYWxsIHNpdGUgZm9yIHdoeVxuICAgdGhlIHJldmVhbCBpdCB3b3VsZCBvdGhlcndpc2UgcGxheSBpcyBhIHJlYWwgYW5pbWF0aW9uIHJhY2luZyB0aGUgY2xvY2tcbiAgIGZyb20gcGFnZSBsb2FkLCBub3QgZnJvbSBhcnJpdmFsIGF0IHRoaXMgZm9sZC4gKi9cbi53aGF0LXdlLXNoaXAtcGFyZW50LmlzLWZpcnN0LXBhaW50IC5zaGlwLXNsaWRlIHtcbiAgdHJhbnNpdGlvbjogbm9uZTtcbn1cblxuLyogQXBwbGllZCBicmllZmx5IGJ5IGpzL2hvbWUtc21vb3RoZWVyLTEuanMgd2hlbiBhIGZhc3Qgd2hlZWwvdHJhY2twYWRcbiAgIGdlc3R1cmUgc25hcHMgdGhlIGRlY2sgc3RyYWlnaHQgdG8gdGhlIGVkZ2UgY2FyZCwgc2tpcHBpbmcgZXZlcnkgY2FyZCBpblxuICAgYmV0d2VlbiDigJQgdGhlIGZ1bGwgMS4ycyBhYm92ZSBpcyB0dW5lZCBmb3IgYSBzaW5nbGUtY2FyZCBzdGVwIGFuZCByZWFkcyBhc1xuICAgbGFnZ3kgZm9yIGEganVtcCB0aGF0IGNhbiBjcm9zcyBzZXZlcmFsIGNhcmRzJyB3b3J0aCBvZiB2aXN1YWwgZGlzdGFuY2UgaW5cbiAgIG9uZSBnby4gT3ZlcnJpZGluZyBvbmx5IHRyYW5zaXRpb24tZHVyYXRpb24gKG5vdCB0aGUgZnVsbCBzaG9ydGhhbmQpIGtlZXBzXG4gICB0aGUgc2hhcmVkIGN1cnZlL3Byb3BlcnR5IGxpc3QgYWJvdmUgdW50b3VjaGVkIOKAlCBzZWUgaXRzIGNvbW1lbnQgZm9yIHdoeVxuICAgdGhleSdyZSB1bmlmaWVkLiAqL1xuLndoYXQtd2Utc2hpcC1wYXJlbnQuaXMtZmFzdC10cmFuc2l0aW9uIC5zaGlwLXNsaWRlIHtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogLjNzO1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5kaXNjb3Zlci1zbGlkZSB7XG5cbiAgLyogYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgIDYxLjg3MDVkZWcsXG4gICAgIzQ2MmY4MiAwLjMxODEzJSxcbiAgICAjYjU0MThiIDU2LjMxJSxcbiAgICAjZjE2ZjU4IDkyLjQ1NCVcbiAgKTsgKi9cbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgIDk1LjY0ZGVnLFxuICAgICM0NjJmODIgNS44NiUsXG4gICAgI2I1NDE4YiA1MyUsXG4gICAgI2YxNmY1OCA5Ni42NSVcbiAgKTtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtZGlzY292ZXItY29udGVudCB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICNmZmY7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IDgwMHB4O1xuICBwYWRkaW5nOiA0MHB4O1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuZGlzY292ZXItdGl0bGUge1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG1hcmdpbi1ib3R0b206IDI0cHg7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5kaXNjb3Zlci10YWdzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBnYXA6IDEwcHg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiA0MHB4O1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuZGlzY292ZXItdGFnIHtcbiAgYmFja2dyb3VuZDogcmdiKDAsIDAsIDAsIC4yKTtcbiAgcGFkZGluZzogMTJweCAxNnB4O1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBmb250LXdlaWdodDogMzAwO1xuICBnYXA6IDEwcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuM3MgZWFzZSwgYmFja2Ryb3AtZmlsdGVyIC4zcyBlYXNlO1xufVxuXG4vKiBob3ZlcjogaG92ZXIgb25seSDigJQgb24gdG91Y2ggKGlQaG9uZS9TYWZhcmkpIDpob3ZlciBzdGlja3MgdG8gdGhlIGxhc3QtdGFwcGVkXG4gICBlbGVtZW50IHVudGlsIHRoZSBuZXh0IHRhcCBlbHNld2hlcmUsIHdoaWNoIGxlZnQgb25lIGRpc2NvdmVyLXRhZyBvbiB0aGUgZmluYWxcbiAgIHNoaXAgY2FyZCB3ZWFyaW5nIHRoZSBub3RjaGVkIGNsaXAtcGF0aCB3aGlsZSBpdHMgc2libGluZ3Mgc3RheWVkIHJlY3Rhbmd1bGFyLiAqL1xuQG1lZGlhIChob3ZlcjogaG92ZXIpIHtcbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLmRpc2NvdmVyLXRhZzpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogcmdiKDAsIDAsIDAsIC41KTtcbiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTJweCk7XG4gICAgY2xpcC1wYXRoOiBwb2x5Z29uKDlweCAwLCAxMDAlIDAsIDEwMCUgY2FsYygxMDAlIC0gOXB4KSwgY2FsYygxMDAlIC0gOXB4KSAxMDAlLCAwIDEwMCUsIDAgOXB4KTtcbiAgfVxufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuZGlzY292ZXItdGFnIGkge1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC52aWV3LWFsbC1zdG9yaWVzLFxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtdmlldy1zdG9yeSB7XG4gIGNvbG9yOiAjZmZmO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAyNnB4O1xuICBmb250LXdlaWdodDogNTAwO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAyNHB4O1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnZpZXctYWxsLXN0b3JpZXMgLmliLWljb24sXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC12aWV3LXN0b3J5IC5pYi1pY29uIHtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4zcyBjdWJpYy1iZXppZXIoLjM0LCAxLjU2LCAuNjQsIDEpO1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAudmlldy1hbGwtc3Rvcmllczpob3ZlciAuaWItaWNvbixcbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXZpZXctc3Rvcnk6aG92ZXIgLmliLWljb24ge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNHB4KTtcbn1cblxuLyogRXZlcnkgZGVjayBzdGF0ZSBiZWxvdyBpcyBrZXllZCBvZmYgZGF0YS1wb3Mg4oCUIGVhY2ggY2FyZCdzIGluZGV4IE1JTlVTIHRoZVxuICAgYWN0aXZlIGNhcmQncyBpbmRleCwgd3JpdHRlbiBieSByZW5kZXJTaGlwU3RhY2soKSBpbiBqcy9ob21lLmpzIGFuZCBjbGFtcGVkXG4gICB0byB0aGUgcmFuZ2UgdGhlIHN0eWxlc2hlZXQga25vd3MgYWJvdXQ6XG5cbiAgICAgLTIgICBhbHJlYWR5IGdvbmUgICAgICAtMSAgIHRoZSBjYXJkIGp1c3QgbGVmdFxuICAgICAgMCAgIGFjdGl2ZSAgICAgICAgICAgICAxICAgZmlyc3QgY2FyZCBwZWVraW5nIG91dCBiZWxvdyBpdFxuICAgICAgMiAgIHNlY29uZCBjYXJkIHBlZWtpbmcgb3V0XG4gICAgICAzICAgZXZlcnl0aGluZyBmdXJ0aGVyIGJhY2ssIHBhcmtlZCBvbiB0aGUgbGFzdCB2aXNpYmxlIHN0YWNrIHNsb3RcblxuICAgVGhhdCBpcyB3aGF0IG1ha2VzIHRoZSBkZWNrIGxlbmd0aCBhIHByb3BlcnR5IG9mIHRoZSBtYXJrdXA6IHNpeCBydWxlcyBjb3ZlclxuICAgZm91ciBjYXJkcyBhbmQgZm9ydHkgYWxpa2UsIGFuZCBhZGRpbmcgYSAuc2hpcC1zbGlkZSBuZWVkcyBubyBDU1MgYXQgYWxsLiAqL1xuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGVbZGF0YS1wb3M9XCIwXCJdIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gIHotaW5kZXg6IDQ7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlW2RhdGEtcG9zPVwiLTFcIl0sXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZVtkYXRhLXBvcz1cIi0yXCJdIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTAwdmgsIDApO1xuICBib3gtc2hhZG93OiBub25lO1xuXG4gIC8qIEFib3ZlIHRoZSBjYXJkIHRoYXQganVzdCB0b29rIGl0cyBwbGFjZSAoYWN0aXZlIGlzIHotaW5kZXggNCkuXG4gICAgIFRoaXMgaXMgd2hhdCBtYWtlcyBhIGRvd253YXJkIHN0ZXAgcmVhZCBhcyBzbW9vdGhseSBhcyBhbiB1cHdhcmQgb25lLlxuICAgICBBIGRlcGFydGluZyBjYXJkIGNhcnJpZXMgdGhlIHdob2xlIDEwMHZoIG9mIHRoZSBtb3Rpb24sIGJ1dCB3aXRob3V0IGFcbiAgICAgei1pbmRleCBvZiBpdHMgb3duIGl0IGZlbGwgYmFjayB0byAuc2hpcC1zbGlkZSdzIGJhc2Ugei1pbmRleDogMyDigJQgaS5lLlxuICAgICBCRUhJTkQgdGhlIG5ld2x5LWFjdGl2ZSBjYXJkLCB3aGljaCBpcyBvcGFxdWUgYW5kIHZlcnkgbmVhcmx5IHRoZSBzYW1lXG4gICAgIHNpemUgKHN0YWNrIHBvcyAxIHJlc3RzIGF0IHNjYWxlKDAuOTY3KSB0cmFuc2xhdGUzZCgwLDI2cHgsMCkpLiBTbyB0aGVcbiAgICAgb25seSBtb3ZpbmcgZWxlbWVudCB3YXMgb2NjbHVkZWQgZm9yIHRoZSBmaXJzdCBzdHJldGNoIG9mIGl0cyB0cmF2ZWwgYW5kXG4gICAgIGFwcGVhcmVkIHRvIHBvcCBvdXQgZnJvbSBiZWhpbmQgdGhlIGRlY2sgcmF0aGVyIHRoYW4gZmx5IG9mZiBpdC5cbiAgICAgR29pbmcgdGhlIG90aGVyIHdheSB0aGUgbW92aW5nIGNhcmQgSVMgdGhlIGFjdGl2ZSBvbmUsIHNvIGl0IHdhcyBhbHdheXNcbiAgICAgb24gdG9wIGFuZCBhbHdheXMgZnVsbHkgdmlzaWJsZSDigJQgd2hpY2ggaXMgdGhlIHdob2xlIG9mIHdoeSB1cCBmZWx0XG4gICAgIHNtb290aCBhbmQgZG93biBkaWQgbm90LiBFeGl0aW5nIG92ZXIgdGhlIGRlY2sgbWlycm9ycyB0aGF0LiAqL1xuICB6LWluZGV4OiA1O1xuXG59XG5cbi8qIEV4aXQgY3VydmUgZm9yIHRoZSBkZXBhcnRpbmcgY2FyZCDigJQgZGVza3RvcCBkZWNrIG9ubHkuXG4gICBTY29wZWQgdG8g4omlMTAyNHB4IGJlY2F1c2UgYmVsb3cgdGhhdCB0aGUgY2Fyb3VzZWwgaXMgYSBob3Jpem9udGFsIHN3aXBlXG4gICBkZWNrOiB0aGUgc2FtZSBcInBhc3RcIiBzZWxlY3RvcnMgYWJvdmUgYXJlIHJlLXBvaW50ZWQgdG8gdHJhbnNsYXRlWCBhbmRcbiAgIHRoZWlyIGZlZWwgaXMgZHJpdmVuIGJ5IHRoZSBnZXN0dXJlLCBzbyB0aGV5IGtlZXAgdGhlIHNoYXJlZCBjdXJ2ZS5cblxuICAgQSB0cmFuc2l0aW9uIGlzIHJlYWQgZnJvbSB0aGUgc3RhdGUgYmVpbmcgYW5pbWF0ZWQgVE8sIHNvIHRoaXMgZ292ZXJucyBvbmx5XG4gICB0aGUgZG93bndhcmQgc3RlcCAoYWN0aXZlIOKGkiBwYXN0KS4gR29pbmcgYmFjayB1cCB0aGUgY2FyZCBhbmltYXRlcyBpbnRvIHRoZVxuICAgQUNUSVZFIHN0YXRlIGFuZCBrZWVwcyB0aGUgc2hhcmVkIGN1cnZlIOKAlCB0aGF0IGRpcmVjdGlvbiBhbHJlYWR5IHJlYWRzIHdlbGxcbiAgIGFuZCBpcyBkZWxpYmVyYXRlbHkgbGVmdCBhbG9uZS5cblxuICAgV2h5IGl0IG5lZWRzIGl0cyBvd24gY3VydmU6IHRoZSBjYXJkIHRyYXZlbHMgMTAwdmggKH45MDBweCkgYnV0IHRoZSBmcmFtZSBpdFxuICAgbGVhdmVzIGlzIG9ubHkgNTQwcHgsIHNvIGl0IGlzIG91dCBvZiBzaWdodCBhZnRlciA2MCUgb2YgdGhlIGRpc3RhbmNlLiBUaGVcbiAgIHNoYXJlZCBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKSBpcyBhbiBleHBvLW91dCDigJQgaXQgY292ZXJzIDQ0NXB4IGluIHRoZVxuICAgZmlyc3QgMTIwbXMgYW5kIGNsZWFycyB0aGUgZnJhbWUgaW4gfjE1OW1zLCBzcGVuZGluZyB0aGUgcmVtYWluaW5nIH44NyUgb2ZcbiAgIHRoZSAxLjJzIHRyYXZlbGxpbmcgd2hlcmUgbm9ib2R5IGNhbiBzZWUgaXQuIFRoZSBkdXJhdGlvbiB3YXMgbmV2ZXIgdGhlXG4gICBwcm9ibGVtOyBhbG1vc3Qgbm9uZSBvZiBpdCB3YXMgb24gc2NyZWVuLCB3aGljaCBpcyB3aHkgdGhlIHN0ZXAgcmVhZCBhcyBhXG4gICBzbmFwIGhvd2V2ZXIgbG9uZyBpdCB3YXMgbWFkZS5cblxuICAgY3ViaWMtYmV6aWVyKDAuMzcsIDAsIDAuNjMsIDEpIGlzIGVhc2VJbk91dFNpbmUg4oCUIHN5bW1ldHJpYywgbm8gZnJvbnRcbiAgIGxvYWRpbmcuIEl0IGNsZWFycyB0aGUgZnJhbWUgYXQgNTYlIG9mIHdoYXRldmVyIGR1cmF0aW9uIGl0IGlzIGdpdmVuLCBzb1xuICAgdGhlIHRpbWUgYWN0dWFsbHkgc3BlbnQgb24gc2NyZWVuIHNjYWxlcyB3aXRoIHRoZSBudW1iZXIgYmVsb3cgaW5zdGVhZCBvZlxuICAgYmVpbmcgc3dhbGxvd2VkIGJ5IHRoZSBvZmYtc2NyZWVuIHRhaWwuXG5cbiAgIEFsbCB0aHJlZSBwcm9wZXJ0aWVzIGFyZSByZS1kZWNsYXJlZCBiZWNhdXNlIGB0cmFuc2l0aW9uYCBpcyBhIHNob3J0aGFuZDpcbiAgIG5hbWluZyBvbmx5IHRyYW5zZm9ybSBoZXJlIHdvdWxkIGRyb3AgdGhlIG90aGVyIHR3byBhbmQgbGV0IGJveC1zaGFkb3cgc25hcFxuICAgb24gdGhlIGZpcnN0IGZyYW1lLCB3aGljaCBpcyB0aGUgYnVnIHRoZSBzaGFyZWQgcnVsZSBjYWxscyBvdXQuXG5cbiAgIDFzLCB0cmltbWVkIGZyb20gdGhlIDEuMnMgdGhpcyBzdGFydGVkIGF0OiB0aGF0IGlzIH41NjNtcyBvZiB2aXNpYmxlIGV4aXRcbiAgIChhZ2FpbnN0IH4xNTltcyBiZWZvcmUgYW55IG9mIHRoaXMpIHdpdGggYSB+MzFweCBsaWZ0LW9mZiBpbiB0aGUgZmlyc3RcbiAgIDEyMG1zLiBTaG9ydGVyIHRoYW4gdGhlIHNoYXJlZCAxLjJzIG9uIC5zaGlwLXNsaWRlIG9uIHB1cnBvc2Ug4oCUIHRoZSBleGl0XG4gICBjYXJyaWVzIGVzc2VudGlhbGx5IGFsbCBvZiBhIGRvd253YXJkIHN0ZXAncyBtb3Rpb24sIHdoaWxlIHRoZSBhcnJpdmluZ1xuICAgY2FyZCBvbmx5IG1vdmVzIDI2cHgsIHNvIHRoZSB0d28gZG8gbm90IG5lZWQgdG8gZmluaXNoIHRvZ2V0aGVyIGFuZCB0aGVcbiAgIGV4aXQgcmVhZHMgYmV0dGVyIHNsaWdodGx5IHRpZ2h0ZXIuXG5cbiAgIFNISVBfU0xJREVfVFJBTlNJVElPTl9NUyBpbiBqcy9ob21lLmpzICgxMzAwKSBpcyB0aGUgY2VpbGluZywgbm90IGEgdGFyZ2V0OlxuICAgaXQgcGFjZXMgc3RlcHMsIGFuZCBhbiBleGl0IGxvbmdlciB0aGFuIHRoYXQgZHdlbGwgd291bGQgbGV0IGEgc2Vjb25kIGNhcmRcbiAgIHN0YXJ0IGxlYXZpbmcgd2hpbGUgdGhpcyBvbmUgaXMgc3RpbGwgb24gaXRzIHdheSBvdXQuIEFueXRoaW5nIGF0IG9yIGJlbG93XG4gICBpdCBpcyBzYWZlIHRvIHNldCBoZXJlIGFsb25lOyBnb2luZyBhYm92ZSBpdCBtZWFucyByYWlzaW5nIHRoZSBKUyBjb25zdGFudFxuICAgdG9vLiAqL1xuQG1lZGlhIChtaW4td2lkdGg6IDEwMjVweCkge1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZVtkYXRhLXBvcz1cIi0xXCJdLFxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZVtkYXRhLXBvcz1cIi0yXCJdIHtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgdHJhbnNmb3JtIDFzIGN1YmljLWJlemllciguMzcsIDAsIC42MywgMSksXG4gICAgICBvcGFjaXR5IDFzIGN1YmljLWJlemllciguMzcsIDAsIC42MywgMSksXG4gICAgICBib3gtc2hhZG93IDFzIGN1YmljLWJlemllciguMzcsIDAsIC42MywgMSk7XG4gIH1cbn1cblxuLyogRW50cnkgY3VydmUgZm9yIHRoZSBhcnJpdmluZyBjYXJkIOKAlCBkZXNrdG9wIGRlY2sgb25seSwgYW5kIHRoZSBtaXJyb3Igb2YgdGhlXG4gICBleGl0IGJsb2NrIGFib3ZlLiBUaGlzIGdvdmVybnMgZXZlcnl0aGluZyBhbmltYXRpbmcgSU5UTyB0aGUgYWN0aXZlIHN0YXRlOlxuICAgdGhlIHVwd2FyZCBzdGVwJ3MgMTAwdmggZHJvcCBmcm9tIC0xMDB2aCwgYW5kIHRoZSBkb3dud2FyZCBzdGVwJ3MgMjZweFxuICAgc2V0dGxlIGFzIHRoZSBuZXh0IGNhcmQgaXMgcHJvbW90ZWQgb3V0IG9mIHRoZSBkZWNrLlxuXG4gICBOT1QgZ2l2ZW4gdGhlIGV4aXQncyBlYXNlSW5PdXRTaW5lLCBkZWxpYmVyYXRlbHkuIEFuIGVudHJ5IGhhcyB0aGUgb3Bwb3NpdGVcbiAgIGdlb21ldHJ5IHRvIGFuIGV4aXQ6IHRoZSBjYXJkIHN0YXJ0cyAxMDB2aCBhYm92ZSBhbmQgaXMgb2ZmIHNjcmVlbiBmb3IgdGhlXG4gICBmaXJzdCA0MCUgb2YgaXRzIHRyYXZlbCwgc28gYSBzeW1tZXRyaWMgY3VydmUgaG9sZHMgaXQgb3V0IG9mIGZyYW1lIGZvclxuICAgfjU2OG1zIGFuZCB0aGUgc3RlcCByZWFkcyBhcyBsYWcgcmF0aGVyIHRoYW4gc21vb3RobmVzcy4gQW4gYXJyaXZpbmcgY2FyZFxuICAgaGFzIHRvIGFwcGVhciBwcm9tcHRseSBhbmQgdGhlbiBzZXR0bGUuXG5cbiAgIE1lYXN1cmVkIG92ZXIgdGhlIDkwMHB4IGRyb3AgYXQgdGhpcyBkdXJhdGlvbjpcbiAgICAgZXhwby1vdXQgKDAuMTYsIDEsIDAuMywgMSkgICBhcHBlYXJzICA5OW1zLCBidXQgbHVuZ2VzIDQxOXB4IGluIDEyMG1zXG4gICAgIGVhc2VPdXRDdWJpYyAoMC4zMywgMSwgLjY4KSAgYXBwZWFycyAyMDNtcywgbHVuZ2VzIDIyOHB4IGluIDEyMG1zXG4gICAgIGVhc2VJbk91dFNpbmUgKGV4aXQgY3VydmUpICAgYXBwZWFycyA1NjhtcyAgPC0gdGhlIGxhZyBjYXNlXG5cbiAgIGVhc2VPdXRDdWJpYyBrZWVwcyB0aGUgcHJvbXB0IGFycml2YWwgdGhhdCBtYWRlIHRoaXMgZGlyZWN0aW9uIHJlYWQgd2VsbFxuICAgYWxyZWFkeSwgd2hpbGUgaGFsdmluZyB0aGUgb3BlbmluZyBsdW5nZSB0aGF0IG1hZGUgaXQgZmVlbCB0aHJvd24gcmF0aGVyXG4gICB0aGFuIHBsYWNlZC4gMS4zcywgdXAgZnJvbSB0aGUgc2hhcmVkIDEuMnMsIHNwcmVhZHMgdGhlIHNldHRsZSBmdXJ0aGVyLlxuXG4gICBBbGwgdGhyZWUgcHJvcGVydGllcyByZS1kZWNsYXJlZCDigJQgYHRyYW5zaXRpb25gIGlzIGEgc2hvcnRoYW5kLCBhbmQgbmFtaW5nXG4gICBvbmx5IHRyYW5zZm9ybSB3b3VsZCBkcm9wIHRoZSBvdGhlcnMgYW5kIGxldCBib3gtc2hhZG93IHNuYXAuICovXG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNXB4KSB7XG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlW2RhdGEtcG9zPVwiMFwiXSB7XG4gICAgdHJhbnNpdGlvbjpcbiAgICAgIHRyYW5zZm9ybSAxLjNzIGN1YmljLWJlemllciguMzMsIDEsIC42OCwgMSksXG4gICAgICBvcGFjaXR5IDEuM3MgY3ViaWMtYmV6aWVyKC4zMywgMSwgLjY4LCAxKSxcbiAgICAgIGJveC1zaGFkb3cgMS4zcyBjdWJpYy1iZXppZXIoLjMzLCAxLCAuNjgsIDEpO1xuICB9XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXZpZGVvLWJnIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG9iamVjdC1maXQ6IGNvdmVyO1xuICB6LWluZGV4OiAtMTtcbiAgb3BhY2l0eTogLjg7XG5cbiAgLyogQmFja2dyb3VuZCBkZWNvcmF0aW9uIG9ubHkg4oCUIG5ldmVyIGEgdGFwIHRhcmdldC4gV2l0aG91dCB0aGlzLCBpT1MgU2FmYXJpXG4gICAgIHJvdXRlcyB0aGUgZmlyc3QgdGFwIG9uIGEgY2FyZCB0byB0aGUgdmlkZW8ncyBuYXRpdmUgcGxheS9wYXVzZSBpbnN0ZWFkIG9mXG4gICAgIHRoZSBjYXJkJ3MgZXhwYW5kIGhhbmRsZXIgKFwiaGFyZCB0byBjbGljayAvIGZpcnN0IHRhcCBwbGF5cyAvIHNlY29uZCB0YXBcbiAgICAgZmxpY2tlcnNcIikuICovXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKTtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtdmlkZW8tYmcge1xuICB0cmFuc2Zvcm06IHNjYWxlKDIuOCk7XG4gIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGJvdHRvbTtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUtY29udGVudCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMjtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtZXhwYW5kZWQtb3ZlcmxheSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAtMTA1Ljg5ZGVnLFxuICAgICM0NjJmODIgLS4zMiUsXG4gICAgI2I1NDE4YiA1Ni4zMSUsXG4gICAgI2YxNmY1OCA5Mi40NSVcbiAgKTtcblxuICBiYWNrZ3JvdW5kLWJsZW5kLW1vZGU6IHNjcmVlbiwgbm9ybWFsO1xuICBvcGFjaXR5OiAxO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgei1pbmRleDogMDtcblxuICAvKiBTbGlnaHQgZGVsYXkgc28gdGhlIHBhbmVsIHNsaWRlcyBpbiBmaXJzdCAqL1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC42cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSkgLjM1cztcbn1cblxuLyogRGVza3RvcDogcmVzdCB0aGUgb3ZlcmxheSBhdCAuODUgc28gdGhlIHZpZGVvIHJlYWRzIHRocm91Z2ggdGhlIHRpbnQuXG4gICBNb2JpbGUga2VlcHMgdGhlIGZ1bGwgb3BhY2l0eSAxLiAqL1xuQG1lZGlhIChtaW4td2lkdGg6IDEwMjVweCkge1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1leHBhbmRlZC1vdmVybGF5IHtcbiAgICBvcGFjaXR5OiAuODU7XG4gIH1cbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQge1xuICB6LWluZGV4OiAxMDA7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWNvbnRlbnQtbGVmdCB7XG4gIHBhZGRpbmc6IDQwcHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHRyYW5zaXRpb246XG4gICAgd2lkdGggLjhzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKSxcbiAgICBwYWRkaW5nIC44cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtY29udGVudC1sZWZ0IHtcblxuICAvKiB3aWR0aDogMzAlOyAqL1xuICB3aWR0aDogMjg2cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDQwcHg7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWNvbnRlbnQtZXhwYW5kZWQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAyODVweCk7XG4gIGhlaWdodDogMTAwJTtcblxuICAvKiB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApOyAqL1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKGNhbGMoMTAwJSAtIDE5cHgpLCAwLCAwKTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC42cyBlYXNlLWluLW91dDtcbiAgcGFkZGluZzogNDBweCAzMHB4IDQwcHggNjBweDtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtY29udGVudC1leHBhbmRlZCB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWNvbC1taWRkbGUsXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1jb2wtcmlnaHQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogNTAlO1xuICBwYWRkaW5nLXJpZ2h0OiAzMHB4O1xuICBjb2xvcjogI2ZmZjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1jb2wtcmlnaHQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWRldGFpbC1zZWN0aW9uIHtcbiAgbWFyZ2luLWJvdHRvbTogMTZweDtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtZGV0YWlsLXNlY3Rpb24gaDQge1xuICBmb250LXNpemU6IDI0cHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWRldGFpbC1zZWN0aW9uIHAge1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG4gIG9wYWNpdHk6IC45O1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1hcnJvdy1idG4ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMDtcbiAgcmlnaHQ6IDA7XG4gIGZvbnQtc2l6ZTogMzJweDtcbiAgY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLyogVGV4dCBiYWRnZSB2YXJpYW50IOKAlCBnbGFzcyBjaGlwIHdpdGggbm90Y2hlZCBjb3JuZXJzIGluc3RlYWQgb2YgYSBsb2dvIGltYWdlICovXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1jbGllbnQtbG9nbyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gIHdpZHRoOiBhdXRvO1xuICBoZWlnaHQ6IDQwcHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiAjZmZmZmZmZjI7XG4gIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMnB4KTtcbiAgY2xpcC1wYXRoOiBwb2x5Z29uKFxuICAgIDhweCAwLFxuICAgIDEwMCUgMCxcbiAgICAxMDAlIGNhbGMoMTAwJSAtIDhweCksXG4gICAgY2FsYygxMDAlIC0gOHB4KSAxMDAlLFxuICAgIDAgMTAwJSxcbiAgICAwIDhweFxuICApO1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1oZWFkaW5nKTtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTtcbiAgbGV0dGVyLXNwYWNpbmc6IC0uMDJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBjb2xvcjogIzM3Mzc0MjtcbiAgcGFkZGluZzogOHB4IDE2cHg7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmV4cGFuZGVkIC5zaGlwLWNsaWVudC1sb2dvIHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1tYWluLXRleHQge1xuICBtYXJnaW4tdG9wOiBhdXRvO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4xOHMgZWFzZTtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtbWFpbi10ZXh0LnNoaXAtZmFkZS1vdXQsXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10YWdzLnNoaXAtZmFkZS1vdXQge1xuICBvcGFjaXR5OiAwO1xufVxuXG4uc2hpcC1jbG9zZS1tb2JpbGUge1xuICBkaXNwbGF5OiBub25lO1xuICBjb2xvcjogI2U2ZTZlZDtcbn1cblxuLyogRGVza3RvcCBjbG9zZSBidXR0b24g4oCUIHRvcC1yaWdodCBvZiB0aGUgc2xpZGUsIHNob3duIG9ubHkgd2hpbGUgZXhwYW5kZWQuXG4gICAuc2hpcC1hcnJvdy1idG4gaXMgbm8gbG9uZ2VyIGEgY2xvc2UgdHJpZ2dlciAoaXQncyB0aGUgXCJWaWV3IFRydWUgU3RvcnlcIlxuICAgbmF2IGxpbmsgbm93KSwgc28gZGVza3RvcCBuZWVkcyBpdHMgb3duIGV4cGxpY2l0IGNsb3NlIGFmZm9yZGFuY2UuICovXG4uc2hpcC1jbG9zZS1kZXNrdG9wIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgY29sb3I6ICNlNmU2ZWQ7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI1cHgpIHtcbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtY2xvc2UtZGVza3RvcCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDI0cHg7XG4gICAgcmlnaHQ6IDI0cHg7XG4gICAgd2lkdGg6IDM2cHg7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIGdhcDogOHB4O1xuICAgIHBhZGRpbmc6IDEycHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogMCAwIDJweCAwICMyZjJmMzkzMztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgei1pbmRleDogNTtcbiAgfVxufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1tYWluLXRleHQgaDMge1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1zaXplOiAzNnB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBsaW5lLWhlaWdodDogMS4yO1xuICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICBtYXgtd2lkdGg6IDg4NnB4O1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4xOHMgZWFzZTtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtbWFpbi10ZXh0IGgzIHtcbiAgZm9udC1zaXplOiAyMHB4O1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC1tYWluLXRleHQgaDMgYnIge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10YWdzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAxNnB4O1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4xOHMgZWFzZTtcbn1cblxuLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtdGFncyB7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICBnYXA6IDEwcHg7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXRhZyB7XG4gIGJhY2tncm91bmQ6IHJnYigyNTUsIDI1NSwgMjU1LCAuMik7XG4gIGNvbG9yOiAjZmZmO1xuICBwYWRkaW5nOiAycHggOHB4O1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgU0hJUCBTTElERSDigJQgRVhQQU5EIENIT1JFT0dSQVBIWSAoZGVza3RvcCBvbmx5LCA+PSAxMDI0cHgpXG5cbiAgIFRpbWVkIGFnYWluc3QgdGhlIGNsaWNrIGhhbmRsZXIgaW4ganMvaG9tZS5qcyAoc2VjdGlvbiA4KTpcbiAgICAgdD0wbXMgICAgLnNoaXAtZmFkZS1vdXQgYWRkZWQgICDihpIgdGl0bGUgKyB0YWdzIGZhZGUgb3V0ICgwLjE4cylcbiAgICAgdD0xODBtcyAgLmV4cGFuZGVkIHRvZ2dsZWQgICAgICDihpIgbGF5b3V0IHNuYXBzIHdoaWxlIHRleHQgaXMgaW52aXNpYmxlXG4gICAgIHQ9MzgwbXMgIC5zaGlwLWZhZGUtb3V0IHJlbW92ZWQg4oaSIHRpdGxlICsgdGFncyBmYWRlIGJhY2sgaW5cblxuICAgVGhlIGxvZ28gaXMgdGhlIG9uZSBwaWVjZSBOT1QgY292ZXJlZCBieSB0aGF0IGZhZGUgd2luZG93IOKAlCBpdCBzdGF5c1xuICAgdmlzaWJsZSB0aGUgd2hvbGUgd2F5IHRocm91Z2gg4oCUIHNvIG5vdGhpbmcgaGVyZSBtYXkgc3RhcnQgaXQgKG9yIHRoZVxuICAgY29sdW1uIHRoYXQgY2FycmllcyBpdCkgZnJvbSBhbiBvZmZzZXQgc3RhdGUgYXQgdD0xODBtcy4gRXZlcnkga2V5ZnJhbWVcbiAgIGJlbG93IGVpdGhlciBiZWdpbnMgYXQgcmVzdCBvciBiZWdpbnMgd2hpbGUgaXRzIGVsZW1lbnQgaXMgaW52aXNpYmxlLlxuICAgTGF5b3V0IGlzIHVudG91Y2hlZCDigJQgb25seSB0cmFuc2Zvcm0vb3BhY2l0eSBhbmltYXRlLlxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNXB4KSB7XG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlIHtcblxuICAgIC8qIFNoYXJlZCB3aXRoIHRoZSB3aWR0aC9wYWRkaW5nIHRyYW5zaXRpb24gb24gLnNoaXAtY29udGVudC1sZWZ0LCBzbyB0aGVcbiAgICAgICBjb250ZW50IG1vdGlvbiBhbmQgdGhlIHBhbmVsIGV4cGFuc2lvbiBhbHdheXMgcnVuIG9uIHRoZSBzYW1lIGN1cnZlLiAqL1xuICAgIC0tc2hpcC1leHBhbmQtZHVyOiAuOHM7XG4gICAgLS1zaGlwLWV4cGFuZC1lYXNlOiBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSk7XG4gIH1cblxuICAvKiAtLS0gTGVmdCBjb2x1bW46IGRyaWZ0cyB3aXRoIHRoZSBwYW5lbCBhcyBpdCBuYXJyb3dzIGFuZCByZXR1cm5zIHRvIHJlc3QuXG4gICAgICAgICBTdGFydHMgYW5kIGVuZHMgYXQgdHJhbnNsYXRlIHplcm8sIHNvIHRoZSBzdGlsbC12aXNpYmxlIGxvZ28gaXRcbiAgICAgICAgIGNhcnJpZXMgaXMgbmV2ZXIgc25hcHBlZCB0byBhbiBvZmZzZXQgd2hlbiAuZXhwYW5kZWQgbGFuZHMuIC0tLSAqL1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1jb250ZW50LWxlZnQge1xuICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC1jb250ZW50LWxlZnQge1xuICAgIGFuaW1hdGlvbjogc2hpcC1sZWZ0LXNldHRsZSB2YXIoLS1zaGlwLWV4cGFuZC1kdXIpXG4gICAgICBjdWJpYy1iZXppZXIoLjQ1LCAwLCAuNTUsIDEpIGJvdGg7XG4gIH1cblxuICBAa2V5ZnJhbWVzIHNoaXAtbGVmdC1zZXR0bGUge1xuICAgIDAlIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gICAgfVxuICAgIDQ1JSB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMHB4LCAwLCAwKTtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tLSBDbGllbnQgbG9nbzogbm8ga2V5ZnJhbWUuIEl0IGlzIHZpc2libGUgYWNyb3NzIHRoZSB3aG9sZSB0b2dnbGUsIHNvXG4gICAgICAgICBhbnkgYW5pbWF0aW9uIHdpdGggYSBgZnJvbWAgc3RhdGUgd291bGQgcmVhZCBhcyBhIGp1bXAgYXQgdD0xODBtcy5cbiAgICAgICAgIEluc3RlYWQgaXRzIDE2cHgg4oaSIDE0cHggdHlwZSBjaGFuZ2Ugc2ltcGx5IGludGVycG9sYXRlcyBvbiB0aGVcbiAgICAgICAgIGV4cGFuc2lvbiBkdXJhdGlvbiBhbmQgY3VydmUg4oCUIGNvbnRpbnVvdXMgZnJvbSB3aGVyZXZlciBpdCBpcy4gLS0tICovXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWNsaWVudC1sb2dvIHtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgZm9udC1zaXplIHZhcigtLXNoaXAtZXhwYW5kLWR1cikgdmFyKC0tc2hpcC1leHBhbmQtZWFzZSksXG4gICAgICBwYWRkaW5nIHZhcigtLXNoaXAtZXhwYW5kLWR1cikgdmFyKC0tc2hpcC1leHBhbmQtZWFzZSk7XG4gIH1cblxuICAvKiAtLS0gSGVhZGxpbmU6IGZhZGUgb25seS4gVGhlIGZhc3QgMC4xOHMgZmFkZS1vdXQgaXMga2VwdCBleGFjdGx5IGFzIGl0XG4gICAgICAgICB3YXM7IHRoZSBmYWRlIGJhY2sgaW4gYXQgdD0zODBtcyBydW5zIGxvbmcgYW5kIHNvZnQgc28gdGhlIHRpdGxlXG4gICAgICAgICByZXNvbHZlcyBpbnRvIHRoZSBuYXJyb3dlZCBjb2x1bW4gaW5zdGVhZCBvZiBibGlua2luZyBvbi4gLS0tICovXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLW1haW4tdGV4dCB7XG4gICAgd2lsbC1jaGFuZ2U6IG9wYWNpdHk7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAuNjVzIHZhcigtLXNoaXAtZXhwYW5kLWVhc2UpIC4wNXM7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1tYWluLXRleHQuc2hpcC1mYWRlLW91dCB7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAuMThzIGVhc2U7XG4gIH1cblxuICAvKiAtLS0gVGFnczogcm93IGZvbGRpbmcgaW50byBhIHN0YWNrLiBmbGV4LWRpcmVjdGlvbiBjYW4ndCB0d2Vlbiwgc28gdGhlXG4gICAgICAgICBzbmFwIGlzIGxlZnQgd2hlcmUgaXQgYWxyZWFkeSBpcyAoaGlkZGVuIGJlaGluZCB0aGUgZmFkZSkgYW5kIHRoZVxuICAgICAgICAgbW90aW9uIGlzIHJlYnVpbHQgYXMgYSBGTElQOiBlYWNoIGNoaXAgc3RhcnRzIG9mZnNldCB0byByb3VnaGx5XG4gICAgICAgICB3aGVyZSBpdCBzYXQgaW4gdGhlIHJvdyDigJQgdXAgYW5kIHRvIHRoZSByaWdodCBvZiBpdHMgbmV3IHNsb3Qg4oCUIGFuZFxuICAgICAgICAgdHJhdmVscyBpbnRvIHRoZSBjb2x1bW4uIENoaXAgMSBiYXJlbHkgbW92ZXMsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdFxuICAgICAgICAgYSBmb2xkaW5nIHJvdyBkb2VzLiBPZmZzZXRzIHNjYWxlIG9mZiB0aGUgY2hpcCdzIG93biBpbmRleCwgc28gdGhlXG4gICAgICAgICBjb3VudCBpcyBmcmVlIHRvIGNoYW5nZS4gLS0tICovXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmV4cGFuZGVkIC5zaGlwLXRhZyB7XG4gICAgLS1zaGlwLXRhZy1pOiAwO1xuICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgYW5pbWF0aW9uOiBzaGlwLXRhZy1mb2xkIC42cyB2YXIoLS1zaGlwLWV4cGFuZC1lYXNlKSBib3RoO1xuXG4gICAgLyogMC4ycyA9IHRoZSBtb21lbnQgLnNoaXAtZmFkZS1vdXQgbGlmdHMgYW5kIHRoZSByb3cgYmVjb21lcyB2aXNpYmxlICovXG4gICAgYW5pbWF0aW9uLWRlbGF5OiBjYWxjKC4ycyArIHZhcigtLXNoaXAtdGFnLWkpICogLjA2cyk7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC10YWc6bnRoLWNoaWxkKDIpIHtcbiAgICAtLXNoaXAtdGFnLWk6IDE7XG4gIH1cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtdGFnOm50aC1jaGlsZCgzKSB7XG4gICAgLS1zaGlwLXRhZy1pOiAyO1xuICB9XG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmV4cGFuZGVkIC5zaGlwLXRhZzpudGgtY2hpbGQoNCkge1xuICAgIC0tc2hpcC10YWctaTogMztcbiAgfVxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC10YWc6bnRoLWNoaWxkKDUpIHtcbiAgICAtLXNoaXAtdGFnLWk6IDQ7XG4gIH1cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtdGFnOm50aC1jaGlsZCg2KSB7XG4gICAgLS1zaGlwLXRhZy1pOiA1O1xuICB9XG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmV4cGFuZGVkIC5zaGlwLXRhZzpudGgtY2hpbGQoNykge1xuICAgIC0tc2hpcC10YWctaTogNjtcbiAgfVxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC10YWc6bnRoLWNoaWxkKDgpIHtcbiAgICAtLXNoaXAtdGFnLWk6IDc7XG4gIH1cblxuICBAa2V5ZnJhbWVzIHNoaXAtdGFnLWZvbGQge1xuICAgIGZyb20ge1xuICAgICAgb3BhY2l0eTogMDtcblxuICAgICAgLyogfjkwcHggPSBhdmVyYWdlIGNoaXAgd2lkdGggKyB0aGUgMTZweCByb3cgZ2FwIGl0IHVzZWQgdG8gc2l0IGJlaGluZDtcbiAgICAgICAgIH4yOHB4ID0gc3RhY2tlZCByb3cgcGl0Y2ggKDEycHggY2hpcCArIDEwcHggY29sdW1uIGdhcCkuICovXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKFxuICAgICAgICBjYWxjKHZhcigtLXNoaXAtdGFnLWkpICogOTBweCksXG4gICAgICAgIGNhbGModmFyKC0tc2hpcC10YWctaSkgKiAtMjhweCksXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgIH1cbiAgfVxufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1yaWdodC1zdHJpcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDA7XG4gIHRvcDogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTlweDtcbiAgei1pbmRleDogNDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuXG4gIC8qIENlbnRyZXMgdGhlIGxhYmVsIGluc3RlYWQgb2YgbnVkZ2luZyBpdCB3aXRoIGEgaGFyZGNvZGVkIG9mZnNldCwgc28gdGhlXG4gICAgIGNvcHkgaW5zaWRlIGlzIGZyZWUgdG8gZ2V0IGxvbmdlciBvciBzaG9ydGVyIHdpdGhvdXQgZHJpZnRpbmcgb3V0IG9mIHRoZVxuICAgICAxOXB4IHN0cmlwLiAqL1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC45cyBlYXNlLWluLW91dDtcblxuICAvKiB0cmFuc2l0aW9uOiBhbGwgLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKTtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgIDEwNS4wOWRlZyxcbiAgICByZ2IoNzAsIDQ3LCAxMzAsIC41KSAtLjMyJSxcbiAgICByZ2IoMTgxLCA2NSwgMTM5LCAuNSkgNTYuMzElLFxuICAgIHJnYigyNDEsIDExMSwgODgsIC41KSA5Mi40NSUgXG4gICk7ICovXG4gIFxufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC1yaWdodC1zdHJpcCB7XG4gIG9wYWNpdHk6IDA7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwcHgpO1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC12ZXJ0aWNhbC10ZXh0IHtcbiAgd3JpdGluZy1tb2RlOiB2ZXJ0aWNhbC1ybDtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGV0dGVyLXNwYWNpbmc6IDFweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcblxuICAvKiBMYXN0LXJlc29ydCBndWFyZDogY29weSBsb25nZXIgdGhhbiB0aGUgc3RyaXAgaXMgdGFsbCB0cmltcyBpbnN0ZWFkIG9mXG4gICAgIGJsZWVkaW5nIHBhc3QgdGhlIGNhcmQgZWRnZXMuICovXG4gIG1heC1oZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4vKiBkeW5hbWljIHN0YWNrIGVmZmVjdCBoYW5kbGVkIGJlbG93IGluIEBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpICovXG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXRhYnMge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC8qIFdyYXBzIHJhdGhlciB0aGFuIG92ZXJmbG93aW5nIG9uY2UgdGhlIGRlY2sgY2FycmllcyBtb3JlIHRhYnMgdGhhbiBmaXQgb25cbiAgICAgb25lIHJvdy4gQSBmb3VyLWNhcmQgZGVjayBzdGlsbCByZW5kZXJzIG9uIGEgc2luZ2xlIGxpbmUsIHNvIHRoaXMgY29zdHNcbiAgICAgbm90aGluZyB0b2RheSBhbmQgc3RvcHMgYSBsb25nZXIgb25lIHB1c2hpbmcgdGhlIHN0cmlwIG9mZiB0aGUgY29udGFpbmVyLiAqL1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGdhcDogNDBweDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xufVxuXG4jd2hhdC13ZS1zaGlwIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtaW4taGVpZ2h0OiAxMDB2aDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgcGFkZGluZy1ib3R0b206IDA7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXRhYiB7XG4gIGNvbG9yOiAjNjc2Nzc1O1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0cmFuc2l0aW9uOiBhbGwgLjNzIGVhc2U7XG59XG5cbi8qIFRoZSBzdHJpcCB1c2VkIHRvIG5hbWUgZXZlcnkgdGFiIGluZGV4IGFnYWluc3QgZXZlcnkgZGVjayBpbmRleCwgd2hpY2ggaXNcbiAgIHdoeSBhIGZpZnRoIGNhcmQgbWVhbnQgbmV3IENTUy4gcmVuZGVyU2hpcFN0YWNrKCkgaW4ganMvaG9tZS5qcyBub3cgbWFya3MgdGhlXG4gICBvbmUgdGFiIHRoYXQgbWF0Y2hlcyB0aGUgcmVuZGVyZWQgY2FyZCwgc28gdGhlIHBhaXJpbmcgbGl2ZXMgd2hlcmUgdGhlIGRlY2tcbiAgIGxlbmd0aCBhbHJlYWR5IGRvZXMuICovXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10YWIuYWN0aXZlIHtcbiAgY29sb3I6IHZhcigtLWFjY2VudC1yZWQpO1xuICBmb250LXdlaWdodDogNjAwO1xufVxuXG4ud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10YWIuYWN0aXZlIC50YWItZG90cyxcbi53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXRhYi5hY3RpdmUgLm1vcmUtZG90cyB7XG4gIG9wYWNpdHk6IDE7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG59XG5cbi53aGF0LXdlLXNoaXAtcGFyZW50IC50YWItZG90cyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAtNXB4O1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgY29sb3I6IHZhcigtLWFjY2VudC1yZWQpO1xuICBmb250LXNpemU6IDI0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxMHB4O1xuICBvcGFjaXR5OiAwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIHRyYW5zaXRpb246IGFsbCAuM3MgZWFzZTtcbn1cblxuLyog4pSA4pSAIENhcmQgc3RhY2s6IHRoZSBhY3RpdmUgY2FyZCBwbHVzIHRoZSBuZXh0IHR3byBwZWVrIG91dCBiZWxvdyBpdCDilIDilIBcbiAgIEV4YWN0bHkgdGhyZWUgY2FyZHMgYXJlIGV2ZXIgb24gc2NyZWVuLCBob3dldmVyIG1hbnkgdGhlIGRlY2sgaG9sZHMuIFRoZVxuICAgZm91cnRoIHBvc2l0aW9uIChkYXRhLXBvcz1cIjNcIikgaXMgd2hlcmUgZXZlcnkgcmVtYWluaW5nIGNhcmQgd2FpdHMsIHBhcmtlZCBvblxuICAgdGhlIGxhc3QgdmlzaWJsZSBzbG90IGFuZCBpbnZpc2libGUsIHNvIGl0IFJJU0VTIGludG8gdGhlIHN0YWNrIGFzIHRoZSBkZWNrXG4gICB3YWxrcyBmb3J3YXJkIHJhdGhlciB0aGFuIGZhZGluZyBpbiBmcm9tIG5vd2hlcmUuIEdlb21ldHJ5IGlzIHBlciBzdGFja1xuICAgcG9zaXRpb24sIG5ldmVyIHBlciBjYXJkIGluZGV4LiAqL1xuQG1lZGlhIChtaW4td2lkdGg6IDEwMjVweCkge1xuXG4gIC8qIFN0YWNrIHBvcyAxIOKAlCB0aGUgY2FyZCBkaXJlY3RseSBiZWhpbmQgdGhlIGFjdGl2ZSBvbmUgKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGVbZGF0YS1wb3M9XCIxXCJdIHtcbiAgICBvcGFjaXR5OiAuNTtcbiAgICB6LWluZGV4OiAzO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gICAgLyogRGVsaWJlcmF0ZWx5IHRoZSBvcmlnaW5hbCBkZWNrIGdlb21ldHJ5IOKAlCB0aGUgbG9vayB3YXMgc2lnbmVkIG9mZiBhcy1pcy5cbiAgICAgICBXb3J0aCBrbm93aW5nIHdoZW4gdG91Y2hpbmcgaXQ6IHRoaXMgcmVzdGluZyBvZmZzZXQgZG91YmxlcyBhcyB0aGVcbiAgICAgICBhcnJpdmluZyBjYXJkJ3MgdHJhdmVsIGRpc3RhbmNlLCBzaW5jZSBhIGNhcmQgcHJvbW90ZWQgdG8gYWN0aXZlIGFuaW1hdGVzXG4gICAgICAgZnJvbSBoZXJlIHRvIHRyYW5zbGF0ZTNkKDAsMCwwKS4gQXQgMjZweCB0aGF0IGlzIGEgdmVyeSBzbWFsbCBtb3ZlIHNwcmVhZFxuICAgICAgIG92ZXIgdGhlIGZ1bGwgdHJhbnNpdGlvbiwgc28gb24gYSBkb3dud2FyZCBzdGVwIGVzc2VudGlhbGx5IGFsbCBvZiB0aGVcbiAgICAgICBtb3Rpb24gYmVsb25ncyB0byB0aGUgREVQQVJUSU5HIGNhcmQgYW5kIGl0cyAxMDB2aCBleGl0LlxuICAgICAgIFRoYXQgYXN5bW1ldHJ5IGlzIGZpbmUgaW4gaXRzZWxmIOKAlCB0aGUgdXAgc3RlcCBpcyB0aGUgbWlycm9yIGltYWdlLCB3aXRoXG4gICAgICAgYWxsIHRoZSBtb3Rpb24gb24gdGhlIGFycml2aW5nIGNhcmQuIFdoYXQgdXNlZCB0byBicmVhayBpdCB3YXMgc3RhY2tpbmcsXG4gICAgICAgbm90IGdlb21ldHJ5OiB0aGUgZGVwYXJ0aW5nIGNhcmQgaGFkIG5vIHotaW5kZXggb2YgaXRzIG93biBhbmQgc2F0IGJlaGluZFxuICAgICAgIHRoaXMgb25lIHdoaWxlIGl0IG1vdmVkLiBJdCBub3cgZXhpdHMgYWJvdmUgdGhlIGRlY2sgKHNlZSB6LWluZGV4IG9uIHRoZVxuICAgICAgIC0xMDB2aCBydWxlIGFib3ZlKSwgc28gYm90aCBkaXJlY3Rpb25zIHNob3cgdGhlaXIgbW92aW5nIGNhcmQgaW4gZnVsbC5cbiAgICAgICBUaW1pbmcgaXMgc2hhcmVkOiB0aGUgdW5pZmllZCAxLjJzIHRyYW5zaXRpb24gb24gLnNoaXAtc2xpZGUgYW5kXG4gICAgICAgU0hJUF9TTElERV9UUkFOU0lUSU9OX01TIGluIGpzL2hvbWUuanMg4oCUIGNoYW5nZSBvbmUsIGNoYW5nZSB0aGUgb3RoZXIuICovXG4gICAgdHJhbnNmb3JtOiBzY2FsZSguOTY3KSB0cmFuc2xhdGUzZCgwLCAyNnB4LCAwKTtcbiAgfVxuXG4gIC8qIFN0YWNrIHBvcyAyIOKAlCBzZWNvbmQgYW5kIGxhc3QgY2FyZCB2aXNpYmxlIGJlaGluZCB0aGUgYWN0aXZlIG9uZS5cbiAgICAgU0hJUF9TVEFDS19ERVBUSCBpbiBqcy9ob21lLmpzIGlzIDIgYmVjYXVzZSBvZiB0aGlzIHJ1bGU7IHJhaXNpbmcgb25lIG1lYW5zXG4gICAgIHJhaXNpbmcgdGhlIG90aGVyIGFuZCBhZGRpbmcgdGhlIG1hdGNoaW5nIHN0ZXAgaGVyZS4gKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGVbZGF0YS1wb3M9XCIyXCJdIHtcbiAgICBvcGFjaXR5OiAuNTtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKC45MzUpIHRyYW5zbGF0ZTNkKDAsIDUwcHgsIDApO1xuICAgIHotaW5kZXg6IDI7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cblxuICAvKiBUaGUgd2FpdGluZyByb29tIOKAlCBldmVyeSBjYXJkIGZ1cnRoZXIgYmFjayB0aGFuIHRoZSB2aXNpYmxlIHN0YWNrLlxuICAgICBJdCBzaXRzIE9OIHBvcyAyJ3MgZ2VvbWV0cnkgcmF0aGVyIHRoYW4gYXQgdHJhbnNsYXRlM2QoMCwwLDApIHNvIHRoYXQgYmVpbmdcbiAgICAgcHJvbW90ZWQgaW50byB0aGUgZGVjayBpcyBhIDI0cHggcmlzZSBsaWtlIGV2ZXJ5IG90aGVyIHN0ZXAsIG5vdCBhXG4gICAgIHRyYXZlbC1mcmVlIGNyb3NzLWZhZGUuIE5vdGhpbmcgaGVyZSBpcyBwZXItY2FyZCwgc28gYSBkZWNrIG9mIHR3ZW50eVxuICAgICByZW5kZXJzIGV4YWN0bHkgbGlrZSBhIGRlY2sgb2YgdGhyZWUuICovXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlW2RhdGEtcG9zPVwiM1wiXSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKC45MzUpIHRyYW5zbGF0ZTNkKDAsIDUwcHgsIDApO1xuICAgIHotaW5kZXg6IDE7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cblxuICAvKiBUaGUgY2xvc2luZyBncmFkaWVudCBjYXJkIGlzIGEgZnVsbC1ibGVlZCBwYW5lbCwgbm90IGEgY2FzZS1zdHVkeSBjYXJkLCBzb1xuICAgICBpdCBuZXZlciBwZWVrcyBvdXQgb2YgdGhlIHN0YWNrIOKAlCBidXQgaXQgc3RpbGwgVFJBVkVMUyBsaWtlIG9uZSwga2VlcGluZ1xuICAgICB3aGF0ZXZlciBnZW9tZXRyeSBpdHMgc3RhY2sgcG9zaXRpb24gZ2l2ZXMgaXQsIHNvIGl0IHJpc2VzIGludG8gcGxhY2Ugb25cbiAgICAgdGhlIHNhbWUgbW90aW9uIGFzIHRoZSByZXN0LiBXcml0dGVuIGFnYWluc3QgdGhlIGNhcmQncyBvd24gY2xhc3MgcmF0aGVyXG4gICAgIHRoYW4gaXRzIGluZGV4LCB3aGljaCBpcyB3aGF0IGtlZXBzIGl0IGNvcnJlY3Qgd2hlcmV2ZXIgaXQgc2l0cyBpbiB0aGVcbiAgICAgZGVjay4gKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZGlzY292ZXItc2xpZGVbZGF0YS1wb3M9XCIxXCJdLFxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5kaXNjb3Zlci1zbGlkZVtkYXRhLXBvcz1cIjJcIl0sXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmRpc2NvdmVyLXNsaWRlW2RhdGEtcG9zPVwiM1wiXSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogMTQ0MHB4KSB7XG4gICN3aGF0LXdlLXNoaXAge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1jb250YWluZXIge1xuXG4gICAgLyogcGFkZGluZy10b3A6IDIwcHg7ICovXG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10aXRsZSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgfVxufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFJFU1BPTlNJVkUg4oCUIFNoaXAgRm9sZCAoTW9iaWxlIOKJpCAxMDIzcHgpXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbkBtZWRpYSAobWF4LXdpZHRoOiAxMDI0cHgpIHtcbiAgI3doYXQtd2Utc2hpcCB7XG5cbiAgICAvKiBkdmgsIG5vdCB2aCDigJQgc2FtZSByZWFzb24gYXMgLnN0b3J5LXBhcmVudCBhYm92ZS4gT24gaU9TIDEwMHZoIHJlc29sdmVzXG4gICAgICAgdG8gdGhlIExBUkdFIHZpZXdwb3J0IChhZGRyZXNzIGJhciBoaWRkZW4pLCBzbyBvbiBhIHBob25lIHdpdGggdGhlIGJhclxuICAgICAgIHNob3dpbmcgdGhlIHNlY3Rpb24gcnVucyB+MTEwcHggdGFsbGVyIHRoYW4gd2hhdCdzIG9uIHNjcmVlbi4gQ2VudHJlZFxuICAgICAgIGNvbnRlbnQgKHNlZSAuc2hpcC1jb250YWluZXIpIHRoZW4gc2l0cyB0aGF0IG11Y2ggdG9vIGxvdyBhbmQgdGhlIHRhYlxuICAgICAgIHN0cmlwIGJlbG93IHRoZSBjYXJkIGZhbGxzIGJlaGluZCB0aGUgYnJvd3NlcidzIGJvdHRvbSB0b29sYmFyIOKAlCBcInRoZVxuICAgICAgIG5hdiBpcyBnb25lIGFuZCB0aGUgc2VjdGlvbiBpcyBzdHVja1wiLiBkdmggdHJhY2tzIHRoZSBjdXJyZW50IHZpZXdwb3J0LFxuICAgICAgIHNvIHRoZSBzdHJpcCBzdGF5cyBvbiBzY3JlZW4uIEdTQVAgd3JpdGVzIGl0cyBvd24gbWVhc3VyZWQgaGVpZ2h0IGlubGluZVxuICAgICAgIG9uY2UgdGhlIGZvbGQgcGlucywgc28gdGhpcyBvbmx5IGdvdmVybnMgdGhlIHByZS1waW4gZnJhbWVzLiB2aCBzdGF5cyBhc1xuICAgICAgIHRoZSBmYWxsYmFjayBmb3IgYnJvd3NlcnMgd2l0aG91dCBkdmguICovXG4gICAgaGVpZ2h0OiAxMDB2aDtcbiAgICAvKiBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVjbGFyYXRpb24tYmxvY2stbm8tZHVwbGljYXRlLXByb3BlcnRpZXMgKi9cbiAgICBoZWlnaHQ6IDEwMGR2aDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgcGFkZGluZy10b3A6IDExMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAyNXB4O1xuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtY29udGFpbmVyIHtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblxuICAgIC8qIENlbnRyZWQgd2hpbGUgcGlubmVkIOKAlCBidXQgYHNhZmVgLCBzbyBpdCBvbmx5IGNlbnRyZXMgd2hpbGUgdGhlIHRpdGxlICtcbiAgICAgICBjYXJkICsgdGFiIHN0cmlwIGFjdHVhbGx5IGZpdC4gSWYgdGhleSdkIHRvdGFsIG1vcmUgdGhhbiB0aGUgdmlzaWJsZVxuICAgICAgIGhlaWdodCAoc2hvcnQgcGhvbmUsIGJyb3dzZXIgY2hyb21lIHNob3dpbmcpIHRoZSBzYWZlIGtleXdvcmQgZmFsbHMgYmFja1xuICAgICAgIHRvIHN0YXJ0IGFsaWdubWVudCBpbnN0ZWFkIG9mIHNwbGl0dGluZyB0aGUgb3ZlcmZsb3cgdG9wIEFORCBib3R0b20sXG4gICAgICAgd2hpY2ggaXMgd2hhdCB1c2VkIHRvIHB1c2ggdGhlIHRhYiBzdHJpcCBvZmYgc2NyZWVuLiBMb3dlcmluZyB0aGUgY2FyZFxuIGZsb29yIHRvIDM4MHB4IChzZWUgLnNoaXAtY2Fyb3VzZWwtd3JhcHBlciBiZWxvdykgaXMgd2hhdCBidXlzIHRoZSBzbGFja1xuICAgICAgIHRvIGNlbnRyZSBvbiBhIG5vcm1hbCBoYW5kc2V0IGluIHRoZSBmaXJzdCBwbGFjZS5cbiAgICAgICBQcm9ncmVzc2l2ZS1lbmhhbmNlbWVudCBwYWlyLCBzYW1lIGFzIC5zdG9yeS1wYXJlbnQgLmN1c3RvbS1jb250YWluZXI6XG4gICAgICAgYnJvd3NlcnMgdGhhdCBkb24ndCBwYXJzZSBgc2FmZWAgZHJvcCB0aGUgc2Vjb25kIGxpbmUgYW5kIGtlZXAgcGxhaW5cbiAgICAgICBgY2VudGVyYC4gKi9cbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAvKiBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVjbGFyYXRpb24tYmxvY2stbm8tZHVwbGljYXRlLXByb3BlcnRpZXMgKi9cbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNhZmUgY2VudGVyO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10aXRsZSB7XG4gICAgZm9udC1zaXplOiAyOHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAzOHB4O1xuICAgIHBhZGRpbmctbGVmdDogMjRweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gIH1cblxuICAvKiBDYXJvdXNlbDogdGFsbGVyIGNhcmQsIG92ZXJmbG93IGhpZGRlbiBzbyBwZWVrIHN0YXlzIGluc2lkZS5cblxuICAgICBjbGFtcCwgbm90IG1heDogdGhlIHZpZXdwb3J0IHRlcm0gaXMgd2hhdCBzaXplcyB0aGUgY2FyZCBvbiBhIG5vcm1hbFxuICAgICBoYW5kc2V0LCB0aGUgNDM1cHggZmxvb3Igc3RvcHMgaXQgY29sbGFwc2luZyBvbiBhIHNob3J0IG9uZSwgYW5kIHRoZSA1NDBweFxuICAgICBjZWlsaW5nIGlzIHRoZSBzYW1lIGNhcCBkZXNrdG9wIGNhcnJpZXMuIFdpdGhvdXQgdGhhdCBjZWlsaW5nIHRoZSBjYXJkIGtlcHRcbiAgICAgZ3Jvd2luZyBvbiBhIHRhbGwgdGFibGV0LCB3aGljaCBpcyB0aGUgb25lIHZpZXdwb3J0IHdoZXJlIDEwMHN2aCAtIDI4MHB4XG4gICAgIGNsZWFycyA1NDAgb24gaXRzIG93bi4gTW9iaWxlIG92ZXJyaWRlcyB0aGUgY2VpbGluZyBiZWxvdy4gKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtY2Fyb3VzZWwtd3JhcHBlciB7XG4gICAgaGVpZ2h0OiBjbGFtcCg0MzVweCwgY2FsYygxMDBzdmggLSAyODBweCksIDU0MHB4KTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgICAvKiBWZXJ0aWNhbCBwYW5zIHN0YXkgbmF0aXZlIOKAlCB0aGUgcGluJ3Mgb3duIHNjcm9sbCBtdXN0IGtlZXAgd29ya2luZ1xuICAgICAgIHVudG91Y2hlZC4gSG9yaXpvbnRhbCBpcyBoYW5kZWQgdG8gdGhlIHN3aXBlIGhhbmRsZXIgaW4gaG9tZS5qcywgd2hpY2hcbiAgICAgICBpcyB3aGF0IHN0b3BzIHRoZSBicm93c2VyIGZyb20gY29tbWl0dGluZyB0byBhIGRpYWdvbmFsIGRyYWcgYXMgYSBwYWdlXG4gICAgICAgc2Nyb2xsIGJlZm9yZSB0aGUgZ2VzdHVyZSdzIGF4aXMgaGFzIGJlZW4gcmVzb2x2ZWQuICovXG4gICAgdG91Y2gtYWN0aW9uOiBwYW4teTtcbiAgfVxuXG4gIC8qIEFsbCBzbGlkZXM6IDI0cHggaW5zZXQgZWFjaCBzaWRlIGNyZWF0ZXMgdGhlIHBlZWsgZ2Fwcy5cbiAgICAgTGVmdCBnYXAgKDDihpIyNHB4KSA9IHByZXYgY2FyZCBwZWVrcy4gIFJpZ2h0IGdhcCAobi0yNHB44oaSbikgPSBuZXh0IGNhcmQgcGVla3MuXG4gICAgIERlZmF1bHQgKG5vdC15ZXQtc2Vlbikgc3RhdGUgdXNlcyB0cmFuc2xhdGVYIHNvIGFsbCB0cmFuc2l0aW9ucyBhcmUgaG9yaXpvbnRhbC4gKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUge1xuICAgIGxlZnQ6IDI0cHg7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAtIDQ4cHgpO1xuICAgIHBhZGRpbmc6IDIwcHggMzBweCAyMHB4IDIwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMTAwJSArIDJweCkpIHNjYWxlKC45NSk7XG5cbiAgICAvKiBNb2JpbGUgaXMgYSBzaW5nbGUgaG9yaXpvbnRhbCB0cmFuc2xhdGVYIHNsaWRlLCBub3QgdGhlIGRlc2t0b3Agc3RhY2tcbiAgICAgICB3aXRoIGl0cyBtYXRjaGVkIGRlcGFydGluZy9hcnJpdmluZyBjdXJ2ZXMgKHRob3NlIGFyZSBtaW4td2lkdGg6IDEwMjVweFxuICAgICAgIHNjb3BlZCkuIDAuNXMgaXMgcGxlbnR5IGZvciB0aGF0IG9uZSBtb3ZlIGFuZCBsZXRzIHRoZSB0b3VjaCBzdGVwIGR3ZWxsXG4gICAgICAgaW4ganMvaG9tZS1zbW9vdGhlZXItMS5qcyAoU0hJUF9TTElERV9UUkFOU0lUSU9OX01TID0gNjIwIG9uIGNvYXJzZVxuICAgICAgIHBvaW50ZXJzKSBjb21lIGRvd24gd2l0aCBpdCDigJQgd2hpY2ggaXMgd2hhdCBzdG9wcyB0aGUgZGVjayBmZWVsaW5nXG4gICAgICAgc3R1Y2sgLyBzdGlsbCB3YWxraW5nIGFmdGVyIHRoZSBmaW5nZXIgbGlmdHMuIFN0YXlzIHVuZGVyIHRoYXQgNjIwbXNcbiAgICAgICBjZWlsaW5nLiAqL1xuICAgIHRyYW5zaXRpb246XG4gICAgICB0cmFuc2Zvcm0gLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKSxcbiAgICAgIG9wYWNpdHkgLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKSxcbiAgICAgIGJveC1zaGFkb3cgLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKTtcblxuICAgIC8qIGlPUzoga2VlcCBlYWNoIHNsaWRlIG9uIGl0cyBvd24gc3RhYmxlIEdQVSBsYXllciB0aHJvdWdoIHRoZSB0cmFuc2xhdGVYLlxuICAgICAgIFdpdGhvdXQgdGhpcyB0aGUgbGF5ZXIgaXMgcmUtcHJvbW90ZWQgcGVyIHN0ZXAgYW5kIFNhZmFyaSBmbGFzaGVzIHRoZVxuICAgICAgIHdob2xlIGNhcmQgKHdvcnNlIHdpdGggdGhlIDx2aWRlbz4gaW5zaWRlIGl0KSDigJQgdGhlIFwic2xpZGUgY2hhbmdlZCBidXRcbiAgICAgICB0aGUgcGFnZSBibGlua3NcIiByZXBvcnQuIHRyYW5zbGF0ZVooMCkgaXMgZm9sZGVkIGludG8gdGhlIHJlc3RpbmdcbiAgICAgICB0cmFuc2Zvcm0gYWJvdmUgdmlhIHRoZSBKUy1zZXQgZGF0YS1wb3MgcnVsZXM7IGJhY2tmYWNlLXZpc2liaWxpdHkgaXNcbiAgICAgICB0aGUgcGFydCB0aGF0IGFjdHVhbGx5IHN0b3BzIHRoZSBzdWItcGl4ZWwgcmUtcmFzdGVyIGZsYXNoLiAqL1xuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgfVxuXG4gIC8qIERpc2NvdmVyIChjbG9zaW5nKSBwYW5lbCBoYXMgbm8gcmlnaHQgc3RyaXAsIHNvIGRyb3AgdGhlIGV4dHJhIHJpZ2h0XG4gICAgIGluc2V0IHRoZSBjYXNlLXN0dWR5IHNsaWRlcyBjYXJyeSBhbmQgc2l0IG9uIGFuIGV2ZW4gMjBweCBhbGwgcm91bmQuICovXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmRpc2NvdmVyLXNsaWRlIHtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICB9XG4gIFxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC12aWRlby1iZyB7XG5cbiAgICAvKiBTYW1lIGxheWVyLXN0YWJpbGl0eSBmaXggZm9yIHRoZSB2aWRlbyB0aGF0IHJpZGVzIGluc2lkZSB0aGUgc2xpZGUuICovXG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1yaWdodC1zdHJpcCB7XG4gICAgdG9wOiBhdXRvO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMjZweDtcbiAgICBoZWlnaHQ6IGF1dG87XG4gICAgcGFkZGluZy1ibG9jazogMTZweDtcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQ6ICNmMTZmNTg7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1jbGllbnQtbG9nbyB7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGhlaWdodDogMzJweDtcbiAgfVxuXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLW1haW4tdGV4dCBoMyB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjM7XG4gICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgfVxuXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLW1haW4tdGV4dCBoMyBiciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXRhZ3Mge1xuICAgIGZsZXgtZmxvdzogcm93IHdyYXA7XG4gICAgZ2FwOiA4cHg7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10YWcge1xuICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICBwYWRkaW5nOiAzcHggOHB4O1xuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtY2FyZC1zdGFjayB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC8qIEFycm93IGJ1dHRvbiBoaWRkZW4gaW4gZGVmYXVsdCAobm9uLWV4cGFuZGVkKSBjYXJkIHZpZXcgKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtYXJyb3ctYnRuIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgLyogV2hlbiBhIHNsaWRlIGlzIGV4cGFuZGVkLCBjb2xsYXBzZSBhbGwgb3RoZXIgc2xpZGVzIHNvIHBlZWsgY2FyZHNcbiAgICAgZG9uJ3QgYmxlZWQgb3ZlciB0aGUgZml4ZWQgcG9wdXAgKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnRcbiAgLnNoaXAtY2Fyb3VzZWwtd3JhcHBlcjpoYXMoLnNoaXAtc2xpZGUuZXhwYW5kZWQpXG4gIC5zaGlwLXNsaWRlOm5vdCguZXhwYW5kZWQpIHtcbiAgICBvcGFjaXR5OiAwICFpbXBvcnRhbnQ7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxuXG4gIC8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICBIb3Jpem9udGFsIHNsaWRlIHN0YXRlcyDigJQgb3ZlcnJpZGUgYWxsIGRlc2t0b3AgdHJhbnNsYXRlWVxuICAgICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cblxuICAvKiBTYW1lIGRhdGEtcG9zIGtleXMgYXMgdGhlIGRlc2t0b3AgZGVjayAoc2VlIHRoZSBibG9jayB1cCBhdCB0aGUgYWN0aXZlLWNhcmRcbiAgICAgcnVsZSksIHJlLXBvaW50ZWQgdG8gaG9yaXpvbnRhbCB0cmF2ZWwuIFRocmVlIGNhcmRzIGFyZSBvbiBzY3JlZW4gaGVyZSB0b29cbiAgICAg4oCUIHRoZSBhY3RpdmUgb25lIHBsdXMgYSBwZWVrIG9uIGVhY2ggc2lkZSDigJQgc28gdGhlIG1vYmlsZSBkZWNrIHNjYWxlcyB3aXRoXG4gICAgIHRoZSBtYXJrdXAgZm9yIGZyZWUgYXMgd2VsbC4gKi9cblxuICAvKiBBY3RpdmUgc2xpZGUgKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGVbZGF0YS1wb3M9XCIwXCJdIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKSBzY2FsZSgxKTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICB6LWluZGV4OiA0O1xuICB9XG5cbiAgLyogRXZlcnl0aGluZyBhbHJlYWR5IHBhc3NlZCBiZXlvbmQgdGhlIHBlZWsg4oCUIGhpZGRlbiwgb2ZmIGxlZnQgKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGVbZGF0YS1wb3M9XCItMlwiXSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtMTAwJSAtIDEycHgpKSBzY2FsZSgxKTtcbiAgfVxuXG4gIC8qIFBSRVYgUEVFSyDigJQgaW1tZWRpYXRlbHkgYWRqYWNlbnQgcHJldmlvdXMgY2FyZCwgdmlzaWJsZSBvbiBsZWZ0IGVkZ2UgKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGVbZGF0YS1wb3M9XCItMVwiXSB7XG4gICAgb3BhY2l0eTogLjU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTEwMCUgLSA0cHgpKSBzY2FsZSguOTUpO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHotaW5kZXg6IDM7XG4gIH1cblxuICAvKiBORVhUIFBFRUsg4oCUIGltbWVkaWF0ZWx5IGFkamFjZW50IG5leHQgY2FyZCwgdmlzaWJsZSBvbiByaWdodCBlZGdlLlxuICAgICBDYXJkcyBmdXJ0aGVyIGFoZWFkIChkYXRhLXBvcyAyIGFuZCAzKSBrZWVwIC5zaGlwLXNsaWRlJ3Mgb3duIHJlc3RpbmdcbiAgICAgc3RhdGU6IHBhcmtlZCBvZmYgdGhlIHJpZ2h0IGVkZ2UgYXQgb3BhY2l0eSAwLCByZWFkeSB0byBzbGlkZSBpbi4gKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGVbZGF0YS1wb3M9XCIxXCJdIHtcbiAgICBvcGFjaXR5OiAuNTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygxMDAlICsgNHB4KSkgc2NhbGUoLjk1KTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB6LWluZGV4OiAzO1xuICB9XG5cbiAgLyog4pSA4pSAIFRhYnM6IDIgdmlzaWJsZSBhdCBhIHRpbWUsIGFjdGl2ZSBwaW5uZWQgdG8gbGVmdCwgc2l0cyBhdCBzZWN0aW9uIGJvdHRvbSDilIDilIAgKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtdGFicyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBnYXA6IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG5cbiAgICAvKiBTaW5nbGUgcm93IGhlcmUsIHdoYXRldmVyIHRoZSBkZWNrIGxlbmd0aDogdGhlIHN0cmlwIGlzIGEgaG9yaXpvbnRhbFxuICAgICAgIHRyYWNrIHRoYXQgcmVuZGVyU2hpcFN0YWNrKCkgc2xpZGVzIHZpYSAtLXNoaXAtdGFiLXNoaWZ0LCBzbyB0aGUgYmFzZVxuICAgICAgIGZsZXgtd3JhcDogd3JhcCB3b3VsZCBicmVhayBpdCBpbnRvIGV4dHJhIHJvd3MgaW5zdGVhZCBvZiBzY3JvbGxpbmcuICovXG4gICAgZmxleC13cmFwOiBub3dyYXA7XG5cbiAgICAvKiBTbWFsbCBmaXhlZCBnYXAgdW5kZXIgdGhlIGNhcmQuIFdhcyB2aXN1YWxseSBoYW5kbGVkIGJ5XG4gICAgICAganVzdGlmeS1jb250ZW50OmNlbnRlcidzIHNsYWNrIG9uIC5zaGlwLWNvbnRhaW5lcjsgbm93IHRoYXQgdGhlIGNvbHVtblxuICAgICAgIGlzIHRvcC1hbmNob3JlZCB0aGUgc3RyaXAgd291bGQgYnV0dCBhZ2FpbnN0IHRoZSBjYXJkIHdpdGhvdXQgdGhpcy4gKi9cbiAgICBtYXJnaW4tdG9wOiAxNnB4O1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gICAgcGFkZGluZy1sZWZ0OiAyNHB4O1xuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtdGFiIHtcbiAgICBtaW4td2lkdGg6IDUwJTtcbiAgICBmbGV4LXNocmluazogMDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBwYWRkaW5nOiAxNHB4IDI0cHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjNzIGVhc2U7XG4gICAgY29sb3I6IHZhcigtLXRleHQtZ3JheSk7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAubW9yZS1kb3RzIHtcbiAgICBib3R0b206IDEwcHg7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLm1vcmUtZG90cyAuZG90IHtcbiAgICB3aWR0aDogNXB4O1xuICAgIGhlaWdodDogNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM5Njk2OTY7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10YWIuYWN0aXZlIC5tb3JlLWRvdHMgLmRvdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYWNjZW50LXJlZCk7XG4gIH1cblxuICAvKiBTbGlkZXMgdGhlIHdob2xlIHN0cmlwIHNvIHRoZSBhY3RpdmUgdGFiIHN0YXlzIG9uIHNjcmVlbi5cbiAgICAgcmVuZGVyU2hpcFN0YWNrKCkgaW4ganMvaG9tZS5qcyBvd25zIHRoZSBkaXN0YW5jZTogb25lIHRhYiB3aWR0aCBwZXIgY2FyZFxuICAgICBwYXNzZWQsIHdpdGggdGhlIGFjdGl2ZSB0YWIgb24gdGhlIGxlYWRpbmcgZWRnZSBnb2luZyBmb3J3YXJkIGFuZCB0aGVcbiAgICAgdHJhaWxpbmcgZWRnZSBjb21pbmcgYmFjayAodHdvIHRhYnMgYXJlIHZpc2libGUgYXQgYSB0aW1lIGF0IG1pbi13aWR0aDpcbiAgICAgNTAlKS4gT25lIGRlY2xhcmF0aW9uIGluc3RlYWQgb2Ygb25lIHBlciBjYXJkIGluZGV4LiAqL1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC10YWJzIC5zaGlwLXRhYiB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKHZhcigtLXNoaXAtdGFiLXNoaWZ0LCAwKSk7XG4gIH1cblxuICAvKiBEb3RzIGluZGljYXRvciBoaWRkZW4gb24gbW9iaWxlIChvdmVyZmxvdzpoaWRkZW4gb24gLnNoaXAtdGFicyBjbGlwcyB0aGVtKSAqL1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAudGFiLWRvdHMge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAvKiDilIDilIAgRGlzY292ZXIgc2xpZGUg4pSA4pSAICovXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWRpc2NvdmVyLWNvbnRlbnQge1xuICAgIHBhZGRpbmc6IDI0cHggMTZweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuZGlzY292ZXItdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMjJweDtcbiAgICBmb250LXdlaWdodDogMzAwO1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIFxuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLmRpc2NvdmVyLXRhZ3Mge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiA4cHg7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgIG1hcmdpbi1ib3R0b206IDI4cHg7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuZGlzY292ZXItdGFnIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gICAgcGFkZGluZzogMTBweCAxNnB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC52aWV3LWFsbC1zdG9yaWVzIHtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gIH1cblxuICAvKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgICAgTU9CSUxFIFBPUlRBTCDigJQgc2xpZGUgaXMgZGV0YWNoZWQgZnJvbSB0aGUgY2Fyb3VzZWwgYW5kIGFwcGVuZGVkXG4gICAgIHRvIDxib2R5PiBzbyBwb3NpdGlvbjpmaXhlZCBpcyB2aWV3cG9ydC1yZWxhdGl2ZSBhbmQgei1pbmRleCBzaXRzXG4gICAgIGFib3ZlIHRoZSBoZWFkZXIgKDEwMDApIGluIHRoZSByb290IHN0YWNraW5nIGNvbnRleHQuXG4gICAgIFRoZSBwb3J0YWwga2VlcHMgLndoYXQtd2Utc2hpcC1wYXJlbnQgc28gYWxsIGlubmVyIHNlbGVjdG9ycyBhcHBseS5cbiAgICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovXG4gIC5zaGlwLW1vYmlsZS1wb3J0YWwge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB3aWR0aDogMTAwdnc7XG4gICAgaGVpZ2h0OiAxMDBkdmg7XG4gICAgei1pbmRleDogMTAwMTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcblxuICAgIC8qIHBhbi15LCBub3Qgbm9uZS4gdG91Y2gtYWN0aW9uIGlzIGV2YWx1YXRlZCBhY3Jvc3MgdGhlIHdob2xlIGFuY2VzdG9yXG4gICAgICAgY2hhaW4sIHNvIGBub25lYCBoZXJlIGFsc28ga2lsbGVkIHRvdWNoIHNjcm9sbGluZyBpbnNpZGVcbiAgICAgICAuc2hpcC1jb250ZW50LWV4cGFuZGVkIOKAlCB0aGUgV2hhdC9XaHkvSG93IGNvcHkgd2FzIHVucmVhY2hhYmxlIG9uIGFcbiAgICAgICBwaG9uZS4gVmVydGljYWwgcGFubmluZyBpcyBhbGxvd2VkIGFuZCBjb250YWluZWQgYnkgb3ZlcnNjcm9sbC1iZWhhdmlvclxuICAgICAgIGJlbG93OyBob3Jpem9udGFsIHN3aXBlcyBzdGF5IGJsb2NrZWQgc28gdGhlIGdlc3R1cmUgY2FuJ3QgcmVhY2ggdGhlXG4gICAgICAgY2Fyb3VzZWwgdW5kZXJuZWF0aC4gKi9cbiAgICB0b3VjaC1hY3Rpb246IHBhbi15O1xuICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IG5vbmU7XG4gIH1cblxuICAuc2hpcC1tb2JpbGUtcG9ydGFsOmhhcyguc2hpcC1zbGlkZS5leHBhbmRlZCkge1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICB9XG5cbiAgLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICAgIEVYUEFOREVEIFBPUFVQICAodHdvLXNlY3Rpb24gbGF5b3V0KVxuICAgICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgICAgVE9QICA0MiUg4oCUIHZpZGVvIGJnICsgaGVhZGluZywgbm8gc2Nyb2xsXG4gICAgIEJPVCAgNTglIOKAlCBncmFkaWVudCArIFdoYXQvV2h5L0hvdyB0ZXh0LCBzY3JvbGxhYmxlIGludGVybmFsbHlcbiAgICAgw5cgY2xvc2UgYnV0dG9uIGlzIGFic29sdXRlbHkgcG9zaXRpb25lZCBpbnNpZGUgLnNoaXAtc2xpZGUtY29udGVudFxuICAgICAod2hpY2ggaXMgcG9zaXRpb246cmVsYXRpdmUpIHNvIGl0IHNpdHMgQUJPVkUgdGhlIHNjcm9sbCBhcmVhIGFuZFxuICAgICBuZXZlciBtb3ZlcyB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgdGhlIHRleHQuXG4gICAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuXG4gIC8qIFBvcHVwOiBmdWxsIHNjcmVlbiwgTk8gb3V0ZXIgc2Nyb2xsICovXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmV4cGFuZGVkIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMHZ3O1xuICAgIGhlaWdodDogMTAwZHZoO1xuICAgIHotaW5kZXg6IDEwMTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcbiAgICBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgYmFja2dyb3VuZDogIzIwMjEyYTtcbiAgICB0cmFuc2l0aW9uOiBub25lO1xuICB9XG5cbiAgLyogVmlkZW86IGJlaGluZCBzaGlwLWNvbnRlbnQtbGVmdCAoMTYycHgpLCBjZW50ZXJlZCAqL1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC12aWRlby1iZyB7XG4gICAgaGVpZ2h0OiAxNjJweDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgb2JqZWN0LWZpdDogY292ZXI7XG4gICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xuICAgIHotaW5kZXg6IDA7XG4gIH1cblxuICAvKiBHcmFkaWVudDogbGlnaHQgdGludCBhdCB0b3AgKGhlYWRpbmcgc3RheXMgcmVhZGFibGUgb3ZlciB2aWRlbyksXG4gICAgIHNvbGlkIGNvbG91ciBmcm9tIH4zMCUgZG93biAoY292ZXJzIHRoZSBzY3JvbGxhYmxlIHRleHQgc2VjdGlvbikgKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtZXhwYW5kZWQtb3ZlcmxheSB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgIC0xMDYuMWRlZyxcbiAgICAgICM0NjJmODIgLS4zMSUsXG4gICAgICAjYjU0MThiIDU2LjY3JSxcbiAgICAgICNmMTZmNTggOTMuMDQlXG4gICAgKTtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgLyogU2xpZGUgY29udGVudDogZnVsbC1oZWlnaHQgZmxleCBjb2x1bW4sIHBvc2l0aW9uZWQgc28gw5cgYnV0dG9uIGNhbiBhbmNob3IgaGVyZSAqL1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC1zbGlkZS1jb250ZW50IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtY29udGVudC1sZWZ0IHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG5cbiAgLyogVE9QIFNFQ1RJT04g4oCUIGZpeGVkIDE2MnB4LCB2aWRlbyBzaG93cyB0aHJvdWdoIHRoZSBvdmVybGF5IGJlaGluZCBpdCAqL1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC1jb250ZW50LWxlZnQge1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIGhlaWdodDogMTYycHg7XG4gICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAyNHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGN1cnNvcjogYXV0bztcbiAgfVxuXG4gIC8qIExvZ28gaGlkZGVuIGluIHBvcHVwICovXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmV4cGFuZGVkIC5zaGlwLWNsaWVudC1sb2dvIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtbWFpbi10ZXh0IHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtbWFpbi10ZXh0IGgzIHtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDIycHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxuXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmV4cGFuZGVkIC5zaGlwLXRhZ3Mge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAvKiBCT1RUT00gU0VDVElPTiDigJQgc2Nyb2xsYWJsZSB0ZXh0XG4gICAgIHBvc2l0aW9uOiBzdGF0aWMgZW5zdXJlcyAuc2hpcC1hcnJvdy1idG4ncyBhYnNvbHV0ZSByZWYgc2tpcHMgdGhpc1xuICAgICBhbmQgYW5jaG9ycyB0byAuc2hpcC1zbGlkZS1jb250ZW50IGluc3RlYWQgKi9cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtY29udGVudC1leHBhbmRlZCB7XG4gICAgZmxleDogMSAxIDA7XG4gICAgbWluLWhlaWdodDogMDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcblxuICAgIC8qIEtlZXBzIHRoZSBzd2lwZSBpbnNpZGUgdGhlIHBvcHVwOiB3aXRob3V0IGNvbnRhaW5tZW50LCByZWFjaGluZyBlaXRoZXJcbiAgICAgICBlbmQgb2YgdGhpcyBjb3B5IGNoYWlucyB0aGUgcmVtYWluaW5nIHNjcm9sbCB0byB0aGUgcGFnZSBiZWhpbmQsIHdoaWNoXG4gICAgICAgbW92ZXMgdGhlIHBpbm5lZCBXaGF0LXdlLXNoaXAgZm9sZCB3aGlsZSB0aGUgcG9wdXAgaGlkZXMgaXQuICovXG4gICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDtcbiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogYXV0bztcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbiAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDIwcHggMjBweCA0MHB4O1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgLjZzO1xuICAgIG9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgLTEwNi4xZGVnLFxuICAgICAgIzQ2MmY4MiAtLjMxJSxcbiAgICAgICNiNTQxOGIgNTYuNjclLFxuICAgICAgI2YxNmY1OCA5My4wNCVcbiAgICApO1xuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtZXhwYW5kZWQtb3ZlcmxheSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLWNvbnRlbnQtZXhwYW5kZWQge1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgLjZzO1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cblxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC1jb2wtbWlkZGxlLFxuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC1jb2wtcmlnaHQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgcG9zaXRpb246IHN0YXRpYztcbiAgfVxuXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXNsaWRlLmV4cGFuZGVkIC5zaGlwLWRldGFpbC1zZWN0aW9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICB9XG5cbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtc2xpZGUuZXhwYW5kZWQgLnNoaXAtZGV0YWlsLXNlY3Rpb24gaDQge1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIH1cblxuICAvKiBBcnJvdyBidXR0b246IHNob3cgaW4gZXhwYW5kZWQgc3RhdGUgYXMgYSBwbGFpbiBhcnJvdyAoa2VlcCBuYXR1cmFsIHN0eWxlKSAqL1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC1hcnJvdy1idG4ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgbWFyZ2luLXRvcDogMTZweDtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgfVxuXG4gIC8qIE1vYmlsZSBjbG9zZSBidXR0b24g4oCUIHNob3duIG9ubHkgd2hlbiBzbGlkZSBpcyBleHBhbmRlZCAqL1xuICAud2hhdC13ZS1zaGlwLXBhcmVudCAuc2hpcC1zbGlkZS5leHBhbmRlZCAuc2hpcC1jbG9zZS1tb2JpbGUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBmbG9hdDogcmlnaHQ7XG4gICAgd2lkdGg6IDM2cHg7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMjU1LCAyNTUsIDI1NSwgLjM1KTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gIH1cbn1cblxuLyogU2hpcCBjYXJvdXNlbCDigJQgbW9iaWxlIGNlaWxpbmcgKyBhIGxvd2VyIGZsb29yLlxuICAgU2FtZSB2aWV3cG9ydCB0ZXJtIGFzIHRoZSDiiaQxMDIzcHggcnVsZSBhYm92ZTsgdGhlIGNhcCBkcm9wcyA1NDBweCDihpIgNDU3cHggYW5kXG4gICB0aGUgZmxvb3IgZHJvcHMgNDM1cHgg4oaSIDM4MHB4LiBUaGUgbG93ZXIgZmxvb3IgbWF0dGVycyBvbiBzaG9ydCBoYW5kc2V0c1xuICAgKHNtYWxsIGlQaG9uZXMsIGFuZCBhbnkgZGV2aWNlIG9uY2UgdGhlIGJyb3dzZXIgY2hyb21lIGlzIHNob3dpbmcpOiBhdCA0MzVweFxuICAgdGhlIGNhcmQgKyB0aXRsZSArIHRhYiBzdHJpcCB0b2dldGhlciBvdmVyZmxvd2VkIDEwMGR2aCBhbmQgdGhlIHRhYnMgZmVsbFxuICB1bmRlciB0aGUgYm90dG9tIHRvb2xiYXIuIDM4MHB4IGxldHMgdGhlIGNhcmQgZ2l2ZSB1cCBzb21lIGhlaWdodCBzbyB0aGUgd2hvbGVcbiAgIGZvbGQgc3RheXMgb24gc2NyZWVuIHdoaWxlIGtlZXBpbmcgdGhlIGxhc3Qgc2xpZGUgZnJvbSBiZWluZyBjdXQgb2ZmO1xuICAgYGNhbGMoMTAwc3ZoIC0gMjgwcHgpYCBpcyBzdGlsbCB3aGF0IHNpemVzIGl0IG9uIGFcbiAgIG5vcm1hbCBwaG9uZS4gU3BsaXQgYXQgNzY4Lzc2OSDigJQgdGhlIHBhZ2UncyBvbmUgbW9iaWxlL3RhYmxldCBib3VuZGFyeSDigJQgc29cbiAgIG5laXRoZXIgcmFuZ2UgY2xhaW1zIDc2OHB4IHR3aWNlLlxuICAgTXVzdCBzdGF5IEFGVEVSIHRoZSDiiaQxMDIzcHggYmxvY2sg4oCUIGl0IG92ZXJyaWRlcyBieSBzb3VyY2Ugb3JkZXIsIG5vdCBieVxuICAgc3BlY2lmaWNpdHksIHNpbmNlIGJvdGggc2VsZWN0b3JzIGFyZSBpZGVudGljYWwuICovXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgLndoYXQtd2Utc2hpcC1wYXJlbnQgLnNoaXAtY2Fyb3VzZWwtd3JhcHBlciB7XG4gICAgaGVpZ2h0OiBjbGFtcCgzODBweCwgY2FsYygxMDBzdmggLSAyODBweCksIDQ1N3B4KTtcbiAgfVxuXG4gIC8qIFRpZ2h0ZW4gdGhlIGdhcCBiZXR3ZWVuIHRoZSBjYXJkIGFuZCB0aGUgdGFiIHN0cmlwIG9uIHBob25lcyBvbmx5IOKAlFxuICAgICB0YWJsZXQga2VlcHMgdGhlIDE2cHggc2V0IGluIHRoZSDiiaQxMDI0cHggYmxvY2suICovXG4gIC53aGF0LXdlLXNoaXAtcGFyZW50IC5zaGlwLXRhYnMge1xuICAgIG1hcmdpbi10b3A6IDRweDtcbiAgfVxufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIDExLiBWaWRlbyBGb2xkXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiN2aWRlby1mb2xkIHtcbiAgYmFja2dyb3VuZDogIzJlMmYzNiB1cmwoXCIuLi8uLi9zdGF0aWMvYXNzZXRzL2ltYWdlcy9sYXRlc3QvZ3JhaW4ucG5nXCIpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxLjJzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKTtcbn1cblxuLyogU2FtZSBpT1MgZml4IC5zdG9yeS1wYXJlbnQgYW5kICN3aGF0LXdlLXNoaXAgYWxyZWFkeSBjYXJyeSDigJQgdGhpcyBmb2xkIHdhc1xuICAgdGhlIG9uZSBwaW5uZWQgc2VjdGlvbiBzdGlsbCBsZWZ0IG9uIHRoZSBiYXNlIC5mb2xkIGBoZWlnaHQ6IDEwMHZoYC4gT24gaU9TXG4gICAxMDB2aCByZXNvbHZlcyB0byB0aGUgTEFSR0Ugdmlld3BvcnQgKGFkZHJlc3MgYmFyIGhpZGRlbiksIHNvIG9uIGEgcGhvbmUgd2l0aFxuICAgdGhlIGJhciBzaG93aW5nIHRoZSBmb2xkIHJ1bnMgfjYwLTExMHB4IHRhbGxlciB0aGFuIHRoZSB2aXNpYmxlIGFyZWE7IHRoZVxuICAgdmlkZW8gKyB0ZXh0IGNlbnRyZWQgYnkgdGhlIGZsZXhib3ggYWJvdmUgdGhlbiBzaXQgdGhhdCBmYXIgb2ZmIHRoZSB2aXN1YWxcbiAgIGNlbnRyZSwgYW5kIG9uY2UgdGhlIGFkZHJlc3MgYmFyIGNvbGxhcHNlcyBtaWQtc2Nyb2xsIHRoZSBzdGFsZSBoZWlnaHQgbGVhdmVzXG4gICB0aGUgYmxvY2sgQUJPVkUgY2VudHJlIChcImRvZXMgbm90IHN0b3AgYXQgdGhlIGNlbnRyZVwiKS4gZHZoIHRyYWNrcyB0aGVcbiAgIGN1cnJlbnQgdmlld3BvcnQgc28gZmlyc3QgcGFpbnQgaXMgY2VudHJlZC4gTm8gIWltcG9ydGFudCDigJQgR1NBUCB3cml0ZXMgaXRzXG4gICBvd24gbWVhc3VyZWQgaGVpZ2h0IGlubGluZSBvbmNlIHRoZSBmb2xkIHBpbnMgYW5kIHRoYXQgbXVzdCBzdGlsbCB3aW47IHZoXG4gICBzdGF5cyBhcyB0aGUgZmFsbGJhY2sgZm9yIGJyb3dzZXJzIHdpdGhvdXQgZHZoLiAqL1xuI3ZpZGVvLWZvbGQge1xuICBoZWlnaHQ6IDEwMHZoO1xuICAvKiBzdHlsZWxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVjbGFyYXRpb24tYmxvY2stbm8tZHVwbGljYXRlLXByb3BlcnRpZXMgKi9cbiAgaGVpZ2h0OiAxMDBkdmg7XG59XG5cbiN2aWRlby1mb2xkOmhhcyhbZGF0YS1maW5hbF0pIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tYmctcHJpbWFyeSk7XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tbGF5b3V0LWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDYwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLyogV2l0aG91dCB0aGlzLCB0aGUgNjBweOKGkjAgZ2FwIGF0IHNsaWRlIDQgKGJlbG93KSBzbmFwcyBpbnN0YW50bHkgaW5zdGVhZFxuICAgICBvZiBlYXNpbmcg4oCUIHNpbmNlIGdhcCByZXBvc2l0aW9ucyBldmVyeSBncmlkL2ZsZXggdHJhY2ssIGFuIHVudHJhbnNpdGlvbmVkXG4gICAgIGp1bXAgaGVyZSBzaGlmdHMgdGhlIHZpZGVvIGJveCBhbmQgYm90aCB0ZXh0IGNvbHVtbnMgYWxsIGF0IG9uY2UuICovXG4gIHRyYW5zaXRpb246IGdhcCAxLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKTtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby10ZXh0LWxlZnQge1xuICBmbGV4OiAwIDEgYXV0bztcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgY29sb3I6ICNmZmY7XG5cbiAgLyogTWF0Y2hlcyB0aGUgMS41cyBwYWNlIG9mIC52aWRlby1ib3gtY29udGFpbmVyLy52aWRlby1ib3gvLnZpZGVvLXRleHQtcmlnaHRcbiAgICAgc28gdGhlIHNsaWRlIDPihpI0IHJldmVhbCBtb3ZlcyBhcyBvbmUgc3luY2hyb25pemVkIG1vdGlvbiDigJQgdGhpcyB1c2VkIHRvXG4gICAgIHJ1biBhdCAwLjY1cywgZmluaXNoaW5nIHdlbGwgYmVmb3JlIHRoZSB2aWRlbyBib3gsIHdoaWNoIHJlYWQgYXMgdGhlXG4gICAgIHRleHQgc25hcHBpbmcgYWhlYWQgd2hpbGUgdGhlIGJveCBrZXB0IGFuaW1hdGluZyBhcm91bmQgaXQuICovXG4gIHRyYW5zaXRpb246XG4gICAgdHJhbnNmb3JtIDEuNXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpLFxuICAgIG9wYWNpdHkgMS41cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSk7XG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIHotaW5kZXg6IDEwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxlZnQ6IDA7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTVweDtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IFtkYXRhLWZpbmFsXSAudmlkZW8tdGV4dC1sZWZ0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgzKTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgbWFyZ2luOiAwO1xuICB6LWluZGV4OiAyMDtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IFtkYXRhLWZpbmFsXSAudmlkZW8tdGV4dC1sZWZ0IC50ZXh0LXNsaWRlIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cblxuLyogVGhlIHNlY29uZCBcIldlXCIgYmVsb25ncyB0byB0aGUgbGFzdCB0ZXh0LXNsaWRlIGFuZCBpcyBmb3IgbW9iaWxlIG9ubHksIHdoZXJlXG4gICBzbGlkZSA0IGhpZGVzIHRoZSBzdGF0aWMgLndlLXRleHQtc3RhcnQgYW5kIHNob3dzIHRoaXMgb25lIGluIGl0cyBwbGFjZSAoc2VlXG4gICB0aGUg4omkNzY4cHggYmxvY2spLiBFdmVyeXdoZXJlIGVsc2UgdGhlIHN0YXRpYyBvbmUgc3VwcGxpZXMgdGhlIHdvcmQsIHNvIHRoaXNcbiAgIGNvcHkgbXVzdCBuZXZlciBzaG93LlxuICAgSXQgdXNlZCB0byBiZSBoaWRkZW4gb25seSBhdCBzbGlkZXMgMyBhbmQgNCwgd2hpY2ggbGVmdCBpdCBsaXZlIGF0IDAtMiDigJRcbiAgIHNjcm9sbGluZyBiYWNrIHVwIGRyb3BwZWQgdGhlIHN0YXRlIGludG8gdGhhdCByYW5nZSBhbmQgdGhlIGR1cGxpY2F0ZSBcIldlXCJcbiAgIGFwcGVhcmVkIGluIHRoZSBsYXN0IHNsaWRlIGFzIGl0IHRyYXZlbGxlZCB0aHJvdWdoIHRoZSB3aW5kb3cuIEhpZGluZyBpdFxuICAgdW5jb25kaXRpb25hbGx5IGlzIHdoYXQgdGhlIGRlc2t0b3AgbGF5b3V0IGFsd2F5cyB3YW50ZWQ7IG1vYmlsZSdzIHNsaWRlLTRcbiAgIHJ1bGUgY2FycmllcyBhbiBleHRyYSBhdHRyaWJ1dGUgc2VsZWN0b3IsIHNvIGl0IHN0aWxsIHdpbnMgd2hlcmUgaXQgYXBwbGllcy4gKi9cbi52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tdGV4dC1sZWZ0IC50ZXh0LXNsaWRlIC53ZS10ZXh0LWxhc3Qge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLXRleHQtbGVmdCBoMyB7XG4gIGZvbnQtc2l6ZTogMjhweDtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgbGluZS1oZWlnaHQ6IDM4cHg7XG4gIG1hcmdpbjogMDtcbiAgdHJhbnNpdGlvbjpcbiAgICB0cmFuc2Zvcm0gLjY1cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSksXG4gICAgb3BhY2l0eSAuNjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby10ZXh0LWxlZnQgLnRleHQtcmVkIHtcbiAgY29sb3I6IHZhcigtLWFjY2VudC1yZWQpO1xuICBtYXJnaW4tbGVmdDogOHB4O1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLXRleHQtbGVmdCAuc3RhdGljLXRleHQge1xuICB0cmFuc2l0aW9uOlxuICAgIG9wYWNpdHkgMS41cyxcbiAgICBjb2xvciAxLjVzLFxuICAgIHRyYW5zZm9ybSAxLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKTtcbn1cblxuLyogLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby10ZXh0LWxlZnQgLnN0YXRpYy10ZXh0LFxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IFtkYXRhLWZpbmFsXSAudmlkZW8tdGV4dC1sZWZ0IC5zdGF0aWMtdGV4dCB7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgIzJjNGNiNywgIzVhNDE5YSk7XG4gIGJhY2tncm91bmQtY2xpcDogdGV4dDtcbiAgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG59ICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC52aWRlby10ZXh0LWxlZnQgLnN0YXRpYy10ZXh0IHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTBweCwgMCk7XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAuc2Nyb2xsaW5nLXRpdGxlIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxuXG4vKiBUaGUgb25lLWxpbmUgd2luZG93IHRoZSBsZWZ0LWhhbmQgY29sdW1uIHNjcm9sbHMgdGhyb3VnaC5cbiAgIC0tdmYtbGluZS1oIGlzIHRoZSBzbG90IGhlaWdodCwgYW5kIGl0IE9XTlMgdGhpcyBmb2xkJ3MgdmVydGljYWwgcmh5dGhtOiB0aGVcbiAgIHdpbmRvdywgZXZlcnkgbGluZSdzIGJveCBhbmQgdGhlIHNjcm9sbGVyJ3MgdHJhdmVsIHBlciBzdGF0ZSBhbGwgZGVyaXZlIGZyb21cbiAgIGl0LiBUaGUgdmFsdWUgZGVjbGFyZWQgaGVyZSBpcyB0aGUgZGVza3RvcCBkZWZhdWx0LCBjb3JyZWN0IGZvciB0aGUgY29weSB0aGlzXG4gICBmb2xkIHNoaXBwZWQgd2l0aCAodHdvIGxpbmVzIGF0IDM4cHgpOyBtZWFzdXJlVmlkZW9MaW5lcygpIGluIGpzL2hvbWUuanNcbiAgIHJlcGxhY2VzIGl0IGlubGluZSB3aXRoIHRoZSB0YWxsZXN0IGxpbmUncyByZWFsIGhlaWdodCBvbmNlIGZvbnRzIGFyZSByZWFkeVxuICAgYW5kIGFnYWluIG9uIHJlc2l6ZS4gVGhhdCBpcyB3aGF0IGxldHMgZWRpdG9yaWFsIGNvcHkgcnVuIHRvIG9uZSwgdHdvIG9yXG4gICB0aHJlZSB2aXN1YWwgbGluZXMgd2l0aG91dCBhIHN0eWxlc2hlZXQgZWRpdCDigJQgYW5kIHdoeSBub3RoaW5nIGJlbG93IG1heVxuICAgaGFyZGNvZGUgYSBoZWlnaHQgYWdhaW4uXG4gICBEZWNsYXJlZCBvbiB0aGUgQ09OVEFJTkVSIHJhdGhlciB0aGFuIHRoZSB3cmFwcGVyIHNvIGJvdGggdGhlIHdpbmRvdyBhbmQgdGhlXG4gICBsaW5lcyBpbnNpZGUgaXQgY2FuIHJlYWQgdGhlIHNhbWUgdmFsdWUuICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnRleHQtc2Nyb2xsLWNvbnRhaW5lciB7XG4gIC0tdmYtbGluZS1oOiA3NnB4O1xuXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiB2YXIoLS12Zi1saW5lLWgpO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGNsaXAtcGF0aDogaW5zZXQoLTUwMCUgLTUwJSAwIC01MCUpO1xufVxuXG4vKiBUaGUgbGluZSBzY3JvbGxlciB1c2VkIHRvIGNhcnJ5IG9uZSBoYXJkY29kZWQgdHJhbnNsYXRlIHBlciBzdGF0ZSwgd2hpY2ggaXNcbiAgIHdoYXQgcGlubmVkIHRoaXMgZm9sZCB0byBleGFjdGx5IGZvdXIgbGluZXMuIEl0IG5vdyB0cmF2ZWxzIGJ5IE9ORSBsaW5lIHBpdGNoXG4gICBwZXIgc3RhdGU6XG5cbiAgICAgLS12Zi10ZXh0LXN0ZXAgICB0aGUgcGl0Y2gg4oCUIC50ZXh0LXNsaWRlJ3MgaGVpZ2h0IHBsdXMgdGhpcyB3cmFwcGVyJ3MgZ2FwLlxuICAgICAgICAgICAgICAgICAgICAgIFJlLWRlY2xhcmVkIGluIGV2ZXJ5IGJyZWFrcG9pbnQgdGhhdCBjaGFuZ2VzIGVpdGhlci5cbiAgICAgLS12Zi10ZXh0LWluZGV4ICB3aGljaCBsaW5lIGlzIGluIHRoZSB3aW5kb3cuIFdyaXR0ZW4gb24gI3ZpZGVvLWZvbGQgYnlcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJWaWRlb1N0YXRlKCkgaW4ganMvaG9tZS5qcy5cblxuICAgQWRkIG9yIHJlbW92ZSBhIC50ZXh0LXNsaWRlIGFuZCB0aGUgdHJhdmVsIGZvbGxvd3Mgb24gaXRzIG93bi4gVGhlIG9uZSB0aGluZ1xuICAgdG8ga2VlcCB0cnVlIGlzIHRoZSBwaXRjaDogaWYgY29weSBldmVyIHdyYXBzIHRvIGEgc2Vjb25kIHZpc3VhbCBsaW5lLCByYWlzZVxuICAgLnRleHQtc2xpZGUncyBoZWlnaHQgYW5kIHRoaXMgc3RlcCB0b2dldGhlci4gKi9cbi52aWRlby1mZWF0dXJlLXBhcmVudCAudGV4dC1zY3JvbGwtd3JhcHBlciB7XG4gIC0tdmYtbGluZS1nYXA6IDMwcHg7XG4gIC0tdmYtdGV4dC1zdGVwOiBjYWxjKHZhcigtLXZmLWxpbmUtaCkgKyB2YXIoLS12Zi1saW5lLWdhcCkpO1xuICAtLXZmLXRleHQtc2hpZnQ6IGNhbGModmFyKC0tdmYtdGV4dC1zdGVwKSAqIHZhcigtLXZmLXRleHQtaW5kZXgsIDApICogLTEpO1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogdmFyKC0tdmYtbGluZS1nYXApO1xuXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSh2YXIoLS12Zi10ZXh0LXNoaWZ0KSk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKTtcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbn1cblxuLyogRXZlcnkgbGluZSBvY2N1cGllcyBvbmUgdW5pZm9ybSBzbG90LCBzbyB0aGUgc2Nyb2xsZXIncyB0cmF2ZWwgaXMgb25lIHBpdGNoXG4gICBwZXIgc3RhdGUgd2hhdGV2ZXIgdGhlIGNvcHkgc2F5cy4gbGluZS1oZWlnaHQgc3RheXMgYSBkZXNpZ24gY2hvaWNlIHBlclxuICAgYnJlYWtwb2ludDsgdGhlIHNsb3QgaGVpZ2h0IGZvbGxvd3MgdGhlIGNvcHkuICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnRleHQtc2xpZGUge1xuICBoZWlnaHQ6IHZhcigtLXZmLWxpbmUtaCk7XG4gIGxpbmUtaGVpZ2h0OiAzOHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC42NXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpO1xufVxuXG4vKiBNZWFzdXJlbWVudCBwYXNzIG9ubHkg4oCUIGpzL2hvbWUuanMgYWRkcyAuaXMtbWVhc3VyaW5nLWxpbmVzIHRvICN2aWRlby1mb2xkLFxuICAgcmVhZHMgZWFjaCBsaW5lJ3MgbmF0dXJhbCBoZWlnaHQsIGFuZCB0YWtlcyBpdCBvZmYgYWdhaW4gaW5zaWRlIHRoZSBzYW1lXG4gICB0YXNrLCBzbyBubyBmcmFtZSBpcyBldmVyIHBhaW50ZWQgaW4gdGhpcyBzdGF0ZS4gUmVsZWFzaW5nIHRoZSBzbG90IGhlaWdodCBpc1xuICAgdGhlIHdob2xlIHBvaW50OiBhIGxpbmUgcGlubmVkIHRvIC0tdmYtbGluZS1oIGNhbiBvbmx5IGV2ZXIgcmVwb3J0XG4gICAtLXZmLWxpbmUtaCBiYWNrLiAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50LmlzLW1lYXN1cmluZy1saW5lcyAudGV4dC1zbGlkZSB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLyogTGluZXMgYWxyZWFkeSBzY3JvbGxlZCBwYXN0LiBkYXRhLXBvcyBpcyB3cml0dGVuIHBlciBlbGVtZW50IGJ5XG4gICByZW5kZXJWaWRlb1N0YXRlKCkgaW4ganMvaG9tZS5qcyBhbmQgbWVhbnMgdGhlIHNhbWUgdGhpbmcgZXZlcnl3aGVyZSBpbiB0aGlzXG4gICBmb2xkOiAtMSBiZWhpbmQsIDAgdGhlIG9uZSBvbiBzaG93LCAxIHN0aWxsIHRvIGNvbWUuIE5vdGhpbmcgY291bnRzLiAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC50ZXh0LXNsaWRlW2RhdGEtcG9zPVwiLTFcIl0ge1xuICBvcGFjaXR5OiAuMztcbn1cblxuLyogVGhlIGNsb3Npbmcgc3RhdGUgZHJvcHMgdGhlbSBvdXQgZW50aXJlbHkg4oCUIG9ubHkgdGhlIGxhc3QgbGluZSBzdXJ2aXZlcyBpdC4gKi9cbi52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnRleHQtc2xpZGVbZGF0YS1wb3M9XCItMVwiXSB7XG4gIG9wYWNpdHk6IDA7XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnRleHQtc2Nyb2xsLXdyYXBwZXIge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMHB4LCB2YXIoLS12Zi10ZXh0LXNoaWZ0KSk7XG59XG5cbi8qIE91dGxpbmUgc3Ryb2tlIG9uIFwiY3JlYXRlXCIg4oCUIG9ubHkgd2hpbGUgc2xpZGUgNCAoXCIuLi5jcmVhdGUgd293IVwiKSBpcyBhY3RpdmUgKi9cbi52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLmdyYWRpZW50LXNoYWRvdyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IFtkYXRhLWZpbmFsXSAuZ3JhZGllbnQtc2hhZG93OjpiZWZvcmUge1xuICBjb250ZW50OiBhdHRyKGRhdGEtdGV4dCk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAtMTtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjMjg0Y2JhIDAlLCAjZWExYjNkIDcyLjg3JSk7XG4gIGJhY2tncm91bmQtY2xpcDogdGV4dDtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuICBmaWx0ZXI6IGJsdXIoMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKDFweCwgMXB4KTtcbiAgb3BhY2l0eTogLjk7XG59XG5cbi8qIEJveCBoZWlnaHQgaXMgdGllcmVkIOKAlCBzZWUgdGhlIHN0ZXBzIGJlbG93IC52aWRlby1ib3guIFRoaXMgYmFzZSB2YWx1ZSBpcyB0aGVcbiAgIOKJpTEwMjRweCB0aWVyOyB0aGUgdGFibGV0IGFuZCBtb2JpbGUgbWVkaWEgcXVlcmllcyBmdXJ0aGVyIGRvd24gb3ZlcnJpZGUgaXQuICovXG4udmlkZW8tYm94LWNvbnRhaW5lciB7XG4gIGZsZXg6IDAgMCA1MCU7XG4gIG1heC13aWR0aDogODAwcHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAzODBweDtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB0cmFuc2l0aW9uOlxuICAgIGZsZXggMS41cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSksXG4gICAgbWF4LXdpZHRoIDEuNXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpLFxuICAgIGhlaWdodCAxLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKSxcbiAgICB0cmFuc2Zvcm0gMS41cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSk7XG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tYm94LXdyYXBwZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1ib3gge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzgwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XG4gIGNsaXAtcGF0aDogcG9seWdvbihcbiAgICAyMHB4IDAsXG4gICAgMTAwJSAwLFxuICAgIDEwMCUgY2FsYygxMDAlIC0gMjBweCksXG4gICAgY2FsYygxMDAlIC0gMjBweCkgMTAwJSxcbiAgICAwIDEwMCUsXG4gICAgMCAyMHB4XG4gICk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBvcGFjaXR5OiAwO1xuXG4gIC8qIEVudHJhbmNlIGlzIGEgcHVyZSB0cmFuc2xhdGUgKCsgdGhlIG9wYWNpdHkgZmFkZSBiZWxvdykuIEl0IGRlbGliZXJhdGVseVxuICAgICBjYXJyaWVzIE5PIHNjYWxlLlxuICAgICBUaGUgY2VudHJlIHZpZGVvIGlzIGEgY3Jvc3Mtb3JpZ2luIFlvdVR1YmUgPGlmcmFtZT4sIHdoaWNoIHRoZSBicm93c2VyXG4gICAgIGFsd2F5cyBjb21wb3NpdGVzIG9uIGl0cyBvd24gc3VyZmFjZSwgYW5kIC0teXQtaW5mbGF0ZSBtYWtlcyB0aGF0IHN1cmZhY2VcbiAgICAgfjN4IHRhbGxlciB0aGFuIHRoZSB2aXNpYmxlIGJveC4gQSBgc2NhbGVgIG9uIHRoaXMgYW5jZXN0b3IgZm9yY2VzIHRoZVxuICAgICBicm93c2VyIHRvIHJlLXNhbXBsZSB0aGF0IG92ZXJzaXplZCBzdXJmYWNlIGV2ZXJ5IGZyYW1lIG9mIHRoZSB0cmFuc2l0aW9uXG4gICAgIChwZXIgQ2hyb21lJ3MgcmUtcmFzdGVyLW9uLXNjYWxlIGJlaGF2aW91ciksIGFuZCBpdHMgY2VudHJlIHRpbGUgYm91bmRhcnlcbiAgICAg4oCUIHRoZSB2aWRlbydzIHZlcnRpY2FsIG1pZGRsZSDigJQgc2hvd3MgYSAxLTJweCBzZWFtIGZvciB0aGUgbGVuZ3RoIG9mIHRoZVxuICAgICB0cmFuc2l0aW9uLCBnb25lIHRoZSBpbnN0YW50IHNjYWxlIHNldHRsZXMuIEEgdHJhbnNsYXRlIGRvZXMgbm90IHRyaWdnZXJcbiAgICAgdGhhdCByZS1zYW1wbGUuIERyb3BwaW5nIHRoZSBgc2NhbGUoLjkpIC0+IHNjYWxlKDEpYCBhY2NlbnQgKGl0IHdhcyBhIH4xMCVcbiAgICAgem9vbSwgYmFyZWx5IHJlYWRhYmxlIHVuZGVyIGEgZnVsbC12aWV3cG9ydCBzbGlkZSkgcmVtb3ZlcyB0aGUgc2VhbSBhdCBpdHNcbiAgICAgc291cmNlIHdpdGggbm8gY292ZXIsIG5vIGRlbGF5LCBhbmQgbm8gY2hhbmdlIHRvIHRpbWluZywgZWFzaW5nLCB0aGVcbiAgICAgc2xpZGUgZGlzdGFuY2UsIG9wYWNpdHksIGNsaXAtcGF0aCwgb3IgdGhlIGNsb3Npbmcgc3RhdGVzLlxuICAgICBLZWVwIGl0IHRyYW5zbGF0ZS1vbmx5IHVubGVzcyB0aGUgY3JvcCBzdG9wcyBuZWVkaW5nIGFuIG92ZXJzaXplZCBpZnJhbWUuICovXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTAwdmgsIDApO1xuXG4gIC8qIGNsaXAtcGF0aCArIHRyYW5zZm9ybSBzdGlsbCByYXN0ZXJpc2UgYSBmcmFtZSBhcGFydCBvbiB0aGUgY2hhbWZlcmVkIHRvcFxuICAgICBlZGdlIGR1cmluZyB0aGUgc2xpZGU7IGJhY2tmYWNlLXZpc2liaWxpdHkgcGlucyB0aGlzIHRvIGl0cyBvd24gc3RhYmxlXG4gICAgIGNvbXBvc2l0b3IgbGF5ZXIgc28gdGhlIHBhaW50ZWQgZWRnZSBhbmQgdGhlIGNsaXAgcG9seWdvbiBzdGF5IGluXG4gICAgIGxvY2tzdGVwICh3YXMgZmlyc3QgYWRkZWQgZm9yIHRoYXQgMXB4IGVkZ2Ugc2VhbSBvbiBmaXJzdCBlbnRyYW5jZSkuICovXG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG5cbiAgLyogT25lIHRyYW5zaXRpb24gZm9yIGJvdGggZGlyZWN0aW9ucyDigJQgdGhlIGFjdGl2ZSBhbmQgcGFzc2VkIHJ1bGVzIGRlY2xhcmVcbiAgICAgbm8gdHJhbnNpdGlvbiBvZiB0aGVpciBvd24sIHNvIGEgYm94IGFuaW1hdGVzIG9uIHRoaXMgd2hpY2hldmVyIHdheSB0aGVcbiAgICAgZm9sZCBpcyBiZWluZyBzY3JvbGxlZC5cblxuICAgICBlYXNlT3V0UXVhcnQgcmF0aGVyIHRoYW4gdGhlIGV4cG8tb3V0IHVzZWQgZWxzZXdoZXJlIG9uIHRoZSBwYWdlLiBTdGlsbCBhblxuICAgICBlYXNlLW91dCwgc28gdGhlIGJveCBhcnJpdmVzIHByb21wdGx5IOKAlCBpdCBoYXMgdG8sIHNlZSB0aGUgaGFuZG9mZiBub3RlIG9uXG4gICAgIHRoZSBwYXNzZWQtYm94IHJ1bGUg4oCUIGJ1dCBleHBvLW91dCB0aHJldyAzNzVweCBvZiB0aGUgOTAwcHggdHJhdmVsIGludG9cbiAgICAgdGhlIGZpcnN0IDEyMG1zIGFuZCB0aGF0IG9wZW5pbmcgd2hpcCBpcyB3aGF0IHJlYWQgYXMgdW5zbW9vdGguIFF1YXJ0XG4gICAgIG9wZW5zIGF0IDI1OHB4LCBqdXN0IHVuZGVyIGEgdGhpcmQgZ2VudGxlci5cblxuICAgICBUaGlzIGN1cnZlIGlzIGNob3NlbiBhZ2FpbnN0IGEgbWVhc3VyZWQgYnVkZ2V0LCBub3QgYnkgZmVlbC4gVGhlIGNvc3Qgb2ZcbiAgICAgYSBmbGF0dGVyIGN1cnZlIGlzIHRoZSB3aW5kb3cgd2hlcmUgdGhlIG91dGdvaW5nIGFuZCBpbmNvbWluZyBib3hlcyBhcmVcbiAgICAgYm90aCB2aXNpYmxlIGluIHRoZSBmb2xkIChub3RoaW5nIGNsaXBzIHRoZW0g4oCUIHNlZSB0aGUgcGFzc2VkLWJveCBub3RlKTpcblxuICAgICAgIGV4cG8tb3V0ICBsdW5nZSAzNzVweCAgIG92ZXJsYXAgMTgxbXMgICA8LSB3YXMgZmluZVxuICAgICAgIHF1aW50ICAgICBsdW5nZSAyOTdweCAgIG92ZXJsYXAgMjE4bXNcbiAgICAgICBxdWFydCAgICAgbHVuZ2UgMjU4cHggICBvdmVybGFwIDI2Nm1zICAgPC0gaGVyZVxuICAgICAgIGN1YmljICAgICBsdW5nZSAyMDBweCAgIG92ZXJsYXAgMzQxbXNcbiAgICAgICBxdWFkICAgICAgbHVuZ2UgMTM4cHggICBvdmVybGFwIDQ1NW1zXG4gICAgICAgKHRoZSBlYXNlSW5PdXRTaW5lIGF0dGVtcHQgdGhhdCB2aXNpYmx5IHNob3dlZCB0d28gdmlkZW9zOiB+Nzc4bXMpXG5cbiAgICAgQW55dGhpbmcgZmxhdHRlciB0aGFuIHF1YXJ0IHNwZW5kcyB0aGUgcmVtYWluaW5nIGJ1ZGdldCBmYXN0IGZvciB2ZXJ5XG4gICAgIGxpdHRsZSBleHRyYSBzbW9vdGhuZXNzLiBEdXJhdGlvbiBpcyB0aGUgb3RoZXIgbGV2ZXIgYW5kIGlzIGRlbGliZXJhdGVseVxuICAgICBOT1QgdXNlZDogaXQgc2NhbGVzIHRoZSBvdmVybGFwIHByb3BvcnRpb25hbGx5IEFORCByYWlzZXMgVklERU9fU1RBVEVfTVMsXG4gICAgIHdoaWNoIG1ha2VzIHRoZSBwYWNlZCB3YWxrIGZhbGwgZnVydGhlciBiZWhpbmQgYSBmYXN0IHNjcm9sbCB0aHJvdWdoIHRoZVxuICAgICArPTQwMCUgcGluIOKAlCB0aGF0IHNob3dzIHVwIGFzIHNuYXBwaW5nLCB3aGljaCByZWFkcyBhcyBsZXNzIHNtb290aCwgbm90XG4gICAgIG1vcmUuXG5cbiAgICAgb3BhY2l0eSBpcyBkZWxpYmVyYXRlbHkgU0hPUlRFUiB0aGFuIHRyYW5zZm9ybSDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtIHRoZVxuICAgICB3YXkgLnNoaXAtc2xpZGUgZG9lcy4gVGhpcyBmb2xkIHNob3dzIG9uZSB2aWRlbyBhdCBhIHRpbWUgaW4gYSBzaW5nbGVcbiAgICAgd2luZG93IGFuZCAudmlkZW8tYm94LWNvbnRhaW5lciBpcyBvdmVyZmxvdzp2aXNpYmxlLCBzbyBhIGJveCB0aGF0IGlzXG4gICAgIHN0aWxsIGZhZGluZyBpcyBhIGJveCB5b3UgY2FuIHNlZSB0aGUgb3V0Z29pbmcgb25lIHRocm91Z2guIFRoZSBzaG9ydCBmYWRlXG4gICAgIGlzIHdoYXQga2VlcHMgdGhlIGhhbmRvZmYgdG8gYSBzaW5nbGUgdmlzaWJsZSBib3guXG5cbiAgICAgMS41cyBtdXN0IHN0YXkgPD0gVklERU9fU1RBVEVfTVMgaW4ganMvaG9tZS5qcyAoMTU1MCksIHRoZSBob2xkIGJldHdlZW5cbiAgICAgc3RhdGVzIOKAlCBhbnl0aGluZyBsb25nZXIgaGFzIGl0cyB0YWlsIGN1dCBvZmYgYnkgdGhlIG5leHQgc3RlcCwgYW5kIGFueVxuICAgICBpbmNyZWFzZSBoZXJlIHNjYWxlcyB0aGUgb3ZlcmxhcCBhYm92ZSBwcm9wb3J0aW9uYWxseS4gKi9cbiAgdHJhbnNpdGlvbjpcbiAgICBvcGFjaXR5IC42cyBjdWJpYy1iZXppZXIoLjI1LCAxLCAuNSwgMSksXG4gICAgY2xpcC1wYXRoIDEuNXMgY3ViaWMtYmV6aWVyKC4yNSwgMSwgLjUsIDEpLFxuICAgIGhlaWdodCAxLjVzIGN1YmljLWJlemllciguMjUsIDEsIC41LCAxKSxcbiAgICB0cmFuc2Zvcm0gMS41cyBjdWJpYy1iZXppZXIoLjI1LCAxLCAuNSwgMSk7XG4gIHdpbGwtY2hhbmdlOiBvcGFjaXR5LCB0cmFuc2Zvcm07XG59XG5cbi8qIFN1cHByZXNzZXMgdGhlIHRyYW5zaXRpb25zIGFib3ZlIChhbmQgb24gLnJpZ2h0LXRleHQtc2xpZGUgLyAudGV4dC1zbGlkZSxcbiAgIGZ1cnRoZXIgZG93bikgZm9yIHRoZSBmb2xkJ3MgdmVyeSBmaXJzdCBwYWludCBhdCBwYWdlIGxvYWRcbiAgIChqcy9ob21lLXNtb290aGVlci0xLmpzKSDigJQgc2FtZSByZWFzb25pbmcgYW5kIHBhdHRlcm4gYXMgdGhlIHNoaXBcbiAgIGNhcm91c2VsJ3MgaXMtZmlyc3QtcGFpbnQgKHNlZSBpdHMgY29tbWVudCBpbiB0aGlzIGZpbGUpLiBPbmx5IHRoZSB0aHJlZVxuICAgZWxlbWVudHMgcmVuZGVyVmlkZW9TdGF0ZSgwKSBhY3R1YWxseSB0b3VjaGVzIGF0IHNldHVwOiAudmlkZW8tYm94LVxuICAgY29udGFpbmVyJ3Mgb3duIHRyYW5zaXRpb24gaXMgbmV2ZXIgdHJpZ2dlcmVkIGJ5IHRoYXQgY2FsbCwgc28gaXQgaXNcbiAgIGRlbGliZXJhdGVseSBsZWZ0IG91dCBoZXJlLiAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50LmlzLWZpcnN0LXBhaW50IC52aWRlby1ib3gsXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQuaXMtZmlyc3QtcGFpbnQgLnJpZ2h0LXRleHQtc2xpZGUsXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQuaXMtZmlyc3QtcGFpbnQgLnRleHQtc2xpZGUge1xuICB0cmFuc2l0aW9uOiBub25lO1xufVxuXG4vKiBIZWlnaHQgdGllcnMuIFRoZSBib3ggYW5kIGl0cyBjb250YWluZXIgYXJlIGFsd2F5cyB0aGUgc2FtZSBoZWlnaHQg4oCUIHRoZVxuICAgY29udGFpbmVyIHJlc2VydmVzIHRoZSBzcGFjZSBpbiB0aGUgZ3JpZCB0cmFjaywgdGhlIGJveCBwYWludHMgaW5zaWRlIGl0LCBhbmRcbiAgIGEgbWlzbWF0Y2ggd291bGQgbGV0IHRoZSBjbGlwLXBhdGggY2hhbWZlciBkcmlmdCBvZmYgdGhlIHJlc2VydmVkIGFyZWEuXG4gICDiiaUxMDI0cHggMzgwcHggKHRoZSBiYXNlIHJ1bGUgYWJvdmUpIMK3IOKJpTEyMDBweCA0NTBweCDCtyDiiaUxNDAwcHggNTE1cHguXG4gICBLZXB0IGFoZWFkIG9mIHRoZSBbZGF0YS1maW5hbF0gb3ZlcnJpZGVzIGZ1cnRoZXIgZG93biwgd2hpY2ggYXJlIG1vcmVcbiAgIHNwZWNpZmljIGFuZCBzbyBzdGlsbCB3aW4gd2hlbiB0aGUgZm9sZCByZWFjaGVzIGl0cyBjbG9zaW5nIHN0YXRlLiAqL1xuQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkge1xuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLWJveC1jb250YWluZXIsXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tYm94IHtcbiAgICBoZWlnaHQ6IDQ1MHB4O1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiAxNDAwcHgpIHtcbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1ib3gtY29udGFpbmVyLFxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLWJveCB7XG4gICAgaGVpZ2h0OiA1MTVweDtcbiAgfVxufVxuXG4vKiA4LXBvaW50ICUtb25seSBjbGlwLXBhdGggc28gdGhpcyBib3ggaGFzIGEgdmVydGV4LW1hdGNoZWQgc2hhcGUgdG8gbW9ycGhcbiAgIGZyb20gaW4gdGhlIGNsb3Npbmcgc3RhdGUg4oCUIGJyb3dzZXJzIGNhbid0IHNtb290aGx5IGludGVycG9sYXRlXG4gICBwb2x5Z29uKCkgYmV0d2VlbiBtaXNtYXRjaGVkIHZlcnRleCBjb3VudHMvdW5pdHMsIHRoZXkgc25hcCBpbnN0ZWFkLlxuICAgU2NvcGVkIHRvIGRlc2t0b3AgKD49MTAyNHB4KSBvbmx5IOKAlCB0YWJsZXQvbW9iaWxlIGhhdmUgdGhlaXIgb3duIGNoYW1mZXJcbiAgIHNpemUgKDM2cHggLyAyOHB4KSBkZWZpbmVkIGZ1cnRoZXIgZG93biBhbmQgbXVzdCBub3QgaW5oZXJpdCB0aGlzIG9uZS4gKi9cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI1cHgpIHtcbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1ib3g6bGFzdC1jaGlsZCB7XG4gICAgY2xpcC1wYXRoOiBwb2x5Z29uKDMlIDAsIDUwJSAwLCAxMDAlIDAsIDEwMCUgOTYlLCA5NyUgMTAwJSwgNTAlIDEwMCUsIDAgMTAwJSwgMCA0JSk7XG4gIH1cbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IFtkYXRhLWZpbmFsXSAudmlkZW8tYm94Omxhc3QtY2hpbGQge1xuICBhc3BlY3QtcmF0aW86IGF1dG87XG4gIGNsaXAtcGF0aDogcG9seWdvbihcbiAgICAyNiUgMCxcbiAgICA4OCUgMCxcbiAgICAxMDAlIDAsXG4gICAgODElIDkxJSxcbiAgICA3MyUgMTAwJSxcbiAgICA2JSAxMDAlLFxuICAgIDAgMTAwJSxcbiAgICAxOCUgOSVcbiAgKTtcbn1cblxuLyogQWN0aXZlIGJveCDigJQgZnVsbHkgaW4gdmlldy4gVGhlIGxhc3QgYm94IGhvbGRzIHRocm91Z2ggdGhlIHR3byBjbG9zaW5nXG4gICBzdGF0ZXM7IHJlbmRlclZpZGVvU3RhdGUoKSBjbGFtcHMgZm9yIHRoYXQsIHNvIG5vdGhpbmcgaGVyZSBoYXMgdG8ga25vdyBob3dcbiAgIG1hbnkgYm94ZXMgdGhlIG1hcmt1cCBzaGlwcy5cblxuICAgVGhlIDpub3QoW2RhdGEtcG9zXSkgaGFsZiBpcyB0aGUgRklSU1QgUEFJTlQsIGJlZm9yZSByZW5kZXJWaWRlb1N0YXRlKCkgaGFzXG4gICBzdGFtcGVkIGFueXRoaW5nLiBFdmVyeSAudmlkZW8tYm94IGlzIGF1dGhvcmVkIGlkZW50aWNhbGx5IOKAlCB0aGUgbWFya3VwIGhlcmVcbiAgIGlzIGdlbmVyYXRlZCBieSBvbmUgbG9vcCBvdmVyIHRoZSBpdGVtcywgc28gaXQgY2Fubm90IGNhcnJ5IGEgcGVyLWl0ZW1cbiAgIHN0YXJ0aW5nIGF0dHJpYnV0ZSDigJQgYW5kIHRoZSBiYXNlIHJ1bGUgYmVsb3cgcGFya3MgYW4gdW5zdGFtcGVkIGJveCBvZmZcbiAgIHNjcmVlbi4gV2l0aG91dCB0aGlzIHRoZSBvcGVuaW5nIHZpZGVvIHdvdWxkIGJlIGludmlzaWJsZSB1bnRpbCBET00tcmVhZHkgYW5kXG4gICB3b3VsZCB0aGVuIHNsaWRlIHVwIGZyb20gYSB2aWV3cG9ydCBiZWxvdyBvbiBsb2FkLiA6Zmlyc3QtY2hpbGQgc2F5cyBcInRoZVxuICAgaXRlbSB0aGUgc2VxdWVuY2Ugb3BlbnMgb25cIiBpbiBwdXJlIHBvc2l0aW9uIHRlcm1zLCB3aGljaCBpcyB0cnVlIHdoYXRldmVyXG4gICB0aGUgbG9vcCBlbWl0cywgYW5kIGl0IHN0b3BzIG1hdGNoaW5nIHRoZSBtb21lbnQgSlMgc3RhbXBzIGRhdGEtcG9zLiBCb3RoXG4gICBoYWx2ZXMgcmVzb2x2ZSB0byB0aGUgc2FtZSB2YWx1ZXMsIHNvIHRoZSBoYW5kb3ZlciBpcyBub3QgYSB0cmFuc2l0aW9uLiAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1ib3hbZGF0YS1wb3M9XCIwXCJdLFxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1ib3g6Zmlyc3QtY2hpbGQ6bm90KFtkYXRhLXBvc10pIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbn1cblxuLyogUGFzc2VkIGJveGVzIOKAlCBzbGlkZSBvdXQgYWJvdmUsIG5vIG9wYWNpdHkgY2hhbmdlLlxuICAgQm94ZXMgc3RpbGwgd2FpdGluZyBrZWVwIC52aWRlby1ib3gncyBvd24gcmVzdGluZyBzdGF0ZSAocGFya2VkIGEgdmlld3BvcnRcbiAgIGJlbG93IGF0IG9wYWNpdHkgMCksIHNvIHRoZXJlIGlzIG5vIHRoaXJkIHJ1bGUgdG8gd3JpdGUuICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLWJveFtkYXRhLXBvcz1cIi0xXCJdIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCBjYWxjKC0xMDB2aCAtIDkwcHgpLCAwKTtcbn1cblxuLyogV0hZIFRIRSBERVBBUlRJTkcgQk9YIElTIE5PVCBUVU5FRCBMSUtFIC5zaGlwLXNsaWRlJ3NcbiAgIFRoZSB0d28gbG9vayBsaWtlIHRoZSBzYW1lIHByb2JsZW0gYW5kIGFyZSBub3QuIFRoZSBzaGlwIGRlY2sgaXMgYSB2aXNpYmxlXG4gICBjYXJkIFNUQUNLLCBzbyBpdHMgZGVwYXJ0aW5nIGNhcmQgd2FzIGdpdmVuIGEgei1pbmRleCBhYm92ZSB0aGUgZGVjayBhbmQgYVxuICAgc3ltbWV0cmljIGN1cnZlIHRvIG1ha2UgaXRzIGV4aXQgbGVnaWJsZS4gRG9pbmcgZWl0aGVyIGhlcmUgc2hvd3MgdHdvIHZpZGVvc1xuICAgYXQgb25jZSwgYmVjYXVzZSB0aGlzIGZvbGQgaXMgYSBzaW5nbGUtd2luZG93IGhhbmRvZmYgYW5kXG4gICAudmlkZW8tYm94LWNvbnRhaW5lciBpcyBvdmVyZmxvdzp2aXNpYmxlIOKAlCBub3RoaW5nIGNsaXBzIGEgYm94IHRoYXQgaXMgc3RpbGxcbiAgIG9uIGl0cyB3YXkgb3V0LlxuXG4gICBUaGUgc2hhcmVkIGV4cG8tb3V0IGlzIHdoYXQga2VlcHMgdGhhdCBoYW5kb2ZmIGNsZWFuLiBNZWFzdXJlZCBvdmVyIHRoZVxuICAgfjk5MHB4IGV4aXQgYW5kIH45MDBweCBlbnRyeSB3aXRoIGEgNDUwcHggYm94OlxuICAgICBkZXBhcnRpbmcgY2xlYXJzIHRoZSBmcmFtZSAgMTM0bXNcbiAgICAgYXJyaXZpbmcgYmVjb21lcyB2aXNpYmxlICAgIDE1Mm1zICAgLT4gYW4gMThtcyBnYXAsIG9uZSBib3ggYXQgYSB0aW1lXG4gICBTd2FwcGluZyBpbiBlYXNlSW5PdXRTaW5lIChkZXBhcnRpbmcgdmlzaWJsZSB0byA3MDdtcykgYWdhaW5zdCBlYXNlT3V0Q3ViaWNcbiAgIChhcnJpdmluZyBmcm9tIDMxMG1zKSBvcGVucyB0aGF0IGludG8gfjQwMG1zIG9mIGJvdGggYm94ZXMgb24gc2NyZWVuLCBhbmRcbiAgIHN0cmV0Y2hpbmcgdGhlIDAuNnMgb3BhY2l0eSB0byBtYXRjaCB0aGUgdHJhbnNmb3JtIGxldHMgdGhlIG91dGdvaW5nIGJveFxuICAgc2hvdyBzdHJhaWdodCB0aHJvdWdoIHRoZSBpbmNvbWluZyBvbmUgb24gdG9wIG9mIHRoYXQuXG5cbiAgIFNvOiBsZWF2ZSB0aGUgY3VydmUsIHRoZSB6LWluZGV4IGFuZCB0aGUgb3BhY2l0eSBkdXJhdGlvbiBhbG9uZSB1bmxlc3MgdGhlXG4gICBjb250YWluZXIgc3RhcnRzIGNsaXBwaW5nLiBBbnkgY2hhbmdlIHRoYXQga2VlcHMgdGhlIG91dGdvaW5nIGJveCBvbiBzY3JlZW5cbiAgIGxvbmdlciBoYXMgdG8gYmUgcGFpZCBmb3IgYnkgY2xpcHBpbmcgaXQgc29tZXdoZXJlLCBub3QgYnkgZWFzaW5nLiAqL1xuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLmR1bW15LXZpZGVvIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcblxuICAvKiBjb250YWluIChub3QgY292ZXIpIHNvIHRoZSBmcmFtZSBuZXZlciBjcm9wcyB0aGUgdmlkZW8g4oCUIGFueSBsZXR0ZXJib3hpbmdcbiAgICAgc2hvd3MgdGhlIGJveCdzIG93biAjMDAwIGJhY2tncm91bmQgYXMgYSBmaXhlZCBibGFjayBib3JkZXIgaW5zdGVhZC4gKi9cbiAgb2JqZWN0LWZpdDogY29udGFpbjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHRyYW5zaXRpb246XG4gICAgd2lkdGggMS41cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSksXG4gICAgaGVpZ2h0IDEuNXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC52aWRlby1ib3g6bGFzdC1jaGlsZCAuZHVtbXktdmlkZW8ge1xuICBoZWlnaHQ6IDI1MHB4O1xuICB3aWR0aDogOTklO1xufVxuXG4vKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgIFlPVVRVQkUgUExBWUVSIOKAlCBjaHJvbWUtZnJlZSBlbWJlZFxuICAgWW91VHViZSBpZ25vcmVzIGNvbnRyb2xzPTAgZm9yIHBhcnRzIG9mIGl0cyBVSSAodGl0bGUgYmFyLCBzaGFyZS93YXRjaC1vbi1cbiAgIFlvdVR1YmUgb3ZlcmxheSwgYmlnIHBsYXkgYnV0dG9uLCBlbmQgY2FyZHMpLCBzbyB0aHJlZSBpbmRlcGVuZGVudCBsYXllcnNcbiAgIHN0YWNrIHVwIGluc3RlYWQgb2YgcmVseWluZyBvbiBlbWJlZCBwYXJhbXMgYWxvbmU6XG5cbiAgICAgLnl0LWZyYW1lICAgY3JvcHMgYW4gb3Zlci10YWxsIGlmcmFtZSDigJQgWW91VHViZSBhbmNob3JzIGl0cyB0aXRsZSBiYXIgYW5kXG4gICAgICAgICAgICAgICAgIGNvbnRyb2wgYmFyIHRvIHRoZSBwbGF5ZXIncyB0b3AvYm90dG9tIGVkZ2VzLCB3aGljaCBub3cgc2l0IGFcbiAgICAgICAgICAgICAgICAgZnVsbCBjb250YWluZXIgaGVpZ2h0IG91dHNpZGUgdGhlIHZpc2libGUgd2luZG93XG4gICAgIC55dC1wb3N0ZXIgIG9wYXF1ZSB1bnRpbCB0aGUgZmlyc3QgUExBWUlORyBldmVudCwgdGhlbiBsaWZ0ZWQgZm9yIGdvb2Qg4oCUXG4gICAgICAgICAgICAgICAgIGNvdmVycyB0aGUgdGh1bWJuYWlsLCB0aGUgYmlnIHBsYXkgYnV0dG9uIGFuZCB0aGUgYnVmZmVyaW5nXG4gICAgICAgICAgICAgICAgIHNwaW5uZXIsIGFuZCBub3RoaW5nIGFmdGVyIHRoYXQgKGEgcGF1c2Uga2VlcHMgaXRzIG93biBmcmFtZSlcbiAgICAgLnl0LXNoaWVsZCAgc3dhbGxvd3MgZXZlcnkgcG9pbnRlci90b3VjaCBldmVudCwgc28gdGhlIHBsYXllciBuZXZlciBzZWVzIGFcbiAgICAgICAgICAgICAgICAgaG92ZXIgYW5kIG5ldmVyIGZhZGVzIGl0cyB0aXRsZSAvIHNoYXJlIG92ZXJsYXkgaW5cblxuICAgQ29udHJvbCBiYXIgKC55dC1jb250cm9scykgaXMgaW5qZWN0ZWQgYnkganMveXQtdmlkZW8tZm9sZC5qcy5cbiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1wbGF5ZXItY29udGFpbmVyIHtcblxuICAvKiBDcm9wIGRlcHRoLCBhcyBhIG11bHRpcGxlIG9mIHRoZSB2aWRlbydzIG93biBoZWlnaHQuIFRoZSBpZnJhbWUgaXMgdGhpc1xuICAgICBtYW55IHRpbWVzIHRhbGxlciB0aGFuIHRoZSB2aWRlbyBpdCByZW5kZXJzLCBjZW50cmVkLCBzbyBZb3VUdWJlJ3MgY2hyb21lXG4gICAgIOKAlCB3aGljaCBpcyBhbmNob3JlZCB0byB0aGUgcGxheWVyJ3MgdG9wIGFuZCBib3R0b20gZWRnZXMg4oCUIGVuZHMgdXAgd2VsbFxuICAgICBvdXRzaWRlIHRoZSBib3guIDMgbGVhdmVzIGEgZnVsbCB2aWRlby1oZWlnaHQgbWFyZ2luIGFib3ZlIGFuZCBiZWxvdy5cbiAgICAgU2V0IHRvIDEgdG8gZGlzYWJsZSB0aGUgY3JvcCAodXNlZnVsIHdoZW4gaXNvbGF0aW5nIGEgcmVuZGVyaW5nIGlzc3VlKS4gKi9cbiAgLS15dC1pbmZsYXRlOiAzO1xuXG4gIC8qIExlZ2FjeSBmYWxsYmFjayB2YWx1ZXMsIHVzZWQgb25seSB3aGVyZSBjb250YWluZXIgcXVlcmllcyBhcmUgbWlzc2luZyAqL1xuICAtLXl0LWluZmxhdGUtcGN0OiAyMDAlO1xuICAtLXl0LW9mZnNldDogLTUwJTtcblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtZnJhbWUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLyogRmFsbGJhY2sgc2l6aW5nIGZvciBicm93c2VycyB3aXRob3V0IGNvbnRhaW5lciBxdWVyaWVzOiBhIGZ1bGwtd2lkdGggaWZyYW1lLFxuICAgaW5mbGF0ZWQgdmVydGljYWxseS4gQ29ycmVjdCB3aGVyZXZlciB0aGUgYm94IGlzIG5hcnJvd2VyIHRoYW4gMTY6OSAoYWxsXG4gICBkZXNrdG9wIHN0YXRlcyksIGNyb3BzIHRvcCBhbmQgYm90dG9tIHdoZXJlIGl0IGlzIHdpZGVyICh0YWJsZXQvbW9iaWxlKS5cbiAgICFpbXBvcnRhbnQgYmVhdHMgdGhlIGlubGluZSB3aWR0aC9oZWlnaHQgdGhlIFlUIEFQSSBpbmplY3RzIG9uIHRoZSBpZnJhbWUuICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXBsYXllci1jb250YWluZXIgaWZyYW1lIHtcbiAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gIHRvcDogdmFyKC0teXQtb2Zmc2V0KSAhaW1wb3J0YW50O1xuICBsZWZ0OiAwICFpbXBvcnRhbnQ7XG4gIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XG4gIGhlaWdodDogdmFyKC0teXQtaW5mbGF0ZS1wY3QpICFpbXBvcnRhbnQ7XG4gIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xuICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4vKiBDb250YWluLCBhdCBldmVyeSBicmVha3BvaW50LlxuICAgVGhlIGJveCBpcyBhIHdpZGUsIHNob3J0IHJlY3RhbmdsZSBiZWxvdyAxMDI0cHggKGUuZy4gNjkxeDI0MCBhdCB0YWJsZXQsIGZhclxuICAgd2lkZXIgdGhhbiAxNjo5KSwgc28gYSBmdWxsLXdpZHRoIGlmcmFtZSByZW5kZXJzIHRoZSB2aWRlbyB0YWxsZXIgdGhhbiB0aGVcbiAgIGJveCBhbmQgdGhlIG92ZXJmbG93IGNsaXBzIGl0IOKAlCB0aGUgXCJjb3ZlclwiIGNyb3AuIFNpemluZyB0aGUgaWZyYW1lIHRvIHRoZVxuICAgKmNvbnRhaW5lZCogMTY6OSB3aWR0aCBpbnN0ZWFkIG1ha2VzIHRoZSB2aWRlbyBoZWlnaHQtY29uc3RyYWluZWQgdGhlcmUsIHNvXG4gICB0aGUgd2hvbGUgZnJhbWUgaXMgYWx3YXlzIHZpc2libGUuXG5cbiAgIEFib3ZlIDEwMjRweCB0aGUgYm94IGlzIG5hcnJvd2VyIHRoYW4gMTY6OSwgbWluKCkgcGlja3MgMTAwY3F3IGFuZCB0aGUgcmVzdWx0XG4gICBpcyBpZGVudGljYWwgdG8gdGhlIGZhbGxiYWNrIOKAlCB0aGlzIGlzIG5vdCBhIGRlc2t0b3AgY2hhbmdlLlxuXG4gICBUaGUgaWZyYW1lIGlzIHN0aWxsIC0teXQtaW5mbGF0ZSB0aW1lcyB0YWxsZXIgdGhhbiB0aGUgdmlkZW8gaXQgcmVuZGVycywgc29cbiAgIHRoZSBjaHJvbWUgY3JvcCBzdXJ2aXZlczogdGhlIHZpZGVvIGxldHRlcmJveGVzIGluc2lkZSB0aGF0IHRhbGxlciBib3ggYW5kXG4gICBZb3VUdWJlJ3MgYmFycyBzaXQgb3V0c2lkZSB0aGUgY29udGFpbmVyLiAqL1xuQHN1cHBvcnRzIChjb250YWluZXItdHlwZTogc2l6ZSkge1xuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXBsYXllci1jb250YWluZXIge1xuICAgIGNvbnRhaW5lci10eXBlOiBzaXplO1xuICB9XG5cbiAgLyogLS15dC12aWRlby13IGlzIGRlY2xhcmVkIGhlcmUgcmF0aGVyIHRoYW4gb24gdGhlIGNvbnRhaW5lciBiZWNhdXNlIGNxIHVuaXRzXG4gICAgIHJlc29sdmUgYWdhaW5zdCB0aGUgbmVhcmVzdCAqYW5jZXN0b3IqIGNvbnRhaW5lciDigJQgYW4gZWxlbWVudCBjYW4ndCBxdWVyeVxuICAgICBpdHNlbGYuIERlY2xhcmVkIG9uIHRoZSBpZnJhbWUsIHRoZXkgcmVzb2x2ZSBhZ2FpbnN0IC55dC1wbGF5ZXItY29udGFpbmVyLlxuICAgICBJdCBpcyB0aGUgd2lkdGggb2YgdGhlIGxhcmdlc3QgMTY6OSB2aWRlbyB0aGF0IGZpdHMgdGhlIGJveCBpbiBib3RoIGF4ZXMuICovXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtcGxheWVyLWNvbnRhaW5lciBpZnJhbWUge1xuICAgIC0teXQtdmlkZW8tdzogbWluKDEwMGNxdywgY2FsYygxMDBjcWggKiAxNiAvIDkpKTtcblxuICAgIHRvcDogNTAlICFpbXBvcnRhbnQ7XG4gICAgbGVmdDogNTAlICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IHZhcigtLXl0LXZpZGVvLXcpICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiBjYWxjKHZhcigtLXl0LXZpZGVvLXcpICogOSAvIDE2ICogdmFyKC0teXQtaW5mbGF0ZSkpICFpbXBvcnRhbnQ7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgIWltcG9ydGFudDtcbiAgfVxuXG4gIC8qIENvdmVyLCBiZWxvdyAxMDI0cHguXG4gICAgIENvbnRhaW5pbmcgdGhlIHZpZGVvIGlzIHdoYXQgcHJvZHVjZWQgdGhlIGJsYWNrIHBpbGxhcnMgZG93biBib3RoIHNpZGVzXG4gICAgIGhlcmU6IHRoZSBib3ggaXMgYSB3aWRlLCBzaG9ydCByZWN0YW5nbGUgKHJvdWdobHkgODUweDI0MCBhdCB0YWJsZXQsXG4gICAgIDM5MHgyMjUgYXQgbW9iaWxlKSBhbmQgbWluKCkgcGlja3MgdGhlIGhlaWdodC1jb25zdHJhaW5lZCB3aWR0aCwgbGVhdmluZ1xuICAgICB0aGUgMTY6OSB2aWRlbyB0b28gbmFycm93IHRvIHJlYWNoIGVpdGhlciBlZGdlLlxuXG4gICAgIG1heCgpIHNpemVzIGl0IHRvIHRoZSAqY292ZXJpbmcqIHdpZHRoIGluc3RlYWQg4oCUIHRoZSB2aWRlbyBhbHdheXMgc3BhbnNcbiAgICAgdGhlIGZ1bGwgYm94IGFuZCB0aGUgc3VycGx1cyBoZWlnaHQgaXMgY2xpcHBlZCBieSAueXQtZnJhbWUsIHNvIHRoZSBib3hcbiAgICAgaXMgZmlsbGVkIGVkZ2UgdG8gZWRnZSB3aXRoIG5vIGJhcnMuIFRoZSBjaHJvbWUgY3JvcCBpcyB1bmFmZmVjdGVkOiB0aGVcbiAgICAgaWZyYW1lIGlzIHN0aWxsIC0teXQtaW5mbGF0ZSB0aW1lcyB0YWxsZXIgdGhhbiB0aGUgdmlkZW8gaXQgcmVuZGVycywgc29cbiAgICAgWW91VHViZSdzIHRpdGxlIGFuZCBjb250cm9sIGJhcnMgc3RheSBmYXIgb3V0c2lkZSB0aGUgdmlzaWJsZSB3aW5kb3cuICovXG4gIEBtZWRpYSAobWF4LXdpZHRoOiAxMDI0cHgpIHtcbiAgICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXBsYXllci1jb250YWluZXIgaWZyYW1lIHtcbiAgICAgIC0teXQtdmlkZW8tdzogbWF4KDEwMGNxdywgY2FsYygxMDBjcWggKiAxNiAvIDkpKTtcbiAgICB9XG4gIH1cbn1cblxuLyogUG9zdGVyIOKAlCBzZXQgYmFja2dyb3VuZC1pbWFnZSBpbmxpbmUgZm9yIGEgY3VzdG9tIHN0aWxsLCBvdGhlcndpc2UgZmxhdCBibGFja1xuICAgbWF0Y2hpbmcgLnZpZGVvLWJveCwgc28gdGhlcmUgaXMgbm8gdmlzaWJsZSB0cmFuc2l0aW9uIGF0IGxvYWQuXG5cbiAgIEl0IGNvdmVycyB0aGUgVU5TVEFSVEVEIHBsYXllciBvbmx5LiAuaGFzLXN0YXJ0ZWQgaXMgbGF0Y2hlZCBvbiBieVxuICAganMveXQtdmlkZW8tZm9sZC5qcyB0aGUgZmlyc3QgdGltZSB0aGUgcGxheWVyIHBhaW50cyBhIGZyYW1lIGFuZCBpcyBuZXZlclxuICAgcmVtb3ZlZCwgc28gdGhlIHBvc3RlciBsaWZ0cyBvbmNlIGFuZCBzdGF5cyBsaWZ0ZWQ6IGEgcGF1c2VkIHZpZGVvIHNob3dzIHRoZVxuICAgZnJhbWUgaXQgc3RvcHBlZCBvbiwgbm90IGEgYmxhY2sgcGFuZWwuIFVuY292ZXJpbmcgaXMgYSBzbG93IGZhZGU7IHRoZSBpbnN0YW50XG4gICBgdHJhbnNpdGlvbjogbm9uZWAgYmVsb3cgb25seSBnb3Zlcm5zIHRoZSBzdGF0ZSBpdCBvcGVucyBpbi4gKi9cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtcG9zdGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcbiAgei1pbmRleDogMjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuXG4gIC8qIGNvbnRhaW4sIHRvIG1hdGNoIGhvdyB0aGUgdmlkZW8gaXRzZWxmIGlzIGZpdHRlZCDigJQgYSBjb3ZlciBwb3N0ZXIgd291bGRcbiAgICAgY3JvcCB3aGVyZSB0aGUgdmlkZW8gZG9lc24ndCwgYW5kIHRoZSBzd2FwIHdvdWxkIHZpc2libHkganVtcCAqL1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zaXRpb246IG5vbmU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXBsYXllci1jb250YWluZXIuaXMtcGxheWluZyAueXQtcG9zdGVyLFxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1wbGF5ZXItY29udGFpbmVyLmhhcy1zdGFydGVkIC55dC1wb3N0ZXIge1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC40NXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpO1xufVxuXG4vKiBSZXN1bWUgY292ZXIg4oCUIGpzL3l0LXZpZGVvLWZvbGQuanMncyBjb3ZlckZvclJlc3VtZSgpL3VuY292ZXJSZXN1bWUoKS5cbiAgIFJlLW9wYXF1ZXMgdGhlIHBvc3RlciBmb3IgYSBzaG9ydCwgY2FwcGVkIHdpbmRvdyB3aGlsZSBhIHBsYXllciB0aGF0IGhhc1xuICAgYWxyZWFkeSBzdGFydGVkIGlzIHJlc3VtaW5nIGZyb20gYSBmdWxsIHN0b3AsIG1hc2tpbmcgdGhlIHRvcm4gZnJhbWUgYVxuICAgWW91VHViZSBlbWJlZCBjYW4gaGFuZCBiYWNrIGZvciBhbiBpbnN0YW50IHdoaWxlIGl0cyBkZWNvZGVyIGNhdGNoZXMgdXAuXG4gICBPbmUgY2xhc3MgbW9yZSBzcGVjaWZpYyB0aGFuIHRoZSBoYXMtc3RhcnRlZC9pcy1wbGF5aW5nIHJ1bGUgYWJvdmUgc28gaXRcbiAgIHdpbnMgZm9yIGV4YWN0bHkgYXMgbG9uZyBhcyAuaXMtcmVzdW1pbmcgaXMgcHJlc2VudDsgcmVtb3ZpbmcgdGhlIGNsYXNzXG4gICBmYWxscyBzdHJhaWdodCBiYWNrIHRvIHRoYXQgcnVsZSdzIG93biAuNDVzIGZhZGUsIHNvIHRoZSByZXZlYWwgaXMgYSBzb2Z0XG4gICBmYWRlLW91dCByYXRoZXIgdGhhbiBhIGhhcmQgY3V0LiB0cmFuc2l0aW9uOm5vbmUgaGVyZSBvbmx5IGdvdmVybnMgaG93IHRoZVxuICAgY292ZXIgc25hcHMgYmFjayBPTiDigJQgaXQgbXVzdCBiZSBpbnN0YW50LCBub3QgYSBmYWRlLWluIG9mIGJsYWNrIG92ZXIgdGhlXG4gICBsaXZlIHBpY3R1cmUuICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXBsYXllci1jb250YWluZXIuaXMtcmVzdW1pbmcgLnl0LXBvc3RlciB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zaXRpb246IG5vbmU7XG59XG5cbi8qIFNoaWVsZCDigJQgdHJhbnNwYXJlbnQgaGl0IHRhcmdldCBhYm92ZSB0aGUgaWZyYW1lICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXNoaWVsZCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIHotaW5kZXg6IDM7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLyog4pSA4pSA4pSAIElkbGUgcGxheSBiYWRnZSDigJQgc2hvd24gb25seSB3aGVuIGF1dG9wbGF5IGlzIGJsb2NrZWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICBEZWxpYmVyYXRlbHkgTk9UIHNob3duIG9uIGFuIG9yZGluYXJ5IHBhdXNlLiBUaGVyZSB0aGUgdmlkZW8ga2VlcHMgaXRzIG93blxuICAgZnJhbWUgKHRoZSBwb3N0ZXIgc3RheXMgbGlmdGVkIG9uY2UgLmhhcy1zdGFydGVkIGxhdGNoZXMpIGFuZCB0aGUgY29udHJvbCBiYXJcbiAgIGFscmVhZHkgY2FycmllcyBhIHBsYXkgYnV0dG9uLCBzbyBhIHNlY29uZCBvbmUgb24gdG9wIG9mIHRoZSBwaWN0dXJlIGlzIGp1c3RcbiAgIHNvbWV0aGluZyBpbiB0aGUgd2F5LlxuXG4gICBXaGF0IGlzIGxlZnQgaXMgdGhlIHN0YXRlIHRoYXQgZ2VudWluZWx5IHN0cmFuZHMgdGhlIHZpc2l0b3I6IGF1dG9wbGF5XG4gICByZWZ1c2VkIGJlZm9yZSBhIHNpbmdsZSBmcmFtZSB3YXMgcGFpbnRlZCwgd2hlcmUgdGhlIHBvc3RlciBpcyBzdGlsbCBhblxuICAgb3BhcXVlIGJsYWNrIHBhbmVsIGFuZCBub3RoaW5nIGVsc2Ugb24gc2NyZWVuIGNhbiBzdGFydCBwbGF5YmFjay4gT3ZlciB0aGF0XG4gICBwYW5lbCB0aGUgYmFkZ2UgaGFzIG5vdGhpbmcgdG8gY292ZXIsIHNvIGl0IGtlZXBzIGl0cyBvd24gbW9kZXN0IHNpemUg4oCUXG4gICBqcy95dC12aWRlby1mb2xkLmpzIGRlY2lkZXMgd2hlbiBpdCBhcHBlYXJzLiAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1pZGxlLXBsYXkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHotaW5kZXg6IDQ7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiA3MnB4O1xuICBoZWlnaHQ6IDcycHg7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBiYWNrZ3JvdW5kOiByZ2IoMjM0LCAyNywgNjEsIC45Mik7XG4gIGNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlKC44NSk7XG4gIHRyYW5zaXRpb246XG4gICAgb3BhY2l0eSAuNHMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpLFxuICAgIHRyYW5zZm9ybSAuNHMgY3ViaWMtYmV6aWVyKC4zNCwgMS41NiwgLjY0LCAxKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1wbGF5ZXItY29udGFpbmVyLmlzLWlkbGUgLnl0LWlkbGUtcGxheSB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgc2NhbGUoMSk7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LWlkbGUtcGxheSBzdmcge1xuICB3aWR0aDogMzBweDtcbiAgaGVpZ2h0OiAzMHB4O1xuICBtYXJnaW4tbGVmdDogM3B4O1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG59XG5cbi8qIOKUgOKUgOKUgCBDdXN0b20gY29udHJvbCBiYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LWNvbnRyb2xzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiA1O1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDEycHg7XG4gIHBhZGRpbmc6IDM0cHggMThweCAxNHB4O1xuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2IoMCwgMCwgMCwgLjc4KSwgcmdiKDAsIDAsIDAsIDApKTtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtYm9keSwgXCJGaWd0cmVlXCIsIHNhbnMtc2VyaWYpO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwMCUsIDApO1xuXG4gIC8qIFNsb3dlciBvbiB0aGUgd2F5IG91dCB0aGFuIG9uIHRoZSB3YXkgaW4g4oCUIGFuIGFicnVwdCBkaXNhcHBlYXJhbmNlIHJlYWRzXG4gICAgIGFzIGEgZ2xpdGNoLCB3aGlsZSBhIHNsb3cgYXJyaXZhbCByZWFkcyBhcyBsYWcuICovXG4gIHRyYW5zaXRpb246XG4gICAgb3BhY2l0eSAuNDVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKSxcbiAgICB0cmFuc2Zvcm0gLjQ1cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSk7XG4gIHdpbGwtY2hhbmdlOiBvcGFjaXR5LCB0cmFuc2Zvcm07XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4vKiBWaXNpYmlsaXR5IGlzIG93bmVkIGJ5IGpzL3l0LXZpZGVvLWZvbGQuanMsIG5vdCBieSA6aG92ZXIg4oCUIHRoZSBiYXIgaGFzIHRvXG4gICBmYWRlIG91dCBhZnRlciBhIHNwZWxsIG9mIGluYWN0aXZpdHkgZXZlbiB3aGlsZSB0aGUgcG9pbnRlciBpcyBzdGlsbCByZXN0aW5nXG4gICBvbiB0aGUgdmlkZW8sIGFuZCA6Zm9jdXMtd2l0aGluIHdvdWxkIHBpbiBpdCBvcGVuIGFmdGVyIGV2ZXJ5IGNsaWNrLiAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1wbGF5ZXItY29udGFpbmVyLmlzLWNvbnRyb2xzLXZpc2libGUgLnl0LWNvbnRyb2xzIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gIHRyYW5zaXRpb246XG4gICAgb3BhY2l0eSAuMjJzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKSxcbiAgICB0cmFuc2Zvcm0gLjIycyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSk7XG59XG5cbi8qIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uIG9wdHMgdGhlIGJ1dHRvbnMgb3V0IG9mIGRvdWJsZS10YXAtem9vbSBkZXRlY3Rpb24sXG4gICBzbyBhIHRhcCBkaXNwYXRjaGVzIGl0cyBjbGljayBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIGFmdGVyIHRoZSBicm93c2VyIGhhc1xuICAgd2FpdGVkIHRvIHNlZSB3aGV0aGVyIGEgc2Vjb25kIHRhcCBmb2xsb3dzLiAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1idG4sXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LWlkbGUtcGxheSB7XG4gIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LWJ0biB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gIGZsZXg6IDAgMCBhdXRvO1xuICB3aWR0aDogMzJweDtcbiAgaGVpZ2h0OiAzMnB4O1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQgLjI1cyBlYXNlLCB0cmFuc2Zvcm0gLjI1cyBjdWJpYy1iZXppZXIoLjM0LCAxLjU2LCAuNjQsIDEpO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LWJ0bjpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHJnYigyNTUsIDI1NSwgMjU1LCAuMTYpO1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuMDgpO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LWJ0biBzdmcge1xuICB3aWR0aDogMThweDtcbiAgaGVpZ2h0OiAxOHB4O1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LWJ0bjpmb2N1cy12aXNpYmxlLFxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1wcm9ncmVzczpmb2N1cy12aXNpYmxlLFxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1pZGxlLXBsYXk6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCAjZWExYjNkO1xuICBvdXRsaW5lLW9mZnNldDogM3B4O1xufVxuXG4vKiBQcm9ncmVzcyDigJQgMTZweCB0YWxsIGhpdCBhcmVhIHdpdGggYSA0cHggdmlzdWFsIHRyYWNrIGluc2lkZSAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1wcm9ncmVzcyB7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBoZWlnaHQ6IDE2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdG91Y2gtYWN0aW9uOiBub25lO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXByb2dyZXNzX190cmFjayB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogNHB4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJhY2tncm91bmQ6IHJnYigyNTUsIDI1NSwgMjU1LCAuMjgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0cmFuc2l0aW9uOiBoZWlnaHQgLjJzIGVhc2U7XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtcHJvZ3Jlc3M6aG92ZXIgLnl0LXByb2dyZXNzX190cmFjayxcbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtcHJvZ3Jlc3MuaXMtc2Vla2luZyAueXQtcHJvZ3Jlc3NfX3RyYWNrIHtcbiAgaGVpZ2h0OiA2cHg7XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtcHJvZ3Jlc3NfX2ZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICBiYWNrZ3JvdW5kOiAjZWExYjNkO1xuICB0cmFuc2Zvcm06IHNjYWxlWCgwKTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7XG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtdGltZSB7XG4gIGZsZXg6IDAgMCBhdXRvO1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDRweDtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgbGV0dGVyLXNwYWNpbmc6IC4wMmVtO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC10aW1lX19zZXAge1xuICBvcGFjaXR5OiAuNTU7XG59XG5cbi8qIEdsb2JhbCBhdWRpbyB3aWRnZXQg4oCUIGEgc2luZ2xlIGluc3RhbmNlIHRoYXQganMveXQtdmlkZW8tZm9sZC5qcyByZS1wYXJlbnRzXG4gICBpbnRvIHdoaWNoZXZlciBjb250cm9sIGJhciBpcyBvbiBzY3JlZW4uIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBwZXItdmlkZW9cbiAgIGNvcHkgb2YgaXQsIHNvIG11dGUgYW5kIHZvbHVtZSBjYW4gb25seSBldmVyIG1lYW4gb25lIHRoaW5nIGluIHRoaXMgc2VjdGlvbi4gKi9cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtYXVkaW8ge1xuICBmbGV4OiAwIDAgYXV0bztcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtdm9sdW1lIHtcbiAgZmxleDogMCAwIGF1dG87XG4gIHdpZHRoOiA3MnB4O1xuICBoZWlnaHQ6IDVweDtcbiAgYWNjZW50LWNvbG9yOiAjZWExYjNkO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qIEZ1bGxzY3JlZW4gYnV0dG9uIOKAlCBsYXN0IGl0ZW0gaW4gdGhlIGJhciwgYWZ0ZXIgdGhlIGF1ZGlvIHdpZGdldCAqL1xuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1idG4tLWZzIHtcbiAgbWFyZ2luLWxlZnQ6IDJweDtcbn1cblxuLyogVGhpcyBmb2xkJ3Mgd2hvbGUgbGF5b3V0IChjYXJkIGhlaWdodHMsIGNoYW1mZXIgc2l6ZXMsIHRoZSBlbnRyYW5jZS9leGl0XG4gICBhbmltYXRpb24pIGlzIGJ1aWx0IHBvcnRyYWl0LWZpcnN0IGJlbG93IDEwMjRweC4gRnVsbHNjcmVlbiBmb3JjZXNcbiAgIGxhbmRzY2FwZSBvbiBhIHRvdWNoIGRldmljZSwgd2hpY2ggZmlnaHRzIHRoYXQgbGF5b3V0IGRpcmVjdGx5IGFuZCwgb25cbiAgIEFuZHJvaWQsIHdhcyBjb25maXJtZWQgdG8gbGVhdmUgdGhlIGNhcm91c2VsIG9uIGEgZGlmZmVyZW50IHNsaWRlIHRoYW4gdGhlXG4gICBvbmUgdGhlIHZpc2l0b3Igd2FzIHdhdGNoaW5nIGFmdGVyIGNsb3NpbmcgZnVsbHNjcmVlbi4ganMveXQtdmlkZW8tZm9sZC5qc1xuICAgc3RpbGwgYnVpbGRzIHRoaXMgYnV0dG9uIHdoZW5ldmVyIHRoZSBGdWxsc2NyZWVuIEFQSSBpcyBhdmFpbGFibGUgKHNlZSBpdHNcbiAgIG93biBjb21tZW50IG9uIGZzQnRuKSDigJQgaXQncyBkaXNhYmxlZCBoZXJlIGluc3RlYWQgb2YgYXQgY29uc3RydWN0aW9uIHRpbWVcbiAgIHNwZWNpZmljYWxseSBzbyBpdCBzdGF5cyBsaXZlOiBhIGRlc2t0b3Agd2luZG93IHJlc2l6ZWQgbmFycm93ZXIgdGhhblxuICAgMTAyNHB4IG1pZC1zZXNzaW9uIGhpZGVzIGl0IGV4YWN0bHkgbGlrZSBhIHBob25lIGFsd2F5cyBkb2VzLCBhbmQgd2lkZW5pbmdcbiAgIGJhY2sgcGFzdCBpdCBicmluZ3MgaXQgc3RyYWlnaHQgYmFjaywgd2l0aCBubyByZWxvYWQgYW5kIG5vIGV4dHJhIEpTLiAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDEwMjRweCkge1xuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LWJ0bi0tZnMge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuLyog4pSA4pSA4pSAIEZ1bGxzY3JlZW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICBqcy95dC12aWRlby1mb2xkLmpzIGV4cGFuZHMgLnl0LXBsYXllci1jb250YWluZXIsIG5vdCB0aGUgaWZyYW1lLCBzbyB0aGVcbiAgIGNyb3AsIHRoZSBwb3N0ZXIsIHRoZSBzaGllbGQgYW5kIHRoZSBjb250cm9sIGJhciBhbGwgY29tZSB3aXRoIGl0LlxuXG4gICBUaGUgVUEgc3R5bGVzaGVldCdzIG93biA6ZnVsbHNjcmVlbiBydWxlcyAocG9zaXRpb246IGZpeGVkOyBpbnNldDogMCkgbG9zZSB0b1xuICAgYW55IGF1dGhvciBydWxlIHJlZ2FyZGxlc3Mgb2Ygc3BlY2lmaWNpdHksIGFuZCBgcG9zaXRpb246IHJlbGF0aXZlYCBhYm92ZSBpc1xuICAgZXhhY3RseSBzdWNoIGEgcnVsZSDigJQgc28gdGhlIGZ1bGxzY3JlZW4gZ2VvbWV0cnkgaGFzIHRvIGJlIHJlc3RhdGVkIGhlcmUgb3JcbiAgIHRoZSBlbGVtZW50IGV4cGFuZHMgdG8gbm90aGluZy4gVGhlIHByZWZpeGVkIHNlbGVjdG9yIGlzIGEgc2VwYXJhdGUgcnVsZSBvblxuICAgcHVycG9zZTogb25lIHVucmVjb2duaXNlZCBzZWxlY3RvciBpbnZhbGlkYXRlcyBhbiBlbnRpcmUgc2VsZWN0b3IgbGlzdC4gKi9cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtcGxheWVyLWNvbnRhaW5lcjpmdWxsc2NyZWVuIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLyogU2FmYXJpIGJlbG93IDE2LjQgb25seSB1bmRlcnN0YW5kcyB0aGUgcHJlZml4ZWQgc3BlbGxpbmcsIHNvIHRoZSBwcmVmaXggaXNcbiAgIGxvYWQtYmVhcmluZyBoZXJlIOKAlCBkcm9wcGluZyBpdCBsZWF2ZXMgdGhlIHNlbGVjdG9yIG1hdGNoaW5nIG5vdGhpbmcsIHNpbmNlXG4gICBcIjpmdWxsLXNjcmVlblwiIGlzIG5laXRoZXIgdGhlIHN0YW5kYXJkIG5hbWUgbm9yIHRoZSBXZWJLaXQgb25lLiAqL1xuLyogc3R5bGVsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlbGVjdG9yLW5vLXZlbmRvci1wcmVmaXggKi9cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtcGxheWVyLWNvbnRhaW5lcjotd2Via2l0LWZ1bGwtc2NyZWVuIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLyogQ29udHJvbHMgc2NhbGUgdXAgd2l0aCB0aGUgc3VyZmFjZSDigJQgdGhlIHNhbWUgYmFyIGF0IDE4cHggcGFkZGluZyByZWFkcyBhcyBhXG4gICBzbGl2ZXIgYWNyb3NzIGEgMjdcIiBzY3JlZW4uIFRoZSBjb250YWluZXIgcXVlcnkgdGhhdCBzaXplcyB0aGUgaWZyYW1lIG5lZWRzXG4gICBubyBjaGFuZ2U6IGl0IHJlc29sdmVzIGFnYWluc3QgdGhlIGVsZW1lbnQsIHdoaWNoIGlzIG5vdyB0aGUgdmlld3BvcnQuICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXBsYXllci1jb250YWluZXIuaXMtZnVsbHNjcmVlbiAueXQtY29udHJvbHMge1xuICBnYXA6IDE4cHg7XG4gIHBhZGRpbmc6IDY0cHggMzRweCAyNnB4O1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXBsYXllci1jb250YWluZXIuaXMtZnVsbHNjcmVlbiAueXQtYnRuIHtcbiAgd2lkdGg6IDQycHg7XG4gIGhlaWdodDogNDJweDtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1wbGF5ZXItY29udGFpbmVyLmlzLWZ1bGxzY3JlZW4gLnl0LWJ0biBzdmcge1xuICB3aWR0aDogMjRweDtcbiAgaGVpZ2h0OiAyNHB4O1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXBsYXllci1jb250YWluZXIuaXMtZnVsbHNjcmVlbiAueXQtcHJvZ3Jlc3NfX3RyYWNrIHtcbiAgaGVpZ2h0OiA1cHg7XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtcGxheWVyLWNvbnRhaW5lci5pcy1mdWxsc2NyZWVuIC55dC12b2x1bWUge1xuICB3aWR0aDogOTZweDtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1wbGF5ZXItY29udGFpbmVyLmlzLWZ1bGxzY3JlZW4gLnl0LXRpbWUge1xuICBmb250LXNpemU6IDE0cHg7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LWNvbnRyb2xzIHtcbiAgICBnYXA6IDhweDtcbiAgICBwYWRkaW5nOiAyOHB4IDEycHggMTBweDtcbiAgfVxuXG4gIC8qIFdpZGVyIGhpdCBhcmVhIGZvciBmaW5nZXJzIOKAlCB0aGUgaWNvbiBpbnNpZGUga2VlcHMgaXRzIHNpemUgKi9cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC1idG4ge1xuICAgIHdpZHRoOiA0MHB4O1xuICAgIGhlaWdodDogNDBweDtcbiAgfVxuXG4gIC8qIFZvbHVtZSBzbGlkZXIgaXMgcmVkdW5kYW50IG5leHQgdG8gdGhlIE9TIHZvbHVtZSBrZXlzIG9uIHRvdWNoIGRldmljZXMgKi9cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC55dC12b2x1bWUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnl0LXRpbWUge1xuICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAueXQtaWRsZS1wbGF5IHtcbiAgICB3aWR0aDogNThweDtcbiAgICBoZWlnaHQ6IDU4cHg7XG4gIH1cbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby10ZXh0LXJpZ2h0IHtcblxuICAvKiBUcmF2ZWwgZm9yIHRoZSBsaW5lIHRyYW5zaXRpb24gYmVsb3cuIEEgcGVyY2VudGFnZSBvZiBlYWNoIGxpbmUncyBPV05cbiAgICAgaGVpZ2h0LCBub3QgYSBwaXhlbCBkaXN0YW5jZSDigJQgdGhlIGxpbmVzIGFsbCBzdHJldGNoIHRvIHRoZSBzYW1lIGdyaWRcbiAgICAgY2VsbCwgc28gMTAwJSBpcyBleGFjdGx5IG9uZSBsaW5lLXNsb3QgYXQgZXZlcnkgYnJlYWtwb2ludCBhbmQgbm90aGluZ1xuICAgICBoYXMgdG8gYmUgcmUtdHVuZWQgd2hlbiB0aGUgY29weSBjaGFuZ2VzLiAqL1xuICAtLXJ0LXJpc2U6IDEwMCU7XG4gIGZsZXg6IDAgMSBhdXRvO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBjb2xvcjogI2QxZDFkNTtcbiAgdHJhbnNpdGlvbjpcbiAgICBvcGFjaXR5IDEuNXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpLFxuICAgIHdpZHRoIDEuNXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC52aWRlby10ZXh0LXJpZ2h0IHtcbiAgb3BhY2l0eTogMDtcbiAgd2lkdGg6IDA7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC5yaWdodC10ZXh0LW1hc2sge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi52aWRlby1mZWF0dXJlLXBhcmVudCAucmlnaHQtdGV4dC1jb250YWluZXIge1xuICBkaXNwbGF5OiBncmlkO1xuXG4gIC8qIE9uZSBleHBsaWNpdCBjb2x1bW4gcGlubmVkIHRvIHRoZSBtYXNrIHdpZHRoIOKAlCB0aGUgbGluZXMgd3JhcCBpbnNpZGUgdGhlXG4gICAgIHRleHQgY29sdW1uIGluc3RlYWQgb2YgdGhlIHRyYWNrIHdpZGVuaW5nIHRvIHRoZWlyIG1heC1jb250ZW50LiAqL1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpO1xufVxuXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnJpZ2h0LXRleHQtc2xpZGUge1xuXG4gIC8qIEV2ZXJ5IGxpbmUgaW4gdGhlIHNhbWUgY2VsbDogdGhlIHN0YWNrIGlzIHNlbGYtc2l6aW5nLiAqL1xuICBncmlkLWFyZWE6IDEgLyAxO1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjc7XG4gIG1hcmdpbjogMDtcblxuICAvKiBSZXN0IHN0YXRlID0gcGFya2VkIGEgZnVsbCBzbG90IGJlbG93LCB3YWl0aW5nIHRvIHNsaWRlIHVwIGludG8gcGxhY2UuICovXG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgdmFyKC0tcnQtcmlzZSksIDApO1xuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICB0cmFuc2l0aW9uOlxuICAgIHRyYW5zZm9ybSAxLjVzIGN1YmljLWJlemllciguMTYsIDEsIC4zLCAxKSxcbiAgICBvcGFjaXR5IDEuNXMgY3ViaWMtYmV6aWVyKC4xNiwgMSwgLjMsIDEpO1xufVxuXG4vKiBTYW1lIHBhaXJpbmcgYXMgdGhlIGFjdGl2ZSB2aWRlbyBib3ggYWJvdmU6IHRoZSBzdGFtcGVkIHN0YXRlLCBwbHVzIHRoZVxuICAgZmlyc3QtcGFpbnQgZmFsbGJhY2sgZm9yIG1hcmt1cCBhIGxvb3AgZW1pdHRlZCB3aXRob3V0IGEgc3RhcnRpbmcgcG9zaXRpb24uICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnJpZ2h0LXRleHQtc2xpZGVbZGF0YS1wb3M9XCIwXCJdLFxuLnZpZGVvLWZlYXR1cmUtcGFyZW50IC5yaWdodC10ZXh0LXNsaWRlOmZpcnN0LWNoaWxkOm5vdChbZGF0YS1wb3NdKSB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG59XG5cbi8qIExpbmVzIGFscmVhZHkgcmVhZCDigJQgc2xpZCBhIGZ1bGwgc2xvdCB1cCBhbmQgZmFkZWQgb3V0LCBzbyBzdGVwcGluZyBiYWNrXG4gICB1cCB0aGUgZm9sZCByZXZlcnNlcyB0aHJvdWdoIHRoZSBzYW1lIG1vdGlvbiBpbnN0ZWFkIG9mIGRyb3BwaW5nIGluIGZyb21cbiAgIGJlbG93LiBUaGUgb3ZlcmZsb3c6IGhpZGRlbiBvbiAudmlkZW8tdGV4dC1yaWdodCBpcyB3aGF0IGhpZGVzIHRoZSB0cmF2ZWxcbiAgIGluIGFuZCBvdXQgb2YgdGhlIHNsb3QuICovXG4udmlkZW8tZmVhdHVyZS1wYXJlbnQgLnJpZ2h0LXRleHQtc2xpZGVbZGF0YS1wb3M9XCItMVwiXSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgY2FsYyh2YXIoLS1ydC1yaXNlKSAqIC0xKSwgMCk7XG59XG5cbi8qIEV2ZXJ5IHN0YXRlIGV4Y2VwdCB0aGUgY2xvc2luZyBvbmUg4oCUIDpub3QoW2RhdGEtZmluYWxdKSByYXRoZXIgdGhhbiBuYW1pbmdcbiAgIHRoZW0sIHNvIHRoZSByb3cgbGF5b3V0IGhvbGRzIGhvd2V2ZXIgbG9uZyB0aGUgc2VxdWVuY2UgcnVucy4gKi9cbi52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tbGF5b3V0LWNvbnRhaW5lcjpub3QoW2RhdGEtZmluYWxdKSB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMjgwcHggMWZyIDIzNnB4O1xufVxuXG4vKiAxMDI0LTE0MDBweCDigJQgaGFuZCBzcGFjZSBiYWNrIHRvIHRoZSB2aWRlby5cbiAgIFRoZSBkZWZhdWx0IDI4MHB4IHRleHQgY29sdW1uIGFuZCA2MHB4IGdhcHMgdGFrZSA2MzZweCBvZiB0aGUgcm93IGJlZm9yZSB0aGVcbiAgIHZpZGVvIGdldHMgYW55LCB3aGljaCBhdCAxMDI0IGxlYXZlcyBpdHMgMWZyIHRyYWNrIGJhcmVseSAzMDBweCB3aWRlLiBBXG4gICBuYXJyb3dlciBsZWZ0IGNvbHVtbiBhbmQgdGlnaHRlciBnYXBzIGZyZWUgdGhhdCBzcGFjZSBmb3IgdGhlIHZpZGVvLCB3aXRob3V0XG4gICB0b3VjaGluZyB0aGUg4omlMTQwMHB4IHNpemVzIHdoZXJlIHRoZXJlIGlzIHJvb20gdG8gc3BhcmUuXG4gICBkaXNwbGF5OiBncmlkIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBydWxlIGFib3ZlIOKAlCBvbmx5IHRoZSB0cmFjayBzaXplcyBhbmRcbiAgIHRoZSBnYXAgZGlmZmVyIGhlcmUuICovXG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNXB4KSBhbmQgKG1heC13aWR0aDogMTQwMHB4KSB7XG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tbGF5b3V0LWNvbnRhaW5lcjpub3QoW2RhdGEtZmluYWxdKSB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyNTBweCAxZnIgMjM2cHg7XG4gIH1cbn1cblxuLyogR2FwIHN0ZXBzIGJhY2sgdXAgd2l0aCB0aGUgdmlld3BvcnQgYWNyb3NzIHRoYXQgcmFuZ2Ug4oCUIHRoZSB0aWdodGVyIHRoZSByb3csXG4gICB0aGUgbGVzcyBpdCBjYW4gc3BhcmUgYmV0d2VlbiBjb2x1bW5zLiBCb3RoIGJsb2NrcyB0YXJnZXQgdGhlIGNvbnRhaW5lclxuICAgaXRzZWxmIHJhdGhlciB0aGFuIHRoZSBsYXlvdXQgcnVsZXMgYWJvdmUsIGFuZCB0aGUgY2xvc2luZyBzdGF0ZSBrZWVwcyBpdHMgb3duXG4gICBnYXA6IDAgKG1vcmUgc3BlY2lmaWMpLCBzbyB0aGUgY2xvc2luZyBzdGF0ZSBzdGlsbCBjb2xsYXBzZXMgdGhlIHJvdy4gKi9cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI1cHgpIGFuZCAobWF4LXdpZHRoOiAxMTk5cHgpIHtcbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1sYXlvdXQtY29udGFpbmVyIHtcbiAgICBnYXA6IDIwcHg7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgYW5kIChtYXgtd2lkdGg6IDE0MDBweCkge1xuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLWxheW91dC1jb250YWluZXIge1xuICAgIGdhcDogMzBweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNXB4KSB7XG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0udmlkZW8tbGF5b3V0LWNvbnRhaW5lciB7XG4gICAgZ2FwOiAwO1xuICB9XG5cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1ib3gtY29udGFpbmVyIHtcbiAgICB0cmFuc2l0aW9uOiBub25lO1xuICB9XG5cbiAgLyogUmVhbCBmbGV4L21heC13aWR0aC9oZWlnaHQgcmVzaXplIChub3QgdHJhbnNmb3JtOnNjYWxlKSDigJQgdGhlIG1pZGRsZSBncmlkXG4gICAgIGNvbHVtbidzIGFjdHVhbCByZW5kZXJlZCB3aWR0aCB2YXJpZXMgd2l0aCB2aWV3cG9ydCAoaXQncyBhIDFmciB0cmFja1xuICAgICBjYXBwZWQgYXQgODAwcHgsIG5vdCBhIGZpeGVkIDgwMHB4KSwgc28gYSBzdGF0aWMgc2NhbGUgZmFjdG9yIGNvbXB1dGVkXG4gICAgIGZyb20gYW4gYXNzdW1lZCA4MDBweCBiYXNlIHByb2R1Y2VkIHRoZSB3cm9uZyBmaW5hbCBzaXplIG9uIG1vc3RcbiAgICAgdmlld3BvcnRzIChlLmcuIDI4N3B4IGluc3RlYWQgb2YgMzM4cHgpLCBjYXVzaW5nIHRoZSBvdmVybGF5IHRleHQgdG9cbiAgICAgdmlzaWJseSBvdmVyZmxvdyB0aGUgdmlkZW8uIFJlYWwgbWF4LXdpZHRoL2hlaWdodCBzdGF5cyBjb3JyZWN0IGF0IGFueVxuICAgICB2aWV3cG9ydCBhdCB0aGUgY29zdCBvZiBzb21lIGlmcmFtZSByZS1sYXlvdXQgY29zdCBkdXJpbmcgdGhlIHJlc2l6ZS4gKi9cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IFtkYXRhLWZpbmFsXSAudmlkZW8tYm94LWNvbnRhaW5lciB7XG4gICAgZmxleDogMCAwIDMzOHB4O1xuICAgIG1heC13aWR0aDogMzM4cHg7XG4gICAgaGVpZ2h0OiAyNjBweDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtNDJweCk7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC52aWRlby1ib3g6bGFzdC1jaGlsZCB7XG4gICAgaGVpZ2h0OiAyNjBweDtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnZpZGVvLWJveDpsYXN0LWNoaWxkIC5kdW1teS12aWRlbyB7XG4gICAgaGVpZ2h0OiAyNjBweDtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnRleHQtc2Nyb2xsLXdyYXBwZXIge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE5cHgsIGNhbGModmFyKC0tdmYtdGV4dC1zaGlmdCkgKyA0cHgpKTtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnZpZGVvLXRleHQtbGVmdCAuc3RhdGljLXRleHQge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE5cHgsIDRweCk7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC52aWRlby10ZXh0LWxlZnQgaDMge1xuICAgIGZvbnQtc2l6ZTogMjdweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7XG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tbGF5b3V0LWNvbnRhaW5lcjpub3QoW2RhdGEtZmluYWxdKSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gIC8qIGlPUzogaG9sZCB0aGUgbW92aW5nIGJveCArIGl0cyA8dmlkZW8+IG9uIHN0YWJsZSBHUFUgbGF5ZXJzIHRocm91Z2ggdGhlXG4gICAgIHN0YXRlIHRyYW5zaXRpb25zLCBzbyBTYWZhcmkgZG9lc24ndCBmbGFzaCB0aGUgd2hvbGUgZm9sZCBvbiBlYWNoIHN0ZXBcbiAgICAgKFwic2xpZGUgY2hhbmdlZCBidXQgdGhlIHBhZ2UgYmxpbmtzXCIpLiBTYW1lIGZpeCBhcyAuc2hpcC1zbGlkZS4gKi9cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1ib3gsXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAuZHVtbXktdmlkZW8sXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudGV4dC1zY3JvbGwtd3JhcHBlciB7XG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjlweCkgYW5kIChtYXgtd2lkdGg6IDEwMjRweCkge1xuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLWxheW91dC1jb250YWluZXIge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAzMHB4O1xuICB9XG5cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IFtkYXRhLWZpbmFsXSAudmlkZW8tdGV4dC1sZWZ0IHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNDQlLCAtNTglKSBzY2FsZSgzKTtcbiAgfVxuXG4gIC8qIExvY2tlZCB0byB0aGUgdmlkZW8ncyBvd24gMTY6OSByYXRpbyBhdCB0aGlzIGhlaWdodCAoMjQwICogMTYvOSA9IDQyNi42NylcbiAgICAgYW5kIGNlbnRyZWQsIHNvIHRoZSBwbGF5ZXIgZmlsbHMgdGhlIGJveCBleGFjdGx5IOKAlCBub3RoaW5nIHRvIGxldHRlcmJveFxuICAgICBhbmQgbm90aGluZyB0byBjcm9wLiBUaGUgOTAlIGNhcCBrZWVwcyBpdCBpbnNpZGUgdGhlIGd1dHRlcnMgb24gbmFycm93XG4gICAgIHRhYmxldHMuICovXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tYm94LWNvbnRhaW5lciB7XG4gICAgd2lkdGg6IG1pbig5MCUsIGNhbGMoMjQwcHggKiAxNiAvIDkpKTtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBoZWlnaHQ6IDI0MHB4O1xuICAgIG1hcmdpbi1pbmxpbmU6IGF1dG87XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLWJveCB7XG4gICAgaGVpZ2h0OiAyNDBweDtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tdGV4dC1sZWZ0LFxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLXRleHQtcmlnaHQge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC8qIE5vIG1hcmdpbi1sZWZ0IG51ZGdlIGhlcmUg4oCUIGl0IHBpbm5lZCB0aGUgY2xvc2luZyBjYXJkIHRvIHRoZSBsZWZ0IGVkZ2VcbiAgICAgd2hpbGUgZGVza3RvcCBhbmQgbW9iaWxlIGJvdGggY2VudHJlIHRoZWlycy4gYWxpZ24tc2VsZiBtYXRjaGVzIGhvdyB0aGVcbiAgICAgbW9iaWxlIHJ1bGUgYmVsb3cgY2VudHJlcyB0aGUgc2FtZSBjYXJkLiAqL1xuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC52aWRlby1ib3gtY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZmxleDogMCAwIDI0NXB4O1xuICAgIG1heC13aWR0aDogMzQwcHg7XG4gICAgaGVpZ2h0OiAyNDVweDtcbiAgICB0b3A6IDUwJTtcbiAgICBtYXJnaW4tdG9wOiAtMzhweDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC50ZXh0LXNjcm9sbC13cmFwcGVyIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMHB4LCBjYWxjKHZhcigtLXZmLXRleHQtc2hpZnQpICsgNHB4KSk7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC52aWRlby10ZXh0LWxlZnQgLnN0YXRpYy10ZXh0IHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCA0cHgpO1xuICB9XG5cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IFtkYXRhLWZpbmFsXSAuZ3JhZGllbnQtc2hhZG93IHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgUkVTUE9OU0lWRSDigJQgU2hpcCBGb2xkIChNb2JpbGUg4omkIDc2OHB4KVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcblxuICAvKiDilIDilIAgVmlkZW8gRmVhdHVyZSBGb2xkIOKUgOKUgCAqL1xuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLWxheW91dC1jb250YWluZXIge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAyNHB4O1xuICB9XG5cbiAgLyogU2FtZSAxNjo5IGxvY2sgYXMgdGFibGV0ICgyMjUgKiAxNi85ID0gNDAwKSwgY2FwcGVkIHRvIHRoZSBmdWxsIHdpZHRoIHNvIGl0XG4gICAgIG5ldmVyIG92ZXJmbG93cyBhIG5hcnJvdyBwaG9uZS4gKi9cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1ib3gtY29udGFpbmVyIHtcbiAgICB3aWR0aDogbWluKDEwMCUsIGNhbGMoMjI1cHggKiAxNiAvIDkpKTtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBoZWlnaHQ6IDIyNXB4O1xuICAgIG1hcmdpbi1pbmxpbmU6IGF1dG87XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLWJveCB7XG4gICAgaGVpZ2h0OiAyMjVweDtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tdGV4dC1sZWZ0IGgzIHtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDI4cHg7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLXRleHQtbGVmdCxcbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby10ZXh0LXJpZ2h0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tdGV4dC1sZWZ0IHtcbiAgICBtYXgtd2lkdGg6IDMyMHB4O1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnZpZGVvLXRleHQtcmlnaHQge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICAgIC8qIERyb3AgYHdpZHRoYCBmcm9tIHRoZSBlYXNlZCB0cmFuc2l0aW9uIG9uIHBob25lcy4gVGhlIGNsb3Npbmcgc3RhdGVcbiAgICAgICBjb2xsYXBzZXMgdGhpcyBjb2x1bW4gdG8gd2lkdGg6MCAoc25hcHBlZCDigJQgc2VlIFtkYXRhLWZpbmFsXSBiZWxvdyk7XG4gICAgICAgc2Nyb2xsaW5nIEJBQ0sgT1VUIHJlbW92ZXMgZGF0YS1maW5hbCBhbmQgdGhlIGJhc2UgYHdpZHRoIDEuNXNgIHRoZW5cbiAgICAgICBhbmltYXRlZCB0aGUgY29sdW1uIG9wZW4gZnJvbSAwIOKGkiAxMDAlLCByZS13cmFwcGluZyB0aGUgbGluZSBldmVyeVxuICAgICAgIGZyYW1lIOKAlCB0aGUgXCJ0ZXh0IGV4cGFuZHMgLyBjaGFuZ2VzXCIganVkZGVyIHJlcG9ydGVkIG9uIHRoZSByZXZlcnNlXG4gICAgICAgc2Nyb2xsIGZyb20gXCJXZSBjcmVhdGUgd293IVwiIHRvIHRoZSBsYXN0IHZpZGVvLiBXaWR0aCBub3cgc25hcHMgaW5cbiAgICAgICBib3RoIGRpcmVjdGlvbnM7IG9ubHkgdGhlIGZhZGUgaXMgZWFzZWQuIFRhYmxldC9kZXNrdG9wIGtlZXAgdGhlIGJhc2VcbiAgICAgICB0cmFuc2l0aW9uLiAqL1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMS41cyBjdWJpYy1iZXppZXIoLjE2LCAxLCAuMywgMSk7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnJpZ2h0LXRleHQtc2xpZGUge1xuICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICBsaW5lLWhlaWdodDogMzBweDtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudmlkZW8tdGV4dC1yaWdodCBicixcbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC50ZXh0LXNsaWRlIGJyIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgLyogbWluLWhlaWdodCwgbm90IGhlaWdodC4gVGhlIGxpbmVzIGFyZSBncmlkLXN0YWNrZWQgaW4gb25lIGNlbGwgc28gdGhlXG4gICAgIGNvbHVtbiBhbHJlYWR5IHNlbGYtc2l6ZXMgdG8gdGhlIHRhbGxlc3Qgb2YgdGhlbSDigJQgYnV0IGEgZml4ZWQgaGVpZ2h0XG4gICAgIG92ZXJyb2RlIHRoYXQgYW5kIGNsaXBwZWQgYW55IGVudHJ5IHRoYXQgcmFuIHRvIGEgdGhpcmQgbGluZS4gVGhpcyBrZWVwc1xuICAgICB0aGUgNzZweCB0aGUgbGF5b3V0IHJlc2VydmVzIHRvZGF5IGFuZCBsZXRzIGxvbmdlciBjb3B5IGdyb3cgdGhlIGJsb2NrXG4gICAgIGluc3RlYWQgb2YgbG9zaW5nIHRoZSB0YWlsIG9mIGl0LiAqL1xuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnJpZ2h0LXRleHQtbWFzayB7XG4gICAgbWluLWhlaWdodDogNzZweDtcbiAgICBtYXgtd2lkdGg6IDMyMHB4O1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICB9XG5cbiAgLyogTm8gd2hpdGUtc3BhY2U6IG5vd3JhcCBoZXJlIGFueSBtb3JlLiBJdCBndWFyYW50ZWVkIGEgc2luZ2xlIGxpbmUgd2hpbGVcbiAgICAgdGhlIHNsb3Qgd2FzIHBpbm5lZCBhdCAyOHB4LCBidXQgd2l0aCBlZGl0b3JpYWwgY29weSBpdCBndWFyYW50ZWVkXG4gICAgIGhvcml6b250YWwgT1ZFUkZMT1cgaW5zdGVhZCDigJQgdGhlIHdpbmRvdyBpcyBhbiBpbmxpbmUtYmxvY2sgc2l6ZWQgdG9cbiAgICAgbWF4LWNvbnRlbnQsIHNvIGEgbG9uZyBsaW5lIHNpbXBseSByYW4gcGFzdCB0aGUgMzIwcHggY29sdW1uIGFuZCBvdXRcbiAgICAgdGhyb3VnaCB0aGUgY2xpcC1wYXRoJ3MgNTAlIHNpZGUgYmxlZWQuIFdyYXBwaW5nIGlzIHNhZmUgbm93IHRoYXQgdGhlIHNsb3RcbiAgICAgbWVhc3VyZXMgaXRzZWxmOiB0d28gdmlzdWFsIGxpbmVzIG1ha2UgYSB0YWxsZXIgc2xvdCByYXRoZXIgdGhhbiBhIGJyb2tlblxuICAgICBvbmUuIG1pbi13aWR0aDogMCBsZXRzIHRoZSB3aW5kb3cgYWN0dWFsbHkgc2hyaW5rIGluc2lkZSAuc2Nyb2xsaW5nLXRpdGxlJ3NcbiAgICAgaW5saW5lLWZsZXggcm93LCB3aGljaCBpcyB3aGF0IGdpdmVzIHRoZSB0ZXh0IHNvbWV0aGluZyB0byB3cmFwIGFnYWluc3QuICovXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudGV4dC1zbGlkZSB7XG4gICAgbGluZS1oZWlnaHQ6IDI4cHg7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgLnRleHQtc2Nyb2xsLWNvbnRhaW5lciB7XG4gICAgLS12Zi1saW5lLWg6IDI4cHg7XG5cbiAgICBtaW4td2lkdGg6IDA7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IFtkYXRhLWZpbmFsXSAudGV4dC1zY3JvbGwtY29udGFpbmVyIHtcbiAgICBjbGlwLXBhdGg6IG5vbmU7XG4gIH1cblxuICAvKiBMaW5lIHBpdGNoIGZvciB0aGlzIGJyZWFrcG9pbnQuIFRoZSBiYXNlIHJ1bGUgdXAgdG9wIGRvZXMgdGhlIHRyYXZlbCBhbmRcbiAgICAgdGhlIHNsb3QgbWVhc3VyZXMgaXRzZWxmIOKAlCBvbmx5IHRoZSBnYXAgYmV0d2VlbiBsaW5lcyBjaGFuZ2VzIGhlcmUuICovXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCAudGV4dC1zY3JvbGwtd3JhcHBlciB7XG4gICAgLS12Zi1saW5lLWdhcDogMTRweDtcbiAgfVxuXG4gIC8qIFRoZSBjbG9zaW5nIGNhcmQgZG9lc24ndCBjbGlwIGhlcmUgKC50ZXh0LXNjcm9sbC1jb250YWluZXIgZHJvcHMgaXRzXG4gICAgIGNsaXAtcGF0aCBhYm92ZSkgYW5kIGV2ZXJ5IGVhcmxpZXIgbGluZSBoYXMgZmFkZWQgb3V0LCBzbyB0aGUgbGFzdCBsaW5lIGlzXG4gICAgIFBBUktFRCBhdCBhIGZpeGVkIG9mZnNldCBmcm9tIHRoZSB3aW5kb3cgcmF0aGVyIHRoYW4gc2Nyb2xsZWQgdXAgdG8uIEFkZGluZ1xuICAgICB0aGUgc2hpZnQgYmFjayBrZWVwcyB0aGF0IG9mZnNldCB0aGUgc2FtZSB3aGF0ZXZlciB0aGUgbGluZSBjb3VudCBpcyDigJRcbiAgICAgdGhlIGFsdGVybmF0aXZlLCBhIGJhcmUgdHJhbnNsYXRlLCBzaWxlbnRseSByZS10dW5lcyBpdHNlbGYgZXZlcnkgdGltZSBhXG4gICAgIGxpbmUgaXMgYWRkZWQuICovXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnRleHQtc2Nyb2xsLXdyYXBwZXIge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWShjYWxjKHZhcigtLXZmLXRleHQtc2hpZnQpICsgODVweCkpO1xuICB9XG5cbiAgLyog4pSA4pSAIFNsaWRlIDQg4oCUIG1vYmlsZSBvdmVycmlkZXMg4pSA4pSAICovXG5cbiAgLyogR2FwIDAgKyBoZWlnaHQgMCBvbiB0ZXh0LXJpZ2h0IOKGkiBjb250YWluZXIgaGVpZ2h0ID0gdmlkZW8gYm94IGhlaWdodCAoMTk2cHgpXG4gICAgIHNvIHRvcDo1MCUgb24gdGhlIGFic29sdXRlIHRleHQgbGFuZHMgZXhhY3RseSBhdCB0aGUgdmlkZW8gY2VudGVyICovXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnZpZGVvLXRleHQtbGVmdCAudGV4dC1zbGlkZSB7XG4gICAgZm9udC1zaXplOiA0MHB4O1xuICAgIGxpbmUtaGVpZ2h0OiA0MnB4O1xuICB9XG5cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50XG4gIFtkYXRhLWZpbmFsXVxuICAudmlkZW8tdGV4dC1sZWZ0XG4gIC5zdGF0aWMtdGV4dC53ZS10ZXh0LXN0YXJ0IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50XG4gIFtkYXRhLWZpbmFsXVxuICAudmlkZW8tdGV4dC1sZWZ0XG4gIC50ZXh0LXNsaWRlXG4gIC53ZS10ZXh0LWxhc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgLnZpZGVvLWZlYXR1cmUtcGFyZW50IC52aWRlby1sYXlvdXQtY29udGFpbmVyW2RhdGEtZmluYWxdIHtcbiAgICBnYXA6IDA7XG4gICAgd2lkdGg6IDMxMHB4O1xuICAgIHRyYW5zaXRpb246IG5vbmU7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC52aWRlby10ZXh0LWxlZnQge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC0xNTBweCkgc2NhbGUoMSk7XG4gICAgdHJhbnNpdGlvbjogbm9uZTtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnZpZGVvLWJveC1jb250YWluZXIge1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICAgIHdpZHRoOiAxMzBweDtcbiAgICBoZWlnaHQ6IDE5NnB4O1xuICAgIG1heC13aWR0aDogMTAwJTtcbiAgICB0cmFuc2Zvcm06IG5vbmU7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgIHRyYW5zaXRpb246IG5vbmU7XG4gIH1cblxuICAudmlkZW8tZmVhdHVyZS1wYXJlbnQgW2RhdGEtZmluYWxdIC52aWRlby1ib3g6bGFzdC1jaGlsZCB7XG4gICAgaGVpZ2h0OiAxMzFweDtcbiAgICB3aWR0aDogMTY2cHg7XG4gICAgdHJhbnNpdGlvbjogbm9uZTtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnZpZGVvLWJveC13cmFwcGVyIHtcbiAgICBsZWZ0OiAtMjZweDtcbiAgICB0b3A6IC02cHg7XG4gICAgdHJhbnNpdGlvbjogbm9uZTtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnZpZGVvLWJveDpsYXN0LWNoaWxkIC5kdW1teS12aWRlbyB7XG4gICAgaGVpZ2h0OiAxOTZweDtcbiAgfVxuXG4gIC52aWRlby1mZWF0dXJlLXBhcmVudCBbZGF0YS1maW5hbF0gLnZpZGVvLXRleHQtcmlnaHQge1xuICAgIHdpZHRoOiAwO1xuICAgIGhlaWdodDogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG59XG5cbi8qIG5ld3NsbHRlciBzdWNjZXNzIG1lc3NhZ2UgKi9cbi5uZXdzbGV0dGVyLXJlc3BvbnNlIC5jZC1hcHBsaWNhdGlvbi1mb3JtX19zdWNjZXNzIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1wcmltYXJ5KTtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgZm9udC1zaXplOiBtYXgoMS4xMjVyZW0sIDEycHgpO1xuICBsaW5lLWhlaWdodDogMS42NjY2NjY2NjY3O1xuICBsZXR0ZXItc3BhY2luZzogMDtcbiAgY29sb3I6ICMwZDgyNDQ7XG59XG4ubmV3c2xldHRlci1yZXNwb25zZSAuY2QtYXBwbGljYXRpb24tZm9ybV9fc3VjY2Vzc1toaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZTtcbn0iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBOztBQUFBO0FDQUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQXVDQTs7O0FBR0E7QURJQTtBQUNBO0FDRkE7Ozs7OztBQUFBO0FBT0E7O0FBRUE7QURJQTtBQUNBO0FDRkE7O0FBQUE7QUFHQTtBQUNBO0FESUE7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7Ozs7O0FBQUE7QUFNQTtBQUVBOzs7Ozs7Ozs7QUFBQTtBQVVBO0FESUE7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBRElBO0FBQ0E7QUNGQTtBQUNBO0FBQ0E7QURJQTtBQUNBO0FDREE7O0FBQUE7QUFJQTs7Ozs7Ozs7Ozs7O0FBQUE7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUFBO0FBTUE7QURDQTtBQUNBO0FDQ0E7Ozs7Ozs7O0FBQUE7QUFTQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBQUE7QUFTQTtBQUNBO0FEQUE7QUFDQTtBQ0VBOzs7Ozs7OztBQUFBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUFBO0FBR0E7QUFDQTtBRERBO0FBQ0E7QUNHQTs7O0FBQUE7QUFJQTtBQUNBO0FEREE7QUFDQTtBQ0dBOzs7OztBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUFBO0FBR0E7QURGQTtBQUNBO0FDSUE7Ozs7Ozs7OztBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFBQTtBQVNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFlQTtBRExBO0FBQ0E7QUNPQTtBQUNBO0FETEE7QUFDQTtBQ09BOzs7O0FBQUE7QUFLQTtBQUNBO0FBQ0E7QURMQTtBQUNBO0FDUUE7OztBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QURSQTtBQUNBO0FDVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURSQTtBQUNBO0FDVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRFJBO0FBQ0E7QUNVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRFJBO0FBQ0E7QUNVQTs7QUFBQTtBQUlBOzs7Ozs7OztBQUFBO0FBU0E7QUFDQTtBQUVBOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QURWQTtBQUNBO0FDWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUFBO0FBS0E7QURYQTtBQUNBO0FDYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRFhBO0FBQ0E7QUNhQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QURYQTtBQUNBO0FDYUE7Ozs7O0FBQUE7QUFNQTtBQUNBO0FBRUE7Ozs7Ozs7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBRFpBO0FBQ0E7QUNjQTs7OztBQUFBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGJBO0FBQ0E7QUNlQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUFBO0FBS0E7QURkQTtBQUNBO0FDa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURoQkE7QUFDQTtBQ2tCQTs7OztBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGhCQTtBQUNBO0FDa0JBOztBQUFBO0FBSUE7Ozs7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEbEJBO0FBQ0E7QUNzQkE7QUFDQTtBQUNBO0FEcEJBO0FBQ0E7QUNzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURwQkE7QUFDQTtBQ3NCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEcEJBO0FBQ0E7QUNzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEcEJBO0FBQ0E7QUNzQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBRHBCQTtBQUNBO0FDc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEcEJBO0FBQ0E7QUNzQkE7QUFDQTtBQUNBO0FEcEJBO0FBQ0E7QUNzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURwQkE7QUFDQTtBQ3NCQTtBQUNBO0FEcEJBO0FBQ0E7QUNzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QURyQkE7QUFDQTtBQ3lCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FEeEJBO0FBQ0E7QUM0QkE7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUQ5QkE7QUFDQTtBQ2tDQTs7OztBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBRGpDQTtBQUNBO0FDbUNBO0FBQ0E7QUFDQTtBQUdBO0FEbkNBO0FBQ0E7QUNxQ0E7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FEbkNBO0FBQ0E7QUNxQ0E7QUFDQTtBRG5DQTtBQUNBO0FDcUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QURsQ0E7QUFDQTtBQ29DQTtBQUNBO0FBQ0E7QUFBQTtBRGpDQTtBQUNBO0FDbUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGpDQTtBQUNBO0FDbUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURqQ0E7QUFDQTtBQ21DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEakNBO0FBQ0E7QUNtQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBRGhDQTtBQUNBO0FDa0NBO0FBQ0E7QUFDQTtBQUNBO0FEaENBO0FBQ0E7QUNrQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGhDQTtBQUNBO0FDa0NBOztBQUVBO0FEaENBO0FBQ0E7QUNrQ0E7QUFDQTtBQUNBO0FBQUE7QUQvQkE7QUFDQTtBQ2lDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUQvQkE7QUFDQTtBQ2lDQTs7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBRGhDQTtBQUNBO0FDa0NBO0FBQ0E7QUFDQTtBRGhDQTtBQUNBO0FDb0NBOzs7Ozs7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBRGxDQTtBQUNBO0FDb0NBO0FBQ0E7QURsQ0E7QUFDQTtBQ29DQTs7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsQ0E7QUFDQTtBQ29DQTtBQUNBO0FBQ0E7QUFDQTtBRGxDQTtBQUNBO0FDb0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsQ0E7QUFDQTtBQ29DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsQ0E7QUFDQTtBQ29DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEbENBO0FBQ0E7QUNvQ0E7QUFDQTtBRGxDQTtBQUNBO0FDb0NBO0FBQ0E7QUFDQTtBRGxDQTtBQUNBO0FDcUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURuQ0E7QUFDQTtBQ3FDQTtBQUNBO0FEbkNBO0FBQ0E7QUNzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEcENBO0FBQ0E7QUNzQ0E7QUFFQTtBQUFBO0FBRUE7QUFFQTtBRHRDQTtBQUNBO0FDd0NBO0FBQ0E7QUR0Q0E7QUFDQTtBQ3dDQTtBQUNBO0FEdENBO0FBQ0E7QUN5Q0E7O0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURyQ0E7QUFDQTtBQ3VDQTs7OztBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QURyQ0E7QUFDQTtBQ3VDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEcENBO0FBQ0E7QUNzQ0E7O0FBRUE7QURwQ0E7QUFDQTtBQ3NDQTtBQUNBO0FBQ0E7QURwQ0E7QUFDQTtBQ3VDQTtBQUNBO0FBQ0E7QURyQ0E7QUFDQTtBQ3dDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHRDQTtBQUNBO0FDd0NBO0FBQ0E7QUFDQTtBRHRDQTtBQUNBO0FDeUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEdkNBO0FBQ0E7QUN5Q0E7QUFDQTtBQUNBO0FBQ0E7QUR2Q0E7QUFDQTtBQ3lDQTs7O0FBQUE7QUFLQTtBQUNBO0FEeENBO0FBQ0E7QUMwQ0E7QUFDQTtBQUNBO0FEeENBO0FBQ0E7QUMwQ0E7QUFDQTtBQUNBO0FBQ0E7QUR4Q0E7QUMyQ0E7QUFDQTtBQUNBO0FEekNBO0FBQ0E7QUM0Q0E7QUFDQTtBRDFDQTtBQUNBO0FDNENBO0FBQ0E7QUFFQTtBRDNDQTtBQzhDQTtBQUNBO0FENUNBO0FBQ0E7QUMrQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRDdDQTtBQUNBO0FDK0NBOztBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRDlDQTtBQUNBO0FDZ0RBOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFpQkE7QUFDQTtBQUNBO0FEOUNBO0FBQ0E7QUNnREE7OztBQUFBO0FBSUE7QUFDQTtBQUNBO0FEOUNBO0FBQ0E7QUNnREE7QUFDQTtBQUNBO0FBQ0E7QUQ5Q0E7QUFDQTtBQ2dEQTtBQUNBO0FBQ0E7QUQ5Q0E7QUFDQTtBQ2lEQTtBQUVBOzs7Ozs7QUFBQTtBQU9BO0FBQ0E7QURoREE7QUFDQTtBQ2tEQTs7QUFBQTtBQUdBO0FBQ0E7QURoREE7QUFDQTtBQ21EQTs7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGpEQTtBQUNBO0FDbURBO0FBRUE7QUFDQTtBQUNBO0FEbERBO0FBQ0E7QUNvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEbERBO0FBQ0E7QUNvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEbERBO0FBQ0E7QUNvREE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QURsREE7QUFDQTtBQ29EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGxEQTtBQUNBO0FDb0RBO0FBQ0E7QUFDQTtBQUNBO0FEbERBO0FBQ0E7QUNvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsREE7QUFDQTtBQ29EQTtBQUNBO0FBQ0E7QURsREE7QUFDQTtBQytDQTtBQUNBO0FBQ0E7QURsREE7QUFDQTtBQ29EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBRGpEQTtBQUNBO0FDbURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURqREE7QUFDQTtBQ21EQTtBQUNBO0FEakRBO0FBQ0E7QUNtREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGpEQTtBQUNBO0FDbURBOzs7Ozs7O0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FEaERBO0FBQ0E7QUNrREE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUQvQ0E7QUFDQTtBQ2lEQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUQvQ0E7QUFDQTtBQ2lEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEL0NBO0FBQ0E7QUNpREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRC9DQTtBQUNBO0FDaURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUQvQ0E7QUFDQTtBQ2lEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBRC9DQTtBQUNBO0FDaURBO0FBQ0E7QUQvQ0E7QUFDQTtBQ2lEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUQ5Q0E7QUFDQTtBQ2dEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUQ5Q0E7QUFDQTtBQ2dEQTtBQUNBO0FBQ0E7QUFDQTtBRDlDQTtBQUNBO0FDZ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBRGhEQTtBQUNBO0FDa0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURoREE7QUFDQTtBQ2tEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEaERBO0FBQ0E7QUNrREE7QUFDQTtBQUNBO0FBQ0E7QURoREE7QUFDQTtBQ29EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEbERBO0FBQ0E7QUNvREE7QUFDQTtBQUNBO0FEbERBO0FBQ0E7QUNvREE7QUFDQTtBQUNBO0FEbERBO0FBQ0E7QUNvREE7QUFDQTtBQUNBO0FBQ0E7QURsREE7QUFDQTtBQ29EQTtBQUNBO0FEbERBO0FBQ0E7QUNxREE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURwREE7QUFDQTtBQ3NEQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBRHJEQTtBQUNBO0FDdURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURyREE7QUFDQTtBQ3VEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEckRBO0FBQ0E7QUN1REE7QUFDQTtBQUNBO0FEckRBO0FBQ0E7QUN1REE7QUFDQTtBRHJEQTtBQUNBO0FDdURBO0FBQ0E7QUFDQTtBRHJEQTtBQUNBO0FDdURBO0FBQ0E7QURyREE7QUFDQTtBQ3VEQTtBQUNBO0FEckRBO0FBQ0E7QUN1REE7QUFDQTtBQUNBO0FEckRBO0FBQ0E7QUN1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEckRBO0FBQ0E7QUN1REE7QUFDQTtBQUNBO0FEckRBO0FBQ0E7QUN1REE7QUFDQTtBRHJEQTtBQUNBO0FDd0RBO0FBQ0E7QUFDQTtBQUNBO0FEdERBO0FBQ0E7QUN5REE7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FEdkRBO0FBQ0E7QUN5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHZEQTtBQUNBO0FDMERBOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUR6REE7QUFDQTtBQzJEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEekRBO0FBQ0E7QUMyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHpEQTtBQUNBO0FDMkRBOzs7Ozs7Ozs7Ozs7QUFBQTtBQWFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUQxREE7QUFDQTtBQzZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFBQTtBQVVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUQvREE7QUFDQTtBQ2lFQTs7O0FBQUE7QUFJQTtBQUNBO0FEL0RBO0FBQ0E7QUNpRUE7Ozs7OztBQUFBO0FBT0E7QUFDQTtBRC9EQTtBQUNBO0FDaUVBO0FBRUE7Ozs7O0FBQUE7QUFNQTtBQU9BO0FBQ0E7QUFDQTtBRHRFQTtBQUNBO0FDd0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHRFQTtBQUNBO0FDd0VBO0FBQ0E7QUFDQTtBQUNBO0FEdEVBO0FBQ0E7QUN3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEdEVBO0FBQ0E7QUN3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR0RUE7QUFDQTtBQ3dFQTs7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR0RUE7QUFDQTtBQ3lFQTtBQUNBO0FEdkVBO0FBQ0E7QUN5RUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEdkVBO0FBQ0E7QUN5RUE7O0FBRUE7QUR2RUE7QUFDQTtBQ3lFQTs7QUFFQTtBRHZFQTtBQUNBO0FDeUVBOzs7Ozs7Ozs7O0FBQUE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEdkVBO0FBQ0E7QUN5RUE7O0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFBQTtBQVdBO0FEeEVBO0FBQ0E7QUMyRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUF1Q0E7QUFDQTs7QUFFQTtBRHpFQTtBQUNBO0FDK0VBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQXNCQTtBQUNBO0FBQ0E7QUQ3RUE7QUFDQTtBQ21GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FEbEZBO0FBQ0E7QUNvRkE7QUFDQTtBQUNBO0FEbEZBO0FBQ0E7QUNvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsRkE7QUFDQTtBQ29GQTtBQUNBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBRHpGQTtBQUNBO0FDMkZBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUR6RkE7QUFDQTtBQzRGQTtBQUNBO0FEMUZBO0FBQ0E7QUM0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBRDVGQTtBQUNBO0FDOEZBO0FBRUE7QUFDQTtBQUNBO0FEN0ZBO0FBQ0E7QUMrRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FEOUZBO0FBQ0E7QUNnR0E7QUFDQTtBQUNBO0FEOUZBO0FBQ0E7QUNnR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUQ5RkE7QUFDQTtBQ2dHQTtBQUNBO0FEOUZBO0FBQ0E7QUNnR0E7QUFDQTtBRDlGQTtBQUNBO0FDZ0dBO0FBQ0E7QUFDQTtBQUNBO0FEOUZBO0FBQ0E7QUNnR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEOUZBO0FBQ0E7QUNnR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUQ5RkE7QUFDQTtBQ2dHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEckdBO0FBQ0E7QUN1R0E7QUFDQTtBRHJHQTtBQUNBO0FDdUdBO0FBQ0E7QUFDQTtBRHJHQTtBQUNBO0FDdUdBOztBQUVBO0FEckdBO0FBQ0E7QUN1R0E7QUFDQTtBQUNBO0FEckdBO0FBQ0E7QUN1R0E7O0FBQUE7QUFHQTtBQUNBO0FBQ0E7QURyR0E7QUFDQTtBQ3VHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURyR0E7QUFDQTtBQ3dHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEdEdBO0FBQ0E7QUN3R0E7QUFDQTtBRHRHQTtBQUNBO0FDd0dBO0FBQ0E7QUR0R0E7QUFDQTtBQ3dHQTtBQUNBO0FBQ0E7QUFDQTtBRHRHQTtBQUNBO0FDd0dBO0FBQ0E7QUFDQTtBQUNBO0FEdEdBO0FBQ0E7QUN3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHRHQTtBQUNBO0FDd0dBOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFjQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUR2R0E7QUFDQTtBQ3lHQTs7QUFBQTtBQUdBO0FBQ0E7QUR2R0E7QUFDQTtBQ3lHQTtBQUNBO0FEdkdBO0FBQ0E7QUMwR0E7QUFDQTtBQUNBO0FEeEdBO0FDMEdBO0FBQ0E7QUR4R0E7QUMwR0E7QUFDQTtBRHhHQTtBQUNBO0FDMkdBOzs7QUFBQTtBQUlBO0FBQ0E7QUR6R0E7QUFDQTtBQzZHQTs7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBRDNHQTtBQUNBO0FDNkdBO0FBQ0E7QUQzR0E7QUFDQTtBQzZHQTs7Ozs7O0FBQUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUQ1R0E7QUFDQTtBQzhHQTtBQUNBO0FENUdBO0FBQ0E7QUM2R0E7QUFDQTtBRDNHQTtBQUNBO0FDNEdBO0FBQ0E7QUQxR0E7QUFDQTtBQzJHQTtBQUNBO0FEekdBO0FBQ0E7QUMwR0E7QUFDQTtBRHhHQTtBQUNBO0FDeUdBO0FBQ0E7QUR2R0E7QUFDQTtBQ3dHQTtBQUNBO0FEdEdBO0FBQ0E7QUN3R0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FEdkdBO0FDNkdBO0FBQ0E7QUFDQTtBRDNHQTtBQUNBO0FBQ0E7QUM4R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBQUE7QUR4R0E7QUFDQTtBQ2lIQTtBQUNBO0FBQ0E7QUFDQTtBRC9HQTtBQUNBO0FDaUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBRGhIQTtBQUNBO0FDa0hBO0FBRUE7QUFDQTtBQUVBOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEbEhBO0FBQ0E7QUNvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEbEhBO0FBQ0E7QUNvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsSEE7QUFDQTtBQ29IQTs7O0FBQUE7QUFJQTtBQUNBO0FBQ0E7QURsSEE7QUFDQTtBQ29IQTs7QUFFQTtBQUNBO0FEbEhBO0FBQ0E7QUNvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGxIQTtBQUNBO0FDb0hBOzs7OztBQUFBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7OztBQUFBO0FBYUE7QURwSEE7QUFDQTtBQ3NIQTs7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURwSEE7QUFDQTtBQ3NIQTs7OztBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHBIQTtBQUNBO0FDc0hBOzs7OztBQUFBO0FBTUE7OztBQUdBO0FEcEhBO0FBQ0E7QUN1SEE7QUFDQTtBQUNBO0FBQ0E7QURySEE7QUFDQTtBQ3VIQTtBQUVBO0FEdEhBO0FBQ0E7QUN3SEE7QUFDQTtBRHRIQTtBQUNBO0FDeUhBOztBQUFBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7OztBQUFBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR4SEE7QUFDQTtBQzBIQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUR6SEE7QUFDQTtBQzJIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR6SEE7QUFDQTtBQzJIQTtBQUNBOzs7OztBQURBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBQUE7QUFJQTtBRDFIQTtBQUNBO0FDNEhBOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFBQTtBQU9BO0FBS0E7Ozs7O0FBQUE7QUFNQTtBQUNBO0FEL0hBO0FBQ0E7QUNpSUE7QUFBQTtBQUVBO0FBQ0E7QUQvSEE7QUFDQTtBQ2lJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FEaElBO0FBQ0E7QUNrSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGhJQTtBQUNBO0FDa0lBO0FBQ0E7QUFDQTtBRGhJQTtBQUNBO0FDa0lBO0FBQ0E7QUFDQTtBQUNBO0FEaElBO0FBQ0E7QUNrSUE7QUFDQTtBRGhJQTtBQUNBO0FDa0lBO0FBQ0E7QUFDQTtBRGhJQTtBQUNBO0FDa0lBO0FBQ0E7QUFDQTtBRGhJQTtBQUNBO0FDa0lBO0FBQ0E7QURoSUE7QUFDQTtBQ2tJQTtBQUNBO0FBQ0E7QURoSUE7QUFDQTtBQ2tJQTtBQUFBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QURsSUE7QUFDQTtBQ29JQTs7QUFBQTtBQUlBOzs7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHBJQTtBQUNBO0FDc0lBO0FBQ0E7QUFDQTtBQUNBO0FEcElBO0FBQ0E7QUNzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEcElBO0FBQ0E7QUNzSUE7O0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEcElBO0FBQ0E7QUNzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFBQTtBQUdBO0FBRUE7O0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBRHRJQTtBQUNBO0FDd0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHRJQTtBQUNBO0FDd0lBO0FBQ0E7QUFDQTtBQUNBO0FEdElBO0FBQ0E7QUN3SUE7QUFDQTtBQUNBO0FBQ0E7QUR0SUE7QUFDQTtBQ3dJQTtBQUNBO0FEdElBO0FBQ0E7QUN3SUE7Ozs7QUFBQTtBQUtBO0FBQ0E7QUR0SUE7QUFDQTtBQ3dJQTtBQUNBO0FBQ0E7QUR0SUE7QUFDQTtBQ3dJQTtBQUNBO0FBQ0E7QUFDQTtBRHRJQTtBQUNBO0FDd0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHRJQTtBQUNBO0FDeUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR2SUE7QUFDQTtBQ3lJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR2SUE7QUFDQTtBQ3lJQTtBQUNBO0FEdklBO0FBQ0E7QUN5SUE7Ozs7O0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBQUE7QUFNQTtBQUNBO0FEeElBO0FBQ0E7QUMwSUE7QUFDQTtBRHhJQTtBQUNBO0FDMElBOzs7Ozs7OztBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEeklBO0FBQ0E7QUMySUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FEeklBO0FBQ0E7QUMySUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUQ5SUE7QUFDQTtBQ2dKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRDlJQTtBQUNBO0FDZ0pBO0FBQ0E7QUQ5SUE7QUFDQTtBQ2dKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRDlJQTtBQUNBO0FDZ0pBO0FBQ0E7QUFDQTtBRDlJQTtBQUNBO0FDZ0pBO0FBQ0E7QUFDQTtBQUNBO0FEOUlBO0FBQ0E7QUNnSkE7QUFDQTtBQUNBO0FBQ0E7QUQ5SUE7QUFDQTtBQ2dKQTtBQUNBO0FEOUlBO0FBQ0E7QUNnSkE7O0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEL0lBO0FBQ0E7QUNzSkE7QUFDQTtBRHBKQTtBQUNBO0FDc0pBO0FBQ0E7QUFDQTtBRHBKQTtBQUNBO0FDc0pBOztBQUVBO0FBQ0E7QUFDQTtBRHBKQTtBQUNBO0FDc0pBO0FBQ0E7QURwSkE7QUFDQTtBQ3NKQTtBQUNBO0FBQ0E7QURwSkE7QUFDQTtBQ3NKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURwSkE7QUFDQTtBQ3NKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEcEpBO0FBQ0E7QUN1SkE7Ozs7Ozs7Ozs7O0FBQUE7QUFZQTtBQUNBO0FBQ0E7QURySkE7QUFDQTtBQ3VKQTtBQUFBO0FBRUE7QUFDQTtBRHJKQTtBQUNBO0FDd0pBOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEdEpBO0FBQ0E7QUN3SkE7Ozs7Ozs7OztBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUR0SkE7QUFDQTtBQ3dKQTtBQUNBO0FEdEpBO0FBQ0E7QUN3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUFBO0FBR0E7QUR2SkE7QUFDQTtBQ3lKQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFBQTtBQUlBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUQxSkE7QUFDQTtBQzRKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEMUpBO0FBQ0E7QUM0SkE7QUFDQTtBRDFKQTtBQUNBO0FDNEpBOzs7Ozs7OztBQUFBO0FBU0E7QUFDQTtBRDFKQTtBQUNBO0FDNEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FENUpBO0FBQ0E7QUM4SkE7QUFDQTtBQUNBO0FENUpBO0FBQ0E7QUM4SkE7QUFDQTtBRDVKQTtBQUNBO0FDaUtBOzs7Ozs7O0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUQvSkE7QUFDQTtBQ2lLQTtBQUNBO0FBQ0E7QUQvSkE7QUFDQTtBQ2lLQTs7Ozs7Ozs7OztBQUFBO0FBV0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FEaEtBO0FBQ0E7QUNrS0E7Ozs7Ozs7Ozs7O0FBQUE7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBRGxLQTtBQUNBO0FDb0tBOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FEbktBO0FBQ0E7QUNxS0E7Ozs7QUFBQTtBQUtBO0FBQ0E7QURuS0E7QUFDQTtBQ3FLQTs7QUFBQTtBQUdBO0FBQ0E7QURuS0E7QUFDQTtBQ3FLQTtBQUNBO0FBQ0E7QURuS0E7QUFDQTtBQ3FLQTtBQUNBO0FEbktBO0FBQ0E7QUNxS0E7QUFDQTtBQUNBO0FBQ0E7QURuS0E7QUFDQTtBQ3FLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRG5LQTtBQUNBO0FDcUtBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUR2S0E7QUFDQTtBQ3lLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR2S0E7QUFDQTtBQ3lLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFjQTtBQUVBOzs7QUFBQTtBQUlBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFxQ0E7QUFLQTtBRHJMQTtBQUNBO0FDdUxBOzs7Ozs7QUFBQTtBQU9BOzs7QUFHQTtBRHJMQTtBQUNBO0FDdUxBOzs7OztBQUFBO0FBTUE7QUFDQTs7QUFFQTtBRHJMQTtBQUNBO0FDd0xBO0FBQ0E7O0FBRUE7QUR0TEE7QUFDQTtBQ3lMQTs7OztBQUFBO0FBS0E7QUFDQTtBQUNBO0FEdkxBO0FBQ0E7QUMwTEE7QUFDQTtBQUNBO0FEeExBO0FBQ0E7QUNtTUE7Ozs7Ozs7Ozs7OztBQUFBO0FBYUE7O0FBRUE7QUFDQTtBRGpNQTtBQUNBO0FDbU1BOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FEak1BO0FBQ0E7QUNtTUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQXFCQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QURuTUE7QUFDQTtBQ3VNQTtBQUNBO0FBQ0E7QURyTUE7QUFDQTtBQ3VNQTs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBaUJBO0FBRUE7Ozs7QUFBQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRHhNQTtBQUNBO0FDME1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR4TUE7QUFDQTtBQzBNQTs7O0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEeE1BO0FBQ0E7QUMwTUE7Ozs7Ozs7Ozs7OztBQUFBO0FBYUE7QUFDQTtBQUNBO0FEeE1BO0FBQ0E7QUMwTUE7OztBQUFBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR6TUE7QUFDQTtBQzJNQTs7Ozs7Ozs7OztBQUFBO0FBV0E7QUFDQTtBQUNBO0FEek1BO0FBQ0E7QUFDQTtBQzRNQTs7Ozs7OztBQUFBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUQzTUE7QUFDQTtBQzZNQTs7QUFFQTtBQUNBO0FEM01BO0FBQ0E7QUM2TUE7Ozs7Ozs7OztBQUFBO0FBVUE7QUFDQTtBQUNBO0FEM01BO0FBQ0E7QUM2TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEM01BO0FBQ0E7QUM2TUE7Ozs7Ozs7Ozs7QUFBQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FEN01BO0FBQ0E7QUMrTUE7QUFDQTtBQUNBO0FBQ0E7QUQ3TUE7QUFDQTtBQytNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEN01BO0FBQ0E7QUMrTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBR0E7QUFDQTtBRGhOQTtBQUNBO0FDa05BOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGhOQTtBQUNBO0FDb05BOztBQUFBO0FBR0E7O0FBRUE7QUFDQTtBRGxOQTtBQUNBO0FDb05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEbE5BO0FBQ0E7QUNvTkE7QUFDQTtBQUNBO0FEbE5BO0FBQ0E7QUNvTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGxOQTtBQUNBO0FDb05BOzs7QUFHQTtBQUNBO0FEbE5BO0FBQ0E7QUNvTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGxOQTtBQUNBO0FDb05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsTkE7QUFDQTtBQ29OQTs7QUFFQTtBRGxOQTtBQUNBO0FDb05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsTkE7QUFDQTtBQ29OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QURsTkE7QUFDQTtBQ29OQTtBQUNBO0FEbE5BO0FBQ0E7QUNvTkE7O0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsTkE7QUFDQTtBQ29OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURsTkE7QUFDQTtBQ29OQTtBQUNBO0FBQ0E7QURsTkE7QUFDQTtBQ29OQTs7Ozs7Ozs7O0FBQUE7QUFVQTtBQUNBO0FBQ0E7QURsTkE7QUFDQTtBQ3FOQTs7Ozs7Ozs7QUFBQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURuTkE7QUFDQTtBQ3FOQTs7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRG5OQTtBQUNBO0FDcU5BOztBQUFBO0FBR0E7QUFDQTtBQUNBO0FEbk5BO0FBQ0E7QUNxTkE7QUFDQTtBQUNBO0FEbk5BO0FBQ0E7QUNxTkE7QUFDQTtBQUNBO0FEbk5BO0FBQ0E7QUNxTkE7QUFDQTtBRG5OQTtBQUNBO0FDcU5BO0FBQ0E7QURuTkE7QUFDQTtBQ3FOQTtBQUNBO0FEbk5BO0FBQ0E7QUNxTkE7QUFDQTtBQUNBO0FBQ0E7QURuTkE7QUFDQTtBQ3FOQTtBQUNBO0FBQ0E7QUFDQTtBRG5OQTtBQUNBO0FDcU5BO0FBQ0E7QUFDQTtBRG5OQTtBQUNBO0FDcU5BO0FBQ0E7QURuTkE7QUFDQTtBQ3FOQTtBQUNBO0FBQ0E7QURuTkE7QUFDQTtBQ3NOQTtBQUVBOzs7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBRHZOQTtBQUNBO0FDeU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUR2TkE7QUFDQTtBQ3lOQTtBQUNBO0FEdk5BO0FBQ0E7QUN5TkE7QUFDQTtBQUVBO0FBQUE7QUFFQTtBRHhOQTtBQUNBO0FDME5BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRDFOQTtBQUNBO0FDOE5BO0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FENU5BO0FBQ0E7QUM4TkE7OztBQUFBO0FBSUE7QUFDQTtBRDVOQTtBQUNBO0FDOE5BO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUQ1TkE7QUFDQTtBQzhOQTs7Ozs7O0FBQUE7QUFPQTtBQUNBO0FBQ0E7QUQ1TkE7QUFDQTtBQytOQTs7O0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUQ3TkE7QUFDQTtBQ2dPQTtBQUNBO0FBQ0E7QUQ5TkE7QUFDQTtBQ2lPQTtBQUNBO0FBQ0E7QUQvTkE7QUFDQTtBQ2lPQTtBQUNBO0FEL05BO0FBQ0E7QUNpT0E7Ozs7OztBQUFBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRC9OQTtBQUNBO0FDaU9BO0FBQ0E7QUQvTkE7QUFDQTtBQ2lPQTtBQUNBO0FEL05BO0FBQ0E7QUNpT0E7QUFDQTtBRC9OQTtBQUNBO0FDaU9BO0FBQ0E7QUQvTkE7QUFDQTtBQ2lPQTtBQUNBO0FEL05BO0FBQ0E7QUNrT0E7QUFDQTtBQUNBO0FEaE9BO0FBQ0E7QUNrT0E7O0FBQUE7QUFHQTs7O0FBR0E7QUFDQTtBRGhPQTtBQUNBO0FDbU9BO0FBQ0E7QUFDQTtBQUNBO0FEak9BO0FBQ0E7QUNtT0E7QUFDQTtBRGpPQTtBQUNBO0FDbU9BOzs7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QURqT0E7QUFDQTtBQ21PQTtBQUNBO0FEak9BO0FBQ0E7QUNtT0E7O0FBRUE7QURqT0E7QUFDQTtBQ21PQTs7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRGpPQTtBQUNBO0FDbU9BO0FBQ0E7QURqT0E7QUFDQTtBQ21PQTtBQUNBO0FEak9BO0FBQ0E7QUNtT0E7QUFDQTtBRGpPQTtBQUNBO0FDb09BOztBQUFBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBRG5PQTtBQUNBO0FDcU9BO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FEbk9BO0FBQ0E7QUNxT0E7QUFDQTtBRG5PQTtBQUNBO0FDcU9BO0FBQ0E7QUFDQTtBRG5PQTtBQUNBO0FDcU9BOztBQUVBO0FEbk9BO0FBQ0E7QUNxT0E7QUFDQTtBQUNBO0FBQ0E7QURuT0E7QUFDQTtBQ3FPQTtBQUNBO0FBRUE7Ozs7Ozs7QUFBQTtBQVFBO0FEcE9BO0FBQ0E7QUNzT0E7QUFDQTtBQUNBO0FEcE9BO0FBQ0E7QUNzT0E7O0FBRUE7QURwT0E7QUFDQTtBQ3NPQTs7OztBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QURwT0E7QUFDQTtBQ3NPQTs7Ozs7OztBQUFBO0FBUUE7QUFDQTtBRHBPQTtBQUNBO0FDc09BO0FBQ0E7QUFFQTtBQUNBO0FEck9BO0FBQ0E7QUN1T0E7QUFDQTtBRHJPQTtBQUNBO0FDdU9BO0FBQUE7QUFFQTtBQUNBO0FEck9BO0FBQ0E7QUN1T0E7Ozs7O0FBQUE7QUFNQTtBQUNBO0FEck9BO0FBQ0E7QUN1T0E7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FEdE9BO0FBQ0E7QUN3T0E7QUFJQTtBRHpPQTtBQUNBO0FDMk9BO0FBS0E7QUQ3T0E7QUFDQTtBQytPQTtBQUNBO0FBQ0E7QUFDQTtBRDdPQTtBQUNBO0FDK09BO0FBQ0E7QUFDQTtBRDdPQTtBQUNBO0FDK09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUQ3T0E7QUFDQTtBQytPQTtBQUNBO0FBQ0E7QUFDQTtBRDdPQTtBQUNBO0FDK09BO0FBQ0E7QUFDQTtBQUNBO0FEN09BO0FBQ0E7QUMrT0E7QUFDQTtBRDdPQTtBQUNBO0FDK09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRDdPQTtBQUNBO0FDZ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBRDlPQTtBQUNBO0FDK09BO0FBQ0E7QUQ3T0E7Iiwic291cmNlUm9vdCI6IiJ9*/