PageSourceSearch

https://hairlust.de/cdn/shop/t/98/assets/blog.js?v=163347683708985164161788850462

js hairlust.de collected 2026-10-04 15:07:09 UTC 1,606,833 bytes, 12,757 lines download raw bytes

1(()=>{"use strict";var __webpack_modules__={"./src/scripts/components/blog.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
2/* harmony import */ var _styles_templates_blog_blog_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../styles/templates/blog/blog.scss */ "./src/styles/templates/blog/blog.scss");
3/* harmony import */ var _components_blog_article_page__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/components/blog/article-page */ "./src/scripts/components/blog/article-page.js");
4/* harmony import */ var _components_blog_article_page_simple__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/blog/article-page-simple */ "./src/scripts/components/blog/article-page-simple.js");
5/* harmony import */ var _components_blog_before_after_page__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/components/blog/before-after-page */ "./src/scripts/components/blog/before-after-page.js");
6/* harmony import */ var _components_pages_hero_special__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/components/pages/hero-special */ "./src/scripts/components/pages/hero-special.js");
7/* harmony import */ var _components_blog_ingredients_page__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/blog/ingredients-page */ "./src/scripts/components/blog/ingredients-page.js");
8/* harmony import */ var _components_blog_inspiration_buy_flow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/components/blog/inspiration-buy-flow */ "./src/scripts/components/blog/inspiration-buy-flow.js");
9/* harmony import */ var _components_blog_results_page__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/components/blog/results-page */ "./src/scripts/components/blog/results-page.js");
10/* harmony import */ var _components_blog_faithpilot_page__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/components/blog/faithpilot-page */ "./src/scripts/components/blog/faithpilot-page.js");
11/* harmony import */ var _components_blog_video_studio__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/components/blog/video-studio */ "./src/scripts/components/blog/video-studio.js");
12var _app;
13
14
15
16
17
18
19
20
21
22
23var components = {
24  articlePage: _components_blog_article_page__WEBPACK_IMPORTED_MODULE_1__["default"],
25  articlePageSimple: _components_blog_article_page_simple__WEBPACK_IMPORTED_MODULE_2__["default"],
26  beforeAfterPage: _components_blog_before_after_page__WEBPACK_IMPORTED_MODULE_3__["default"],
27  heroSpecial: _components_pages_hero_special__WEBPACK_IMPORTED_MODULE_4__["default"],
28  ingredientsPage: _components_blog_ingredients_page__WEBPACK_IMPORTED_MODULE_5__["default"],
29  inspirationBuyFlow: _components_blog_inspiration_buy_flow__WEBPACK_IMPORTED_MODULE_6__["default"],
30  resultsPage: _components_blog_results_page__WEBPACK_IMPORTED_MODULE_7__["default"],
31  faithpilotPage: _components_blog_faithpilot_page__WEBPACK_IMPORTED_MODULE_8__["default"],
32  videoStudio: _components_blog_video_studio__WEBPACK_IMPORTED_MODULE_9__["default"]
33};
34app.add(components);
35if ((_app = app) !== null && _app !== void 0 && (_app = _app.getState()) !== null && _app !== void 0 && _app.cart) app.mount();//# sourceURL=[module]
36//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQThDO0FBRVU7QUFDYTtBQUNKO0FBQ1I7QUFDTztBQUNPO0FBQ2Y7QUFDTTtBQUNOO0FBRXhELElBQU1TLFVBQVUsR0FBRztFQUNmVCxXQUFXLEVBQVhBLHFFQUFXO0VBQ1hDLGlCQUFpQixFQUFqQkEsNEVBQWlCO0VBQ2pCQyxlQUFlLEVBQWZBLDBFQUFlO0VBQ2ZDLFdBQVcsRUFBWEEsc0VBQVc7RUFDWEMsZUFBZSxFQUFmQSx5RUFBZTtFQUNmQyxrQkFBa0IsRUFBbEJBLDZFQUFrQjtFQUNsQkMsV0FBVyxFQUFYQSxxRUFBVztFQUNYQyxjQUFjLEVBQWRBLHdFQUFjO0VBQ2RDLFdBQVcsRUFBWEEscUVBQVdBO0FBQ2YsQ0FBQztBQUVERSxHQUFHLENBQUNDLEdBQUcsQ0FBQ0YsVUFBVSxDQUFDO0FBQ25CLEtBQUFHLElBQUEsR0FBSUYsR0FBRyxjQUFBRSxJQUFBLGdCQUFBQSxJQUFBLEdBQUhBLElBQUEsQ0FBS0MsUUFBUSxDQUFDLENBQUMsY0FBQUQsSUFBQSxlQUFmQSxJQUFBLENBQWlCRSxJQUFJLEVBQUVKLEdBQUcsQ0FBQ0ssS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cuanM/NWFlZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4uLy4uL3N0eWxlcy90ZW1wbGF0ZXMvYmxvZy9ibG9nLnNjc3MnXG5cbmltcG9ydCBhcnRpY2xlUGFnZSBmcm9tICdAL2NvbXBvbmVudHMvYmxvZy9hcnRpY2xlLXBhZ2UnXG5pbXBvcnQgYXJ0aWNsZVBhZ2VTaW1wbGUgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvYXJ0aWNsZS1wYWdl
vendor: 7,949 bytes, lines 36-70
36LXNpbXBsZSdcbmltcG9ydCBiZWZvcmVBZnRlclBhZ2UgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvYmVmb3JlLWFmdGVyLXBhZ2UnXG5pbXBvcnQgaGVyb1NwZWNpYWwgZnJvbSAnQC9jb21wb25lbnRzL3BhZ2VzL2hlcm8tc3BlY2lhbCdcbmltcG9ydCBpbmdyZWRpZW50c1BhZ2UgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvaW5ncmVkaWVudHMtcGFnZSdcbmltcG9ydCBpbnNwaXJhdGlvbkJ1eUZsb3cgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvaW5zcGlyYXRpb24tYnV5LWZsb3cnXG5pbXBvcnQgcmVzdWx0c1BhZ2UgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvcmVzdWx0cy1wYWdlJ1xuaW1wb3J0IGZhaXRocGlsb3RQYWdlIGZyb20gJ0AvY29tcG9uZW50cy9ibG9nL2ZhaXRocGlsb3QtcGFnZSdcbmltcG9ydCB2aWRlb1N0dWRpbyBmcm9tICdAL2NvbXBvbmVudHMvYmxvZy92aWRlby1zdHVkaW8nXG5cbmNvbnN0IGNvbXBvbmVudHMgPSB7XG4gICAgYXJ0aWNsZVBhZ2UsXG4gICAgYXJ0aWNsZVBhZ2VTaW1wbGUsXG4gICAgYmVmb3JlQWZ0ZXJQYWdlLFxuICAgIGhlcm9TcGVjaWFsLFxuICAgIGluZ3JlZGllbnRzUGFnZSxcbiAgICBpbnNwaXJhdGlvbkJ1eUZsb3csXG4gICAgcmVzdWx0c1BhZ2UsXG4gICAgZmFpdGhwaWxvdFBhZ2UsXG4gICAgdmlkZW9TdHVkaW9cbn1cblxuYXBwLmFkZChjb21wb25lbnRzKVxuaWYgKGFwcD8uZ2V0U3RhdGUoKT8uY2FydCkgYXBwLm1vdW50KCkiXSwibmFtZXMiOlsiYXJ0aWNsZVBhZ2UiLCJhcnRpY2xlUGFnZVNpbXBsZSIsImJlZm9yZUFmdGVyUGFnZSIsImhlcm9TcGVjaWFsIiwiaW5ncmVkaWVudHNQYWdlIiwiaW5zcGlyYXRpb25CdXlGbG93IiwicmVzdWx0c1BhZ2UiLCJmYWl0aHBpbG90UGFnZSIsInZpZGVvU3R1ZGlvIiwiY29tcG9uZW50cyIsImFwcCIsImFkZCIsIl9hcHAiLCJnZXRTdGF0ZSIsImNhcnQiLCJtb3VudCJdLCJzb3VyY2VSb290IjoiIn0=
37//# sourceURL=webpack-internal:///./src/scripts/components/blog.js
38
39}`)},"./src/scripts/components/blog/article-page-simple.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
40/* harmony export */ __webpack_require__.d(__webpack_exports__, {
41/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
42/* harmony export */ });
43/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js");
44
45/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) {
46  /*******************************************************************************************************************************************/
47  /* Data + Elements
48  /*******************************************************************************************************************************************/
49  var _zelektor = zelektor(node),
50    mainContent = _zelektor.mainContent;
51
52  /*******************************************************************************************************************************************/
53  /* Init
54  /*******************************************************************************************************************************************/
55  (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.wrapIFrames)(mainContent);
56}));//# sourceURL=[module]
57//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvYXJ0aWNsZS1wYWdlLXNpbXBsZS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFxRDtBQUVyRCxpRUFBZUMsU0FBUyxDQUFDLFVBQUNDLElBQUksRUFBQ0MsR0FBRyxFQUFLO0VBQ25DO0VBQ0E7QUFDSjtFQUNJLElBQUFDLFNBQUEsR0FBd0JDLFFBQVEsQ0FBQ0gsSUFBSSxDQUFDO0lBQTlCSSxXQUFXLEdBQUFGLFNBQUEsQ0FBWEUsV0FBVzs7RUFHbkI7RUFDQTtBQUNKO0VBQ0lOLG1FQUFXLENBQUNNLFdBQVcsQ0FBQztBQUU1QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvYXJ0aWNsZS1wYWdlLXNpbXBsZS5qcz9mZWJmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdyYXBJRnJhbWVzIH0gZnJvbSAnQC9saWIvdXRpbGl0eS1mdW5jdGlvbnMnXG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudCgobm9kZSxjdHgpID0+IHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBEYXRhICsgRWxlbWVudHNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBjb25zdCB7IG1haW5Db250ZW50IH0gPSB6ZWxla3Rvcihub2RlKVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBJbml0XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgd3JhcElGcmFtZXMobWFpbkNvbnRlbnQpXG4gICAgXG59KSJdLCJuYW1lcyI6WyJ3cmFwSUZyYW1lcyIsImNvbXBvbmVudCIsIm5vZGUiLCJjdHgiLCJfemVsZWt0b3IiLCJ6ZWxla3RvciIsIm1haW5Db250ZW50Il0sInNvdXJjZVJvb3QiOiIifQ==
58//# sourceURL=webpack-internal:///./src/scripts/components/blog/article-page-simple.js
59
60}`)},"./src/scripts/components/blog/article-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
61/* harmony export */ __webpack_require__.d(__webpack_exports__, {
62/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
63/* harmony export */ });
64/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js");
65/* harmony import */ var _lib_load_script__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/load-script */ "./src/scripts/lib/load-script.js");
66/* harmony import */ var _lib_consent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/consent */ "./src/scripts/lib/consent.js");
67/* harmony import */ var _lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/keen-slider.js */ "./src/scripts/lib/keen-slider.js");
68/* harmony import */ var keen_slider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! keen-slider */ "./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js");
69/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! gsap */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js");
70function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
70 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
71function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
72function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
73function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
74
75
76
77
78
79
80/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) {
81  /*******************************************************************************************************************************************/
82  /* Data + Elements
83  /*******************************************************************************************************************************************/
84  var _zelektor = zelektor(node),
85    mainContent = _zelektor.mainContent,
86    contentTable = _zelektor.contentTable,
87    pollElements = _zelektor.poll,
88    beforeAfterSliderWrappers = _zelektor.beforeAfterSliderWrapper;
89  var strings = window.theme.strings.blog;
90  var canTrackFunctional = (0,_lib_consent__WEBPACK_IMPORTED_MODULE_2__.hasConsent)('cookie_cat_functional');
91
92  /*******************************************************************************************************************************************/
93  /* Event Listeners
94  /*******************************************************************************************************************************************/
95  _lib_consent__WEBPACK_IMPORTED_MODULE_2__.consentEvents.forEach(function (eventName) {
96    window.addEventListener(eventName, updateTrackingConsent, false);
97  });
98
99  /*******************************************************************************************************************************************/
100  /* Init
101  /*******************************************************************************************************************************************/
102  createContentTable();
103  (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.wrapIFrames)(mainContent);
104  if (pollElements) {
105    var observer = new IntersectionObserver(function (entries) {
106      entries.forEach(/*#__PURE__*/function () {
107        var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(entry) {
108          return _regenerator().w(function (_context) {
109            while (1) switch (_context.n) {
110              case 0:
111                if (!entry.isIntersecting) {
112                  _context.n = 3;
113                  break;
114                }
115                _context.n = 1;
116                return (0,_lib_load_script__WEBPACK_IMPORTED_MODULE_1__["default"])('https://www.gstatic.
116com/firebasejs/7.19.0/firebase-app.js');
117              case 1:
118                _context.n = 2;
119                return (0,_lib_load_script__WEBPACK_IMPORTED_MODULE_1__["default"])('https://www.gstatic.com/firebasejs/7.19.0/firebase-database.js');
120              case 2:
121                createPolls();
122                observer.disconnect();
123              case 3:
124                return _context.a(2);
125            }
126          }, _callee);
127        }));
128        return function (_x) {
129          return _ref.apply(this, arguments);
130        };
131      }());
132    });
133    loopify(pollElements).forEach(function (poll) {
134      observer.observe(poll);
135    });
136  }
137  if (beforeAfterSliderWrappers) {
138    awaitVendorScript('keenSlider', function () {
139      return initBeforeAfterSliders();
140    });
141  }
142
143  /*******************************************************************************************************************************************/
144  /* Functions
145  /*******************************************************************************************************************************************/
146  function createContentTable() {
147    var _zelektor2 = zelektor(mainContent),
148      headings = _zelektor2.heading;
149    if (!(headings !== null && headings !== void 0 && headings.length)) {
150      contentTable === null || contentTable === void 0 || contentTable.remove();
151      return;
152    }
153    headings.forEach(function (h, index) {
154      var btn = document.createElement('p');
155      btn.classList.add('article__content-table__item', 'js-contentScrollBtn');
156      btn.innerHTML = "\\n                            ".concat(window.theme.icons.arrowRightSmall, "\\n                            <span class=\\"article__content-table__item__text\\">").concat(h.textContent, "</span>\\n                            ");
157      contentTable.appendChild(btn);
158      btn.addEventListener('click', function () {
159        return scrollToHeading(h);
160      });
161    });
162    contentTable.classList.add('is-initialized');
163  }
164  function scrollToHeading(heading) {
165    var headerHeight = parseInt(getComputedStyle(root).getPropertyValue('--header-height').replace('px', ''));
166    (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.smoothScroll)(heading, {
167      offset: -headerHeight - 30
168    });
169  }
170  function createPolls() {
171    // Create polls
172    var _window = window,
173      pollItems = _window.pollItems;
174
175    // Initialize Firebase database
176    var config = window.theme.config.firebase;
177    firebase.initializeApp(config);
178    var database = firebase.database();
179    loopify(pollElements).forEach(function (p) {
180      var id = p.dataset.id;
181      var item = pollItems.find(function (i) {
182        return i.questionId === id;
183      });
184      if (!item) return;
185      p.dataset.questionId = item.questionId;
186      p.dataset.databaseId = "".concat(item.databaseId);
187      p.dataset.type = item.type;
188      p.innerHTML = "\\n                            <div class=\\"article__poll__cookie-notice js-cookieNotice\\">\\n                                <p>".concat(window.theme.strings.layout.acceptCookiesFunctional, "</p>\\n                            </div>\\n\\n                            <div class=\\"article__poll__content-wrapper\\">\\n                                <p class=\\"title title--small\\">").concat(item.question, "</p>\\n\\n                                <ul class=\\"article__poll__list\\">\\n                                    ").concat(item.answers.map(function (a, index) {
189        return "\\n                                                <li class=\\"article__poll__item js-answer\\" data-value=\\"".concat(index, "\\" data-index=\\"").concat(index, "\\">\\n                                                    <div>").concat(a, "</div>\\n                                                    <div class=\\"article__poll__item__percent is-hidden js-percent\\">\\n                                                        <span class=\\"js-percentVal\\">0</span>\\n                                                        <span>%</span>\\n                                                    </div>\\n                                                </li>\\n                                                ");
190      }).join(''), "\\n                                </ul>\\n\\n                                <button type=\\"button\\" class=\\"cta cta--filled-dark js-submitBtn\\">").concat(strings.vote, "</button>\\n\\n                                <p class=\\"article__poll__count is-hidden js-voteCount\\">\\n                                    <span>").concat(strings.voteCount, ": </span>\\n                                    <span class=\\"js-voteCountVal\\"></span>\\n                                </p>\\n                            </div>\\n                            ");
191      initPollElement(p);
192    });
193
194    // Initialize poll element (fetch database + update poll, create event listeners, etc.)
195    function initPollElement(el) {
196      var questionId = el.dataset.questionId;
197      var _zelektor3 = zelektor(el),
198        answers = _zelektor3.answer,
199        submitBtn = _zelektor3.submitBtn,
200        cookieNotice = _zelektor3.cookieNotice;
201
202      // Check if user already voted
203      // If yes, get results and disable poll
204      var alreadyVoted = localStorage.getItem("hairlustPoll_".concat(questionId));
205      if (alreadyVoted) getResults(el);
206
207      // Set up event listeners
208      loopify(answers).forEach(function (a) {
209        a.addEventListener('click', function () {
210          return selectAnswer(a, el);
211        });
212      });
213      submitBtn.addEventListener('click', function () {
214        return submitVote(el);
215      });
216      cookieNotice.addEventListener('click', function () {
217        var _window$CookieScript, _window$CookieScript$;
218        (_window$CookieScript = window.CookieScript) === null || _window$CookieScript === void 0 || (_window$CookieScript = _window$CookieScript.instance) === null || _window$CookieScript === void 0 || (_window$CookieScript$ = _window$CookieScript.show) === null || _window$CookieScript$ === void 0 || _window$CookieScript$.call(_window$CookieScript);
219      });
220      el.classList.add('is-initialized');
221    }
222    function selectAnswer(answer, pollEl) {
223      if (pollEl.dataset.type === 'single') {
224        var _zelektor4 = zelektor(pollEl),
225          allAnswers = _zelektor4.answer;
226        loopify(allAnswers).forEach(function (a) {
227          return a.classList.remove('is-active');
228        });
229        answer.classList.add('is-active');
230      } else if (pollEl.dataset.type === 'multiple') {
231        answer.classList.toggle('is-active');
232      }
233    }
234    function submitVote(pollEl) {
235      var _pollEl$dataset = pollEl.dataset,
236        questionId = _pollEl$dataset.questionId,
237        databaseId = _pollEl$dataset.databaseId;
238      var _zelektor5 = zelektor(pollEl),
239        answers = _zelektor5.answer;
240      var selectedAnswers = loopify(answers).filter(function (a) {
241        return a.classList.contains('is-active');
242      });
243      if (!(selectedAnswers !== null && selectedAnswers !== void 0 && selectedAnswers.length)) {
244        alert('Please select an answer');
245      } else {
246        localStorage.setItem("hairlustPoll_".concat(questionId), "".concat(loopify(selectedAnswers.map(function (a) {
247          return a.dataset.index;
248        }).join(','))));
249
250        // For each selected answer
251        // Create new key in database and set it to answer value
252        selectedAnswers.forEach(function (a) {
253          var newPostKey = database.ref(databaseId).push();
254          newPostKey.set(a.dataset.value);
255        });
256
257        // Get results and disable vote
258        getResults(pollEl);
259      }
260    }
261    function getResults(pollEl) {
262      var _pollEl$dataset2 = pollEl.dataset,
263        questionId = _pollEl$dataset2.questionId,
264        databaseId = _pollEl$dataset2.databaseId;
265      var _zelektor6 = zelektor(pollEl),
266        submitBtn = _zelektor6.submitBtn;
267
268      // Load user answers from localStorage
269      var userAnswers = localStorage.getItem("hairlustPoll_".concat(questionId)).split(',');
270
271      // Mark the answers that the user selected (and unmark the rest)
272      var _zelektor7 = zelektor(pollEl),
273        answers = _zelektor7.answer;
274      var markedAnswers = loopify(answers).filter(function (a) {
275        return userAnswers.find(function (u) {
276          return a.dataset.index === u;
277        });
278      });
279      markedAnswers.forEach(function (a) {
280        return a.classList.add('is-active');
281      });
282
283      // Disable answers to prevent user from changing marks
284      answers.forEach(function (a) {
285        return a.classList.add('is-disabled');
286      });
287
288      // Load all answers from database
289      var ref = database.ref(databaseId);
290      ref.on('value', function (data) {
291        return updatePoll(pollEl, Object.values(data.val()));
292      });
293
294      // Hide submit button
295      submitBtn.classList.add('is-hidden');
296    }
297    function updatePoll(pollEl, databaseVals) {
298      // Update answers with percentages
299      var _zelektor8 = zelektor(pollEl),
300        answers = _zelektor8.answer,
301        voteCount = _zelektor8.voteCount,
302        voteCountVal = _zelektor8.voteCountVal;
303      loopify(answers).forEach(function (a) {
304        var matches = databaseVals.filter(function (v) {
305          return v === a.dataset.value;
306        });
307        var percentage = Math.round(matches.length / databaseVals.length * 100);
308        var _zelektor9 = zelektor(a),
309          percent = _zelektor9.percent,
310          percentVal = _zelektor9.percentVal;
311        percent.classList.remove('is-hidden');
312        var counter = {
313          val: 0
314        };
315        gsap__WEBPACK_IMPORTED_MODULE_5__.gsap.to(counter, {
316          duration: 2,
317          val: percentage,
318          onUpdate: setVal
319        });
320        function setVal() {
321          var val = gsap__WEBPACK_IMPORTED_MODULE_5__.gsap.utils.snap(1, counter.val);
322          percentVal.textContent = val;
323        }
324      });
325
326      // Show total amount of votes
327      voteCountVal.textContent = databaseVals.length;
328      voteCount.classList.remove('is-hidden');
329    }
330    togglePolls();
331  }
332  function updateTrackingConsent() {
333    canTrackFunctional = (0,_lib_consent__WEBPACK_IMPORTED_MODULE_2__.hasConsent)('cookie_cat_functional');
334    togglePolls();
335  }
336  function togglePolls() {
337    if (canTrackFunctional) {
338      loopify(pollElements).forEach(function (el) {
339        return el.classList.remove('is-hidden');
340      });
341    } else {
342      loopify(pollElements).forEach(function (el) {
343        return el.classList.add('is-hidden');
344      });
345    }
346  }
347  function initBeforeAfterSliders() {
348    loopify(beforeAfterSliderWrappers).forEach(function (w) {
349      var _zelektor0 = zelektor(w),
350        sliderEl = _zelektor0.sliderEl,
351        prev = _zelektor0.prev,
352        next = _zelektor0.next;
353      (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_3__.addClasses)(sliderEl);
354      var slider = new keen_slider__WEBPACK_IMPORTED_MODULE_4__["default"](sliderEl, {
355        slidesPerView: 1,
356        loop: true,
357        duration: 700,
358        breakpoints: {
359          '(max-width: 1024px)': {
360            slidesPerView: 1.4,
361            centered: true
362          }
363        },
364        created: function created(inst) {
365          (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_3__.initSliderWrapper)(w);
366          (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_3__.initArrows)(inst, prev, next);
367          updateSlides(sliderEl, inst);
368        },
369        slideChanged: function slideChanged(inst) {
370          updateSlides(sliderEl, inst);
371        }
372      });
373    });
374  }
375  function updateSlides(sliderEl, inst) {
376    var _inst$details = inst.details(),
377      relativeSlide = _inst$details.relativeSlide;
378    var _zelektor1 = zelektor(sliderEl),
379      slides = _zelektor1.slide;
380    loopify(slides).forEach(function (slide, index) {
381      slide.classList[index === relativeSlide ? 'add' : 'remove']('is-active');
382    });
383  }
384}));//# sourceURL=[module]
385//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvYXJ0aWNsZS1wYWdlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFBLElBQUFGLENBQUEsS0FBQVYsQ0FBQSxJQUFBTCxDQUFBLEdBQUFnQixDQUFBLENBQUFPLE1BQUEsRUFBQXZCLENBQUEsVUFBQUssQ0FBQSxFQUFBRSxDQUFBLEdBQUFTLENBQUEsQ0FBQWhCLENBQUEsR0FBQXFCLENBQUEsR0FBQUgsQ0FBQSxDQUFBRixDQUFBLEVBQUFRLENBQUEsR0FBQWpCLENBQUEsS0FBQU4sQ0FBQSxRQUFBSSxDQUFBLEdBQUFtQixDQUFBLEtBQUFyQixDQUFBLE1BQUFRLENBQUEsR0FBQUosQ0FBQSxFQUFBQyxDQUFBLEdBQUFELENBQUEsWUFBQUMsQ0FBQSxXQUFBRCxDQUFBLE1BQUFBLENBQUEsTUFBQVIsQ0FBQSxJQUFBUSxDQUFBLE9BQUFjLENBQUEsTUFBQWhCLENBQUEsR0FBQUosQ0FBQSxRQUFBb0IsQ0FBQSxHQUFBZCxDQUFBLFFBQUFDLENBQUEsTUFBQVUsQ0FBQSxDQUFBQyxDQUFBLEdBQUFoQixDQUFBLEVBQUFlLENBQUEsQ0FBQWYsQ0FBQSxHQUFBSSxDQUFBLE9BQUFjLENBQUEsR0FBQUcsQ0FBQSxLQUFBbkIsQ0FBQSxHQUFBSixDQUFBLFFBQUFNLENBQUEsTUFBQUosQ0FBQSxJQUFBQSxDQUFBLEdBQUFxQixDQUFBLE1BQUFqQixDQUFBLE1BQUFOLENBQUEsRUFBQU0sQ0FBQSxNQUFBSixDQUFBLEVBQUFlLENBQUEsQ0FBQWYsQ0FBQSxHQUFBcUIsQ0FBQSxFQUFBaEIsQ0FBQSxjQUFBSCxDQUFBLElBQUFKLENBQUEsYUFBQW1CLENBQUEsUUFBQUgsQ0FBQSxPQUFBZCxDQUFBLHFCQUFBRSxDQUFBLEVBQUFXLENBQUEsRUFBQVEsQ0FBQSxRQUFBVCxDQUFBLFlBQUFVLFNBQUEsdUNBQUFSLENBQUEsVUFBQUQsQ0FBQSxJQUFBSyxDQUFBLENBQUFMLENBQUEsRUFBQVEsQ0FBQSxHQUFBaEIsQ0FBQSxHQUFBUSxDQUFBLEVBQUFMLENBQUEsR0FBQWEsQ0FBQSxHQUFBeEIsQ0FBQSxHQUFBUSxDQUFBLE9BQUFULENBQUEsR0FBQVksQ0FBQSxNQUFBTSxDQUFBLEtBQUFWLENBQUEsS0FBQUMsQ0FBQSxHQUFBQSxDQUFBLFFBQUFBLENBQUEsU0FBQVUsQ0FBQSxDQUFBZixDQUFBLFFBQUFrQixDQUFBLENBQUFiLENBQUEsRUFBQUcsQ0FBQSxLQUFBTyxDQUFBLENBQUFmLENBQUEsR0FBQVEsQ0FBQSxHQUFBTyxDQUFBLENBQUFDLENBQUEsR0FBQVIsQ0FBQSxhQUFBSSxDQUFBLE1BQUFSLENBQUEsUUFBQUMsQ0FBQSxLQUFBSCxDQUFBLFlBQUFMLENBQUEsR0FBQU8sQ0FBQSxDQUFBRixDQUFBLFdBQUFMLENBQUEsR0FBQUEsQ0FBQSxDQUFBMEIsSUFBQSxDQUFBbkIsQ0FBQSxFQUFBSSxDQUFBLFVBQUFjLFNBQUEsMkNBQUF6QixDQUFBLENBQUEyQixJQUFBLFNBQUEzQixDQUFBLEVBQUFXLENBQUEsR0FBQVgsQ0FBQSxDQUFBNEIsS0FBQSxFQUFBcEIsQ0FBQSxTQUFBQSxDQUFBLG9CQUFBQSxDQUFBLEtBQUFSLENBQUEsR0FBQU8sQ0FBQSxlQUFBUCxDQUFBLENBQUEwQixJQUFBLENBQUFuQixDQUFBLEdBQUFDLENBQUEsU0FBQUcsQ0FBQSxHQUFBYyxTQUFBLHVDQUFBcEIsQ0FBQSxnQkFBQUcsQ0FBQSxPQUFBRCxDQUFBLEdBQUFSLENBQUEsY0FBQUMsQ0FBQSxJQUFBaUIsQ0FBQSxHQUFBQyxDQUFBLENBQUFmLENBQUEsUUFBQVEsQ0FBQSxHQUFBVixDQUFBLENBQUF5QixJQUFBLENBQUF2QixDQUFBLEVBQUFlLENBQUEsT0FBQUUsQ0FBQSxrQkFBQXBCLENBQUEsSUFBQU8sQ0FBQSxHQUFBUixDQUFBLEVBQUFTLENBQUEsTUFBQUcsQ0FBQSxHQUFBWCxDQUFBLGNBQUFlLENBQUEsbUJBQUFhLEtB
385QUEsRUFBQTVCLENBQUEsRUFBQTJCLElBQUEsRUFBQVYsQ0FBQSxTQUFBaEIsQ0FBQSxFQUFBSSxDQUFBLEVBQUFFLENBQUEsUUFBQUksQ0FBQSxRQUFBUyxDQUFBLGdCQUFBVixVQUFBLGNBQUFtQixrQkFBQSxjQUFBQywyQkFBQSxLQUFBOUIsQ0FBQSxHQUFBWSxNQUFBLENBQUFtQixjQUFBLE1BQUF2QixDQUFBLE1BQUFMLENBQUEsSUFBQUgsQ0FBQSxDQUFBQSxDQUFBLElBQUFHLENBQUEsU0FBQVcsbUJBQUEsQ0FBQWQsQ0FBQSxPQUFBRyxDQUFBLGlDQUFBSCxDQUFBLEdBQUFXLENBQUEsR0FBQW1CLDBCQUFBLENBQUFyQixTQUFBLEdBQUFDLFNBQUEsQ0FBQUQsU0FBQSxHQUFBRyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxZQUFBTyxFQUFBaEIsQ0FBQSxXQUFBYSxNQUFBLENBQUFvQixjQUFBLEdBQUFwQixNQUFBLENBQUFvQixjQUFBLENBQUFqQyxDQUFBLEVBQUErQiwwQkFBQSxLQUFBL0IsQ0FBQSxDQUFBa0MsU0FBQSxHQUFBSCwwQkFBQSxFQUFBaEIsbUJBQUEsQ0FBQWYsQ0FBQSxFQUFBTSxDQUFBLHlCQUFBTixDQUFBLENBQUFVLFNBQUEsR0FBQUcsTUFBQSxDQUFBQyxNQUFBLENBQUFGLENBQUEsR0FBQVosQ0FBQSxXQUFBOEIsaUJBQUEsQ0FBQXBCLFNBQUEsR0FBQXFCLDBCQUFBLEVBQUFoQixtQkFBQSxDQUFBSCxDQUFBLGlCQUFBbUIsMEJBQUEsR0FBQWhCLG1CQUFBLENBQUFnQiwwQkFBQSxpQkFBQUQsaUJBQUEsR0FBQUEsaUJBQUEsQ0FBQUssV0FBQSx3QkFBQXBCLG1CQUFBLENBQUFnQiwwQkFBQSxFQUFBekIsQ0FBQSx3QkFBQVMsbUJBQUEsQ0FBQUgsQ0FBQSxHQUFBRyxtQkFBQSxDQUFBSCxDQUFBLEVBQUFOLENBQUEsZ0JBQUFTLG1CQUFBLENBQUFILENBQUEsRUFBQVIsQ0FBQSxpQ0FBQVcsbUJBQUEsQ0FBQUgsQ0FBQSw4REFBQXdCLFlBQUEsWUFBQ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YUFBYTtJQUNyQixJQUFBQyxVQUFBLEdBQTBCM0osUUFBUSxDQUFDNEksUUFBUSxDQUFDO01BQTdCZ0IsTUFBTSxHQUFBRCxVQUFBLENBQWJFLEtBQUs7SUFFYmpJLE9BQU8sQ0FBQ2dJLE1BQU0sQ0FBQyxDQUFDaEosT0FBTyxDQUFDLFVBQUNpSixLQUFLLEVBQUV4SCxLQUFLLEVBQUs7TUFDdEN3SCxLQUFLLENBQUNwSCxTQUFTLENBQUNKLEtBQUssS0FBS3FILGFBQWEsR0FBRyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQzVFLENBQUMsQ0FBQztFQUNOO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvY29tcG9uZW50cy9ibG9nL2FydGljbGUtcGFnZS5qcz9hZDgzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7
385IHNtb290aFNjcm9sbCwgd3JhcElGcmFtZXMgfSBmcm9tICdAL2xpYi91dGlsaXR5LWZ1bmN0aW9ucydcbmltcG9ydCBsb2FkU2NyaXB0IGZyb20gJ0AvbGliL2xvYWQtc2NyaXB0J1xuaW1wb3J0IHsgY29uc2VudEV2ZW50cywgaGFzQ29uc2VudCB9IGZyb20gJ0AvbGliL2NvbnNlbnQnXG5pbXBvcnQgeyBhZGRDbGFzc2VzLCBpbml0U2xpZGVyV3JhcHBlciwgaW5pdEFycm93cyB9IGZyb20gJ0AvbGliL2tlZW4tc2xpZGVyLmpzJ1xuaW1wb3J0IEtlZW5TbGlkZXIgZnJvbSAna2Vlbi1zbGlkZXInXG5pbXBvcnQgeyBnc2FwIH0gZnJvbSAnZ3NhcCc7XG5cblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlLCBjdHgpID0+IHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBEYXRhICsgRWxlbWVudHNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBjb25zdCB7IG1haW5Db250ZW50LCBjb250ZW50VGFibGUsIHBvbGw6IHBvbGxFbGVtZW50cywgYmVmb3JlQWZ0ZXJTbGlkZXJXcmFwcGVyOiBiZWZvcmVBZnRlclNsaWRlcldyYXBwZXJzIH0gPSB6ZWxla3Rvcihub2RlKVxuICAgIGNvbnN0IHN0cmluZ3MgPSB3aW5kb3cudGhlbWUuc3RyaW5ncy5ibG9nXG5cbiAgICBsZXQgY2FuVHJhY2tGdW5jdGlvbmFsID0gaGFzQ29uc2VudCgnY29va2llX2NhdF9mdW5jdGlvbmFsJylcblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogRXZlbnQgTGlzdGVuZXJzXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgY29uc2VudEV2ZW50cy5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB1cGRhdGVUcmFja2luZ0NvbnNlbnQsIGZhbHNlKVxuICAgIH0pXG5cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogSW5
385pdFxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGNyZWF0ZUNvbnRlbnRUYWJsZSgpXG4gICAgd3JhcElGcmFtZXMobWFpbkNvbnRlbnQpXG5cbiAgICBpZiAocG9sbEVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBlbnRyaWVzLmZvckVhY2goYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRTY3JpcHQoJ2h0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2ZpcmViYXNlanMvNy4xOS4wL2ZpcmViYXNlLWFwcC5qcycpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2FkU2NyaXB0KCdodHRwczovL3d3dy5nc3RhdGljLmNvbS9maXJlYmFzZWpzLzcuMTkuMC9maXJlYmFzZS1kYXRhYmFzZS5qcycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVBvbGxzKCk7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbG9vcGlmeShwb2xsRWxlbWVudHMpLmZvckVhY2goKHBvbGwpID0+IHtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUocG9sbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChiZWZvcmVBZnRlclNsaWRlcldyYXBwZXJzKSB7XG4gICAgICAgIGF3YWl0VmVuZG9yU2NyaXB0KCdrZWVuU2xpZGVyJywgKCkgPT4gaW5pdEJlZm9yZUFmdGVyU2xpZGVycygpKVxuICAgIH1cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogRnVuY3Rpb25zXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29udGVudFRhYmxlKCkge1xuICAgICAgICBjb25zdCB7IGhlYWRpbmc6IGhlYWRpbmdzIH0gPSB6ZWxla3RvcihtYWluQ29udGVudClcblxuICAgICAgICBpZiAoIWhlYWRpbmdzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRlbnRUYWJsZT8ucmVtb3ZlKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaGVhZGluZ3MuZm9yRWFjaCgoaCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKVxuXG4gICAgICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnYXJ0aWNsZV9fY29udGVudC10YWJsZV9faXRlbScsICdqcy1jb250ZW50U2Nyb2xsQnRuJylcbiAgICAgICAgICAgIGJ0bi5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt3aW5kb3cudGhlbWUuaWNvbnMuYXJyb3dSaWdodFNtYWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJ0aWNsZV9fY29udGVudC10YWJsZV9faXRlbV9fdGV4dFwiPiR7aC50ZXh0Q29udGVudH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxuXG4gICAgICAgICAgICBjb250ZW50VGFibGUuYXBwZW5kQ2hpbGQoYnRuKVxuXG4gICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzY3JvbGxUb0hlYWRpbmcoaCkpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29udGVudFRhYmxlLmNsYXNzTGlzdC5hZGQoJ2lzLWluaXRpYWxpemVkJylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzY3JvbGxUb0hlYWRpbmcoaGVhZGluZykge1xuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0taGVhZGVyLWhlaWdodCcpLnJlcGxhY2UoJ3B4JywgJycpKVxuICAgICAgICBzbW9vdGhTY3JvbGwoaGVhZGluZywgeyBvZmZzZXQ6IC1oZWFkZXJIZWlnaHQgLSAzMCB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVBvbGxzKCkge1xuICAgICAgICAvLyBDcmVhdGUgcG9sbHNcbiAgICAgICAgY29uc3QgeyBwb2xsSXRlbXMgfSA9IHdpbmRvd1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgRmlyZWJhc2UgZGF0YWJhc2VcbiAgICAgICAgY29uc3QgY29uZmlnID0gd2luZG93LnRoZW1lLmNvbmZpZy5maXJlYmFzZVxuICAgICAgICBmaXJlYmFzZS5pbml0aWFsaXplQXBwKGNvbmZpZylcblxuICAgICAgICBjb25zdCBkYXRhYmFzZSA9IGZpcmViYXNlLmRhdGFiYXNlKClcblxuICAgICAgICBsb29waWZ5KHBvbGxFbGVtZW50cykuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IHAuZGF0YXNldFxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBvbGxJdGVtcy5maW5kKGkgPT4gaS5xdWVzdGlvbklkID09PSBpZClcblxuICAgICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm5cblxuICAgICAgICAgICAgcC5kYXRhc2V0LnF1ZXN0aW9uSWQgPSBpdGVtLnF1ZXN0aW9uSWRcbiAgICAgICAgICAgIHAuZGF0YXNldC5kYXRhYmFzZUlkID0gYCR7aXRlbS5kYXRhYmFzZUlkfWBcbiAgICAgICAgICAgIHAuZGF0YXNldC50eXBlID0gaXRlbS50eXBlXG5cbiAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnRpY2xlX19wb2xsX19jb29raWUtbm90aWNlIGpzLWNvb2tpZU5vdGljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4ke3dpbmRvdy50aGVtZS5zdHJpbmdzLmxheW91dC5hY2NlcHRDb29raWVzRnVuY3Rpb25hbH08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJ0aWNsZV9fcG9sbF9fY29udGVudC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGl0bGUgdGl0bGUtLXNtYWxsXCI+JHtpdGVtLnF1ZXN0aW9ufTwvcD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJhcnRpY2xlX19wb2xsX19saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2l0ZW0uYW5zd2Vycy5tYXAoKGEsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImFydGljbGVfX3BvbGxfX2l0ZW0ganMtYW5zd2VyXCIgZGF0YS12YWx1ZT1cIiR7aW5kZXh9XCIgZGF0YS1pbmRleD1cIiR7aW5kZXh9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4ke2F9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFydGljbGVfX3BvbGxfX2l0ZW1fX3BlcmNlbnQgaXMtaGlkZGVuIGpzLXBlcmNlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJqcy1wZXJjZW50VmFsXCI+MDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICB9KS5qb2luKCcnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImN0YSBjdGEtLWZpbGxlZC1kYXJrIGpzLXN1Ym1pdEJ0blwiPiR7c3RyaW5ncy52b3RlfTwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXJ0aWNsZV9fcG9sbF9fY291bnQgaXMtaGlkZGVuIGpzLXZvdGVDb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHtzdHJpbmdzLnZvdGVDb3VudH06IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwianMtdm90ZUNvdW50VmFsXCI+P
385C9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxuXG4gICAgICAgICAgICBpbml0UG9sbEVsZW1lbnQocClcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBJbml0aWFsaXplIHBvbGwgZWxlbWVudCAoZmV0Y2ggZGF0YWJhc2UgKyB1cGRhdGUgcG9sbCwgY3JlYXRlIGV2ZW50IGxpc3RlbmVycywgZXRjLilcbiAgICAgICAgZnVuY3Rpb24gaW5pdFBvbGxFbGVtZW50KGVsKSB7XG4gICAgICAgICAgICBjb25zdCB7IHF1ZXN0aW9uSWQgfSA9IGVsLmRhdGFzZXRcbiAgICAgICAgICAgIGNvbnN0IHsgYW5zd2VyOiBhbnN3ZXJzLCBzdWJtaXRCdG4sIGNvb2tpZU5vdGljZSB9ID0gemVsZWt0b3IoZWwpXG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHVzZXIgYWxyZWFkeSB2b3RlZFxuICAgICAgICAgICAgLy8gSWYgeWVzLCBnZXQgcmVzdWx0cyBhbmQgZGlzYWJsZSBwb2xsXG4gICAgICAgICAgICBjb25zdCBhbHJlYWR5Vm90ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgaGFpcmx1c3RQb2xsXyR7cXVlc3Rpb25JZH1gKVxuICAgICAgICAgICAgaWYgKGFscmVhZHlWb3RlZCkgZ2V0UmVzdWx0cyhlbClcblxuXG4gICAgICAgICAgICAvLyBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgICAgICBsb29waWZ5KGFuc3dlcnMpLmZvckVhY2goYSA9PiB7XG4gICAgICAgICAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNlbGVjdEFuc3dlcihhLCBlbCkpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBzdWJtaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzdWJtaXRWb3RlKGVsKSlcbiAgICAgICAgICAgIGNvb2tpZU5vdGljZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuQ29va2llU2NyaXB0Py5pbnN0YW5jZT8uc2hvdz8uKClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2lzLWluaXRpYWxpemVkJylcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNlbGVjdEFuc3dlcihhbnN3ZXIsIHBvbGxFbCkge1xuICAgICAgICAgICAgaWYgKHBvbGxFbC5kYXRhc2V0LnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBhbnN3ZXI6IGFsbEFuc3dlcnMgfSA9IHplbGVrdG9yKHBvbGxFbClcbiAgICAgICAgICAgICAgICBsb29waWZ5KGFsbEFuc3dlcnMpLmZvckVhY2goYSA9PiBhLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpKVxuICAgICAgICAgICAgICAgIGFuc3dlci5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xsRWwuZGF0YXNldC50eXBlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgYW5zd2VyLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzdWJtaXRWb3RlKHBvbGxFbCkge1xuICAgICAgICAgICAgY29uc3QgeyBxdWVzdGlvbklkLCBkYXRhYmFzZUlkIH0gPSBwb2xsRWwuZGF0YXNldFxuICAgICAgICAgICAgY29uc3QgeyBhbnN3ZXI6IGFuc3dlcnMgfSA9IHplbGVrdG9yKHBvbGxFbClcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQW5zd2VycyA9IGxvb3BpZnkoYW5zd2VycykuZmlsdGVyKGEgPT4gYS5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKVxuXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkQW5zd2Vycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYWxlcnQoJ1BsZWFzZSBzZWxlY3QgYW4gYW5zd2VyJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGhhaXJsdXN0UG9sbF8ke3F1ZXN0aW9uSWR9YCwgYCR7bG9vcGlmeShzZWxlY3RlZEFuc3dlcnMubWFwKGEgPT4gYS5kYXRhc2V0LmluZGV4KS5qb2luKCcsJykpfWApXG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBzZWxlY3RlZCBhbnN3ZXJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGtleSBpbiBkYXRhYmFzZSBhbmQgc2V0IGl0IHRvIGFuc3dlciB2YWx1ZVxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQW5zd2Vycy5mb3JFYWNoKGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQb3N0S2V5ID0gZGF0YWJhc2UucmVmKGRhdGFiYXNlSWQpLnB1c2goKVxuICAgICAgICAgICAgICAgICAgICBuZXdQb3N0S2V5LnNldChhLmRhdGFzZXQudmFsdWUpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vIEdldCByZXN1bHRzIGFuZCBkaXNhYmxlIHZvdGVcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzKHBvbGxFbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldFJlc3VsdHMocG9sbEVsKSB7XG4gICAgICAgICAgICBjb25zdCB7IHF1ZXN0aW9uSWQsIGRhdGFiYXNlSWQgfSA9IHBvbGxFbC5kYXRhc2V0XG4gICAgICAgICAgICBjb25zdCB7IHN1Ym1pdEJ0biB9ID0gemVsZWt0b3IocG9sbEVsKVxuXG4gICAgICAgICAgICAvLyBMb2FkIHVzZXIgYW5zd2VycyBmcm9tIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgY29uc3QgdXNlckFuc3dlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgaGFpcmx1c3RQb2xsXyR7cXVlc3Rpb25JZH1gKS5zcGxpdCgnLCcpXG5cbiAgICAgICAgICAgIC8vIE1hcmsgdGhlIGFuc3dlcnMgdGhhdCB0aGUgdXNlciBzZWxlY3RlZCAoYW5kIHVubWFyayB0aGUgcmVzdClcbiAgICAgICAgICAgIGNvbnN0IHsgYW5zd2VyOiBhbnN3ZXJzIH0gPSB6ZWxla3Rvcihwb2xsRWwpXG4gICAgICAgICAgICBjb25zdCBtYXJrZWRBbnN3ZXJzID0gbG9vcGlmeShhbnN3ZXJzKS5maWx0ZXIoYSA9PiB1c2VyQW5zd2Vycy5maW5kKHUgPT4gYS5kYXRhc2V0LmluZGV4ID09PSB1KSlcbiAgICAgICAgICAgIG1hcmtlZEFuc3dlcnMuZm9yRWFjaChhID0+IGEuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJykpXG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgYW5zd2VycyB0byBwcmV2ZW50IHVzZXIgZnJvbSBjaGFuZ2luZyBtYXJrc1xuICAgICAgICAgICAgYW5zd2Vycy5mb3JFYWNoKGEgPT4gYS5jbGFzc0xpc3QuYWRkKCdpcy1kaXNhYmxlZCcpKVxuXG4gICAgICAgICAgICAvLyBMb2FkIGFsbCBhbnN3ZXJzIGZyb20gZGF0YWJhc2VcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IGRhdGFiYXNlLnJlZihkYXRhYmFzZUlkKVxuICAgICAgICAgICAgcmVmLm9uKCd2YWx1ZScsIGRhdGEgPT4gdXBkYXRlUG9sbChwb2xsRWwsIE9iamVjdC52YWx1ZXMoZGF0YS52YWwoKSkpKVxuXG4gICAgICAgICAgICAvLyBIaWRlIHN1Ym1pdCBidXR0b25cbiAgICAgICAgICAgI
385HN1Ym1pdEJ0bi5jbGFzc0xpc3QuYWRkKCdpcy1oaWRkZW4nKVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlUG9sbChwb2xsRWwsIGRhdGFiYXNlVmFscykge1xuICAgICAgICAgICAgLy8gVXBkYXRlIGFuc3dlcnMgd2l0aCBwZXJjZW50YWdlc1xuICAgICAgICAgICAgY29uc3QgeyBhbnN3ZXI6IGFuc3dlcnMsIHZvdGVDb3VudCwgdm90ZUNvdW50VmFsIH0gPSB6ZWxla3Rvcihwb2xsRWwpXG5cbiAgICAgICAgICAgIGxvb3BpZnkoYW5zd2VycykuZm9yRWFjaChhID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZGF0YWJhc2VWYWxzLmZpbHRlcih2ID0+IHYgPT09IGEuZGF0YXNldC52YWx1ZSlcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5yb3VuZChtYXRjaGVzLmxlbmd0aCAvIGRhdGFiYXNlVmFscy5sZW5ndGggKiAxMDApXG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IHBlcmNlbnQsIHBlcmNlbnRWYWwgfSA9IHplbGVrdG9yKGEpXG4gICAgICAgICAgICAgICAgcGVyY2VudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1oaWRkZW4nKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY291bnRlciA9IHsgdmFsOiAwIH1cbiAgICAgICAgICAgICAgICBnc2FwLnRvKGNvdW50ZXIsIHsgZHVyYXRpb246IDIsIHZhbDogcGVyY2VudGFnZSwgb25VcGRhdGU6IHNldFZhbCB9KVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFZhbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gZ3NhcC51dGlscy5zbmFwKDEsIGNvdW50ZXIudmFsKVxuICAgICAgICAgICAgICAgICAgICBwZXJjZW50VmFsLnRleHRDb250ZW50ID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgLy8gU2hvdyB0b3RhbCBhbW91bnQgb2Ygdm90ZXNcbiAgICAgICAgICAgIHZvdGVDb3VudFZhbC50ZXh0Q29udGVudCA9IGRhdGFiYXNlVmFscy5sZW5ndGhcbiAgICAgICAgICAgIHZvdGVDb3VudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1oaWRkZW4nKVxuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlUG9sbHMoKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRyYWNraW5nQ29uc2VudCgpIHtcbiAgICAgICAgY2FuVHJhY2tGdW5jdGlvbmFsID0gaGFzQ29uc2VudCgnY29va2llX2NhdF9mdW5jdGlvbmFsJylcbiAgICAgICAgdG9nZ2xlUG9sbHMoKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvZ2dsZVBvbGxzKCkge1xuICAgICAgICBpZiAoY2FuVHJhY2tGdW5jdGlvbmFsKSB7XG4gICAgICAgICAgICBsb29waWZ5KHBvbGxFbGVtZW50cykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1oaWRkZW4nKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvb3BpZnkocG9sbEVsZW1lbnRzKS5mb3JFYWNoKGVsID0+IGVsLmNsYXNzTGlzdC5hZGQoJ2lzLWhpZGRlbicpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5pdEJlZm9yZUFmdGVyU2xpZGVycygpIHtcbiAgICAgICAgbG9vcGlmeShiZWZvcmVBZnRlclNsaWRlcldyYXBwZXJzKS5mb3JFYWNoKHcgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzbGlkZXJFbCwgcHJldiwgbmV4dCB9ID0gemVsZWt0b3IodylcbiAgICAgICAgICAgIGFkZENsYXNzZXMoc2xpZGVyRWwpXG5cbiAgICAgICAgICAgIGNvbnN0IHNsaWRlciA9IG5ldyBLZWVuU2xpZGVyKHNsaWRlckVsLCB7XG4gICAgICAgICAgICAgICAgc2xpZGVzUGVyVmlldzogMSxcbiAgICAgICAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA3MDAsXG4gICAgICAgICAgICAgICAgYnJlYWtwb2ludHM6IHtcbiAgICAgICAgICAgICAgICAgICAgJyhtYXgtd2lkdGg6IDEwMjRweCknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNQZXJWaWV3OiAxLjQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkOiBpbnN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW5pdFNsaWRlcldyYXBwZXIodylcbiAgICAgICAgICAgICAgICAgICAgaW5pdEFycm93cyhpbnN0LCBwcmV2LCBuZXh0KVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVTbGlkZXMoc2xpZGVyRWwsIGluc3QpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzbGlkZUNoYW5nZWQ6IGluc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVTbGlkZXMoc2xpZGVyRWwsIGluc3QpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVTbGlkZXMoc2xpZGVyRWwsIGluc3QpIHtcbiAgICAgICAgY29uc3QgeyByZWxhdGl2ZVNsaWRlIH0gPSBpbnN0LmRldGFpbHMoKVxuICAgICAgICBjb25zdCB7IHNsaWRlOiBzbGlkZXMgfSA9IHplbGVrdG9yKHNsaWRlckVsKVxuXG4gICAgICAgIGxvb3BpZnkoc2xpZGVzKS5mb3JFYWNoKChzbGlkZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHNsaWRlLmNsYXNzTGlzdFtpbmRleCA9PT0gcmVsYXRpdmVTbGlkZSA/ICdhZGQnIDogJ3JlbW92ZSddKCdpcy1hY3RpdmUnKVxuICAgICAgICB9KVxuICAgIH1cbn0pXG4iXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJzbW9vdGhTY3JvbGwiLCJ3cmFwSUZyYW1lcyIsImxvYWRTY3JpcHQiLCJjb25zZW50RXZlbnRzIiwiaGFzQ29uc2VudCIsImFkZENsYXNzZXMiLCJpbml0U2xpZGVyV3JhcHBlciIsImluaXRBcnJvd3MiLCJLZWVuU2xpZGVyIiwi
vendor: 5,594 bytes, lines 385-396
385Z3NhcCIsImNvbXBvbmVudCIsIm5vZGUiLCJjdHgiLCJfemVsZWt0b3IiLCJ6ZWxla3RvciIsIm1haW5Db250ZW50IiwiY29udGVudFRhYmxlIiwicG9sbEVsZW1lbnRzIiwicG9sbCIsImJlZm9yZUFmdGVyU2xpZGVyV3JhcHBlcnMiLCJiZWZvcmVBZnRlclNsaWRlcldyYXBwZXIiLCJzdHJpbmdzIiwid2luZG93IiwidGhlbWUiLCJibG9nIiwiY2FuVHJhY2tGdW5jdGlvbmFsIiwiZm9yRWFjaCIsImV2ZW50TmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVUcmFja2luZ0NvbnNlbnQiLCJjcmVhdGVDb250ZW50VGFibGUiLCJvYnNlcnZlciIsIkludGVyc2VjdGlvbk9ic2VydmVyIiwiZW50cmllcyIsIl9yZWYiLCJfY2FsbGVlIiwiZW50cnkiLCJfY29udGV4dCIsImlzSW50ZXJzZWN0aW5nIiwiY3JlYXRlUG9sbHMiLCJkaXNjb25uZWN0IiwiX3giLCJsb29waWZ5Iiwib2JzZXJ2ZSIsImF3YWl0VmVuZG9yU2NyaXB0IiwiaW5pdEJlZm9yZUFmdGVyU2xpZGVycyIsIl96ZWxla3RvcjIiLCJoZWFkaW5ncyIsImhlYWRpbmciLCJyZW1vdmUiLCJoIiwiaW5kZXgiLCJidG4iLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJpbm5lckhUTUwiLCJjb25jYXQiLCJpY29ucyIsImFycm93UmlnaHRTbWFsbCIsInRleHRDb250ZW50IiwiYXBwZW5kQ2hpbGQiLCJzY3JvbGxUb0hlYWRpbmciLCJoZWFkZXJIZWlnaHQiLCJwYXJzZUludCIsImdldENvbXB1dGVkU3R5bGUiLCJyb290IiwiZ2V0UHJvcGVydHlWYWx1ZSIsInJlcGxhY2UiLCJvZmZzZXQiLCJfd2luZG93IiwicG9sbEl0ZW1zIiwiY29uZmlnIiwiZmlyZWJhc2UiLCJpbml0aWFsaXplQXBwIiwiZGF0YWJhc2UiLCJpZCIsImRhdGFzZXQiLCJpdGVtIiwiZmluZCIsInF1ZXN0aW9uSWQiLCJkYXRhYmFzZUlkIiwidHlwZSIsImxheW91dCIsImFjY2VwdENvb2tpZXNGdW5jdGlvbmFsIiwicXVlc3Rpb24iLCJhbnN3ZXJzIiwibWFwIiwiam9pbiIsInZvdGUiLCJ2b3RlQ291bnQiLCJpbml0UG9sbEVsZW1lbnQiLCJlbCIsIl96ZWxla3RvcjMiLCJhbnN3ZXIiLCJzdWJtaXRCdG4iLCJjb29raWVOb3RpY2UiLCJhbHJlYWR5Vm90ZWQiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiZ2V0UmVzdWx0cyIsInNlbGVjdEFuc3dlciIsInN1Ym1pdFZvdGUiLCJfd2luZG93JENvb2tpZVNjcmlwdCIsIl93aW5kb3ckQ29va2llU2NyaXB0JCIsIkNvb2tpZVNjcmlwdCIsImluc3RhbmNlIiwic2hvdyIsInBvbGxFbCIsIl96ZWxla3RvcjQiLCJhbGxBbnN3ZXJzIiwidG9nZ2xlIiwiX3BvbGxFbCRkYXRhc2V0IiwiX3plbGVrdG9yNSIsInNlbGVjdGVkQW5zd2VycyIsImZpbHRlciIsImNvbnRhaW5zIiwiYWxlcnQiLCJzZXRJdGVtIiwibmV3UG9zdEtleSIsInJlZiIsInB1c2giLCJzZXQiLCJfcG9sbEVsJGRhdGFzZXQyIiwiX3plbGVrdG9yNiIsInVzZXJBbnN3ZXJzIiwic3BsaXQiLCJfemVsZWt0b3I3IiwibWFya2VkQW5zd2VycyIsIm9uIiwiZGF0YSIsInVwZGF0ZVBvbGwiLCJ2YWx1ZXMiLCJ2YWwiLCJkYXRhYmFzZVZhbHMiLCJfemVsZWt0b3I4Iiwidm90ZUNvdW50VmFsIiwibWF0Y2hlcyIsInBlcmNlbnRhZ2UiLCJNYXRoIiwicm91bmQiLCJfemVsZWt0b3I5IiwicGVyY2VudCIsInBlcmNlbnRWYWwiLCJjb3VudGVyIiwidG8iLCJkdXJhdGlvbiIsIm9uVXBkYXRlIiwic2V0VmFsIiwidXRpbHMiLCJzbmFwIiwidG9nZ2xlUG9sbHMiLCJfemVsZWt0b3IwIiwic2xpZGVyRWwiLCJwcmV2IiwibmV4dCIsInNsaWRlciIsInNsaWRlc1BlclZpZXciLCJsb29wIiwiYnJlYWtwb2ludHMiLCJjZW50ZXJlZCIsImNyZWF0ZWQiLCJpbnN0IiwidXBkYXRlU2xpZGVzIiwic2xpZGVDaGFuZ2VkIiwiX2luc3QkZGV0YWlscyIsImRldGFpbHMiLCJyZWxhdGl2ZVNsaWRlIiwiX3plbGVrdG9yMSIsInNsaWRlcyIsInNsaWRlIl0sInNvdXJjZVJvb3QiOiIifQ==
386//# sourceURL=webpack-internal:///./src/scripts/components/blog/article-page.js
387
388}`)},"./src/scripts/components/blog/before-after-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
389/* harmony export */ __webpack_require__.d(__webpack_exports__, {
390/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
391/* harmony export */ });
392/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js");
393/* harmony import */ var _lib_images__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/images */ "./src/scripts/lib/images.js");
394/* harmony import */ var _lib_currency__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/currency */ "./src/scripts/lib/currency.js");
395/* harmony import */ var _lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/fetch-paginated-items */ "./src/scripts/lib/fetch-paginated-items.js");
396function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
396 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
397function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
398function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
399function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
400/* eslint-disable max-len */
401
402
403
404
405/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) {
406  var ENDPOINT = '/blogs/before-after?view=data_before-after';
407  var inner = node.querySelector('.js-inner');
408  var list = node.querySelector('.js-list');
409  var onlyHandle = node.dataset.onlyHandle;
410  var pageSize = parseInt(node.dataset.pageSize);
411  var pages = [];
412  var strings = window.theme.strings.reviews;
413  init();
414  function init() {
415    return _init.apply(this, arguments);
416  }
417  function _init() {
418    _init = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
419      var items, item;
420      return _regenerator().w(function (_context) {
421        while (1) switch (_context.n) {
422          case 0:
423            _context.n = 1;
424            return (0,_lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_3__["default"])(ENDPOINT);
425          case 1:
426            items = _context.v;
427            if (!onlyHandle) {
428              _context.n = 2;
429              break;
430            }
431            item = items.find(function (i) {
432              return i.handle === onlyHandle;
433            });
434            renderItems([item]);
435            _context.n = 4;
436            break;
437          case 2:
438            while (items.length) {
439              pages.push(items.splice(0, pageSize));
440            }
441            _context.n = 3;
442            return renderContent();
443          case 3:
444            if (pages.length) {
445              createPagination();
446            }
447          case 4:
448            window.app.mount();
449          case 5:
450            return _context.a(2);
451        }
452      }, _callee);
453    }));
454    return _init.apply(this, arguments);
455  }
456  function renderContent() {
457    return _renderContent.apply(this, arguments);
458  }
459  function _renderContent() {
460    _renderContent = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
461      return _regenerator().w(function (_context2) {
462        while (1) switch (_context2.n) {
463          case 0:
464            _context2.n = 1;
465            return renderItems(pages.splice(0, 1)[0]);
466          case 1:
467            return _context2.a(2);
468        }
469      }, _callee2);
470    }));
471    return _renderContent.apply(this, arguments);
472  }
473  function renderItems(_x) {
474    return _renderItems.apply(this, arguments);
475  }
476  function _renderItems() {
477    _renderItems = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(items) {
478      return _regenerator().w(function (_context4) {
479        while (1) switch (_context4.n) {
480          case 0:
481            _context4.n = 1;
482            return Promise.all(items.map(function (item) {
483              // eslint-disable-next-line no-async-promise-executor
484              return new Promise(/*#__PURE__*/function () {
485                var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(resolve) {
486                  var _products$2;
487                  var products, div;
488                  return _regenerator().w(function (_context3) {
489                    while (1) switch (_context3.n) {
490                      case 0:
491                        _context3.n = 1;
492                        return Promise.all(item.productHandles.map(function (handle) {
493                          return fetch("/products/".concat(handle, ".js")).then(function (response) {
494                            return response.json();
495                          });
496                        }));
497                      case 1:
498                        products = _context3.v;
499                        div = document.createElement('div');
500                        list.appendChild(div);
501                        div.outerHTML = "<li class=\\"before-after__content\\">\\n          <div class=\\"before-after__image-slider\\">\\n            <figure class=\\"before-after__image-slider__slide is-active\\">\\n              <div class=\\"image-wrapper\\">\\n                ".concat(function () {
502                          var imgSrc = item.imageUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(item.imageUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(item.imageUrl), ''), '1512x') : '';
503                          var imgSrcLazy = item.imageUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(item.imageUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(item.imageUrl), ''), '1x') : '';
504                          return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">");
505                        }(), "\\n\\n                <div class=\\"image-badge image-badge--left\\">").concat(strings.before, "</div>\\n                <div class=\\"image-badge image-badge--right\\">").concat(strings.inProgress, "</div>\\n              </div>\\n            </figure>\\n          </div>\\n\\n          <article class=\\"before-after__content-container\\">\\n            <div class=\\"before-after__content-item is-active\\">\\n              <p class=\\"before-after__content-item__title\\">").concat(item.title, "</p>\\n              <p class=\\"before-after__content-item__quote\\">").concat(item.quote, "</p>\\n\\n              <div class=\\"faithpilot\\">\\n                <div class=\\"faithpilot__stars\\">\\n                  ").concat(function () {
506                          var stars = parseInt(item.stars);
507                          var html = window.theme.icons.faithpilotStarDark.repeat(stars);
508                          if (stars < 5) {
509                            for (var i = 0; i < 5 - stars; i++) {
510                              html += window.theme.icons.faithpilotStarVoid;
511                            }
512                          }
513                          return html;
514                        }(), "\\n                </div>\\n\\n                ").concat(function () {
515                          var date = item.date.length ? new Date(item.date) : null;
516                          var options = {
517                            year: 'numeric',
518                            month: 'long',
519                            day: 'numeric'
520                          };
521                          if (date) date = date.toLocaleDateString(window.theme.config.locale, options);
522                          return "<div class=\\"faithpilot__customer\\">\\n                    ".concat(window.theme.config.showFaithpilotLogo ? window.theme.faithpilot.logo : '', "\\n                    ").concat(date ? "<span>
522".concat(date, "</span>") : '', "\\n                  </div>");
523                        }(), "\\n              </div>\\n\\n              <div class=\\"before-after__content-item__product\\"").concat(products.length > 1 ? ' data-component="modalSlidein"' : '', ">\\n                <figure class=\\"before-after__content-item__product__image\\">\\n                  ").concat(function (_products$) {
524                          var imgUrl = (_products$ = products[0]) === null || _products$ === void 0 ? void 0 : _products$.images[0];
525                          var imgSrc = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '80x') : '';
526                          var imgSrcLazy = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1x') : '';
527                          return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">");
528                        }(), "\\n\\n                  <a href=\\"").concat((_products$2 = products[0]) === null || _products$2 === void 0 ? void 0 : _products$2.url, "\\" class=\\"before-after__content-item__image-link\\"></a>\\n                </figure>\\n\\n                ").concat(function () {
529                          if (products.length > 1) {
530                            if (!products[1]) return '';
531                            return "<figure class=\\"before-after__content-item__product__image\\">\\n                      ".concat(function () {
532                              var imgUrl = products[1].images[0];
533                              var imgSrc = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '80x') : '';
534                              var imgSrcLazy = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1x') : '';
535                              return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">\\n                          ").concat(window.theme.icons.plusMinus);
536                            }(), "\\n\\n                      <button type=\\"button\\" class=\\"js-openBtn\\"></button>\\n                    </figure>");
537                          }
538                          return '';
539                        }(), "\\n\\n                <div class=\\"before-after__content-item__product__text\\">\\n                  ").concat(function () {
540                          if (products.length > 1) {
541                            return "<p>".concat(item.productText.replace('[product_title]', "<button type=\\"button\\" class=\\"js-openBtn\\">".concat(strings.multipleProducts.replace('%count%', products.length), "</button>")), "</p>\\n                        <button type=\\"button\\" class=\\"js-openBtn\\">").concat(strings.viewAllProducts, "</button>");
542                          } else if (products[0]) {
543                            var _products$3 = products[0],
544                              title = _products$3.title,
545                              url = _products$3.url;
546                            return "<p>".concat(item.productText.replace('[product_title]', "<a href=\\"".concat(url, "\\">").concat(title, "</a>")), "</p>");
547                          }
548                        }(), "\\n                </div>\\n\\n                ", "\\n                ").concat(function () {
549                          return "<div class=\\"product-inspiration__modal modal-slidein js-modal\\" data-component=\\"inspirationBuyFlow\\">\\n                    <div class=\\"product-inspiration__modal__main modal-slidein__main\\">\\n                      <button type=\\"button\\" class=\\"back-button js-closeBtn\\">\\n                        ".concat(window.theme.icons.arrowLeft, "\\n                        <span class=\\"back-button__text\\">").concat(window.theme.strings.layout.goBack, "</span>\\n                      </button>\\n\\n                      <div class=\\"product-inspiration__modal__images\\">\\n                        <div class=\\"product-inspiration__modal__images__inner\\">\\n                          ").concat(function () {
550                            var imgUrl = item.imageUrl;
551                            var imgSrc = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1080x') : '';
552                            var imgSrcLazy = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1x') : '';
553                            return "<div class=\\"image-wrapper before-after\\">\\n                              <img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">\\n                              <div class=\\"image-badge image-badge--left\\">").concat(strings.before, "</div>\\n                              <div class=\\"image-badge image-badge--right\\">").concat(strings.inProgress, "</div>\\n                            </div>");
554                          }(), "\\n                        </div>\\n                      </div>\\n                    </div>\\n\\n                    <div class=\\"modal-slidein__inner\\">\\n                      <header class=\\"modal-slidein__header\\">\\n                        <p class=\\"modal-slidein__title\\">").concat(window.theme.strings.reviews.usedProducts, "</p>\\n\\n                        <button type=\\"button\\" class=\\"modal-slidein__close-button js-closeBtn\\">
554\\n                          <span class=\\"modal-slidein__close-button__text\\">").concat(window.theme.strings.layout.closeText, "</span>\\n                          ").concat(window.theme.icons.close, "\\n                        </button>\\n                      </header>\\n\\n                      <div class=\\"product-inspiration__modal__products modal-slidein__content\\">\\n                        <ul class=\\"product-inspiration__modal__product-list grid\\">\\n                          ").concat(products.map(function (p) {
555                            var _p$variants$find;
556                            return "<li class=\\"grid__item product-item js-productItem\\" data-variant-id=\\"".concat(((_p$variants$find = p.variants.find(function (v) {
557                              return v.available;
558                            })) === null || _p$variants$find === void 0 ? void 0 : _p$variants$find.id) || p.variants[0].id, "\\">\\n                              <figure class=\\"product-item__image\\">\\n                                ").concat(function () {
559                              var imgUrl = p.images[0];
560                              var imgSrc = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '540x') : '';
561                              var imgSrcLazy = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1x') : '';
562                              return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">");
563                            }(), "\\n\\n                                <a href=\\"").concat(p.url, "\\" class=\\"product-item__link\\"></a>\\n                              </figure>\\n\\n                              <p class=\\"product-item__title\\">\\n                                <a href=\\"").concat(p.url, "\\">").concat(p.title, "</a>\\n                              </p>\\n\\n                              <div class=\\"product-prices\\">\\n                                ").concat(function () {
564                              var v = p.variants.find(function (v) {
565                                return v.available;
566                              }) || p.variants[0];
567                              if (v.compare_at_price && v.compare_at_price > v.price) {
568                                return "<p class=\\"price price--compare\\">".concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(v.compare_at_price), "</p>\\n                                      <p class=\\"price price--current\\">").concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(v.price), "</p>");
569                              } else {
570                                return "<p class=\\"price price--current\\">".concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(v.price), "</p>");
571                              }
572                            }(), "\\n                              </div>\\n\\n                              <button type=\\"button\\" class=\\"cta cta--stroked-dark js-addBtn\\">").concat(window.theme.strings.product.addToCart, "</button>\\n                            </li>");
573                          }).join(''), "\\n                        </ul>\\n\\n                        <div class=\\"product-inspiration__modal__add-all\\">\\n                          <p>").concat(window.theme.strings.inspiration.buyAllProducts.replace('%count%', products.length), "</p>\\n                          <button type=\\"button\\" class=\\"cta cta--filled-dark js-addAllBtn\\">").concat(window.theme.strings.product.addToCart, "</button>\\n                        </div>\\n                      </div>\\n                    </div>\\n                  </div>");
574                        }(), "\\n              </div>\\n\\n              <p class=\\"before-after__content-item__disclaimer\\">").concat(strings.disclaimer, "</p>\\n            </div>\\n          </article>\\n\\n          <figure class=\\"before-after__image-container\\">\\n            <div class=\\"before-after__image-container__inner\\">\\n              <div class=\\"before-after__image-item is-active\\">\\n                ").concat(function () {
575                          var imgSrc = item.imageUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(item.imageUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(item.imageUrl), ''), '720x') : '';
576                          var imgSrcLazy = item.imageUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(item.imageUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(item.imageUrl), ''), '1x') : '';
577                          return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">");
578                        }(), "\\n\\n                <div class=\\"image-badge image-badge--left\\">").concat(strings.before, "</div>\\n                <div class=\\"image-badge image-badge--right\\">").concat(strings.inProgress, "</div>\\n              </div>\\n            </div>\\n          </figure>\\n        </li>");
579                        resolve(true);
580                      case 2:
581                        return _context3.a(2);
582                    }
583                  }, _callee3);
584                }));
585                return function (_x2) {
586                  return _ref.apply(this, arguments);
587                };
588              }());
589            }));
590          case 1:
591            window.app.mount();
592          case 2:
593            return _context4.a(2);
594        }
595      }, _callee4);
596    }));
597    return _renderItems.apply(this, arguments);
598  }
599  function createPagination() {
600    var btn = document.createElement('button');
601    btn.classList.add('cta', 'cta--filled-dark');
602    btn.textContent = window.theme.strings.layout.loadMore;
603    inner.appendChild(btn);
604    btn.addEventListener('click', function () {
605      renderContent();
606      if (!pages.length) {
607        btn.remove();
608      }
609    });
610  }
611}));//# sourceURL=[module]
612//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvYmVmb3JlLWFmdGVyLXBhZ2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixD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TyxDQUFDLElBQUksQ0FBQztzQkFBQzt3QkFBQSxPQUFBdUQsU0FBQSxDQUFBakYsQ0FBQTtvQkFBQTtrQkFBQSxHQUFBNkUsUUFBQTtnQkFBQSxDQUNmO2dCQUFBLGlCQUFBbUUsR0FBQTtrQkFBQSxPQUFBcEUsSUFBQSxDQUFBOUMsS0FBQSxPQUFBRCxTQUFBO2dCQUFBO2NBQUEsSUFBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1VBQUE7WUFFSG9CLE1BQU0sQ0FBQ2dCLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7VUFBQztZQUFBLE9BQUFPLFNBQUEsQ0FBQXpFLENBQUE7UUFBQTtNQUFBLEdBQUF3RSxRQUFBO0lBQUEsQ0FDcEI7SUFBQSxPQUFBRCxZQUFBLENBQUF6QyxLQUFBLE9BQUFELFNBQUE7RUFBQTtFQUVELFNBQVNtQyxnQkFBZ0JBLENBQUEsRUFBRztJQUMxQixJQUFNaUYsR0FBRyxHQU
612FHMUQsUUFBUSxDQUFDQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBRTVDeUQsR0FBRyxDQUFDQyxTQUFTLENBQUNDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsa0JBQWtCLENBQUM7SUFDM0NGLEdBQUcsQ0FBQ0csV0FBVyxHQUFHbkcsTUFBTSxDQUFDQyxLQUFLLENBQUNGLE9BQU8sQ0FBQytFLE1BQU0sQ0FBQ3NCLFFBQVE7SUFDdEQ3RyxLQUFLLENBQUNpRCxXQUFXLENBQUN3RCxHQUFHLENBQUM7SUFFdEJBLEdBQUcsQ0FBQ0ssZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFlBQU07TUFDbEN2RixhQUFhLENBQUMsQ0FBQztNQUVmLElBQUksQ0FBQ2hCLEtBQUssQ0FBQzVDLE1BQU0sRUFBRTtRQUNqQjhJLEdBQUcsQ0FBQ00sTUFBTSxDQUFDLENBQUM7TUFDZDtJQUNGLENBQUMsQ0FBQztFQUNKO0FBQ0YsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvY29tcG9uZW50cy9ibG9nL2JlZm9yZS1hZnRlci1wYWdlLmpzP2E2M2MiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHsgY29tcG9uZW50IH0gZnJvbSAncGljb2FwcCc7XG5pbXBvcnQgeyBnZXRTaXplZEltYWdlVXJsLCBpbWFnZVNpemUgfSBmcm9tICdAL2xpYi9pbWFnZXMnO1xuaW1wb3J0IHsgZm9ybWF0TW9uZXkgfSBmcm9tICdAL2xpYi9jdXJyZW5jeSc7XG5pbXBvcnQgZmV0Y2hQYWdpbmF0ZWRJdGVtcyBmcm9tICdAL2xpYi9mZXRjaC1wYWdpbmF0ZWQtaXRlbXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQoKG5vZGUpID0+IHtcbiAgY29uc3QgRU5EUE9JTlQgPSAnL2Jsb2dzL2JlZm9yZS1hZnRlcj92aWV3PWRhdGFfYmVmb3JlLWFmdGVyJztcblxuICBjb25zdCBpbm5lciA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLWlubmVyJyk7XG4gIGNvbnN0IGxpc3QgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoJy5qcy1saXN0Jyk7XG4gIGNvbnN0IHsgb25seUhhbmRsZSB9ID0gbm9kZS5kYXRhc2V0O1xuICBjb25zdCBwYWdlU2l6ZSA9IHBhcnNlSW50KG5vZGUuZGF0YXNldC5wYWdlU2l6ZSk7XG4gIGNvbnN0IHBhZ2VzID0gW107XG4gIGNvbnN0IHN0cmluZ3MgPSB3aW5kb3cudGhlbWUuc3RyaW5ncy5yZXZpZXdzO1xuXG4gIGluaXQoKTtcblxuICBhc3luYyBmdW5jdGlvbiBpbml0KCkge1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgZmV0Y2hQYWdpbmF0ZWRJdGVtcyhFTkRQT0lOVCk7XG5cbiAgICAvLyBUaGlzIGlzIHNvIHdlIGNhbiB1c2UgdGhlIHNhbWUgY29tcG9uZW50IG9uIHRoZSBiZWZvcmUtYWZ0ZXIgYXJ0aWNsZSBwYWdlLFxuICAgIC8vIHdoZXJlIGl0IHNob3VsZCBvbmx5IGxvYWQgdGhlIG9uZSBpdGVtIHdpdGggdGhlIGNvcnJlY3QgaGFuZGxlXG4gICAgaWYgKG9ubHlIYW5kbGUpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtcy5maW5kKChpKSA9PiBpLmhhbmRsZSA9PT0gb25seUhhbmRsZSk7XG4gICAgICByZW5kZXJJdGVtcyhbaXRlbV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHBhZ2VzLnB1c2goaXRlbXMuc3BsaWNlKDAsIHBhZ2VTaXplKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHJlbmRlckNvbnRlbnQoKTtcblxuICAgICAgaWYgKHBhZ2VzLmxlbmd0aCkge1xuICAgICAgICBjcmVhdGVQYWdpbmF0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2luZG93LmFwcC5tb3VudCgpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVuZGVyQ29udGVudCgpIHtcbiAgICBhd2FpdCByZW5kZXJJdGVtcyhwYWdlcy5zcGxpY2UoMCwxKVswXSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZW5kZXJJdGVtcyhpdGVtcykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZS
612hhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9kdWN0cyA9IGF3YWl0IFByb21pc2UuYWxsKGl0ZW0ucHJvZHVjdEhhbmRsZXMubWFwKChoYW5kbGUpID0+IChcbiAgICAgICAgICBmZXRjaChgL3Byb2R1Y3RzLyR7aGFuZGxlfS5qc2ApLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAgICkpKTtcblxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbGlzdC5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgICAgIGRpdi5vdXRlckhUTUwgPSBgPGxpIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJlZm9yZS1hZnRlcl9faW1hZ2Utc2xpZGVyXCI+XG4gICAgICAgICAgICA8ZmlndXJlIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19pbWFnZS1zbGlkZXJfX3NsaWRlIGlzLWFjdGl2ZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyYyA9IGl0ZW0uaW1hZ2VVcmwgPyBnZXRTaXplZEltYWdlVXJsKGl0ZW0uaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaXRlbS5pbWFnZVVybCksICcnKSwgJzE1MTJ4JykgOiAnJztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyY0xhenkgPSBpdGVtLmltYWdlVXJsID8gZ2V0U2l6ZWRJbWFnZVVybChpdGVtLmltYWdlVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGl0ZW0uaW1hZ2VVcmwpLCAnJyksICcxeCcpIDogJyc7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBgPGltZyBzcmM9XCIke2ltZ1NyY0xhenl9XCIgZGF0YS1zcmM9XCIke2ltZ1NyY31cIiBjbGFzcz1cImxhenlsb2FkXCI+YDtcbiAgICAgICAgICAgICAgICB9KSgpfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWJhZGdlIGltYWdlLWJhZGdlLS1sZWZ0XCI+JHtzdHJpbmdzLmJlZm9yZX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtYmFkZ2UgaW1hZ2UtYmFkZ2UtLXJpZ2h0XCI+JHtzdHJpbmdzLmluUHJvZ3Jlc3N9PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9maWd1cmU+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8YXJ0aWNsZSBjbGFzcz1cImJlZm9yZS1hZnRlcl9fY29udGVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2NvbnRlbnQtaXRlbSBpcy1hY3RpdmVcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2NvbnRlbnQtaXRlbV9fdGl0bGVcIj4ke2l0ZW0udGl0bGV9PC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImJlZm9yZS1hZnRlcl9fY29udGVudC1pdGVtX19xdW90ZVwiPiR7aXRlbS5xdW90ZX08L3A+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZhaXRocGlsb3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFpdGhwaWxvdF9fc3RhcnNcIj5cbiAgICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnMgPSBwYXJzZUludChpdGVtLnN0YXJzKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWwgPSB3aW5kb3cudGhlbWUuaWNvbnMuZmFpdGhwaWxvdFN0YXJEYXJrLnJlcGVhdChzdGFycyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJzIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNSAtIHN0YXJzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gd2luZG93LnRoZW1lLmljb25zLmZhaXRocGlsb3RTdGFyVm9pZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbFxuICAgICAgICAgICAgICAgICAgfSkoKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gaXRlbS5kYXRlLmxlbmd0aCA/IG5ldyBEYXRlKGl0ZW0uZGF0ZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9O1xuXG4gICAgICAgICAgICAgICAgICBpZiAoZGF0ZSkgZGF0ZSA9IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHdpbmRvdy50aGVtZS5jb25maWcubG9jYWxlLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuICBgPGRpdiBjbGFzcz1cImZhaXRocGlsb3RfX2N1c3RvbWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICR7d2luZG93LnRoZW1lLmNvbmZpZy5zaG93RmFpdGhwaWxvdExvZ28gPyB3aW5kb3cudGhlbWUuZmFpdGhwaWxvdC5sb2dvIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICR7ZGF0ZSA/IGA8c3Bhbj4ke2RhdGV9PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgICAgICAgfSkoKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJlZm9yZS1hZnRlcl9fY29udGVudC1pdGVtX19wcm9kdWN0XCIke3Byb2R1Y3RzLmxlbmd0aCA+IDEgPyAnIGRhdGEtY29tcG9uZW50PVwibW9kYWxTbGlkZWluXCInIDogJyd9PlxuICAgICAgICAgICAgICAgIDxmaWd1cmUgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2NvbnRlbnQtaXRlbV9fcHJvZHVjdF9faW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nVXJsID0gcHJvZHVjdHNbMF0/LmltYWdlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nU3JjID0gaW1nVXJsID8gZ2V0U2l6ZWRJbWFnZVVybChpbWdVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaW1nVXJsKSwgJycpLCAnODB4JykgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nU3JjTGF6eSA9IGltZ1VybCA/IGdldFNpemVkSW1hZ2VVcmwoaW1nVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGltZ1VybCksICcnKSwgJzF4JykgOiAnJztcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxpbWcgc3JjPVwiJHtpbWdTcmNMYXp5fVwiIGRhdGEtc3JjPVwiJHtpbWdTcmN9XCIgY2x
612hc3M9XCJsYXp5bG9hZFwiPmA7XG4gICAgICAgICAgICAgICAgICB9KSgpfVxuXG4gICAgICAgICAgICAgICAgICA8YSBocmVmPVwiJHtwcm9kdWN0c1swXT8udXJsfVwiIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19jb250ZW50LWl0ZW1fX2ltYWdlLWxpbmtcIj48L2E+XG4gICAgICAgICAgICAgICAgPC9maWd1cmU+XG5cbiAgICAgICAgICAgICAgICAkeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2R1Y3RzWzFdKSByZXR1cm4gJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBgPGZpZ3VyZSBjbGFzcz1cImJlZm9yZS1hZnRlcl9fY29udGVudC1pdGVtX19wcm9kdWN0X19pbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1VybCA9IHByb2R1Y3RzWzFdLmltYWdlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyYyA9IGltZ1VybCA/IGdldFNpemVkSW1hZ2VVcmwoaW1nVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGltZ1VybCksICcnKSwgJzgweCcpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWdTcmNMYXp5ID0gaW1nVXJsID8gZ2V0U2l6ZWRJbWFnZVVybChpbWdVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaW1nVXJsKSwgJycpLCAnMXgnKSA6ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGA8aW1nIHNyYz1cIiR7aW1nU3JjTGF6eX1cIiBkYXRhLXNyYz1cIiR7aW1nU3JjfVwiIGNsYXNzPVwibGF6eWxvYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHt3aW5kb3cudGhlbWUuaWNvbnMucGx1c01pbnVzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgfSkoKX1cblxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwianMtb3BlbkJ0blwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2ZpZ3VyZT5gO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgfSkoKX1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2NvbnRlbnQtaXRlbV9fcHJvZHVjdF9fdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgJHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPHA+JHtpdGVtLnByb2R1Y3RUZXh0LnJlcGxhY2UoJ1twcm9kdWN0X3RpdGxlXScsIGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImpzLW9wZW5CdG5cIj4ke3N0cmluZ3MubXVsdGlwbGVQcm9kdWN0cy5yZXBsYWNlKCclY291bnQlJywgcHJvZHVjdHMubGVuZ3RoKX08L2J1dHRvbj5gKX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImpzLW9wZW5CdG5cIj4ke3N0cmluZ3Mudmlld0FsbFByb2R1Y3RzfTwvYnV0dG9uPmA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRpdGxlLCB1cmwgfSA9IHByb2R1Y3RzWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8cD4ke2l0ZW0ucHJvZHVjdFRleHQucmVwbGFjZSgnW3Byb2R1Y3RfdGl0bGVdJywgYDxhIGhyZWY9XCIke3VybH1cIj4ke3RpdGxlfTwvYT5gKX08L3A+YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSkoKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICR7LyogSWYgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHByb2R1Y3QsIGNyZWF0ZSBtb2RhbCBzbGlkZWluIHdpdGggcHVyY2hhc2UgZmxvdyAqLycnfVxuICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5zcGlyYXRpb25fX21vZGFsIG1vZGFsLXNsaWRlaW4ganMtbW9kYWxcIiBkYXRhLWNvbXBvbmVudD1cImluc3BpcmF0aW9uQnV5Rmxvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pbnNwaXJhdGlvbl9fbW9kYWxfX21haW4gbW9kYWwtc2xpZGVpbl9fbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYmFjay1idXR0b24ganMtY2xvc2VCdG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7d2luZG93LnRoZW1lLmljb25zLmFycm93TGVmdH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFjay1idXR0b25fX3RleHRcIj4ke3dpbmRvdy50aGVtZS5zdHJpbmdzLmxheW91dC5nb0JhY2t9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5zcGlyYXRpb25fX21vZGFsX19pbWFnZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWluc3BpcmF0aW9uX19tb2RhbF9faW1hZ2VzX19pbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAkeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nVXJsID0gaXRlbS5pbWFnZVVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWdTcmMgPSBpbWdVcmwgPyBnZXRTaXplZEltYWdlVXJsKGltZ1VybC5yZXBsYWNlKCdfJyArIGltYWdlU2l6ZShpbWdVcmwpLCAnJyksICcxMDgweCcpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nU3JjTGF6eSA9IGltZ1VybCA/IGdldFNpemVkSW1hZ2VVcmwoaW1nVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGltZ1VybCksICcnKSwgJzF4JykgOiAnJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgI
612HJldHVybiAgYDxkaXYgY2xhc3M9XCJpbWFnZS13cmFwcGVyIGJlZm9yZS1hZnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIke2ltZ1NyY0xhenl9XCIgZGF0YS1zcmM9XCIke2ltZ1NyY31cIiBjbGFzcz1cImxhenlsb2FkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtYmFkZ2UgaW1hZ2UtYmFkZ2UtLWxlZnRcIj4ke3N0cmluZ3MuYmVmb3JlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWJhZGdlIGltYWdlLWJhZGdlLS1yaWdodFwiPiR7c3RyaW5ncy5pblByb2dyZXNzfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLXNsaWRlaW5fX2lubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGhlYWRlciBjbGFzcz1cIm1vZGFsLXNsaWRlaW5fX2hlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zbGlkZWluX190aXRsZVwiPiR7d2luZG93LnRoZW1lLnN0cmluZ3MucmV2aWV3cy51c2VkUHJvZHVjdHN9PC9wPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vZGFsLXNsaWRlaW5fX2Nsb3NlLWJ1dHRvbiBqcy1jbG9zZUJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vZGFsLXNsaWRlaW5fX2Nsb3NlLWJ1dHRvbl9fdGV4dFwiPiR7d2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmNsb3NlVGV4dH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7d2luZG93LnRoZW1lLmljb25zLmNsb3NlfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pbnNwaXJhdGlvbl9fbW9kYWxfX3Byb2R1Y3RzIG1vZGFsLXNsaWRlaW5fX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInByb2R1Y3QtaW5zcGlyYXRpb25fX21vZGFsX19wcm9kdWN0LWxpc3QgZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke3Byb2R1Y3RzLm1hcChwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGA8bGkgY2xhc3M9XCJncmlkX19pdGVtIHByb2R1Y3QtaXRlbSBqcy1wcm9kdWN0SXRlbVwiIGRhdGEtdmFyaWFudC1pZD1cIiR7cC52YXJpYW50cy5maW5kKHYgPT4gdi5hdmFpbGFibGUpPy5pZCB8fCBwLnZhcmlhbnRzWzBdLmlkfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZ3VyZSBjbGFzcz1cInByb2R1Y3QtaXRlbV9faW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1VybCA9IHAuaW1hZ2VzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyYyA9IGltZ1VybCA/IGdldFNpemVkSW1hZ2VVcmwoaW1nVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGltZ1VybCksICcnKSwgJzU0MHgnKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyY0xhenkgPSBpbWdVcmwgPyBnZXRTaXplZEltYWdlVXJsKGltZ1VybC5yZXBsYWNlKCdfJyArIGltYWdlU2l6ZShpbWdVcmwpLCAnJyksICcxeCcpIDogJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxpbWcgc3JjPVwiJHtpbWdTcmNMYXp5fVwiIGRhdGEtc3JjPVwiJHtpbWdTcmN9XCIgY2xhc3M9XCJsYXp5bG9hZFwiPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiR7cC51cmx9XCIgY2xhc3M9XCJwcm9kdWN0LWl0ZW1fX2xpbmtcIj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZ3VyZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcm9kdWN0LWl0ZW1fX3Rp
612dGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIke3AudXJsfVwiPiR7cC50aXRsZX08L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXByaWNlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IHAudmFyaWFudHMuZmluZCh2ID0+IHYuYXZhaWxhYmxlKSB8fCBwLnZhcmlhbnRzWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuY29tcGFyZV9hdF9wcmljZSAmJiB2LmNvbXBhcmVfYXRfcHJpY2UgPiB2LnByaWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGA8cCBjbGFzcz1cInByaWNlIHByaWNlLS1jb21wYXJlXCI+JHtmb3JtYXRNb25leSh2LmNvbXBhcmVfYXRfcHJpY2UpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcmljZSBwcmljZS0tY3VycmVudFwiPiR7Zm9ybWF0TW9uZXkodi5wcmljZSl9PC9wPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPHAgY2xhc3M9XCJwcmljZSBwcmljZS0tY3VycmVudFwiPiR7Zm9ybWF0TW9uZXkodi5wcmljZSl9PC9wPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY3RhIGN0YS0tc3Ryb2tlZC1kYXJrIGpzLWFkZEJ0blwiPiR7d2luZG93LnRoZW1lLnN0cmluZ3MucHJvZHVjdC5hZGRUb0NhcnR9PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJycpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5zcGlyYXRpb25fX21vZGFsX19hZGQtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiR7d2luZG93LnRoZW1lLnN0cmluZ3MuaW5zcGlyYXRpb24uYnV5QWxsUHJvZHVjdHMucmVwbGFjZSgnJWNvdW50JScsIHByb2R1Y3RzLmxlbmd0aCl9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImN0YSBjdGEtLWZpbGxlZC1kYXJrIGpzLWFkZEFsbEJ0blwiPiR7d2luZG93LnRoZW1lLnN0cmluZ3MucHJvZHVjdC5hZGRUb0NhcnR9PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19jb250ZW50LWl0ZW1fX2Rpc2NsYWltZXJcIj4ke3N0cmluZ3MuZGlzY2xhaW1lcn08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2FydGljbGU+XG5cbiAgICAgICAgICA8ZmlndXJlIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19pbWFnZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2ltYWdlLWNvbnRhaW5lcl9faW5uZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJlZm9yZS1hZnRlcl9faW1hZ2UtaXRlbSBpcy1hY3RpdmVcIj5cbiAgICAgICAgICAgICAgICAkeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpbWdTcmMgPSBpdGVtLmltYWdlVXJsID8gZ2V0U2l6ZWRJbWFnZVVybChpdGVtLmltYWdlVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGl0ZW0uaW1hZ2VVcmwpLCAnJyksICc3MjB4JykgOiAnJ1xuICAgICAgICAgICAgICAgICAgY29uc3QgaW1nU3JjTGF6eSA9IGl0ZW0uaW1hZ2VVcmwgPyBnZXRTaXplZEltYWdlVXJsKGl0ZW0uaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaXRlbS5pbWFnZVVybCksICcnKSwgJzF4JykgOiAnJ1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8aW1nIHNyYz1cIiR7aW1nU3JjTGF6eX1cIiBkYXRhLXNyYz1cIiR7aW1nU3JjfVwiIGNsYXNzPVwibGF6eWxvYWRcIj5gXG4gICAgICAgICAgICAgICAgfSkoKX1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1iYWRnZSBpbWFnZS1iYWRnZS0tbGVmdFwiPiR7c3RyaW5ncy5iZWZvcmV9PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWJhZGdlIGltYWdlLWJhZGdlLS1yaWdodFwiPiR7c3RyaW5ncy5pblByb2dyZXNzfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZmlndXJlPlxuICAgICAgICA8L2xpPmBcblxuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuXG4gICAgd2luZG93LmFwcC5tb3VudCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUGFnaW5hdGlvbigpIHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblxuICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdjdGEnLCdjdGEtLWZpbGxlZC1kYXJrJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gd2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmxvYWRNb3JlO1xuICAgIGlubmVyLmFwcGVuZENoaWxkKGJ0bik7XG5cbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICByZW5kZXJDb250ZW50KCk7XG5cbiAgICAgIGlmICghcGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGJ0bi5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG59KTtcbiJdLCJuYW1lcyI6WyJlIiwidCIsInIiLCJTeW1ib2wiLCJuIiwiaXRlcmF0b3IiLCJvIiwidG9TdHJpbmdUYWciLCJpIiwiYyIsInByb3RvdHlwZSIsIkdlbmVyYXRvciIsInUiLCJPYmplY3QiLCJjcmVhdGUiLCJfcmVnZW5lcmF0b3JEZWZpbmUyIiwiZiIsInAiLCJ5IiwiRyIsInYiLCJhIiwiZCIsImJpbmQiLCJsZW5ndGgiLCJsIiwiVHlwZUVycm9yIiwiY2FsbCIsImRvbmUiLCJ2YWx1ZSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiZGlzcGxheU5hbWUiLCJfcmVnZW5lcmF0b3IiLCJ3IiwibSIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yRGVmaW5lIiwiX2ludm9rZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsImNvbXBvbmVudCIsImdldFNpemVkSW1hZ2VVcmwiLCJpbWFnZVNpemUiLCJmb3JtYXRNb25leSIsImZldGNoUGFnaW5hdGVkSXRlbXMiLCJub2RlIiwiRU5EUE9JTlQiLCJpbm5lciIsInF1ZXJ5U2VsZWN0b3IiLCJsaXN0Iiwib25seUhhbmRsZSIsImRhdGFzZXQiLCJwYWdlU2l6ZSIsInBhcnNlSW50IiwicGFnZXMiLCJzdHJpbmdzIiwid2luZG93IiwidGhlbWUiLCJyZXZpZXdzIiwiaW5pdCIsIl9pbml0IiwiX2NhbGxlZSIsIml0ZW1zIiwiaXRlbSIsIl9jb250ZXh0IiwiZmluZCIsImhhbmRsZSIsInJlbmRlckl0ZW1zIiwicHVzaCIsInNwbGljZSIsInJlbmRlckNvbnRlbnQiLCJjcmVhdGVQYWdpbmF0aW9uIiwiYXBwIiwibW91bnQiLCJfcmVuZGVyQ29udGVudCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiX3giLCJfcmVuZGVySXRlbXMiLCJfY2FsbGVlNCIsIl9jb250ZXh0NCIsImFsbCIsIm1hcCIsIl9yZWYiLCJfY2FsbGVlMyIsIl9wcm9kdWN0cyQyIiwicHJvZHVjdHMiLCJkaXYiLCJfY29udGV4dDMiLCJwcm9kdWN0SGFuZGxlcyIsImZldGNoIiwiY29uY2F0IiwicmVzcG9uc2UiLCJqc29uIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJvdXRlckhUTUwiLCJpbWdTcmMiLCJpbWFnZVVybCIsInJlcGxhY2UiLCJpbWdTcmNMYXp5IiwiYmVmb3JlIiwiaW5Qcm9ncmVzcyIsInRpdGxlIiwicXVvdGUiLCJzdGFycyIsImh0bWwiLCJpY29ucyIsImZhaXRocGlsb3RTdGFyRGFyayIsInJlcGVhdCIsImZhaXRocGlsb3RTdGFyVm9pZCIsImRhdGUiLCJEYXRlIiwib3B0aW9ucyIsInllYXIiLCJtb250aCIsImRheSIsInRvTG9jYWxlRGF0ZVN0cmluZyIsImNvbmZpZyIsImxvY2FsZSIsInNob3dGYWl0aHBpbG90TG9nbyIsImZhaXRocGlsb3QiLCJsb2dvIiwiX3Byb2R1Y3RzJCIsImltZ1VybCIsImltYWdlcyIsInVybCIsInBsdXNNaW51cyIsInByb2R1Y3RU
612ZXh0IiwibXVsdGlwbGVQcm9kdWN0cyIsInZpZXdBbGxQcm9kdWN0cyIsIl9wcm9kdWN0cyQzIiwiYXJyb3dMZWZ0IiwibGF5b3V0IiwiZ29CYWNrIiwidXNlZFByb2R1Y3RzIiwiY2xvc2VUZXh0IiwiY2xvc2UiLCJfcCR2YXJpYW50cyRmaW5kIiwidmFyaWFudHMiLCJhdmFpbGFibGUiLCJpZCIsImNvbXBhcmVfYXRfcHJpY2UiLCJwcmljZSIsInByb2R1Y3QiLCJhZGRUb0NhcnQiLCJqb2luIiwiaW5zcGlyYXRpb24iLCJidXlBbGxQcm9kdWN0cyIsImRpc2NsYWltZXIiLCJfeDIiLCJidG4iLCJjbGFzc0xpc3QiLCJhZGQiLCJ0ZXh0Q29udGVudCIsImxvYWRNb3JlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZSJdLCJzb3VyY2VSb290IjoiIn0=
613//# sourceURL=webpack-internal:///./src/scripts/components/blog/before-after-page.js
614
615}`)},"./src/scripts/components/blog/faithpilot-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
616/* harmony export */ __webpack_require__.d(__webpack_exports__, {
617/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
618/* harmony export */ });
619/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js");
620/* harmony import */ var _lib_faithpilot__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/faithpilot */ "./src/scripts/lib/faithpilot.js");
621/* harmony import */ var _lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/fetch-paginated-items */ "./src/scripts/lib/fetch-paginated-items.js");
622function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
623function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
624function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
625function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
626
627
628
629/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) {
630  var ENDPOINT = '/blogs/reviews?view=data_faithpilot';
631  var inner = node.querySelector('.js-inner');
632  var list = node.querySelector('.js-list');
633  var onlyHandle = node.dataset.onlyHandle;
634  var pageSize = parseInt(node.dataset.pageSize);
635  var pages = [];
636  var renderItems = function renderItems() {
637    (0,_lib_faithpilot__WEBPACK_IMPORTED_MODULE_1__.renderFaithpilotItems)(pages.splice(0, 1)[0], list, pageSize, false);
638  };
639  var createPagination = function createPagination() {
640    var btn = document.createElement('button');
641    btn.classList.add('cta', 'cta--filled-dark');
642    btn.textContent = window.theme.strings.layout.loadMore;
643    inner.appendChild(btn);
644    btn.addEventListener('click', function () {
645      renderItems();
646      if (!pages.length) {
647        btn.remove();
648      }
649    });
650  };
651  var init = /*#__PURE__*/function () {
652    var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
653      var items;
654      return _regenerator().w(function (_context) {
655        while (1) switch (_context.n) {
656          case 0:
657            _context.n = 1;
658            return (0,_lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_2__["default"])(ENDPOINT);
659          case 1:
660            items = _context.v;
661            // This is so we can use the same component on the faithpilot article page,
662            // where it should only load the one item with the correct handle
663            if (onlyHandle) {
664              (0,_lib_faithpilot__WEBPACK_IMPORTED_MODULE_1__.renderFaithpilotItems)(items.find(function (i) {
665                return i.handle === onlyHandle;
666              }), list, null, false);
667            } else {
668              while (items.length) {
669                pages.push(items.splice(0, pageSize));
670              }
671              renderItems();
672              if (pages.length) {
673                createPagination();
674              }
675            }
676          case 2:
677            return _context.a(2);
678        }
679      }, _callee);
680    }));
681    return function init() {
682      return _ref.apply(this, arguments);
683    };
684  }();
685  init();
686}));//# sourceURL=[module]
687//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvZmFpdGhwaWxvdC1wYWdlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFB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zRUFBbUIsQ0FBQ0UsUUFBUSxDQUFDO1VBQUE7WUFBM0M2QixLQUFLLEdBQUFDLFFBQUEsQ0FBQXBFLENBQUE7WUFFWDtZQUNBO1lBQ0EsSUFBSTBDLFVBQVUsRUFBRTtjQUNkUCxzRUFBcUIsQ0FBQ2dDLEtBQUssQ0FBQ0UsSUFBSSxDQUFDLFVBQUFqRixDQUFDO2dCQUFBLE9BQUlBLENBQUMsQ0FBQ2tGLE1BQU0sS0FBSzVCLFVBQVU7Y0FBQSxFQUFDLEVBQUVELElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO1lBQ3BGLENBQUMsTUFBTTtjQUNMLE9BQU8wQixLQUFLLENBQUMvRCxNQUFNLEVBQUU7Z0JBQ25CMEMsS0FBSyxDQUFDeUIsSUFBSSxDQUFDSixLQUFLLENBQUNuQixNQUFNLENBQUMsQ0FBQyxFQUFFSixRQUFRLENBQUMsQ0FBQztjQUN2QztjQUVBRyxXQUFXLENBQUMsQ0FBQztjQUViLElBQUlELEtBQUssQ0FBQzFDLE1BQU0sRUFBRTtnQkFDaEI2QyxnQkFBZ0IsQ0FBQyxDQUFDO2NBQ3BCO1lBQ0Y7VUFBQztZQUFBLE9BQUFtQixRQUFBLENBQUFuRSxDQUFBO1FBQUE7TUFBQSxHQUFBaUUsT0FBQTtJQUFBLENBQ0Y7SUFBQSxnQkFsQktGLElBQUlBLENBQUE7TUFBQSxPQUFBQyxJQUFBLENBQUFsQyxLQUFBLE9BQUFELFNBQUE7SUFBQTtFQUFBLEdBa0JUO0VBRURrQyxJQUFJLENBQUMsQ0FBQztBQUNSLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy9mYWl0aHBpbG90LXBhZ2UuanM/NmUzZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tICdwaWNvYXBwJztcbmltcG9ydCB7
vendor: 6,328 bytes, lines 687-698
687IHJlbmRlckZhaXRocGlsb3RJdGVtcyB9IGZyb20gJ0AvbGliL2ZhaXRocGlsb3QnO1xuaW1wb3J0IGZldGNoUGFnaW5hdGVkSXRlbXMgZnJvbSAnQC9saWIvZmV0Y2gtcGFnaW5hdGVkLWl0ZW1zJztcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlKSA9PiB7XG4gIGNvbnN0IEVORFBPSU5UID0gJy9ibG9ncy9yZXZpZXdzP3ZpZXc9ZGF0YV9mYWl0aHBpbG90JztcblxuICBjb25zdCBpbm5lciA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLWlubmVyJyk7XG4gIGNvbnN0IGxpc3QgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoJy5qcy1saXN0Jyk7XG5cbiAgY29uc3QgeyBvbmx5SGFuZGxlIH0gPSBub2RlLmRhdGFzZXQ7XG4gIGNvbnN0IHBhZ2VTaXplID0gcGFyc2VJbnQobm9kZS5kYXRhc2V0LnBhZ2VTaXplKTtcbiAgY29uc3QgcGFnZXMgPSBbXTtcblxuICBjb25zdCByZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICByZW5kZXJGYWl0aHBpbG90SXRlbXMocGFnZXMuc3BsaWNlKDAsMSlbMF0sIGxpc3QsIHBhZ2VTaXplLCBmYWxzZSk7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlUGFnaW5hdGlvbiA9ICgpID0+IHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblxuICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdjdGEnLCdjdGEtLWZpbGxlZC1kYXJrJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gd2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmxvYWRNb3JlO1xuICAgIGlubmVyLmFwcGVuZENoaWxkKGJ0bilcblxuICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHJlbmRlckl0ZW1zKCk7XG5cbiAgICAgIGlmICghcGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGJ0bi5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBpbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgZmV0Y2hQYWdpbmF0ZWRJdGVtcyhFTkRQT0lOVCk7XG5cbiAgICAvLyBUaGlzIGlzIHNvIHdlIGNhbiB1c2UgdGhlIHNhbWUgY29tcG9uZW50IG9uIHRoZSBmYWl0aHBpbG90IGFydGljbGUgcGFnZSxcbiAgICAvLyB3aGVyZSBpdCBzaG91bGQgb25seSBsb2FkIHRoZSBvbmUgaXRlbSB3aXRoIHRoZSBjb3JyZWN0IGhhbmRsZVxuICAgIGlmIChvbmx5SGFuZGxlKSB7XG4gICAgICByZW5kZXJGYWl0aHBpbG90SXRlbXMoaXRlbXMuZmluZChpID0+IGkuaGFuZGxlID09PSBvbmx5SGFuZGxlKSwgbGlzdCwgbnVsbCwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHBhZ2VzLnB1c2goaXRlbXMuc3BsaWNlKDAsIHBhZ2VTaXplKSk7XG4gICAgICB9XG5cbiAgICAgIHJlbmRlckl0ZW1zKCk7XG5cbiAgICAgIGlmIChwYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgY3JlYXRlUGFnaW5hdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpbml0KCk7XG59KTsiXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJjb21wb25lbnQiLCJyZW5kZXJGYWl0aHBpbG90SXRlbXMiLCJmZXRjaFBhZ2luYXRlZEl0ZW1zIiwibm9kZSIsIkVORFBPSU5UIiwiaW5uZXIiLCJxdWVyeVNlbGVjdG9yIiwibGlzdCIsIm9ubHlIYW5kbGUiLCJkYXRhc2V0IiwicGFnZVNpemUiLCJwYXJzZUludCIsInBhZ2VzIiwicmVuZGVySXRlbXMiLCJzcGxpY2UiLCJjcmVhdGVQYWdpbmF0aW9uIiwiYnRuIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwidGV4dENvbnRlbnQiLCJ3aW5kb3ciLCJ0aGVtZSIsInN0cmluZ3MiLCJsYXlvdXQiLCJsb2FkTW9yZSIsImFwcGVuZENoaWxkIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZSIsImluaXQiLCJfcmVmIiwiX2NhbGxlZSIsIml0ZW1zIiwiX2NvbnRleHQiLCJmaW5kIiwiaGFuZGxlIiwicHVzaCJdLCJzb3VyY2VSb290IjoiIn0=
688//# sourceURL=webpack-internal:///./src/scripts/components/blog/faithpilot-page.js
689
690}`)},"./src/scripts/components/blog/ingredients-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
691/* harmony export */ __webpack_require__.d(__webpack_exports__, {
692/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
693/* harmony export */ });
694/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js");
695/* harmony import */ var _lib_images_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/images.js */ "./src/scripts/lib/images.js");
696/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gsap */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js");
697/* harmony import */ var gsap_ScrollTrigger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! gsap/ScrollTrigger */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/ScrollTrigger.js");
698function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
vendor: 4,337 bytes, lines 698-733
698 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
699function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
700function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
701function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
702function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
703function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
704function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
705function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
706function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
707function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
708
709
710
711
712gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.registerPlugin(gsap_ScrollTrigger__WEBPACK_IMPORTED_MODULE_3__.ScrollTrigger);
713/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) {
714  /*******************************************************************************************************************************************/
715  /* Data + Elements
716  /*******************************************************************************************************************************************/
717  var _zelektor = zelektor(node),
718    nav = _zelektor.nav,
719    listWrapper = _zelektor.listWrapper,
720    list = _zelektor.list;
721  var backgroundPatternHeight = 250; // Sets the pattern height in vh units
722
723  // List background parallax speeds
724  var speeds = {
725    slow: 2,
726    medium: 4,
727    fast: 6
728  };
729
730  /*******************************************************************************************************************************************/
731  /* Event Listeners
732  /*******************************************************************************************************************************************/
733  window.addEventListener('resize', (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.debounce)(updateListBackgroun
733d));
734
735  /*******************************************************************************************************************************************/
736  /* Init
737  /*******************************************************************************************************************************************/
738  init();
739
740  /*******************************************************************************************************************************************/
741  /* Functions
742  /*******************************************************************************************************************************************/
743  function init() {
744    return _init.apply(this, arguments);
745  }
746  function _init() {
747    _init = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
748      var items, sortedItems, letters;
749      return _regenerator().w(function (_context) {
750        while (1) switch (_context.n) {
751          case 0:
752            _context.n = 1;
753            return fetch("/blogs/ingredients?view=data_ingredients").then(function (r) {
754              return r.json();
755            });
756          case 1:
757            items = _context.v;
758            sortedItems = (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.sortAlphabetically)(items).filter(function (i) {
759              return !i.tags.find(function (t) {
760                return t === 'page_omit';
761              });
762            });
763            letters = _toConsumableArray(new Set(sortedItems.map(function (i) {
764              return i.title[0].toLowerCase();
765            })));
766            renderList(letters, sortedItems);
767            renderNav(letters);
768            updateListBackground();
769          case 2:
770            return _context.a(2);
771        }
772      }, _callee);
773    }));
774    return _init.apply(this, arguments);
775  }
776  function renderList(letters, items) {
777    list.innerHTML = "\\n                            ".concat(letters.map(function (l) {
778      return "\\n                                        <section class=\\"ingredients__list-division js-listDivision\\" data-letter=\\"".concat(l, "\\">\\n                                            <div class=\\"ingredients__list-division__letter title title--large\\">").concat(l.toUpperCase(), "</div>\\n                                            <ul class=\\"ingredients__item-list\\">\\n                                                ").concat(items.filter(function (i) {
779        return i.title[0].toLowerCase() === l;
780      }).map(function (i) {
781        return "\\n                                                            <li class=\\"ingredients__item\\">\\n                                                                <p class=\\"ingredients__item__title\\">".concat(i.title, "</p>\\n                                                                <div class=\\"ingredients__item__content\\">\\n                                                                    <div class=\\"ingredients__item__text rte\\">").concat(i.descriptionLong, "</div>\\n                                                                    ").concat(function () {
782          if (i.imageUrl) {
783            var imgSrc = (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.imageSize)(i.imageUrl), ''), '180x');
784            var imgSrcLazy = (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.imageSize)(i.imageUrl), ''), '1x');
785            return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">");
786          } else {
787            return '';
788          }
789        }(), "\\n                                                                </div>\\n                                                            </li>\\n                                                            ");
790      }).join(''), "\\n                                            </ul>\\n                                        </section>\\n                                        ");
791    }).join(''), "\\n                            ");
792  }
793  function renderNav(letters) {
794    nav.innerHTML = "\\n                        ".concat(letters.map(function (l) {
795      return "<button type=\\"button\\" class=\\"ingredients__nav__button js-btn\\" data-letter=\\"".concat(l, "\\">").concat(l, "</button>");
796    }).join(''), "\\n                        ");
797    initNav();
798  }
799  function initNav() {
800    var _zelektor2 = zelektor(nav),
801      btns = _zelektor2.btn;
802    loopify(btns).forEach(function (btn) {
803      btn.addEventListener('click', scrollToDivision);
804    });
805  }
806  function scrollToDivision(e) {
807    var letter = e.currentTarget.dataset.letter;
808    var _zelektor3 = zelektor(list),
809      divisions = _zelektor3.listDivision;
810    var match = loopify(divisions).find(function (d) {
811      return d.dataset.letter === letter;
812    });
813    var headerHeight = parseInt(getComputedStyle(root).getPropertyValue('--header-height').replace('px', ''));
814    var navHeight = parseInt(getComputedStyle(nav).getPropertyValue('height').replace('px', ''));
815    (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.smoothScroll)(match, {
816      offset: -headerHeight - navHeight - 20
817    });
818  }
819  function updateListBackground() {
820    var _zelektor4 = zelektor(listWrapper),
821      listBackgrounds = _zelektor4.listBackground;
822
823    // If the listWrapper scroll height is larger than the background pattern,
824    // duplicate the pattern x amount of times to fill the listWrapper
825    var listHeight = listWrapper.scrollHeight;
826    var backgroundHeight = loopify(listBackgrounds)[0].offsetHeight;
827    var reps = Math.ceil(listHeight / backgroundHeight);
828    var firstClone = loopify(listBackgrounds)[0].cloneNode(true);
829    firstClone.classList.remove('is-initialized');
830
831    // Background is hidden on mobile, so backgroundHeight = 0,
832    // so reps becomes = Infinity
833    // So to prevent infinite loop...
834    if (reps === Infinity) return;
835    loopify(listBackgrounds).forEach(function (b) {
836      return b.remove();
837    });
838    for (var i = 0; i < reps; i++) {
839      var clone = firstClone.cloneNode(true);
840
841      // Remove styles from images to reset animated properties for the new clone
842      var _zelektor5 = zelektor(clone),
843        images = _zelektor5.image;
844      loopify(images).forEach(function (i) {
845        return i.style = '';
846      });
847      listWrapper.appendChild(clone);
848      clone.style.top = "".concat(backgroundPatternHeight * i, "vh");
849    }
850    var _zelektor6 = zelektor(listWrapper),
851      updatedBackgrounds = _zelektor6.listBackground;
852    updatedBackgrounds.forEach(function (b) {
853      initBackgroundAnim(b);
854      b.classList.add('is-initialized');
855    });
856  }
857  function initBackgroundAnim(background) {
858    var _zelektor7 = zelektor(background),
859      images = _zelektor7.image;
860    loopify(images).forEach(function (i) {
861      var speed = i.dataset.speed;
862      var top = parseFloat(getComputedStyle(i).top);
863      gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.to(i, {
864        top: top - window.innerHeight * speeds[speed] / 4,
865        // yPercent: speeds[speed],
866        ease: 'none',
867        scrollTrigger: {
868          trigger: background,
869          scrub: true
870        }
871      });
872    });
873  }
874}));//# sourceURL=[module]
875//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvaW5ncmVkaWVudHMtcGFnZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OzswQkFDQSx1S0FBQUEsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxDQUFBLEdBQUFGLENBQUEsQ0FBQUcsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSixDQUFBLENBQUFLLFdBQUEsOEJBQUFDLEVBQUFOLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsUUFBQUMsQ0FBQSxHQUFBTCxDQUFBLElBQUFBLENBQUEsQ0FBQU0sU0FBQSxZQUFBQyxTQUFBLEdBQUFQLENBQUEsR0FBQU8sU0FBQSxFQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsTUFBQSxDQUFBTCxDQUFBLENBQUFDLFNBQUEsVUFBQUssbUJBQUEsQ0FBQUgsQ0FBQSx1QkFBQVYsQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsUUFBQUUsQ0FBQSxFQUFBQyxDQUFBLEVBQUFHLENBQUEsRUFBQUksQ0FBQSxNQUFBQyxDQUFBLEdBQUFYLENBQUEsUUFBQVksQ0FBQSxPQUFBQyxDQUFBLEtBQUFGLENBQUEsS0FBQWIsQ0FBQSxLQUFBZ0IsQ0FBQSxFQUFBcEIsQ0FBQSxFQUFBcUIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFOLENBQUEsRUFBQU0sQ0FBQSxDQUFBQyxJQUFBLENBQUF2QixDQUFBLE1BQUFzQixDQUFBLFdBQUFBLEVBQUFyQixDQUFBLEVBQUFDLENBQUEsV0FBQU0sQ0FBQSxHQUFBUCxDQUFBLEVBQUFRLENBQUEsTUFBQUcsQ0FBQSxHQUFBWixDQUFBLEVBQUFtQixDQUFBLENBQUFmLENBQUEsR0FBQUYsQ0FBQSxFQUFBbUIsQ0FBQSxnQkFBQUMsRUFBQXBCLENBQUEsRUFBQUUsQ0FBQSxTQUFBSyxDQUFBLEdBQUFQLENBQUEsRUFBQVUsQ0FBQSxHQUFBUixDQUFBLEVBQUFILENBQUEsT0FBQWlCLENBQUEsSUFBQUYsQ0FBQSxLQUFBVixDQUFBLElBQUFMLENBQUEsR0FBQWdCLENBQUEsQ0FBQU8sTUFBQSxFQUFBdkIsQ0FBQSxVQUFBSyxDQUFBLEVBQUFFLENBQUEsR0FBQVMsQ0FBQSxDQUFBaEIsQ0FBQSxHQUFBcUIsQ0FBQSxHQUFBSCxDQUFBLENBQUFGLENBQUEsRUFBQVEsQ0FBQSxHQUFBakIsQ0FBQSxLQUFBTixDQUFBLFFBQUFJLENBQUEsR0FBQW1CLENBQUEsS0FBQXJCLENBQUEsTUFBQVEsQ0FBQSxHQUFBSixDQUFBLEVBQUFDLENBQUEsR0FBQUQsQ0FBQSxZQUFBQyxDQUFBLFdBQUFELENBQUEsTUFBQUEsQ0FBQSxNQUFBUixDQUFBLElBQUFRLENBQUEsT0FBQWMsQ0FBQSxNQUFBaEIsQ0FBQSxHQUFBSixDQUFBLFFBQUFvQixDQUFBLEdBQUFkLENBQUEsUUFBQUMsQ0FBQSxNQUFBVSxDQUFBLENBQUFDLENBQUEsR0FBQWhCLENBQUEsRUFBQWUsQ0FBQSxDQUFBZixDQUFBLEdBQUFJLENBQUEsT0FBQWMsQ0FBQSxHQUFBRyxDQUFBLEtBQUFuQixDQUFBLEdBQUFKLENBQUEsUUFBQU0sQ0FBQSxNQUFBSixDQUFBLElBQUFBLENBQUEsR0FBQXFCLENBQUEsTUFBQWpCLENBQUEsTUFBQU4sQ0FBQSxFQUFBTSxDQUFBLE1BQUFKLENBQUEsRUFBQWUsQ0FBQSxDQUFBZixDQUFBLEdBQUFxQixDQUFBLEVBQUFoQixDQUFBLGNBQUFILENBQUEsSUFBQUosQ0FBQSxhQUFBbUIsQ0FBQSxRQUFBSCxDQUFBLE9BQUFkLENBQUEscUJBQUFFLENBQUEsRUFBQVcsQ0FBQSxFQUFBUSxDQUFBLFFBQUFULENBQUEsWUFBQVUsU0FBQSx1Q0FBQVIsQ0FBQSxVQUFBRCxDQUFBLElBQUFLLENBQUEsQ0FBQUwsQ0FBQSxFQUFBUSxDQUFBLEdBQUFoQixDQUFBLEdBQUFRLENBQUEsRUFBQUwsQ0FBQSxHQUFBYSxDQUFBLEdBQUF4QixDQUFBLEdBQUFRLENBQUEsT0FBQVQsQ0FBQSxHQUFBWSxDQUFBLE1BQUFNLENBQUEsS0FBQVYsQ0FBQSxLQUFBQyxDQUFBLEdBQUFBLENBQUEsUUFBQUEsQ0FBQSxTQUFBVSxDQUFBLENBQUFmLENBQUEsUUFBQWtCLENBQUEsQ0FBQWIsQ0FBQSxFQUFBRyxDQUFBLEtBQUFPLENBQUEsQ0FBQWYsQ0FBQSxHQUFBUSxDQUFBLEdBQUFPLENBQUEsQ0FBQUMsQ0FBQSxHQUFBUixDQUFBLGFBQUFJLENBQUEsTUFBQVIsQ0FBQSxRQUFBQyxDQUFBLEtBQUFILENBQUEsWUFBQUwsQ0FBQSxHQUFBTyxDQUFBLENBQUFGLENBQUEsV0FBQUwsQ0FBQSxHQUFBQSxDQUFBLENBQUEwQixJQUFBLENBQUFuQixDQUFBLEVBQUFJLENBQUEsVUFBQWMsU0FBQSwyQ0FBQXpCLENBQUEsQ0FBQTJCLElBQUEsU0FBQTNCLENBQUEsRUFBQVcsQ0FBQSxHQUFBWCxDQUFBLENBQUE0QixLQUFBLEVBQUFwQixDQUFBLFNBQUFBLENBQUEsb0JBQUFBLENBQUEsS0FBQVIsQ0FBQSxHQUFBTyxDQUFBLGVBQUFQLENBQUEsQ0FBQTBCLElBQUEsQ0FBQW5CLENBQUEsR0FBQUMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFjLFNBQUEsdUNBQUFwQixDQUFBLGdCQUFBRyxDQUFBLE9BQUFELENBQUEsR0FBQVIsQ0FBQSxjQUFBQyxDQUFBLElBQUFpQixDQUFBLEdBQUFDLENBQUEsQ0FBQWYsQ0FBQSxRQUFBUSxDQUFBLEdBQUFWLENBQUEsQ0FBQXlCLElBQUEsQ0FBQXZCLENBQUEsRUFBQWUsQ0FBQSxPQUFBRSxDQUFBLGtCQUFBcEIsQ0FBQSxJQUFBTyxDQUFBLEdBQUFSLENBQUEsRUFBQVMsQ0FBQSxNQUFBRyxDQUFBLEdBQUFYLENBQUEsY0FBQWUsQ0FBQSxtQk
875FBQWEsS0FBQSxFQUFBNUIsQ0FBQSxFQUFBMkIsSUFBQSxFQUFBVixDQUFBLFNBQUFoQixDQUFBLEVBQUFJLENBQUEsRUFBQUUsQ0FBQSxRQUFBSSxDQUFBLFFBQUFTLENBQUEsZ0JBQUFWLFVBQUEsY0FBQW1CLGtCQUFBLGNBQUFDLDJCQUFBLEtBQUE5QixDQUFBLEdBQUFZLE1BQUEsQ0FBQW1CLGNBQUEsTUFBQXZCLENBQUEsTUFBQUwsQ0FBQSxJQUFBSCxDQUFBLENBQUFBLENBQUEsSUFBQUcsQ0FBQSxTQUFBVyxtQkFBQSxDQUFBZCxDQUFBLE9BQUFHLENBQUEsaUNBQUFILENBQUEsR0FBQVcsQ0FBQSxHQUFBbUIsMEJBQUEsQ0FBQXJCLFNBQUEsR0FBQUMsU0FBQSxDQUFBRCxTQUFBLEdBQUFHLE1BQUEsQ0FBQUMsTUFBQSxDQUFBTCxDQUFBLFlBQUFPLEVBQUFoQixDQUFBLFdBQUFhLE1BQUEsQ0FBQW9CLGNBQUEsR0FBQXBCLE1BQUEsQ0FBQW9CLGNBQUEsQ0FBQWpDLENBQUEsRUFBQStCLDBCQUFBLEtBQUEvQixDQUFBLENBQUFrQyxTQUFBLEdBQUFILDBCQUFBLEVBQUFoQixtQkFBQSxDQUFBZixDQUFBLEVBQUFNLENBQUEseUJBQUFOLENBQUEsQ0FBQVUsU0FBQSxHQUFBRyxNQUFBLENBQUFDLE1BQUEsQ0FBQUYsQ0FBQSxHQUFBWixDQUFBLFdBQUE4QixpQkFBQSxDQUFBcEIsU0FBQSxHQUFBcUIsMEJBQUEsRUFBQWhCLG1CQUFBLENBQUFILENBQUEsaUJBQUFtQiwwQkFBQSxHQUFBaEIsbUJBQUEsQ0FBQWdCLDBCQUFBLGlCQUFBRCxpQkFBQSxHQUFBQSxpQkFBQSxDQUFBSyxXQUFBLHdCQUFBcEIsbUJBQUEsQ0FBQWdCLDBCQUFBLEVBQUF6QixDQUFBLHdCQUFBUyxtQkFBQSxDQUFBSCxDQUFBLEdBQUFHLG1CQUFBLENBQUFILENBQUEsRUFBQU4sQ0FBQSxnQkFBQVMsbUJBQUEsQ0FBQUgsQ0FBQSxFQUFBUixDQUFBLGlD
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xDQUFDO0VBQ047RUFFQSxTQUFTRCxrQkFBa0JBLENBQUNFLFVBQVUsRUFBRTtJQUNwQyxJQUFBQyxVQUFBLEdBQTBCeEYsUUFBUSxDQUFDdUYsVUFBVSxDQUFDO01BQS9CVCxNQUFNLEdBQUFVLFVBQUEsQ0FBYlQsS0FBSztJQUVicEMsT0FBTyxDQUFDbUMsTUFBTSxDQUFDLENBQUNsQyxPQUFPLENBQUMsVUFBQXBILENBQUMsRUFBSTtNQUN6QixJQUFRaUssS0FBSyxHQUFLakssQ0FBQyxDQUFDd0gsT0FBTyxDQUFuQnlDLEtBQUs7TUFDYixJQUFNUCxHQUFHLEdBQUdRLFVBQVUsQ0FBQ25DLGdCQUFnQixDQUFDL0gsQ0FBQyxDQUFDLENBQUMwSixHQUFHLENBQUM7TUFFL0N6RixzQ0FBSSxDQUFDa0csRUFBRSxDQUFDbkssQ0FBQyxFQUFFO1FBQ1AwSixHQUFHLEVBQUVBLEdBQUcsR0FBSXpFLE1BQU0sQ0FBQ21GLFdBQVcsR0FBR3ZGLE1BQU0sQ0FBQ29GLEtBQUssQ0FBQyxHQUFJLENBQUM7UUFDbkQ7UUFDQUksSUFBSSxFQUFFLE1BQU07UUFDWkMsYUFBYSxFQUFFO1VBQ1hDLE9BQU8sRUFBRVIsVUFBVTtVQUNuQlMsS0FBSyxFQUFFO1FBQ1g7TUFDSixDQUFDLENBQUM7SUFDTixDQUFDLENBQUM7RUFDTjtBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy9pbmdyZWRpZW50cy1wYWdlLmpzPzkzMjgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc29ydEFscGhhYmV0aWNhbGx5LCBzbW9vdGhTY3JvbGwsIGRlYm91bmNlIH0gZnJvbSAnQC9saWIvdXRpbGl0eS1mdW5jdGlvbnMnXG5pbXBvcnQgeyBnZXRTaXplZEltYWdlVXJsLCBpbWFnZVNpemUgfSBmcm9tICdAL2xpYi9pbWFnZXMuanMnXG5pbXBvcnQgeyBnc2FwIH0gZnJvbSAnZ3NhcCc7XG5pbXBvcnQgeyBTY3JvbGxUcmlnZ2VyIH0gZnJvbSAnZ3NhcC9TY3JvbGxUcmlnZ2VyJztcbmdzYXAucmVnaXN0ZXJQbHVnaW4oU2Nyb2xsVHJpZ2dlcik7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudCgobm9kZSxjdHgpID0+IHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBEYXRhICsgRWxlbWVudHNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBjb25zdCB7IG5hdiwgbGlzdFdyYXBwZXIsIGxpc3QgfSA9IHplbGVrdG9yKG5vZGUpXG4gICAgY29uc3QgYmFja2dyb3VuZFBhdHRlcm5IZWlnaHQgPSAyNTAgLy8gU2V0cyB0aGUgcGF0dGVybiBoZWlnaHQgaW4gdmggdW5pdHNcblxuICAgIC8vIExpc3QgYmFja2dyb3VuZCBwYXJhbGxheCBzcGVlZHNcbiAgICBjb25zdCBzcGVlZHMgPSB7XG4gICAgICAgI
875HNsb3c6IDIsXG4gICAgICAgIG1lZGl1bTogNCxcbiAgICAgICAgZmFzdDogNlxuICAgIH1cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogRXZlbnQgTGlzdGVuZXJzXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGRlYm91bmNlKHVwZGF0ZUxpc3RCYWNrZ3JvdW5kKSlcblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogSW5pdFxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGluaXQoKVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBGdW5jdGlvbnNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBhc3luYyBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IGZldGNoKGAvYmxvZ3MvaW5ncmVkaWVudHM/dmlldz1kYXRhX2luZ3JlZGllbnRzYCkudGhlbihyID0+IHIuanNvbigpKVxuICAgICAgICBsZXQgc29ydGVkSXRlbXMgPSBzb3J0QWxwaGFiZXRpY2FsbHkoaXRlbXMpLmZpbHRlcihpID0+ICFpLnRhZ3MuZmluZCh0ID0+IHQgPT09ICdwYWdlX29taXQnKSlcbiAgICAgICAgY29uc3QgbGV0dGVycyA9IFsuLi5uZXcgU2V0KHNvcnRlZEl0ZW1zLm1hcChpID0+IGkudGl0bGVbMF0udG9Mb3dlckNhc2UoKSkpXVxuXG4gICAgICAgIHJlbmRlckxpc3QobGV0dGVycywgc29ydGVkSXRlbXMpXG4gICAgICAgIHJlbmRlck5hdihsZXR0ZXJzKVxuICAgICAgICB1cGRhdGVMaXN0QmFja2dyb3VuZCgpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVuZGVyTGlzdChsZXR0ZXJzLCBpdGVtcykge1xuICAgICAgICBsaXN0LmlubmVySFRNTCA9ICAgIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2xldHRlcnMubWFwKGwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImluZ3JlZGllbnRzX19saXN0LWRpdmlzaW9uIGpzLWxpc3REaXZpc2lvblwiIGRhdGEtbGV0dGVyPVwiJHtsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5ncmVkaWVudHNfX2xpc3QtZGl2aXNpb25fX2xldHRlciB0aXRsZSB0aXRsZS0tbGFyZ2VcIj4ke2wudG9VcHBlckNhc2UoKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiaW5ncmVkaWVudHNfX2l0ZW0tbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtpdGVtcy5maWx0ZXIoaSA9PiBpLnRpdGxlWzBdLnRvTG93ZXJDYXNlKCkgPT09IGwpLm1hcChpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImluZ3JlZGllbnRzX19pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJpbmdyZWRpZW50c19faXRlbV9fdGl0bGVcIj4ke2kudGl0bGV9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmdyZWRpZW50c19faXRlbV9fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5ncmVkaWVudHNfX2l0ZW1fX3RleHQgcnRlXCI+JHtpLmRlc2NyaXB0aW9uTG9uZ308L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkuaW1hZ2VVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWdTcmMgPSBnZXRTaXplZEltYWdlVXJsKGkuaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaS5pbWFnZVVybCksICcnKSwgJzE4MHgnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyY0xhenkgPSBnZXRTaXplZEltYWdlVXJsKGkuaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaS5pbWFnZVVybCksICcnKSwgJzF4JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxpbWcgc3JjPVwiJHtpbWdTcmNMYXp5fVwiIGRhdGEtc3JjPVwiJHtpbWdTcmN9XCIgY2x
875hc3M9XCJsYXp5bG9hZFwiPmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVuZGVyTmF2KGxldHRlcnMpIHtcbiAgICAgICAgbmF2LmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICAgICAgICAgICR7bGV0dGVycy5tYXAobCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImluZ3JlZGllbnRzX19uYXZfX2J1dHRvbiBqcy1idG5cIiBkYXRhLWxldHRlcj1cIiR7bH1cIj4ke2x9PC9idXR0b24+YFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICBgXG5cbiAgICAgICAgaW5pdE5hdigpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5pdE5hdigpIHtcbiAgICAgICAgY29uc3QgeyBidG46IGJ0bnMgfSA9IHplbGVrdG9yKG5hdilcbiAgICAgICAgbG9vcGlmeShidG5zKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzY3JvbGxUb0RpdmlzaW9uKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvRGl2aXNpb24oZSkge1xuICAgICAgICBjb25zdCB7IGxldHRlciB9ID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXRcbiAgICAgICAgY29uc3QgeyBsaXN0RGl2aXNpb246IGRpdmlzaW9ucyB9ID0gemVsZWt0b3IobGlzdClcblxuICAgICAgICBjb25zdCBtYXRjaCA9IGxvb3BpZnkoZGl2aXNpb25zKS5maW5kKGQgPT4gZC5kYXRhc2V0LmxldHRlciA9PT0gbGV0dGVyKVxuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0taGVhZGVyLWhlaWdodCcpLnJlcGxhY2UoJ3B4JywnJykpXG4gICAgICAgIGNvbnN0IG5hdkhlaWdodCA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUobmF2KS5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKS5yZXBsYWNlKCdweCcsJycpKVxuICAgICAgICBzbW9vdGhTY3JvbGwobWF0Y2gsIHtvZmZzZXQ6IC1oZWFkZXJIZWlnaHQgLSBuYXZIZWlnaHQgLSAyMH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlTGlzdEJhY2tncm91bmQoKSB7XG4gICAgICAgIGNvbnN0IHsgbGlzdEJhY2tncm91bmQ6IGxpc3RCYWNrZ3JvdW5kcyB9ID0gemVsZWt0b3IobGlzdFdyYXBwZXIpXG5cbiAgICAgICAgLy8gSWYgdGhlIGxpc3RXcmFwcGVyIHNjcm9sbCBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIGJhY2tncm91bmQgcGF0dGVybixcbiAgICAgICAgLy8gZHVwbGljYXRlIHRoZSBwYXR0ZXJuIHggYW1vdW50IG9mIHRpbWVzIHRvIGZpbGwgdGhlIGxpc3RXcmFwcGVyXG4gICAgICAgIGNvbnN0IGxpc3RIZWlnaHQgPSBsaXN0V3JhcHBlci5zY3JvbGxIZWlnaHRcbiAgICAgICAgY29uc3QgYmFja2dyb3VuZEhlaWdodCA9IGxvb3BpZnkobGlzdEJhY2tncm91bmRzKVswXS5vZmZzZXRIZWlnaHRcbiAgICAgICAgY29uc3QgcmVwcyA9IE1hdGguY2VpbChsaXN0SGVpZ2h0IC8gYmFja2dyb3VuZEhlaWdodClcbiAgICAgICAgY29uc3QgZmlyc3RDbG9uZSA9IGxvb3BpZnkobGlzdEJhY2tncm91bmRzKVswXS5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgZmlyc3RDbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1pbml0aWFsaXplZCcpXG5cbiAgICAgICAgLy8gQmFja2dyb3VuZCBpcyBoaWRkZW4gb24gbW9iaWxlLCBzbyBiYWNrZ3JvdW5kSGVpZ2h0ID0gMCxcbiAgICAgICAgLy8gc28gcmVwcyBiZWNvbWVzID0gSW5maW5pdHlcbiAgICAgICAgLy8gU28gdG8gcHJldmVudCBpbmZpbml0ZSBsb29wLi4uXG4gICAgICAgIGlmIChyZXBzID09PSBJbmZpbml0eSkgcmV0dXJuXG5cbiAgICAgICAgbG9vcGlmeShsaXN0QmFja2dyb3VuZHMpLmZvckVhY2goYiA9PiBiLnJlbW92ZSgpKVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjbG9uZSA9IGZpcnN0Q2xvbmUuY2xvbmVOb2RlKHRydWUpXG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBzdHlsZXMgZnJvbSBpbWFnZXMgdG8gcmVzZXQgYW5pbWF0ZWQgcHJvcGVydGllcyBmb3IgdGhlIG5ldyBjbG9uZVxuICAgICAgICAgICAgY29uc3QgeyBpbWFnZTogaW1hZ2VzIH0gPSB6ZWxla3RvcihjbG9uZSlcbiAgICAgICAgICAgIGxvb3BpZnkoaW1hZ2VzKS5mb3JFYWNoKGkgPT4gaS5zdHlsZSA9ICcnKVxuXG4gICAgICAgICAgICBsaXN0V3JhcHBlci5hcHBlbmRDaGlsZChjbG9uZSlcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLnRvcCA9IGAke2JhY2tncm91bmRQYXR0ZXJuSGVpZ2h0ICogaX12aGBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgbGlzdEJhY2tncm91bmQ6IHVwZGF0ZWRCYWNrZ3JvdW5kcyB9ID0gemVsZWt0b3IobGlzdFdyYXBwZXIpXG4gICAgICAgI
875HVwZGF0ZWRCYWNrZ3JvdW5kcy5mb3JFYWNoKGIgPT4ge1xuICAgICAgICAgICAgaW5pdEJhY2tncm91bmRBbmltKGIpXG4gICAgICAgICAgICBiLmNsYXNzTGlzdC5hZGQoJ2lzLWluaXRpYWxpemVkJylcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbml0QmFja2dyb3VuZEFuaW0oYmFja2dyb3VuZCkge1xuICAgICAgICBjb25zdCB7IGltYWdlOiBpbWFnZXMgfSA9IHplbGVrdG9yKGJhY2tncm91bmQpXG5cbiAgICAgICAgbG9vcGlmeShpbWFnZXMpLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHNwZWVkIH0gPSBpLmRhdGFzZXRcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShpKS50b3ApXG5cbiAgICAgICAgICAgIGdzYXAudG8oaSwge1xuICAgICAgICAgICAgICAgIHRvcDogdG9wIC0gKHdpbmRvdy5pbm5lckhlaWdodCAqIHNwZWVkc1tzcGVlZF0pIC8gNCxcbiAgICAgICAgICAgICAgICAvLyB5UGVyY2VudDogc3BlZWRzW3NwZWVkXSxcbiAgICAgICAgICAgICAgICBlYXNlOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgc2Nyb2xsVHJpZ2dlcjoge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgICAgICAgICBzY3J1YjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxufSlcbiJdLCJuYW1lcyI6WyJlIiwidCIsInIiLCJTeW1ib2wiLCJuIiwiaXRlcmF0b3IiLCJvIiwidG9TdHJpbmdUYWciLCJpIiwiYyIsInByb3RvdHlwZSIsIkdlbmVyYXRvciIsInUiLCJPYmplY3QiLCJjcmVhdGUiLCJfcmVnZW5lcmF0b3JEZWZpbmUyIiwiZiIsInAiLCJ5IiwiRyIsInYiLCJhIiwiZCIsImJpbmQiLCJsZW5ndGgiLCJsIiwiVHlwZUVycm9yIiwiY2FsbCIsImRvbmUiLCJ2YWx1ZSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiZGlzcGxheU5hbWUiLCJfcmVnZW5lcmF0b3IiLCJ3IiwibSIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yRGVmaW5lIiwiX2ludm9rZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwiaXNBcnJheSIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsInNvcnRBbHBoYWJldGljYWxseSIsInNtb290aFNjcm9sbCIsImRlYm91bmNlIiwiZ2V0U2l6ZWRJbWFnZVVybCIsImltYWdlU2l6ZSIsImdzYXAiLCJTY3JvbGxUcmlnZ2VyIiwicmVnaXN0ZXJQbHVnaW4iLCJjb21wb25lbnQiLCJub2RlIiwiY3R4IiwiX3plbGVrdG9yIiwiemVsZWt0b3IiLCJuYXYiLCJsaXN0V3JhcHBlciIsImxpc3QiLCJiYWNrZ3JvdW5kUGF0dGVybkhlaWdodCIsInNwZWVkcyIsInNsb3ciLCJtZWRpdW0iLCJmYXN0Iiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsInVwZGF0ZUxpc3RCYWNrZ3JvdW5kIiwiaW5pdCIsIl9pbml0IiwiX2NhbGxlZSIsIml0ZW1zIiwic29ydGVkSXRlbXMiLCJsZXR0ZXJzIiwiX2NvbnRleHQiLCJmZXRjaCIsImpzb24iLCJmaWx0ZXIiLCJ0YWdzIiwiZmluZCIsIlNldCIsIm1hcCIsInRpdGxlIiwidG9Mb3dlckNhc2UiLCJyZW5kZXJMaXN0IiwicmVuZGVyTmF2IiwiaW5uZXJIVE1MIiwiY29uY2F0IiwidG9VcHBlckNhc2UiLCJkZXNjcmlwdGlvbkxvbmciLCJpbWFnZVVybCIsImltZ1NyYyIsInJlcGxhY2UiLCJpbWdTcmNMYXp5Iiwiam9pbiIsImluaXROYXYiLCJfemVsZWt0b3IyIiwiYnRucyIsImJ0biIsImxvb3BpZnkiLCJmb3JFYWNoIiwic2Nyb2xsVG9EaXZpc2lvbiIsImxldHRlciIsImN1cnJlbnRUYXJnZXQiLCJkYXRhc2V0IiwiX3plbGVrdG9yMyIsImRpdmlzaW9ucyIsImxpc3REaXZpc2lvbiIsIm1hdGNoIiwiaGVhZGVySGVpZ2h0IiwicGFyc2VJbnQiLCJnZXRDb21wdXRlZFN0eWxlIiwicm9vdCIsImdldFByb3BlcnR5VmFsdWUiLCJuYXZIZWlnaHQiLCJvZmZzZXQiLCJfemVsZWt0b3I0IiwibGlzdEJhY2tncm91bmRzIiwibGlzdEJhY2tncm91bmQiLCJsaXN0SGVpZ2h0Iiwic2Nyb2xsSGVpZ2h0IiwiYmFja2dyb3VuZEhlaWdodCIsIm9mZnNldEhlaWdodCIsInJlcHMiLCJNYXRoIiwiY2VpbCIsImZpcnN0Q2xvbmUiLCJjbG9uZU5vZGUiLCJjbGFzc0xpc3QiLCJyZW1vdmUiLCJJbmZpbml0eSIsImIiLCJjbG9uZSIsIl96ZWxla3RvcjUiLCJpbWFnZXMiLCJpbWFnZSIsInN0eWxlIiwiYXBwZW5kQ2hpbGQiLCJ0b3AiLCJfemVsZWt0b3I2IiwidXBkYXRlZEJhY2tncm91bmRzIiwiaW5pdEJhY2tncm91bmRBbmltIiwiYWRkIiwiYmFja2dyb3VuZCIsIl96ZWxla3RvcjciLCJzcGVlZCIsInBhcnNlRmxvYXQiLCJ0byIsImlubmVySGVpZ2h0IiwiZWFzZSIsInNjcm9sbFRyaWdnZXIiLCJ0cmlnZ2VyIiwic2NydWIiXSwic291cmNlUm9vdCI6IiJ9
876//# sourceURL=webpack-internal:///./src/scripts/components/blog/ingredients-page.js
877
878}`)},"./src/scripts/components/blog/inspiration-buy-flow.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
879/* harmony export */ __webpack_require__.d(__webpack_exports__, {
880/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
881/* harmony export */ });
882/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js");
883/* harmony import */ var _lib_cart__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/cart */ "./src/scripts/lib/cart.js");
884
885
886/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) {
887  /*******************************************************************************************************************************************/
888  /* Data + Elements
889  /*******************************************************************************************************************************************/
890  var _zelektor = zelektor(node),
891    productItems = _zelektor.productItem,
892    addAllBtn = _zelektor.addAllBtn;
893
894  /*******************************************************************************************************************************************/
895  /* Event Listeners
896  /*******************************************************************************************************************************************/
897  addAllBtn === null || addAllBtn === void 0 || addAllBtn.addEventListener('click', function () {
898    return addItems(addAllBtn, loopify(productItems));
899  });
900  loopify(productItems).forEach(function (i) {
901    return initProductItem(i);
902  });
903
904  /*******************************************************************************************************************************************/
905  /* Functions
906  /*******************************************************************************************************************************************/
907  function initProductItem(item) {
908    var _zelektor2 = zelektor(item),
909      addBtn = _zelektor2.addBtn;
910    addBtn.addEventListener('click', function () {
911      return addItems(addBtn, [item]);
912    });
913  }
914  function addItems(btn, itemArray) {
915    (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.toggleBtn)(btn, true, theme.strings.product.addingToCart);
916    var items = itemArray.map(function (i) {
917      return {
918        id: parseInt(i.dataset.variantId),
919        quantity: 1
920      };
921    });
922    fetch('/cart/add.js', {
923      method: 'POST',
924      credentials: 'include',
925      headers: {
926        'Content-Type': 'application/json',
927        'X-Requested-With': 'XMLHttpRequest'
928      },
929      body: JSON.stringify({
930        items: items
931      })
932    }).then(function (r) {
933      return r.json();
934    }).then(function (data) {
935      if (data.status) {
936        alert(data.description);
937      } else {
938        (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.toggleBtn)(btn, false, theme.strings.product.addToCart);
939        (0,_lib_cart__WEBPACK_IMPORTED_MODULE_1__.fetchCart)().then(function (cart) {
940          app.hydrate({
941            cart: cart
942          });
943          app.emit('cart:updated');
944        });
945      }
946    });
947  }
948}));//# sourceURL=[module]
949//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvaW5zcGlyYXRpb24tYnV5LWZsb3cuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQW1EO0FBQ2I7QUFFdEMsaUVBQWVFLFNBQVMsQ0FBQyxVQUFDQyxJQUFJLEVBQUNDLEdBQUcsRUFBSztFQUNuQztFQUNBO0FBQ0o7RUFDSSxJQUFBQyxTQUFBLEdBR0lDLFFBQVEsQ0FBQ0gsSUFBSSxDQUFDO0lBRkRJLFlBQVksR0FBQUYsU0FBQSxDQUF6QkcsV0FBVztJQUNYQyxTQUFTLEdBQUFKLFNBQUEsQ0FBVEksU0FBUzs7RUFJYjtFQUNBO0FBQ0o7RUFDSUEsU0FBUyxhQUFUQSxTQUFTLGVBQVRBLFNBQVMsQ0FBRUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO0lBQUEsT0FBTUMsUUFBUSxDQUFDRixTQUFTLEVBQUVHLE9BQU8sQ0FBQ0wsWUFBWSxDQUFDLENBQUM7RUFBQSxFQUFDO0VBQ3RGSyxPQUFPLENBQUNMLFlBQVksQ0FBQyxDQUFDTSxPQUFPLENBQUMsVUFBQUMsQ0FBQztJQUFBLE9BQUlDLGVBQWUsQ0FBQ0QsQ0FBQyxDQUFDO0VBQUEsRUFBQzs7RUFHdEQ7RUFDQTtBQUNKO0VBQ0ksU0FBU0MsZUFBZUEsQ0FBQ0MsSUFBSSxFQUFFO0lBQzNCLElBQUFDLFVBQUEsR0FBbUJYLFFBQVEsQ0FBQ1UsSUFBSSxDQUFDO01BQXpCRSxNQUFNLEdBQUFELFVBQUEsQ0FBTkMsTUFBTTtJQUNkQSxNQUFNLENBQUNSLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtNQUFBLE9BQU1DLFFBQVEsQ0FBQ08sTUFBTSxFQUFFLENBQUNGLElBQUksQ0FBQyxDQUFDO0lBQUEsRUFBQztFQUNwRTtFQUVBLFNBQVNMLFFBQVFBLENBQUNRLEdBQUcsRUFBRUMsU0FBUyxFQUFFO0lBQzlCcEIsaUVBQVMsQ0FBQ21CLEdBQUcsRUFBRSxJQUFJLEVBQUVFLEtBQUssQ0FBQ0MsT0FBTyxDQUFDQyxPQUFPLENBQUNDLFlBQVksQ0FBQztJQUV4RCxJQUFNQyxLQUFLLEdBQUdMLFNBQVMsQ0FBQ00sR0FBRyxDQUFDLFVBQUFaLENBQUMsRUFBSTtNQUFFLE9BQU87UUFBRWEsRUFBRSxFQUFFQyxRQUFRLENBQUNkLENBQUMsQ0FBQ2UsT0FBTyxDQUFDQyxTQUFTLENBQUM7UUFBRUMsUUFBUSxFQUFFO01BQUUsQ0FBQztJQUFDLENBQUMsQ0FBQztJQUUvRkMsS0FBSyxDQUFDLGNBQWMsRUFBRTtNQUNsQkMsTUFBTSxFQUFFLE1BQU07TUFDZEMsV0FBVyxFQUFFLFNBQVM7TUFDdEJDLE9BQU8sRUFBRTtRQUNMLGNBQWMsRUFBRSxrQkFBa0I7UUFDbEMsa0JBQWtCLEVBQUU7TUFDeEIsQ0FBQztNQUNEQyxJQUFJLEVBQUVDLElBQUksQ0FBQ0MsU0FBUyxDQUFDO1FBQUViLEtBQUssRUFBTEE7TUFBTSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUNEYyxJQUFJLENBQUMsVUFBQUMsQ0FBQztNQUFBLE9BQUlBLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7SUFBQSxFQUFDLENBQ25CRixJQUFJLENBQUMsVUFBQUcsSUFBSSxFQUFJO01BQ1YsSUFBSUEsSUFBSSxDQUFDQyxNQUFNLEVBQUU7UUFDYkMsS0FBSyxDQUFDRixJQUFJLENBQUNHLFdBQVcsQ0FBQztNQUMzQixDQUFDLE1BQU07UUFDSDdDLGlFQUFTLENBQUNtQixHQUFHLEVBQUUsS0FBSyxFQUFFRSxLQUFLLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDdUIsU0FBUyxDQUFDO1FBRXREN0Msb0RBQVMsQ0FBQyxDQUFDLENBQUNzQyxJQUFJLENBQUMsVUFBQVEsSUFBSSxFQUFJO1VBQ3JCQyxHQUFHLENBQUNDLE9BQU8sQ0FBQztZQUFFRixJQUFJLEVBQUVBO1VBQUssQ0FBQyxDQUFDO1VBQzNCQyxHQUFHLENBQUNFLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDNUIsQ0FBQyxDQUFDO01BQ047SUFDSixDQUFDLENBQUM7RUFDTjtBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy9pbnNwaXJhdGlvbi1idXktZmxvdy5qcz9lODlmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7
vendor: 6,833 bytes, lines 949-959
949IHRvZ2dsZUJ0biB9IGZyb20gJ0AvbGliL3V0aWxpdHktZnVuY3Rpb25zJ1xuaW1wb3J0IHsgZmV0Y2hDYXJ0IH0gZnJvbSAnQC9saWIvY2FydCdcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlLGN0eCkgPT4ge1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIERhdGEgKyBFbGVtZW50c1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGNvbnN0IHtcbiAgICAgICAgcHJvZHVjdEl0ZW06IHByb2R1Y3RJdGVtcyxcbiAgICAgICAgYWRkQWxsQnRuXG4gICAgfSA9IHplbGVrdG9yKG5vZGUpXG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIEV2ZW50IExpc3RlbmVyc1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGFkZEFsbEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBhZGRJdGVtcyhhZGRBbGxCdG4sIGxvb3BpZnkocHJvZHVjdEl0ZW1zKSkpXG4gICAgbG9vcGlmeShwcm9kdWN0SXRlbXMpLmZvckVhY2goaSA9PiBpbml0UHJvZHVjdEl0ZW0oaSkpXG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIEZ1bmN0aW9uc1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGZ1bmN0aW9uIGluaXRQcm9kdWN0SXRlbShpdGVtKSB7XG4gICAgICAgIGNvbnN0IHsgYWRkQnRuIH0gPSB6ZWxla3RvcihpdGVtKVxuICAgICAgICBhZGRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBhZGRJdGVtcyhhZGRCdG4sIFtpdGVtXSkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkSXRlbXMoYnRuLCBpdGVtQXJyYXkpIHtcbiAgICAgICAgdG9nZ2xlQnRuKGJ0biwgdHJ1ZSwgdGhlbWUuc3RyaW5ncy5wcm9kdWN0LmFkZGluZ1RvQ2FydClcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGl0ZW1BcnJheS5tYXAoaSA9PiB7IHJldHVybiB7IGlkOiBwYXJzZUludChpLmRhdGFzZXQudmFyaWFudElkKSwgcXVhbnRpdHk6IDEgfSB9KVxuXG4gICAgICAgIGZldGNoKCcvY2FydC9hZGQuanMnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGl0ZW1zIH0pXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHIgPT4gci5qc29uKCkpXG4gICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGEuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgYWxlcnQoZGF0YS5kZXNjcmlwdGlvbilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9nZ2xlQnRuKGJ0biwgZmFsc2UsIHRoZW1lLnN0cmluZ3MucHJvZHVjdC5hZGRUb0NhcnQpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZmV0Y2hDYXJ0KCkudGhlbihjYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBwLmh5ZHJhdGUoeyBjYXJ0OiBjYXJ0IH0pXG4gICAgICAgICAgICAgICAgICAgIGFwcC5lbWl0KCdjYXJ0OnVwZGF0ZWQnKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxufSkiXSwibmFtZXMiOlsidG9nZ2xlQnRuIiwiZmV0Y2hDYXJ0IiwiY29tcG9uZW50Iiwibm9kZSIsImN0eCIsIl96ZWxla3RvciIsInplbGVrdG9yIiwicHJvZHVjdEl0ZW1zIiwicHJvZHVjdEl0ZW0iLCJhZGRBbGxCdG4iLCJhZGRFdmVudExpc3RlbmVyIiwiYWRkSXRlbXMiLCJsb29waWZ5IiwiZm9yRWFjaCIsImkiLCJpbml0UHJvZHVjdEl0ZW0iLCJpdGVtIiwiX3plbGVrdG9yMiIsImFkZEJ0biIsImJ0biIsIml0ZW1BcnJheSIsInRoZW1lIiwic3RyaW5ncyIsInByb2R1Y3QiLCJhZGRpbmdUb0NhcnQiLCJpdGVtcyIsIm1hcCIsImlkIiwicGFyc2VJbnQiLCJkYXRhc2V0IiwidmFyaWFudElkIiwicXVhbnRpdHkiLCJmZXRjaCIsIm1ldGhvZCIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwidGhlbiIsInIiLCJqc29uIiwiZGF0YSIsInN0YXR1cyIsImFsZXJ0IiwiZGVzY3JpcHRpb24iLCJhZGRUb0NhcnQiLCJjYXJ0IiwiYXBwIiwiaHlkcmF0ZSIsImVtaXQiXSwic291cmNlUm9vdCI6IiJ9
950//# sourceURL=webpack-internal:///./src/scripts/components/blog/inspiration-buy-flow.js
951
952}`)},"./src/scripts/components/blog/results-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
953/* harmony export */ __webpack_require__.d(__webpack_exports__, {
954/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
955/* harmony export */ });
956/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js");
957/* harmony import */ var _lib_images_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/images.js */ "./src/scripts/lib/images.js");
958/* harmony import */ var _lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/fetch-paginated-items */ "./src/scripts/lib/fetch-paginated-items.js");
959function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
959 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
960function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
961function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
962function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
963
964
965
966/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) {
967  var PATH_NAME = 'blogs/results';
968  var VIEW = 'data_results';
969  var _window$zelektor = window.zelektor(node),
970    inner = _window$zelektor.inner,
971    list = _window$zelektor.list;
972  var onlyHandle = node.dataset.onlyHandle;
973  var pageSize = parseInt(node.dataset.pageSize);
974  var pages = [];
975  init();
976  function init() {
977    return _init.apply(this, arguments);
978  }
979  function _init() {
980    _init = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
981      var url, data;
982      return _regenerator().w(function (_context) {
983        while (1) switch (_context.n) {
984          case 0:
985            url = new URL(location.origin);
986            url.pathname = PATH_NAME;
987            url.searchParams.set('view', VIEW);
988            _context.n = 1;
989            return (0,_lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_2__["default"])(url);
990          case 1:
991            data = _context.v;
992            // This is so we can use the same component on the before-after article page,
993            // where it should only load the one item with the correct handle
994            if (onlyHandle) {
995              renderItems(data.find(function (i) {
996                return i.handle === onlyHandle;
997              }));
998            } else {
999              while (data.length) {
1000                pages.push(data.splice(0, pageSize));
1001              }
1002              renderContent();
1003              if (pages.length) {
1004                createPagination();
1005              }
1006            }
1007          case 2:
1008            return _context.a(2);
1009        }
1010      }, _callee);
1011    }));
1012    return _init.apply(this, arguments);
1013  }
1014  function renderContent() {
1015    renderItems(pages.splice(0, 1)[0]);
1016  }
1017  function renderItems(items) {
1018    window.loopify(items).forEach(function (i) {
1019      var imgSrc = i.imageUrl ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.imageSize)(i.imageUrl), ''), '720x') : '';
1020      var imgSrcLazy = i.imageUrl ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.imageSize)(i.imageUrl), ''), '1x') : '';
1021      var div = document.createElement('div');
1022      list.appendChild(div);
1023
1024      // eslint-ignore-next-line
1025      div.outerHTML = "\\n        ".concat(window.theme.videoStudio.videoItemTemplate.replace('%imgSrc%', imgSrc).replace('%imgSrcLazy%', imgSrcLazy).replace('%title%', i.title).replace('%description%', i.description).replace('%videoUrlDesktop%', i.videoUrlDesktop).replace('%videoUrlMobile%', i.videoUrlMobile), "\\n      ");
1026    });
1027    window.app.mount();
1028  }
1029  function createPagination() {
1030    var btn = document.createElement('button');
1031    btn.classList.add('cta', 'cta--filled-dark');
1032    btn.textContent = window.theme.strings.layout.loadMore;
1033    inner.appendChild(btn);
1034    btn.addEventListener('click', function () {
1035      renderContent();
1036      if (!pages.length) {
1037        btn.remove();
1038      }
1039    });
1040  }
1041}));//# sourceURL=[module]
1042//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvcmVzdWx0cy1wYWdlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFBLElB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BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy9yZXN1bHRzLXBhZ2UuanM/ODg0YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tICdwaWNvYXBwJztcbmltcG9ydCB7IGdldFNpemVkSW1hZ2VVcmwsIGltYWdlU2l6ZSB9IGZyb20gJ0AvbGliL2ltYWdlcy5qcyc7XG5pbXBvcnQgZmV0Y2hQYWdpbmF0ZWRJdGVtcyBmcm9tICdAL2xpYi9mZXRjaC1wYWdpbmF0ZWQtaXRlbXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQoKG5vZGUpID0+IHtcbiAgY29uc3QgUEFUSF9OQU1FID0gJ2Jsb2dzL3Jlc3VsdHMnO1xuICBjb25zdCBWSUVXID0gJ2RhdGFfcmVzdWx0cyc7XG5cbiAgY29uc3QgeyBpbm5lciwgbGlzdCB9ID0gd2luZG93LnplbGVrdG9yKG5vZGUpO1xuICBjb25zdCB7IG9ubHlIYW5kbGUgfSA9IG5vZGUuZGF0YXNldDtcblxuICBjb25zdCBwYWdlU2l6ZSA9IHBhcnNlSW50KG5vZGUuZGF0YXNldC5wYWdlU2l6ZSk7XG4gIGNvbnN0IHBhZ2VzID0gW107XG5cbiAgaW5pdCgpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChsb2NhdGlvbi5vcmlnaW4pO1xuICAgIHVybC5wYXRobmFtZSA9IFBBVEhfTkFNRTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndmlldycsIFZJRVcpO1xuICAgIFxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaFBhZ2luYXRlZEl0ZW1zKHVybCk7XG5cbiAgICAvLyBUaGlzIGlzIHNvIHdlIGNhbiB1c2UgdGhlIHNhbWUgY29tcG9uZW50IG9uIHRoZSBiZWZvcmUtYWZ0ZXIgYXJ0aWNsZSBwYWdlLFxuICAgIC8vIHdoZXJlIGl0IHNob3VsZCBvbmx5IGxvYWQgdGhlIG9uZSBpdGVtIHdpdGggdGhlIGNvcnJlY3QgaGFuZGxlXG4gICAgaWYgKG9ubHlIYW5kbGUpIHtcbiAgICAgIHJlbmRlckl0ZW1zKGRhdGEuZmluZCgoaSkgPT4gaS5oYW5kbGUgPT09IG9ubHlIYW5kbGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKGRhdGEubGVuZ3RoKSB7XG4gICAgICAgI
vendor: 7,265 bytes, lines 1042-1055
1042HBhZ2VzLnB1c2goZGF0YS5zcGxpY2UoMCwgcGFnZVNpemUpKTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyQ29udGVudCgpO1xuXG4gICAgICBpZiAocGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGNyZWF0ZVBhZ2luYXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJDb250ZW50KCkge1xuICAgIHJlbmRlckl0ZW1zKHBhZ2VzLnNwbGljZSgwLCAxKVswXSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJJdGVtcyhpdGVtcykge1xuICAgIHdpbmRvdy5sb29waWZ5KGl0ZW1zKS5mb3JFYWNoKChpKSA9PiB7XG4gICAgICBjb25zdCBpbWdTcmMgPSBpLmltYWdlVXJsXG4gICAgICAgID8gZ2V0U2l6ZWRJbWFnZVVybChcbiAgICAgICAgICAgIGkuaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaS5pbWFnZVVybCksICcnKSxcbiAgICAgICAgICAgICc3MjB4J1xuICAgICAgICAgIClcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IGltZ1NyY0xhenkgPSBpLmltYWdlVXJsXG4gICAgICAgID8gZ2V0U2l6ZWRJbWFnZVVybChcbiAgICAgICAgICAgIGkuaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaS5pbWFnZVVybCksICcnKSxcbiAgICAgICAgICAgICcxeCdcbiAgICAgICAgICApXG4gICAgICAgIDogJyc7XG5cbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbGlzdC5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgICAvLyBlc2xpbnQtaWdub3JlLW5leHQtbGluZVxuICAgICAgZGl2Lm91dGVySFRNTCA9IGBcbiAgICAgICAgJHt3aW5kb3cudGhlbWUudmlkZW9TdHVkaW8udmlkZW9JdGVtVGVtcGxhdGVcbiAgICAgICAgICAucmVwbGFjZSgnJWltZ1NyYyUnLCBpbWdTcmMpXG4gICAgICAgICAgLnJlcGxhY2UoJyVpbWdTcmNMYXp5JScsIGltZ1NyY0xhenkpXG4gICAgICAgICAgLnJlcGxhY2UoJyV0aXRsZSUnLCBpLnRpdGxlKVxuICAgICAgICAgIC5yZXBsYWNlKCclZGVzY3JpcHRpb24lJywgaS5kZXNjcmlwdGlvbilcbiAgICAgICAgICAucmVwbGFjZSgnJXZpZGVvVXJsRGVza3RvcCUnLCBpLnZpZGVvVXJsRGVza3RvcClcbiAgICAgICAgICAucmVwbGFjZSgnJXZpZGVvVXJsTW9iaWxlJScsIGkudmlkZW9VcmxNb2JpbGUpfVxuICAgICAgYDtcbiAgICB9KTtcblxuICAgIHdpbmRvdy5hcHAubW91bnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBhZ2luYXRpb24oKSB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2N0YScsICdjdGEtLWZpbGxlZC1kYXJrJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gd2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmxvYWRNb3JlO1xuICAgIGlubmVyLmFwcGVuZENoaWxkKGJ0bik7XG5cbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICByZW5kZXJDb250ZW50KCk7XG5cbiAgICAgIGlmICghcGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGJ0bi5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG4iXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJjb21wb25lbnQiLCJnZXRTaXplZEltYWdlVXJsIiwiaW1hZ2VTaXplIiwiZmV0Y2hQYWdpbmF0ZWRJdGVtcyIsIm5vZGUiLCJQQVRIX05BTUUiLCJWSUVXIiwiX3dpbmRvdyR6ZWxla3RvciIsIndpbmRvdyIsInplbGVrdG9yIiwiaW5uZXIiLCJsaXN0Iiwib25seUhhbmRsZSIsImRhdGFzZXQiLCJwYWdlU2l6ZSIsInBhcnNlSW50IiwicGFnZXMiLCJpbml0IiwiX2luaXQiLCJfY2FsbGVlIiwidXJsIiwiZGF0YSIsIl9jb250ZXh0IiwiVVJMIiwibG9jYXRpb24iLCJvcmlnaW4iLCJwYXRobmFtZSIsInNlYXJjaFBhcmFtcyIsInNldCIsInJlbmRlckl0ZW1zIiwiZmluZCIsImhhbmRsZSIsInB1c2giLCJzcGxpY2UiLCJyZW5kZXJDb250ZW50IiwiY3JlYXRlUGFnaW5hdGlvbiIsIml0ZW1zIiwibG9vcGlmeSIsImZvckVhY2giLCJpbWdTcmMiLCJpbWFnZVVybCIsInJlcGxhY2UiLCJpbWdTcmNMYXp5IiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJvdXRlckhUTUwiLCJjb25jYXQiLCJ0aGVtZSIsInZpZGVvU3R1ZGlvIiwidmlkZW9JdGVtVGVtcGxhdGUiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwidmlkZW9VcmxEZXNrdG9wIiwidmlkZW9VcmxNb2JpbGUiLCJhcHAiLCJtb3VudCIsImJ0biIsImNsYXNzTGlzdCIsImFkZCIsInRleHRDb250ZW50Iiwic3RyaW5ncyIsImxheW91dCIsImxvYWRNb3JlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZSJdLCJzb3VyY2VSb290IjoiIn0=
1043//# sourceURL=webpack-internal:///./src/scripts/components/blog/results-page.js
1044
1045}`)},"./src/scripts/components/blog/video-studio.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
1046/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1047/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1048/* harmony export */ });
1049/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js");
1050/* harmony import */ var _lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/keen-slider.js */ "./src/scripts/lib/keen-slider.js");
1051/* harmony import */ var _components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/home/product-slider.js */ "./src/scripts/components/home/product-slider.js");
1052/* harmony import */ var _lib_images_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/images.js */ "./src/scripts/lib/images.js");
1053/* harmony import */ var keen_slider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! keen-slider */ "./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js");
1054/* harmony import */ var _lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/fetch-paginated-items */ "./src/scripts/lib/fetch-paginated-items.js");
1055function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
1055 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
1056function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
1057function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
1058function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
1059
1060
1061
1062
1063
1064
1065/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) {
1066  var _window$zelektor = window.zelektor(node),
1067    listWrapper = _window$zelektor.listWrapper,
1068    list = _window$zelektor.list,
1069    sliderWrapperDesktop = _window$zelektor.sliderWrapperDesktop,
1070    sliderElDesktop = _window$zelektor.sliderElDesktop,
1071    sliderWrapperMobile = _window$zelektor.sliderWrapperMobile,
1072    sliderElMobile = _window$zelektor.sliderElMobile,
1073    prev = _window$zelektor.prev,
1074    next = _window$zelektor.next,
1075    progressWrapper = _window$zelektor.progressWrapper,
1076    progress = _window$zelektor.progress,
1077    scrollIndicator = _window$zelektor.scrollIndicator;
1078  var PATH_NAME = 'blogs/video-studio';
1079  var VIEW = 'data_video-studio';
1080  var onlyHandle = node.dataset.onlyHandle;
1081  var pageSize = parseInt(node.dataset.pageSize);
1082  var pages = [];
1083  window.addEventListener('resize', function () {
1084    return (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.initScroll)(sliderElMobile, scrollIndicator);
1085  });
1086  sliderWrapperMobile === null || sliderWrapperMobile === void 0 || sliderWrapperMobile.addEventListener('scroll', function () {
1087    return (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.updateScroll)(sliderWrapperMobile, progressWrapper, scrollIndicator);
1088  });
1089  init();
1090  function init() {
1091    return _init.apply(this, arguments);
1092  }
1093  function _init() {
1094    _init = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
1095      var url, data;
1096      return _regenerator().w(function (_context) {
1097        while (1) switch (_context.n) {
1098          case 0:
1099            // We use same component on video studio blog and article, so we perform
1100            // some checks to distinguish. If on article, only load the article with
1101            // same handle as onlyHandle, and don't create sliders
1102            if (sliderElDesktop && sliderElMobile) window.awaitVendorScript('keenSlider', initSlider);
1103            url = new URL(location.origin);
1104            url.pathname = PATH_NAME;
1105            url.searchParams.set('view', VIEW);
1106            _context.n = 1;
1107            return (0,_lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_5__["default"])(url);
1108          case 1:
1109            data = _context.v;
1110            if (onlyHandle) {
1111              renderItems(data.find(function (i) {
1112                return i.handle === onlyHandle;
1113              }));
1114            } else {
1115              while (data.length) {
1116                pages.push(data.splice(0, pageSize));
1117              }
1118              renderContent();
1119              if (pages.length) {
1120                createPagination();
1121              }
1122            }
1123            window.app.mount();
1124          case 2:
1125            return _context.a(2);
1126        }
1127      }, _callee);
1128    }));
1129    return _init.apply(this, arguments);
1130  }
1131  function renderContent() {
1132    renderItems(pages.splice(0, 1)[0]);
1133  }
1134  function renderItems(items) {
1135    window.loopify(items).forEach(function (i) {
1136      var imgSrc = i.imageUrl ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_3__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_3__.imageSize)(i.imageUrl), ''), '720x') : '';
1137      var imgSrcLazy = i.imageUrl ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_3__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_3__.imageSize)(i.imageUrl), ''), '1x') : '';
1138      var div = document.createElement('li');
1139      list.appendChild(div);
1140      div.classList.add('video-studio__list__item', 'grid__item');
1141      div.innerHTML = "         \\n              ".concat(window.theme.videoStudio.videoItemTemplate.replace('%imgSrc%', imgSrc).replace('%imgSrcLazy%', imgSrcLazy).replace('%title%', i.title).replace('%description%', i.description).replace('%videoUrlDesktop%', i.videoUrlDesktop).replace('%videoUrlMobile%', i.videoUrlMobile), "\\n            ");
1142      var YT_VID_REGEX = /^.*(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/)|(?:(?:watch)?\\?v(?:i)?=|\\&v(?:i)?=))([^#\\&\\?]*).*/;
1143      if (div && i.videoUrlDesktop.includes('youtube.com')) {
1144        i.videoUrlDesktop = i.videoUrlDesktop.match(YT_VID_REGEX)[1];
1145        var deskVidEl = div.querySelector('.js-videoDesktop');
1146        if (deskVidEl) {
1147          var wrapper = deskVidEl.parentNode;
1148          deskVidEl.remove();
1149          if (wrapper) {
1150            /* prettier-ignore-next-line */
1151            wrapper.insertAdjacentHTML('beforeend', "\\n                <iframe\\n                  src='https://www.youtube.com/embed/".concat(i.videoUrlDesktop, "'\\n                  title='YouTube video player'\\n                  frameborder='0'\\n                  loading='lazy'\\n                  class='video-modal__video video-modal__video--desktop js-videoDesktop'\\n                  allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'\\n                  allowfullscreen\\n                ></iframe>\\n              "));
1152          }
1153        }
1154      }
1155      if (div && i.videoUrlMobile.includes('youtube.com')) {
1156        i.videoUrlMobile = i.videoUrlMobile.match(YT_VID_REGEX)[1];
1157        var mobVidEl = div.querySelector('.js-videoMobile');
1158        if (mobVidEl) {
1159          var _wrapper = mobVidEl.parentNode;
1160          mobVidEl.remove();
1161          if (_wrapper) {
1162            /* prettier-ignore-next-line */
1163            _wrapper.insertAdjacentHTML('beforeend', "\\n                <iframe\\n                  src='https://www.youtube.com/embed/".concat(i.videoUrlMobile, "'\\n                  title='YouTube video player'\\n                  frameborder='0'\\n                  loading='lazy'\\n                  class='video-modal__video video-modal__video--mobile js-videoMobile'\\n                  allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'\\n                  allowfullscreen\\n                ></iframe>\\n              "));
1164          }
1165        }
1166      }
1167    });
1168    window.app.mount();
1169  }
1170  function createPagination() {
1171    var btn = document.createElement('button');
1172    btn.classList.add('cta', 'cta--filled-dark');
1173    btn.textContent = window.theme.strings.layout.loadMore;
1174    listWrapper.appendChild(btn);
1175    btn.addEventListener('click', function () {
1176      renderContent();
1177      if (!pages.length) {
1178        btn.remove();
1179      }
1180    });
1181  }
1182  function initSlider() {
1183    (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.addClasses)(sliderElDesktop);
1184
1185    // eslint-disable-next-line no-unused-vars
1186    var slider = new keen_slider__WEBPACK_IMPORTED_MODULE_4__["default"](sliderElDesktop, {
1187      slidesPerView: 3,
1188      spacing: 20,
1189      duration: 700,
1190      controls: false,
1191      created: function created(inst) {
1192        (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.initSliderWrapper)(sliderWrapperDesktop);
1193        (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.initArrows)(inst, prev, next);
1194        (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.updateArrows)(inst, prev, next);
1195        (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.updateProgress)(inst, progress);
1196      },
1197      slideChanged: function slideChanged(inst) {
1198        (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.updateArrows)(inst, prev, next);
1199        (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.updateProgress)(inst, progress);
1200      }
1201    });
1202    (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.initScroll)(sliderElMobile, scrollIndicator);
1203    (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.updateScroll)(sliderWrapperMobile, progressWrapper, scrollIndicator);
1204  }
1205}));//# sourceURL=[module]
1206//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvdmlkZW8tc3R1ZGlvLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFB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ElBQUksQ0FBQ3JCLEtBQUssQ0FBQy9ELE1BQU0sRUFBRTtRQUNqQndILEdBQUcsQ0FBQ0gsTUFBTSxDQUFDLENBQUM7TUFDZDtJQUNGLENBQUMsQ0FBQztFQUNKO0VBRUEsU0FBUzdDLFVBQVVBLENBQUEsRUFBRztJQUNwQnpDLCtEQUFVLENBQUNrQixlQUFlLENBQUM7O0lBRTNCO0lBQ0EsSUFBTTRFLE1BQU0sR0FBRyxJQUFJckYsbURBQVUsQ0FBQ1MsZUFBZSxFQUFFO01BQzdDNkUsYUFBYSxFQUFFLENBQUM7TUFDaEJDLE9BQU8sRUFBRSxFQUFFO01BQ1hDLFFBQVEsRUFBRSxHQUFHO01BQ2JDLFFBQVEsRUFBRSxLQUFLO01BQ2ZDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFHQyxJQUFJLEVBQUs7UUFDakJuRyxzRUFBaUIsQ0FBQ2dCLG9CQUFvQixDQUFDO1FBQ3ZDZiwrREFBVSxDQUFDa0csSUFBSSxFQUFFL0UsSUFBSSxFQUFFQyxJQUFJLENBQUM7UUFDNUJuQixpRUFBWSxDQUFDaUcsSUFBSSxFQUFFL0UsSUFBSSxFQUFFQyxJQUFJLENBQUM7UUFDOUJsQixrRkFBYyxDQUFDZ0csSUFBSSxFQUFFNUUsUUFBUSxDQUFDO01BQ2hDLENBQUM7TUFDRDZFLFlBQVksRUFBRSxTQUFkQSxZQUFZQSxDQUFHRCxJQUFJLEVBQUs7UUFDdEJqRyxpRUFBWSxDQUFDaUcsSUFBSSxFQUFFL0UsSUFBSSxFQUFFQyxJQUFJLENBQUM7UUFDOUJsQixrRkFBYyxDQUFDZ0csSUFBSSxFQUFFNUUsUUFBUSxDQUFDO01BQ2hDO0lBQ0YsQ0FBQyxDQUFDO0lBRUZuQiw4RUFBVSxDQUFDZSxjQUFjLEVBQUVLLGVBQWUsQ0FBQztJQUMzQ25CLGdGQUFZLENBQUNhLG1CQUFtQixFQUFFSSxlQUFlLEVBQUVFLGVBQWUsQ0FBQztFQUNyRTtBQUNGLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy92aWRlby1zdHVkaW8uanM/Yjc4NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tICdwaWNvYXBwJztcbmltcG9ydCB7IGFkZENsYXNzZXMsIGluaXRTbGlkZXJXcmFwcGVyLCBpbml0QXJyb3dzLCB1cGRhdGVBcnJvd3MgfSBmcm9tICdAL2xpYi9rZWVuLXNsaWRlci5qcyc7XG5pbXBvcnQgeyB1cGRhdGVQcm9ncmVzcywgaW5pdFNjcm9sbCwgdXBkYXRlU2Nyb2xsIH0gZnJvbSAnQC9jb21wb25lbnRzL2hvbWUvcHJvZHVjdC1zbGlkZXIuanMnO1xuaW1wb3J0IHsgZ2V0U2l6ZWRJbWFnZVVybCwgaW1hZ2VTaXplIH0gZnJvbSAnQC9saWIvaW1hZ2VzLmpzJztcbmltcG9ydCBLZWVuU2xpZGVyIGZyb20gJ2tlZW4tc2xpZGVyJztcbmltcG9ydCBmZXRjaFBhZ2luYXRlZEl0ZW1zIGZyb20gJ0AvbGliL2ZldGNoLXBhZ2luYXRlZC1pdGVtcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudCgobm9kZSkgPT4ge1xuICBjb25zdCB7XG4gICAgbGlzdFdyYXBwZXIsXG4gICAgbGlzdCxcbiAgICBzbGlkZXJXcmFwcGVyRGVza3RvcCxcbiAgICBzbGlkZXJFbERlc2t0b3AsXG4gICAgc2xpZGVyV3JhcHBlck1vYmlsZSxcbiAgICBzbGlkZXJFbE1vYmlsZSxcbiAgICBwcmV2LFxuICAgIG5leHQsXG4gICAgcHJvZ3Jlc3NXcmFwcGVyLFxuICAgIHByb2dyZXNzLFxuICAgIHNjcm9sbEluZGljYXRvcixcbiAgfSA9IHdpbmRvdy56ZWxla3Rvcihub2RlKTtcblxuICBjb25zdCBQQVRIX05BTUUgPSAnYmxvZ3MvdmlkZW8tc3R1ZGlvJztcbiAgY29uc3QgVklFVyA9ICdkYXRhX3ZpZGVvLXN0dWRpbyc7XG5cbiAgY29uc3QgeyBvbmx5SGFuZGxlIH0gPSBub2RlLmRhdGFzZXQ7XG5cbiAgY29uc3QgcGFnZVNpemUgPSBwYXJzZUludChub2RlLmRhdGFzZXQucGFnZVNpemUpO1xuICBjb25zdCBwYWdlcyA9IFtdO1xuXG4gIHdpbmRvdy5hZGR
1206FdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PlxuICAgIGluaXRTY3JvbGwoc2xpZGVyRWxNb2JpbGUsIHNjcm9sbEluZGljYXRvcilcbiAgKTtcbiAgc2xpZGVyV3JhcHBlck1vYmlsZT8uYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT5cbiAgICB1cGRhdGVTY3JvbGwoc2xpZGVyV3JhcHBlck1vYmlsZSwgcHJvZ3Jlc3NXcmFwcGVyLCBzY3JvbGxJbmRpY2F0b3IpXG4gICk7XG5cbiAgaW5pdCgpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgLy8gV2UgdXNlIHNhbWUgY29tcG9uZW50IG9uIHZpZGVvIHN0dWRpbyBibG9nIGFuZCBhcnRpY2xlLCBzbyB3ZSBwZXJmb3JtXG4gICAgLy8gc29tZSBjaGVja3MgdG8gZGlzdGluZ3Vpc2guIElmIG9uIGFydGljbGUsIG9ubHkgbG9hZCB0aGUgYXJ0aWNsZSB3aXRoXG4gICAgLy8gc2FtZSBoYW5kbGUgYXMgb25seUhhbmRsZSwgYW5kIGRvbid0IGNyZWF0ZSBzbGlkZXJzXG4gICAgaWYgKHNsaWRlckVsRGVza3RvcCAmJiBzbGlkZXJFbE1vYmlsZSlcbiAgICAgIHdpbmRvdy5hd2FpdFZlbmRvclNjcmlwdCgna2VlblNsaWRlcicsIGluaXRTbGlkZXIpO1xuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChsb2NhdGlvbi5vcmlnaW4pO1xuICAgIHVybC5wYXRobmFtZSA9IFBBVEhfTkFNRTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndmlldycsIFZJRVcpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoUGFnaW5hdGVkSXRlbXModXJsKTtcblxuICAgIGlmIChvbmx5SGFuZGxlKSB7XG4gICAgICByZW5kZXJJdGVtcyhkYXRhLmZpbmQoKGkpID0+IGkuaGFuZGxlID09PSBvbmx5SGFuZGxlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChkYXRhLmxlbmd0aCkge1xuICAgICAgICBwYWdlcy5wdXNoKGRhdGEuc3BsaWNlKDAsIHBhZ2VTaXplKSk7XG4gICAgICB9XG5cbiAgICAgIHJlbmRlckNvbnRlbnQoKTtcblxuICAgICAgaWYgKHBhZ2VzLmxlbmd0aCkge1xuICAgICAgICBjcmVhdGVQYWdpbmF0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2luZG93LmFwcC5tb3VudCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQ29udGVudCgpIHtcbiAgICByZW5kZXJJdGVtcyhwYWdlcy5zcGxpY2UoMCwgMSlbMF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVySXRlbXMoaXRlbXMpIHtcbiAgICB3aW5kb3cubG9vcGlmeShpdGVtcykuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgY29uc3QgaW1nU3JjID0gaS5pbWFnZVVybFxuICAgICAgICA/IGdldFNpemVkSW1hZ2VVcmwoXG4gICAgICAgICAgICBpLmltYWdlVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGkuaW1hZ2VVcmwpLCAnJyksXG4gICAgICAgICAgICAnNzIweCdcbiAgICAgICAgICApXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCBpbWdTcmNMYXp5ID0gaS5pbWFnZVVybFxuICAgICAgICA/IGdldFNpemVkSW1hZ2VVcmwoXG4gICAgICAgICAgICBpLmltYWdlVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGkuaW1hZ2VVcmwpLCAnJyksXG4gICAgICAgICAgICAnMXgnXG4gICAgICAgICAgKVxuICAgICAgICA6ICcnO1xuXG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgICAgbGlzdC5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ3ZpZGVvLXN0dWRpb19fbGlzdF9faXRlbScsICdncmlkX19pdGVtJyk7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYCAgICAgICAgIFxuICAgICAgICAgICAgICAke3dpbmRvdy50aGVtZS52aWRlb1N0dWRpby52aWRlb0l0ZW1UZW1wbGF0ZVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclaW1nU3JjJScsIGltZ1NyYylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnJWltZ1NyY0xhenklJywgaW1nU3JjTGF6eSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnJXRpdGxlJScsIGkudGl0bGUpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVkZXNjcmlwdGlvbiUnLCBpLmRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcldmlkZW9VcmxEZXNrdG9wJScsIGkudmlkZW9VcmxEZXNrdG9wKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcldmlkZW9VcmxNb2JpbGUlJywgaS52aWRlb1VybE1vYmlsZSl9XG4gICAgICAgICAgICBgO1xuXG4gICAgICBjb25zdCBZVF9WSURfUkVHRVggPVxuICAgICAgICAvXi4qKD86KD86eW91dHVcXC5iZVxcL3x2XFwvfHZpXFwvfHVcXC9cXHdcXC98ZW1iZWRcXC98c2hvcnRzXFwvKXwoPzooPzp3YXRjaCk/XFw/dig/OmkpPz18XFwmdig/OmkpPz0pKShbXiNcXCZcXD9dKikuKi87XG5cbiAgICAgIGlmIChkaXYgJiYgaS52aWRlb1VybERlc2t0b3AuaW5jbHVkZXMoJ3lvdXR1YmUuY29tJykpIHtcbiAgICAgICAgaS52aWRlb1VybERlc2t0b3AgPSBpLnZpZG
1206VvVXJsRGVza3RvcC5tYXRjaChZVF9WSURfUkVHRVgpWzFdO1xuXG4gICAgICAgIGNvbnN0IGRlc2tWaWRFbCA9IGRpdi5xdWVyeVNlbGVjdG9yKCcuanMtdmlkZW9EZXNrdG9wJyk7XG5cbiAgICAgICAgaWYgKGRlc2tWaWRFbCkge1xuICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkZXNrVmlkRWwucGFyZW50Tm9kZTtcbiAgICAgICAgICBkZXNrVmlkRWwucmVtb3ZlKCk7XG5cbiAgICAgICAgICBpZiAod3JhcHBlcikge1xuICAgICAgICAgICAgLyogcHJldHRpZXItaWdub3JlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgd3JhcHBlci5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICAgICAgICAgICdiZWZvcmVlbmQnLFxuICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgPGlmcmFtZVxuICAgICAgICAgICAgICAgICAgc3JjPSdodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke2kudmlkZW9VcmxEZXNrdG9wfSdcbiAgICAgICAgICAgICAgICAgIHRpdGxlPSdZb3VUdWJlIHZpZGVvIHBsYXllcidcbiAgICAgICAgICAgICAgICAgIGZyYW1lYm9yZGVyPScwJ1xuICAgICAgICAgICAgICAgICAgbG9hZGluZz0nbGF6eSdcbiAgICAgICAgICAgICAgICAgIGNsYXNzPSd2aWRlby1tb2RhbF9fdmlkZW8gdmlkZW8tbW9kYWxfX3ZpZGVvLS1kZXNrdG9wIGpzLXZpZGVvRGVza3RvcCdcbiAgICAgICAgICAgICAgICAgIGFsbG93PSdhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlJ1xuICAgICAgICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuXG4gICAgICAgICAgICAgICAgPjwvaWZyYW1lPlxuICAgICAgICAgICAgICBgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZGl2ICYmIGkudmlkZW9VcmxNb2JpbGUuaW5jbHVkZXMoJ3lvdXR1YmUuY29tJykpIHtcbiAgICAgICAgaS52aWRlb1VybE1vYmlsZSA9IGkudmlkZW9VcmxNb2JpbGUubWF0Y2goWVRfVklEX1JFR0VYKVsxXTtcblxuICAgICAgICBjb25zdCBtb2JWaWRFbCA9IGRpdi5xdWVyeVNlbGVjdG9yKCcuanMtdmlkZW9Nb2JpbGUnKTtcblxuICAgICAgICBpZiAobW9iVmlkRWwpIHtcbiAgICAgICAgICBjb25zdCB3cmFwcGVyID0gbW9iVmlkRWwucGFyZW50Tm9kZTtcblxuICAgICAgICAgIG1vYlZpZEVsLnJlbW92ZSgpO1xuXG4gICAgICAgICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgICAgICAgIC8qIHByZXR0aWVyLWlnbm9yZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgIHdyYXBwZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgICAgICAgICAgICAnYmVmb3JlZW5kJyxcbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgIDxpZnJhbWVcbiAgICAgICAgICAgICAgICAgIHNyYz0naHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHtpLnZpZGVvVXJsTW9iaWxlfSdcbiAgICAgICAgICAgICAgICAgIHRpdGxlPSdZb3VUdWJlIHZpZGVvIHBsYXllcidcbiAgICAgICAgICAgICAgICAgIGZyYW1lYm9yZGVyPScwJ1xuICAgICAgICAgICAgICAgICAgbG9hZGluZz0nbGF6eSdcbiAgICAgICAgICAgICAgICAgIGNsYXNzPSd2aWRlby1tb2RhbF9fdmlkZW8gdmlkZW8tbW9kYWxfX3ZpZGVvLS1tb2JpbGUganMtdmlkZW9Nb2JpbGUnXG4gICAgICAgICAgICAgICAgICBhbGxvdz0nYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSdcbiAgICAgICAgICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgICAgICAgID48L2lmcmFtZT5cbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdpbmRvdy5hcHAubW91bnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBhZ2luYXRpb24oKSB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2N0YScsICdjdGEtLWZpbGxlZC1kYXJrJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gd2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmxvYWRNb3JlO1xuICAgIGxpc3RXcmFwcGVyLmFwcGVuZENoaWxkKGJ0bik7XG5cbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICByZW5kZXJDb250ZW50KCk7XG5cbiAgICAgIGlmICghcGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGJ0bi5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRTbGlkZXIoKSB7XG4gICAgYWRkQ2xhc3NlcyhzbGlkZXJFbERlc2t0b3ApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3Qgc2xpZGVyID0gbmV3IEtlZW5TbGlkZXIoc2xpZGVyRWxEZXNrdG9wLCB7XG4gICAgICBzbGlkZXNQZXJWaWV3OiAzLFxuICAgICAgc3BhY2luZzogMjAsXG4gICAgICBkdXJhdGlvbjogNzAwLFxuICAgICAgY29udHJvbHM6IGZhbHNlLFxuICAgICAgY3JlYXRlZDogKGluc3QpID0+IHtcbiAgICAgICAgaW5pdFNsaWRlcldyYXBwZXIoc2xpZGVyV3JhcHBlckRlc2t0b3ApO1xuICAgICAgICBpbml0QXJyb3dzKGluc3QsIHByZXYsIG5leHQpO1xuICAgICAgICB1cGRhdGVBcnJvd3MoaW5zdCwgcHJldiwgbmV4dCk7XG4gICAgICAgIHVwZGF0ZVByb2dyZXNzKGluc3QsIHByb2dyZXNzKTtcbiAgICAgIH0sXG4gICAgICBzbGlkZUNoYW5nZWQ6IChpbnN0KSA9PiB7XG4gICAgICAgIHVwZGF0ZUFycm93cyhpbnN0LCBwcmV2LCBuZXh0KTtcbiAgICAgICAgdXBkYXRlUHJvZ3Jlc3MoaW5zdCwgcHJvZ3Jlc3MpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGluaXRTY3JvbGwoc2xpZGVyRWxNb2JpbGUsIHNjcm9sbEluZGljYXRvcik7XG4gICAgdXBkYXRlU2Nyb2xsKHNsaWRlcldyYXBwZXJNb2JpbGUsIHByb2dyZXNzV3JhcHBlciwgc2Nyb2xsSW5kaWNhdG9yKTtcbiAgfVxufSk7XG4iXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJ
vendor: 5,269 bytes, lines 1206-1222
1206jb21wb25lbnQiLCJhZGRDbGFzc2VzIiwiaW5pdFNsaWRlcldyYXBwZXIiLCJpbml0QXJyb3dzIiwidXBkYXRlQXJyb3dzIiwidXBkYXRlUHJvZ3Jlc3MiLCJpbml0U2Nyb2xsIiwidXBkYXRlU2Nyb2xsIiwiZ2V0U2l6ZWRJbWFnZVVybCIsImltYWdlU2l6ZSIsIktlZW5TbGlkZXIiLCJmZXRjaFBhZ2luYXRlZEl0ZW1zIiwibm9kZSIsIl93aW5kb3ckemVsZWt0b3IiLCJ3aW5kb3ciLCJ6ZWxla3RvciIsImxpc3RXcmFwcGVyIiwibGlzdCIsInNsaWRlcldyYXBwZXJEZXNrdG9wIiwic2xpZGVyRWxEZXNrdG9wIiwic2xpZGVyV3JhcHBlck1vYmlsZSIsInNsaWRlckVsTW9iaWxlIiwicHJldiIsIm5leHQiLCJwcm9ncmVzc1dyYXBwZXIiLCJwcm9ncmVzcyIsInNjcm9sbEluZGljYXRvciIsIlBBVEhfTkFNRSIsIlZJRVciLCJvbmx5SGFuZGxlIiwiZGF0YXNldCIsInBhZ2VTaXplIiwicGFyc2VJbnQiLCJwYWdlcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJpbml0IiwiX2luaXQiLCJfY2FsbGVlIiwidXJsIiwiZGF0YSIsIl9jb250ZXh0IiwiYXdhaXRWZW5kb3JTY3JpcHQiLCJpbml0U2xpZGVyIiwiVVJMIiwibG9jYXRpb24iLCJvcmlnaW4iLCJwYXRobmFtZSIsInNlYXJjaFBhcmFtcyIsInNldCIsInJlbmRlckl0ZW1zIiwiZmluZCIsImhhbmRsZSIsInB1c2giLCJzcGxpY2UiLCJyZW5kZXJDb250ZW50IiwiY3JlYXRlUGFnaW5hdGlvbiIsImFwcCIsIm1vdW50IiwiaXRlbXMiLCJsb29waWZ5IiwiZm9yRWFjaCIsImltZ1NyYyIsImltYWdlVXJsIiwicmVwbGFjZSIsImltZ1NyY0xhenkiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJhcHBlbmRDaGlsZCIsImNsYXNzTGlzdCIsImFkZCIsImlubmVySFRNTCIsImNvbmNhdCIsInRoZW1lIiwidmlkZW9TdHVkaW8iLCJ2aWRlb0l0ZW1UZW1wbGF0ZSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJ2aWRlb1VybERlc2t0b3AiLCJ2aWRlb1VybE1vYmlsZSIsIllUX1ZJRF9SRUdFWCIsImluY2x1ZGVzIiwibWF0Y2giLCJkZXNrVmlkRWwiLCJxdWVyeVNlbGVjdG9yIiwid3JhcHBlciIsInBhcmVudE5vZGUiLCJyZW1vdmUiLCJpbnNlcnRBZGphY2VudEhUTUwiLCJtb2JWaWRFbCIsImJ0biIsInRleHRDb250ZW50Iiwic3RyaW5ncyIsImxheW91dCIsImxvYWRNb3JlIiwic2xpZGVyIiwic2xpZGVzUGVyVmlldyIsInNwYWNpbmciLCJkdXJhdGlvbiIsImNvbnRyb2xzIiwiY3JlYXRlZCIsImluc3QiLCJzbGlkZUNoYW5nZWQiXSwic291cmNlUm9vdCI6IiJ9
1207//# sourceURL=webpack-internal:///./src/scripts/components/blog/video-studio.js
1208
1209}`)},"./src/scripts/components/home/product-slider.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
1210/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1211/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__),
1212/* harmony export */   initScroll: () => (/* binding */ initScroll),
1213/* harmony export */   updateProgress: () => (/* binding */ updateProgress),
1214/* harmony export */   updateScroll: () => (/* binding */ updateScroll)
1215/* harmony export */ });
1216/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js");
1217/* harmony import */ var _lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/keen-slider.js */ "./src/scripts/lib/keen-slider.js");
1218/* harmony import */ var keen_slider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! keen-slider */ "./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js");
1219/* harmony import */ var _lib_string_memory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/string-memory */ "./src/scripts/lib/string-memory.js");
1220/* harmony import */ var _lib_product_card_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/product-card.js */ "./src/scripts/lib/product-card.js");
1221/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js");
1222function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
1222 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
1223function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
1224function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
1225function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
1226function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
1227function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
1228function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
1229function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
1230function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
1231function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
1232
1233
1234
1235
1236
1237
1238function updateProgress(sliderInstance, progress) {
1239  var _sliderInstance$detai = sliderInstance.details(),
1240    size = _sliderInstance$detai.size,
1241    relativeSlide = _sliderInstance$detai.relativeSlide,
1242    slidesPerView = _sliderInstance$detai.slidesPerView;
1243  var left = relativeSlide / size * 100;
1244  var width = slidesPerView / size * 100;
1245  progress.style.left = "".concat(left, "%");
1246  progress.style.width = "".concat(width, "%");
1247}
1248function initScroll(sliderElement, scrollIndicator) {
1249  var slides = _toConsumableArray(sliderElement.children).length;
1250  var width = 100 / slides;
1251  scrollIndicator.style.width = "".concat(width, "%");
1252}
1253function updateScroll(sliderWrapper, progressWrapper, scrollIndicator) {
1254  var scrollPos = sliderWrapper.scrollLeft;
1255  var width = sliderWrapper.scrollWidth - sliderWrapper.clientWidth;
1256  var scrolled = scrollPos / width * 100;
1257  var fraction = progressWrapper.offsetWidth / scrollIndicator.offsetWidth;
1258  var translateVal = scrolled * (fraction - 1);
1259  scrollIndicator.style.transform = "translateX(".concat(translateVal, "%)");
1260}
1261/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) {
1262  var sliderWrapperDesktop = node.querySelector('.js-sliderWrapperDesktop');
1263  var sliderWrapperMobile = node.querySelector('.js-sliderWrapperMobile');
1264  var sliderElDesktop = node.querySelector('.js-sliderElDesktop');
1265  var sliderElMobile = node.querySelector('.js-sliderElMobile');
1266  var prev = node.querySelector('.js-prev');
1267  var next = node.querySelector('.js-next');
1268  var progressWrapper = node.querySelector('.js-progressWrapper');
1269  var progress = node.querySelector('.js-progress');
1270  var scrollIndicator = node.querySelector('.js-scrollIndicator');
1271  var _node$dataset = node.dataset,
1272    source = _node$dataset.source,
1273    clerkEndpoint = _node$dataset.clerkEndpoint,
1274    limit = _node$dataset.limit;
1275  var SLIDE_WIDTH = 250;
1276  var createSlider = function createSlider() {
1277    (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.addClasses)(sliderElDesktop);
1278    new keen_slider__WEBPACK_IMPORTED_MODULE_2__["default"](sliderElDesktop, {
1279      slidesPerView: function slidesPerView() {
1280        return sliderElDesktop.offsetWidth / SLIDE_WIDTH;
1281      },
1282      spacing: 15,
1283      duration: 700,
1284      controls: false,
1285      created: function created(inst) {
1286        (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.initSliderWrapper)(sliderWrapperDesktop);
1287        (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.initArrows)(inst, prev, next);
1288        (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.updateArrows)(inst, prev, next);
1289        updateProgress(inst, progress);
1290      },
1291      slideChanged: function slideChanged(inst) {
1292        (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.updateArrows)(inst, prev, next);
1293        updateProgress(inst, progress);
1294      }
1295    });
1296    initScroll(sliderElMobile, scrollIndicator);
1297    updateScroll(sliderWrapperMobile, progressWrapper, scrollIndicator);
1298    window.dispatchEvent(new Event('resize'));
1299  };
1300  var fetchClerkProducts = /*#__PURE__*/function () {
1301    var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
1302      var memory;
1303      return _regenerator().w(function (_context4) {
1304        while (1) switch (_context4.n) {
1305          case 0:
1306            memory = (0,_lib_string_memory__WEBPACK_IMPORTED_MODULE_3__["default"])(sessionStorage);
1307            return _context4.a(2, new Promise(function (resolve) {
1308              window.Clerk('call', clerkEndpoint, {
1309                labels: ['Product slider'],
1310                limit: parseInt(limit),
1311                attributes: ['handle', 'description']
1312              }, /*#__PURE__*/function () {
1313                var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(response) {
1314                  var handles, promises, results, products;
1315                  return _regenerator().w(function (_context3) {
1316                    while (1) switch (_context3.n) {
1317                      case 0:
1318                        handles = response.product_data.map(function (item) {
1319                          return item.handle;
1320                        });
1321                        promises = handles.map(/*#__PURE__*/function () {
1322                          var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(handle) {
1323                            var memoryOrResponse;
1324                            return _regenerator().w(function (_context2) {
1325                              while (1) switch (_context2.n) {
1326                                case 0:
1327                                  _context2.n = 1;
1328                                  return memory.get("product-".concat(handle), /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
1329                                    var response, json, _t;
1330                                    return _regenerator().w(function (_context) {
1331                                      while (1) switch (_context.n) {
1332                                        case 0:
1333                                          _context.n = 1;
1334                                          return fetch("/products/".concat(handle, "?view=data"));
1335                                        case 1:
1336                                          response = _context.v;
1337                                          if (!response.ok) {
1338                                            _context.n = 3;
1339                                            break;
1340                                          }
1341                                          _context.n = 2;
1342                                          return response.json();
1343                                        case 2:
1344                                          _t = _context.v;
1345                                          _context.n = 4;
1346                                          break;
1347                                        case 3:
1348                                          _t = null;
1349                                        case 4:
1350                                          json = _t;
1351                                          return _context.a(2, JSON.stringify(json !== null && json !== void 0 ? json : {}));
1352                                      }
1353                                    }, _callee);
1354                                  })));
1355                                case 1:
1356                                  memoryOrResponse = _context2.v;
1357                                  return _context2.a(2, JSON.parse(memoryOrResponse));
1358                              }
1359                            }, _callee2);
1360                          }));
1361                          return function (_x2) {
1362                            return _ref3.apply(this, arguments);
1363                          };
1364                        }());
1365                        _context3.n = 1;
1366                        return Promise.all(promises);
1367                      case 1:
1368                        results = _context3.v;
1369                        products = results.filter(function (result) {
1370                          return Object.keys(result).length;
1371                        });
1372                        resolve(products);
1373                      case 2:
1374                        return _context3.a(2);
1375                    }
1376                  }, _callee3);
1377                }));
1378                return function (_x) {
1379                  return _ref2.apply(this, arguments);
1380                };
1381              }(), function (error) {
1382                console.error(error);
1383              });
1384            }));
1385        }
1386      }, _callee4);
1387    }));
1388    return function fetchClerkProducts() {
1389      return _ref.apply(this, arguments);
1390    };
1391  }();
1392  var renderClerkProducts = function renderClerkProducts(products) {
1393    products.forEach(function (product) {
1394      product.description = product.description.split('%%%')[0].replaceAll('<p>', '').replaceAll('</p>', '');
1395      var htmlDesktop = products.map(function (product) {
1396        return "<li\\n          class=\\"product-slider__slide product-slider__slide--desktop\\"\\n          data-clerk-product-id=\\"".concat(product.id, "\\"\\n        >\\n          ").concat((0,_lib_product_card_js__WEBPACK_IMPORTED_MODULE_4__["default"])(product, '', {
1397          showQuickBuy: true
1398        }), "\\n        </li>");
1399      }).join('');
1400      var htmlMobile = products.map(function (product) {
1401        return "<li\\n          class=\\"product-slider__slide product-slider__slide--mobile\\"\\n          data-clerk-product-id=\\"".concat(product.id, "\\"\\n        >\\n          ").concat((0,_lib_product_card_js__WEBPACK_IMPORTED_MODULE_4__["default"])(product, '', {
1402          showQuickBuy: true
1403        }), "\\n        </li>");
1404      }).join('');
1405      (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_5__.clear)(sliderElDesktop);
1406      (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_5__.clear)(sliderElMobile);
1407      sliderElDesktop.insertAdjacentHTML('beforeend', htmlDesktop);
1408      sliderElMobile.insertAdjacentHTML('beforeend', htmlMobile);
1409      app.mount();
1410      if (window.theme.clerk.clickTracking && window.Clerk !== undefined) {
1411        window.Clerk('click', '*[data-clerk-product-id]');
1412      }
1413    });
1414  };
1415  var init = /*#__PURE__*/function () {
1416    var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {
1417      var products;
1418      return _regenerator().w(function (_context5) {
1419        while (1) switch (_context5.n) {
1420          case 0:
1421            window.addEventListener('resize', function () {
1422              initScroll(sliderElMobile, scrollIndicator);
1423            });
1424            sliderWrapperMobile.addEventListener('scroll', function () {
1425              updateScroll(sliderWrapperMobile, progressWrapper, scrollIndicator);
1426            });
1427            if (!(source === 'clerk')) {
1428              _context5.n = 2;
1429              break;
1430            }
1431            _context5.n = 1;
1432            return fetchClerkProducts();
1433          case 1:
1434            products = _context5.v;
1435            renderClerkProducts(products);
1436          case 2:
1437            window.awaitVendorScript('keenSlider', createSlider);
1438          case 3:
1439            return _context5.a(2);
1440        }
1441      }, _callee5);
1442    }));
1443    return function init() {
1444      return _ref5.apply(this, arguments);
1445    };
1446  }();
1447  init();
1448}));//# sourceURL=[module]
1449//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2hvbWUvcHJvZHVjdC1zbGlkZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OzswQkFDQSx1S0FBQUEsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxDQUFBLEdBQUFGLENBQUEsQ0FBQUcsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSixDQUFBLENBQUFLLFdBQUEsOEJBQUFDLEVBQUFOLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsUUFBQUMsQ0FBQSxHQUFBTCxDQUFBLElBQUFBLENBQUEsQ0FBQU0sU0FBQSxZQUFBQyxTQUFBLEdBQUFQLENBQUEsR0FBQU8sU0FBQSxFQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsTUFBQSxDQUFBTCxDQUFBLENBQUFDLFNBQUEsVUFBQUssbUJBQUEsQ0FBQUgsQ0FBQSx1QkFBQVYsQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsUUFBQUUsQ0FBQSxFQUFBQyxDQUFBLEVBQUFHLENBQUEsRUFBQUksQ0FBQSxNQUFBQyxDQUFBLEdBQUFYLENBQUEsUUFBQVksQ0FBQSxPQUFBQyxDQUFBLEtBQUFGLENBQUEsS0FBQWIsQ0FBQSxLQUFBZ0IsQ0FBQSxFQUFBcEIsQ0FBQSxFQUFBcUIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFOLENBQUEsRUFBQU0sQ0FBQSxDQUFBQyxJQUFBLENBQUF2QixDQUFBLE1BQUFzQixDQUFBLFdBQUFBLEVBQUFyQixDQUFBLEVBQUFDLENBQUEsV0FBQU0sQ0FBQSxHQUFBUCxDQUFBLEVBQUFRLENBQUEsTUFBQUcsQ0FBQSxHQUFBWixDQUFBLEVBQUFtQixDQUFBLENBQUFmLENBQUEsR0FBQUYsQ0FBQSxFQUFBbUIsQ0FBQSxnQkFBQUMsRUFBQXBCLENBQUEsRUFBQUUsQ0FBQSxTQUFBSyxDQUFBLEdBQUFQLENBQUEsRUFBQVUsQ0FBQSxHQUFBUixDQUFBLEVBQUFILENBQUEsT0FBQWlC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SUFBQSxJQUFBQyxLQUFBLEdBQUFoSixpQkFBQSxjQUFBYixZQUFBLEdBQUFFLENBQUEsQ0FBRyxTQUFBNEosU0FBQTtNQUFBLElBQUFoRCxRQUFBO01BQUEsT0FBQTlHLFlBQUEsR0FBQUMsQ0FBQSxXQUFBOEosU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUEvTCxDQUFBO1VBQUE7WUFDWDJILE1BQU0sQ0FBQ3FFLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxZQUFNO2NBQ3RDM0csVUFBVSxDQUFDc0IsY0FBYyxFQUFFcEIsZUFBZSxDQUFDO1lBQzdDLENBQUMsQ0FBQztZQUVGa0IsbUJBQW1CLENBQUN1RixnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsWUFBTTtjQUNuRHRHLFlBQVksQ0FBQ2UsbUJBQW1CLEVBQUViLGVBQWUsRUFBRUwsZUFBZSxDQUFDO1lBQ3JFLENBQUMsQ0FBQztZQUFDLE1BRUN5QixNQUFNLEtBQUssT0FBTztjQUFBK0UsU0FBQSxDQUFBL0wsQ0FBQTtjQUFBO1lBQUE7WUFBQStMLFNBQUEsQ0FBQS9MLENBQUE7WUFBQSxPQUNHOEgsa0JBQWtCLENBQUMsQ0FBQztVQUFBO1lBQXJDZ0IsUUFBUSxHQUFBaUQsU0FBQSxDQUFBL0ssQ0FBQTtZQUNkMEosbUJBQW1CLENBQUM1QixRQUFRLENBQUM7VUFBQztZQUdoQ25CLE1BQU0sQ0FBQ3NFLGlCQUFpQixDQUFDLFlBQVksRUFBRTdFLFlBQVksQ0FBQztVQUFDO1lBQUEsT0FBQTJFLFNBQUEsQ0FBQTlLLENBQUE7UUFBQTtNQUFBLEdBQUE2SyxRQUFBO0lBQUEsQ0FDdEQ7SUFBQSxnQkFmS0YsSUFBSUEsQ0FBQTtNQUFBLE9BQUFDLEtBQUEsQ0FBQTlJLEtBQUEsT0FBQUQsU0FBQTtJQUFBO0VBQUEsR0FlVDtFQUVEOEksSUFBSSxDQUFDLENBQUM7QUFDUixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2hvbWUvcHJvZHVjdC1zbGlkZXIuanM/NmM5YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tICdwaWNvYXBwJztcbmltcG9ydCB7IGFkZENsYXNzZXMsIGluaXRTbGlkZXJXcmFwcGVyLCBpbml0QXJyb3dzLCB1cGRhdGVBcnJvd3MgfSBmcm9tICdAL2xpYi9rZWVuLXNsaWRlci5qcyc7XG5pbXBvcnQgS2VlblNsaWRlciBmcm9tICdrZWVuLXNsaWRlcic7XG5pbXBvcnQgU3RyaW5nTWVtb3J5IGZyb20gJ0AvbGliL3N0cmluZy1tZW1vcnknO1xuaW1wb3J0IGdldFByb2R1Y3RDYXJkSHRtbCBmcm9tICdAL2xpYi9wcm9kdWN0LWNhcmQuanMnO1xuaW1wb3J0IHsgY2xlYXIgfSBmcm9tICdAL2xpYi91dGlsaXR5LWZ1bmN0aW9ucyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVQcm9ncmVzcyhzbGlkZXJJbnN0YW5jZSwgcHJvZ3Jlc3MpIHtcbiAgY29uc3QgeyBzaXplLCByZWxhdGl2ZVNsaWRlLCBzbGlkZXNQZXJWaWV3IH0gPSBzbGlkZXJJbnN0YW5jZS5kZXRhaWxzKCk7XG4gIGNvbnN0IGxlZnQgPSAocmVsYXRpdmVTbGlkZSAvIHNpemUpICogMTAwO1xuICBjb25zdCB3aWR0aCA9IChzbGlkZXNQZXJWaWV3IC8gc2l6ZSkgKiAxMDA7XG5cbiAgcHJvZ3Jlc3Muc3R5bGUubGVmdCA9IGAke2xlZnR9JWA7XG4gIHByb2dyZXNzLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9JWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2Nyb2xsKHNsaWRlckVsZW1lbnQsIHNjcm9sbEluZGljYXRvcikge1xuICBjb25zdCBzbGlkZXMgPSBbLi4uc2xpZGVyRWxlbWVudC5jaGlsZHJlbl0ubGVuZ3RoO1xuICBjb25zdCB3aWR0aCA9IDEwMCAvIHNsaWRlcztcblxuICBzY3JvbGxJbmRpY2F0b3Iuc3R5bGUud2lkdGggPSBgJHt3aWR0aH0lYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbChzbGlkZXJXcmFwcGVyLCBwcm9ncmVzc1dyYXBwZXIsIHNjcm9sbEluZGljYXRvcikge1xuICBjb25zdCBzY3JvbGxQb3MgPSBzbGlkZXJXcmFwcGVyLnNjcm9sbExlZnQ7XG4gIGNvbnN0IHdpZHRoID0gc2xpZGVyV3JhcHBlci5zY3JvbGxXaWR0aCAtIHNsaWRlcldyYXBwZXIuY2xpZW50V2lkdGg7XG4gIGNvbnN0IHNjcm9sbGVkID0gKHNjcm9sbFBvcyAvIHdpZHRoKSAqIDEwMDtcbiAgY29uc3QgZnJhY3Rpb24gPSBwcm9ncmVzc1dyYXBwZXIub2Zmc2V0V2lkdGggLyBzY3JvbGxJbmRpY2F0b3Iub2Zmc2V0V2lkdGg7XG4gIGNvbnN0IHRyYW5zbGF0ZVZhbCA9IHNjcm9sbGVkICogKGZyYWN0aW9uIC0gMSk7XG5cbiAgc2Nyb2xsSW5kaWNhdG9yLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7dHJhbnNsYXRlVmFsfSUpYDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlKSA9PiB7XG4gIGNvbnN0IHNsaWRlcldyYXBwZXJEZXNrdG9wID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtc2xpZGVyV3JhcHBlckRlc2t0b3AnKTtcbiAgY29uc3Qgc2xpZGVyV3JhcHBlck1vYmlsZSA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLXNsaWRlcldyYXBwZXJNb2JpbGUnKTtcbiAgY29uc3Qgc2xpZGVyRWxEZXNrdG9wID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtc2xpZGVyRWxEZXNrdG9wJyk7XG4gIGNvbnN0IHNsaWRlckVsTW9iaWxlID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtc2xpZGVyRWxNb2JpbGUnKTtcbiAgY29uc3QgcHJldiA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLXByZXYnKTtcbiAgY29uc3QgbmV4dCA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLW5leHQnKTtcbiAgY29uc3QgcHJvZ3Jlc3NXcmFwcGVyID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtcHJvZ3Jlc3NXcmFwcGVyJyk7XG4gIGNvbnN0IHByb2dyZXNzID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtcHJvZ3Jlc3MnKTtcbiAgY29uc3Qgc2Nyb2xsSW5kaWNhdG9yID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtc2Nyb2xsSW5kaWNhdG9yJyk7XG5cbiAgY29uc3QgeyBzb3VyY2UsIGNsZXJrRW5kcG9pbnQsIGxpbWl0IH0gPSBub2RlLmRhdGFzZXQ7XG5cbiAgY29uc3QgU0xJREVfV0lEVEggPSAyNTA7XG5cbiAgY29uc3QgY3JlYXRlU2xpZGVyID0gKCkgPT4ge1xuICAgIGFkZENsYXNzZXMoc2xpZGVyRWxEZXNrdG9wKVxuXG4gICAgbmV3IEtlZW5TbGlkZXIoc2xpZGVyRWxEZXNrdG9wLCB7XG4gICAgICBzbGlkZXNQZXJWaWV3OiAoKSA9PiBzbGlkZXJFbERlc2t0b3Aub2Zmc2V0V2lkdGggLyBTTElERV9XSURUSCxcbiAgICAgIHNwYWNpbmc6IDE1LFxuICAgICAgZHVyYXRpb246IDcwMCxcbiAgICAgIGNvbnRyb2xzOiBmYWxzZSxcbiAgICAgIGNyZWF0ZWQ6IChpbnN0KSA9PiB7XG4gICAgICAgIGluaXRTbGlkZXJXcmFwcGVyKHNsaWRlcldyYXBwZXJEZXNrdG9wKTtcbiAgICAgICAgaW5pdEFycm93cyhpbnN0LCBwcmV2LCBuZXh0KTtcbiAgICAgICAgdXBkYXRlQXJyb3dzKGluc3QsIHByZXYsIG5leHQpO1xuICAgICAgICB1cGRhdGVQcm9ncmVzcyhpbnN0LCBwcm9ncmVzcyk7XG4gICAgICB9LFxuICAgICAgc2xpZGVDaGFuZ2VkOiAoaW5zdCkgPT4ge1xuICAgICAgICB1cGRhdGVBcnJvd3MoaW5zdCwgcHJldiwgbmV4dCk7XG4gICAgICAgI
1449HVwZGF0ZVByb2dyZXNzKGluc3QsIHByb2dyZXNzKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpbml0U2Nyb2xsKHNsaWRlckVsTW9iaWxlLCBzY3JvbGxJbmRpY2F0b3IpO1xuICAgIHVwZGF0ZVNjcm9sbChzbGlkZXJXcmFwcGVyTW9iaWxlLCBwcm9ncmVzc1dyYXBwZXIsIHNjcm9sbEluZGljYXRvcik7XG5cbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3Jlc2l6ZScpKTtcbiAgfTtcblxuICBjb25zdCBmZXRjaENsZXJrUHJvZHVjdHMgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWVtb3J5ID0gU3RyaW5nTWVtb3J5KHNlc3Npb25TdG9yYWdlKVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB3aW5kb3cuQ2xlcmsoJ2NhbGwnLFxuICAgICAgICBjbGVya0VuZHBvaW50LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWxzOiBbJ1Byb2R1Y3Qgc2xpZGVyJ10sXG4gICAgICAgICAgbGltaXQ6IHBhcnNlSW50KGxpbWl0KSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbICdoYW5kbGUnLCAnZGVzY3JpcHRpb24nIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXMgPSByZXNwb25zZS5wcm9kdWN0X2RhdGEubWFwKChpdGVtKSA9PiBpdGVtLmhhbmRsZSk7XG5cbiAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IGhhbmRsZXMubWFwKGFzeW5jIChoYW5kbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lbW9yeU9yUmVzcG9uc2UgPSBhd2FpdCBtZW1vcnkuZ2V0KGBwcm9kdWN0LSR7aGFuZGxlfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL3Byb2R1Y3RzLyR7aGFuZGxlfT92aWV3PWRhdGFgKTtcbiAgICAgICAgICAgICAgY29uc3QganNvbiA9IHJlc3BvbnNlLm9rID8gYXdhaXQgcmVzcG9uc2UuanNvbigpIDogbnVsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24gPz8ge30pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKG1lbW9yeU9yUmVzcG9uc2UpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICBjb25zdCBwcm9kdWN0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoKTtcbiAgICAgICAgICByZXNvbHZlKHByb2R1Y3RzKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCByZW5kZXJDbGVya1Byb2R1Y3RzID0gKHByb2R1Y3RzKSA9PiB7XG4gICAgcHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xuICAgICAgcHJvZHVjdC5kZXNjcmlwdGlvbiA9IHByb2R1Y3QuZGVzY3JpcHRpb24uc3BsaXQoJyUlJScpWzBdLnJlcGxhY2VBbGwoJzxwPicsICcnKS5yZXBsYWNlQWxsKCc8L3A+JywgJycpO1xuXG4gICAgICBjb25zdCBodG1sRGVza3RvcCA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4gKFxuICAgICAgICBgPGxpXG4gICAgICAgICAgY2xhc3M9XCJwcm9kdWN0LXNsaWRlcl9fc2xpZGUgcHJvZHVjdC1zbGlkZXJfX3NsaWRlLS1kZXNrdG9wXCJcbiAgICAgICAgICBkYXRhLWNsZXJrLXByb2R1Y3QtaWQ9XCIke3Byb2R1Y3QuaWR9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7Z2V0UHJvZHVjdENhcmRIdG1sKHByb2R1Y3QsICcnLCB7IHNob3dRdWlja0J1eTogdHJ1ZSB9KX1cbiAgICAgICAgPC9saT5gXG4gICAgICApKS5qb2luKCcnKTtcblxuICAgICAgY29uc3QgaHRtbE1vYmlsZSA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4gKFxuICAgICAgICBgPGxpXG4gICAgICAgICAgY2xhc3M9XCJwcm9kdWN0LXNsaWRlcl9fc2xpZGUgcHJvZHVjdC1zbGlkZXJfX3NsaWRlLS1tb2JpbGVcIlxuICAgICAgICAgIGRhdGEtY2xlcmstcHJvZHVjdC1pZD1cIiR7cHJvZHVjdC5pZH1cIlxuICAgICAgICA+XG4gICAgICAgICAgJHtnZXRQcm9kdWN0Q2FyZEh0bWwocHJvZHVjdCwgJycsIHsgc2hvd1F1aWNrQnV5OiB0cnVlIH0pfVxuICAgICAgICA8L2xpPmBcbiAgICAgICkpLmpvaW4oJycpO1xuXG4gICAgICBjbGVhcihzbGlkZXJFbERlc2t0b3ApO1xuICAgICAgY2xlYXIoc2xpZGVyRWxNb2JpbGUpO1xuXG4gICAgICBzbGlkZXJFbERlc2t0b3AuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sRGVza3RvcCk7XG4gICAgICBzbGlkZXJFbE1vYmlsZS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWxNb2JpbGUpO1xuICAgICAgYXBwLm1vdW50KCk7XG5cbiAgICAgIGlmICh3aW5kb3cudGhlbWUuY2xlcmsuY2xpY2tUcmFja2luZyAmJiB3aW5kb3cuQ2xlcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3aW5kb3cuQ2xlcmsoJ2NsaWNrJywgJypbZGF0YS1jbGVyay1wcm9kdWN0LWlkXScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGluaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgIGluaXRTY3JvbGwoc2xpZGVyRWxNb2JpbGUsIHNjcm9sbEluZGljYXRvcilcbiAgICB9KTtcblxuICAgIHNsaWRlcldyYXBwZXJNb2JpbGUuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgdXBkYXRlU2Nyb2xsKHNsaWRlcldyYXBwZXJNb2JpbGUsIHByb2dyZXNzV3JhcHBlciwgc2Nyb2xsSW5kaWNhdG9yKTtcbiAgICB9KTtcblxuICAgIGlmIChzb3VyY2UgPT09ICdjbGVyaycpIHtcbiAgICAgIGNvbnN0IHByb2R1Y3RzID0gYXdhaXQgZmV0Y2hDbGVya1Byb2R1Y3RzKCk7XG4gICAgICByZW5kZXJDbGVya1Byb2R1Y3RzKHByb2R1Y3RzKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYXdhaXRWZW5kb3JTY3JpcHQoJ2tlZW5TbGlkZXInLCBjcmVhdGVTbGlkZXIpO1xuICB9O1xuXG4gIGluaXQoKTtcbn0pO1xuIl0sIm5hbWVzIjpbImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsIm8iLCJ0b1N0cmluZ1RhZyIsImkiLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsIm
1449NyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwicCIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJjYWxsIiwiZG9uZSIsInZhbHVlIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsIl9yZWdlbmVyYXRvciIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJpc0FycmF5IiwiY29tcG9uZW50IiwiYWRkQ2xhc3NlcyIsImluaXRTbGlkZXJXcmFwcGVyIiwiaW5pdEFycm93cyIsInVwZGF0ZUFycm93cyIsIktlZW5TbGlkZXIiLCJTdHJpbmdNZW1vcnkiLCJnZXRQcm9kdWN0Q2FyZEh0bWwiLCJjbGVhciIsInVwZGF0ZVByb2dyZXNzIiwic2xpZGVySW5zdGFuY2UiLCJwcm9ncmVzcyIsIl9zbGlkZXJJbnN0YW5jZSRkZXRhaSIsImRldGFpbHMiLCJzaXplIiwicmVsYXRpdmVTbGlkZSIsInNsaWRlc1BlclZpZXciLCJsZWZ0Iiwid2lkdGgiLCJzdHlsZSIsImNvbmNhdCIsImluaXRTY3JvbGwiLCJzbGlkZXJFbGVtZW50Iiwic2Nyb2xsSW5kaWNhdG9yIiwic2xpZGVzIiwiY2hpbGRyZW4iLCJ1cGRhdGVTY3JvbGwiLCJzbGlkZXJXcmFwcGVyIiwicHJvZ3Jlc3NXcmFwcGVyIiwic2Nyb2xsUG9zIiwic2Nyb2xsTGVmdCIsInNjcm9sbFdpZHR
1449oIiwiY2xpZW50V2lkdGgiLCJzY3JvbGxlZCIsImZyYWN0aW9uIiwib2Zmc2V0V2lkdGgiLCJ0cmFuc2xhdGVWYWwiLCJ0cmFuc2Zvcm0iLCJub2RlIiwic2xpZGVyV3JhcHBlckRlc2t0b3AiLCJxdWVyeVNlbGVjdG9yIiwic2xpZGVyV3JhcHBlck1vYmlsZSIsInNsaWRlckVsRGVza3RvcCIsInNsaWRlckVsTW9iaWxlIiwicHJldiIsIm5leHQiLCJfbm9kZSRkYXRhc2V0IiwiZGF0YXNldCIsInNvdXJjZSIsImNsZXJrRW5kcG9pbnQiLCJsaW1pdCIsIlNMSURFX1dJRFRIIiwiY3JlYXRlU2xpZGVyIiwic3BhY2luZyIsImR1cmF0aW9uIiwiY29udHJvbHMiLCJjcmVhdGVkIiwiaW5zdCIsInNsaWRlQ2hhbmdlZCIsIndpbmRvdyIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsImZldGNoQ2xlcmtQcm9kdWN0cyIsIl9yZWYiLCJfY2FsbGVlNCIsIm1lbW9yeSIsIl9jb250ZXh0NCIsInNlc3Npb25TdG9yYWdlIiwiQ2xlcmsiLCJsYWJlbHMiLCJwYXJzZUludCIsImF0dHJpYnV0ZXMiLCJfcmVmMiIsIl9jYWxsZWUzIiwicmVzcG9uc2UiLCJoYW5kbGVzIiwicHJvbWlzZXMiLCJyZXN1bHRzIiwicHJvZHVjdHMiLCJfY29udGV4dDMiLCJwcm9kdWN0X2RhdGEiLCJtYXAiLCJpdGVtIiwiaGFuZGxlIiwiX3JlZjMiLCJfY2FsbGVlMiIsIm1lbW9yeU9yUmVzcG9uc2UiLCJfY29udGV4dDIiLCJnZXQiLCJfY2FsbGVlIiwianNvbiIsIl90IiwiX2NvbnRleHQiLCJmZXRjaCIsIm9rIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlIiwiX3gyIiwiYWxsIiwiZmlsdGVyIiwicmVzdWx0Iiwia2V5cyIsIl94IiwiZXJyb3IiLCJjb25zb2xlIiwicmVuZGVyQ2xlcmtQcm9kdWN0cyIsImZvckVhY2giLCJwcm9kdWN0IiwiZGVzY3JpcHRpb24iLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJodG1sRGVza3RvcCIsImlkIiwic2hvd1F1aWNrQnV5Iiwiam9pbiIsImh0bWxNb2JpbGUiLCJpbnNlcnRBZGphY2VudEhUTUwiLCJhcHAiLCJtb3VudCIsInRoZW1lIiwiY2xlcmsiLCJjbGlja1RyYWNraW5nIiwidW5kZWZpbmVkIiwiaW5pdCIsIl9yZWY1IiwiX2NhbGxlZTUiLCJfY29udGV4dDUiLCJhZGRFdmVudExpc3RlbmVyIiwiYXdhaXRWZW5kb3JTY3JpcHQiXSwic291cmNlUm9vdCI6IiJ9
1450//# sourceURL=webpack-internal:///./src/scripts/components/home/product-slider.js
1451
1452}`)},"./src/scripts/components/pages/hero-special.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
1453/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1454/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1455/* harmony export */ });
1456/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! gsap */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js");
1457
1458/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) {
1459  /*******************************************************************************************************************************************/
1460  /* Data + Elements
1461  /*******************************************************************************************************************************************/
1462  var _zelektor = zelektor(node),
1463    images = _zelektor.image;
1464
1465  /*******************************************************************************************************************************************/
1466  /* Event Listeners
1467  /*******************************************************************************************************************************************/
1468  node.addEventListener('mousemove', function (e) {
1469    return parallaxImages(e, images);
1470  });
1471
1472  /*******************************************************************************************************************************************/
1473  /* Init
1474  /*******************************************************************************************************************************************/
1475  animateInImages();
1476
1477  /*******************************************************************************************************************************************/
1478  /* Functions
1479  /*******************************************************************************************************************************************/
1480  function parallaxImages(e, images) {
1481    var mouseX = e.clientX - node.offsetLeft;
1482    var mouseY = e.clientY - node.offsetTop;
1483    loopify(images).forEach(function (i) {
1484      var movement = parseInt(i.dataset.movement);
1485      var x = (mouseX - window.innerWidth / 2) / window.innerWidth * movement;
1486      var y = (mouseY - window.innerHeight / 2) / window.innerHeight * movement;
1487      gsap__WEBPACK_IMPORTED_MODULE_0__.gsap.to(i, {
1488        x: x,
1489        y: y
1490      });
1491    });
1492  }
1493  function animateInImages() {
1494    loopify(images).forEach(function (i) {
1495      var x = parseInt(i.dataset.x);
1496      var y = parseInt(i.dataset.y);
1497      var rotation = parseInt(i.dataset.rotation);
1498      var isSingle = i.dataset.single === 'true';
1499      gsap__WEBPACK_IMPORTED_MODULE_0__.gsap.fromTo(i, {
1500        x: isSingle ? '0%' : "".concat(x, "%"),
1501        y: isSingle ? '0%' : "".concat(y, "%"),
1502        rotation: isSingle ? 0 : rotation - 2,
1503        scale: isSingle ? 1.1 : 1,
1504        opacity: 0
1505      }, {
1506        x: '0%',
1507        y: '0%',
1508        rotation: isSingle ? 0 : rotation,
1509        scale: 1.05,
1510        opacity: 1,
1511        duration: 1.5
1512      });
1513    });
1514  }
1515}));//# sourceURL=[module]
1516//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL3BhZ2VzL2hlcm8tc3BlY2lhbC5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUE0QjtBQUU1QixpRUFBZUMsU0FBUyxDQUFDLFVBQUNDLElBQUksRUFBQ0MsR0FBRyxFQUFLO0VBQ25DO0VBQ0E7QUFDSjtFQUNJLElBQUFDLFNBQUEsR0FBMEJDLFFBQVEsQ0FBQ0gsSUFBSSxDQUFDO0lBQXpCSSxNQUFNLEdBQUFGLFNBQUEsQ0FBYkcsS0FBSzs7RUFHYjtFQUNBO0FBQ0o7RUFDSUwsSUFBSSxDQUFDTSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsVUFBQUMsQ0FBQztJQUFBLE9BQUlDLGNBQWMsQ0FBQ0QsQ0FBQyxFQUFFSCxNQUFNLENBQUM7RUFBQSxFQUFDOztFQUdsRTtFQUNBO0FBQ0o7RUFDSUssZUFBZSxDQUFDLENBQUM7O0VBR2pCO0VBQ0E7QUFDSjtFQUNJLFNBQVNELGNBQWNBLENBQUNELENBQUMsRUFBRUgsTUFBTSxFQUFFO0lBQy9CLElBQU1NLE1BQU0sR0FBR0gsQ0FBQyxDQUFDSSxPQUFPLEdBQUdYLElBQUksQ0FBQ1ksVUFBVTtJQUMxQyxJQUFNQyxNQUFNLEdBQUdOLENBQUMsQ0FBQ08sT0FBTyxHQUFHZCxJQUFJLENBQUNlLFNBQVM7SUFFekNDLE9BQU8sQ0FBQ1osTUFBTSxDQUFDLENBQUNhLE9BQU8sQ0FBQyxVQUFBQyxDQUFDLEVBQUk7TUFDekIsSUFBTUMsUUFBUSxHQUFHQyxRQUFRLENBQUNGLENBQUMsQ0FBQ0csT0FBTyxDQUFDRixRQUFRLENBQUM7TUFFN0MsSUFBTUcsQ0FBQyxHQUFHLENBQUNaLE1BQU0sR0FBR2EsTUFBTSxDQUFDQyxVQUFVLEdBQUcsQ0FBQyxJQUFJRCxNQUFNLENBQUNDLFVBQVUsR0FBR0wsUUFBUTtNQUN6RSxJQUFNTSxDQUFDLEdBQUcsQ0FBQ1osTUFBTSxHQUFHVSxNQUFNLENBQUNHLFdBQVcsR0FBRyxDQUFDLElBQUlILE1BQU0sQ0FBQ0csV0FBVyxHQUFHUCxRQUFRO01BRTNFckIsc0NBQUksQ0FBQzZCLEVBQUUsQ0FBQ1QsQ0FBQyxFQUFFO1FBQUVJLENBQUMsRUFBREEsQ0FBQztRQUFFRyxDQUFDLEVBQURBO01BQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztFQUNOO0VBRUEsU0FBU2hCLGVBQWVBLENBQUEsRUFBRztJQUN2Qk8sT0FBTyxDQUFDWixNQUFNLENBQUMsQ0FBQ2EsT0FBTyxDQUFDLFVBQUFDLENBQUMsRUFBSTtNQUN6QixJQUFNSSxDQUFDLEdBQUdGLFFBQVEsQ0FBQ0YsQ0FBQyxDQUFDRyxPQUFPLENBQUNDLENBQUMsQ0FBQztNQUMvQixJQUFNRyxDQUFDLEdBQUdMLFFBQVEsQ0FBQ0YsQ0FBQyxDQUFDRyxPQUFPLENBQUNJLENBQUMsQ0FBQztNQUMvQixJQUFNRyxRQUFRLEdBQUdSLFFBQVEsQ0FBQ0YsQ0FBQyxDQUFDRyxPQUFPLENBQUNPLFFBQVEsQ0FBQztNQUU3QyxJQUFNQyxRQUFRLEdBQUdYLENBQUMsQ0FBQ0csT0FBTyxDQUFDUyxNQUFNLEtBQUssTUFBTTtNQUU1Q2hDLHNDQUFJLENBQUNpQyxNQUFNLENBQUNiLENBQUMsRUFBRTtRQUNYSSxDQUFDLEVBQUVPLFFBQVEsR0FBRyxJQUFJLE1BQUFHLE1BQUEsQ0FBTVYsQ0FBQyxNQUFHO1FBQzVCRyxDQUFDLEVBQUVJLFFBQVEsR0FBRyxJQUFJLE1BQUFHLE1BQUEsQ0FBTVAsQ0FBQyxNQUFHO1FBQzVCRyxRQUFRLEVBQUVDLFFBQVEsR0FBRyxDQUFDLEdBQUdELFFBQVEsR0FBRyxDQUFDO1FBQ3JDSyxLQUFLLEVBQUVKLFFBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN6QkssT0FBTyxFQUFFO01BQ2IsQ0FBQyxFQUFFO1FBQ0NaLENBQUMsRUFBRSxJQUFJO1FBQ1BHLENBQUMsRUFBRSxJQUFJO1FBQ1BHLFFBQVEsRUFBRUMsUUFBUSxHQUFHLENBQUMsR0FBR0QsUUFBUTtRQUNqQ0ssS0FBSyxFQUFFLElBQUk7UUFDWEMsT0FBTyxFQUFFLENBQUM7UUFDVkMsUUFBUSxFQUFFO01BQ2QsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDO0VBQ047QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL3BhZ2VzL2hlcm8tc3BlY2lhbC5qcz9lMDc0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdzYXAgfSBmcm9tICdnc2FwJztcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlLGN0eCkgPT4ge1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIERhdGEgKyBFbGVtZW50c1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGNvbnN0IHsgaW1hZ2U6IGltYWdlcyB9ID0gemVsZWt0b3Iobm9kZSlcblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogRXZlbnQgTGlzdGVuZXJzXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBlID0+IHBhcmFsbGF4SW1hZ2VzKGUsIGltYWdlcykpXG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIEluaXRcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBhbmltYXRlSW5JbWFnZXMoKVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBGdW5jdGlvbnNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBmdW5jdGlvbiBwYXJhbGxheEltYWdlcyhlLCBpbWFnZXMpIHtcbiAgICAgICAgY29uc3QgbW91c2VYID0gZS5jbGllbnRYIC0gbm9kZS5vZmZzZXRMZWZ0XG4gICAgICAgIGNvbnN0IG1vdXNlWSA9IGUuY2xpZW50WSAtIG5vZGUub2Zmc2V0VG9wXG5cbiAgICAgICAgbG9vcGlmeShpbWFnZXMpLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb3ZlbWVudCA9IHBhcnNlSW50KGkuZGF0YXNldC5tb3ZlbWVudClcblxuICAgICAgICAgICAgY29uc3QgeCA9IChtb3VzZVggLSB3aW5kb3cuaW5uZXJXaWR0aCAvIDIpIC8gd2luZG93LmlubmVyV2lkdGggKiBtb3ZlbWVudFxuICAgICAgICAgICAgY29uc3QgeSA9IChtb3VzZVkgLSB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyKSAvIHdpbmRvdy5pbm5lckhlaWdodCAqIG1vdmVtZW50XG5cbiAgICAgICAgICAgIGdzYXAudG8oaSwgeyB4LCB5IH0pXG4gICAgICAgI
vendor: 4,526 bytes, lines 1516-1530
1516H0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYW5pbWF0ZUluSW1hZ2VzKCkge1xuICAgICAgICBsb29waWZ5KGltYWdlcykuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBwYXJzZUludChpLmRhdGFzZXQueClcbiAgICAgICAgICAgIGNvbnN0IHkgPSBwYXJzZUludChpLmRhdGFzZXQueSlcbiAgICAgICAgICAgIGNvbnN0IHJvdGF0aW9uID0gcGFyc2VJbnQoaS5kYXRhc2V0LnJvdGF0aW9uKVxuXG4gICAgICAgICAgICBjb25zdCBpc1NpbmdsZSA9IGkuZGF0YXNldC5zaW5nbGUgPT09ICd0cnVlJ1xuXG4gICAgICAgICAgICBnc2FwLmZyb21UbyhpLCB7XG4gICAgICAgICAgICAgICAgeDogaXNTaW5nbGUgPyAnMCUnIDogYCR7eH0lYCxcbiAgICAgICAgICAgICAgICB5OiBpc1NpbmdsZSA/ICcwJScgOiBgJHt5fSVgLFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBpc1NpbmdsZSA/IDAgOiByb3RhdGlvbiAtIDIsXG4gICAgICAgICAgICAgICAgc2NhbGU6IGlzU2luZ2xlID8gMS4xIDogMSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgeDogJzAlJyxcbiAgICAgICAgICAgICAgICB5OiAnMCUnLFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBpc1NpbmdsZSA/IDAgOiByb3RhdGlvbixcbiAgICAgICAgICAgICAgICBzY2FsZTogMS4wNSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxLjVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxufSlcbiJdLCJuYW1lcyI6WyJnc2FwIiwiY29tcG9uZW50Iiwibm9kZSIsImN0eCIsIl96ZWxla3RvciIsInplbGVrdG9yIiwiaW1hZ2VzIiwiaW1hZ2UiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsInBhcmFsbGF4SW1hZ2VzIiwiYW5pbWF0ZUluSW1hZ2VzIiwibW91c2VYIiwiY2xpZW50WCIsIm9mZnNldExlZnQiLCJtb3VzZVkiLCJjbGllbnRZIiwib2Zmc2V0VG9wIiwibG9vcGlmeSIsImZvckVhY2giLCJpIiwibW92ZW1lbnQiLCJwYXJzZUludCIsImRhdGFzZXQiLCJ4Iiwid2luZG93IiwiaW5uZXJXaWR0aCIsInkiLCJpbm5lckhlaWdodCIsInRvIiwicm90YXRpb24iLCJpc1NpbmdsZSIsInNpbmdsZSIsImZyb21UbyIsImNvbmNhdCIsInNjYWxlIiwib3BhY2l0eSIsImR1cmF0aW9uIl0sInNvdXJjZVJvb3QiOiIifQ==
1517//# sourceURL=webpack-internal:///./src/scripts/components/pages/hero-special.js
1518
1519}`)},"./src/scripts/lib/cart.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
1520/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1521/* harmony export */   addVariant: () => (/* binding */ addVariant),
1522/* harmony export */   changeItem: () => (/* binding */ changeItem),
1523/* harmony export */   clearCart: () => (/* binding */ clearCart),
1524/* harmony export */   fetchCart: () => (/* binding */ fetchCart),
1525/* harmony export */   removeItem: () => (/* binding */ removeItem),
1526/* harmony export */   updateAllCartQuantities: () => (/* binding */ updateAllCartQuantities),
1527/* harmony export */   updateItem: () => (/* binding */ updateItem)
1528/* harmony export */ });
1529/* harmony import */ var _lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/upsell-gift */ "./src/scripts/lib/upsell-gift.js");
1530function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
1530 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
1531function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
1532function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
1533function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
1534
1535var fetchCart = /*#__PURE__*/function () {
1536  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
1537    var response, data;
1538    return _regenerator().w(function (_context) {
1539      while (1) switch (_context.n) {
1540        case 0:
1541          _context.n = 1;
1542          return fetch('/cart.js', {
1543            method: 'GET',
1544            credentials: 'include',
1545            headers: {
1546              'Content-Type': 'application/json',
1547              'X-Requested-With': 'XMLHttpRequest'
1548            }
1549          });
1550        case 1:
1551          response = _context.v;
1552          _context.n = 2;
1553          return response.json();
1554        case 2:
1555          data = _context.v;
1556          return _context.a(2, data);
1557      }
1558    }, _callee);
1559  }));
1560  return function fetchCart() {
1561    return _ref.apply(this, arguments);
1562  };
1563}();
1564var addVariant = /*#__PURE__*/function () {
1565  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(_ref2) {
1566    var id, quantity, _ref2$properties, properties, _ref2$selling_plan, selling_plan, callback, onError, _ref2$emitUpdate, emitUpdate, _ref2$updateCrossSell, updateCrossSell, response, item, cart;
1567    return _regenerator().w(function (_context2) {
1568      while (1) switch (_context2.n) {
1569        case 0:
1570          id = _ref2.variantId, quantity = _ref2.qty, _ref2$properties = _ref2.properties, properties = _ref2$properties === void 0 ? null : _ref2$properties, _ref2$selling_plan = _ref2.selling_plan, selling_plan = _ref2$selling_plan === void 0 ? null : _ref2$selling_plan, callback = _ref2.callback, onError = _ref2.onError, _ref2$emitUpdate = _ref2.emitUpdate, emitUpdate = _ref2$emitUpdate === void 0 ? true : _ref2$emitUpdate, _ref2$updateCrossSell = _ref2.updateCrossSell, updateCrossSell = _ref2$updateCrossSell === void 0 ? true : _ref2$updateCrossSell;
1571          _context2.n = 1;
1572          return fetch('/cart/add.js', {
1573            method: 'POST',
1574            credentials: 'include',
1575            headers: {
1576              'Content-Type': 'application/json',
1577              'X-Requested-With': 'XMLHttpRequest'
1578            },
1579            body: JSON.stringify({
1580              id: id,
1581              quantity: quantity,
1582              properties: properties,
1583              selling_plan: selling_plan
1584            })
1585          });
1586        case 1:
1587          response = _context2.v;
1588          _context2.n = 2;
1589          return response.json();
1590        case 2:
1591          item = _context2.v;
1592          if (!item.status) {
1593            _context2.n = 3;
1594            break;
1595          }
1596          if (onError) {
1597            onError(item);
1598          } else {
1599            alert(item.description);
1600          }
1601          if (callback) callback();
1602          return _context2.a(2);
1603        case 3:
1604          _context2.n = 4;
1605          return fetchCart();
1606        case 4:
1607          cart = _context2.v;
1608          app.hydrate({
1609            cart: cart
1610          });
1611          if (emitUpdate) {
1612            (0,_lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__.clearAllUpsellTriggers)();
1613            app.emit('cart:updated');
1614          }
1615          if (updateCrossSell) app.emit('crossSell:update');
1616          if (callback) callback();
1617          return _context2.a(2, {
1618            item: item,
1619            cart: cart
1620          });
1621        case 5:
1622          return _context2.a(2);
1623      }
1624    }, _callee2);
1625  }));
1626  return function addVariant(_x) {
1627    return _ref3.apply(this, arguments);
1628  };
1629}();
1630var changeItem = /*#__PURE__*/function () {
1631  var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(_ref4) {
1632    var line, qty, _ref4$properties, properties, _ref4$emitUpdate, emitUpdate, response, cart;
1633    return _regenerator().w(function (_context3) {
1634      while (1) switch (_context3.n) {
1635        case 0:
1636          line = _ref4.line, qty = _ref4.qty, _ref4$properties = _ref4.properties, properties = _ref4$properties === void 0 ? null : _ref4$properties, _ref4$emitUpdate = _ref4.emitUpdate, emitUpdate = _ref4$emitUpdate === void 0 ? true : _ref4$emitUpdate;
1637          _context3.n = 1;
1638          return fetch('/cart/change.js', {
1639            method: 'POST',
1640            credentials: 'include',
1641            headers: {
1642              'Content-Type': 'application/json',
1643              'X-Requested-With': 'XMLHttpRequest'
1644            },
1645            body: JSON.stringify({
1646              line: line,
1647              quantity: qty,
1648              properties: properties
1649            })
1650          });
1651        case 1:
1652          response = _context3.v;
1653          _context3.n = 2;
1654          return response.json();
1655        case 2:
1656          cart = _context3.v;
1657          app.hydrate({
1658            cart: cart
1659          });
1660          if (emitUpdate) {
1661            (0,_lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__.clearAllUpsellTriggers)();
1662            app.emit('cart:updated', {
1663              cart: cart
1664            });
1665          }
1666          return _context3.a(2, cart);
1667      }
1668    }, _callee3);
1669  }));
1670  return function changeItem(_x2) {
1671    return _ref5.apply(this, arguments);
1672  };
1673}();
1674var updateItem = function updateItem(_ref6) {
1675  var line = _ref6.line,
1676    qty = _ref6.qty,
1677    _ref6$properties = _ref6.properties,
1678    properties = _ref6$properties === void 0 ? null : _ref6$properties,
1679    _ref6$emitUpdate = _ref6.emitUpdate,
1680    emitUpdate = _ref6$emitUpdate === void 0 ? true : _ref6$emitUpdate;
1681  return changeItem({
1682    line: line,
1683    qty: qty,
1684    properties: properties,
1685    emitUpdate: emitUpdate
1686  });
1687};
1688var removeItem = function removeItem(_ref7) {
1689  var line = _ref7.line,
1690    _ref7$emitUpdate = _ref7.emitUpdate,
1691    emitUpdate = _ref7$emitUpdate === void 0 ? true : _ref7$emitUpdate;
1692  return updateItem({
1693    line: line,
1694    qty: 0,
1695    emitUpdate: emitUpdate
1696  });
1697};
1698var updateAllCartQuantities = /*#__PURE__*/function () {
1699  var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(array) {
1700    var response, cart;
1701    return _regenerator().w(function (_context4) {
1702      while (1) switch (_context4.n) {
1703        case 0:
1704          _context4.n = 1;
1705          return fetch('/cart/update.js', {
1706            method: 'POST',
1707            credentials: 'include',
1708            headers: {
1709              'Content-Type': 'application/json',
1710              'X-Requested-With': 'XMLHttpRequest'
1711            },
1712            body: JSON.stringify({
1713              updates: array
1714            })
1715          });
1716        case 1:
1717          response = _context4.v;
1718          _context4.n = 2;
1719          return response.json();
1720        case 2:
1721          cart = _context4.v;
1722          (0,_lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__.clearAllUpsellTriggers)();
1723          app.hydrate({
1724            cart: cart
1725          });
1726          app.emit('cart:updated', {
1727            cart: cart
1728          });
1729        case 3:
1730          return _context4.a(2);
1731      }
1732    }, _callee4);
1733  }));
1734  return function updateAllCartQuantities(_x3) {
1735    return _ref8.apply(this, arguments);
1736  };
1737}();
1738var clearCart = /*#__PURE__*/function () {
1739  var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {
1740    var response, cart;
1741    return _regenerator().w(function (_context5) {
1742      while (1) switch (_context5.n) {
1743        case 0:
1744          _context5.n = 1;
1745          return fetch('/cart/clear.js', {
1746            method: 'POST',
1747            credentials: 'include',
1748            headers: {
1749              'Content-Type': 'application/json',
1750              'X-Requested-With': 'XMLHttpRequest'
1751            }
1752          });
1753        case 1:
1754          response = _context5.v;
1755          _context5.n = 2;
1756          return response.json();
1757        case 2:
1758          cart = _context5.v;
1759          (0,_lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__.clearAllUpsellTriggers)();
1760          app.hydrate({
1761            cart: cart
1762          });
1763          app.emit('cart:updated', {
1764            cart: cart
1765          });
1766        case 3:
1767          return _context5.a(2);
1768      }
1769    }, _callee5);
1770  }));
1771  return function clearCart() {
1772    return _ref9.apply(this, arguments);
1773  };
1774}();
1775//# sourceURL=[module]
1776//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUNDLE9BQU8sQ0FBQztZQUFFWCxJQUFJLEVBQUVBO1VBQUssQ0FBQyxDQUFDO1VBQzNCVSxHQUFHLENBQUNFLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFBRVosSUFBSSxFQUFFQTtVQUFLLENBQUMsQ0FBQztRQUFBO1VBQUEsT0FBQXdDLFNBQUEsQ0FBQXRHLENBQUE7TUFBQTtJQUFBLEdBQUFxRyxRQUFBO0VBQUEsQ0FDM0M7RUFBQSxnQkFoQktGLFNBQVNBLENBQUE7SUFBQSxPQUFBQyxLQUFBLENBQUF0RSxLQUFBLE9BQUFELFNBQUE7RUFBQTtBQUFBLEdBZ0JkIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL2NhcnQuanM/OTY0YiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGVhckFsbFVwc2VsbFRyaWdnZXJzIH0gZnJvbSAnQC9saWIvdXBzZWxsLWdpZnQnXG5cbmNvbnN0IGZldGNoQ2FydCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvY2FydC5qcycsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1
1776ZXN0JyxcbiAgICAgICAgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgcmV0dXJuIGRhdGFcbn1cblxuY29uc3QgYWRkVmFyaWFudCA9IGFzeW5jICh7XG4gICAgdmFyaWFudElkOiBpZCxcbiAgICBxdHk6IHF1YW50aXR5LFxuICAgIHByb3BlcnRpZXMgPSBudWxsLFxuICAgIHNlbGxpbmdfcGxhbiA9IG51bGwsXG4gICAgY2FsbGJhY2ssXG4gICAgb25FcnJvcixcbiAgICBlbWl0VXBkYXRlID0gdHJ1ZSxcbiAgICB1cGRhdGVDcm9zc1NlbGwgPSB0cnVlLFxufSkgPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9jYXJ0L2FkZC5qcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQsIHF1YW50aXR5LCBwcm9wZXJ0aWVzLCBzZWxsaW5nX3BsYW4gfSksXG4gICAgfSlcblxuICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgIGlmIChpdGVtLnN0YXR1cykge1xuICAgICAgICBpZiAob25FcnJvcikge1xuICAgICAgICAgICAgb25FcnJvcihpdGVtKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxlcnQoaXRlbS5kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2FydCA9IGF3YWl0IGZldGNoQ2FydCgpXG4gICAgICAgIGFwcC5oeWRyYXRlKHsgY2FydDogY2FydCB9KVxuXG4gICAgICAgIGlmIChlbWl0VXBkYXRlKSB7XG4gICAgICAgICAgICBjbGVhckFsbFVwc2VsbFRyaWdnZXJzKClcbiAgICAgICAgICAgIGFwcC5lbWl0KCdjYXJ0OnVwZGF0ZWQnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZUNyb3NzU2VsbCkgYXBwLmVtaXQoJ2Nyb3NzU2VsbDp1cGRhdGUnKVxuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcblxuICAgICAgICByZXR1cm4geyBpdGVtLCBjYXJ0IH1cbiAgICB9XG59XG5cbmNvbnN0IGNoYW5nZUl0ZW0gPSBhc3luYyAoeyBsaW5lLCBxdHksIHByb3BlcnRpZXMgPSBudWxsLCBlbWl0VXBkYXRlID0gdHJ1ZSB9KSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2NhcnQvY2hhbmdlLmpzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1
1776ZXN0JyxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBsaW5lLCBxdWFudGl0eTogcXR5LCBwcm9wZXJ0aWVzIH0pLFxuICAgIH0pXG5cbiAgICBjb25zdCBjYXJ0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICBhcHAuaHlkcmF0ZSh7IGNhcnQ6IGNhcnQgfSlcblxuICAgIGlmIChlbWl0VXBkYXRlKSB7XG4gICAgICAgIGNsZWFyQWxsVXBzZWxsVHJpZ2dlcnMoKVxuICAgICAgICBhcHAuZW1pdCgnY2FydDp1cGRhdGVkJywgeyBjYXJ0OiBjYXJ0IH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhcnRcbn1cblxuY29uc3QgdXBkYXRlSXRlbSA9ICh7IGxpbmUsIHF0eSwgcHJvcGVydGllcyA9IG51bGwsIGVtaXRVcGRhdGUgPSB0cnVlIH0pID0+IHtcbiAgICByZXR1cm4gY2hhbmdlSXRlbSh7IGxpbmUsIHF0eSwgcHJvcGVydGllcywgZW1pdFVwZGF0ZSB9KVxufVxuXG5jb25zdCByZW1vdmVJdGVtID0gKHsgbGluZSwgZW1pdFVwZGF0ZSA9IHRydWUgfSkgPT4ge1xuICAgIHJldHVybiB1cGRhdGVJdGVtKHsgbGluZSwgcXR5OiAwLCBlbWl0VXBkYXRlIH0pXG59XG5cbmNvbnN0IHVwZGF0ZUFsbENhcnRRdWFudGl0aWVzID0gYXN5bmMgKGFycmF5KSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2NhcnQvdXBkYXRlLmpzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1
1776ZXN0JyxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1cGRhdGVzOiBhcnJheSB9KSxcbiAgICB9KVxuXG4gICAgY29uc3QgY2FydCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgY2xlYXJBbGxVcHNlbGxUcmlnZ2VycygpXG5cbiAgICBhcHAuaHlkcmF0ZSh7IGNhcnQ6IGNhcnQgfSlcbiAgICBhcHAuZW1pdCgnY2FydDp1cGRhdGVkJywgeyBjYXJ0OiBjYXJ0IH0pXG59XG5cbmNvbnN0IGNsZWFyQ2FydCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvY2FydC9jbGVhci5qcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsXG4gICAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNhcnQgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgIGNsZWFyQWxsVXBzZWxsVHJpZ2dlcnMoKVxuXG4gICAgYXBwLmh5ZHJhdGUoeyBjYXJ0OiBjYXJ0IH0pXG4gICAgYXBwLmVtaXQoJ2NhcnQ6dXBkYXRlZCcsIHsgY2FydDogY2FydCB9KVxufVxuXG5leHBvcnQgeyBmZXRjaENhcnQsIGFkZFZhcmlhbnQsIGNoYW5nZUl0ZW0sIHVwZGF0ZUl0ZW0sIHJlbW92ZUl0ZW0sIHVwZGF0ZUFsbENhcnRRdWFudGl0aWVzLCBjbGVhckNhcnQgfVxuIl0sIm5hbWVzIjpbImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsIm8iLCJ0b1N0cmluZ1RhZyIsImkiLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsImNyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwicCIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJjYWxsIiwiZG9uZSIsInZhbHVlIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsIl9yZWdlbmVyYXRvciIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiY2xlYXJBbGxVcHNlbGxUcmlnZ2VycyIsImZldGNoQ2FydCIsIl9yZWYiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJkYXRhIiwiX2NvbnRleHQiLCJmZXRjaCIsIm1ldGhvZCIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsImpzb24iLCJhZGRWYXJpYW50IiwiX3JlZjMiLCJfY2FsbGVlMiIsIl9yZWYyIiwiaWQiLCJxdWFudGl0eSIsIl9yZWYyJHByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzIiwiX3JlZjIkc2VsbGluZ19wbGFuIiwic2VsbGluZ19wbGFuIiwiY2FsbGJhY2siLCJvbkVycm9yIiwiX3JlZjIkZW1pdFVwZGF0ZSIsImVtaXRVcGRhdGUiLCJfcmVmMiR1cGRhdGVDcm9zc1NlbGwiLCJ1cGRhdGVDcm9zc1NlbGwiLCJpdGVtIiwiY2FydCIsIl9jb250ZXh0MiIsInZhcmlhbnRJZCIsInF0eSIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhdHVzIiwiYWxlcnQiLCJkZXNjcmlwdGlvbiIsImFwcCIsImh5ZHJhdGUiLCJlbWl0IiwiX3giLCJjaGFuZ2VJdGVtIiwiX3JlZjUiLCJfY2FsbGVlMyIsIl9yZWY0IiwibGluZSIsIl9yZWY0JHByb3BlcnRpZXMiLCJfcmVmNCRlbWl0VXBkYXRlIiwiX2NvbnRleHQzIiwiX3gyIiwidXBkYXRlSXRlbSIsIl9yZWY2IiwiX3JlZjYkcHJvcGVydGllcyIsIl9yZWY2JGVtaXRVcGRhdGUiLCJyZW1vdmVJdGVtIiwiX3JlZjciLCJfcmVmNyRlbWl0VXBkYXRlIiwidXBkYXRlQWxsQ2FydFF1YW50aXRpZXMiLCJfcmVmOCIsIl9jYWxsZWU0IiwiYXJyYXkiLCJfY29udGV4dDQiLCJ1cGRhdGVzIiwiX3gzIiwiY2xlYXJDYXJ0IiwiX3JlZjkiLCJfY2FsbGVlNSIsIl9jb250ZXh0NSJdLCJzb3VyY2VSb290IjoiIn0=
1777//# sourceURL=webpack-internal:///./src/scripts/lib/cart.js
1778
1779}`)},"./src/scripts/lib/consent.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
1780/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1781/* harmony export */   consentEvents: () => (/* binding */ consentEvents),
1782/* harmony export */   hasConsent: () => (/* binding */ hasConsent)
1783/* harmony export */ });
1784var consentEvents = ['CookieScriptAccept', 'CookieScriptAcceptAll', 'CookieScriptReject', 'CookieScriptConsentUpdated'];
1785var getCustomerPrivacyConsent = function getCustomerPrivacyConsent(category) {
1786  var _window$Shopify, _customerPrivacy$getT;
1787  var customerPrivacy = (_window$Shopify = window.Shopify) === null || _window$Shopify === void 0 ? void 0 : _window$Shopify.customerPrivacy;
1788  if (!customerPrivacy) return null;
1789  var methodMap = {
1790    cookie_cat_functional: 'preferencesProcessingAllowed',
1791    cookie_cat_statistic: 'analyticsProcessingAllowed',
1792    cookie_cat_marketing: 'marketingAllowed',
1793    cookie_cat_category: 'preferencesProcessingAllowed'
1794  };
1795  var method = methodMap[category];
1796  if (method && typeof customerPrivacy[method] === 'function') {
1797    return Boolean(customerPrivacy[method]());
1798  }
1799  var consent = (_customerPrivacy$getT = customerPrivacy.getTrackingConsent) === null || _customerPrivacy$getT === void 0 ? void 0 : _customerPrivacy$getT.call(customerPrivacy);
1800  if (!consent) return null;
1801  if (typeof consent === 'string') {
1802    return consent.toLowerCase() === 'yes';
1803  }
1804  var map = {
1805    cookie_cat_functional: 'preferences',
1806    cookie_cat_statistic: 'analytics',
1807    cookie_cat_marketing: 'marketing',
1808    cookie_cat_category: 'preferences'
1809  };
1810  var key = map[category];
1811  return key ? Boolean(consent[key]) : null;
1812};
1813var getCookieScriptConsent = function getCookieScriptConsent(category) {
1814  var _window$CookieScript, _window$CookieScript$;
1815  var state = (_window$CookieScript = window.CookieScript) === null || _window$CookieScript === void 0 || (_window$CookieScript = _window$CookieScript.instance) === null || _window$CookieScript === void 0 || (_window$CookieScript$ = _window$CookieScript.currentState) === null || _window$CookieScript$ === void 0 ? void 0 : _window$CookieScript$.call(_window$CookieScript);
1816  if (!state || !Array.isArray(state.categories)) return null;
1817  if (state.action === 'reject') return false;
1818  var map = {
1819    cookie_cat_functional: 'functionality',
1820    cookie_cat_statistic: 'performance',
1821    cookie_cat_marketing: 'targeting',
1822    cookie_cat_category: 'functionality'
1823  };
1824  var key = map[category];
1825  return key ? state.categories.includes(key) : null;
1826};
1827var hasConsent = function hasConsent(category) {
1828  var customerConsent = getCustomerPrivacyConsent(category);
1829  if (customerConsent !== null) return customerConsent;
1830  var cookieScriptConsent = getCookieScriptConsent(category);
1831  if (cookieScriptConsent !== null) return cookieScriptConsent;
1832  return false;
1833};//# sourceURL=[module]
1834//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxHQUFHLElBQUk7QUFDdEQsQ0FBQztBQUVNLElBQU1hLFVBQVUsR0FBRyxTQUFiQSxVQUFVQSxDQUFJL0IsUUFBUSxFQUFLO0VBQ3BDLElBQU1nQyxlQUFlLEdBQUdqQyx5QkFBeUIsQ0FBQ0MsUUFBUSxDQUFDO0VBQzNELElBQUlnQyxlQUFlLEtBQUssSUFBSSxFQUFFLE9BQU9BLGVBQWU7RUFFcEQsSUFBTUMsbUJBQW1CLEdBQUdkLHNCQUFzQixDQUFDbkIsUUFBUSxDQUFDO0VBQzVELElBQUlpQyxtQkFBbUIsS0FBSyxJQUFJLEVBQUUsT0FBT0EsbUJBQW1CO0VBRTVELE9BQU8sS0FBSztBQUNoQixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL2NvbnNlbnQuanM/YWU5MCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgY29uc2VudEV2ZW50cyA9IFtcbiAgICAnQ29va2llU2NyaXB0QWNjZXB0JyxcbiAgICAnQ29va2llU2NyaXB0QWNjZXB0QWxsJyxcbiAgICAnQ29va2llU2NyaXB0UmVqZWN0JyxcbiAgICAnQ29va2llU2NyaXB0Q29uc2VudFVwZGF0ZWQnXG5dXG5cbmNvbnN0IGdldEN1c3RvbWVyUHJpdmFjeUNvbnNlbnQgPSAoY2F0ZWdvcnkpID0+IHtcbiAgICBjb25zdCBjdXN0b21lclByaXZhY3kgPSB3aW5kb3cuU2hvcGlmeT8uY3VzdG9tZXJQcml2YWN5XG4gICAgaWYgKCFjdXN0b21lclByaXZhY3kpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBtZXRob2RNYXAgPSB7XG4gICAgICAgIGNvb2tpZV9jYXRfZnVuY3Rpb25hbDogJ3ByZWZlcmVuY2VzUHJvY2Vzc2luZ0FsbG93ZWQnLFxuICAgICAgICBjb29raWVfY2F0X3N0YXRpc3RpYzogJ2FuYWx5dGljc1Byb2Nlc3NpbmdBbGxvd2VkJyxcbiAgICAgICAgY29va2llX2NhdF9tYXJrZXRpbmc6ICdtYXJrZXRpbmdBbGxvd2VkJyxcbiAgICAgICAgY29va2llX2NhdF9jYXRlZ29yeTogJ3ByZWZlcmVuY2VzUHJvY2Vzc2luZ0FsbG93ZWQnXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gbWV0aG9kTWFwW2NhdGVnb3J5XVxuICAgIGlmIChtZXRob2QgJiYgdHlwZW9mIGN1c3RvbWVyUHJpdmFjeVttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgI
1834HJldHVybiBCb29sZWFuKGN1c3RvbWVyUHJpdmFjeVttZXRob2RdKCkpXG4gICAgfVxuXG4gICAgY29uc3QgY29uc2VudCA9IGN1c3RvbWVyUHJpdmFjeS5nZXRUcmFja2luZ0NvbnNlbnQ/LigpXG4gICAgaWYgKCFjb25zZW50KSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHR5cGVvZiBjb25zZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gY29uc2VudC50b0xvd2VyQ2FzZSgpID09PSAneWVzJ1xuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgY29va2llX2NhdF9mdW5jdGlvbmFsOiAncHJlZmVyZW5jZXMnLFxuICAgICAgICBjb29raWVfY2F0X3N0YXRpc3RpYzogJ2FuYWx5dGljcycsXG4gICAgICAgIGNvb2tpZV9jYXRfbWFya2V0aW5nOiAnbWFya2V0aW5nJyxcbiAgICAgICAgY29va2llX2NhdF9jYXRlZ29yeTogJ3ByZWZlcmVuY2VzJ1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBtYXBbY2F0ZWdvcnldXG4gICAgcmV0dXJuIGtleSA/IEJvb2xlYW4oY29uc2VudFtrZXldKSA6IG51bGxcbn1cblxuY29uc3QgZ2V0Q29va2llU2NyaXB0Q29uc2VudCA9IChjYXRlZ29yeSkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gd2luZG93LkNvb2tpZVNjcmlwdD8uaW5zdGFuY2U/LmN1cnJlbnRTdGF0ZT8uKClcbiAgICBpZiAoIXN0YXRlIHx8ICFBcnJheS5pc0FycmF5KHN0YXRlLmNhdGVnb3JpZXMpKSByZXR1cm4gbnVsbFxuICAgIGlmIChzdGF0ZS5hY3Rpb24gPT09ICdyZWplY3QnKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgY29va2llX2NhdF9mdW5jdGlvbmFsOiAnZnVuY3Rpb25hbGl0eScsXG4gICAgICAgIGNvb2tpZV9jYXRfc3RhdGlzdGljOiAncGVyZm9ybWFuY2UnLFxuICAgICAgICBjb29raWVfY2F0X21hcmtldGluZzogJ3RhcmdldGluZycsXG4gICAgICAgIGNvb2tpZV9jYXRfY2F0ZWdvcnk6ICdmdW5jdGlvbmFsaXR5J1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBtYXBbY2F0ZWdvcnldXG4gICAgcmV0dXJuIGtleSA/IHN0YXRlLmNhdGVnb3JpZXMuaW5jbHVkZXMoa2V5KSA6IG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0NvbnNlbnQgPSAoY2F0ZWdvcnkpID0+IHtcbiAgICBjb25zdCBjdXN0b21lckNvbnNlbnQgPSBnZXRDdXN0b21lclByaXZhY3lDb25zZW50KGNhdGVnb3J5KVxuICAgIGlmIChjdXN0b21lckNvbnNlbnQgIT09IG51bGwpIHJldHVybiBjdXN0b21lckNvbnNlbnRcblxuICAgIGNvbnN0IGNvb2tpZVNjcmlwdENvbnNlbnQgPSBnZXRDb29raWVTY3JpcHRDb25zZW50KGNhdGVnb3J5KVxuICAgIGlmIChjb29raWVTY3JpcHRDb25zZW50ICE9PSBudWxsKSByZXR1cm4gY29va2llU2NyaXB0Q29uc2VudFxuXG4gICAgcmV0dXJuIGZhbHNlXG59XG4iXSwibmFtZXMiOlsiY29uc2VudEV2ZW50cyIsImdldEN1c3RvbWVyUHJpdmFjeUNvbnNlbnQiLCJjYXRlZ29yeSIsIl93aW5kb3ckU2hvcGlmeSIsIl9jdXN0b21lclByaXZhY3kkZ2V0VCIsImN1c3RvbWVyUHJpdmFjeSIsIndpbmRvdyIsIlNob3BpZnkiLCJtZXRob2RNYXAiLCJjb29raWVfY2F0X2Z1bmN0aW9uYWwiLCJjb29raWVfY2F0X3N0YXRpc3RpYyIsImNvb2tpZV9jYXRfbWFya2V0aW5nIiwiY29va2llX2NhdF9jYXRlZ29yeSIsIm1ldGhvZCIsIkJvb2xlYW4iLCJjb25zZW50IiwiZ2V0VHJhY2tpbmdDb25zZW50IiwiY2FsbCIsInRvTG93ZXJDYXNlIiwibWFwIiwia2V5IiwiZ2V0Q29va2llU2NyaXB0Q29uc2VudCIsIl93aW5kb3ckQ29va2llU2NyaXB0IiwiX3dpbmRvdyRDb29raWVTY3JpcHQkIiwic3RhdGUiLCJDb29raWVTY3JpcHQiLCJpbnN0YW5jZSIsImN1cnJlbnRTdGF0ZSIsIkFycmF5IiwiaXNBcnJheSIsImNhdGVnb3JpZXMiLCJhY3Rpb24iLCJpbmNsdWRlcyIsImhhc0NvbnNlbnQiLCJjdXN0b21lckNvbnNlbnQiLCJjb29raWVTY3JpcHRDb25zZW50Il0sInNvdXJjZVJvb3QiOiIifQ==
1835//# sourceURL=webpack-internal:///./src/scripts/lib/consent.js
1836
1837}`)},"./src/scripts/lib/currency.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
1838/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1839/* harmony export */   formatMoney: () => (/* binding */ formatMoney)
1840/* harmony export */ });
1841/**
1842 * Format money values based on your shop currency settings
1843 * @param  {Number|string} cents - value in cents or dollar amount e.g. 300 cents
1844 * or 3.00 dollars
1845 * @param  {String} format - shop money_format setting
1846 * @return {String} value - formatted value
1847 */
1848
1849function formatMoney(cents) {
1850  var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : theme.money.format;
1851  if (typeof cents === 'string') {
1852    cents = cents.replace('.', '');
1853  }
1854  var value = '';
1855  var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;
1856  function formatWithDelimiters(number, precision, thousands, decimal) {
1857    if (typeof precision == 'undefined') {
1858      precision = 2;
1859    }
1860    thousands = theme.money.thousandsSeperator;
1861    decimal = thousands == ',' ? '.' : ',';
1862    if (isNaN(number) || number == null) {
1863      return 0;
1864    }
1865    number = (number / 100).toFixed(precision);
1866    var parts = number.split('.');
1867    var dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands);
1868    var centsAmount = parts[1] ? decimal + parts[1] : '';
1869    return dollarsAmount + centsAmount;
1870  }
1871  switch (format.match(placeholderRegex)[1]) {
1872    case 'amount':
1873      value = formatWithDelimiters(cents, 2);
1874      break;
1875    case 'amount_with_comma_separator':
1876      value = formatWithDelimiters(cents, 2);
1877      break;
1878    case 'amount_no_decimals':
1879      value = formatWithDelimiters(cents, 0);
1880      break;
1881    case 'amount_with_space_separator':
1882      value = formatWithDelimiters(cents, 2);
1883      break;
1884    case 'amount_no_decimals_with_comma_separator':
1885      value = formatWithDelimiters(cents, 0);
1886      break;
1887    case 'amount_no_decimals_with_space_separator':
1888      value = formatWithDelimiters(cents, 0);
1889      break;
1890  }
1891  return format.replace(placeholderRegex, value);
1892}//# sourceURL=[module]
1893//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvY3VycmVuY3kuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNBLFdBQVdBLENBQUNDLEtBQUssRUFBK0I7RUFBQSxJQUE3QkMsTUFBTSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBR0csS0FBSyxDQUFDQyxLQUFLLENBQUNMLE1BQU07RUFDMUQsSUFBSSxPQUFPRCxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQzNCQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ08sT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDbEM7RUFFQSxJQUFJQyxLQUFLLEdBQUcsRUFBRTtFQUNkLElBQU1DLGdCQUFnQixHQUFHLHFCQUFxQjtFQUU5QyxTQUFTQyxvQkFBb0JBLENBQUNDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRTtJQUNqRSxJQUFJLE9BQU9GLFNBQVMsSUFBSSxXQUFXLEVBQUU7TUFDakNBLFNBQVMsR0FBRyxDQUFDO0lBQ2pCO0lBRUFDLFNBQVMsR0FBR1IsS0FBSyxDQUFDQyxLQUFLLENBQUNTLGtCQUFrQjtJQUMxQ0QsT0FBTyxHQUFJRCxTQUFTLElBQUksR0FBRyxHQU
1893FJLEdBQUcsR0FBRyxHQUFHO0lBRXhDLElBQUlHLEtBQUssQ0FBQ0wsTUFBTSxDQUFDLElBQUlBLE1BQU0sSUFBSSxJQUFJLEVBQUU7TUFDakMsT0FBTyxDQUFDO0lBQ1o7SUFFQUEsTUFBTSxHQUFHLENBQUNBLE1BQU0sR0FBRyxHQUFHLEVBQUVNLE9BQU8sQ0FBQ0wsU0FBUyxDQUFDO0lBRTFDLElBQU1NLEtBQUssR0FBR1AsTUFBTSxDQUFDUSxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQy9CLElBQU1DLGFBQWEsR0FBR0YsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDWCxPQUFPLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxHQUFHTSxTQUFTLENBQUM7SUFDcEYsSUFBTVEsV0FBVyxHQUFHSCxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUdKLE9BQU8sR0FBR0ksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7SUFFdEQsT0FBT0UsYUFBYSxHQUFHQyxXQUFXO0VBQ3RDO0VBRUEsUUFBUXBCLE1BQU0sQ0FBQ3FCLEtBQUssQ0FBQ2IsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsS0FBSyxRQUFRO01BQ1RELEtBQUssR0FBR0Usb0JBQW9CLENBQUNWLEtBQUssRUFBRSxDQUFDLENBQUM7TUFDdEM7SUFDSixLQUFLLDZCQUE2QjtNQUM5QlEsS0FBSyxHQUFHRSxvQkFBb0IsQ0FBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQztNQUN0QztJQUNKLEtBQUssb0JBQW9CO01BQ3JCUSxLQUFLLEdBQUdFLG9CQUFvQixDQUFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDO01BQ3RDO0lBQ0osS0FBSyw2QkFBNkI7TUFDOUJRLEtBQUssR0FBR0Usb0JBQW9CLENBQUNWLEtBQUssRUFBRSxDQUFDLENBQUM7TUFDdEM7SUFDSixLQUFLLHlDQUF5QztNQUMxQ1EsS0FBSyxHQUFHRSxvQkFBb0IsQ0FBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQztNQUN0QztJQUNKLEtBQUsseUNBQXlDO01BQzFDUSxLQUFLLEdBQUdFLG9CQUFvQixDQUFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDO01BQ3RDO0VBQ1I7RUFFQSxPQUFPQyxNQUFNLENBQUNNLE9BQU8sQ0FBQ0UsZ0JBQWdCLEVBQUVELEtBQUssQ0FBQztBQUNsRCIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2xpYi9jdXJyZW5jeS5qcz9lNWYyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9ybWF0IG1vbmV5IHZhbHVlcyBiYXNlZCBvbiB5b3VyIHNob3AgY3VycmVuY3kgc2V0dGluZ3NcbiAqIEBwYXJhbSAge051bWJlcnxzdHJpbmd9IGNlbnRzIC0gdmFsdWUgaW4gY2VudHMgb3IgZG9sbGFyIGFtb3VudCBlLmcuIDMwMCBjZW50c1xuICogb3IgMy4wMCBkb2xsYXJzXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGZvcm1hdCAtIHNob3AgbW9uZXlfZm9ybWF0IHNldHRpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gdmFsdWUgLSBmb3JtYXR0ZWQgdmFsdWVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TW9uZXkoY2VudHMsIGZvcm1hdCA9IHRoZW1lLm1vbmV5LmZvcm1hdCkge1xuICAgIGlmICh0eXBlb2YgY2VudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNlbnRzID0gY2VudHMucmVwbGFjZSgnLicsICcnKVxuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9ICcnXG4gICAgY29uc3QgcGxhY2Vob2xkZXJSZWdleCA9IC9cXHtcXHtcXHMqKFxcdyspXFxzKlxcfVxcfS9cblxuICAgIGZ1bmN0aW9uIGZvcm1hdFdpdGhEZWxpbWl0ZXJzKG51bWJlciwgcHJlY2lzaW9uLCB0aG91c2FuZHMsIGRlY2ltYWwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcmVjaXNpb24gPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHByZWNpc2lvbiA9IDJcbiAgICAgICAgfVxuXG4gICAgICAgIHRob3VzYW5kcyA9IHRoZW1lLm1vbmV5LnRob3VzYW5kc1NlcGVyYXRvclxuICAgICAgICBkZWNpbWFsID0gKHRob3VzYW5kcyA9PSAnLCcpID8gJy4nIDogJywnXG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgbnVtYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cblxuICAgICAgICBudW1iZXIgPSAobnVtYmVyIC8gMTAwKS50b0ZpeGVkKHByZWNpc2lvbilcblxuICAgICAgICBjb25zdCBwYXJ0cyA9IG51bWJlci5zcGxpdCgnLicpXG4gICAgICAgIGNvbnN0IGRvbGxhcnNBbW91bnQgPSBwYXJ0c1swXS5yZXBsYWNlKC8oXFxkKSg/PShcXGRcXGRcXGQpKyg/IVxcZCkpL2csICckMScgKyB0aG91c2FuZHMpXG4gICAgICAgIGNvbnN0IGNlbnRzQW1vdW50ID0gcGFydHNbMV0gPyBkZWNpbWFsICsgcGFydHNbMV0gOiAnJ1xuXG4gICAgICAgIHJldHVybiBkb2xsYXJzQW1vdW50ICsgY2VudHNBbW91bnRcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGZvcm1hdC5tYXRjaChwbGFjZWhvbGRlclJlZ2V4KVsxXSkge1xuICAgICAgICBjYXNlICdhbW91bnQnOlxuICAgICAgICAgICAgdmFsdWUgPSBmb3JtYXRXaXRoRGVsaW1pdGVycyhjZW50cywgMilcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcic6XG4gICAgICAgICAgICB2YWx1ZSA9IGZvcm1hdFdpdGhEZWxpbWl0ZXJzKGNlbnRzLCAyKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYW1vdW50X25vX2RlY2ltYWxzJzpcbiAgICAgICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDApXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdhbW91bnRfd2l0aF9zcGFjZV9zZXBhcmF0b3InOlxuICAgICAgICAgICAgdmFsdWUgPSBmb3JtYXRXaXRoRGVsaW1pdGVycyhjZW50cywgMilcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2Ftb3VudF9ub19kZWNpbWFsc193aXRoX2NvbW1hX3NlcGFyYXRvcic6XG4gICAgICAgICAgICB2YWx1ZSA9IGZvcm1hdFdpdGhEZWxpbWl0ZXJzKGNlbnRzLCAwKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYW1vdW50X25vX2RlY2ltYWxzX3dpdGhfc3BhY2Vfc2VwYXJhdG9yJzpcbiAgICAgICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDApXG4gICAgICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZShwbGFjZWhvbGRlclJlZ2V4LCB2YWx1ZSlcbn1cbiJdLCJuYW1lcyI6WyJmb3JtYXRNb25leSIsImNlbn
1893RzIiwiZm9ybWF0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwidGhlbWUiLCJtb25leSIsInJlcGxhY2UiLCJ2YWx1ZSIsInBsYWNlaG9sZGVyUmVnZXgiLCJmb3JtYXRXaXRoRGVsaW1pdGVycyIsIm51bWJlciIsInByZWNpc2lvbiIsInRob3VzYW5kcyIsImRlY2ltYWwiLCJ0aG91c2FuZHNTZXBlcmF0b3IiLCJpc05hTiIsInRvRml4ZWQiLCJwYXJ0cyIsInNwbGl0IiwiZG9sbGFyc0Ftb3VudCIsImNlbnRzQW1vdW50IiwibWF0Y2giXSwic291cmNlUm9vdCI6IiJ9
1894//# sourceURL=webpack-internal:///./src/scripts/lib/currency.js
1895
1896}`)},"./src/scripts/lib/faithpilot.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
1897/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1898/* harmony export */   renderFaithpilotItems: () => (/* binding */ renderFaithpilotItems)
1899/* harmony export */ });
1900function renderFaithpilotItems(items, container, limit) {
1901  var truncate = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
1902  if (!limit) limit = items.length;
1903  loopify(items).slice(0, limit).forEach(function (i) {
1904    var _date;
1905    var date = i.date.length ? new Date(i.date) : null;
1906    var options = {
1907      year: 'numeric',
1908      month: 'long',
1909      day: 'numeric'
1910    };
1911    date = ((_date = date) === null || _date === void 0 ? void 0 : _date.toLocaleDateString(window.theme.config.locale, options)) || '';
1912    var truncateLength = truncate ? 100 : i.quote.length;
1913    var quoteTruncated = i.quote.length > truncateLength ? i.quote.slice(0, truncateLength).concat('...') : i.quote;
1914    var starCount = parseInt(i.stars);
1915    var iconName;
1916    switch (starCount) {
1917      case 1:
1918        iconName = 'faithpilotStarRed';
1919        break;
1920      case 2:
1921        iconName = 'faithpilotStarOrange';
1922        break;
1923      case 3:
1924        iconName = 'faithpilotStarYellow';
1925        break;
1926      case 4:
1927        iconName = 'faithpilotStarLight';
1928        break;
1929      case 5:
1930        iconName = 'faithpilotStarDark';
1931        break;
1932      default:
1933    }
1934    var starsHtml = window.theme.icons[iconName].repeat(starCount);
1935    if (starCount < 5) {
1936      for (var _i = 0; _i < 5 - starCount; _i++) {
1937        starsHtml += window.theme.icons.faithpilotStarVoid;
1938      }
1939    }
1940    var div = document.createElement('div');
1941    container.appendChild(div);
1942    div.outerHTML = window.theme.faithpilot.reviewItem.replaceAll('%title%', i.title).replaceAll('%date%', date).replaceAll('%content%', i.quote).replaceAll('%contentTruncated%', quoteTruncated).replaceAll('%stars%', starsHtml);
1943  });
1944}//# sourceURL=[module]
1945//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvZmFpdGhwaWxvdC5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQU8sU0FBU0EscUJBQXFCQSxDQUFDQyxLQUFLLEVBQUVDLFNBQVMsRUFBRUMsS0FBSyxFQUFtQjtFQUFBLElBQWpCQyxRQUFRLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUk7RUFDMUUsSUFBSSxDQUFDRixLQUFLLEVBQUVBLEtBQUssR0FBR0YsS0FBSyxDQUFDSyxNQUFNO0VBRWhDRSxPQUFPLENBQUNQLEtBQUssQ0FBQyxDQUFDUSxLQUFLLENBQUMsQ0FBQyxFQUFDTixLQUFLLENBQUMsQ0FBQ08sT0FBTyxDQUFDLFVBQUFDLENBQUMsRUFBSTtJQUFBLElBQUFDLEtBQUE7SUFDdkMsSUFBSUMsSUFBSSxHQUFHRixDQUFDLENBQUNFLElBQUksQ0FBQ1AsTUFBTSxHQUFHLElBQUlRLElBQUksQ0FBQ0gsQ0FBQyxDQUFDRSxJQUFJLENBQUMsR0FBRyxJQUFJO0lBQ2xELElBQU1FLE9BQU8sR0FBRztNQUFFQyxJQUFJLEVBQUUsU0FBUztNQUFFQyxLQUFLLEVBQUUsTUFBTTtNQUFFQyxHQUFHLEVBQUU7SUFBVSxDQUFDO0lBQ2xFTCxJQUFJLEdBQUcsRUFBQUQsS0FBQSxHQUFBQyxJQUFJLGNBQUFELEtBQUEsdUJBQUpBLEtBQUEsQ0FBTU8sa0JBQWtCLENBQUNDLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDQyxNQUFNLENBQUNDLE1BQU0sRUFBRVIsT0FBTyxDQUFDLEtBQUksRUFBRTtJQUUxRSxJQUFNUyxjQUFjLEdBQUdwQixRQUFRLEdBQUcsR0FBRyxHQUFHTyxDQUFDLENBQUNjLEtBQUssQ0FBQ25CLE1BQU07SUFDdEQsSUFBTW9CLGNBQWMsR0FBR2YsQ0FBQyxDQUFDYyxLQUFLLENBQUNuQixNQUFNLEdBQUdrQixjQUFjLEdBQUdiLENBQUMsQ0FBQ2MsS0FBSyxDQUFDaEIsS0FBSyxDQUFDLENBQUMsRUFBQ2UsY0FBYyxDQUFDLENBQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBR2hCLENBQUMsQ0FBQ2MsS0FBSztJQUVoSCxJQUFNRyxTQUFTLEdBQUdDLFFBQVEsQ0FBQ2xCLENBQUMsQ0FBQ21CLEtBQUssQ0FBQztJQUNuQyxJQUFJQyxRQUFRO0lBRVosUUFBUUgsU0FBUztNQUNiLEtBQUssQ0FBQztRQUNGRyxRQUFRLEdBQUcsbUJBQW1CO1FBQzlCO01BQ0osS0FBSyxDQUFDO1FBQ0ZBLFFBQVEsR0FBRyxzQkFBc0I7UUFDakM7TUFDSixLQUFLLENBQUM7UUFDRkEsUUFBUSxHQUFHLHNCQUFzQjtRQUNqQzt
1945NQUNKLEtBQUssQ0FBQztRQUNGQSxRQUFRLEdBQUcscUJBQXFCO1FBQ2hDO01BQ0osS0FBSyxDQUFDO1FBQ0ZBLFFBQVEsR0FBRyxvQkFBb0I7UUFDL0I7TUFDSjtJQUVKO0lBRUEsSUFBSUMsU0FBUyxHQUFHWixNQUFNLENBQUNDLEtBQUssQ0FBQ1ksS0FBSyxDQUFDRixRQUFRLENBQUMsQ0FBQ0csTUFBTSxDQUFDTixTQUFTLENBQUM7SUFFOUQsSUFBSUEsU0FBUyxHQUFHLENBQUMsRUFBRTtNQUNmLEtBQUssSUFBSWpCLEVBQUMsR0FBRyxDQUFDLEVBQUVBLEVBQUMsR0FBRyxDQUFDLEdBQUdpQixTQUFTLEVBQUVqQixFQUFDLEVBQUUsRUFBRTtRQUNwQ3FCLFNBQVMsSUFBSVosTUFBTSxDQUFDQyxLQUFLLENBQUNZLEtBQUssQ0FBQ0Usa0JBQWtCO01BQ3REO0lBQ0o7SUFFQSxJQUFNQyxHQUFHLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztJQUN6Q3BDLFNBQVMsQ0FBQ3FDLFdBQVcsQ0FBQ0gsR0FBRyxDQUFDO0lBRTFCQSxHQUFHLENBQUNJLFNBQVMsR0FBR3BCLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDb0IsVUFBVSxDQUFDQyxVQUFVLENBQ2pDQyxVQUFVLENBQUMsU0FBUyxFQUFFaEMsQ0FBQyxDQUFDaUMsS0FBSyxDQUFDLENBQzlCRCxVQUFVLENBQUMsUUFBUSxFQUFFOUIsSUFBSSxDQUFDLENBQzFCOEIsVUFBVSxDQUFDLFdBQVcsRUFBRWhDLENBQUMsQ0FBQ2MsS0FBSyxDQUFDLENBQ2hDa0IsVUFBVSxDQUFDLG9CQUFvQixFQUFFakIsY0FBYyxDQUFDLENBQ2hEaUIsVUFBVSxDQUFDLFNBQVMsRUFBRVgsU0FBUyxDQUFDO0VBQ3JELENBQUMsQ0FBQztBQUNOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL2ZhaXRocGlsb3QuanM/ZTE4NiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcmVuZGVyRmFpdGhwaWxvdEl0ZW1zKGl0ZW1zLCBjb250YWluZXIsIGxpbWl0LCB0cnVuY2F0ZSA9IHRydWUpIHtcbiAgICBpZiAoIWxpbWl0KSBsaW1pdCA9IGl0ZW1zLmxlbmd0aFxuXG4gICAgbG9vcGlmeShpdGVtcykuc2xpY2UoMCxsaW1pdCkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgbGV0IGRhdGUgPSBpLmRhdGUubGVuZ3RoID8gbmV3IERhdGUoaS5kYXRlKSA6IG51bGxcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9XG4gICAgICAgIGRhdGUgPSBkYXRlPy50b0xvY2FsZURhdGVTdHJpbmcod2luZG93LnRoZW1lLmNvbmZpZy5sb2NhbGUsIG9wdGlvbnMpIHx8ICcnXG5cbiAgICAgICAgY29uc3QgdHJ1bmNhdGVMZW5ndGggPSB0cnVuY2F0ZSA/IDEwMCA6IGkucXVvdGUubGVuZ3RoXG4gICAgICAgIGNvbnN0IHF1b3RlVHJ1bmNhdGVkID0gaS5xdW90ZS5sZW5ndGggPiB0cnVuY2F0ZUxlbmd0aCA/IGkucXVvdGUuc2xpY2UoMCx0cnVuY2F0ZUxlbmd0aCkuY29uY2F0KCcuLi4nKSA6IGkucXVvdGVcblxuICAgICAgICBjb25zdCBzdGFyQ291bnQgPSBwYXJzZUludChpLnN0YXJzKVxuICAgICAgICBsZXQgaWNvbk5hbWVcbiAgICAgICAgXG4gICAgICAgIHN3aXRjaCAoc3RhckNvdW50KSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgaWNvbk5hbWUgPSAnZmFpdGhwaWxvdFN0YXJSZWQnXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBpY29uTmFtZSA9ICdmYWl0aHBpbG90U3Rhck9yYW5nZSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIGljb25OYW1lID0gJ2ZhaXRocGlsb3RTdGFyWWVsbG93J1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgaWNvbk5hbWUgPSAnZmFpdGhwaWxvdFN0YXJMaWdodCdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIGljb25OYW1lID0gJ2ZhaXRocGlsb3RTdGFyRGFyaydcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcblxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJzSHRtbCA9IHdpbmRvdy50aGVtZS5pY29uc1tpY29uTmFtZV0ucmVwZWF0KHN0YXJDb3VudClcblxuICAgICAgICBpZiAoc3RhckNvdW50IDwgNSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1IC0gc3RhckNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdGFyc0h0bWwgKz0gd2luZG93LnRoZW1lLmljb25zLmZhaXRocGlsb3RTdGFyVm9pZF
vendor: 7,696 bytes, lines 1945-1990
1945xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdilcblxuICAgICAgICBkaXYub3V0ZXJIVE1MID0gd2luZG93LnRoZW1lLmZhaXRocGlsb3QucmV2aWV3SXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJyV0aXRsZSUnLCBpLnRpdGxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJyVkYXRlJScsIGRhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnJWNvbnRlbnQlJywgaS5xdW90ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCclY29udGVudFRydW5jYXRlZCUnLCBxdW90ZVRydW5jYXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCclc3RhcnMlJywgc3RhcnNIdG1sKVxuICAgIH0pXG59Il0sIm5hbWVzIjpbInJlbmRlckZhaXRocGlsb3RJdGVtcyIsIml0ZW1zIiwiY29udGFpbmVyIiwibGltaXQiLCJ0cnVuY2F0ZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImxvb3BpZnkiLCJzbGljZSIsImZvckVhY2giLCJpIiwiX2RhdGUiLCJkYXRlIiwiRGF0ZSIsIm9wdGlvbnMiLCJ5ZWFyIiwibW9udGgiLCJkYXkiLCJ0b0xvY2FsZURhdGVTdHJpbmciLCJ3aW5kb3ciLCJ0aGVtZSIsImNvbmZpZyIsImxvY2FsZSIsInRydW5jYXRlTGVuZ3RoIiwicXVvdGUiLCJxdW90ZVRydW5jYXRlZCIsImNvbmNhdCIsInN0YXJDb3VudCIsInBhcnNlSW50Iiwic3RhcnMiLCJpY29uTmFtZSIsInN0YXJzSHRtbCIsImljb25zIiwicmVwZWF0IiwiZmFpdGhwaWxvdFN0YXJWb2lkIiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJvdXRlckhUTUwiLCJmYWl0aHBpbG90IiwicmV2aWV3SXRlbSIsInJlcGxhY2VBbGwiLCJ0aXRsZSJdLCJzb3VyY2VSb290IjoiIn0=
1946//# sourceURL=webpack-internal:///./src/scripts/lib/faithpilot.js
1947
1948}`)},"./src/scripts/lib/fetch-paginated-items.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
1949/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1950/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1951/* harmony export */ });
1952function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
1953function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
1954function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
1955function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
1956function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
1957function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
1958function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
1959function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
1960function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
1961function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
1962/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/function () {
1963  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(url) {
1964    var pageSize,
1965      items,
1966      hasMore,
1967      page,
1968      response,
1969      data,
1970      _args = arguments;
1971    return _regenerator().w(function (_context) {
1972      while (1) switch (_context.n) {
1973        case 0:
1974          pageSize = _args.length > 1 && _args[1] !== undefined ? _args[1] : 250;
1975          items = [];
1976          hasMore = true;
1977          page = 1;
1978        case 1:
1979          _context.n = 2;
1980          return fetch("".concat(url, "&page=").concat(page));
1981        case 2:
1982          response = _context.v;
1983          _context.n = 3;
1984          return response.json();
1985        case 3:
1986          data = _context.v;
1987          items.push.apply(items, _toConsumableArray(data));
1988          page += 1;
1989          if (data.length < pageSize) {
1990            hasMore = false;
1991          }
1992        case 4:
1993          if (hasMore) {
1994            _context.n = 1;
1995            break;
1996          }
1997        case 5:
1998          return _context.a(2, items);
1999      }
2000    }, _callee);
2001  }));
2002  return function (_x) {
2003    return _ref.apply(this, arguments);
2004  };
2005}());//# sourceURL=[module]
2006//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvZmV0Y2gtcGFnaW5hdGVkLWl0ZW1zLmpzIiwibWFwcGluZ3MiOiI7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFBLElBQUFGLENB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QUEsQ0FBQWhFLENBQUEsRUFBQUQsQ0FBQSxZQUFBa0UsTUFBQTlELENBQUEsSUFBQXVELGtCQUFBLENBQUF0QyxDQUFBLEVBQUFuQixDQUFBLEVBQUFJLENBQUEsRUFBQTRELEtBQUEsRUFBQUMsTUFBQSxVQUFBL0QsQ0FBQSxjQUFBK0QsT0FBQS9ELENBQUEsSUFBQXVELGtCQUFBLENBQUF0QyxDQUFBLEVBQUFuQixDQUFBLEVBQUFJLENBQUEsRUFBQTRELEtBQUEsRUFBQUMsTUFBQSxXQUFBL0QsQ0FBQSxLQUFBOEQsS0FBQTtBQURBO0VBQUEsSUFBQUUsSUFBQSxHQUFBTCxpQkFBQSxjQUFBM0IsWUFBQSxHQUFBRSxDQUFBLENBQWUsU0FBQStCLFFBQU9DLEdBQUc7SUFBQSxJQUFBQyxRQUFBO01BQUFDLEtBQUE7TUFBQUMsT0FBQTtNQUFBQyxJQUFBO01BQUFDLFFBQUE7TUFBQUMsSUFBQTtNQUFBQyxLQUFBLEdBQUFiLFNBQUE7SUFBQSxPQUFBNUIsWUFBQSxHQUFBQyxDQUFBLFdBQUF5QyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQTFFLENBQUE7UUFBQTtVQUFFbUUsUUFBUSxHQUFBTSxLQUFBLENBQUFyRCxNQUFBLFFBQUFxRCxLQUFBLFFBQUFFLFNBQUEsR0FBQUYsS0FBQSxNQUFHLEdBQUc7VUFDakNMLEtBQUssR0FBRyxFQUFFO1VBRVpDLE9BQU8sR0FBRyxJQUFJO1VBQ2RDLElBQUksR0FBRyxDQUFDO1F
2006BQUE7VUFBQUksUUFBQSxDQUFBMUUsQ0FBQTtVQUFBLE9BR2E0RSxLQUFLLElBQUFDLE1BQUEsQ0FBSVgsR0FBRyxZQUFBVyxNQUFBLENBQVNQLElBQUksQ0FBRSxDQUFDO1FBQUE7VUFBN0NDLFFBQVEsR0FBQUcsUUFBQSxDQUFBMUQsQ0FBQTtVQUFBMEQsUUFBQSxDQUFBMUUsQ0FBQTtVQUFBLE9BQ0t1RSxRQUFRLENBQUNPLElBQUksQ0FBQyxDQUFDO1FBQUE7VUFBNUJOLElBQUksR0FBQUUsUUFBQSxDQUFBMUQsQ0FBQTtVQUNWb0QsS0FBSyxDQUFDVyxJQUFJLENBQUFsQixLQUFBLENBQVZPLEtBQUssRUFBQTNCLGtCQUFBLENBQVMrQixJQUFJLEVBQUM7VUFDbkJGLElBQUksSUFBSSxDQUFDO1VBRVQsSUFBSUUsSUFBSSxDQUFDcEQsTUFBTSxHQUFHK0MsUUFBUSxFQUFFO1lBQzFCRSxPQUFPLEdBQUcsS0FBSztVQUNqQjtRQUFDO1VBQUEsSUFDTUEsT0FBTztZQUFBSyxRQUFBLENBQUExRSxDQUFBO1lBQUE7VUFBQTtRQUFBO1VBQUEsT0FBQTBFLFFBQUEsQ0FBQXpELENBQUEsSUFFVG1ELEtBQUs7TUFBQTtJQUFBLEdBQUFILE9BQUE7RUFBQSxDQUNiO0VBQUEsaUJBQUFlLEVBQUE7SUFBQSxPQUFBaEIsSUFBQSxDQUFBSCxLQUFBLE9BQUFELFNBQUE7RUFBQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL2ZldGNoLXBhZ2luYXRlZC1pdGVtcy5qcz8xYzdhIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGFzeW5jICh1cmwsIHBhZ2VTaXplID0gMjUwKSA9PiB7XG4gIGNvbnN0IGl0ZW1zID0gW107XG5cbiAgbGV0IGhhc01vcmUgPSB0cnVlO1xuICBsZXQgcGFnZSA9IDE7XG5cbiAgZG8ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dXJsfSZwYWdlPSR7cGFnZX1gKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGl0ZW1zLnB1c2goLi4uZGF0YSk7XG4gICAgcGFnZSArPSAxO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoIDwgcGFnZVNpemUpIHtcbiAgICAgIGhhc01vcmUgPSBmYWxzZTtcbiAgICB9XG4gIH0gd2hpbGUgKGhhc01vcmUpO1xuXG4gIHJldHVybiBpdGVtcztcbn07Il0sIm5hbWVzIjpbImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsIm8iLCJ0b1N0cmluZ1RhZyIsImkiLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsImNyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwicCIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJjYWxsIiwiZG9uZSIsInZhbHVlIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsIl9yZWdlbmVyYXRvciIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJpc0FycmF5IiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiX3JlZiIsIl9jYWxsZWUiLCJ1cmwiLCJwYWdlU2l6ZSIsIml0ZW1zIiwiaGFzTW9yZSIsInBhZ2UiLCJyZXNwb25zZSIsImRhdGEiLCJfYXJncyIsIl9jb250ZXh0IiwidW5kZWZpbmVkIiwiZmV0Y2giLCJjb25jYXQiLCJqc29uIiwicHVzaCIsIl94Il0sInNvdXJjZVJvb3QiOiIifQ==
2007//# sourceURL=webpack-internal:///./src/scripts/lib/fetch-paginated-items.js
2008
2009}`)},"./src/scripts/lib/images.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
2010/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2011/* harmony export */   getSizedImageUrl: () => (/* binding */ getSizedImageUrl),
2012/* harmony export */   imageSize: () => (/* binding */ imageSize),
2013/* harmony export */   loadImage: () => (/* binding */ loadImage),
2014/* harmony export */   preload: () => (/* binding */ preload),
2015/* harmony export */   removeProtocol: () => (/* binding */ removeProtocol)
2016/* harmony export */ });
2017/**
2018 * Preloads an image in memory and uses the browsers cache to store it until needed.
2019 *
2020 * @param {Array} images - A list of image urls
2021 * @param {String} size - A shopify image size attribute
2022 */
2023function preload(images, size) {
2024  if (typeof images === 'string') {
2025    images = [images];
2026  }
2027  for (var i = 0; i < images.length; i++) {
2028    var image = images[i];
2029    loadImage(getSizedImageUrl(image, size));
2030  }
2031}
2032
2033/**
2034 * Loads and caches an image in the browsers cache.
2035 * @param {string} path - An image url
2036 */
2037function loadImage(path) {
2038  /* eslint-disable */
2039  new Image().src = path;
2040  /* eslint-enable */
2041}
2042
2043/**
2044 * Find the Shopify image attribute size
2045 *
2046 * @param {string} src
2047 * @returns {null}
2048 */
2049function imageSize(src) {
2050  /* eslint-disable */
2051  var match = src.match(/.+_((pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})(@\\dx)?\\./);
2052  /* esling-enable */
2053
2054  if (match) {
2055    return match[1];
2056  } else {
2057    return null;
2058  }
2059}
2060
2061/**
2062 * Adds a Shopify size attribute to a URL
2063 *
2064 * @param src
2065 * @param size
2066 * @returns {*}
2067 */
2068function getSizedImageUrl(src, size) {
2069  if (size === null) {
2070    return src;
2071  }
2072  if (size === 'master') {
2073    return removeProtocol(src);
2074  }
2075  var match = src.match(/\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif|webp)(\\?v=\\d+)?$/i);
2076  if (match) {
2077    var prefix = src.split(match[0]);
2078    var suffix = match[0];
2079    return removeProtocol(prefix[0] + '_' + size + suffix);
2080  } else {
2081    return null;
2082  }
2083}
2084function removeProtocol(path) {
2085  return path.replace(/http(s)?:/, '');
2086}//# sourceURL=[module]
2087//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvaW1hZ2VzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0EsT0FBT0EsQ0FBQ0MsTUFBTSxFQUFFQyxJQUFJLEVBQUU7RUFDbEMsSUFBSSxPQUFPRCxNQUFNLEtBQUssUUFBUSxFQUFFO0lBQzVCQSxN
2087QUFNLEdBQUcsQ0FBQ0EsTUFBTSxDQUFDO0VBQ3JCO0VBRUEsS0FBSyxJQUFJRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdGLE1BQU0sQ0FBQ0csTUFBTSxFQUFFRCxDQUFDLEVBQUUsRUFBRTtJQUNwQyxJQUFJRSxLQUFLLEdBQUdKLE1BQU0sQ0FBQ0UsQ0FBQyxDQUFDO0lBQ3JCRyxTQUFTLENBQUNDLGdCQUFnQixDQUFDRixLQUFLLEVBQUVILElBQUksQ0FBQyxDQUFDO0VBQzVDO0FBQ0o7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSxTQUFTQSxDQUFDRSxJQUFJLEVBQUU7RUFDNUI7RUFDQSxJQUFJQyxLQUFLLENBQUMsQ0FBQyxDQUFDQyxHQUFHLEdBQUdGLElBQUk7RUFDdEI7QUFDSjs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRyxTQUFTQSxDQUFDRCxHQUFHLEVBQUU7RUFDM0I7RUFDQSxJQUFJRSxLQUFLLEdBQUdGLEdBQUcsQ0FBQ0UsS0FBSyxDQUFDLDRGQUE0RixDQUFDO0VBQ25IOztFQUVBLElBQUlBLEtBQUssRUFBRTtJQUNQLE9BQU9BLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDbkIsQ0FBQyxNQUFNO0lBQ0gsT0FBTyxJQUFJO0VBQ2Y7QUFDSjs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNMLGdCQUFnQkEsQ0FBQ0csR0FBRyxFQUFFUixJQUFJLEVBQUU7RUFDeEMsSUFBSUEsSUFBSSxLQUFLLElBQUksRUFBRTtJQUNmLE9BQU9RLEdBQUc7RUFDZDtFQUVBLElBQUlSLElBQUksS0FBSyxRQUFRLEVBQUU7SUFDbkIsT0FBT1csY0FBYyxDQUFDSCxHQUFHLENBQUM7RUFDOUI7RUFFQSxJQUFJRSxLQUFLLEdBQUdGLEdBQUcsQ0FBQ0UsS0FBSyxDQUFDLDJEQUEyRCxDQUFDO0VBRWxGLElBQUlBLEtBQUssRUFBRTtJQUNQLElBQUlFLE1BQU0sR0FBR0osR0FBRyxDQUFDSyxLQUFLLENBQUNILEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxJQUFJSSxNQUFNLEdBQUdKLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFckIsT0FBT0MsY0FBYyxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHWixJQUFJLEdBQUdjLE1BQU0sQ0FBQztFQUMxRCxDQUFDLE1BQU07SUFDSCxPQUFPLElBQUk7RUFDZjtBQUNKO0FBRU8sU0FBU0gsY0FBY0EsQ0FBQ0wsSUFBSSxFQUFFO0VBQ2pDLE9BQU9BLElBQUksQ0FBQ1MsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7QUFDeEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9saWIvaW1hZ2VzLmpzPzFjMjgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcmVsb2FkcyBhbiBpbWFnZSBpbiBtZW1vcnkgYW5kIHVzZXMgdGhlIGJyb3dzZXJzIGNhY2hlIHRvIHN0b3JlIGl0IHVudGlsIG5lZWRlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBpbWFnZXMgLSBBIGxpc3Qgb2YgaW1hZ2UgdXJsc1xuICogQHBhcmFtIHtTdHJpbmd9IHNpemUgLSBBIHNob3BpZnkgaW1hZ2Ugc2l6ZSBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWxvYWQoaW1hZ2VzLCBzaXplKSB7XG4gICAgaWYgKHR5cGVvZiBpbWFnZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGltYWdlcyA9IFtpbWFnZXNdXG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGltYWdlID0gaW1hZ2VzW2ldXG4gICAgICAgIGxvYWRJbWFnZShnZXRTaXplZEltYWdlVXJsKGltYWdlLCBzaXplKSlcbiAgICB9XG59XG5cblxuLyoqXG4gKiBMb2FkcyBhbmQgY2FjaGVzIGFuIGltYWdlIGluIHRoZSBicm93c2VycyBjYWNoZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQW4gaW1hZ2UgdXJsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkSW1hZ2UocGF0aCkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgbmV3IEltYWdlKCkuc3JjID0gcGF0aFxuICAgIC8qIGVzbGludC1lbmFibGUgKi9cbn1cblxuXG4vKipcbiAqIEZpbmQgdGhlIFNob3BpZnkgaW1hZ2UgYXR0cmlidXRlIHNpemVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gKiBAcmV0dXJucyB7bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltYWdlU2l6ZShzcmMpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIHZhciBtYXRjaCA9IHNyYy5tYXRjaCgvLitfKChwaWNvfGljb258dGh1bWJ8c21hbGx8Y29tcGFjdHxtZWRpdW18bGFyZ2V8Z3JhbmRlKXxcXGR7MSw0fXhcXGR7MCw0fXx4XFxkezEsNH0pKEBcXGR4KT9cXC4vKVxuICAgIC8qIGVzbGluZy1lbmFibGUgKi9cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cbn1cblxuXG4vKipcbiAqIEFkZHMgYSBTaG9waWZ5IHNpemUgYXR0cmlidXRlIHRvIGEgVVJMXG4gKlxuICogQHBhcmFtIHNyY1xuICogQHBhcmFtIHNpemVcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2l6ZWRJbWFnZVVybChzcmMsIHNpemUpIHtcbiAgICBpZiAoc2l6ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3JjXG4gICAgfVxuXG4gICAgaWYgKHNpemUgPT09ICdtYXN0ZXInKSB7XG4gICAgICAgIHJldHVybiByZW1vdmVQcm90b2NvbChzcmMpXG4gICAgfVxuXG4gICAgdmFyIG1hdGNoID0gc3JjLm1hdGNoKC9cXC4oanBnfGpwZWd8Z2lmfHBuZ3xibXB8Yml0bWFwfHRpZmZ8dGlmfHdlYnApKFxcP3Y9XFxkKyk/JC9pKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHZhciBwcmVmaXggPSBzcmMuc3BsaXQobWF0Y2hbMF0pXG4gICAgICAgIHZhciBzdWZmaXggPSBtYXRjaFswXVxuXG4gICAgICAgIHJldHVybiByZW1vdmVQcm90b2NvbChwcmVmaXhbMF0gKyAnXycgKyBzaXplICsgc3VmZml4KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUHJvdG9jb2wocGF0aCkge1xuICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL2h0dHAocyk/Oi8sICcnKVxufVxuIl0sIm5hbWVzIjpbInByZWxvYWQiLCJpbWFnZXMiLCJzaXplIiwiaSIsImxlbmd0aCIsImltYWdlIiwibG9hZEltYWdlIiwiZ2V0U2l6ZWRJbWFnZVVybCIsInBhdGgiLCJJbWFnZSIsInNyYyIsImltYWdlU2l6ZSIsIm1hdGNoIiwicmVtb3ZlUHJvdG9jb2wiLCJwcmVmaXgiLCJzcGxpdCIsInN1ZmZpeCIsInJlcGxhY2UiXSwic291cmNlUm9vdCI6IiJ9
2088//# sourceURL=webpack-internal:///./src/scripts/lib/images.js
2089
2090}`)},"./src/scripts/lib/keen-slider.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
2091/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2092/* harmony export */   addClasses: () => (/* binding */ addClasses),
2093/* harmony export */   initArrows: () => (/* binding */ initArrows),
2094/* harmony export */   initDots: () => (/* binding */ initDots),
2095/* harmony export */   initSliderWrapper: () => (/* binding */ initSliderWrapper),
2096/* harmony export */   updateArrows: () => (/* binding */ updateArrows),
2097/* harmony export */   updateDots: () => (/* binding */ updateDots)
2098/* harmony export */ });
2099function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
2100function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
2101function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
2102function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
2103function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
2104function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
2105/*******************************************************************************************************************************************/
2106/* Prepare Slides
2107/*******************************************************************************************************************************************/
2108function addClasses(sliderElement) {
2109  sliderElement.classList.add('keen-slider');
2110  var slides = _toConsumableArray(sliderElement.children);
2111  slides.forEach(function (slide) {
2112    return slide.classList.add('keen-slider__slide');
2113  });
2114}
2115
2116/*******************************************************************************************************************************************/
2117/* Init Slider Wrapper
2118/*******************************************************************************************************************************************/
2119function initSliderWrapper(wrapper) {
2120  var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'is-initialized';
2121  wrapper.classList.add(className);
2122}
2123
2124/*******************************************************************************************************************************************/
2125/* Arrows
2126/*******************************************************************************************************************************************/
2127function initArrows(sliderInstance, prev, next) {
2128  prev.addEventListener('click', function () {
2129    sliderInstance.prev();
2130  });
2131  next.addEventListener('click', function () {
2132    sliderInstance.next();
2133  });
2134}
2135function updateArrows(sliderInstance, prev, next) {
2136  var disabledClass = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'is-disabled';
2137  var _sliderInstance$detai = sliderInstance.details(),
2138    relativeSlide = _sliderInstance$detai.relativeSlide,
2139    size = _sliderInstance$detai.size,
2140    slidesPerView = _sliderInstance$detai.slidesPerView;
2141  relativeSlide === 0 ? prev.classList.add(disabledClass) : prev.classList.remove(disabledClass);
2142  relativeSlide >= Math.ceil(size - slidesPerView) ? next.classList.add(disabledClass) : next.classList.remove(disabledClass);
2143}
2144
2145/*******************************************************************************************************************************************/
2146/* Dots
2147/*******************************************************************************************************************************************/
2148function initDots(sliderInstance, sliderElement, dotsWrapper) {
2149  var dotClass = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'dot';
2150  var slides = _toConsumableArray(sliderElement.children);
2151  slides.forEach(function (slide, i) {
2152    var dot = document.createElement('button');
2153    dot.type = 'button';
2154    dot.classList.add(dotClass);
2155    dotsWrapper.appendChild(dot);
2156    dot.addEventListener('click', function () {
2157      sliderInstance.moveToSlide(i);
2158    });
2159  });
2160}
2161function updateDots(sliderInstance, dotsWrapper) {
2162  var activeClass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'is-active';
2163  var _sliderInstance$detai2 = sliderInstance.details(),
2164    relativeSlide = _sliderInstance$detai2.relativeSlide;
2165  var dots = _toConsumableArray(dotsWrapper.children);
2166  dots.forEach(function (dot, i) {
2167    i === relativeSlide ? dot.classList.add(activeClass) : dot.classList.remove(activeClass);
2168  });
2169}//# sourceURL=[module]
2170//# sourceMappingURL=data:application/json;charset=utf-8;base64,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sR0FBRyxDQUFDNkIsUUFBUSxDQUFDO0lBQzNCRCxXQUFXLENBQUNPLFdBQVcsQ0FBQ0osR0FBRyxDQUFDO0lBQzVCQSxHQUFHLENBQUNmLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFNO01BQUVILGNBQWMsQ0FBQ3VCLFdBQVcsQ0FBQ04sQ0FBQyxDQUFDO0lBQUMsQ0FBQyxDQUFDO0VBQzFFLENBQUMsQ0FBQztBQUNOO0FBRU8sU0FBU08sVUFBVUEsQ0FBQ3hCLGNBQWMsRUFBRWUsV0FBVyxFQUE2QjtFQUFBLElBQTNCVSxXQUFXLEdBQUE3QixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxXQUFXO0VBQzdFLElBQUE4QixzQkFBQSxHQUEwQjFCLGNBQWMsQ0FBQ08sT0FBTyxDQUFDLENBQUM7SUFBMUNDLGFBQWEsR0FBQWtCLHNCQUFBLENBQWJsQixhQUFhO0VBQ3JCLElBQU1tQixJQUFJLEdBQUF0QyxrQkFBQSxDQUFPMEIsV0FBVyxDQUFDekIsUUFBUSxDQUFDO0VBQ3RDcUMsSUFBSSxDQUFDcEMsT0FBTyxDQUFDLFVBQUMyQixHQUFHLEVBQUVELENBQUMsRUFBSztJQUNyQkEsQ0FBQyxLQUFLVCxhQUFhLEdBQ2pCVSxHQUFHLENBQUNoQyxTQUFTLENBQUNDLEdBQUcsQ0FBQ3NDLFdBQVcsQ0FBQyxHQUM5QlAsR0FBRyxDQUFDaEMsU0FBUyxDQUFDeUIsTUFBTSxDQUFDYyxXQUFXLENBQUM7RUFDdkMsQ0FBQyxDQUFDO0FBQ04iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9saWIva2Vlbi1zbGlkZXIuanM/MjAwYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIFByZXBhcmUgU2xpZGVzXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRDbGFzc2VzKHNsaWRlckVsZW1lbnQpIHtcbiAgICBzbGlkZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2tlZW4tc2xpZGVyJylcblxuICAgIGNvbnN0IHNsaWRlcyA9IFsuLi5zbGlkZXJFbGVtZW50LmNoaWxkcmVuXVxuICAgIHNsaWRlcy5mb3JFYWNoKHNsaWRlID0+IHNsaWRlLmNsYXNzTGlzdC5hZGQoJ2tlZW4tc2xpZGVyX19zbGlkZScpKVxufVxuXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogSW5pdCBTbGlkZXIgV3JhcHBlclxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFNsaWRlcldyYXBwZXIod3JhcHBlciwgY2xhc3NOYW1lID0gJ2lzLWluaXRpYWxpemVkJykge1xuICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBBcnJvd3Ncbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRBcnJvd3Moc2xpZGVySW5zdGFuY2UsIHByZXYsIG5leHQpIHtcbiAgICBwcmV2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyBzbGlkZXJJbnN0YW5jZS5wcmV2KCkgfSlcbiAgICBuZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyBzbGlkZXJJbnN0YW5jZS5uZXh0KCkgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFycm93cyhzbGlkZXJJbnN0YW5jZSwgcHJldiwgbmV4dCwgZGlzYWJsZWRDbGFzcyA9ICdpcy1kaXNhYmxlZCcpIHtcbiAgICBjb25zdCB7IHJlbGF0aXZlU2xpZGUsIHNpemUsIHNsaWRlc1BlclZpZXcgfSA9IHNsaWRlckluc3RhbmNlLmRldGFpbHMoKVxuXG4gICAgcmVsYXRpdmVTbGlkZSA9PT0gMFxuICAgID8gcHJldi5jbGFzc0xpc3QuYWRkKGRpc2FibGVkQ2xhc3MpXG4gICAgOiBwcmV2LmNsYXNzTGlzdC5yZW1vdmUoZGlzYWJsZWRDbGFzcylcbiAgICBcbiAgICByZWxhdGl2ZVNsaWRlID49IE1hdGguY2VpbChzaXplIC0gc2xpZGVzUGVyVmlldylcbiAgICA/IG5leHQuY2xhc3NMaXN0LmFkZChkaXNhYmxlZENsYXNzKVxuICAgIDogbm
2170V4dC5jbGFzc0xpc3QucmVtb3ZlKGRpc2FibGVkQ2xhc3MpXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBEb3RzXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RG90cyhzbGlkZXJJbnN0YW5jZSwgc2xpZGVyRWxlbWVudCwgZG90c1dyYXBwZXIsIGRvdENsYXNzID0gJ2RvdCcpIHtcbiAgICBjb25zdCBzbGlkZXMgPSBbLi4uc2xpZGVyRWxlbWVudC5jaGlsZHJlbl1cbiAgICBzbGlkZXMuZm9yRWFjaCgoc2xpZGUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJylcbiAgICAgICAgZG90LnR5cGUgPSAnYnV0dG9uJ1xuICAgICAgICBkb3QuY2xhc3NMaXN0LmFkZChkb3RDbGFzcylcbiAgICAgICAgZG90c1dyYXBwZXIuYXBwZW5kQ2hpbGQoZG90KVxuICAgICAgICBkb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHNsaWRlckluc3RhbmNlLm1vdmVUb1NsaWRlKGkpIH0pXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURvdHMoc2xpZGVySW5zdGFuY2UsIGRvdHNXcmFwcGVyLCBhY3RpdmVDbGFzcyA9ICdpcy1hY3RpdmUnKSB7XG4gICAgY29uc3QgeyByZWxhdGl2ZVNsaWRlIH0gPSBzbGlkZXJJbnN0YW5jZS5kZXRhaWxzKClcbiAgICBjb25zdCBkb3RzID0gWy4uLmRvdHNXcmFwcGVyLmNoaWxkcmVuXVxuICAgIGRvdHMuZm9yRWFjaCgoZG90LCBpKSA9PiB7XG4gICAgICAgIGkgPT09IHJlbGF0aXZlU2xpZGVcbiAgICAgICAgPyBkb3QuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcylcbiAgICAgICAgOiBkb3QuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzcylcbiAgICB9KVxufSJdLCJuYW1lcyI6WyJhZGRDbGFzc2VzIiwic2xpZGVyRWxlbWVudCIsImNsYXNzTGlzdCIsImFkZCIsInNsaWRlcyIsIl90b0NvbnN1bWFibGVBcnJheSIsImNoaWxkcmVuIiwiZm9yRWFjaCIsInNsaWRlIiwiaW5pdFNsaWRlcldyYXBwZXIiLCJ3cmFwcGVyIiwiY2xhc3NOYW1lIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiaW5pdEFycm93cyIsInNsaWRlckluc3RhbmNlIiwicHJldiIsIm5leHQiLCJhZGRFdmVudExpc3RlbmVyIiwidXBkYXRlQXJyb3dzIiwiZGlzYWJsZWRDbGFzcyIsIl9zbGlkZXJJbnN0YW5jZSRkZXRhaSIsImRldGFpbHMiLCJyZWxhdGl2ZVNsaWRlIiwic2l6ZSIsInNsaWRlc1BlclZpZXciLCJyZW1vdmUiLCJNYXRoIiwiY2VpbCIsImluaXREb3RzIiwiZG90c1dyYXBwZXIiLCJkb3RDbGFzcyIsImkiLCJkb3QiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ0eXBlIiwiYXBwZW5kQ2hpbGQiLCJtb3ZlVG9TbGlkZSIsInVwZGF0ZURvdHMiLCJhY3RpdmVDbGFzcyIsIl9zbGlkZXJJbnN0YW5jZSRkZXRhaTIiLCJkb3RzIl0sInNvdXJjZVJvb3QiOiIifQ==
2171//# sourceURL=webpack-internal:///./src/scripts/lib/keen-slider.js
2172
2173}`)},"./src/scripts/lib/load-script.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
2174/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2175/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2176/* harmony export */ });
2177function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2178function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
2179function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
2180function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
2181function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
2182function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
2183var queue = {};
2184var loaded = {};
2185/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function (source, attributes) {
2186  return new Promise(function (resolve, reject) {
2187    var isLoaded = Object.prototype.hasOwnProperty.call(loaded, source);
2188    var isQueued = Object.prototype.hasOwnProperty.call(queue, source);
2189    if (isLoaded) {
2190      resolve(loaded[source]);
2191      return;
2192    }
2193    if (isQueued) {
2194      queue[source].addEventListener('load', function (event) {
2195        resolve(event.target);
2196      }, {
2197        once: true
2198      });
2199      return;
2200    }
2201    var script = document.createElement('script');
2202    script.src = source;
2203    script.async = true;
2204    if (attributes) {
2205      Object.entries(attributes).forEach(function (property) {
2206        var _property = _slicedToArray(property, 2),
2207          attribute = _property[0],
2208          value = _property[1];
2209        script.setAttribute(attribute, value);
2210      });
2211    }
2212    script.onload = function () {
2213      resolve(script);
2214      loaded[source] = script;
2215      delete queue[source];
2216    };
2217    script.onerror = function (event) {
2218      reject(event);
2219      delete queue[source];
2220    };
2221    queue[source] = script;
2222    document.head.appendChild(script);
2223  });
2224});
2225(Object.getOwnPropertyDescriptor(__WEBPACK_DEFAULT_EXPORT__, "name") || {}).writable || Object.defineProperty(__WEBPACK_DEFAULT_EXPORT__, "name", { value: "default", configurable: true });//# sourceURL=[module]
2226//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvbG9hZC1zY3JpcHQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLElBQU1BLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBTUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUVqQixpRUFBZSxVQUFDQyxNQUFNLEVBQUVDLFVBQVU7RUFBQSxPQUNoQyxJQUFJQyxPQUFPLENBQUMsVUFBQ0MsT0FBTyxFQUFFQyxNQUFNLEVBQUs7SUFDL0IsSUFBTUMsUUFBUSxHQUFHQyxNQUFNLENBQUNDLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNWLE1BQU0sRUFBRUMsTUFBTSxDQUFDO0lBQ3JFLElBQU1VLFFBQVEsR0FBR0osTUFBTSxDQUFDQyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDWCxLQUFLLEVBQUVFLE1BQU0sQ0FBQztJQUVwRSxJQUFJSyxRQUFRLEVBQUU7TUFDWkYsT0FBTyxDQUFDSixNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDO01BRXZCO0lBQ0Y7SUFFQSxJQUFJVSxRQUFRLEVBQUU7TUFDWlosS0FBSyxDQUFDRSxNQUFNLENBQUMsQ0FBQ1csZ0JBQWdCLENBQzVCLE1BQU0sRUFDTixVQUFDQyxLQUFLLEVBQUs7UUFDVFQsT0FBTyxDQUFDUyxLQUFLLENBQUNDLE1BQU0sQ0FBQztNQUN2QixDQUFDLEVBQ0Q7UUFBRUMsSUFBSSxFQUFFO01BQUssQ0FDZixDQUFDO01BRUQ7SUFDRjtJQUVBLElBQU1DLE1BQU0sR0FBR0MsUUFBUSxDQUFDQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQy9DRixNQUFNLENBQUNHLEdBQUcsR0FBR2xCLE1BQU07SUFDbkJlLE1BQU0sQ0FBQ0ksS0FBSyxHQUFHLElBQUk7SUFFbkIsSUFBSWxCLFVBQVUsRUFBRTtNQUNkSyxNQUFNLENBQUNjLE9BQU8sQ0FBQ25CLFVBQVUsQ0FBQyxDQUFDb0IsT0FBTyxDQUFDLFVBQUNDLFFBQVEsRUFBSztRQUMvQyxJQUFBQyxTQUFBLEdBQUFDLGNBQUEsQ0FBMkJGLFFBQVE7VUFBNUJHLFNBQVMsR0FBQUYsU0FBQTtVQUFFRyxLQUFLLEdBQUFILFNBQUE7UUFFdkJSLE1BQU0sQ0FBQ1ksWUFBWSxDQUFDRixTQUFTLEVBQUVDLEtBQUssQ0FBQztNQUN2QyxDQUFDLENBQUM7SUFDSjtJQUVBWCxNQUFNLENBQUNhLE1BQU0sR0FBRyxZQUFNO01BQ3BCekIsT0FBTyxDQUFDWSxNQUFNLENBQUM7TUFFZmhCLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLEdBQUdlLE1BQU07TUFDdkIsT0FBT2pCLEtBQUssQ0FBQ0UsTUFBTSxDQUFDO0lBQ3RCLENBQUM7SUFFRGUsTUFBTSxDQUFDYyxPQUFPLEdBQUcsVUFBQ2pCLEtBQUssRUFBSztNQUMxQlIsTUFBTSxDQUFDUSxLQUFLLENBQUM7TUFFYixPQUFPZCxLQUFLLENBQUNFLE1BQU0sQ0FBQztJQUN0QixDQUFDO0lBRURGLEtBQUssQ0FBQ0UsTUFBTSxDQUFDLEdBQUdlLE1BQU07SUFDdEJDLFFBQVEsQ0FBQ2MsSUFBSSxDQUFDQyxXQUFXLENBQUNoQixNQUFNLENBQUM7RUFDbkMsQ0FBQyxDQUFDO0FBQUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2xpYi9sb2FkLXNjcmlwdC5qcz9iZDJiIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHF1ZXVlID0ge307XG5jb25zdCBsb2FkZWQgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgKHNvdXJjZSwgYXR0cmlidXRlcykgPT5cbiAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGlzTG9hZGVkID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvYWRlZCwgc291cmNlKTtcbiAgICBjb25zdCBpc1F1ZXVlZCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChxdW
2226V1ZSwgc291cmNlKTtcblxuICAgIGlmIChpc0xvYWRlZCkge1xuICAgICAgcmVzb2x2ZShsb2FkZWRbc291cmNlXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNRdWV1ZWQpIHtcbiAgICAgIHF1ZXVlW3NvdXJjZV0uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2xvYWQnLFxuICAgICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNyYyA9IHNvdXJjZTtcbiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuXG4gICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIGNvbnN0IFthdHRyaWJ1dGUsIHZhbHVlXSA9IHByb3BlcnR5O1xuXG4gICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgcmVzb2x2ZShzY3JpcHQpO1xuXG4gICAgICBsb2FkZWRbc291cmNlXSA9IHNjcmlwdDtcbiAgICAgIGRlbGV0ZSBxdWV1ZVtzb3VyY2VdO1xuICAgIH07XG5cbiAgICBzY3JpcHQub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgcmVqZWN0KGV2ZW50KTtcblxuICAgICAgZGVsZXRlIHF1ZXVlW3NvdXJjZV07XG4gICAgfTtcblxuICAgIHF1ZXVlW3NvdXJjZV0gPSBzY3JpcHQ7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICB9KTtcbiJdLCJuYW1lcyI6WyJxdWV1ZSIsImxvYWRlZCIsInNvdXJjZSIsImF0dHJpYnV0ZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImlzTG9hZGVkIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaXNRdWV1ZWQiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJ0YXJnZXQiLCJvbmNlIiwic2NyaXB0IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic3JjIiwiYXN5bmMiLCJlbnRyaWVzIiwiZm9yRWFjaCIsInByb3BlcnR5IiwiX3Byb3BlcnR5IiwiX3NsaWNlZFRvQXJyYXkiLCJhdHRyaWJ1dGUiLCJ2YWx1ZSIsInNldEF0dHJpYnV0ZSIsIm9ubG9hZCIsIm9uZXJyb3IiLCJoZWFkIiwiYXBwZW5kQ2hpbGQiXSwic291cmNlUm9vdCI6IiJ9
2227//# sourceURL=webpack-internal:///./src/scripts/lib/load-script.js
2228
2229}`)},"./src/scripts/lib/product-card.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
2230/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2231/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__),
2232/* harmony export */   getBadges: () => (/* binding */ getBadges),
2233/* harmony export */   getCheapestVariant: () => (/* binding */ getCheapestVariant),
2234/* harmony export */   variantHasSaving: () => (/* binding */ variantHasSaving)
2235/* harmony export */ });
2236/* harmony import */ var _lib_images_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/images.js */ "./src/scripts/lib/images.js");
2237/* harmony import */ var _lib_currency_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/currency.js */ "./src/scripts/lib/currency.js");
2238function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
2239function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
2240function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
2241function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
2242function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
2243function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
2244
2245
2246var getCheapestVariant = function getCheapestVariant(product) {
2247  return product.variants.sort(function (_ref, _ref2) {
2248    var a = _ref.price;
2249    var b = _ref2.price;
2250    if (parseInt(a) < parseInt(b)) return -1;else if (parseInt(a) > parseInt(b)) return 1;
2251    return 0;
2252  })[0];
2253};
2254var variantHasSaving = function variantHasSaving(variant) {
2255  return variant.compare_at_price && parseInt(variant.compare_at_price) > parseInt(variant.price);
2256};
2257var getSaveBadgeHtml = function getSaveBadgeHtml(product) {
2258  var html = '';
2259  var variantsWithSaving = product.variants.filter(function (variant) {
2260    return variantHasSaving(variant);
2261  });
2262  var savePercentages = variantsWithSaving.map(function (variant) {
2263    var saving = parseInt(variant.compare_at_price) - parseInt(variant.price);
2264    var percentage = Math.round(saving / parseInt(variant.compare_at_price) * 100);
2265    return percentage;
2266  });
2267  if (savePercentages.length) {
2268    var sameForAll = savePercentages.length == product.variants.length;
2269    html = window.theme.product.badges[savePercentages.length > 1 || savePercentages.length && !sameForAll ? 'saveupto' : 'save'].replace('%percentage%', Math.max.apply(Math, _toConsumableArray(savePercentages)));
2270  }
2271  return html;
2272};
2273var getBadges = function getBadges(product) {
2274  // manual badges
2275  var TOP_VALUES = [].concat(_toConsumableArray(theme.product.badgeValues.top), ['preorder', 'sold-out']);
2276  var BOTTOM_LEFT_VALUES = theme.product.badgeValues.bottomLeft;
2277  var BOTTOM_RIGHT_VALUES = theme.product.badgeValues.bottomRight;
2278  var values = product.tags.filter(function (tag) {
2279    return tag.slice(0, 6) === 'badge_';
2280  }).map(function (tag) {
2281    return tag.slice(6);
2282  });
2283  if (product.tags.find(function (tag) {
2284    return tag === 'sold_out';
2285  }) || !product.variants.find(function (variant) {
2286    return variant.available;
2287  })) values.push('sold-out');
2288  if (product.tags.find(function (tag) {
2289    return tag.slice(0, 9) === 'preorder_';
2290  })) values.push('preorder');
2291  var valuesTop = values.filter(function (value) {
2292    return TOP_VALUES.includes(value);
2293  });
2294  var valuesBottomLeft = values.filter(function (value) {
2295    return BOTTOM_LEFT_VALUES.includes(value);
2296  });
2297  var valuesBottomRight = values.filter(function (value) {
2298    return BOTTOM_RIGHT_VALUES.includes(value);
2299  });
2300  var htmlTop = valuesTop.map(function (value) {
2301    return theme.product.badges[value];
2302  }).join('');
2303  var htmlBottomLeft = valuesBottomLeft.map(function (value) {
2304    return theme.product.badges[value];
2305  }).join('');
2306  var htmlBottomRight = valuesBottomRight.map(function (value) {
2307    return theme.product.badges[value];
2308  }).join('');
2309
2310  // price related badges
2311  htmlTop += getSaveBadgeHtml(product);
2312  return "<div class=\\"product-card__badges\\">\\n    <div class=\\"product-card__badges__top\\">\\n      <div class=\\"product-card__badges__list\\">".concat(htmlTop, "</div>\\n    </div>\\n    \\n    <div class=\\"product-card__badges__bottom\\">\\n      <div class=\\"product-card__badges__list product-card__badges__list--column\\">").concat(htmlBottomLeft, "</div>\\n      <div class=\\"product-card__badges__list\\">").concat(htmlBottomRight, "</div>\\n    </div>\\n  </div>");
2313};
2314/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function (product) {
2315  var classes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
2316  var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
2317    _ref3$showQuickBuy = _ref3.showQuickBuy,
2318    showQuickBuy = _ref3$showQuickBuy === void 0 ? false : _ref3$showQuickBuy;
2319  var getClasses = function getClasses() {
2320    return classes;
2321  };
2322  var getTitle = function getTitle() {
2323    return product.title;
2324  };
2325  var getImages = function getImages() {
2326    var imgPrimary = product.media[0];
2327    var imgSecondary = product.media.find(function (medium) {
2328      var _medium$alt;
2329      return ((_medium$alt = medium.alt) === null || _medium$alt === void 0 ? void 0 : _medium$alt.toLowerCase()) === 'hover_image';
2330    }) || product.media[0];
2331    var imgPrimarySrc = imgPrimary ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(imgPrimary.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(imgPrimary.src)), ''), '720x') : '';
2332    var imgSecondarySrc = imgSecondary ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(imgSecondary.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(imgSecondary.src)), ''), '720x') : '';
2333    var imgPrimaryLazySrc = imgPrimary ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(imgPrimary.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(imgPrimary.src)), ''), '1x') : '';
2334    var imgSecondaryLazySrc = imgSecondary ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(imgSecondary.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(imgSecondary.src)), ''), '1x') : '';
2335    return "<img src=\\"".concat(imgPrimaryLazySrc, "\\" data-src=\\"").concat(imgPrimarySrc, "\\" class=\\"product-card__image product-card__image--primary lazyload\\" alt=\\"Hairlust - ").concat(getTitle(), "\\">\\n    <img src=\\"").concat(imgSecondaryLazySrc, "\\" data-src=\\"").concat(imgSecondarySrc, "\\" class=\\"product-card__image product-card__image--secondary lazyload\\" alt=\\"Hairlust - ").concat(getTitle(), "\\"></img>");
2336  };
2337  var getPrices = function getPrices() {
2338    var cheapestVariant = getCheapestVariant(product);
2339    var compareAtPrice = cheapestVariant.compare_at_price && parseInt(cheapestVariant.compare_at_price) > parseInt(cheapestVariant.price) ? (0,_lib_currency_js__WEBPACK_IMPORTED_MODULE_1__.formatMoney)(cheapestVariant.compare_at_price) : null;
2340    return "<p class=\\"price price--compare js-comparePrice\\">".concat(compareAtPrice || '', "</p>\\n    <p class=\\"price price--current js-currentPrice\\">").concat((0,_lib_currency_js__WEBPACK_IMPORTED_MODULE_1__.formatMoney)(product.price), "</p>");
2341  };
2342  var getUrl = function getUrl() {
2343    return product.url;
2344  };
2345  var getDescription = function getDescription() {
2346    var _product$description;
2347    return ((_product$description = product.description) === null || _product$description === void 0 || (_product$description = _product$description.split('[description_mini_start]').filter(function (element) {
2348      return element;
2349    })[0]) === null || _product$description === void 0 || (_product$description = _product$description.split('[description_mini_end]').filter(function (element) {
2350      return element;
2351    })[0]) === null || _product$description === void 0 ? void 0 : _product$description.replace(/<p>/, '').replace(/<\\/p>/, '')) || '';
2352  };
2353  var getLinkedProducts = function getLinkedProducts() {
2354    var _product$linked;
2355    // Bail if no linked products
2356    if (!(product !== null && product !== void 0 && (_product$linked = product.linked) !== null && _product$linked !== void 0 && _product$linked.length)) return '';
2357
2358    // Bail if hidden
2359    if (product.meta.hide_thumbnails) return '';
2360    var maxLimit = 5;
2361    var orgLength = product.linked.length;
2362    var sortProducts = function sortProducts(products, handle) {
2363      var product = products.find(function (item) {
2364        return item.handle === handle;
2365      });
2366      if (product) {
2367        products.splice(products.indexOf(product), 1);
2368        products.unshift(product);
2369      }
2370      return products;
2371    };
2372    var itemsMarkup = function itemsMarkup() {
2373      var html = '';
2374      var linkedProducts = sortProducts(product.linked, product.handle).slice(0, maxLimit);
2375      var plusCounter = function plusCounter() {
2376        return "<span class=\\"product-card__linked-item-extra\\">&plus;".concat(orgLength - maxLimit, "</span>");
2377      };
2378      linkedProducts.forEach(function (item, index) {
2379        var lazySrc = 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==';
2380        var img = item.img ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(item.img.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(item.img.src)), ''), '300x') : '';
2381        var classNames = '';
2382        if (item.handle === product.handle) classNames += ' is-current';
2383        if (index + 1 === maxLimit) classNames += ' has-overlay';
2384        html += "\\n          <a href=\\"".concat(item.url, "\\" class=\\"product-card__linked-item ").concat(classNames, "\\">\\n            <div class=\\"image-wrapper\\">\\n              <img src=\\"").concat(lazySrc, "\\" data-src=\\"").concat(img, "\\" class=\\"lazyload\\" alt=\\"").concat(getTitle(), "\\">\\n            </div>\\n\\n            ").concat(index + 1 === maxLimit ? plusCounter() : '', "\\n          </a>\\n        ");
2385      });
2386      return html;
2387    };
2388    return itemsMarkup();
2389  };
2390  var getQuickBuyButton = function getQuickBuyButton(placement) {
2391    if (!showQuickBuy) return '';
2392    var variant = product.variants.find(function (v) {
2393      return v.available;
2394    });
2395    if (!variant) return '';
2396    var template = placement === 'overlay' ? theme.product.quickBuyButtonOverlayTemplate : theme.product.quickBuyButtonInlineTemplate;
2397    return template.replace('%variantId%', variant.id);
2398  };
2399  return theme.product.productCardTemplate.replace('%classes%', getClasses()).replace('%images%', getImages()).replace('%badges%', getBadges(product)).replace('%prices%', getPrices()).replace(/%productTitle%/g, getTitle()).replace('%productDescription%', getDescription()).replace(/%productUrl%/g, getUrl()).replace('%linkedProducts%', getLinkedProducts()).replace('%quickBuyButtonOverlay%', getQuickBuyButton('overlay')).replace('%quickBuyButtonInline%', getQuickBuyButton('inline'));
2400});
2401(Object.getOwnPropertyDescriptor(__WEBPACK_DEFAULT_EXPORT__, "name") || {}).writable || Object.defineProperty(__WEBPACK_DEFAULT_EXPORT__, "name", { value: "default", configurable: true });
2402//# sourceURL=[module]
2403//# sourceMappingURL=data:application/json;charset=utf-8;base64,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BQyxDQUN2QzJCLE9BQU8sQ0FBQyxVQUFVLEVBQUVtRCxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2hDbkQsT0FBTyxDQUFDLGlCQUFpQixFQUFFb0MsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUN0Q3BDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRXdELGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FDakR4RCxPQUFPLENBQUMsZUFBZSxFQUFFc0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUNsQ3RELE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTZELGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUNoRDdELE9BQU8sQ0FBQyx5QkFBeUIsRUFBRW1GLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ2hFbkYsT0FBTyxDQUFDLHdCQUF3QixFQUFFbUYsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL3Byb2R1Y3QtY2FyZC5qcz84MTg2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFNpemVkSW1hZ2VVcmwsIGltYWdlU2l6ZSB9IGZyb20gJ0AvbGliL2ltYWdlcy5qcyc7XG5pbXBvcnQgeyBmb3JtYXRNb25leSB9IGZyb20gJ0AvbGliL2N1cnJlbmN5LmpzJztcblxuY29uc3QgZ2V0Q2hlYXBlc3RWYXJpYW50ID0gKHByb2R1Y3QpID0+IHtcbiAgcmV0dXJuIHByb2R1Y3QudmFyaWFudHMuc29ydCgoeyBwcmljZTogYSB9LCB7IHByaWNlOiBifSkgPT4ge1xuICAgIGlmIChwYXJzZUludChhKSA8IHBhcnNlSW50KGIpKSByZXR1cm4gLTE7XG4gICAgZWxzZSBpZiAocGFyc2VJbnQoYSkgPiBwYXJzZUludChiKSkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIDA7XG4gIH0pWzBdO1xufTtcblxuY29uc3QgdmFyaWFudEhhc1NhdmluZyA9ICh2YXJpYW50KSA9PiB7XG4gIHJldHVybiB2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UgJiYgKHBhcnNlSW50KHZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSkgPiBwYXJzZUludCh2YXJpYW50LnByaWNlKSk7XG59O1xuXG5jb25zdCBnZXRTYXZlQmFkZ2VIdG1sID0gKHByb2R1Y3QpID0+IHtcbiAgbGV0IGh0bWwgPSAnJztcblxuICBjb25zdCB2YXJpYW50c1dpdGhTYXZpbmcgPSBwcm9kdWN0LnZhcmlhbnRzLmZpbHRlcigodmFyaWFudCkgPT4gKFxuICAgIHZhcmlhbnRIYXNTYXZpbmcodmFyaWFudClcbiAgKSk7XG5cbiAgY29uc3Qgc2F2ZVBlcmNlbnRhZ2VzID0gdmFyaWFudHNXaXRoU2F2aW5nLm1hcCgodmFyaWFudCkgPT4ge1xuICAgIGNvbnN0IHNhdmluZyA9IHBhcnNlSW50KHZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSkgLSBwYXJzZUludCh2YXJpYW50LnByaWNlKTtcbiAgICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5yb3VuZChzYXZpbmcgLyBwYXJzZUludCh2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UpICogMTAwKTtcblxuICAgIHJldHVybiBwZXJjZW50YWdlO1xuICB9KTtcblxuICBpZiAoc2F2ZVBlcmNlbnRhZ2VzLmxlbmd0aCkge1xuICAgIGNvbnN0IHNhbWVGb3JBbGwgPSBzYXZlUGVyY2VudGFnZXMubGVuZ3RoID09IHByb2R1Y3QudmFyaWFudHMubGVuZ3RoO1xuXG4gICAgaH
2403RtbCA9IHdpbmRvdy50aGVtZS5wcm9kdWN0LmJhZGdlc1tcbiAgICAgIChzYXZlUGVyY2VudGFnZXMubGVuZ3RoID4gMSkgfHwgKHNhdmVQZXJjZW50YWdlcy5sZW5ndGggJiYgIXNhbWVGb3JBbGwpXG4gICAgICAgID8gJ3NhdmV1cHRvJ1xuICAgICAgICA6ICdzYXZlJ1xuICAgICAgXS5yZXBsYWNlKCclcGVyY2VudGFnZSUnLCBNYXRoLm1heCguLi5zYXZlUGVyY2VudGFnZXMpKTtcbiAgfVxuXG4gIHJldHVybiBodG1sO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJhZGdlcyA9IChwcm9kdWN0KSA9PiB7XG4gIC8vIG1hbnVhbCBiYWRnZXNcbiAgY29uc3QgVE9QX1ZBTFVFUyA9IFsuLi50aGVtZS5wcm9kdWN0LmJhZGdlVmFsdWVzLnRvcCwgJ3ByZW9yZGVyJywgJ3NvbGQtb3V0J107XG4gIGNvbnN0IEJPVFRPTV9MRUZUX1ZBTFVFUyA9IHRoZW1lLnByb2R1Y3QuYmFkZ2VWYWx1ZXMuYm90dG9tTGVmdDtcbiAgY29uc3QgQk9UVE9NX1JJR0hUX1ZBTFVFUyA9IHRoZW1lLnByb2R1Y3QuYmFkZ2VWYWx1ZXMuYm90dG9tUmlnaHQ7XG5cbiAgY29uc3QgdmFsdWVzID0gcHJvZHVjdC50YWdzLmZpbHRlcigodGFnKSA9PiB0YWcuc2xpY2UoMCwgNikgPT09ICdiYWRnZV8nKS5tYXAoKHRhZykgPT4gdGFnLnNsaWNlKDYpKTtcbiAgaWYgKHByb2R1Y3QudGFncy5maW5kKCh0YWcpID0+IHRhZyA9PT0gJ3NvbGRfb3V0JykgfHwgIXByb2R1Y3QudmFyaWFudHMuZmluZCgodmFyaWFudCkgPT4gdmFyaWFudC5hdmFpbGFibGUpKSB2YWx1ZXMucHVzaCgnc29sZC1vdXQnKTtcbiAgaWYgKHByb2R1Y3QudGFncy5maW5kKCh0YWcpID0+IHRhZy5zbGljZSgwLCA5KSA9PT0gJ3ByZW9yZGVyXycpKSB2YWx1ZXMucHVzaCgncHJlb3JkZXInKTtcblxuICBjb25zdCB2YWx1ZXNUb3AgPSB2YWx1ZXMuZmlsdGVyKCh2YWx1ZSkgPT4gVE9QX1ZBTFVFUy5pbmNsdWRlcyh2YWx1ZSkpO1xuICBjb25zdCB2YWx1ZXNCb3R0b21MZWZ0ID0gdmFsdWVzLmZpbHRlcigodmFsdWUpID0+IEJPVFRPTV9MRUZUX1ZBTFVFUy5pbmNsdWRlcyh2YWx1ZSkpO1xuICBjb25zdCB2YWx1ZXNCb3R0b21SaWdodCA9IHZhbHVlcy5maWx0ZXIoKHZhbHVlKSA9PiBCT1RUT01fUklHSFRfVkFMVUVTLmluY2x1ZGVzKHZhbHVlKSk7XG5cbiAgbGV0IGh0bWxUb3AgPSB2YWx1ZXNUb3AubWFwKCh2YWx1ZSkgPT4gdGhlbWUucHJvZHVjdC5iYWRnZXNbdmFsdWVdKS5qb2luKCcnKTtcbiAgY29uc3QgaHRtbEJvdHRvbUxlZnQgPSB2YWx1ZXNCb3R0b21MZWZ0Lm1hcCgodmFsdWUpID0+IHRoZW1lLnByb2R1Y3QuYmFkZ2VzW3ZhbHVlXSkuam9pbignJyk7XG4gIGNvbnN0IGh0bWxCb3R0b21SaWdodCA9IHZhbHVlc0JvdHRvbVJpZ2h0Lm1hcCgodmFsdWUpID0+IHRoZW1lLnByb2R1Y3QuYmFkZ2VzW3ZhbHVlXSkuam9pbignJyk7XG5cbiAgLy8gcHJpY2UgcmVsYXRlZCBiYWRnZXNcbiAgaHRtbFRvcCArPSBnZXRTYXZlQmFkZ2VIdG1sKHByb2R1Y3QpO1xuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fYmFkZ2VzXCI+XG4gICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fYmFkZ2VzX190b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmRfX2JhZGdlc19fbGlzdFwiPiR7aHRtbFRvcH08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkX19iYWRnZXNfX2JvdHRvbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fYmFkZ2VzX19saXN0IHByb2R1Y3QtY2FyZF9fYmFkZ2VzX19saXN0LS1jb2x1bW5cIj4ke2h0bWxCb3R0b21MZWZ0fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fYmFkZ2VzX19saXN0XCI+JHtodG1sQm90dG9tUmlnaHR9PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCAocHJvZHVjdCwgY2xhc3NlcyA9ICcnLCB7IHNob3dRdWlja0J1eSA9IGZhbHNlIH0gPSB7fSkgPT4ge1xuICBjb25zdCBnZXRDbGFzc2VzID0gKCkgPT4ge1xuICAgIHJldHVybiBjbGFzc2VzO1xuICB9O1xuXG4gIGNvbnN0IGdldFRpdGxlID0gKCkgPT4ge1xuICAgIHJldHVybiBwcm9kdWN0LnRpdGxlO1xuICB9O1xuXG4gIGNvbnN0IGdldEltYWdlcyA9ICgpID0+IHtcbiAgICBjb25zdCBpbWdQcmltYXJ5ID0gcHJvZHVjdC5tZWRpYVswXTtcbiAgICBjb25zdCBpbWdTZWNvbmRhcnkgPSBwcm9kdWN0Lm1lZGlhLmZpbmQoKG1lZGl1bSkgPT4gbWVkaXVtLmFsdD8udG9Mb3dlckNhc2UoKSA9PT0gJ2hvdmVyX2ltYWdlJykgfHwgcHJvZHVjdC5tZWRpYVswXTtcblxuICAgIGNvbnN0IGltZ1ByaW1hcnlTcmMgPSBpbWdQcmltYXJ5ID8gZ2V0U2l6ZWRJbWFnZVVybChpbWdQcmltYXJ5LnNyYy5yZXBsYWNlKGBfJHtpbWFnZVNpemUoaW1nUHJpbWFyeS5zcmMpfWAsICcnKSwgJzcyMHgnKSA6ICcnO1xuICAgIGNvbnN0IGltZ1NlY29uZGFyeVNyYyA9IGltZ1NlY29uZGFyeSA/IGdldFNpemVkSW1hZ2VVcmwoaW1nU2Vjb25kYXJ5LnNyYy5yZXBsYWNlKGBfJHtpbWFnZVNpemUoaW1nU2Vjb25kYXJ5LnNyYyl9YCwgJycpLCAnNzIweCcpIDogJyc7XG5cbiAgICBjb25zdCBpbWdQcmltYXJ5TGF6eVNyYyA9IGltZ1ByaW1hcnkgPyBnZXRTaXplZEltYWdlVXJsKGltZ1ByaW1hcnkuc3JjLnJlcGxhY2UoYF8ke2ltYWdlU2l6ZShpbWdQcmltYXJ5LnNyYyl9YCwgJycpLCAnMXgnKSA6ICcnO1xuICAgIGNvbnN0IGltZ1NlY29uZGFyeUxhenlTcmMgPSBpbWdTZWNvbmRhcnkgPyBnZXRTaXplZEltYWdlVXJsKGltZ1NlY29uZGFyeS5zcmMucmVwbGFjZShgXyR7aW1hZ2VTaXplKGltZ1NlY29uZGFyeS5zcmMpfWAsICcnKSwgJzF4JykgOiAnJztcblxuICAgIHJldHVybiBgPGltZyBzcmM9XCIke2ltZ1ByaW1hcnlMYXp5U3JjfVwiIGRhdGEtc3JjPVwiJHtpbWdQcmltYXJ5U3JjfVwiIGNsYXNzPVwicHJvZHVjdC1jYXJkX19pbWFnZSBwcm9kdWN0LWNhcmRfX2ltYWdlLS1wcmltYXJ5IGxhenlsb2FkXCIgYWx0PVwiSGFpcmx1c3QgLSAke2dldFRpdGxlKCl9XCI+XG4gICAgPGltZyBzcmM9XCIke2ltZ1NlY29uZGFyeUxhenlTcmN9XCIgZGF0YS1zcmM9XCIke2ltZ1NlY29uZGFyeVNyY31cIiBjbGFzcz1cInByb2R1Y3QtY2FyZF9faW1hZ2UgcHJvZHVjdC1jYXJkX19pbWFnZS0tc2Vjb25kYXJ5IGxhenlsb2FkXCIgYWx0PVwiSGFpcmx1c3QgLSAke2dldFRpdGxlKCl9XCI+PC9pbWc+YDtcbiAgfTtcblxuICBjb25zdCBnZXRQcmljZXMgPSAoKSA9PiB7XG4gICAgY29uc3QgY2hlYXBlc3RWYXJpYW50ID0gZ2V0Q2hlYXBlc3RWYXJpYW50KHByb2R1Y3QpO1xuXG4gICAgY29uc3QgY29tcGFyZUF0UHJpY2UgPSBjaGVhcGVzdFZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSAmJiAocGFyc2VJbnQoY2hlYXBlc3RWYXJpYW50LmNvbXBhcmVfYXRfcHJpY2UpID4gcGFyc2VJbnQoY2hlYXBlc3RWYXJpYW50LnByaWNlKSlcbiAgICAgPyBmb3JtYXRNb25leShjaGVhcGVzdFZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSlcbiAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIGA8cCBjbGFzcz1cInByaWNlIHByaWNlLS1jb21wYXJlIGpzLWNvbXBhcmVQcmljZVwiPiR7Y29tcGFyZUF0UHJpY2UgfHwgJyd9PC9wPlxuICAgIDxwIGNsYXNzPVwicHJpY2UgcHJpY2UtLWN1cnJlbnQganMtY3VycmVudFByaWNlXCI+JHtmb3JtYXRNb25leShwcm9kdWN0LnByaWNlKX08L3A+YDtcbiAgfTtcblxuICBjb25zdCBnZXRVcmwgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHByb2R1Y3QudXJsO1xuICB9O1xuXG4gIGNvbnN0IGdldERlc2NyaXB0aW9uID0gKCkgPT4ge1xuICAgIHJldHVybi
2403Bwcm9kdWN0LmRlc2NyaXB0aW9uPy5zcGxpdCgnW2Rlc2NyaXB0aW9uX21pbmlfc3RhcnRdJylcbiAgICAgIC5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQpWzBdXG4gICAgICA/LnNwbGl0KCdbZGVzY3JpcHRpb25fbWluaV9lbmRdJylcbiAgICAgIC5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQpWzBdXG4gICAgICA/LnJlcGxhY2UoLzxwPi8sICcnKVxuICAgICAgLnJlcGxhY2UoLzxcXC9wPi8sICcnKSB8fCAnJztcbiAgfTtcblxuICBjb25zdCBnZXRMaW5rZWRQcm9kdWN0cyA9ICgpID0+IHtcbiAgICAvLyBCYWlsIGlmIG5vIGxpbmtlZCBwcm9kdWN0c1xuICAgIGlmICghcHJvZHVjdD8ubGlua2VkPy5sZW5ndGgpIHJldHVybiAnJ1xuXG4gICAgLy8gQmFpbCBpZiBoaWRkZW5cbiAgICBpZiAocHJvZHVjdC5tZXRhLmhpZGVfdGh1bWJuYWlscykgcmV0dXJuICcnXG5cbiAgICBjb25zdCBtYXhMaW1pdCA9IDVcbiAgICBjb25zdCBvcmdMZW5ndGggPSBwcm9kdWN0LmxpbmtlZC5sZW5ndGhcblxuICAgIGNvbnN0IHNvcnRQcm9kdWN0cyA9IChwcm9kdWN0cywgaGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCBwcm9kdWN0ID0gcHJvZHVjdHMuZmluZCgoaXRlbSkgPT4gaXRlbS5oYW5kbGUgPT09IGhhbmRsZSlcblxuICAgICAgaWYgKHByb2R1Y3QpIHtcbiAgICAgICAgcHJvZHVjdHMuc3BsaWNlKHByb2R1Y3RzLmluZGV4T2YocHJvZHVjdCksIDEpXG4gICAgICAgIHByb2R1Y3RzLnVuc2hpZnQocHJvZHVjdClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb2R1Y3RzXG4gICAgfTtcblxuICAgIGNvbnN0IGl0ZW1zTWFya3VwID0gKCkgPT4ge1xuICAgICAgbGV0IGh0bWwgPSAnJ1xuXG4gICAgICBjb25zdCBsaW5rZWRQcm9kdWN0cyA9IHNvcnRQcm9kdWN0cyhwcm9kdWN0LmxpbmtlZCwgcHJvZHVjdC5oYW5kbGUpLnNsaWNlKDAsIG1heExpbWl0KVxuXG4gICAgICBjb25zdCBwbHVzQ291bnRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fbGlua2VkLWl0ZW0tZXh0cmFcIj4mcGx1czske29yZ0xlbmd0aCAtIG1heExpbWl0fTwvc3Bhbj5gXG4gICAgICB9XG5cbiAgICAgIGxpbmtlZFByb2R1Y3RzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGxhenlTcmMgPSAnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBUC8vL3dBQUFDSDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUNSQUVBT3c9PSdcbiAgICAgICAgY29uc3QgaW1nID0gaXRlbS5pbWcgPyBnZXRTaXplZEltYWdlVXJsKGl0ZW0uaW1nLnNyYy5yZXBsYWNlKGBfJHtpbWFnZVNpemUoaXRlbS5pbWcuc3JjKX1gLCAnJyksICczMDB4JykgOiAnJ1xuXG4gICAgICAgIGxldCBjbGFzc05hbWVzID0gJydcbiAgICAgICAgaWYgKGl0ZW0uaGFuZGxlID09PSBwcm9kdWN0LmhhbmRsZSkgY2xhc3NOYW1lcyArPSAnIGlzLWN1cnJlbnQnXG4gICAgICAgIGlmIChpbmRleCArIDEgPT09IG1heExpbWl0KSBjbGFzc05hbWVzICs9ICcgaGFzLW92ZXJsYXknXG5cbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGEgaHJlZj1cIiR7aXRlbS51cmx9XCIgY2xhc3M9XCJwcm9kdWN0LWNhcmRfX2xpbmtlZC1pdGVtICR7Y2xhc3NOYW1lc31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiJHtsYXp5U3JjfVwiIGRhdGEtc3JjPVwiJHtpbWd9XCIgY2xhc3M9XCJsYXp5bG9hZFwiIGFsdD1cIiR7Z2V0VGl0bGUoKX1cIj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAke2luZGV4ICsgMSA9PT0gbWF4TGltaXQgPyBwbHVzQ291bnRlcigpIDogJyd9XG4gICAgICAgICAgPC9hPlxuICAgICAgICBgXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGh0bWxcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXNNYXJrdXAoKVxuICB9XG5cbiAgY29uc3QgZ2V0UXVpY2tCdXlCdXR0b24gPSAocGxhY2VtZW50KSA9PiB7XG4gICAgaWYgKCFzaG93UXVpY2tCdXkpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHZhcmlhbnQgPSBwcm9kdWN0LnZhcmlhbnRzLmZpbmQoKHYpID0+IHYuYXZhaWxhYmxlKTtcbiAgICBpZiAoIXZhcmlhbnQpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gcGxhY2VtZW50ID09PSAnb3ZlcmxheSdcbiAgICAgID8gdGhlbWUucHJvZHVjdC5xdWlja0J1eUJ1dHRvbk92ZXJsYXlUZW1wbGF0ZVxuICAgICAgOiB0aGVtZS5wcm9kdWN0LnF1aWNrQnV5QnV0dG9uSW5saW5lVGVtcGxhdGU7XG5cbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgnJXZhcmlhbnRJZCUnLCB2YXJpYW50LmlkKTtcbiAgfTtcblxuICByZXR1cm4gdGhlbWUucHJvZHVjdC5wcm9kdWN0Q2FyZFRlbXBsYXRlXG4gICAgLnJlcGxhY2UoJyVjbGFzc2VzJScsIGdldENsYXNzZXMoKSlcbiAgICAucmVwbGFjZSgnJWltYWdlcyUnLCBnZXRJbWFnZXMoKSlcbiAgICAucmVwbGFjZSgnJWJhZGdlcyUnLCBnZXRCYWRnZXMocHJvZHVjdCkpXG4gICAgLnJlcGxhY2UoJyVwcmljZXMlJywgZ2V0UHJpY2VzKCkpXG4gICAgLnJlcGxhY2UoLyVwcm9kdWN0VGl0bGUlL2csIGdldFRpdGxlKCkpXG4gICAgLnJlcGxhY2UoJyVwcm9kdWN0RGVzY3JpcHRpb24lJywgZ2V0RGVzY3JpcHRpb24oKSlcbiAgICAucmVwbGFjZSgvJXByb2R1Y3RVcmwlL2csIGdldFVybCgpKVxuICAgIC5yZXBsYWNlKCclbGlua2VkUHJvZHVjdHMlJywgZ2V0TGlua2VkUHJvZHVjdHMoKSlcbiAgICAucmVwbGFjZSgnJXF1aWNrQnV5QnV0dG9uT3ZlcmxheSUnLCBnZXRRdWlja0J1eUJ1dHRvbignb3ZlcmxheScpKVxuICAgIC5yZXBsYWNlKCclcXVpY2tCdXlCdXR0b25JbmxpbmUlJywgZ2V0UXVpY2tCdXlCdXR0b24oJ2lubGluZScpKTtcbn07XG5cbmV4cG9ydCB7IGdldENoZWFwZXN0VmFyaWFudCwgdmFyaWFudEhhc1NhdmluZyB9O1xuIl0sIm5hbWVzIjpbImdldFNpemVkSW1hZ2VVcmwiLCJpbWFnZVNpemUiLCJmb3JtYXRNb25leSIsImdldENoZWFwZXN0VmFyaWFudCIsInByb2R1Y3QiLCJ2YXJpYW50cyIsInNvcnQiLCJfcmVmIiwiX3JlZjIiLCJhIiwicHJpY2UiLCJiIiwicGFyc2VJbnQiLCJ2YXJpYW50SGFzU2F2aW5nIiwidmFyaWFudCIsImNvbXBhcmVfYXRfcHJpY2UiLCJnZXRTYXZlQmFkZ2VIdG1sIiwiaHRtbCIsInZhcmlhbnRzV2l0aFNhdmluZyIsImZpbHRlciIsInNhdmVQZXJjZW50YWdlcyIsIm1hcCIsInNhdmluZyIsInBlcmNlbnRhZ2UiLCJNYXRoIiwicm91bmQiLCJsZW5ndGgiLCJzYW1lRm9yQWxsIiwid2luZG93IiwidGhlbWUiLCJiYWRnZXMiLCJyZXBsYWNlIiwibWF4IiwiYXBwbHkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJnZXRCYWRnZXMiLCJUT1BfVkFMVUVTIiwiY29uY2F0IiwiYmFkZ2VWYWx1ZXMiLCJ0b3AiLCJCT1RUT01fTEVGVF9WQUxVRVMiLCJib3R0b21MZWZ0IiwiQk9UVE9NX1JJR0hUX1ZBTFVFUyIsImJvdHRvbVJpZ2h0IiwidmFsdWVzIiwidGFncyIsInRhZyIsInNsaWNlIiwiZmluZCIsImF2YWlsYWJsZSIsInB1c2giLCJ2YWx1ZXNUb3AiLCJ2YWx1ZSIsImluY2x1ZGVzIiwidmFsdWVzQm90dG9tTGVmdCIsInZhbHVlc0JvdHRvbVJpZ2h0IiwiaHRtbFRvcCIsImpvaW4iLCJodG1sQm90dG9tTGVmdCIsImh0bWxCb3R0b21SaWdodCIsImNsYXNzZXMiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJfcmVmMyIsIl9yZWYzJHNob3dRdWlja0J1eSIsInNob3dRdWlja0J1eSIsImdldENsYXNzZXMiLCJnZXRUaXRsZSIsInRpdGxlIiwiZ2V0SW1hZ2VzIiwiaW1nUHJpbWFyeSIsIm1lZGlhIiwiaW1nU2Vjb25kYXJ5IiwibWVkaXVtIiwiX21lZGl1bSRhbHQiLCJhbHQiLCJ0b0xvd2VyQ2FzZSIsImltZ1ByaW
24031hcnlTcmMiLCJzcmMiLCJpbWdTZWNvbmRhcnlTcmMiLCJpbWdQcmltYXJ5TGF6eVNyYyIsImltZ1NlY29uZGFyeUxhenlTcmMiLCJnZXRQcmljZXMiLCJjaGVhcGVzdFZhcmlhbnQiLCJjb21wYXJlQXRQcmljZSIsImdldFVybCIsInVybCIsImdldERlc2NyaXB0aW9uIiwiX3Byb2R1Y3QkZGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsInNwbGl0IiwiZWxlbWVudCIsImdldExpbmtlZFByb2R1Y3RzIiwiX3Byb2R1Y3QkbGlua2VkIiwibGlua2VkIiwibWV0YSIsImhpZGVfdGh1bWJuYWlscyIsIm1heExpbWl0Iiwib3JnTGVuZ3RoIiwic29ydFByb2R1Y3RzIiwicHJvZHVjdHMiLCJoYW5kbGUiLCJpdGVtIiwic3BsaWNlIiwiaW5kZXhPZiIsInVuc2hpZnQiLCJpdGVtc01hcmt1cCIsImxpbmtlZFByb2R1Y3RzIiwicGx1c0NvdW50ZXIiLCJmb3JFYWNoIiwiaW5kZXgiLCJsYXp5U3JjIiwiaW1nIiwiY2xhc3NOYW1lcyIsImdldFF1aWNrQnV5QnV0dG9uIiwicGxhY2VtZW50IiwidiIsInRlbXBsYXRlIiwicXVpY2tCdXlCdXR0b25PdmVybGF5VGVtcGxhdGUiLCJxdWlja0J1eUJ1dHRvbklubGluZVRlbXBsYXRlIiwiaWQiLCJwcm9kdWN0Q2FyZFRlbXBsYXRlIl0sInNvdXJjZVJvb3QiOiIifQ==
2404//# sourceURL=webpack-internal:///./src/scripts/lib/product-card.js
2405
2406}`)},"./src/scripts/lib/string-memory.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
2407/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2408/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2409/* harmony export */ });
2410function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2411function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
2412function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
2413function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
2414function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
2415function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
2416function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
2417function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
2418function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
2419function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
2420var StringMemory = /*#__PURE__*/function () {
2421  function StringMemory(storage) {
2422    _classCallCheck(this, StringMemory);
2423    this.storage = storage;
2424    this.prefix = 'memory';
2425  }
2426  return _createClass(StringMemory, [{
2427    key: "get",
2428    value: function () {
2429      var _get = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(key, callback) {
2430        var _len,
2431          args,
2432          _key,
2433          result,
2434          _args = arguments;
2435        return _regenerator().w(function (_context) {
2436          while (1) switch (_context.n) {
2437            case 0:
2438              for (_len = _args.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
2439                args[_key - 2] = _args[_key];
2440              }
2441              if (!this.storage.getItem(this.getKeyName(key))) {
2442                _context.n = 2;
2443                break;
2444              }
2445              if (false) // removed by dead control flow
2446{}
2447              // eslint-disable-next-line no-console
2448              console.log("Fetched key \\"".concat(key, "\\" correctly, but did not return the stored response. Use production environment to enable."));
2449              return _context.a(2, callback.apply(void 0, args));
2450            case 1:
2451              return _context.a(2, this.storage.getItem(this.getKeyName(key)));
2452            case 2:
2453              _context.n = 3;
2454              return callback.apply(void 0, args);
2455            case 3:
2456              result = _context.v;
2457              if (typeof result === 'string') {
2458                this.storage.setItem(this.getKeyName(key), result);
2459              } else {
2460                // eslint-disable-next-line no-console
2461                console.warn('Response of callback must of type string to be stored. Result was not stored');
2462              }
2463              return _context.a(2, result);
2464          }
2465        }, _callee, this);
2466      }));
2467      function get(_x, _x2) {
2468        return _get.apply(this, arguments);
2469      }
2470      return get;
2471    }()
2472  }, {
2473    key: "delete",
2474    value: function _delete(key) {
2475      this.storage.removeItem(this.getKeyName(key));
2476    }
2477  }, {
2478    key: "getKeyName",
2479    value: function getKeyName(key) {
2480      return "".concat(this.prefix, "-").concat(key);
2481    }
2482  }]);
2483}();
2484/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function (storage) {
2485  return new StringMemory(storage);
2486});
2487(Object.getOwnPropertyDescriptor(__WEBPACK_DEFAULT_EXPORT__, "name") || {}
2487).writable || Object.defineProperty(__WEBPACK_DEFAULT_EXPORT__, "name", { value: "default", configurable: true });//# sourceURL=[module]
2488//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxNQUFNO2dCQUNMO2dCQUNBUyxPQUFPLENBQUNJLElBQUksQ0FBQyw4RUFBOEUsQ0FBQztjQUM5RjtjQUFDLE9BQUFYLFFBQUEsQ0FBQXRELENBQUEsSUFFTW9ELE1BQU07VUFBQTtRQUFBLEdBQUFMLE9BQUE7TUFBQSxDQUNkO01BQUEsU0F4QkttQixHQUFHQSxDQUFBQyxFQUFBLEVBQUFDLEdBQUE7UUFBQSxPQUFBdEIsSUFBQSxDQUFBaEIsS0FBQSxPQUFBRCxTQUFBO01BQUE7TUFBQSxPQUFIcUMsR0FBRztJQUFBO0VBQUE7SUFBQTlCLEdBQUE7SUFBQTVCLEtBQUEsRUEwQlQsU0FBQTZELE9BQU1BLENBQUNqQyxHQUFHLEVBQUU7TUFDVixJQUFJLENBQUNRLE9BQU8sQ0FBQzBCLFVBQVUsQ0FBQyxJQUFJLENBQUNiLFVBQVUsQ0FBQ3JCLEdBQUcsQ0FBQyxDQUFDO0lBQy9DO0VBQUM7SUFBQUEsR0FBQTtJQUFBNUIsS0FBQSxFQUVELFNBQUFpRCxVQUFVQSxDQUFDckIsR0FBRyxFQUFFO01BQ2QsVUFBQTJCLE1BQUEsQ0FBVSxJQUFJLENBQUNsQixNQUFNLE9BQUFrQixNQUFBLENBQUkzQixHQUFHO0lBQzlCO0VBQUM7QUFBQTtBQUdILGlFQUFlLFVBQUNRLE9BQU87RUFBQSxPQUFLLElBQUlELFlBQVksQ0FBQ0MsT0FBTyxDQUFDO0FBQUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2xpYi9zdHJpbmctbWVtb3J5LmpzP2VjNzAiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgU3RyaW5nTWVtb3J5IHtcbiAgY29uc3RydWN0b3Ioc3RvcmFnZSkge1xuICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2U7XG4gICAgdGhpcy5wcmVmaXggPSAnbWVtb3J5Jztcblx0fVxuXG4gIGFzeW5jIGdldChrZXksIGNhbGxiYWNrLCAuLi5hcmdzKSB7XG4gICAgaWYgKHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0S2V5TmFtZShrZXkpKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBGZXRjaGVkIGtleSBcIiR7a2V5fVwiIGNvcnJlY3RseSwgYnV0IGRpZCBub3QgcmV0dXJuIHRoZSBzdG9yZWQgcmVzcG9uc2UuIFVzZSBwcm9kdWN0aW9uIGVudmlyb25tZW50IHRvIGVuYWJsZS5gXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gY2FsbGJhY2soLi4uYXJncylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0S2V5TmFtZShrZXkpKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbGxiYWNrKC4uLmFyZ3MpXG5cbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0S2V5TmFtZShrZXkpLCByZXN1bHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ1Jlc3BvbnNlIG9mIGNhbGxiYWNrIG11c3Qgb2YgdHlwZSBzdHJpbmcgdG8gYmUgc3RvcmVkLiBSZXN1bHQgd2FzIG5vdCBzdG9yZWQnKVxuICAgIH1cblxuICAgI
vendor: 5,403 bytes, lines 2488-2511
2488HJldHVybiByZXN1bHRcbiAgfVxuXG4gIGRlbGV0ZShrZXkpIHtcbiAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmdldEtleU5hbWUoa2V5KSlcbiAgfVxuXG4gIGdldEtleU5hbWUoa2V5KSB7XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2tleX1gXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgKHN0b3JhZ2UpID0+IG5ldyBTdHJpbmdNZW1vcnkoc3RvcmFnZSlcbiJdLCJuYW1lcyI6WyJlIiwidCIsInIiLCJTeW1ib2wiLCJuIiwiaXRlcmF0b3IiLCJvIiwidG9TdHJpbmdUYWciLCJpIiwiYyIsInByb3RvdHlwZSIsIkdlbmVyYXRvciIsInUiLCJPYmplY3QiLCJjcmVhdGUiLCJfcmVnZW5lcmF0b3JEZWZpbmUyIiwiZiIsInAiLCJ5IiwiRyIsInYiLCJhIiwiZCIsImJpbmQiLCJsZW5ndGgiLCJsIiwiVHlwZUVycm9yIiwiY2FsbCIsImRvbmUiLCJ2YWx1ZSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiZGlzcGxheU5hbWUiLCJfcmVnZW5lcmF0b3IiLCJ3IiwibSIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yRGVmaW5lIiwiX2ludm9rZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJrZXkiLCJfY3JlYXRlQ2xhc3MiLCJfdG9QcmltaXRpdmUiLCJfdHlwZW9mIiwidG9QcmltaXRpdmUiLCJTdHJpbmciLCJOdW1iZXIiLCJTdHJpbmdNZW1vcnkiLCJzdG9yYWdlIiwicHJlZml4IiwiX2dldCIsIl9jYWxsZWUiLCJjYWxsYmFjayIsIl9sZW4iLCJhcmdzIiwiX2tleSIsInJlc3VsdCIsIl9hcmdzIiwiX2NvbnRleHQiLCJBcnJheSIsImdldEl0ZW0iLCJnZXRLZXlOYW1lIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiY29uc29sZSIsImxvZyIsImNvbmNhdCIsInNldEl0ZW0iLCJ3YXJuIiwiZ2V0IiwiX3giLCJfeDIiLCJkZWxldGUiLCJyZW1vdmVJdGVtIl0sInNvdXJjZVJvb3QiOiIifQ==
2489//# sourceURL=webpack-internal:///./src/scripts/lib/string-memory.js
2490
2491}`)},"./src/scripts/lib/upsell-gift.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
2492/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2493/* harmony export */   addUpsellTrigger: () => (/* binding */ addUpsellTrigger),
2494/* harmony export */   canAddFreeGift: () => (/* binding */ canAddFreeGift),
2495/* harmony export */   checkForDeprecatedGifts: () => (/* binding */ checkForDeprecatedGifts),
2496/* harmony export */   clearAllUpsellTriggers: () => (/* binding */ clearAllUpsellTriggers),
2497/* harmony export */   deleteUpsellTrigger: () => (/* binding */ deleteUpsellTrigger),
2498/* harmony export */   doesProductContainTriggers: () => (/* binding */ doesProductContainTriggers),
2499/* harmony export */   getGiftAdded: () => (/* binding */ getGiftAdded),
2500/* harmony export */   getUpsellTriggers: () => (/* binding */ getUpsellTriggers),
2501/* harmony export */   giftAdded: () => (/* binding */ giftAdded),
2502/* harmony export */   invalidGiftPopup: () => (/* binding */ invalidGiftPopup),
2503/* harmony export */   upsellConfig: () => (/* binding */ upsellConfig),
2504/* harmony export */   upsellGiftInCart: () => (/* binding */ upsellGiftInCart),
2505/* harmony export */   upsellGiftValidation: () => (/* binding */ upsellGiftValidation),
2506/* harmony export */   upsellTriggersContains: () => (/* binding */ upsellTriggersContains)
2507/* harmony export */ });
2508/* harmony import */ var _lib_cart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/cart */ "./src/scripts/lib/cart.js");
2509/* harmony import */ var _lib_images__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/images */ "./src/scripts/lib/images.js");
2510/* harmony import */ var _lib_currency__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/currency */ "./src/scripts/lib/currency.js");
2511function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
2511 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
2512function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
2513function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
2514function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
2515
2516
2517
2518
2519//Config containing translations, icons and threshold for getting a free gift
2520var upsellConfig = {
2521  required_cart_total: window.theme.cart.upsellGiftAmount,
2522  translations: window.theme.strings.upSell,
2523  icons: {
2524    close: window.theme.icons.close,
2525    gift: window.theme.icons.gift,
2526    checkmark: window.theme.icons.checkmarkSmall,
2527    add_btn: window.theme.icons.addBtn
2528  }
2529};
2530
2531//We use this array as a global state, that keeps track of all current triggers
2532//It is going to contain all triggers as seperate strings, also including duplicates
2533var triggers = [];
2534
2535//We use this as a global state
2536//This variable helps prevent multiple gift products from being added to the cart
2537var gift_added = false;
2538
2539//Functions that lets us interact with our global states from other components
2540var giftAdded = function giftAdded() {
2541  gift_added = true;
2542};
2543var getGiftAdded = function getGiftAdded() {
2544  return gift_added;
2545};
2546var getUpsellTriggers = function getUpsellTriggers() {
2547  return triggers;
2548};
2549var addUpsellTrigger = function addUpsellTrigger(trigger) {
2550  triggers.push(trigger);
2551};
2552var deleteUpsellTrigger = function deleteUpsellTrigger(trigger) {
2553  triggers = triggers.filter(function (entry) {
2554    return entry !== trigger;
2555  });
2556};
2557var clearAllUpsellTriggers = function clearAllUpsellTriggers() {
2558  triggers = [];
2559};
2560var upsellTriggersContains = function upsellTriggersContains(line_item) {
2561  var upsellTriggers = getUpsellTriggers();
2562  if (upsellTriggers.length == 0) return false;
2563  if (upsellTriggers.find(function (trigger) {
2564    return trigger == line_item.handle;
2565  })) return true;
2566};
2567var checkForDeprecatedGifts = function checkForDeprecatedGifts(cart) {
2568  if (!upsellGiftInCart()) return;
2569  var giftProduct = upsellGiftInCart();
2570  if (upsellTriggersContains(giftProduct) && canAddFreeGift()) return;
2571  var cartQuantities = cart.items.map(function (line_item) {
2572    var _line_item$properties;
2573    if ((_line_item$properties = line_item.properties) !== null && _line_item$properties !== void 0 && _line_item$properties._upsell_gift) return 0;
2574    return line_item.quantity;
2575  });
2576  (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.updateAllCartQuantities)(cartQuantities).then(function () {
2577    invalidGiftPopup(giftProduct);
2578  });
2579};
2580var upsellGiftInCart = function upsellGiftInCart() {
2581  var line_items = app.getState().cart.items;
2582  return line_items.find(function (line_item) {
2583    var _line_item$properties2;
2584    return (_line_item$properties2 = line_item.properties) === null || _line_item$properties2 === void 0 ? void 0 : _line_item$properties2._upsell_gift;
2585  });
2586};
2587var canAddFreeGift = function canAddFreeGift() {
2588  var subtract = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
2589  var cart_total = app.getState().cart.total_price;
2590  return cart_total - subtract >= upsellConfig.required_cart_total;
2591};
2592var doesProductContainTriggers = /*#__PURE__*/function () {
2593  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(product, line_item_index) {
2594    var productContainsTriggers, line_items, getProductTriggers;
2595    return _regenerator().w(function (_context) {
2596      while (1) switch (_context.n) {
2597        case 0:
2598          productContainsTriggers = product.tags.find(function (tag) {
2599            return tag.includes('upsell_gift:');
2600          });
2601          if (productContainsTriggers) {
2602            _context.n = 1;
2603            break;
2604          }
2605          return _context.a(2);
2606        case 1:
2607          line_items = app.getState().cart.items;
2608          getProductTriggers = product.tags.filter(function (tag) {
2609            return tag.includes('upsell_gift:');
2610          }).map(function (trigger) {
2611            return trigger.split(':')[1];
2612          });
2613          getProductTriggers.forEach(function (trigger) {
2614            addUpsellTrigger(trigger);
2615          });
2616          line_items[line_item_index - 1]['upsellTriggers'] = getProductTriggers; // Shopify line index is 1-based
2617          return _context.a(2, new Promise(function (resolve) {
2618            resolve(getProductTriggers);
2619          }));
2620      }
2621    }, _callee);
2622  }));
2623  return function doesProductContainTriggers(_x, _x2) {
2624    return _ref.apply(this, arguments);
2625  };
2626}();
2627var upsellGiftValidation = /*#__PURE__*/function () {
2628  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(cart, line_item_index) {
2629    var _lineItem$properties, _lineItem$upsellTrigg2;
2630    var allTriggers, giftProduct, lineItem, lineItemTriggers, lineItemPrice, numberOfTriggers;
2631    return _regenerator().w(function (_context2) {
2632      while (1) switch (_context2.n) {
2633        case 0:
2634          allTriggers = getUpsellTriggers();
2635          giftProduct = upsellGiftInCart();
2636          lineItem = cart.items[line_item_index - 1]; // Shopify line index is 1-based
2637          //Remove all gift options that are not available from the cart drawer list
2638          lineItemTriggers = allTriggers.filter(function (entry) {
2639            var _lineItem$upsellTrigg;
2640            return (_lineItem$upsellTrigg = lineItem.upsellTriggers) === null || _lineItem$upsellTrigg === void 0 ? void 0 : _lineItem$upsellTrigg.some(function (trigger) {
2641              return trigger.includes(entry);
2642            });
2643          });
2644          lineItemTriggers.forEach(function (trigger) {
2645            var numberOfTriggers = allTriggers.filter(function (entry) {
2646              return entry.includes(trigger);
2647            });
2648            if (numberOfTriggers.length == 1) app.emit('upsell:clear', {
2649              handle: trigger
2650            });
2651          });
2652
2653          //If there is no gift product in the cart, we just remove the line item
2654          if (giftProduct) {
2655            _context2.n = 1;
2656            break;
2657          }
2658          return _context2.a(2, removeSingleItem(line_item_index));
2659        case 1:
2660          if (!((_lineItem$properties = lineItem.properties) !== null && _lineItem$properties !== void 0 && _lineItem$properties._upsell_gift)) {
2661            _context2.n = 2;
2662            break;
2663          }
2664          return _context2.a(2, removeSingleItem(line_item_index));
2665        case 2:
2666          lineItemPrice = lineItem.price * lineItem.quantity; //If the item being removed is just a normal product without any triggers
2667          if ((_lineItem$upsellTrigg2 = lineItem.upsellTriggers) !== null && _lineItem$upsellTrigg2 !== void 0 && _lineItem$upsellTrigg2.find(function (trigger) {
2668            return trigger == giftProduct.handle;
2669          })) {
2670            _context2.n = 4;
2671            break;
2672          }
2673          if (!canAddFreeGift(lineItemPrice)) {
2674            _context2.n = 3;
2675            break;
2676          }
2677          return _context2.a(2, (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.removeItem)({
2678            line: line_item_index
2679          }));
2680        case 3:
2681          return _context2.a(2, removeMultipleQuantities(cart, line_item_index, giftProduct));
2682        case 4:
2683          //If the item being removed is the trigger product
2684          numberOfTriggers = cart.items.filter(function (x) {
2685            var _x$upsellTriggers;
2686            return (_x$upsellTriggers = x.upsellTriggers) === null || _x$upsellTriggers === void 0 ? void 0 : _x$upsellTriggers.includes(giftProduct.handle);
2687          });
2688          if (!(numberOfTriggers.length <= 1)) {
2689            _context2.n = 5;
2690            break;
2691          }
2692          return _context2.a(2, removeMultipleQuantities(cart, line_item_index, giftProduct));
2693        case 5:
2694          if (!canAddFreeGift(lineItemPrice)) {
2695            _context2.n = 6;
2696            break;
2697          }
2698          return _context2.a(2, (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.removeItem)({
2699            line: line_item_index
2700          }));
2701        case 6:
2702          return _context2.a(2, removeMultipleQuantities(cart, line_item_index, giftProduct));
2703        case 7:
2704          return _context2.a(2);
2705      }
2706    }, _callee2);
2707  }));
2708  return function upsellGiftValidation(_x3, _x4) {
2709    return _ref2.apply(this, arguments);
2710  };
2711}();
2712var removeSingleItem = function removeSingleItem(line_item_index) {
2713  (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.removeItem)({
2714    line: line_item_index
2715  });
2716  gift_added = false;
2717};
2718var removeMultipleQuantities = function removeMultipleQuantities(cart, line_item_index, line_item) {
2719  var cartQuantities = cart.items.map(function (line_item, index) {
2720    var _line_item$properties3;
2721    if ((_line_item$properties3 = line_item.properties) !== null && _line_item$properties3 !== void 0 && _line_item$properties3._upsell_gift) return 0;
2722    if (index == line_item_index - 1) return 0; // Shopify line index is 1-based
2723    return line_item.quantity;
2724  });
2725  (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.updateAllCartQuantities)(cartQuantities).then(function () {
2726    invalidGiftPopup(line_item);
2727  });
2728  gift_added = false;
2729};
2730var invalidGiftPopup = function invalidGiftPopup(line_item) {
2731  var popup = "\\n    <div class=\\"gift__popup\\" aria-hidden=\\"true\\">\\n      <div class=\\"gift__popup--content\\">\\n        <div class=\\"gift__popup--close\\" data-close>\\n          ".concat(upsellConfig.icons.close, "\\n        </div>\\n        <h2>").concat(upsellConfig.translations.popup_title, "</h2>\\n        <ul>\\n          <li class=\\"cart-item\\">\\n            <div class=\\"cart-item__main\\">\\n              <figure class=\\"cart-item__image\\">\\n                <div class=\\"image-wrapper\\">\\n                  <img class=\\"lazyload\\" data-src=\\"").concat((0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(line_item.image.replace('.' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(line_item.image), ''), '120x120'), "\\">\\n                </div>\\n              </figure>\\n\\n              <div class=\\"cart-item__info\\">\\n                  <p class=\\"cart-item__title\\">").concat(line_item.product_title, "</p>\\n\\n                  <p class=\\"cart-item__variant\\">\\n                      <span>").concat(line_item.quantity, " x</span>\\n                      ").concat(line_item.variant_title ? "<span>".concat(line_item.variant_title, "</span>") : '', "\\n                  </p>\\n\\n                  <p class=\\"cart-item__prices\\">\\n                    <span class=\\"price--gift\\">").concat(upsellConfig.icons.gift, " ").concat(upsellConfig.translations.gift_label, "</span>\\n                    <span class=\\"price--compare\\">").concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(line_item.price), "</span>\\n                    <span class=\\"price--current\\">").concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(0), "</span>\\n                  </p>\\n              </div>\\n            </div>\\n          </li>\\n        </ul>\\n      </div>\\n      <div class=\\"gift__popup--overlay\\" data-close></div>\\n    </div>\\n  ");
2732  document.body.insertAdjacentHTML('beforeend', popup);
2733  var popupElement = document.querySelector('.gift__popup');
2734  popupElement.setAttribute('aria-hidden', false);
2735  var popupElementCloseBtns = popupElement.querySelectorAll('[data-close]');
2736  popupElementCloseBtns.forEach(function (btn) {
2737    return btn.addEventListener('click', function () {
2738      popupElement.remove();
2739    });
2740  });
2741};//# sourceURL=[module]
2742//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UFDMkMsR0FBRztJQUFBLE9BQzlCQSxHQUFHLENBQUNDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFNO01BQ2hDTixZQUFZLENBQUNPLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQztFQUFBLENBQ04sQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9saWIvdXBzZWxsLWdpZnQuanM/ZDBhNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW1vdmVJdGVtLCB1cGRhdGVBbGxDYXJ0UXVhbnRpdGllcyB9IGZyb20gJ0AvbGliL2NhcnQnXG5pbXBvcnQgeyBnZXRTaXplZEltYWdlVXJsLCBpbWFnZVNpemUgfSBmcm9tICdAL2xpYi9pbWFnZXMnXG5pbXBvcnQgeyBmb3JtYXRNb25leSB9IGZyb20gJ0AvbGliL2N1cnJlbmN5J1xuXG4vL0NvbmZpZyBjb250YWluaW5nIHRyYW5zbGF0aW9ucywgaWNvbnMgYW5kIHR
2742ocmVzaG9sZCBmb3IgZ2V0dGluZyBhIGZyZWUgZ2lmdFxuZXhwb3J0IGNvbnN0IHVwc2VsbENvbmZpZyA9IHtcbiAgICByZXF1aXJlZF9jYXJ0X3RvdGFsOiB3aW5kb3cudGhlbWUuY2FydC51cHNlbGxHaWZ0QW1vdW50LFxuICAgIHRyYW5zbGF0aW9uczogd2luZG93LnRoZW1lLnN0cmluZ3MudXBTZWxsLFxuICAgIGljb25zOiB7XG4gICAgICAgIGNsb3NlOiB3aW5kb3cudGhlbWUuaWNvbnMuY2xvc2UsXG4gICAgICAgIGdpZnQ6IHdpbmRvdy50aGVtZS5pY29ucy5naWZ0LFxuICAgICAgICBjaGVja21hcms6IHdpbmRvdy50aGVtZS5pY29ucy5jaGVja21hcmtTbWFsbCxcbiAgICAgICAgYWRkX2J0bjogd2luZG93LnRoZW1lLmljb25zLmFkZEJ0bixcbiAgICB9LFxufVxuXG4vL1dlIHVzZSB0aGlzIGFycmF5IGFzIGEgZ2xvYmFsIHN0YXRlLCB0aGF0IGtlZXBzIHRyYWNrIG9mIGFsbCBjdXJyZW50IHRyaWdnZXJzXG4vL0l0IGlzIGdvaW5nIHRvIGNvbnRhaW4gYWxsIHRyaWdnZXJzIGFzIHNlcGVyYXRlIHN0cmluZ3MsIGFsc28gaW5jbHVkaW5nIGR1cGxpY2F0ZXNcbmxldCB0cmlnZ2VycyA9IFtdXG5cbi8vV2UgdXNlIHRoaXMgYXMgYSBnbG9iYWwgc3RhdGVcbi8vVGhpcyB2YXJpYWJsZSBoZWxwcyBwcmV2ZW50IG11bHRpcGxlIGdpZnQgcHJvZHVjdHMgZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgY2FydFxubGV0IGdpZnRfYWRkZWQgPSBmYWxzZVxuXG4vL0Z1bmN0aW9ucyB0aGF0IGxldHMgdXMgaW50ZXJhY3Qgd2l0aCBvdXIgZ2xvYmFsIHN0YXRlcyBmcm9tIG90aGVyIGNvbXBvbmVudHNcbmV4cG9ydCBjb25zdCBnaWZ0QWRkZWQgPSAoKSA9PiB7XG4gICAgZ2lmdF9hZGRlZCA9IHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGdldEdpZnRBZGRlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gZ2lmdF9hZGRlZFxufVxuXG5leHBvcnQgY29uc3QgZ2V0VXBzZWxsVHJpZ2dlcnMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRyaWdnZXJzXG59XG5cbmV4cG9ydCBjb25zdCBhZGRVcHNlbGxUcmlnZ2VyID0gKHRyaWdnZXIpID0+IHtcbiAgICB0cmlnZ2Vycy5wdXNoKHRyaWdnZXIpXG59XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVcHNlbGxUcmlnZ2VyID0gKHRyaWdnZXIpID0+IHtcbiAgICB0cmlnZ2VycyA9IHRyaWdnZXJzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSB0cmlnZ2VyKVxufVxuXG5leHBvcnQgY29uc3QgY2xlYXJBbGxVcHNlbGxUcmlnZ2VycyA9ICgpID0+IHtcbiAgICB0cmlnZ2VycyA9IFtdXG59XG5cbmV4cG9ydCBjb25zdCB1cHNlbGxUcmlnZ2Vyc0NvbnRhaW5zID0gKGxpbmVfaXRlbSkgPT4ge1xuICAgIGNvbnN0IHVwc2VsbFRyaWdnZXJzID0gZ2V0VXBzZWxsVHJpZ2dlcnMoKVxuICAgIGlmICh1cHNlbGxUcmlnZ2Vycy5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHVwc2VsbFRyaWdnZXJzLmZpbmQoKHRyaWdnZXIpID0+IHRyaWdnZXIgPT0gbGluZV9pdGVtLmhhbmRsZSkpIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBjaGVja0ZvckRlcHJlY2F0ZWRHaWZ0cyA9IChjYXJ0KSA9PiB7XG4gICAgaWYgKCF1cHNlbGxHaWZ0SW5DYXJ0KCkpIHJldHVyblxuICAgIGNvbnN0IGdpZnRQcm9kdWN0ID0gdXBzZWxsR2lmdEluQ2FydCgpXG5cbiAgICBpZiAodXBzZWxsVHJpZ2dlcnNDb250YWlucyhnaWZ0UHJvZHVjdCkgJiYgY2FuQWRkRnJlZUdpZnQoKSkgcmV0dXJuXG4gICAgY29uc3QgY2FydFF1YW50aXRpZXMgPSBjYXJ0Lml0ZW1zLm1hcCgobGluZV9pdGVtKSA9PiB7XG4gICAgICAgIGlmIChsaW5lX2l0ZW0ucHJvcGVydGllcz8uX3Vwc2VsbF9naWZ0KSByZXR1cm4gMFxuICAgICAgICByZXR1cm4gbGluZV9pdGVtLnF1YW50aXR5XG4gICAgfSlcblxuICAgIHVwZGF0ZUFsbENhcnRRdWFudGl0aWVzKGNhcnRRdWFudGl0aWVzKS50aGVuKCgpID0+IHtcbiAgICAgICAgaW52YWxpZEdpZnRQb3B1cChnaWZ0UHJvZHVjdClcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXBzZWxsR2lmdEluQ2FydCA9ICgpID0+IHtcbiAgICBjb25zdCBsaW5lX2l0ZW1zID0gYXBwLmdldFN0YXRlKCkuY2FydC5pdGVtc1xuICAgIHJldHVybiBsaW5lX2l0ZW1zLmZpbmQoKGxpbmVfaXRlbSkgPT4gbGluZV9pdGVtLnByb3BlcnRpZXM/Ll91cHNlbGxfZ2lmdClcbn1cblxuZXhwb3J0IGNvbnN0IGNhbkFkZEZyZWVHaWZ0ID0gKHN1YnRyYWN0ID0gMCkgPT4ge1xuICAgIGNvbnN0IGNhcnRfdG90YWwgPSBhcHAuZ2V0U3RhdGUoKS5jYXJ0LnRvdGFsX3ByaWNlXG4gICAgcmV0dXJuIGNhcnRfdG90YWwgLSBzdWJ0cmFjdCA+PSB1cHNlbGxDb25maWcucmVxdWlyZWRfY2FydF90b3RhbFxufVxuXG5leHBvcnQgY29uc3QgZG9lc1Byb2R1Y3RDb250YWluVHJpZ2dlcnMgPSBhc3luYyAocHJvZHVjdCwgbGluZV9pdGVtX2luZGV4KSA9PiB7XG4gICAgY29uc3QgcHJvZHVjdENvbnRhaW5zVHJpZ2dlcnMgPSBwcm9kdWN0LnRhZ3MuZmluZCgodGFnKSA9PiB0YWcuaW5jbHVkZXMoJ3Vwc2VsbF9naWZ0OicpKVxuICAgIGlmICghcHJvZHVjdENvbnRhaW5zVHJpZ2dlcnMpIHJldHVyblxuXG4gICAgY29uc3QgbGluZV9pdGVtcyA9IGFwcC5nZXRTdGF0ZSgpLmNhcnQuaXRlbXNcbiAgICBjb25zdCBnZXRQcm9kdWN0VHJpZ2dlcnMgPSBwcm9kdWN0LnRhZ3NcbiAgICAgICAgLmZpbHRlcigodGFnKSA9PiB0YWcuaW5jbHVkZXMoJ3Vwc2VsbF9naWZ0OicpKVxuICAgICAgICAubWFwKCh0cmlnZ2VyKSA9PiB0cmlnZ2VyLnNwbGl0KCc6JylbMV0pXG5cbiAgICBnZXRQcm9kdWN0VHJpZ2dlcnMuZm9yRWFjaCgodHJpZ2dlcikgPT4ge1xuICAgICAgICBhZGRVcHNlbGxUcmlnZ2VyKHRyaWdnZXIpXG4gICAgfSlcbiAgICBsaW5lX2l0ZW1zW2xpbmVfaXRlbV9pbmRleCAtIDFdWyd1cHNlbGxUcmlnZ2VycyddID0gZ2V0UHJvZHVjdFRyaWdnZXJzIC8vIFNob3BpZnkgbGluZSBpbmRleCBpcyAxLWJhc2VkXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgcmVzb2x2ZShnZXRQcm9kdWN0VHJpZ2dlcnMpXG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHVwc2VsbEdpZnRWYWxpZGF0aW9uID0gYXN5bmMgKGNhcnQsIGxpbmVfaXRlbV9pbmRleCkgPT4ge1xuICAgIGNvbnN0IGFsbFRyaWdnZXJzID0gZ2V0VXBzZWxsVHJpZ2dlcnMoKVxuICAgIGNvbnN0IGdpZnRQcm9kdWN0ID0gdXBzZWxsR2lmdEluQ2FydCgpXG4gICAgY29uc3QgbGluZUl0ZW
27420gPSBjYXJ0Lml0ZW1zW2xpbmVfaXRlbV9pbmRleCAtIDFdIC8vIFNob3BpZnkgbGluZSBpbmRleCBpcyAxLWJhc2VkXG5cbiAgICAvL1JlbW92ZSBhbGwgZ2lmdCBvcHRpb25zIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgZnJvbSB0aGUgY2FydCBkcmF3ZXIgbGlzdFxuICAgIGNvbnN0IGxpbmVJdGVtVHJpZ2dlcnMgPSBhbGxUcmlnZ2Vycy5maWx0ZXIoKGVudHJ5KSA9PlxuICAgICAgICBsaW5lSXRlbS51cHNlbGxUcmlnZ2Vycz8uc29tZSgodHJpZ2dlcikgPT4gdHJpZ2dlci5pbmNsdWRlcyhlbnRyeSkpXG4gICAgKVxuICAgIGxpbmVJdGVtVHJpZ2dlcnMuZm9yRWFjaCgodHJpZ2dlcikgPT4ge1xuICAgICAgICBjb25zdCBudW1iZXJPZlRyaWdnZXJzID0gYWxsVHJpZ2dlcnMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaW5jbHVkZXModHJpZ2dlcikpXG4gICAgICAgIGlmIChudW1iZXJPZlRyaWdnZXJzLmxlbmd0aCA9PSAxKSBhcHAuZW1pdCgndXBzZWxsOmNsZWFyJywgeyBoYW5kbGU6IHRyaWdnZXIgfSlcbiAgICB9KVxuXG4gICAgLy9JZiB0aGVyZSBpcyBubyBnaWZ0IHByb2R1Y3QgaW4gdGhlIGNhcnQsIHdlIGp1c3QgcmVtb3ZlIHRoZSBsaW5lIGl0ZW1cbiAgICBpZiAoIWdpZnRQcm9kdWN0KSByZXR1cm4gcmVtb3ZlU2luZ2xlSXRlbShsaW5lX2l0ZW1faW5kZXgpXG5cbiAgICAvL0lmIHRoaXMgbGluZSBpdGVtIGlzIHRoaXMgZnJlZSBnaWZ0LCB3ZSBqdXN0IHJlbW92ZSBpdFxuICAgIGlmIChsaW5lSXRlbS5wcm9wZXJ0aWVzPy5fdXBzZWxsX2dpZnQpIHJldHVybiByZW1vdmVTaW5nbGVJdGVtKGxpbmVfaXRlbV9pbmRleClcblxuICAgIGNvbnN0IGxpbmVJdGVtUHJpY2UgPSBsaW5lSXRlbS5wcmljZSAqIGxpbmVJdGVtLnF1YW50aXR5XG5cbiAgICAvL0lmIHRoZSBpdGVtIGJlaW5nIHJlbW92ZWQgaXMganVzdCBhIG5vcm1hbCBwcm9kdWN0IHdpdGhvdXQgYW55IHRyaWdnZXJzXG4gICAgaWYgKCFsaW5lSXRlbS51cHNlbGxUcmlnZ2Vycz8uZmluZCgodHJpZ2dlcikgPT4gdHJpZ2dlciA9PSBnaWZ0UHJvZHVjdC5oYW5kbGUpKSB7XG4gICAgICAgIC8vQ2hlY2sgaWYgd2UgY2FuIHJlbW92ZSB0aGUgaXRlbSB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoZSBnaWZ0IHByb2R1Y3QgaW4gY2FydFxuICAgICAgICBpZiAoY2FuQWRkRnJlZUdpZnQobGluZUl0ZW1QcmljZSkpIHJldHVybiByZW1vdmVJdGVtKHsgbGluZTogbGluZV9pdGVtX2luZGV4IH0pXG4gICAgICAgIHJldHVybiByZW1vdmVNdWx0aXBsZVF1YW50aXRpZXMoY2FydCwgbGluZV9pdGVtX2luZGV4LCBnaWZ0UHJvZHVjdClcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL0lmIHRoZSBpdGVtIGJlaW5nIHJlbW92ZWQgaXMgdGhlIHRyaWdnZXIgcHJvZHVjdFxuICAgICAgICBjb25zdCBudW1iZXJPZlRyaWdnZXJzID0gY2FydC5pdGVtcy5maWx0ZXIoKHgpID0+IHgudXBzZWxsVHJpZ2dlcnM/LmluY2x1ZGVzKGdpZnRQcm9kdWN0LmhhbmRsZSkpXG4gICAgICAgIGlmIChudW1iZXJPZlRyaWdnZXJzLmxlbmd0aCA8PSAxKSByZXR1cm4gcmVtb3ZlTXVsdGlwbGVRdWFudGl0aWVzKGNhcnQsIGxpbmVfaXRlbV9pbmRleCwgZ2lmdFByb2R1Y3QpXG4gICAgICAgIGlmIChjYW5BZGRGcmVlR2lmdChsaW5lSXRlbVByaWNlKSkgcmV0dXJuIHJlbW92ZUl0ZW0oeyBsaW5lOiBsaW5lX2l0ZW1faW5kZXggfSlcbiAgICAgICAgcmV0dXJuIHJlbW92ZU11bHRpcGxlUXVhbnRpdGllcyhjYXJ0LCBsaW5lX2l0ZW1faW5kZXgsIGdpZnRQcm9kdWN0KVxuICAgIH1cbn1cblxuY29uc3QgcmVtb3ZlU2luZ2xlSXRlbSA9IChsaW5lX2l0ZW1faW5kZXgpID0+IHtcbiAgICByZW1vdmVJdGVtKHsgbGluZTogbGluZV9pdGVtX2luZGV4IH0pXG4gICAgZ2lmdF9hZGRlZCA9IGZhbHNlXG59XG5cbmNvbnN0IHJlbW92ZU11bHRpcGxlUXVhbnRpdGllcyA9IChjYXJ0LCBsaW5lX2l0ZW1faW5kZXgsIGxpbmVfaXRlbSkgPT4ge1xuICAgIGNvbnN0IGNhcnRRdWFudGl0aWVzID0gY2FydC5pdGVtcy5tYXAoKGxpbmVfaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGxpbmVfaXRlbS5wcm9wZXJ0aWVzPy5fdXBzZWxsX2dpZnQpIHJldHVybiAwXG4gICAgICAgIGlmIChpbmRleCA9PSBsaW5lX2l0ZW1faW5kZXggLSAxKSByZXR1cm4gMCAvLyBTaG9waWZ5IGxpbmUgaW5kZXggaXMgMS1iYXNlZFxuICAgICAgICByZXR1cm4gbGluZV9pdGVtLnF1YW50aXR5XG4gICAgfSlcblxuICAgIHVwZGF0ZUFsbENhcnRRdWFudGl0aWVzKGNhcnRRdWFudGl0aWVzKS50aGVuKCgpID0+IHtcbiAgICAgICAgaW52YWxpZEdpZnRQb3B1cChsaW5lX2l0ZW0pXG4gICAgfSlcblxuICAgIGdpZnRfYWRkZWQgPSBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgaW52YWxpZEdpZnRQb3B1cCA9IChsaW5lX2l0ZW0pID0+IHtcbiAgICBjb25zdCBwb3B1cCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiZ2lmdF9fcG9wdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnaWZ0X19wb3B1cC0tY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2lmdF9fcG9wdXAtLWNsb3NlXCIgZGF0YS1jbG9zZT5cbiAgICAgICAgICAke3Vwc2VsbENvbmZpZy5pY29ucy5jbG9zZX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoMj4ke3Vwc2VsbENvbmZpZy50cmFuc2xhdGlvbnMucG9wdXBfdGl0bGV9PC9oMj5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaSBjbGFzcz1cImNhcnQtaXRlbVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtaXRlbV9fbWFpblwiPlxuICAgICAgICAgICAgICA8ZmlndXJlIGNsYXNzPVwiY2FydC1pdGVtX19pbWFnZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwibGF6eWxvYWRcIiBkYXRhLXNyYz1cIiR7Z2V0U2l6ZWRJbWFnZVVybChcbiAgICAgICAgICAgICAgICAgICAgICBsaW5lX2l0ZW0uaW1hZ2UucmVwbGFjZSgnLicgKyBpbWFnZVNpemUobGluZV9pdGVtLmltYWdlKSwgJycpLFxuICAgICAgICAgICAgICAgICAgICAgICcxMjB4MTIwJ1xuICAgICAgICAgICAgICAgICAgKX1cIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9maWd1cmU+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtaXRlbV9faW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJ0LWl0ZW1fX3Rp
2742dGxlXCI+JHtsaW5lX2l0ZW0ucHJvZHVjdF90aXRsZX08L3A+XG5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FydC1pdGVtX192YXJpYW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHtsaW5lX2l0ZW0ucXVhbnRpdHl9IHg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgJHtsaW5lX2l0ZW0udmFyaWFudF90aXRsZSA/IGA8c3Bhbj4ke2xpbmVfaXRlbS52YXJpYW50X3RpdGxlfTwvc3Bhbj5gIDogJyd9XG4gICAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FydC1pdGVtX19wcmljZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmljZS0tZ2lmdFwiPiR7dXBzZWxsQ29uZmlnLmljb25zLmdpZnR9ICR7dXBzZWxsQ29uZmlnLnRyYW5zbGF0aW9ucy5naWZ0X2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmljZS0tY29tcGFyZVwiPiR7Zm9ybWF0TW9uZXkobGluZV9pdGVtLnByaWNlKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJpY2UtLWN1cnJlbnRcIj4ke2Zvcm1hdE1vbmV5KDApfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ2lmdF9fcG9wdXAtLW92ZXJsYXlcIiBkYXRhLWNsb3NlPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgXG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHBvcHVwKVxuICAgIGNvbnN0IHBvcHVwRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5naWZ0X19wb3B1cCcpXG4gICAgcG9wdXBFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBmYWxzZSlcbiAgICBjb25zdCBwb3B1cEVsZW1lbnRDbG9zZUJ0bnMgPSBwb3B1cEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2xvc2VdJylcbiAgICBwb3B1cEVsZW1lbnRDbG9zZUJ0bnMuZm9yRWFjaCgoYnRuKSA9PlxuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBwb3B1cEVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgfSlcbiAgICApXG59XG4iXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJyZW1vdmVJdGVtIiwidXBkYXRlQWxsQ2FydFF1YW50aXRpZXMiLCJnZXRTaXplZEltYWdlVXJsIiwiaW1hZ2VTaXplIiwiZm9ybWF0TW9uZXkiLCJ1cHNlbGxDb25maWciLCJyZXF1aXJlZF9jYXJ0X3RvdGFsIiwid2luZG93IiwidGhlbWUiLCJjYXJ0IiwidXBzZWxsR2lmdEFtb3VudCIsInRyYW5zbGF0aW9ucyIsInN0cmluZ3MiLCJ1cFNlbGwiLCJpY29ucyIsImNsb3NlIiwiZ2lmdCIsImNoZWNrbWFyayIsImNoZWNrbWFya1NtYWxsIiwiYWRkX2J0biIsImFkZEJ0biIsInRyaWdnZXJzIiwiZ2lmdF9hZGRlZCIsImdpZnRBZGRlZCIsImdldEdpZnRBZGRlZCIsImdldFVwc2VsbFRyaWdnZXJzIiwiYWRkVXBzZWxsVHJpZ2dlciIsInRyaWdnZXIiLCJwdXNoIiwiZGVsZXRlVXBzZWxsVHJpZ2dlciIsImZpbHRlciIsImVudHJ5IiwiY2xlYXJBbGxVcHNlbGxUcmlnZ2VycyIsInVwc2VsbFRyaWdnZXJzQ29udGFpbnMiLCJsaW5lX2l0ZW0iLCJ1cHNlbGxUcmlnZ2VycyIsImZpbmQiLCJoYW5kbGUiLCJjaGVja0ZvckRlcHJlY2F0ZWRHaWZ0cyIsInVwc2VsbEdpZnRJbkNhcnQiLCJnaWZ0UHJvZHVjdCIsImNhbkFkZEZyZWVHaWZ0IiwiY2FydFF1YW50aXRpZXMiLCJpdGVtcyIsIm1hcCIsIl9saW5lX2l0ZW0kcHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJfdXBzZWxsX2dpZnQiLCJxdWFudGl0eSIsImludmFsaWRHaWZ0UG9wdXAiLCJsaW5lX2l0ZW1zIiwiYXBwIiwiZ2V0U3RhdGUiLCJfbGluZV9pdGVtJHByb3BlcnRpZXMyIiwic3VidHJhY3QiLCJ1bmRlZmluZWQiLCJjYXJ0X3RvdGFsIiwidG90YWxfcHJpY2UiLCJkb2VzUHJvZHVjdENvbnRhaW5UcmlnZ2VycyIsIl9yZWYiLCJfY2FsbGVlIiwicHJvZHVjdCIsImxpbmVfaXRlbV9pbmRleCIsInByb2R1Y3RDb250YWluc1RyaWdnZXJzIiwiZ2V0UHJvZHVjdFRyaWdnZXJzIiwiX2NvbnRleHQiLCJ0YWdzIiwidGFnIiwiaW5jbHVkZXMiLCJzcGxpdCIsImZvckVhY2giLCJfeCIsIl94MiIsInVwc2VsbEdpZnRWYWxpZGF0aW9uIiwiX3JlZjIiLCJfY2FsbGVlMiIsIl9saW5lSXRlbSRwcm9wZXJ0aWVzIiwiX2xpbmVJdGVtJHVwc2VsbFRyaWdnMiIsImFsbFRyaWdnZXJzIiwibGluZUl0ZW0iLCJsaW5lSXRlbVRyaWdnZXJzIiwibGluZUl0ZW1QcmljZSIsIm51bWJlck9mVHJpZ2dlcnMiLCJfY29udGV4dDIiLCJfbGluZUl0ZW0kdXBzZWxsVHJpZ2ciLCJzb21lIiwiZW1pdCIsInJlbW92ZVNpbmdsZUl0ZW0iLCJwcmljZSIsImxpbmUiLCJyZW1vdmVNdWx0aXBsZVF1YW50aXRpZXMiLCJ4IiwiX3gkdXBzZWxsVHJpZ2dlcnMiLCJfeDMiLCJfeDQiLCJpbmRleCIsIl9saW5lX2l0ZW0kcHJvcGVydGllczMiLCJwb3B1cCIsImNvbmNhdCIsInBvcHVwX3RpdGxlIiwiaW1hZ2UiLCJyZXBsYWNlIiwicHJvZHVjdF90aXRsZSIsInZhcmlhbnRfdGl0bGUiLCJnaWZ0X2xhYmVsIiwiZG9jdW1lbnQiLCJib2R5IiwiaW5zZXJ0QWRqYWNlbnRIVE1MIiwicG9wdXBFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInNldEF0dHJpYnV0ZSIsInBvcHVwRWxlbWVudENsb3NlQnRucyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJidG4iLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlIl0sInNvdXJjZVJvb3QiOiIifQ==
2743//# sourceURL=webpack-internal:///./src/scripts/lib/upsell-gift.js
2744
2745}`)},"./src/scripts/lib/utility-functions.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
2746/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2747/* harmony export */   awaitVendorScript: () => (/* binding */ awaitVendorScript),
2748/* harmony export */   clear: () => (/* binding */ clear),
2749/* harmony export */   clearInputs: () => (/* binding */ clearInputs),
2750/* harmony export */   compare: () => (/* binding */ compare),
2751/* harmony export */   debounce: () => (/* binding */ debounce),
2752/* harmony export */   disableBtn: () => (/* binding */ disableBtn),
2753/* harmony export */   enableBtn: () => (/* binding */ enableBtn),
2754/* harmony export */   fixRoot: () =>
vendor: 5,605 bytes, lines 2754-2781
2754 (/* binding */ fixRoot),
2755/* harmony export */   getCookie: () => (/* binding */ getCookie),
2756/* harmony export */   loadChatBotScript: () => (/* binding */ loadChatBotScript),
2757/* harmony export */   loopify: () => (/* binding */ loopify),
2758/* harmony export */   repaint: () => (/* binding */ repaint),
2759/* harmony export */   setCookie: () => (/* binding */ setCookie),
2760/* harmony export */   smoothScroll: () => (/* binding */ smoothScroll),
2761/* harmony export */   sortAlphabetically: () => (/* binding */ sortAlphabetically),
2762/* harmony export */   sortByArray: () => (/* binding */ sortByArray),
2763/* harmony export */   toggleBtn: () => (/* binding */ toggleBtn),
2764/* harmony export */   toggleDisplay: () => (/* binding */ toggleDisplay),
2765/* harmony export */   unfixRoot: () => (/* binding */ unfixRoot),
2766/* harmony export */   wrapIFrames: () => (/* binding */ wrapIFrames),
2767/* harmony export */   zelektor: () => (/* binding */ zelektor)
2768/* harmony export */ });
2769/* harmony import */ var _lib_load_script__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/load-script */ "./src/scripts/lib/load-script.js");
2770/* harmony import */ var tinkerbell__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tinkerbell */ "./node_modules/.pnpm/[email protected]/node_modules/tinkerbell/dist/tinkerbell.es.js");
2771function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
2772function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
2773function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
2774function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
2775
2776
2777/*******************************************************************************************************************************************/
2778/* Await Vendor Script
2779/*******************************************************************************************************************************************/
2780function awaitVendorScript(name, callback, comp) {
2781  var done = false;
2782  if (window.vendorScriptsLoaded) {
2783    done = true;
2784    callback();
2785  } else {
2786    app.on('script:loaded', function (state, script) {
2787      if (script === name) {
2788        done = true;
2789        callback();
2790      }
2791    });
2792    app.on('scripts:allLoaded', function () {
2793      if (!done) callback();
2794    });
2795  }
2796}
2797
2798/*******************************************************************************************************************************************
2799* Zelektor
2800*******************************************************************************************************************************************/
2801function zelektor() {
2802  var container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.body;
2803  var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'js-';
2804  var elements = [].slice.call(container.querySelectorAll("[class*=\\"".concat(prefix, "\\"]")));
2805  return elements.reduce(function (res, el) {
2806    [].slice.call(el.classList).forEach(function (className) {
2807      if (className.slice(0, prefix.length) === prefix) {
2808        var key = className.slice(prefix.length, className.length);
2809        res[key] = res.hasOwnProperty(key) ? res[key].constructor === Array ? res[key].concat(el) : [res[key], el] : el;
2810      }
2811    });
2812    return res;
2813  }, {});
2814}
2815
2816/*******************************************************************************************************************************************
2817* Loopify
2818********************************************************************************************************************************************/
2819function loopify(el) {
2820  return el ? [].concat(el) : [];
2821}
2822
2823/*******************************************************************************************************************************************
2824* Sort Alphabetically
2825*******************************************************************************************************************************************/
2826function sortAlphabetically(items) {
2827  return items.sort(function (a, b) {
2828    if (a.title.toLowerCase() < b.title.toLowerCase()) return -1;
2829    if (a.title.toLowerCase() > b.title.toLowerCase()) return 1;
2830    return 0;
2831  });
2832}
2833
2834/**
2835 * Sort by array
2836 */
2837var sortByArray = function sortByArray(array, orderArray) {
2838  var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
2839  return array.sort(function (a, b) {
2840    var A = a[key] || a;
2841    var B = b[key] || b;
2842    if (orderArray.includes(A) && orderArray.includes(B)) {
2843      if (orderArray.indexOf(A) > orderArray.indexOf(B)) return 1;
2844      if (orderArray.indexOf(A) < orderArray.indexOf(B)) return -1;
2845      return 0;
2846    }
2847    if (!orderArray.includes(A) && orderArray.includes(B)) return 1;
2848    if (orderArray.includes(A) && !orderArray.includes(B)) return -1;
2849    return 0;
2850  });
2851};
2852
2853/*******************************************************************************************************************************************
2854* Compare
2855*******************************************************************************************************************************************/
2856function compare(a, b, num) {
2857  var comparison = 0;
2858  if (a > b) comparison = 1;else if (a < b) comparison = -1;
2859  return comparison * num;
2860}
2861
2862/*******************************************************************************************************************************************
2863* Smooth Scroll
2864*******************************************************************************************************************************************/
2865
2866function smoothScroll(target) {
2867  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2868  function getOffset(node) {
2869    return node.getBoundingClientRect().top + (options.element ? options.element.scrollTop : window.pageYOffset);
2870  }
2871  if (!target) return;
2872  var end = getOffset(target) + (options.offset || 0);
2873  var duration = options.duration || 500;
2874  var element = options.element || window;
2875  return duration ? (0,tinkerbell__WEBPACK_IMPORTED_MODULE_1__["default"])(!options.element || options.element === window ? element.pageYOffset : element.scrollTop, end, duration, function (t, b, c, d) {
2876    if ((t /= d / 2) < 1) return c / 2 * t * t + b;
2877    return -c / 2 * (--t * (t - 2) - 1) + b;
2878  })(function (p) {
2879    return element.scrollTo(options.horizontal ? p : 0, !options.horizontal ? p : 0);
2880  }) : element.scrollTo(0, end);
2881}
2882
2883/*******************************************************************************************************************************************
2884* Toggle Display
2885*******************************************************************************************************************************************/
2886function toggleDisplay(el) {
2887  el.style.display === 'none' ? el.style.display = '' : el.style.display = 'none';
2888}
2889
2890/*******************************************************************************************************************************************
2891* Button Functions
2892*******************************************************************************************************************************************/
2893function toggleBtn(btn, isDisabled, text, textElSelector) {
2894  isDisabled ? disableBtn(btn) : enableBtn(btn);
2895  if (text && textElSelector) {
2896    btn.querySelector(textElSelector).innerText = text;
2897    return;
2898  }
2899  if (text) btn.innerText = text;
2900}
2901function disableBtn(btn) {
2902  btn.disabled = true;
2903  btn.classList.add('is-disabled');
2904}
2905function enableBtn(btn) {
2906  btn.disabled = false;
2907  btn.classList.remove('is-disabled');
2908}
2909
2910/*******************************************************************************************************************************************
2911* Cookie Functions
2912*******************************************************************************************************************************************/
2913function setCookie(name, val, days) {
2914  var expires = '';
2915  if (days) {
2916    var date = new Date();
2917    date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
2918    expires = date.toUTCString();
2919  }
2920  document.cookie = "".concat(name, "=").concat(val || '', "; expires=").concat(expires, "; path=/");
2921}
2922function getCookie(name) {
2923  var nameEq = "".concat(name, "=");
2924  var ca = document.cookie.split(';');
2925  for (var i = 0; i < ca.length; i++) {
2926    var c = ca[i];
2927    while (c.charAt(0) === ' ') c = c.substring(1, c.length);
2928    if (c.indexOf(nameEq) === 0) return c.substring(nameEq.length, c.length);
2929  }
2930  return null;
2931}
2932
2933/*******************************************************************************************************************************************
2934* Clear Inputs
2935*******************************************************************************************************************************************/
2936function clearInputs(parent) {
2937  parent.querySelectorAll('input').forEach(function (i) {
2938    i.val = '';
2939  });
2940  parent.querySelectorAll('select').forEach(function (s) {
2941    if (s.options[0]) s.val = s.options[0].val;
2942  });
2943}
2944
2945/*******************************************************************************************************************************************/
2946/* Wrap Iframes
2947/*******************************************************************************************************************************************/
2948function wrapIFrames(container) {
2949  var iframes = container.querySelectorAll('iframe');
2950  if (!iframes.length) return;
2951  iframes.forEach(function (iframe) {
2952    var outerWrapper = document.createElement('div');
2953    var wrapper = document.createElement('div');
2954    wrapper.classList.add('iframe-wrapper');
2955    if (iframe.src.includes('youtube') || iframe.src.includes('vimeo')) {
2956      wrapper.classList.add('iframe-wrapper--aspect');
2957      var paddingTop = 56.25;
2958      if (iframe.width && iframe.height) {
2959        paddingTop = parseInt(iframe.height) / parseInt(iframe.width) * 100;
2960      }
2961      wrapper.style.paddingTop = "".concat(paddingTop, "%");
2962    }
2963    if (iframe.src.includes('pinterest')) {
2964      outerWrapper.style.maxWidth = '350px';
2965      outerWrapper.style.margin = 'auto';
2966    }
2967    outerWrapper.appendChild(wrapper);
2968    iframe.parentElement.insertBefore(outerWrapper, iframe);
2969    wrapper.appendChild(iframe);
2970
2971    // If consent text, put that inside wrapper too
2972    var nextSibling = outerWrapper.nextElementSibling;
2973    if (nextSibling !== null && nextSibling !== void 0 && nextSibling.classList.contains('iframe-consent-text')) {
2974      outerWrapper.appendChild(nextSibling);
2975    }
2976  });
2977}
2978
2979/*******************************************************************************************************************************************/
2980/* Fix / Unfix Root
2981/*******************************************************************************************************************************************/
2982function fixRoot() {
2983  document.documentElement.style.overflow = 'hidden';
2984
2985  // OLD SOLUTION
2986  // const docEl = document.documentElement
2987  // const scrollPos =   docEl.style.top && docEl.style.top != ''
2988  //                     ? parseInt(docEl.style.top.replace('-', '').replace('px', ''))
2989  //                     : window.scrollY
2990
2991  // docEl.style.position = 'fixed'
2992  // docEl.style.top = \`-\${scrollPos}px\`
2993  // docEl.style.width = '100%'
2994  // docEl.style.overflowY = 'scroll'
2995  // docEl.dataset.scrollPos = scrollPos
2996}
2997function unfixRoot() {
2998  document.documentElement.style.overflow = '';
2999
3000  // OLD SOLUTION
3001  // const docEl = document.documentElement
3002
3003  // docEl.style.position = ''
3004  // docEl.style.top = ''
3005  // docEl.style.width = ''
3006  // docEl.style.overflowY = ''
3007
3008  // const { scrollPos } = docEl.dataset
3009  // window.scrollTo(0, scrollPos)
3010}
3011
3012/*******************************************************************************************************************************************/
3013/* Debounce
3014/*******************************************************************************************************************************************/
3015function debounce(func) {
3016  var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;
3017  var inDebounce;
3018  return function () {
3019    var context = this;
3020    var args = arguments;
3021    clearTimeout(inDebounce);
3022    inDebounce = setTimeout(function () {
3023      return func.apply(context, args);
3024    }, delay);
3025  };
3026}
3027
3028/**
3029 * Repaint node
3030 * @param {HTML element} node
3031 */
3032var repaint = function repaint(node) {
3033  void node.offsetHeight;
3034};
3035var clear = function clear(node) {
3036  while (node.firstChild) {
3037    node.removeChild(node.firstChild);
3038  }
3039};
3040var loadChatBotScript = /*#__PURE__*/function () {
3041  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
3042    var _window$theme;
3043    return _regenerator().w(function (_context) {
3044      while (1) switch (_context.n) {
3045        case 0:
3046          if ((_window$theme = window.theme) !== null && _window$theme !== void 0 && (_window$theme = _window$theme.chatbot) !== null && _window$theme !== void 0 && _window$theme.id) {
3047            _context.n = 1;
3048            break;
3049          }
3050          console.error('Chatbot missing ID from theme settings');
3051          return _context.a(2);
3052        case 1:
3053          ;
3054          (0,_lib_load_script__WEBPACK_IMPORTED_MODULE_0__["default"])(('https:' == document.location.protocol ? 'https://' : 'http://') + 'cdn.chatbot.com/widget/plugin.js');
3055        case 2:
3056          return _context.a(2);
3057      }
3058    }, _callee);
3059  }));
3060  return function loadChatBotScript() {
3061    return _ref.apply(this, arguments);
3062  };
3063}();//# sourceURL=[module]
3064//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvdXRpbGl0eS1mdW5jdGlvbnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9B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FBQUEsQ0FBY0csT0FBTyxjQUFBSCxhQUFBLGVBQXJCQSxhQUFBLENBQXVCSSxFQUFFO1lBQUFILFFBQUEsQ0FBQTVMLENBQUE7WUFBQTtVQUFBO1VBQzVCZ00sT0FBTyxDQUFDQyxLQUFLLENBQUMsd0NBQXdDLENBQUM7VUFBQSxPQUFBTCxRQUFBLENBQUEzSyxDQUFBO1FBQUE7VUFFeEQ7VUFFRGlDLDREQUFVLENBQUMsQ0FBQyxRQUFRLElBQUljLFFBQVEsQ0FBQ2tJLFFBQVEsQ0FBQ0MsUUFBUSxHQUFHLFVBQVUsR0FBRyxTQUFTLElBQUksa0NBQWtDLENBQUM7UUFBQztVQUFBLE9BQUFQLFFBQUEsQ0FBQTNLLENBQUE7TUFBQTtJQUFBLEdBQUF5SyxPQUFBO0VBQUEsQ0FDcEg7RUFBQSxnQkFQWUYsaUJBQWlCQSxDQUFBO0lBQUEsT0FBQUMsSUFBQSxDQUFBMUksS0FBQSxPQUFBRCxTQUFBO0VBQUE7QUFBQSxHQU83QiIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2xpYi91dGlsaXR5LWZ1bmN0aW9ucy5qcz9mYTg4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2FkU2NyaXB0IGZyb20gJ0AvbGliL2xvYWQtc2NyaXB0J1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIEF3YWl
30640IFZlbmRvciBTY3JpcHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIGF3YWl0VmVuZG9yU2NyaXB0KG5hbWUsIGNhbGxiYWNrLCBjb21wKSB7XG4gICAgbGV0IGRvbmUgPSBmYWxzZVxuXG4gICAgaWYgKHdpbmRvdy52ZW5kb3JTY3JpcHRzTG9hZGVkKSB7XG4gICAgICAgIGRvbmUgPSB0cnVlXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcHAub24oJ3NjcmlwdDpsb2FkZWQnLCAoc3RhdGUsIHNjcmlwdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjcmlwdCA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGFwcC5vbignc2NyaXB0czphbGxMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRvbmUpIGNhbGxiYWNrKClcbiAgICAgICAgfSlcbiAgICB9XG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiogWmVsZWt0b3JcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gemVsZWt0b3IoY29udGFpbmVyID0gZG9jdW1lbnQuYm9keSwgcHJlZml4ID0gJ2pzLScpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IFtdLnNsaWNlLmNhbGwoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoYFtjbGFzcyo9XCIke3ByZWZpeH1cIl1gKSlcblxuXHRyZXR1cm4gZWxlbWVudHMucmVkdWNlKChyZXMsIGVsKSA9PiB7XG5cdFx0W10uc2xpY2UuY2FsbChlbC5jbGFzc0xpc3QpLmZvckVhY2goY2xhc3NOYW1lID0+IHtcblx0XHRcdGlmIChjbGFzc05hbWUuc2xpY2UoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeCkge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBjbGFzc05hbWUuc2xpY2UocHJlZml4Lmxlbmd0aCwgY2xhc3NOYW1lLmxlbmd0aClcblxuXHRcdFx0XHRyZXNba2V5XSA9IHJlcy5oYXNPd25Qcm9wZXJ0eShrZXkpID9cblx0XHRcdFx0XHRyZXNba2V5XS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgP1xuXHRcdFx0XHRcdHJlc1trZXldLmNvbmNhdChlbCkgOlxuXHRcdFx0XHRcdFtyZXNba2V5XSwgZWxdXG5cdFx0XHRcdDogZWxcblx0XHRcdH1cbiAgICAgICAgfSlcblxuXHRcdHJldHVybiByZXNcblx0fSwge30pXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiogTG9vcGlmeVxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gbG9vcGlmeShlbCkge1xuICAgIHJldHVybiBlbCA/IFtdLmNvbmNhdChlbCkgOiBbXVxufVxuXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIFNvcnQgQWxwaGFiZXRpY2FsbHlcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gc29ydEFscGhhYmV0aWNhbGx5KGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGEudGl0bGUudG9Mb3dlckNhc2UoKSA8IGIudGl0bGUudG9Mb3dlckNhc2UoKSkgcmV0dXJuIC0xXG4gICAgICAgIGlmIChhLnRpdGxlLnRvTG93ZXJDYXNlKCkgPiBiLnRpdGxlLnRvTG93ZXJDYXNlKCkpIHJldHVybiAxXG4gICAgICAgIHJldHVybiAwXG4gICAgfSlcbn1cblxuXG4vKipcbiAqIFNvcnQgYnkgYXJyYXlcbiAqL1xuZXhwb3J0IGNvbnN0IHNvcnRCeUFycmF5ID0gKGFycmF5LCBvcmRlckFycmF5LCBrZXkgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIGFycmF5LnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBBID0gYVtrZXldIHx8IGE7XG4gICAgY29uc3QgQiA9IGJba2V5XSB8fCBiO1xuXG4gICAgaWYgKG9yZGVyQXJyYXkuaW5jbHVkZXMoQSkgJiYgb3JkZXJBcnJheS5pbmNsdWRlcyhCKSkge1xuICAgICAgICBpZiAob3JkZXJBcnJheS5pbmRleE9mKEEpID4gb3JkZXJBcnJheS5pbmRleE9mKEIpKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKG9yZGVyQXJyYXkuaW5kZXhPZihBKSA8IG9yZGVyQXJyYXkuaW5kZXhPZihCKSkgcmV0dXJuIC0xO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoIW9yZGVyQXJyYXkuaW5jbHVkZXMoQSkgJiYgb3JkZXJBcnJheS5pbmNsdWRlcyhCKSkgcmV0dXJuIDE7XG4gICAgaWYgKG9yZGVyQXJyYXkuaW5jbHVkZXMoQSkgJiYgIW9yZGVyQXJyYXkuaW5jbHVkZXMoQikpIHJldHVybiAtMTtcblxuICAgIHJldHVybiAwO1xuICB9KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiogQ29tcGFyZVxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlKGEsIGIsIG51bSkge1xuICAgIGxldCBjb21wYXJpc29uID0gMFxuXG4gICAgaWYgKGEgPiBiKVxuICAgICAgICBjb21wYXJpc29uID0gMVxuICAgIGVsc2UgaWYgKCBh
3064IDwgYiApXG4gICAgICAgIGNvbXBhcmlzb24gPSAtMVxuXG4gICAgcmV0dXJuIGNvbXBhcmlzb24gKiBudW1cbn1cblxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiBTbW9vdGggU2Nyb2xsXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuaW1wb3J0IHRpbmtlcmJlbGwgZnJvbSAndGlua2VyYmVsbCdcbmV4cG9ydCBmdW5jdGlvbiBzbW9vdGhTY3JvbGwodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgICBmdW5jdGlvbiBnZXRPZmZzZXQobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyAob3B0aW9ucy5lbGVtZW50ID8gb3B0aW9ucy5lbGVtZW50LnNjcm9sbFRvcCA6IHdpbmRvdy5wYWdlWU9mZnNldClcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuXG5cbiAgICBjb25zdCBlbmQgPSBnZXRPZmZzZXQodGFyZ2V0KSArIChvcHRpb25zLm9mZnNldCB8fCAwKVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uIHx8IDUwMFxuICAgIGNvbnN0IGVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQgfHwgd2luZG93XG5cbiAgICByZXR1cm4gZHVyYXRpb24gPyAoXG4gICAgICAgIHRpbmtlcmJlbGwoIW9wdGlvbnMuZWxlbWVudCB8fCBvcHRpb25zLmVsZW1lbnQgPT09IHdpbmRvdyA/IGVsZW1lbnQucGFnZVlPZmZzZXQgOiBlbGVtZW50LnNjcm9sbFRvcCwgZW5kLCBkdXJhdGlvbiwgKHQsIGIsIGMsIGQpID0+IHtcbiAgICAgICAgaWYgKCh0IC89IGQgLyAyKSA8IDEpIHJldHVybiBjIC8gMiAqIHQgKiB0ICsgYlxuICAgICAgICByZXR1cm4gLWMgLyAyICogKCgtLXQpICogKHQgLSAyKSAtIDEpICsgYlxuICAgICAgICB9KShwID0+IGVsZW1lbnQuc2Nyb2xsVG8ob3B0aW9ucy5ob3Jpem9udGFsID8gcCA6IDAsICFvcHRpb25zLmhvcml6b250YWwgPyBwIDogMCkpXG4gICAgKSA6IChcbiAgICAgICAgZWxlbWVudC5zY3JvbGxUbygwLCBlbmQpXG4gICAgKVxufVxuXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIFRvZ2dsZSBEaXNwbGF5XG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZURpc3BsYXkoZWwpIHtcbiAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgP1xuICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnJyA6XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xufVxuXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIEJ1dHRvbiBGdW5jdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlQnRuKGJ0biwgaXNEaXNhYmxlZCwgdGV4dCwgdGV4dEVsU2VsZWN0b3IpIHtcbiAgICBpc0Rpc2FibGVkXG4gICAgPyBkaXNhYmxlQnRuKGJ0bilcbiAgICA6IGVuYWJsZUJ0bihidG4pXG5cbiAgICBpZiAodGV4dCAmJiB0ZXh0RWxTZWxlY3Rvcil7XG4gICAgICAgIGJ0bi5xdWVyeVNlbGVjdG9yKHRleHRFbFNlbGVjdG9yKS5pbm5lclRleHQgPSB0ZXh0XG4gICAgICAgIHJldHVyblxuICAgI
3064H1cblxuXHRpZiAodGV4dCkgYnRuLmlubmVyVGV4dCA9IHRleHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVCdG4oYnRuKSB7XG5cdGJ0bi5kaXNhYmxlZCA9IHRydWVcblx0YnRuLmNsYXNzTGlzdC5hZGQoJ2lzLWRpc2FibGVkJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUJ0bihidG4pIHtcblx0YnRuLmRpc2FibGVkID0gZmFsc2Vcblx0YnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRpc2FibGVkJylcbn1cblxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiBDb29raWUgRnVuY3Rpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZShuYW1lLCB2YWwsIGRheXMpIHtcbiAgICBsZXQgZXhwaXJlcyA9ICcnXG4gICAgaWYgKGRheXMpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAoZGF5cyoyNCo2MCo2MCoxMDAwKSlcbiAgICAgICAgZXhwaXJlcyA9IGRhdGUudG9VVENTdHJpbmcoKVxuICAgIH1cbiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtuYW1lfT0ke3ZhbCB8fCAnJ307IGV4cGlyZXM9JHtleHBpcmVzfTsgcGF0aD0vYFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHtcbiAgICBjb25zdCBuYW1lRXEgPSBgJHtuYW1lfT1gXG4gICAgdmFyIGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7JylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjID0gY2FbaV1cbiAgICAgICAgd2hpbGUgKGMuY2hhckF0KDApID09PSAnICcpIGMgPSBjLnN1YnN0cmluZygxLCBjLmxlbmd0aClcbiAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lRXEpID09PSAwKSByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVxLmxlbmd0aCwgYy5sZW5ndGgpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiogQ2xlYXIgSW5wdXRzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFySW5wdXRzKHBhcmVudCkge1xuICAgIHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpLmZvckVhY2goaSA9PiB7XG4gICAgICAgIGkudmFsID0gJydcbiAgICB9KVxuXG4gICAgcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCcpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIGlmIChzLm9wdGlvbnNbMF0pIHMudmFsID0gcy5vcHRpb25zWzBdLnZhbFxuICAgIH0pXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBXcmFwIElmcmFtZXNcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJRnJhbWVzKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGlmcmFtZXMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJylcbiAgICBpZiAoIWlmcmFtZXMubGVuZ3RoKSByZXR1cm5cblxuICAgIGlmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgICBjb25zdCBvdXRlcldyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdpZnJhbWUtd3JhcHBlcicpXG5cbiAgICAgICAgaWYgKGlmcmFtZS5zcmMuaW5jbHVkZXMoJ3lvdXR1YmUnKSB8fCBpZnJhbWUuc3JjLmluY2x1ZGVzKCd2aW1lbycpKSB7XG4gICAgICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2lmcmFtZS13cmFwcGVyLS1hc3BlY3QnKVxuICAgICAgICAgICAgbGV0IHBhZGRpbmdUb3AgPSA1Ni4yNVxuXG4gICAgICAgICAgICBpZiAoaWZyYW1lLndpZHRoICYmIGlmcmFtZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wID0gcGFyc2VJbnQoaWZyYW1lLmhlaWdodCkgLyBwYXJzZUludChpZnJhbWUud2lkdGgpICogMTAwXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdyYXBwZXIuc3R5bGUucGFkZGluZ1RvcCA9IGAke3BhZGRpbmdUb3B9JWBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZnJhbWUuc3JjLmluY2x1ZGVzKCdwaW50ZXJlc3QnKSkge1xuICAgICAgICAgICAgb3V0ZXJXcmFwcGVyLnN0eWxlLm1heFdpZHRoID0gJzM1MHB4J1xuICAgICAgICAgICAgb3V0ZXJXcmFwcGVyLnN0eWxlLm1hcmdpbiA9ICdhdXRvJ1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ZXJXcmFwcGVyLmFwcGVuZENoaWxkKHdyYXBwZXIpXG4gICAgICAgIGlmcmFtZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShvdXRlcldyYXBwZXIsIGlmcmFtZSlcblxuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGlmcmFtZSlcblxuICAgICAgICAvLyBJZiBjb25zZW50IHRleHQsIHB1dCB0aGF0IGluc2lkZSB3cmFwcGVyIHRvb1xuICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG91dGVyV3JhcHBlci5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICAgICAgaWYgKG5leHRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2lmcmFtZS1jb25zZW50LXRleHQnKSkge1xuICAgICAgICAgICAgb3V0ZXJXcmFwcGVyLmFwcGVuZENoaWxkKG5leHRTaWJsaW5nKVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIEZpeCAvIFVuZml4IFJvb3Rcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpeFJvb3QoKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAvLyBPTEQgU09MVVRJT05cbiAgICAvLyBjb25zdCBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgIC8vIGNvbnN0IHNjcm9sbFBvcyA9ICAgZG9jRWwuc3R5bGUudG9wICYmIGRvY0VsLnN0eWxlLnRvcCAhPSAnJ1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChkb2NFbC5zdHlsZS50b3AucmVwbGFjZSgnLScsICcnKS5yZXBsYWNlKCdweCcsICcnKSlcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIDogd2luZG93LnNjcm9sbFlcblxuICAgIC8vIGRvY0VsLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJ1xuICAgIC8vIGRvY0VsLnN0eWxlLnRvcCA9IGAtJHtzY3JvbGxQb3N9cHhgXG4gICAgLy8gZG9jRWwuc3R5bGUud2lkdGggPSAnMTAwJS
3064dcbiAgICAvLyBkb2NFbC5zdHlsZS5vdmVyZmxvd1kgPSAnc2Nyb2xsJ1xuICAgIC8vIGRvY0VsLmRhdGFzZXQuc2Nyb2xsUG9zID0gc2Nyb2xsUG9zXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmZpeFJvb3QoKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJyc7XG5cbiAgICAvLyBPTEQgU09MVVRJT05cbiAgICAvLyBjb25zdCBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuXG4gICAgLy8gZG9jRWwuc3R5bGUucG9zaXRpb24gPSAnJ1xuICAgIC8vIGRvY0VsLnN0eWxlLnRvcCA9ICcnXG4gICAgLy8gZG9jRWwuc3R5bGUud2lkdGggPSAnJ1xuICAgIC8vIGRvY0VsLnN0eWxlLm92ZXJmbG93WSA9ICcnXG5cbiAgICAvLyBjb25zdCB7IHNjcm9sbFBvcyB9ID0gZG9jRWwuZGF0YXNldFxuICAgIC8vIHdpbmRvdy5zY3JvbGxUbygwLCBzY3JvbGxQb3MpXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBEZWJvdW5jZVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgZGVsYXkgPSAxMDApIHtcbiAgICBsZXQgaW5EZWJvdW5jZVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXNcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHNcbiAgICAgIGNsZWFyVGltZW91dChpbkRlYm91bmNlKVxuICAgICAgaW5EZWJvdW5jZSA9IHNldFRpbWVvdXQoKCkgPT4gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKSwgZGVsYXkpXG4gICAgfVxufVxuXG4vKipcbiAqIFJlcGFpbnQgbm9kZVxuICogQHBhcmFtIHtIVE1MIGVsZW1lbnR9IG5vZGVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGFpbnQgPSAobm9kZSkgPT4ge1xuICAgIHZvaWQgKG5vZGUub2Zmc2V0SGVpZ2h0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbGVhciA9IChub2RlKSA9PiB7XG4gIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsb2FkQ2hhdEJvdFNjcmlwdCA9IGFzeW5jICgpID0+IHtcbiAgaWYgKCF3aW5kb3cudGhlbWU/LmNoYXRib3Q/LmlkKSB7XG4gICAgY29uc29sZS5lcnJvcignQ2hhdGJvdCBtaXNzaW5nIElEIGZyb20gdGhlbWUgc2V0dGluZ3MnKVxuICAgIHJldHVybjtcbiAgfTtcblxuICBsb2FkU2NyaXB0KCgnaHR0cHM6JyA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCA/ICdodHRwczovLycgOiAnaHR0cDovLycpICsgJ2Nkbi5jaGF0Ym90LmNvbS93aWRnZXQvcGx1Z2luLmpzJyk7XG59O1xuIl0sIm5hbWVzIjpbImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsIm8iLCJ0b1N0cmluZ1RhZyIsImkiLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsImNyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwicCIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJjYWxsIiwiZG9uZSIsInZhbHVlIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsIl9yZWdlbmVyYXRvciIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwibG9hZFNjcmlwdCIsImF3YWl0VmVuZG9yU2NyaXB0IiwibmFtZSIsImNhbGxiYWNrIiwiY29tcCIsIndpbmRvdyIsInZlbmRvclNjcmlwdHNMb2FkZWQiLCJhcHAiLCJvbiIsInN0YXRlIiwic2NyaXB0IiwiemVsZWt0b3IiLCJjb250YWluZXIiLCJ1bmRlZmluZWQiLCJkb2N1bWVudCIsImJvZHkiLCJwcmVmaXgiLCJlbGVtZW50cyIsInNsaWNlIiwicXVlcnlTZWxlY3RvckFsbCIsImNvbmNhdCIsInJlZHVjZSIsInJlcyIsImVsIiwiY2xhc3NMaXN0IiwiZm9yRWFjaCIsImNsYXNzTmFtZSIsImtleSIsImhhc093blByb3BlcnR5IiwiY29uc3RydWN0b3IiLCJBcnJheSIsImxvb3BpZnkiLCJzb3J0QWxwaGFiZXRpY2FsbHkiLCJpdGVtcyIsInNvcnQiLCJiIiwidGl0bGUiLCJ0b0xvd2VyQ2FzZSIsInNvcnRCeUFycmF5IiwiYXJyYXkiLCJvcmRlckFycmF5IiwiQSIsIkIiLCJpbmNsdWRlcyIsImluZGV4T2YiLCJjb21wYXJlIiwibnVtIiwiY29tcGFyaXNvbiIsInRpbmtlcmJlbGwiLCJzbW9vdGhTY3JvbGwiLCJ0YXJnZXQiLCJvcHRpb25zIiwiZ2V0T2Zmc2V0Iiwibm9kZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRvcCIsImVsZW1lbnQiLCJzY3JvbGxUb3AiLCJwYWdlWU9mZnNldCIsImVuZCIsIm9mZnNldCIsImR1cmF0aW9uIiwic2Nyb2xsVG8iLCJob3Jpem9udGFsIiwidG9nZ2xlRGlzcGxheSIsInN0eWxlIiwiZGlzcGxheSIsInRvZ2dsZUJ0biIsImJ0biIsImlzRGlzYWJsZWQiLCJ0ZXh0IiwidGV4dEVsU2VsZWN0b3IiLCJkaXNhYmxlQnRuIiwiZW5hYmxlQnRuIiwicXVlcnlTZWxlY3RvciIsImlubmVyVGV4dCIsImRpc2FibGVkIiwiYWRkIiwicmVtb3ZlIiwic2V0Q29va2llIiwidmFsIiwiZGF5cyIsImV4cGlyZXMiLCJkYXRlIiwiRGF0ZSIsInNldFRpbWUiLCJnZXRUaW1lIiwidG9VVENTdHJpbmciLCJjb29raWUiLCJnZXRDb29raWUiLCJuYW1lRXEiLCJjYSIsInNwbGl0IiwiY2hhckF0Iiwic3Vic3RyaW5nIiwiY2xlYXJJbnB1dHMiLCJwYXJlbnQiLCJzIiwid3JhcElGcmFtZXMiLCJpZnJhbWVzIiwiaWZyYW1lIiwib3V0ZXJXcmFwcGVyIiwiY3JlYXRlRWxlbWVudCIsIndyYXBwZXIiLCJzcmMiLCJwYWRkaW5nVG9wIiwid2lkdGgiLCJoZWlnaHQiLCJwYXJzZUludCIsIm1heFdpZHRoIiwibWFyZ2luIiwiYXBwZW5kQ2hpbGQiLCJwYXJlbnRFbGVtZW50IiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJ
vendor: 28,951 bytes, lines 3064-3730
3064jb250YWlucyIsImZpeFJvb3QiLCJkb2N1bWVudEVsZW1lbnQiLCJvdmVyZmxvdyIsInVuZml4Um9vdCIsImRlYm91bmNlIiwiZnVuYyIsImRlbGF5IiwiaW5EZWJvdW5jZSIsImNvbnRleHQiLCJhcmdzIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsInJlcGFpbnQiLCJvZmZzZXRIZWlnaHQiLCJjbGVhciIsImZpcnN0Q2hpbGQiLCJyZW1vdmVDaGlsZCIsImxvYWRDaGF0Qm90U2NyaXB0IiwiX3JlZiIsIl9jYWxsZWUiLCJfd2luZG93JHRoZW1lIiwiX2NvbnRleHQiLCJ0aGVtZSIsImNoYXRib3QiLCJpZCIsImNvbnNvbGUiLCJlcnJvciIsImxvY2F0aW9uIiwicHJvdG9jb2wiXSwic291cmNlUm9vdCI6IiJ9
3065//# sourceURL=webpack-internal:///./src/scripts/lib/utility-functions.js
3066
3067}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/CSSPlugin.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
3068/* harmony export */ __webpack_require__.d(__webpack_exports__, {
3069/* harmony export */   CSSPlugin: () => (/* binding */ CSSPlugin),
3070/* harmony export */   _createElement: () => (/* binding */ _createElement),
3071/* harmony export */   _getBBox: () => (/* binding */ _getBBox),
3072/* harmony export */   checkPrefix: () => (/* binding */ _checkPropPrefix),
3073/* harmony export */   "default": () => (/* binding */ CSSPlugin)
3074/* harmony export */ });
3075/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/gsap-core.js");
3076/*!
3077 * CSSPlugin 3.15.0
3078 * https://gsap.com
3079 *
3080 * Copyright 2008-2026, GreenSock. All rights reserved.
3081 * Subject to the terms at https://gsap.com/standard-license
3082 * @author: Jack Doyle, [email protected]
3083*/
3084
3085/* eslint-disable */
3086
3087
3088var _win,
3089    _doc,
3090    _docElement,
3091    _pluginInitted,
3092    _tempDiv,
3093    _tempDivStyler,
3094    _recentSetterPlugin,
3095    _reverting,
3096    _windowExists = function _windowExists() {
3097  return typeof window !== "undefined";
3098},
3099    _transformProps = {},
3100    _RAD2DEG = 180 / Math.PI,
3101    _DEG2RAD = Math.PI / 180,
3102    _atan2 = Math.atan2,
3103    _bigNum = 1e8,
3104    _capsExp = /([A-Z])/g,
3105    _horizontalExp = /(left|right|width|margin|padding|x)/i,
3106    _complexExp = /[\\s,\\(]\\S/,
3107    _propertyAliases = {
3108  autoAlpha: "opacity,visibility",
3109  scale: "scaleX,scaleY",
3110  alpha: "opacity"
3111},
3112    _renderCSSProp = function _renderCSSProp(ratio, data) {
3113  return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);
3114},
3115    _renderPropWithEnd = function _renderPropWithEnd(ratio, data) {
3116  return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);
3117},
3118    _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) {
3119  return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);
3120},
3121    //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)
3122_renderCSSPropWithBeginningAndEnd = function _renderCSSPropWithBeginningAndEnd(ratio, data) {
3123  return data.set(data.t, data.p, ratio === 1 ? data.e : ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);
3124},
3125    //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)
3126_renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) {
3127  var value = data.s + data.c * ratio;
3128  data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data);
3129},
3130    _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) {
3131  return data.set(data.t, data.p, ratio ? data.e : data.b, data);
3132},
3133    _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) {
3134  return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data);
3135},
3136    _setterCSSStyle = function _setterCSSStyle(target, property, value) {
3137  return target.style[property] = value;
3138},
3139    _setterCSSProp = function _setterCSSProp(target, property, value) {
3140  return target.style.setProperty(property, value);
3141},
3142    _setterTransform = function _setterTransform(target, property, value) {
3143  return target._gsap[property] = value;
3144},
3145    _setterScale = function _setterScale(target, property, value) {
3146  return target._gsap.scaleX = target._gsap.scaleY = value;
3147},
3148    _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) {
3149  var cache = target._gsap;
3150  cache.scaleX = cache.scaleY = value;
3151  cache.renderTransform(ratio, cache);
3152},
3153    _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) {
3154  var cache = target._gsap;
3155  cache[property] = value;
3156  cache.renderTransform(ratio, cache);
3157},
3158    _transformProp = "transform",
3159    _transformOriginProp = _transformProp + "Origin",
3160    _saveStyle = function _saveStyle(property, isNotCSS) {
3161  var _this = this;
3162
3163  var target = this.target,
3164      style = target.style,
3165      cache = target._gsap;
3166
3167  if (property in _transformProps && style) {
3168    this.tfm = this.tfm || {};
3169
3170    if (property !== "transform") {
3171      property = _propertyAliases[property] || property;
3172      ~property.indexOf(",") ? property.split(",").forEach(function (a) {
3173        return _this.tfm[a] = _get(target, a);
3174      }) : this.tfm[property] = cache.x ? cache[property] : _get(target, property); // note: scale would map to "scaleX,scaleY", thus we loop and apply them both.
3175
3176      property === _transformOriginProp && (this.tfm.zOrigin = cache.zOrigin);
3177    } else {
3178      return _propertyAliases.transform.split(",").forEach(function (p) {
3179        return _saveStyle.call(_this, p, isNotCSS);
3180      });
3181    }
3182
3183    if (this.props.indexOf(_transformProp) >= 0) {
3184      return;
3185    }
3186
3187    if (cache.svg) {
3188      this.svgo = target.getAttribute("data-svg-origin");
3189      this.props.push(_transformOriginProp, isNotCSS, "");
3190    }
3191
3192    property = _transformProp;
3193  }
3194
3195  (style || isNotCSS) && this.props.push(property, isNotCSS, style[property]);
3196},
3197    _removeIndependentTransforms = function _removeIndependentTransforms(style) {
3198  if (style.translate) {
3199    style.removeProperty("translate");
3200    style.removeProperty("scale");
3201    style.removeProperty("rotate");
3202  }
3203},
3204    _revertStyle = function _revertStyle() {
3205  var props = this.props,
3206      target = this.target,
3207      style = target.style,
3208      cache = target._gsap,
3209      i,
3210      p;
3211
3212  for (i = 0; i < props.length; i += 3) {
3213    // stored like this: property, isNotCSS, value
3214    if (!props[i + 1]) {
3215      props[i + 2] ? style[props[i]] = props[i + 2] : style.removeProperty(props[i].substr(0, 2) === "--" ? props[i] : props[i].replace(_capsExp, "-$1").toLowerCase());
3216    } else if (props[i + 1] === 2) {
3217      // non-CSS value (function-based)
3218      target[props[i]](props[i + 2]);
3219    } else {
3220      // non-CSS value (not function-based)
3221      target[props[i]] = props[i + 2];
3222    }
3223  }
3224
3225  if (this.tfm) {
3226    for (p in this.tfm) {
3227      cache[p] = this.tfm[p];
3228    }
3229
3230    if (cache.svg) {
3231      cache.renderTransform();
3232      target.setAttribute("data-svg-origin", this.svgo || "");
3233    }
3234
3235    i = _reverting();
3236
3237    if ((!i || !i.isStart) && !style[_transformProp]) {
3238      _removeIndependentTransforms(style);
3239
3240      if (cache.zOrigin && style[_transformOriginProp]) {
3241        style[_transformOriginProp] += " " + cache.zOrigin + "px"; // since we're uncaching, we must put the zOrigin back into the transformOrigin so that we can pull it out accurately when we parse again. Otherwise, we'd lose the z portion of the origin since we extract it to protect from Safari bugs.
3242
3243        cache.zOrigin = 0;
3244        cache.renderTransform();
3245      }
3246
3247      cache.uncache = 1; // if it's a startAt that's being reverted in the _initTween() of the core, we don't need to uncache transforms. This is purely a performance optimization.
3248    }
3249  }
3250},
3251    _getStyleSaver = function _getStyleSaver(target, properties) {
3252  var saver = {
3253    target: target,
3254    props: [],
3255    revert: _revertStyle,
3256    save: _saveStyle
3257  };
3258  target._gsap || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.core.getCache(target); // just make sure there's a _gsap cache defined because we read from it in _saveStyle() and it's more efficient to just check it here once.
3259
3260  properties && target.style && target.nodeType && properties.split(",").forEach(function (p) {
3261    return saver.save(p);
3262  }); // make sure it's a DOM node too.
3263
3264  return saver;
3265},
3266    _supports3D,
3267    _createElement = function _createElement(type, ns) {
3268  var e = _doc.createElementNS ? _doc.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making "style" inaccessible.
3269
3270  return e && e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://gsap.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).
3271},
3272    _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) {
3273  var cs = getComputedStyle(target);
3274  return cs[property] || cs.getPropertyValue(property.replace(_capsExp, "-$1").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || ""; //css variables may not need caps swapped out for dashes and lowercase.
3275},
3276    _prefixes = "O,Moz,ms,Ms,Webkit".split(","),
3277    _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) {
3278  var e = element || _tempDiv,
3279      s = e.style,
3280      i = 5;
3281
3282  if (property in s && !preferPrefix) {
3283    return property;
3284  }
3285
3286  property = property.charAt(0).toUpperCase() + property.substr(1);
3287
3288  while (i-- && !(_prefixes[i] + property in s)) {}
3289
3290  return i < 0 ? null : (i === 3 ? "ms" : i >= 0 ? _prefixes[i] : "") + property;
3291},
3292    _initCore = function _initCore() {
3293  if (_windowExists() && window.document) {
3294    _win = window;
3295    _doc = _win.document;
3296    _docElement = _doc.documentElement;
3297    _tempDiv = _createElement("div") || {
3298      style: {}
3299    };
3300    _tempDivStyler = _createElement("div");
3301    _transformProp = _checkPropPrefix(_transformProp);
3302    _transformOriginProp = _transformProp + "Origin";
3303    _tempDiv.style.cssText = "border-width:0;line-height:0;position:absolute;padding:0"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets.
3304
3305    _supports3D = !!_checkPropPrefix("perspective");
3306    _reverting = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.core.reverting;
3307    _pluginInitted = 1;
3308  }
3309},
3310    _getReparentedCloneBBox = function _getReparentedCloneBBox(target) {
3311  //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it).
3312  var owner = target.ownerSVGElement,
3313      svg = _createElement("svg", owner && owner.getAttribute("xmlns") || "http://www.w3.org/2000/svg"),
3314      clone = target.cloneNode(true),
3315      bbox;
3316
3317  clone.style.display = "block";
3318  svg.appendChild(clone);
3319
3320  _docElement.appendChild(svg);
3321
3322  try {
3323    bbox = clone.getBBox();
3324  } catch (e) {}
3325
3326  svg.removeChild(clone);
3327
3328  _docElement.removeChild(svg);
3329
3330  return bbox;
3331},
3332    _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) {
3333  var i = attributesArray.length;
3334
3335  while (i--) {
3336    if (target.hasAttribute(attributesArray[i])) {
3337      return target.getAttribute(attributesArray[i]);
3338    }
3339  }
3340},
3341    _getBBox = function _getBBox(target) {
3342  var bounds, cloned;
3343
3344  try {
3345    bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118
3346  } catch (error) {
3347    bounds = _getReparentedCloneBBox(target);
3348    cloned = 1;
3349  }
3350
3351  bounds && (bounds.width || bounds.height) || cloned || (bounds = _getReparentedCloneBBox(target)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case.
3352
3353  return bounds && !bounds.width && !bounds.x && !bounds.y ? {
3354    x: +_getAttributeFallbacks(target, ["x", "cx", "x1"]) || 0,
3355    y: +_getAttributeFallbacks(target, ["y", "cy", "y1"]) || 0,
3356    width: 0,
3357    height: 0
3358  } : bounds;
3359},
3360    _isSVG = function _isSVG(e) {
3361  return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e));
3362},
3363    //reports if the element is an SVG on which getBBox() actually works
3364_removeProperty = function _removeProperty(target, property) {
3365  if (property) {
3366    var style = target.style,
3367        first2Chars;
3368
3369    if (property in _transformProps && property !== _transformOriginProp) {
3370      property = _transformProp;
3371    }
3372
3373    if (style.removeProperty) {
3374      first2Chars = property.substr(0, 2);
3375
3376      if (first2Chars === "ms" || property.substr(0, 6) === "webkit") {
3377        //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be "ms-transform" instead of "-ms-transform" for IE9, for example)
3378        property = "-" + property;
3379      }
3380
3381      style.removeProperty(first2Chars === "--" ? property : property.replace(_capsExp, "-$1").toLowerCase());
3382    } else {
3383      //note: old versions of IE use "removeAttribute()" instead of "removeProperty()"
3384      style.removeAttribute(property);
3385    }
3386  }
3387},
3388    _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) {
3389  var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue);
3390  plugin._pt = pt;
3391  pt.b = beginning;
3392  pt.e = end;
3393
3394  plugin._props.push(property);
3395
3396  return pt;
3397},
3398    _nonConvertibleUnits = {
3399  deg: 1,
3400  rad: 1,
3401  turn: 1
3402},
3403    _nonStandardLayouts = {
3404  grid: 1,
3405  flex: 1
3406},
3407    //takes a single value like 20px and converts it to the unit specified, like "%", returning only the numeric amount.
3408_convertToUnit = function _convertToUnit(target, property, value, unit) {
3409  var curValue = parseFloat(value) || 0,
3410      curUnit = (value + "").trim().substr((curValue + "").length) || "px",
3411      // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim()
3412  style = _tempDiv.style,
3413      horizontal = _horizontalExp.test(property),
3414      isRootSVG = target.tagName.toLowerCase() === "svg",
3415      measureProperty = (isRootSVG ? "client" : "offset") + (horizontal ? "Width" : "Height"),
3416      amount = 100,
3417      toPixels = unit === "px",
3418      toPercent = unit === "%",
3419      px,
3420      parent,
3421      cache,
3422      isSVG;
3423
3424  if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) {
3425    return curValue;
3426  }
3427
3428  curUnit !== "px" && !toPixels && (curValue = _convertToUnit(target, property, value, "px"));
3429  isSVG = target.getCTM && _isSVG(target);
3430
3431  if ((toPercent || curUnit === "%") && (_transformProps[property] || ~property.indexOf("adius"))) {
3432    px = isSVG ? target.getBBox()[horizontal ? "width" : "height"] : target[measureProperty];
3433    return (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(toPercent ? curValue / px * amount : curValue / 100 * px);
3434  }
3435
3436  style[horizontal ? "width" : "height"] = amount + (toPixels ? curUnit : unit);
3437  parent = unit !== "rem" && ~property.indexOf("adius") || unit === "em" && target.appendChild && !isRootSVG ? target : target.parentNode;
3438
3439  if (isSVG) {
3440    parent = (target.ownerSVGElement || {}).parentNode;
3441  }
3442
3443  if (!parent || parent === _doc || !parent.appendChild) {
3444    parent = _doc.body;
3445  }
3446
3447  cache = parent._gsap;
3448
3449  if (cache && toPercent && cache.width && horizontal && cache.time === _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._ticker.time && !cache.uncache) {
3450    return (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(curValue / cache.width * amount);
3451  } else {
3452    if (toPercent && (property === "height" || property === "width")) {
3453      // if we're dealing with width/height that's inside a container with padding and/or it's a flexbox/grid container, we must apply it to the target itself rather than the _tempDiv in order to ensure complete accuracy, factoring in the parent's padding.
3454      var v = target.style[property];
3455      target.style[property] = amount + unit;
3456      px = target[measureProperty];
3457      v ? target.style[property] = v : _removeProperty(target, property);
3458    } else {
3459      (toPercent || curUnit === "%") && !_nonStandardLayouts[_getComputedProperty(parent, "display")] && (style.position = _getComputedProperty(target, "position"));
3460      parent === target && (style.position = "static"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that.
3461
3462      parent.appendChild(_tempDiv);
3463      px = _tempDiv[measureProperty];
3464      parent.removeChild(_tempDiv);
3465      style.position = "absolute";
3466    }
3467
3468    if (horizontal && toPercent) {
3469      cache = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._getCache)(parent);
3470      cache.time = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._ticker.time;
3471      cache.width = parent[measureProperty];
3472    }
3473  }
3474
3475  return (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0);
3476},
3477    _get = function _get(target, property, unit, uncache) {
3478  var value;
3479  _pluginInitted || _initCore();
3480
3481  if (property in _propertyAliases && property !== "transform") {
3482    property = _propertyAliases[property];
3483
3484    if (~property.indexOf(",")) {
3485      property = property.split(",")[0];
3486    }
3487  }
3488
3489  if (_transformProps[property] && property !== "transform") {
3490    value = _parseTransform(target, uncache);
3491    value = property !== "transformOrigin" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + " " + value.zOrigin + "px";
3492  } else {
3493    value = target.style[property];
3494
3495    if (!value || value === "auto" || uncache || ~(value + "").indexOf("calc(")) {
3496      value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._getProperty)(target, property) || (property === "opacity" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like  borderTopLeftRadius
3497    }
3498  }
3499
3500  return unit && !~(value + "").trim().indexOf(" ") ? _convertToUnit(target, property, value, unit) + unit : value;
3501},
3502    _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) {
3503  // note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin.
3504  if (!start || start === "none") {
3505    // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style ("clipPath" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as "none" whereas WebkitClipPath reports accurately like "ellipse(100% 0% at 50% 0%)", so in this case we must SWITCH to using the prefixed property instead. See https://gsap.com/forums/topic/18310-clippath-doesnt-work-on-ios/
3506    var p = _checkPropPrefix(prop, target, 1),
3507        s = p && _getComputedProperty(target, p, 1);
3508
3509    if (s && s !== start) {
3510      prop = p;
3511      start = s;
3512    } else if (prop === "borderColor") {
3513      start = _getComputedProperty(target, "borderTopColor"); // Firefox bug: always reports "borderColor" as "", so we must fall back to borderTopColor. See https://gsap.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/
3514    }
3515  }
3516
3517  var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(this._pt, target.style, prop, 0, 1, _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._renderComplexString),
3518      index = 0,
3519      matchIndex = 0,
3520      a,
3521      result,
3522      startValues,
3523      startNum,
3524      color,
3525      startValue,
3526      endValue,
3527      endNum,
3528      chunk,
3529      endUnit,
3530      startUnit,
3531      endValues;
3532  pt.b = start;
3533  pt.e = end;
3534  start += ""; // ensure values are strings
3535
3536  end += "";
3537
3538  if (end.substring(0, 6) === "var(--") {
3539    end = _getComputedProperty(target, end.substring(4, end.indexOf(")")));
3540  }
3541
3542  if (end === "auto") {
3543    startValue = target.style[prop];
3544    target.style[prop] = end;
3545    end = _getComputedProperty(target, prop) || end;
3546    startValue ? target.style[prop] = startValue : _removeProperty(target, prop);
3547  }
3548
3549  a = [start, end];
3550
3551  (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._colorStringFilter)(a); // pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow().
3552
3553
3554  start = a[0];
3555  end = a[1];
3556  startValues = start.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numWithUnitExp) || [];
3557  endValues = end.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numWithUnitExp) || [];
3558
3559  if (endValues.length) {
3560    while (result = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numWithUnitExp.exec(end)) {
3561      endValue = result[0];
3562      chunk = end.substring(index, result.index);
3563
3564      if (color) {
3565        color = (color + 1) % 5;
3566      } else if (chunk.substr(-5) === "rgba(" || chunk.substr(-5) === "hsla(") {
3567        color = 1;
3568      }
3569
3570      if (endValue !== (startValue = startValues[matchIndex++] || "")) {
3571        startNum = parseFloat(startValue) || 0;
3572        startUnit = startValue.substr((startNum + "").length);
3573        endValue.charAt(1) === "=" && (endValue = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._parseRelative)(startNum, endValue) + startUnit);
3574        endNum = parseFloat(endValue);
3575        endUnit = endValue.substr((endNum + "").length);
3576        index = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numWithUnitExp.lastIndex - endUnit.length;
3577
3578        if (!endUnit) {
3579          //if something like "perspective:300" is passed in and we must add a unit to the end
3580          endUnit = endUnit || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[prop] || startUnit;
3581
3582          if (index === end.length) {
3583            end += endUnit;
3584            pt.e += endUnit;
3585          }
3586        }
3587
3588        if (startUnit !== endUnit) {
3589          startNum = _convertToUnit(target, prop, startValue, endUnit) || 0;
3590        } // these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.
3591
3592
3593        pt._pt = {
3594          _next: pt._pt,
3595          p: chunk || matchIndex === 1 ? chunk : ",",
3596          //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.
3597          s: startNum,
3598          c: endNum - startNum,
3599          m: color && color < 4 || prop === "zIndex" ? Math.round : 0
3600        };
3601      }
3602    }
3603
3604    pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number)
3605  } else {
3606    pt.r = prop === "display" && end === "none" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue;
3607  }
3608
3609  _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._relExp.test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).
3610
3611  this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus "this" would refer to the plugin.
3612
3613  return pt;
3614},
3615    _keywordToPercent = {
3616  top: "0%",
3617  bottom: "100%",
3618  left: "0%",
3619  right: "100%",
3620  center: "50%"
3621},
3622    _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) {
3623  var split = value.split(" "),
3624      x = split[0],
3625      y = split[1] || "50%";
3626
3627  if (x === "top" || x === "bottom" || y === "left" || y === "right") {
3628    //the user provided them in the wrong order, so flip them
3629    value = x;
3630    x = y;
3631    y = value;
3632  }
3633
3634  split[0] = _keywordToPercent[x] || x;
3635  split[1] = _keywordToPercent[y] || y;
3636  return split.join(" ");
3637},
3638    _renderClearProps = function _renderClearProps(ratio, data) {
3639  if (data.tween && data.tween._time === data.tween._dur) {
3640    var target = data.t,
3641        style = target.style,
3642        props = data.u,
3643        cache = target._gsap,
3644        prop,
3645        clearTransforms,
3646        i;
3647
3648    if (props === "all" || props === true) {
3649      style.cssText = "";
3650      clearTransforms = 1;
3651    } else {
3652      props = props.split(",");
3653      i = props.length;
3654
3655      while (--i > -1) {
3656        prop = props[i];
3657
3658        if (_transformProps[prop]) {
3659          clearTransforms = 1;
3660          prop = prop === "transformOrigin" ? _transformOriginProp : _transformProp;
3661        }
3662
3663        _removeProperty(target, prop);
3664      }
3665    }
3666
3667    if (clearTransforms) {
3668      _removeProperty(target, _transformProp);
3669
3670      if (cache) {
3671        cache.svg && target.removeAttribute("transform");
3672        style.scale = style.rotate = style.translate = "none";
3673
3674        _parseTransform(target, 1); // force all the cached values back to "normal"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values.
3675
3676
3677        cache.uncache = 1;
3678
3679        _removeIndependentTransforms(style);
3680      }
3681    }
3682  }
3683},
3684    // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list.
3685_specialProps = {
3686  clearProps: function clearProps(plugin, target, property, endValue, tween) {
3687    if (tween.data !== "isFromStart") {
3688      var pt = plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(plugin._pt, target, property, 0, 0, _renderClearProps);
3689      pt.u = endValue;
3690      pt.pr = -10;
3691      pt.tween = tween;
3692
3693      plugin._props.push(property);
3694
3695      return 1;
3696    }
3697  }
3698  /* className feature (about 0.4kb gzipped).
3699  , className(plugin, target, property, endValue, tween) {
3700  	let _renderClassName = (ratio, data) => {
3701  			data.css.render(ratio, data.css);
3702  			if (!ratio || ratio === 1) {
3703  				let inline = data.rmv,
3704  					target = data.t,
3705  					p;
3706  				target.setAttribute("class", ratio ? data.e : data.b);
3707  				for (p in inline) {
3708  					_removeProperty(target, p);
3709  				}
3710  			}
3711  		},
3712  		_getAllStyles = (target) => {
3713  			let styles = {},
3714  				computed = getComputedStyle(target),
3715  				p;
3716  			for (p in computed) {
3717  				if (isNaN(p) && p !== "cssText" && p !== "length") {
3718  					styles[p] = computed[p];
3719  				}
3720  			}
3721  			_setDefaults(styles, _parseTransform(target, 1));
3722  			return styles;
3723  		},
3724  		startClassList = target.getAttribute("class"),
3725  		style = target.style,
3726  		cssText = style.cssText,
3727  		cache = target._gsap,
3728  		classPT = cache.classPT,
3729  		inlineToRemoveAtEnd = {},
3730  		data = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== "=") ? endValue : startClassList.replace(new RegExp("(?:\\\\s|^)" + endValue.substr(2) + "(?![\\
vendor: 2,299 bytes, lines 3730-3777
3730\\w-])"), "") + ((endValue.charAt(0) === "+") ? " " + endValue.substr(2) : "")},
3731  		changingVars = {},
3732  		startVars = _getAllStyles(target),
3733  		transformRelated = /(transform|perspective)/i,
3734  		endVars, p;
3735  	if (classPT) {
3736  		classPT.r(1, classPT.d);
3737  		_removeLinkedListItem(classPT.d.plugin, classPT, "_pt");
3738  	}
3739  	target.setAttribute("class", data.e);
3740  	endVars = _getAllStyles(target, true);
3741  	target.setAttribute("class", startClassList);
3742  	for (p in endVars) {
3743  		if (endVars[p] !== startVars[p] && !transformRelated.test(p)) {
3744  			changingVars[p] = endVars[p];
3745  			if (!style[p] && style[p] !== "0") {
3746  				inlineToRemoveAtEnd[p] = 1;
3747  			}
3748  		}
3749  	}
3750  	cache.classPT = plugin._pt = new PropTween(plugin._pt, target, "className", 0, 0, _renderClassName, data, 0, -11);
3751  	if (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://gsap.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/.
3752  		style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).
3753  	}
3754  	_parseTransform(target, true); //to clear the caching of transforms
3755  	data.css = new gsap.plugins.css();
3756  	data.css.init(target, changingVars, tween);
3757  	plugin._props.push(...data.css._props);
3758  	return 1;
3759  }
3760  */
3761
3762},
3763
3764/*
3765 * --------------------------------------------------------------------------------------
3766 * TRANSFORMS
3767 * --------------------------------------------------------------------------------------
3768 */
3769_identity2DMatrix = [1, 0, 0, 1, 0, 0],
3770    _rotationalProperties = {},
3771    _isNullTransform = function _isNullTransform(value) {
3772  return value === "matrix(1, 0, 0, 1, 0, 0)" || value === "none" || !value;
3773},
3774    _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) {
3775  var matrixString = _getComputedProperty(target, _transformProp);
3776
3777  return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_
vendor: 3,835 bytes, lines 3777-3843
3777gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numExp).map(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round);
3778},
3779    _getMatrix = function _getMatrix(target, force2D) {
3780  var cache = target._gsap || (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._getCache)(target),
3781      style = target.style,
3782      matrix = _getComputedTransformMatrixAsArray(target),
3783      parent,
3784      nextSibling,
3785      temp,
3786      addedToDOM;
3787
3788  if (cache.svg && target.getAttribute("transform")) {
3789    temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like "translate(50,60) rotate(135,0,0)" are parsed because it mashes it into a matrix.
3790
3791    matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f];
3792    return matrix.join(",") === "1,0,0,1,0,0" ? _identity2DMatrix : matrix;
3793  } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) {
3794    //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397
3795    //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not "none". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px).
3796    temp = style.display;
3797    style.display = "block";
3798    parent = target.parentNode;
3799
3800    if (!parent || !target.offsetParent && !target.getBoundingClientRect().width) {
3801      // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375. Note: position: fixed elements report a null offsetParent but they could also be invisible because they're in an ancestor with display: none, so we check getBoundingClientRect(). We only want to alter the DOM if we absolutely have to because it can cause iframe content to reload, like a Vimeo video.
3802      addedToDOM = 1; //flag
3803
3804      nextSibling = target.nextElementSibling;
3805
3806      _docElement.appendChild(target); //we must add it to the DOM in order to get values properly
3807
3808    }
3809
3810    matrix = _getComputedTransformMatrixAsArray(target);
3811    temp ? style.display = temp : _removeProperty(target, "display");
3812
3813    if (addedToDOM) {
3814      nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target);
3815    }
3816  }
3817
3818  return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix;
3819},
3820    _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) {
3821  var cache = target._gsap,
3822      matrix = matrixArray || _getMatrix(target, true),
3823      xOriginOld = cache.xOrigin || 0,
3824      yOriginOld = cache.yOrigin || 0,
3825      xOffsetOld = cache.xOffset || 0,
3826      yOffsetOld = cache.yOffset || 0,
3827      a = matrix[0],
3828      b = matrix[1],
3829      c = matrix[2],
3830      d = matrix[3],
3831      tx = matrix[4],
3832      ty = matrix[5],
3833      originSplit = origin.split(" "),
3834      xOrigin = parseFloat(originSplit[0]) || 0,
3835      yOrigin = parseFloat(originSplit[1]) || 0,
3836      bounds,
3837      determinant,
3838      x,
3839      y;
3840
3841  if (!originIsAbsolute) {
3842    bounds = _getBBox(target);
3843    xOrigin = bounds.x + (~originSplit[0].indexOf("%") ? xOrigin / 100 * boun
vendor: 9,144 bytes, lines 3843-4084
3843ds.width : xOrigin);
3844    yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf("%") ? yOrigin / 100 * bounds.height : yOrigin); // if (!("xOrigin" in cache) && (xOrigin || yOrigin)) { // added in 3.12.3, reverted in 3.12.4; requires more exploration
3845    // 	xOrigin -= bounds.x;
3846    // 	yOrigin -= bounds.y;
3847    // }
3848  } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) {
3849    //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero.
3850    x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant;
3851    y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant;
3852    xOrigin = x;
3853    yOrigin = y; // theory: we only had to do this for smoothing and it assumes that the previous one was not originIsAbsolute.
3854  }
3855
3856  if (smooth || smooth !== false && cache.smooth) {
3857    tx = xOrigin - xOriginOld;
3858    ty = yOrigin - yOriginOld;
3859    cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx;
3860    cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty;
3861  } else {
3862    cache.xOffset = cache.yOffset = 0;
3863  }
3864
3865  cache.xOrigin = xOrigin;
3866  cache.yOrigin = yOrigin;
3867  cache.smooth = !!smooth;
3868  cache.origin = origin;
3869  cache.originIsAbsolute = !!originIsAbsolute;
3870  target.style[_transformOriginProp] = "0px 0px"; //otherwise, if someone sets  an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value).
3871
3872  if (pluginToAddPropTweensTo) {
3873    _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOrigin", xOriginOld, xOrigin);
3874
3875    _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOrigin", yOriginOld, yOrigin);
3876
3877    _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOffset", xOffsetOld, cache.xOffset);
3878
3879    _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOffset", yOffsetOld, cache.yOffset);
3880  }
3881
3882  target.setAttribute("data-svg-origin", xOrigin + " " + yOrigin);
3883},
3884    _parseTransform = function _parseTransform(target, uncache) {
3885  var cache = target._gsap || new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.GSCache(target);
3886
3887  if ("x" in cache && !uncache && !cache.uncache) {
3888    return cache;
3889  }
3890
3891  var style = target.style,
3892      invertedScaleX = cache.scaleX < 0,
3893      px = "px",
3894      deg = "deg",
3895      cs = getComputedStyle(target),
3896      origin = _getComputedProperty(target, _transformOriginProp) || "0",
3897      x,
3898      y,
3899      z,
3900      scaleX,
3901      scaleY,
3902      rotation,
3903      rotationX,
3904      rotationY,
3905      skewX,
3906      skewY,
3907      perspective,
3908      xOrigin,
3909      yOrigin,
3910      matrix,
3911      angle,
3912      cos,
3913      sin,
3914      a,
3915      b,
3916      c,
3917      d,
3918      a12,
3919      a22,
3920      t1,
3921      t2,
3922      t3,
3923      a13,
3924      a23,
3925      a33,
3926      a42,
3927      a43,
3928      a32;
3929  x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0;
3930  scaleX = scaleY = 1;
3931  cache.svg = !!(target.getCTM && _isSVG(target));
3932
3933  if (cs.translate) {
3934    // accommodate independent transforms by combining them into normal ones.
3935    if (cs.translate !== "none" || cs.scale !== "none" || cs.rotate !== "none") {
3936      style[_transformProp] = (cs.translate !== "none" ? "translate3d(" + (cs.translate + " 0 0").split(" ").slice(0, 3).join(", ") + ") " : "") + (cs.rotate !== "none" ? "rotate(" + cs.rotate + ") " : "") + (cs.scale !== "none" ? "scale(" + cs.scale.split(" ").join(",") + ") " : "") + (cs[_transformProp] !== "none" ? cs[_transformProp] : "");
3937    }
3938
3939    style.scale = style.rotate = style.translate = "none";
3940  }
3941
3942  matrix = _getMatrix(target, cache.svg);
3943
3944  if (cache.svg) {
3945    if (cache.uncache) {
3946      // if cache.uncache is true (and maybe if origin is 0,0), we need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + "px " + (cache.yOrigin - bbox.y) + "px". Previously we let the data-svg-origin stay instead, but when introducing revert(), it complicated things.
3947      t2 = target.getBBox();
3948      origin = cache.xOrigin - t2.x + "px " + (cache.yOrigin - t2.y) + "px";
3949      t1 = "";
3950    } else {
3951      t1 = !uncache && target.getAttribute("data-svg-origin"); //  Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly.
3952    }
3953
3954    _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix);
3955  }
3956
3957  xOrigin = cache.xOrigin || 0;
3958  yOrigin = cache.yOrigin || 0;
3959
3960  if (matrix !== _identity2DMatrix) {
3961    a = matrix[0]; //a11
3962
3963    b = matrix[1]; //a21
3964
3965    c = matrix[2]; //a31
3966
3967    d = matrix[3]; //a41
3968
3969    x = a12 = matrix[4];
3970    y = a22 = matrix[5]; //2D matrix
3971
3972    if (matrix.length === 6) {
3973      scaleX = Math.sqrt(a * a + b * b);
3974      scaleY = Math.sqrt(d * d + c * c);
3975      rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).
3976
3977      skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0;
3978      skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD)));
3979
3980      if (cache.svg) {
3981        x -= xOrigin - (xOrigin * a + yOrigin * c);
3982        y -= yOrigin - (xOrigin * b + yOrigin * d);
3983      } //3D matrix
3984
3985    } else {
3986      a32 = matrix[6];
3987      a42 = matrix[7];
3988      a13 = matrix[8];
3989      a23 = matrix[9];
3990      a33 = matrix[10];
3991      a43 = matrix[11];
3992      x = matrix[12];
3993      y = matrix[13];
3994      z = matrix[14];
3995      angle = _atan2(a32, a33);
3996      rotationX = angle * _RAD2DEG; //rotationX
3997
3998      if (angle) {
3999        cos = Math.cos(-angle);
4000        sin = Math.sin(-angle);
4001        t1 = a12 * cos + a13 * sin;
4002        t2 = a22 * cos + a23 * sin;
4003        t3 = a32 * cos + a33 * sin;
4004        a13 = a12 * -sin + a13 * cos;
4005        a23 = a22 * -sin + a23 * cos;
4006        a33 = a32 * -sin + a33 * cos;
4007        a43 = a42 * -sin + a43 * cos;
4008        a12 = t1;
4009        a22 = t2;
4010        a32 = t3;
4011      } //rotationY
4012
4013
4014      angle = _atan2(-c, a33);
4015      rotationY = angle * _RAD2DEG;
4016
4017      if (angle) {
4018        cos = Math.cos(-angle);
4019        sin = Math.sin(-angle);
4020        t1 = a * cos - a13 * sin;
4021        t2 = b * cos - a23 * sin;
4022        t3 = c * cos - a33 * sin;
4023        a43 = d * sin + a43 * cos;
4024        a = t1;
4025        b = t2;
4026        c = t3;
4027      } //rotationZ
4028
4029
4030      angle = _atan2(b, a);
4031      rotation = angle * _RAD2DEG;
4032
4033      if (angle) {
4034        cos = Math.cos(angle);
4035        sin = Math.sin(angle);
4036        t1 = a * cos + b * sin;
4037        t2 = a12 * cos + a22 * sin;
4038        b = b * cos - a * sin;
4039        a22 = a22 * cos - a12 * sin;
4040        a = t1;
4041        a12 = t2;
4042      }
4043
4044      if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) {
4045        //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here.
4046        rotationX = rotation = 0;
4047        rotationY = 180 - rotationY;
4048      }
4049
4050      scaleX = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(Math.sqrt(a * a + b * b + c * c));
4051      scaleY = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(Math.sqrt(a22 * a22 + a32 * a32));
4052      angle = _atan2(a12, a22);
4053      skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0;
4054      perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0;
4055    }
4056
4057    if (cache.svg) {
4058      //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline).
4059      t1 = target.getAttribute("transform");
4060      cache.forceCSS = target.setAttribute("transform", "") || !_isNullTransform(_getComputedProperty(target, _transformProp));
4061      t1 && target.setAttribute("transform", t1);
4062    }
4063  }
4064
4065  if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {
4066    if (invertedScaleX) {
4067      scaleX *= -1;
4068      skewX += rotation <= 0 ? 180 : -180;
4069      rotation += rotation <= 0 ? 180 : -180;
4070    } else {
4071      scaleY *= -1;
4072      skewX += skewX <= 0 ? 180 : -180;
4073    }
4074  }
4075
4076  uncache = uncache || cache.uncache;
4077  cache.x = x - ((cache.xPercent = x && (!uncache && cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px;
4078  cache.y = y - ((cache.yPercent = y && (!uncache && cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px;
4079  cache.z = z + px;
4080  cache.scaleX = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(scaleX);
4081  cache.scaleY = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(scaleY);
4082  cache.rotation = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(rotation) + deg;
4083  cache.rotationX = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(rotationX) + deg;
4084  cache.rotationY = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(rotationY) + deg;
vendor: 1,166 bytes, lines 4085-4109
4085  cache.skewX = skewX + deg;
4086  cache.skewY = skewY + deg;
4087  cache.transformPerspective = perspective + px;
4088
4089  if (cache.zOrigin = parseFloat(origin.split(" ")[2]) || !uncache && cache.zOrigin || 0) {
4090    style[_transformOriginProp] = _firstTwoOnly(origin);
4091  }
4092
4093  cache.xOffset = cache.yOffset = 0;
4094  cache.force3D = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.force3D;
4095  cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms;
4096  cache.uncache = 0;
4097  return cache;
4098},
4099    _firstTwoOnly = function _firstTwoOnly(value) {
4100  return (value = value.split(" "))[0] + " " + value[1];
4101},
4102    //for handling transformOrigin values, stripping out the 3rd dimension
4103_addPxTranslate = function _addPxTranslate(target, start, value) {
4104  var unit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(start);
4105  return (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(parseFloat(start) + parseFloat(_convertToUnit(target, "x", value + "px", unit))) + unit;
4106},
4107    _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) {
4108  cache.z = "0px";
4109  cache.rotationY = cache.rotationX = "0deg";
vendor: 9,614 bytes, lines 4110-4379
4110  cache.force3D = 0;
4111
4112  _renderCSSTransforms(ratio, cache);
4113},
4114    _zeroDeg = "0deg",
4115    _zeroPx = "0px",
4116    _endParenthesis = ") ",
4117    _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) {
4118  var _ref = cache || this,
4119      xPercent = _ref.xPercent,
4120      yPercent = _ref.yPercent,
4121      x = _ref.x,
4122      y = _ref.y,
4123      z = _ref.z,
4124      rotation = _ref.rotation,
4125      rotationY = _ref.rotationY,
4126      rotationX = _ref.rotationX,
4127      skewX = _ref.skewX,
4128      skewY = _ref.skewY,
4129      scaleX = _ref.scaleX,
4130      scaleY = _ref.scaleY,
4131      transformPerspective = _ref.transformPerspective,
4132      force3D = _ref.force3D,
4133      target = _ref.target,
4134      zOrigin = _ref.zOrigin,
4135      transforms = "",
4136      use3D = force3D === "auto" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually)
4137
4138
4139  if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) {
4140    var angle = parseFloat(rotationY) * _DEG2RAD,
4141        a13 = Math.sin(angle),
4142        a33 = Math.cos(angle),
4143        cos;
4144
4145    angle = parseFloat(rotationX) * _DEG2RAD;
4146    cos = Math.cos(angle);
4147    x = _addPxTranslate(target, x, a13 * cos * -zOrigin);
4148    y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin);
4149    z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin);
4150  }
4151
4152  if (transformPerspective !== _zeroPx) {
4153    transforms += "perspective(" + transformPerspective + _endParenthesis;
4154  }
4155
4156  if (xPercent || yPercent) {
4157    transforms += "translate(" + xPercent + "%, " + yPercent + "%) ";
4158  }
4159
4160  if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) {
4161    transforms += z !== _zeroPx || use3D ? "translate3d(" + x + ", " + y + ", " + z + ") " : "translate(" + x + ", " + y + _endParenthesis;
4162  }
4163
4164  if (rotation !== _zeroDeg) {
4165    transforms += "rotate(" + rotation + _endParenthesis;
4166  }
4167
4168  if (rotationY !== _zeroDeg) {
4169    transforms += "rotateY(" + rotationY + _endParenthesis;
4170  }
4171
4172  if (rotationX !== _zeroDeg) {
4173    transforms += "rotateX(" + rotationX + _endParenthesis;
4174  }
4175
4176  if (skewX !== _zeroDeg || skewY !== _zeroDeg) {
4177    transforms += "skew(" + skewX + ", " + skewY + _endParenthesis;
4178  }
4179
4180  if (scaleX !== 1 || scaleY !== 1) {
4181    transforms += "scale(" + scaleX + ", " + scaleY + _endParenthesis;
4182  }
4183
4184  target.style[_transformProp] = transforms || "translate(0, 0)";
4185},
4186    _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) {
4187  var _ref2 = cache || this,
4188      xPercent = _ref2.xPercent,
4189      yPercent = _ref2.yPercent,
4190      x = _ref2.x,
4191      y = _ref2.y,
4192      rotation = _ref2.rotation,
4193      skewX = _ref2.skewX,
4194      skewY = _ref2.skewY,
4195      scaleX = _ref2.scaleX,
4196      scaleY = _ref2.scaleY,
4197      target = _ref2.target,
4198      xOrigin = _ref2.xOrigin,
4199      yOrigin = _ref2.yOrigin,
4200      xOffset = _ref2.xOffset,
4201      yOffset = _ref2.yOffset,
4202      forceCSS = _ref2.forceCSS,
4203      tx = parseFloat(x),
4204      ty = parseFloat(y),
4205      a11,
4206      a21,
4207      a12,
4208      a22,
4209      temp;
4210
4211  rotation = parseFloat(rotation);
4212  skewX = parseFloat(skewX);
4213  skewY = parseFloat(skewY);
4214
4215  if (skewY) {
4216    //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees.
4217    skewY = parseFloat(skewY);
4218    skewX += skewY;
4219    rotation += skewY;
4220  }
4221
4222  if (rotation || skewX) {
4223    rotation *= _DEG2RAD;
4224    skewX *= _DEG2RAD;
4225    a11 = Math.cos(rotation) * scaleX;
4226    a21 = Math.sin(rotation) * scaleX;
4227    a12 = Math.sin(rotation - skewX) * -scaleY;
4228    a22 = Math.cos(rotation - skewX) * scaleY;
4229
4230    if (skewX) {
4231      skewY *= _DEG2RAD;
4232      temp = Math.tan(skewX - skewY);
4233      temp = Math.sqrt(1 + temp * temp);
4234      a12 *= temp;
4235      a22 *= temp;
4236
4237      if (skewY) {
4238        temp = Math.tan(skewY);
4239        temp = Math.sqrt(1 + temp * temp);
4240        a11 *= temp;
4241        a21 *= temp;
4242      }
4243    }
4244
4245    a11 = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(a11);
4246    a21 = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(a21);
4247    a12 = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(a12);
4248    a22 = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(a22);
4249  } else {
4250    a11 = scaleX;
4251    a22 = scaleY;
4252    a21 = a12 = 0;
4253  }
4254
4255  if (tx && !~(x + "").indexOf("px") || ty && !~(y + "").indexOf("px")) {
4256    tx = _convertToUnit(target, "x", x, "px");
4257    ty = _convertToUnit(target, "y", y, "px");
4258  }
4259
4260  if (xOrigin || yOrigin || xOffset || yOffset) {
4261    tx = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset);
4262    ty = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset);
4263  }
4264
4265  if (xPercent || yPercent) {
4266    //The SVG spec doesn't support percentage-based translation in the "transform" attribute, so we merge it into the translation to simulate it.
4267    temp = target.getBBox();
4268    tx = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(tx + xPercent / 100 * temp.width);
4269    ty = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(ty + yPercent / 100 * temp.height);
4270  }
4271
4272  temp = "matrix(" + a11 + "," + a21 + "," + a12 + "," + a22 + "," + tx + "," + ty + ")";
4273  target.setAttribute("transform", temp);
4274  forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!)
4275},
4276    _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue) {
4277  var cap = 360,
4278      isString = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._isString)(endValue),
4279      endNum = parseFloat(endValue) * (isString && ~endValue.indexOf("rad") ? _RAD2DEG : 1),
4280      change = endNum - startNum,
4281      finalValue = startNum + change + "deg",
4282      direction,
4283      pt;
4284
4285  if (isString) {
4286    direction = endValue.split("_")[1];
4287
4288    if (direction === "short") {
4289      change %= cap;
4290
4291      if (change !== change % (cap / 2)) {
4292        change += change < 0 ? cap : -cap;
4293      }
4294    }
4295
4296    if (direction === "cw" && change < 0) {
4297      change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap;
4298    } else if (direction === "ccw" && change > 0) {
4299      change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap;
4300    }
4301  }
4302
4303  plugin._pt = pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(plugin._pt, target, property, startNum, change, _renderPropWithEnd);
4304  pt.e = finalValue;
4305  pt.u = "deg";
4306
4307  plugin._props.push(property);
4308
4309  return pt;
4310},
4311    _assign = function _assign(target, source) {
4312  // Internet Explorer doesn't have Object.assign(), so we recreate it here.
4313  for (var p in source) {
4314    target[p] = source[p];
4315  }
4316
4317  return target;
4318},
4319    _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) {
4320  //for handling cases where someone passes in a whole transform string, like transform: "scale(2, 3) rotate(20deg) translateY(30em)"
4321  var startCache = _assign({}, target._gsap),
4322      exclude = "perspective,force3D,transformOrigin,svgOrigin",
4323      style = target.style,
4324      endCache,
4325      p,
4326      startValue,
4327      endValue,
4328      startNum,
4329      endNum,
4330      startUnit,
4331      endUnit;
4332
4333  if (startCache.svg) {
4334    startValue = target.getAttribute("transform");
4335    target.setAttribute("transform", "");
4336    style[_transformProp] = transforms;
4337    endCache = _parseTransform(target, 1);
4338
4339    _removeProperty(target, _transformProp);
4340
4341    target.setAttribute("transform", startValue);
4342  } else {
4343    startValue = getComputedStyle(target)[_transformProp];
4344    style[_transformProp] = transforms;
4345    endCache = _parseTransform(target, 1);
4346    style[_transformProp] = startValue;
4347  }
4348
4349  for (p in _transformProps) {
4350    startValue = startCache[p];
4351    endValue = endCache[p];
4352
4353    if (startValue !== endValue && exclude.indexOf(p) < 0) {
4354      //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case.
4355      startUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(startValue);
4356      endUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(endValue);
4357      startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue);
4358      endNum = parseFloat(endValue);
4359      plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp);
4360      plugin._pt.u = endUnit || 0;
4361
4362      plugin._props.push(p);
4363    }
4364  }
4365
4366  _assign(endCache, startCache);
4367}; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc.
4368
4369
4370(0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)("padding,margin,Width,Radius", function (name, index) {
4371  var t = "Top",
4372      r = "Right",
4373      b = "Bottom",
4374      l = "Left",
4375      props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) {
4376    return index < 2 ? name + side : "border" + side + name;
4377  });
4378
4379  _specialProps[index >
4379 1 ? "border" + name : name] = function (plugin, target, property, endValue, tween) {
4380    var a, vars;
4381
4382    if (arguments.length < 4) {
4383      // getter, passed target, property, and unit (from _get())
4384      a = props.map(function (prop) {
4385        return _get(plugin, prop, property);
4386      });
4387      vars = a.join(" ");
4388      return vars.split(a[0]).length === 5 ? a[0] : vars;
4389    }
4390
4391    a = (endValue + "").split(" ");
4392    vars = {};
4393    props.forEach(function (prop, i) {
4394      return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0];
4395    });
4396    plugin.init(target, vars, tween);
4397  };
4398});
4399
4400var CSSPlugin = {
4401  name: "css",
4402  register: _initCore,
4403  targetTest: function targetTest(target) {
4404    return target.style && target.nodeType;
4405  },
4406  init: function init(target, vars, tween, index, targets) {
4407    var props = this._props,
4408        style = target.style,
4409        startAt = tween.vars.startAt,
4410        startValue,
4411        endValue,
4412        endNum,
4413        startNum,
4414        type,
4415        specialProp,
4416        p,
4417        startUnit,
4418        endUnit,
4419        relative,
4420        isTransformRelated,
4421        transformPropTween,
4422        cache,
4423        smooth,
4424        hasPriority,
4425        inlineProps,
4426        finalTransformValue;
4427    _pluginInitted || _initCore(); // we may call init() multiple times on the same plugin instance, like when adding special properties, so make sure we don't overwrite the revert data or inlineProps
4428
4429    this.styles = this.styles || _getStyleSaver(target);
4430    inlineProps = this.styles.props;
4431    this.tween = tween;
4432
4433    for (p in vars) {
4434      if (p === "autoRound") {
4435        continue;
4436      }
4437
4438      endValue = vars[p];
4439
4440      if (_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._plugins[p] && (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._checkPlugin)(p, vars, tween, index, target, targets)) {
4441        // plugins
4442        continue;
4443      }
4444
4445      type = typeof endValue;
4446      specialProp = _specialProps[p];
4447
4448      if (type === "function") {
4449        endValue = endValue.call(tween, index, target, targets);
4450        type = typeof endValue;
4451      }
4452
4453      if (type === "string" && ~endValue.indexOf("random(")) {
4454        endValue = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._replaceRandom)(endValue);
4455      }
4456
4457      if (specialProp) {
4458        specialProp(this, target, p, endValue, tween) && (hasPriority = 1);
4459      } else if (p.substr(0, 2) === "--") {
4460        //CSS variable
4461        startValue = (getComputedStyle(target).getPropertyValue(p) + "").trim();
4462        endValue += "";
4463        _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._colorExp.lastIndex = 0;
4464
4465        if (!_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._colorExp.test(startValue)) {
4466          // colors don't have units
4467          startUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(startValue);
4468          endUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(endValue);
4469          endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit);
4470        }
4471
4472        this.add(style, "setProperty", startValue, endValue, index, targets, 0, 0, p);
4473        props.push(p);
4474        inlineProps.push(p, 0, style[p]);
4475      } else if (type !== "undefined") {
4476        if (startAt && p in startAt) {
4477          // in case someone hard-codes a complex value as the start, like top: "calc(2vh / 2)". Without this, it'd use the computed value (always in px)
4478          startValue = typeof startAt[p] === "function" ? startAt[p].call(tween, index, target, targets) : startAt[p];
4479          (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._isString)(startValue) && ~startValue.indexOf("random(") && (startValue = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._replaceRandom)(startValue));
4480          (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(startValue + "") || startValue === "auto" || (startValue += _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[p] || (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(_get(target, p)) || ""); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work.
4481
4482          (startValue + "").charAt(1) === "=" && (startValue = _get(target, p)); // can't work with relative values
4483        } else {
4484          startValue = _get(target, p);
4485        }
4486
4487        startNum = parseFloat(startValue);
4488        relative = type === "string" && endValue.charAt(1) === "=" && endValue.substr(0, 2);
4489        relative && (endValue = endValue.substr(2));
4490        endNum = parseFloat(endValue);
4491
4492        if (p in _propertyAliases) {
4493          if (p === "autoAlpha") {
4494            //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened.
4495            if (startNum === 1 && _get(target, "visibility") === "hidden" && endNum) {
4496              //if visibility is initially set to "hidden", we should interpret that as intent to make opacity 0 (a convenience)
4497              startNum = 0;
4498            }
4499
4500            inlineProps.push("visibility", 0, style.visibility);
4501
4502            _addNonTweeningPT(this, style, "visibility", startNum ? "inherit" : "hidden", endNum ? "inherit" : "hidden", !endNum);
4503          }
4504
4505          if (p !== "scale" && p !== "transform") {
4506            p = _propertyAliases[p];
4507            ~p.indexOf(",") && (p = p.split(",")[0]);
4508          }
4509        }
4510
vendor: 4,710 bytes, lines 4511-4590
4511        isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED ---
4512
4513        if (isTransformRelated) {
4514          this.styles.save(p);
4515          finalTransformValue = endValue; // this is always the same as endValue except when it's a var(--) value, in which case we need to calculate the end value.
4516
4517          if (type === "string" && endValue.substring(0, 6) === "var(--") {
4518            endValue = _getComputedProperty(target, endValue.substring(4, endValue.indexOf(")")));
4519
4520            if (endValue.substring(0, 5) === "calc(") {
4521              var origPerspective = target.style.perspective;
4522              target.style.perspective = endValue;
4523              endValue = _getComputedProperty(target, "perspective");
4524              origPerspective ? target.style.perspective = origPerspective : _removeProperty(target, "perspective");
4525            }
4526
4527            endNum = parseFloat(endValue);
4528          }
4529
4530          if (!transformPropTween) {
4531            cache = target._gsap;
4532            cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:"translateX(50vw)"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here.
4533
4534            smooth = vars.smoothOrigin !== false && cache.smooth;
4535            transformPropTween = this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning)
4536
4537            transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween.
4538          }
4539
4540          if (p === "scale") {
4541            this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(this._pt, cache, "scaleY", cache.scaleY, (relative ? (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._parseRelative)(cache.scaleY, relative + endNum) : endNum) - cache.scaleY || 0, _renderCSSProp);
4542            this._pt.u = 0;
4543            props.push("scaleY", p);
4544            p += "X";
4545          } else if (p === "transformOrigin") {
4546            inlineProps.push(_transformOriginProp, 0, style[_transformOriginProp]);
4547            endValue = _convertKeywordsToPercentages(endValue); //in case something like "left top" or "bottom right" is passed in. Convert to percentages.
4548
4549            if (cache.svg) {
4550              _applySVGOrigin(target, endValue, 0, smooth, 0, this);
4551            } else {
4552              endUnit = parseFloat(endValue.split(" ")[2]) || 0; //handle the zOrigin separately!
4553
4554              endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, "zOrigin", cache.zOrigin, endUnit);
4555
4556              _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue));
4557            }
4558
4559            continue;
4560          } else if (p === "svgOrigin") {
4561            _applySVGOrigin(target, endValue, 1, smooth, 0, this);
4562
4563            continue;
4564          } else if (p in _rotationalProperties) {
4565            _addRotationalPropTween(this, cache, p, startNum, relative ? (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._parseRelative)(startNum, relative + endValue) : endValue);
4566
4567            continue;
4568          } else if (p === "smoothOrigin") {
4569            _addNonTweeningPT(this, cache, "smooth", cache.smooth, endValue);
4570
4571            continue;
4572          } else if (p === "force3D") {
4573            cache[p] = endValue;
4574            continue;
4575          } else if (p === "transform") {
4576            _addRawTransformPTs(this, endValue, target);
4577
4578            continue;
4579          }
4580        } else if (!(p in style)) {
4581          p = _checkPropPrefix(p) || p;
4582        }
4583
4584        if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) {
4585          startUnit = (startValue + "").substr((startNum + "").length);
4586          endNum || (endNum = 0); // protect against NaN
4587
4588          endUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(endValue) || (p in _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units ? _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[p] : startUnit);
4589          startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit));
4590          this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._parseRelative)(startNum, relative + endNum) : endNum) - startNum, 
4590!isTransformRelated && (endUnit === "px" || p === "zIndex") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp);
4591          this._pt.u = endUnit || 0;
4592
4593          if (isTransformRelated && finalTransformValue !== endValue) {
4594            this._pt.b = startValue;
4595            this._pt.e = finalTransformValue;
4596            this._pt.r = _renderCSSPropWithBeginningAndEnd;
4597          } else if (startUnit !== endUnit && endUnit !== "%") {
4598            //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a "b" (beginning) property and point to a render method that handles that. (performance optimization)
4599            this._pt.b = startValue;
4600            this._pt.r = _renderCSSPropWithBeginning;
4601          }
4602        } else if (!(p in style)) {
4603          if (p in target) {
4604            //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that.
4605            this.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets);
4606          } else if (p !== "parseTransform") {
4607            (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._missingPlugin)(p, endValue);
4608
4609            continue;
4610          }
4611        } else {
4612          _tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue);
4613        }
4614
4615        isTransformRelated || (p in style ? inlineProps.push(p, 0, style[p]) : typeof target[p] === "function" ? inlineProps.push(p, 2, target[p]()) : inlineProps.push(p, 1, startValue || target[p]));
4616        props.push(p);
4617      }
4618    }
4619
4620    hasPriority && (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._sortPropTweensByPriority)(this);
4621  },
4622  render: function render(ratio, data) {
4623    if (data.tween._time || !_reverting()) {
4624      var pt = data._pt;
4625
4626      while (pt) {
4627        pt.r(ratio, pt.d);
4628        pt = pt._next;
4629      }
4630    } else {
4631      data.styles.revert();
4632    }
4633  },
4634  get: _get,
4635  aliases: _propertyAliases,
4636  getSetter: function getSetter(target, property, plugin) {
4637    //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like "x" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer.
4638    var p = _propertyAliases[property];
4639    p && p.indexOf(",") < 0 && (property = p);
4640    return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, "x")) ? plugin && _recentSetterPlugin === plugin ? property === "scale" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === "scale" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !(0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._isUndefined)(target.style[property]) ? _setterCSSStyle : ~property.indexOf("-") ? _setterCSSProp : (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._getSetter)(target, property);
4641  },
4642  core: {
4643    _removeProperty: _removeProperty,
4644    _getMatrix: _getMatrix
4645  }
4646};
4647_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.utils.checkPrefix = _checkPropPrefix;
4648_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.core.getStyleSaver = _getStyleSaver;
4649
4650(function (positionAndScale, rotation, others, aliases) {
4651  var all = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)(positionAndScale + "," + rotation + "," + others, function (name) {
4652    _transformProps[name] = 1;
4653  });
4654
4655  (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)(rotation, function (name) {
4656    _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[name] = "deg";
4657    _rotationalProperties[name] = 1;
4658  });
4659
4660  _propertyAliases[all[13]] = positionAndScale + "," + rotation;
4661
4662  (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)(aliases, function (name) {
4663    var split = name.split(":");
4664    _propertyAliases[split[1]] = all[split[0]];
4665  });
4666})("x,y,z,scale,scaleX,scaleY,xPercent,yPercent", "rotation,rotationX,rotationY,skewX,skewY", "transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective", "0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY");
4667
4668(0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective", function (name) {
4669  _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[name] = "px";
4670});
4671
4672_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.registerPlugin(CSSPlugin);
4673//# sourceURL=[module]
4674//# sourceMappingURL=data:application/json;charset=utf-8;base64,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BQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
4674BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxxREFBTTtBQUNoQixVQUFVLHFEQUFNO0FBQ2hCLFVBQVUscURBQU07QUFDaEIsVUFBVSxxREFBTTtBQUNoQixJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLHFEQUFNO0FBQ2YsU0FBUyxxREFBTTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVMscURBQU07QUFDZixTQUFTLHFEQUFNO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLGlCQUFpQix3REFBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0Isb0RBQVM7QUFDakM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLHNEQUFPO0FBQ3pCLGdCQUFnQixzREFBTztBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCLG9EQUFTO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdILDJEQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQzs7QUFFTTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFVBQVUsbURBQVEsT0FBTywyREFBWTtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQiw2REFBYztBQUNqQzs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVEsb0RBQVM7O0FBRWpCLGFBQWEsb0RBQVM7QUFDdEI7QUFDQSxzQkFBc0Isc0RBQU87QUFDN0Isb0JBQW9CLHNEQUFPO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFVBQVUsd0RBQVMsZ0VBQWdFLDZEQUFjO0FBQ2pHLFVBQVUsc0RBQU8sNkRBQTZELGtEQUFPLGFBQWEsc0RBQU8sMEJBQTBCLDJEQUEyRCxTQUFTOztBQUV2TSxpRkFBaUY7QUFDakYsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBLDBDQUEwQzs7QUFFMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkdBQTJHLGtDQUFrQyw2QkFBNkI7O0FBRTFLO0FBQ0EsZ0RBQWdELG9EQUFTLDhFQUE4RTs7QUFFdkksd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0EsMkJBQTJCLG9EQUFTLHNEQUFzRCw2REFBYztBQUN4RztBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxnRUFBZ0U7O0FBRWhFO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsaUVBQWlFOztBQUVqRTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0EsWUFBWTtBQUNaLHlFQUF5RSw2REFBYzs7QUFFdkY7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEMsb0JBQW9CLHNEQUFPLG9CQUFvQixrREFBTyxTQUFTLGtEQUFPO0FBQ3RFO0FBQ0EseUJBQXlCLG9EQUFTLHdFQUF3RSw2REFBYztBQUN4SDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osWUFBWSw2REFBYzs7QUFFMUI7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQix3RUFBeUI7QUFDNUMsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhQQUE4UCxxR0FBcUcsMkRBQVksdUZBQXVGLHlEQUFVO0FBQ2hkLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQUk7QUFDSiwrQ0FBSTs7QUFFSjtBQUNBLFlBQVksMkRBQVk7QUFDeEI7QUFDQSxHQUFHOztBQUVILEVBQUUsMkRBQVk7QUFDZCxJQUFJLGtEQUFPO0FBQ1g7QUFDQSxHQUFHOztBQUVIOztBQUVBLEVBQUUsMkRBQVk7QUFDZDtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQsMkRBQVk7QUFDWixFQUFFLGtEQUFPO0FBQ1QsQ0FBQzs7QUFFRCwrQ0FBSSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS9nc2FwQDMuMTUuMC9ub2RlX21vZHVsZXMvZ3NhcC9DU1NQbHVnaW4uanM/ZTVlYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENTU1BsdWdpbiAzLjE1LjBcbiAqIGh0dHBzOi8vZ3NhcC5jb21cbiAqXG4gKiBDb3B5cmlnaHQgMjAwOC0yMDI2LCBHcmVlblNvY2suIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwczovL2dzYXAuY29tL3N0YW5kYXJkLWxpY2Vuc2VcbiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbVxuKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7
4674IGdzYXAsIF9nZXRQcm9wZXJ0eSwgX251bUV4cCwgX251bVdpdGhVbml0RXhwLCBnZXRVbml0LCBfaXNTdHJpbmcsIF9pc1VuZGVmaW5lZCwgX3JlbmRlckNvbXBsZXhTdHJpbmcsIF9yZWxFeHAsIF9mb3JFYWNoTmFtZSwgX3NvcnRQcm9wVHdlZW5zQnlQcmlvcml0eSwgX2NvbG9yU3RyaW5nRmlsdGVyLCBfY2hlY2tQbHVnaW4sIF9yZXBsYWNlUmFuZG9tLCBfcGx1Z2lucywgR1NDYWNoZSwgUHJvcFR3ZWVuLCBfY29uZmlnLCBfdGlja2VyLCBfcm91bmQsIF9taXNzaW5nUGx1Z2luLCBfZ2V0U2V0dGVyLCBfZ2V0Q2FjaGUsIF9jb2xvckV4cCwgX3BhcnNlUmVsYXRpdmUsIF9zZXREZWZhdWx0cywgX3JlbW92ZUxpbmtlZExpc3RJdGVtIC8vZm9yIHRoZSBjb21tZW50ZWQtb3V0IGNsYXNzTmFtZSBmZWF0dXJlLlxufSBmcm9tIFwiLi9nc2FwLWNvcmUuanNcIjtcblxudmFyIF93aW4sXG4gICAgX2RvYyxcbiAgICBfZG9jRWxlbWVudCxcbiAgICBfcGx1Z2luSW5pdHRlZCxcbiAgICBfdGVtcERpdixcbiAgICBfdGVtcERpdlN0eWxlcixcbiAgICBfcmVjZW50U2V0dGVyUGx1Z2luLFxuICAgIF9yZXZlcnRpbmcsXG4gICAgX3dpbmRvd0V4aXN0cyA9IGZ1bmN0aW9uIF93aW5kb3dFeGlzdHMoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xufSxcbiAgICBfdHJhbnNmb3JtUHJvcHMgPSB7fSxcbiAgICBfUkFEMkRFRyA9IDE4MCAvIE1hdGguUEksXG4gICAgX0RFRzJSQUQgPSBNYXRoLlBJIC8gMTgwLFxuICAgIF9hdGFuMiA9IE1hdGguYXRhbjIsXG4gICAgX2JpZ051bSA9IDFlOCxcbiAgICBfY2Fwc0V4cCA9IC8oW0EtWl0pL2csXG4gICAgX2hvcml6b250YWxFeHAgPSAvKGxlZnR8cmlnaHR8d2lkdGh8bWFyZ2lufHBhZGRpbmd8eCkvaSxcbiAgICBfY29tcGxleEV4cCA9IC9bXFxzLFxcKF1cXFMvLFxuICAgIF9wcm9wZXJ0eUFsaWFzZXMgPSB7XG4gIGF1dG9BbHBoYTogXCJvcGFjaXR5LHZpc2liaWxpdHlcIixcbiAgc2NhbGU6IFwic2NhbGVYLHNjYWxlWVwiLFxuICBhbHBoYTogXCJvcGFjaXR5XCJcbn0sXG4gICAgX3JlbmRlckNTU1Byb3AgPSBmdW5jdGlvbiBfcmVuZGVyQ1NTUHJvcChyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIE1hdGgucm91bmQoKGRhdGEucyArIGRhdGEuYyAqIHJhdGlvKSAqIDEwMDAwKSAvIDEwMDAwICsgZGF0YS51LCBkYXRhKTtcbn0sXG4gICAgX3JlbmRlclByb3BXaXRoRW5kID0gZnVuY3Rpb24gX3JlbmRlclByb3BXaXRoRW5kKHJhdGlvLCBkYXRhKSB7XG4gIHJldHVybiBkYXRhLnNldChkYXRhLnQsIGRhdGEucCwgcmF0aW8gPT09IDEgPyBkYXRhLmUgOiBNYXRoLnJvdW5kKChkYXRhLnMgKyBkYXRhLmMgKiByYXRpbykgKiAxMDAwMCkgLyAxMDAwMCArIGRhdGEudSwgZGF0YSk7XG59LFxuICAgIF9yZW5kZXJDU1NQcm9wV2l0aEJlZ2lubmluZyA9IGZ1bmN0aW9uIF9yZW5kZXJDU1NQcm9wV2l0aEJlZ2lubmluZyhyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIHJhdGlvID8gTWF0aC5yb3VuZCgoZGF0YS5zICsgZGF0YS5jICogcmF0aW8pICogMTAwMDApIC8gMTAwMDAgKyBkYXRhLnUgOiBkYXRhLmIsIGRhdGEpO1xufSxcbiAgICAvL2lmIHVuaXRzIGNoYW5nZSwgd2UgbmVlZCBhIHdheSB0byByZW5kZXIgdGhlIG9yaWdpbmFsIHVuaXQvdmFsdWUgd2hlbiB0aGUgdHdlZW4gZ29lcyBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgKHJhdGlvOjApXG5fcmVuZGVyQ1NTUHJvcFdpdGhCZWdpbm5pbmdBbmRFbmQgPSBmdW5jdGlvbiBfcmVuZGVyQ1NTUHJvcFdpdGhCZWdpbm5pbmdBbmRFbmQocmF0aW8sIGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCByYXRpbyA9PT0gMSA/IGRhdGEuZSA6IHJhdGlvID8gTWF0aC5yb3VuZCgoZGF0YS5zICsgZGF0YS5jICogcmF0aW8pICogMTAwMDApIC8gMTAwMDAgKyBkYXRhLnUgOiBkYXRhLmIsIGRhdGEpO1xufSxcbiAgICAvL2lmIHVuaXRzIGNoYW5nZSwgd2UgbmVlZCBhIHdheSB0byByZW5kZXIgdGhlIG9yaWdpbmFsIHVuaXQvdmFsdWUgd2hlbiB0aGUgdHdlZW4gZ29lcyBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgKHJhdGlvOjApXG5fcmVuZGVyUm91bmRlZENTU1Byb3AgPSBmdW5jdGlvbiBfcmVuZGVyUm91bmRlZENTU1Byb3AocmF0aW8sIGRhdGEpIHtcbiAgdmFyIHZhbHVlID0gZGF0YS5zICsgZGF0YS5jICogcmF0aW87XG4gIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCB+fih2YWx1ZSArICh2YWx1ZSA8IDAgPyAtLjUgOiAuNSkpICsgZGF0YS51LCBkYXRhKTtcbn0sXG4gICAgX3JlbmRlck5vblR3ZWVuaW5nVmFsdWUgPSBmdW5jdGlvbiBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZShyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIHJhdGlvID8gZGF0YS5lIDogZGF0YS5iLCBkYXRhKTtcbn0sXG4gICAgX3JlbmRlck5vblR3ZWVuaW5nVmFsdWVPbmx5QXRFbmQgPSBmdW5jdGlvbiBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZU9ubHlBdEVuZChyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIHJhdGlvICE9PSAxID8gZGF0YS5iIDogZGF0YS5lLCBkYXRhKTtcbn0sXG4gICAgX3NldHRlckNTU1N0eWxlID0gZnVuY3Rpb24gX3NldHRlckNTU1N0eWxlKHRhcmdldCwgcHJvcGVydHksIHZhbHVlKSB7XG4gIHJldHVybiB0YXJnZXQuc3R5bGVbcHJvcGVydHldID0gdmFsdWU7XG59LFxuICAgIF9zZXR0ZXJDU1NQcm9wID0gZnVuY3Rpb24gX3NldHRlckNTU1Byb3AodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgcmV0dXJuIHRhcmdldC5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpO1xufSxcbiAgICBfc2V0dGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gX3NldHRlclRyYW5zZm9ybSh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSkge1xuICByZXR1cm4gdGFyZ2V0Ll9nc2FwW3Byb3BlcnR5XSA9IHZhbHVlO1xufSxcbiAgICBfc2V0dGVyU2NhbGUgPSBmdW5jdGlvbiBfc2V0dGVyU2NhbGUodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgcmV0dXJuIHRhcmdldC5fZ3NhcC5zY2FsZVggPSB0YXJnZXQuX2dzYXAuc2NhbGVZID0gdmFsdWU7XG59LFxuICAgIF9zZXR0ZXJTY2FsZVdpdGhSZW5kZXIgPSBmdW5jdGlvbiBfc2V0dGVyU2NhbGVXaXRoUmVuZGVyKHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCBkYXRhLCByYXRpbykge1xuICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXA7XG4gIGNhY2hlLnNjYWxlWCA9IGNhY2hlLnNjYWxlWSA9IHZhbHVlO1xuICBjYWNoZS5yZW5kZXJUcmFuc2Zvcm0ocmF0aW8sIGNhY2hlKTtcbn0sXG4gICAgX3NldHRlclRyYW5zZm9ybV
4674dpdGhSZW5kZXIgPSBmdW5jdGlvbiBfc2V0dGVyVHJhbnNmb3JtV2l0aFJlbmRlcih0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgZGF0YSwgcmF0aW8pIHtcbiAgdmFyIGNhY2hlID0gdGFyZ2V0Ll9nc2FwO1xuICBjYWNoZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgY2FjaGUucmVuZGVyVHJhbnNmb3JtKHJhdGlvLCBjYWNoZSk7XG59LFxuICAgIF90cmFuc2Zvcm1Qcm9wID0gXCJ0cmFuc2Zvcm1cIixcbiAgICBfdHJhbnNmb3JtT3JpZ2luUHJvcCA9IF90cmFuc2Zvcm1Qcm9wICsgXCJPcmlnaW5cIixcbiAgICBfc2F2ZVN0eWxlID0gZnVuY3Rpb24gX3NhdmVTdHlsZShwcm9wZXJ0eSwgaXNOb3RDU1MpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXQsXG4gICAgICBzdHlsZSA9IHRhcmdldC5zdHlsZSxcbiAgICAgIGNhY2hlID0gdGFyZ2V0Ll9nc2FwO1xuXG4gIGlmIChwcm9wZXJ0eSBpbiBfdHJhbnNmb3JtUHJvcHMgJiYgc3R5bGUpIHtcbiAgICB0aGlzLnRmbSA9IHRoaXMudGZtIHx8IHt9O1xuXG4gICAgaWYgKHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICBwcm9wZXJ0eSA9IF9wcm9wZXJ0eUFsaWFzZXNbcHJvcGVydHldIHx8IHByb3BlcnR5O1xuICAgICAgfnByb3BlcnR5LmluZGV4T2YoXCIsXCIpID8gcHJvcGVydHkuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnRmbVthXSA9IF9nZXQodGFyZ2V0LCBhKTtcbiAgICAgIH0pIDogdGhpcy50Zm1bcHJvcGVydHldID0gY2FjaGUueCA/IGNhY2hlW3Byb3BlcnR5XSA6IF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSk7IC8vIG5vdGU6IHNjYWxlIHdvdWxkIG1hcCB0byBcInNjYWxlWCxzY2FsZVlcIiwgdGh1cyB3ZSBsb29wIGFuZCBhcHBseSB0aGVtIGJvdGguXG5cbiAgICAgIHByb3BlcnR5ID09PSBfdHJhbnNmb3JtT3JpZ2luUHJvcCAmJiAodGhpcy50Zm0uek9yaWdpbiA9IGNhY2hlLnpPcmlnaW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb3BlcnR5QWxpYXNlcy50cmFuc2Zvcm0uc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIF9zYXZlU3R5bGUuY2FsbChfdGhpcywgcCwgaXNOb3RDU1MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMuaW5kZXhPZihfdHJhbnNmb3JtUHJvcCkgPj0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjYWNoZS5zdmcpIHtcbiAgICAgIHRoaXMuc3ZnbyA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXN2Zy1vcmlnaW5cIik7XG4gICAgICB0aGlzLnByb3BzLnB1c2goX3RyYW5zZm9ybU9yaWdpblByb3AsIGlzTm90Q1NTLCBcIlwiKTtcbiAgICB9XG5cbiAgICBwcm9wZXJ0eSA9IF90cmFuc2Zvcm1Qcm9wO1xuICB9XG5cbiAgKHN0eWxlIHx8IGlzTm90Q1NTKSAmJiB0aGlzLnByb3BzLnB1c2gocHJvcGVydHksIGlzTm90Q1NTLCBzdHlsZVtwcm9wZXJ0eV0pO1xufSxcbiAgICBfcmVtb3ZlSW5kZXBlbmRlbnRUcmFuc2Zvcm1zID0gZnVuY3Rpb24gX3JlbW92ZUluZGVwZW5kZW50VHJhbnNmb3JtcyhzdHlsZSkge1xuICBpZiAoc3R5bGUudHJhbnNsYXRlKSB7XG4gICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJ0cmFuc2xhdGVcIik7XG4gICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJzY2FsZVwiKTtcbiAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eShcInJvdGF0ZVwiKTtcbiAgfVxufSxcbiAgICBfcmV2ZXJ0U3R5bGUgPSBmdW5jdGlvbiBfcmV2ZXJ0U3R5bGUoKSB7XG4gIHZhciBwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldCxcbiAgICAgIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxuICAgICAgY2FjaGUgPSB0YXJnZXQuX2dzYXAsXG4gICAgICBpLFxuICAgICAgcDtcblxuICBmb3IgKGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAvLyBzdG9yZWQgbGlrZSB0aGlzOiBwcm9wZXJ0eSwgaXNOb3RDU1MsIHZhbHVlXG4gICAgaWYgKCFwcm9wc1tpICsgMV0pIHtcbiAgICAgIHByb3BzW2kgKyAyXSA/IHN0eWxlW3Byb3BzW2ldXSA9IHByb3BzW2kgKyAyXSA6IHN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3BzW2ldLnN1YnN0cigwLCAyKSA9PT0gXCItLVwiID8gcHJvcHNbaV0gOiBwcm9wc1tpXS5yZXBsYWNlKF9jYXBzRXhwLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzW2kgKyAxXSA9PT0gMikge1xuICAgICAgLy8gbm9uLUNTUyB2YWx1ZSAoZnVuY3Rpb24tYmFzZWQpXG4gICAgICB0YXJnZXRbcHJvcHNbaV1dKHByb3BzW2kgKyAyXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vbi1DU1MgdmFsdWUgKG5vdCBmdW5jdGlvbi1iYXNlZClcbiAgICAgIHRhcmdldFtwcm9wc1tpXV0gPSBwcm9wc1tpICsgMl07XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMudGZtKSB7XG4gICAgZm9yIChwIGluIHRoaXMudGZtKSB7XG4gICAgICBjYWNoZVtwXSA9IHRoaXMudGZtW3BdO1xuICAgIH1cblxuICAgIGlmIChjYWNoZS5zdmcpIHtcbiAgICAgIGNhY2hlLnJlbmRlclRyYW5zZm9ybSgpO1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcImRhdGEtc3ZnLW9yaWdpblwiLCB0aGlzLnN2Z28gfHwgXCJcIik7XG4gICAgfVxuXG4gICAgaSA9IF9yZXZlcnRpbmcoKTtcblxuICAgIGlmICgoIWkgfHwgIWkuaXNTdGFydCkgJiYgIXN0eWxlW190cmFuc2Zvcm1Qcm9wXSkge1xuICAgICAgX3JlbW92ZUluZGVwZW5kZW50VHJhbnNmb3JtcyhzdHlsZSk7XG5cbiAgICAgIGlmIChjYWNoZS56T3JpZ2luICYmIHN0eWxlW190cmFuc2Zvcm1PcmlnaW5Qcm9wXSkge1xuICAgICAgICBzdHlsZVtfdHJhbnNmb3JtT3JpZ2luUHJvcF0gKz0gXCIgXCIgKyBjYWNoZS56T3JpZ2luICsgXCJweFwiOyAvLyBzaW5jZSB3ZSdyZSB1bmNhY2hpbmcsIHdlIG11c3QgcHV0IHRoZSB6T3JpZ2luIGJhY2sgaW50byB0aGUgdHJhbnNmb3JtT3JpZ2luIHNvIHRoYXQgd2UgY2FuIHB1bGwgaXQgb3V0IGFjY3VyYXRlbHkgd2hlbiB3ZSBwYXJzZSBhZ2Fpbi4gT3RoZXJ3aXNlLCB3ZSdkIGxvc2UgdGhlIHogcG9ydGlvbiBvZiB0aGUgb3JpZ2luIHNpbmNlIHdlIGV4dHJhY3QgaXQgdG8gcHJvdGVjdCBmcm9tIFNhZmFyaSBidWdzLlxuXG4gICAgICAgIGNhY2hlLnpP
4674cmlnaW4gPSAwO1xuICAgICAgICBjYWNoZS5yZW5kZXJUcmFuc2Zvcm0oKTtcbiAgICAgIH1cblxuICAgICAgY2FjaGUudW5jYWNoZSA9IDE7IC8vIGlmIGl0J3MgYSBzdGFydEF0IHRoYXQncyBiZWluZyByZXZlcnRlZCBpbiB0aGUgX2luaXRUd2VlbigpIG9mIHRoZSBjb3JlLCB3ZSBkb24ndCBuZWVkIHRvIHVuY2FjaGUgdHJhbnNmb3Jtcy4gVGhpcyBpcyBwdXJlbHkgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gICAgfVxuICB9XG59LFxuICAgIF9nZXRTdHlsZVNhdmVyID0gZnVuY3Rpb24gX2dldFN0eWxlU2F2ZXIodGFyZ2V0LCBwcm9wZXJ0aWVzKSB7XG4gIHZhciBzYXZlciA9IHtcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBwcm9wczogW10sXG4gICAgcmV2ZXJ0OiBfcmV2ZXJ0U3R5bGUsXG4gICAgc2F2ZTogX3NhdmVTdHlsZVxuICB9O1xuICB0YXJnZXQuX2dzYXAgfHwgZ3NhcC5jb3JlLmdldENhY2hlKHRhcmdldCk7IC8vIGp1c3QgbWFrZSBzdXJlIHRoZXJlJ3MgYSBfZ3NhcCBjYWNoZSBkZWZpbmVkIGJlY2F1c2Ugd2UgcmVhZCBmcm9tIGl0IGluIF9zYXZlU3R5bGUoKSBhbmQgaXQncyBtb3JlIGVmZmljaWVudCB0byBqdXN0IGNoZWNrIGl0IGhlcmUgb25jZS5cblxuICBwcm9wZXJ0aWVzICYmIHRhcmdldC5zdHlsZSAmJiB0YXJnZXQubm9kZVR5cGUgJiYgcHJvcGVydGllcy5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBzYXZlci5zYXZlKHApO1xuICB9KTsgLy8gbWFrZSBzdXJlIGl0J3MgYSBET00gbm9kZSB0b28uXG5cbiAgcmV0dXJuIHNhdmVyO1xufSxcbiAgICBfc3VwcG9ydHMzRCxcbiAgICBfY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50KHR5cGUsIG5zKSB7XG4gIHZhciBlID0gX2RvYy5jcmVhdGVFbGVtZW50TlMgPyBfZG9jLmNyZWF0ZUVsZW1lbnROUygobnMgfHwgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIpLnJlcGxhY2UoL15odHRwcy8sIFwiaHR0cFwiKSwgdHlwZSkgOiBfZG9jLmNyZWF0ZUVsZW1lbnQodHlwZSk7IC8vc29tZSBzZXJ2ZXJzIHN3YXAgaW4gaHR0cHMgZm9yIGh0dHAgaW4gdGhlIG5hbWVzcGFjZSB3aGljaCBjYW4gYnJlYWsgdGhpbmdzLCBtYWtpbmcgXCJzdHlsZVwiIGluYWNjZXNzaWJsZS5cblxuICByZXR1cm4gZSAmJiBlLnN0eWxlID8gZSA6IF9kb2MuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy9zb21lIGVudmlyb25tZW50cyB3b24ndCBhbGxvdyBhY2Nlc3MgdG8gdGhlIGVsZW1lbnQncyBzdHlsZSB3aGVuIGNyZWF0ZWQgd2l0aCBhIG5hbWVzcGFjZSBpbiB3aGljaCBjYXNlIHdlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNyZWF0ZUVsZW1lbnQoKSB0byB3b3JrIGFyb3VuZCB0aGUgaXNzdWUuIEFsc28gbm90ZSB0aGF0IHdoZW4gR1NBUCBpcyBlbWJlZGRlZCBkaXJlY3RseSBpbnNpZGUgYW4gU1ZHIGZpbGUsIGNyZWF0ZUVsZW1lbnQoKSB3b24ndCBhbGxvdyBhY2Nlc3MgdG8gdGhlIHN0eWxlIG9iamVjdCBpbiBGaXJlZm94IChzZWUgaHR0cHM6Ly9nc2FwLmNvbS9mb3J1bXMvdG9waWMvMjAyMTUtcHJvYmxlbS11c2luZy10d2Vlbm1heC1pbi1zdGFuZGFsb25lLXNlbGYtY29udGFpbmluZy1zdmctZmlsZS1lcnItY2Fubm90LXNldC1wcm9wZXJ0eS1jc3N0ZXh0LW9mLXVuZGVmaW5lZC8pLlxufSxcbiAgICBfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIHNraXBQcmVmaXhGYWxsYmFjaykge1xuICB2YXIgY3MgPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gIHJldHVybiBjc1twcm9wZXJ0eV0gfHwgY3MuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eS5yZXBsYWNlKF9jYXBzRXhwLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpKSB8fCBjcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSB8fCAhc2tpcFByZWZpeEZhbGxiYWNrICYmIF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgX2NoZWNrUHJvcFByZWZpeChwcm9wZXJ0eSkgfHwgcHJvcGVydHksIDEpIHx8IFwiXCI7IC8vY3NzIHZhcmlhYmxlcyBtYXkgbm90IG5lZWQgY2FwcyBzd2FwcGVkIG91dCBmb3IgZGFzaGVzIGFuZCBsb3dlcmNhc2UuXG59LFxuICAgIF9wcmVmaXhlcyA9IFwiTyxNb3osbXMsTXMsV2Via2l0XCIuc3BsaXQoXCIsXCIpLFxuICAgIF9jaGVja1Byb3BQcmVmaXggPSBmdW5jdGlvbiBfY2hlY2tQcm9wUHJlZml4KHByb3BlcnR5LCBlbGVtZW50LCBwcmVmZXJQcmVmaXgpIHtcbiAgdmFyIGUgPSBlbGVtZW50IHx8IF90ZW1wRGl2LFxuICAgICAgcyA9IGUuc3R5bGUsXG4gICAgICBpID0gNTtcblxuICBpZiAocHJvcGVydHkgaW4gcyAmJiAhcHJlZmVyUHJlZml4KSB7XG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9XG5cbiAgcHJvcGVydHkgPSBwcm9wZXJ0eS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cigxKTtcblxuICB3aGlsZSAoaS0tICYmICEoX3ByZWZpeGVzW2ldICsgcHJvcGVydHkgaW4gcykpIHt9XG5cbiAgcmV0dXJuIGkgPCAwID8gbnVsbCA6IChpID09PSAzID8gXCJtc1wiIDogaSA+PSAwID8gX3ByZWZpeGVzW2ldIDogXCJcIikgKyBwcm9wZXJ0eTtcbn0sXG4gICAgX2luaXRDb3JlID0gZnVuY3Rpb24gX2luaXRDb3JlKCkge1xuICBpZiAoX3dpbmRvd0V4aXN0cygpICYmIHdpbmRvdy5kb2N1bWVudCkge1xuICAgIF93aW4gPSB3aW5kb3c7XG4gICAgX2RvYyA9IF93aW4uZG9jdW1lbnQ7XG4gICAgX2RvY0VsZW1lbnQgPSBfZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICBfdGVtcERpdiA9IF9jcmVhdGVFbGVtZW50KFwiZGl2XCIpIHx8IHtcbiAgICAgIHN0eWxlOiB7fVxuICAgIH07XG4gICAgX3RlbXBEaXZTdHlsZXIgPSBfY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBfdHJhbnNmb3JtUHJvcCA9IF9jaGVja1Byb3BQcmVmaXgoX3RyYW5zZm9ybVByb3ApO1xuICAgIF90cmFuc2Zvcm1PcmlnaW5Qcm9wID0gX3RyYW5zZm9ybVByb3AgKyBcIk9yaWdpblwiO1xuICAgIF90ZW1wRGl2LnN0eWxlLmNzc1RleHQgPSBcImJvcmRlci13aWR0aDowO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7cGFkZGluZzowXCI7IC8vbWFrZSBzdXJlIHRvIG92ZXJyaWRlIGNlcnRhaW4gcHJvcGVydGllcyB0aGF0IG1heSBjb250YW1pbmF0ZSBtZWFzdXJlbWVudHMsIGluIGNhc2UgdGhlIHVzZXIgaGFzIG92ZXJyZWFjaGluZyBzdHlsZSBzaGVldHMuXG5cbiAgICBfc3VwcG9ydHMzRCA9ICEhX2NoZWNrUHJvcFByZWZpeChcInBlcnNwZWN0aXZlXCIpO1xuICAgIF9yZXZlcnRpbmcgPSBnc2FwLmNvcmUucmV2ZXJ0aW5nO1xuICAgIF9wbHVnaW5Jbml0dGVkID0gMTtcbiAgfVxufSxcbiAgICBfZ2V0UmVwYXJlbnRlZENsb25lQkJveCA9IGZ1bmN0aW9uIF9nZXRSZXBhcmVudGVkQ2xvbmVCQm94KHRhcmdldCkge1xuICAvL3dvcmtzIGFyb3VuZCBpc3N1ZXMgaW4gc29tZSBicm93c2VycyAobGlrZSBGaXJlZm94KSB0aGF0IGRvbid0IGNvcnJlY3RseSByZXBvcnQgZ2V0QkJveCgpIG9uIFNWRyBlbGVtZW50cyBpbnNpZGUgYSA8ZGVmcz4gZWxlbWVudCBhbmQvb3IgPG1hc2s+LiBXZSB0cnkgY3JlYXRpbmcgYW4gU1ZHLCBhZGRpbmcgaXQgdG8gdGhlIGRvY3VtZW50RWxlbWVudCBhbmQgdG9zcyB0aGUgZWxlbWVudCBpbiB0aG
4674VyZSBzbyB0aGF0IGl0J3MgZGVmaW5pdGVseSBwYXJ0IG9mIHRoZSByZW5kZXJpbmcgdHJlZSwgdGhlbiBncmFiIHRoZSBiYm94IGFuZCBpZiBpdCB3b3Jrcywgd2UgYWN0dWFsbHkgc3dhcCBvdXQgdGhlIG9yaWdpbmFsIGdldEJCb3goKSBtZXRob2QgZm9yIG91ciBvd24gdGhhdCBkb2VzIHRoZXNlIGV4dHJhIHN0ZXBzIHdoZW5ldmVyIGdldEJCb3ggaXMgbmVlZGVkLiBUaGlzIGhlbHBzIGVuc3VyZSB0aGF0IHBlcmZvcm1hbmNlIGlzIG9wdGltYWwgKG9ubHkgZG8gYWxsIHRoZXNlIGV4dHJhIHN0ZXBzIHdoZW4gYWJzb2x1dGVseSBuZWNlc3NhcnkuLi5tb3N0IGVsZW1lbnRzIGRvbid0IG5lZWQgaXQpLlxuICB2YXIgb3duZXIgPSB0YXJnZXQub3duZXJTVkdFbGVtZW50LFxuICAgICAgc3ZnID0gX2NyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgb3duZXIgJiYgb3duZXIuZ2V0QXR0cmlidXRlKFwieG1sbnNcIikgfHwgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKSxcbiAgICAgIGNsb25lID0gdGFyZ2V0LmNsb25lTm9kZSh0cnVlKSxcbiAgICAgIGJib3g7XG5cbiAgY2xvbmUuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgc3ZnLmFwcGVuZENoaWxkKGNsb25lKTtcblxuICBfZG9jRWxlbWVudC5hcHBlbmRDaGlsZChzdmcpO1xuXG4gIHRyeSB7XG4gICAgYmJveCA9IGNsb25lLmdldEJCb3goKTtcbiAgfSBjYXRjaCAoZSkge31cblxuICBzdmcucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuXG4gIF9kb2NFbGVtZW50LnJlbW92ZUNoaWxkKHN2Zyk7XG5cbiAgcmV0dXJuIGJib3g7XG59LFxuICAgIF9nZXRBdHRyaWJ1dGVGYWxsYmFja3MgPSBmdW5jdGlvbiBfZ2V0QXR0cmlidXRlRmFsbGJhY2tzKHRhcmdldCwgYXR0cmlidXRlc0FycmF5KSB7XG4gIHZhciBpID0gYXR0cmlidXRlc0FycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgaWYgKHRhcmdldC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlc0FycmF5W2ldKSkge1xuICAgICAgcmV0dXJuIHRhcmdldC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlc0FycmF5W2ldKTtcbiAgICB9XG4gIH1cbn0sXG4gICAgX2dldEJCb3ggPSBmdW5jdGlvbiBfZ2V0QkJveCh0YXJnZXQpIHtcbiAgdmFyIGJvdW5kcywgY2xvbmVkO1xuXG4gIHRyeSB7XG4gICAgYm91bmRzID0gdGFyZ2V0LmdldEJCb3goKTsgLy9GaXJlZm94IHRocm93cyBlcnJvcnMgaWYgeW91IHRyeSBjYWxsaW5nIGdldEJCb3goKSBvbiBhbiBTVkcgZWxlbWVudCB0aGF0J3Mgbm90IHJlbmRlcmVkIC
4674hsaWtlIGluIGEgPHN5bWJvbD4gb3IgPGRlZnM+KS4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjEyMTE4XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYm91bmRzID0gX2dldFJlcGFyZW50ZWRDbG9uZUJCb3godGFyZ2V0KTtcbiAgICBjbG9uZWQgPSAxO1xuICB9XG5cbiAgYm91bmRzICYmIChib3VuZHMud2lkdGggfHwgYm91bmRzLmhlaWdodCkgfHwgY2xvbmVkIHx8IChib3VuZHMgPSBfZ2V0UmVwYXJlbnRlZENsb25lQkJveCh0YXJnZXQpKTsgLy9zb21lIGJyb3dzZXJzIChsaWtlIEZpcmVmb3gpIG1pc3JlcG9ydCB0aGUgYm91bmRzIGlmIHRoZSBlbGVtZW50IGhhcyB6ZXJvIHdpZHRoIGFuZCBoZWlnaHQgKGl0IGp1c3QgYXNzdW1lcyBpdCdzIGF0IHg6MCwgeTowKSwgdGh1cyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGdyYWIgdGhlIHBvc2l0aW9uIGluIHRoYXQgY2FzZS5cblxuICByZXR1cm4gYm91bmRzICYmICFib3VuZHMud2lkdGggJiYgIWJvdW5kcy54ICYmICFib3VuZHMueSA/IHtcbiAgICB4OiArX2dldEF0dHJpYnV0ZUZhbGxiYWNrcyh0YXJnZXQsIFtcInhcIiwgXCJjeFwiLCBcIngxXCJdKSB8fCAwLFxuICAgIHk6ICtfZ2V0QXR0cmlidXRlRmFsbGJhY2tzKHRhcmdldCwgW1wieVwiLCBcImN5XCIsIFwieTFcIl0pIHx8IDAsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH0gOiBib3VuZHM7XG59LFxuICAgIF9pc1NWRyA9IGZ1bmN0aW9uIF9pc1NWRyhlKSB7XG4gIHJldHVybiAhIShlLmdldENUTSAmJiAoIWUucGFyZW50Tm9kZSB8fCBlLm93bmVyU1ZHRWxlbWVudCkgJiYgX2dldEJCb3goZSkpO1xufSxcbiAgICAvL3JlcG9ydHMgaWYgdGhlIGVsZW1lbnQgaXMgYW4gU1ZHIG9uIHdoaWNoIGdldEJCb3goKSBhY3R1YWxseSB3b3Jrc1xuX3JlbW92ZVByb3BlcnR5ID0gZnVuY3Rpb24gX3JlbW92ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHkpIHtcbiAgaWYgKHByb3BlcnR5KSB7XG4gICAgdmFyIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxuICAgICAgICBmaXJzdDJDaGFycztcblxuICAgIGlmIChwcm9wZXJ0eSBpbiBfdHJhbnNmb3JtUHJvcHMgJiYgcHJvcGVydHkgIT09IF90cmFuc2Zvcm1PcmlnaW5Qcm9wKSB7XG4gICAgICBwcm9wZXJ0eSA9IF90cmFuc2Zvcm1Qcm9wO1xuICAgIH1cblxuICAgIGlmIChzdHlsZS5yZW1vdmVQcm9wZXJ0eSkge1xuICAgICAgZmlyc3QyQ2hhcnMgPSBwcm9wZXJ0eS5zdWJzdHIoMCwgMik7XG5cbiAgICAgIGlmIChmaXJzdDJDaGFycyA9PT0gXCJtc1wiIHx8IHByb3BlcnR5LnN1YnN0cigwLCA2KSA9PT0gXCJ3ZWJraXRcIikge1xuICAgICAgICAvL01pY3Jvc29mdCBhbmQgc29tZSBXZWJraXQgYnJvd3NlcnMgZG9uJ3QgY29uZm9ybSB0byB0aGUgc3RhbmRhcmQgb2YgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBwcmVmaXggY2hhcmFjdGVyLCBzbyB3ZSBhZGp1c3Qgc28gdGhhdCB3aGVuIHdlIHByZWZpeCB0aGUgY2FwcyB3aXRoIGEgZGFzaCwgaXQncyBjb3JyZWN0IChvdGhlcndpc2UgaXQnZCBiZSBcIm1zLXRyYW5zZm9ybVwiIGluc3RlYWQgb2YgXCItbXMtdHJhbnNmb3JtXCIgZm9yIElFOSwgZm9yIGV4YW1wbGUpXG4gICAgICAgIHByb3BlcnR5ID0gXCItXCIgKyBwcm9wZXJ0eTtcbiAgICAgIH1cblxuICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoZmlyc3QyQ2hhcnMgPT09IFwiLS1cIiA/IHByb3BlcnR5IDogcHJvcGVydHkucmVwbGFjZShfY2Fwc0V4cCwgXCItJDFcIikudG9Mb3dlckNhc2UoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbm90ZTogb2xkIHZlcnNpb25zIG9mIElFIHVzZSBcInJlbW92ZUF0dHJpYnV0ZSgpXCIgaW5zdGVhZCBvZiBcInJlbW92ZVByb3BlcnR5KClcIlxuICAgICAgc3R5bGUucmVtb3ZlQXR0cmlidXRlKHByb3BlcnR5KTtcbiAgICB9XG4gIH1cbn0sXG4gICAgX2FkZE5vblR3ZWVuaW5nUFQgPSBmdW5jdGlvbiBfYWRkTm9uVHdlZW5pbmdQVChwbHVnaW4sIHRhcmdldCwgcHJvcGVydHksIGJlZ2lubmluZywgZW5kLCBvbmx5U2V0QXRFbmQpIHtcbiAgdmFyIHB0ID0gbmV3IFByb3BUd2VlbihwbHVnaW4uX3B0LCB0YXJnZXQsIHByb3BlcnR5LCAwLCAxLCBvbmx5U2V0QXRFbmQgPyBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZU9ubHlBdEVuZCA6IF9yZW5kZXJOb25Ud2VlbmluZ1ZhbHVlKTtcbiAgcGx1Z2luLl9wdCA9IHB0O1xuICBwdC5iID0gYmVnaW5uaW5nO1xuICBwdC5lID0gZW5kO1xuXG4gIHBsdWdpbi5fcHJvcHMucHVzaChwcm9wZXJ0eSk7XG5cbiAgcmV0dXJuIHB0O1xufSxcbiAgICBfbm9uQ29udmVydGlibGVVbml0cyA9IHtcbiAgZGVnOiAxLFxuICByYWQ6IDEsXG4gIHR1cm46IDFcbn0sXG4gICAgX25vblN0YW5kYXJkTGF5b3V0cyA9IHtcbiAgZ3JpZDogMSxcbiAgZmxleDogMVxufSxcbiAgICAvL3Rha2VzIGEgc2luZ2xlIHZhbHVlIGxpa2UgMjBweCBhbmQgY29udmVydHMgaXQgdG8gdGhlIHVuaXQgc3BlY2lmaWVkLCBsaWtlIFwiJVwiLCByZXR1cm5pbmcgb25seSB0aGUgbnVtZXJpYyBhbW91bnQuXG5fY29udmVydFRvVW5pdCA9IGZ1bmN0aW9uIF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCB1bml0KSB7XG4gIHZhciBjdXJWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpIHx8IDAsXG4gICAgICBjdXJVbml0ID0gKHZhbHVlICsgXCJcIikudHJpbSgpLnN1YnN0cigoY3VyVmFsdWUgKyBcIlwiKS5sZW5ndGgpIHx8IFwicHhcIixcbiAgICAgIC8vIHNvbWUgYnJvd3NlcnMgbGVhdmUgZXh0cmEgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIENTUyB2YXJpYWJsZXMsIGhlbmNlIHRoZSBuZWVkIHRvIHRyaW0oKVxuICBzdHlsZSA9IF90ZW1wRGl2LnN0eWxlLFxuICAgICAgaG9yaXpvbnRhbCA9IF9ob3Jpem9udGFsRXhwLnRlc3QocHJvcGVydHkpLFxuICAgICAgaXNSb290U1ZHID0gdGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIixcbiAgICAgIG1lYXN1cmVQcm9wZXJ0eSA9IChpc1Jvb3RTVkcgPyBcImNsaWVudFwiIDogXCJvZmZzZXRcIikgKyAoaG9yaXpvbnRhbCA/IFwiV2lkdGhcIiA6IFwiSGVpZ2h0XCIpLFxuICAgICAgYW1vdW50ID0gMTAwLFxuICAgICAgdG9QaXhlbHMgPSB1bml0ID09PSBcInB4XCIsXG4gICAgICB0b1BlcmNlbnQgPSB1bml0ID09PSBcIiVcIixcbiAgICAgIHB4LFxuICAgICAgcGFyZW50LFxuICAgICAgY2FjaGUsXG4gICAgICBpc1NWRztcblxuICBpZiAodW5pdCA9PT0gY3VyVW5pdCB8fCAhY3VyVmFsdWUgfHwgX25vbkNvbnZlcnRpYmxlVW5pdHNbdW5pdF0gfHwgX25vbkNvbnZlcnRpYmxlVW5pdHNbY3VyVW5pdF0pIHtcbiAgICByZXR1cm4gY3VyVmFsdWU7XG4gIH1cblxuICBjdXJVbml0ICE9PSBcInB4XCIgJiYgIXRvUGl4ZWxzICYmIChjdXJWYWx1ZSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCBcInB4XCIpKTtcbiAgaXNTVkcgPSB0YXJnZXQuZ2V0Q1RNICYmIF9pc1NWRyh0YXJnZXQpO1xuXG4gIGlmICgodG9QZXJjZW50IHx8IGN1clVuaXQgPT09IFwiJVwiKSAmJiAoX3RyYW5zZm9ybVByb3BzW3Byb3BlcnR5XSB8fCB+cHJvcGVydHkuaW5kZXhPZihcImFkaXVzXCIpKSkge1xuICAgIHB4ID0gaXNTVkcgPyB0YXJnZXQuZ2V0QkJveCgpW2hvcml6b250YWwgPyBcIndpZHRoXCIgOiBcImhlaWdodFwiXSA6IHRhcmdldFttZWFzdXJlUHJvcGVydHldO1xuICAgIHJldHVybi
4674Bfcm91bmQodG9QZXJjZW50ID8gY3VyVmFsdWUgLyBweCAqIGFtb3VudCA6IGN1clZhbHVlIC8gMTAwICogcHgpO1xuICB9XG5cbiAgc3R5bGVbaG9yaXpvbnRhbCA/IFwid2lkdGhcIiA6IFwiaGVpZ2h0XCJdID0gYW1vdW50ICsgKHRvUGl4ZWxzID8gY3VyVW5pdCA6IHVuaXQpO1xuICBwYXJlbnQgPSB1bml0ICE9PSBcInJlbVwiICYmIH5wcm9wZXJ0eS5pbmRleE9mKFwiYWRpdXNcIikgfHwgdW5pdCA9PT0gXCJlbVwiICYmIHRhcmdldC5hcHBlbmRDaGlsZCAmJiAhaXNSb290U1ZHID8gdGFyZ2V0IDogdGFyZ2V0LnBhcmVudE5vZGU7XG5cbiAgaWYgKGlzU1ZHKSB7XG4gICAgcGFyZW50ID0gKHRhcmdldC5vd25lclNWR0VsZW1lbnQgfHwge30pLnBhcmVudE5vZGU7XG4gIH1cblxuICBpZiAoIXBhcmVudCB8fCBwYXJlbnQgPT09IF9kb2MgfHwgIXBhcmVudC5hcHBlbmRDaGlsZCkge1xuICAgIHBhcmVudCA9IF9kb2MuYm9keTtcbiAgfVxuXG4gIGNhY2hlID0gcGFyZW50Ll9nc2FwO1xuXG4gIGlmIChjYWNoZSAmJiB0b1BlcmNlbnQgJiYgY2FjaGUud2lkdGggJiYgaG9yaXpvbnRhbCAmJiBjYWNoZS50aW1lID09PSBfdGlja2VyLnRpbWUgJiYgIWNhY2hlLnVuY2FjaGUpIHtcbiAgICByZXR1cm4gX3JvdW5kKGN1clZhbHVlIC8gY2FjaGUud2lkdGggKiBhbW91bnQpO1xuICB9IGVsc2Uge1xuICAgIGlmICh0b1BlcmNlbnQgJiYgKHByb3BlcnR5ID09PSBcImhlaWdodFwiIHx8IHByb3BlcnR5ID09PSBcIndpZHRoXCIpKSB7XG4gICAgICAvLyBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggd2lkdGgvaGVpZ2h0IHRoYXQncyBpbnNpZGUgYSBjb250YWluZXIgd2l0aCBwYWRkaW5nIGFuZC9vciBpdCdzIGEgZmxleGJveC9ncmlkIGNvbnRhaW5lciwgd2UgbXVzdCBhcHBseSBpdCB0byB0aGUgdGFyZ2V0IGl0c2VsZiByYXRoZXIgdGhhbiB0aGUgX3RlbXBEaXYgaW4gb3JkZXIgdG8gZW5zdXJlIGNvbXBsZXRlIGFjY3VyYWN5LCBmYWN0b3JpbmcgaW4gdGhlIHBhcmVudCdzIHBhZGRpbmcuXG4gICAgICB2Y
4674XIgdiA9IHRhcmdldC5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICB0YXJnZXQuc3R5bGVbcHJvcGVydHldID0gYW1vdW50ICsgdW5pdDtcbiAgICAgIHB4ID0gdGFyZ2V0W21lYXN1cmVQcm9wZXJ0eV07XG4gICAgICB2ID8gdGFyZ2V0LnN0eWxlW3Byb3BlcnR5XSA9IHYgOiBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICh0b1BlcmNlbnQgfHwgY3VyVW5pdCA9PT0gXCIlXCIpICYmICFfbm9uU3RhbmRhcmRMYXlvdXRzW19nZXRDb21wdXRlZFByb3BlcnR5KHBhcmVudCwgXCJkaXNwbGF5XCIpXSAmJiAoc3R5bGUucG9zaXRpb24gPSBfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIFwicG9zaXRpb25cIikpO1xuICAgICAgcGFyZW50ID09PSB0YXJnZXQgJiYgKHN0eWxlLnBvc2l0aW9uID0gXCJzdGF0aWNcIik7IC8vIGxpa2UgZm9yIGJvcmRlclJhZGl1cywgaWYgaXQncyBhICUgd2UgbXVzdCBoYXZlIGl0IHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgaXRzZWxmIGJ1dCB0aGF0IG1heSBub3QgaGF2ZSBwb3NpdGlvbjogcmVsYXRpdmUgb3IgcG9zaXRpb246IGFic29sdXRlIGluIHdoaWNoIGNhc2UgaXQnZCBnbyB1cCB0aGUgY2hhaW4gdW50aWwgaXQgZmluZHMgaXRzIG9mZnNldFBhcmVudCAoYmFkKS4gcG9zaXRpb246IHN0YXRpYyBwcm90ZWN0cyBhZ2FpbnN0IHRoYXQuXG5cbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChfdGVtcERpdik7XG4gICAgICBweCA9IF90ZW1wRGl2W21lYXN1cmVQcm9wZXJ0eV07XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoX3RlbXBEaXYpO1xuICAgICAgc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgfVxuXG4gICAgaWYgKGhvcml6b250YWwgJiYgdG9QZXJjZW50KSB7XG4gICAgICBjYWNoZSA9IF9nZXRDYWNoZShwYXJlbnQpO1xuICAgICAgY2FjaGUudGltZSA9IF90aWNrZXIudGltZTtcbiAgICAgIGNhY2hlLndpZHRoID0gcGFyZW50W21lYXN1cmVQcm9wZXJ0eV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9yb3VuZCh0b1BpeGVscyA/IHB4ICogY3VyVmFsdWUgLyBhbW91bnQgOiBweCAmJiBjdXJWYWx1ZSA/IGFtb3VudCAvIHB4ICogY3VyVmFsdWUgOiAwKTtcbn0sXG4gICAgX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCwgdW5jYWNoZSkge1xuICB2YXIgdmFsdWU7XG4gIF9wbHVnaW5Jbml0dGVkIHx8IF9pbml0Q29yZSgpO1xuXG4gIGlmIChwcm9wZXJ0eSBpbiBfcHJvcGVydHlBbGlhc2VzICYmIHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgcHJvcGVydHkgPSBfcHJvcGVydHlBbGlhc2VzW3Byb3BlcnR5XTtcblxuICAgIGlmICh+cHJvcGVydHkuaW5kZXhPZihcIixcIikpIHtcbiAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3BsaXQoXCIsXCIpWzBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChfdHJhbnNmb3JtUHJvcHNbcHJvcGVydHldICYmIHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgdmFsdWUgPSBfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCB1bmNhY2hlKTtcbiAgICB2YWx1ZSA9IHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybU9yaWdpblwiID8gdmFsdWVbcHJvcGVydHldIDogdmFsdWUuc3ZnID8gdmFsdWUub3JpZ2luIDogX2ZpcnN0VHdvT25seShfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIF90cmFuc2Zvcm1PcmlnaW5Qcm9wKSkgKyBcIiBcIiArIHZhbHVlLnpPcmlnaW4gKyBcInB4XCI7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSB0YXJnZXQuc3R5bGVbcHJvcGVydHldO1xuXG4gICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZSA9PT0gXCJhdXRvXCIgfHwgdW5jYWNoZSB8fCB+KHZhbHVlICsgXCJcIikuaW5kZXhPZihcImNhbGMoXCIpKSB7XG4gICAgICB2YWx1ZSA9IF9zcGVjaWFsUHJvcHNbcHJvcGVydHldICYmIF9zcGVjaWFsUHJvcHNbcHJvcGVydHldKHRhcmdldCwgcHJvcGVydHksIHVuaXQpIHx8IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgcHJvcGVydHkpIHx8IF9nZXRQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5KSB8fCAocHJvcGVydHkgPT09IFwib3BhY2l0eVwiID8gMSA6IDApOyAvLyBub3RlOiBzb21lIGJyb3dzZXJzLCBsaWtlIEZpcmVmb3gsIGRvbid0IHJlcG9ydCBib3JkZXJSYWRpdXMgY29ycmVjdGx5ISBJbnN0ZWFkLCBpdCBvbmx5IHJlcG9ydHMgZXZlcnkgY29ybmVyIGxpa2UgIGJvcmRlclRvcExlZnRSYWRpdXNcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5pdCAmJiAhfih2YWx1ZSArIFwiXCIpLnRyaW0oKS5pbmRleE9mKFwiIFwiKSA/IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCB1bml0KSArIHVuaXQgOiB2YWx1ZTtcbn0sXG4gICAgX3R3ZWVuQ29tcGxleENTU1N0cmluZyA9IGZ1bmN0aW9uIF90d2VlbkNvbXBsZXhDU1NTdHJpbmcodGFyZ2V0LCBwcm9wLCBzdGFydCwgZW5kKSB7XG4gIC8vIG5vdGU6IHdlIGNhbGwgX3R3ZWVuQ29tcGxleENTU1N0cmluZy5jYWxsKHBsdWdpbkluc3RhbmNlLi4uKSB0byBlbnN1cmUgdGhhdCBpdCdzIHNjb3BlZCBwcm9wZXJseS4gV2UgbWF5IGNhbGwgaXQgZnJvbSB3aXRoaW4gYSBwbHVnaW4gdG9vLCB0aHVzIFwidGhpc1wiIHdvdWxkIHJlZmVyIHRvIHRoZSBwbHVnaW4uXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPT09IFwibm9uZVwiKSB7XG4gICAgLy8gc29tZSBicm93c2VycyBsaWtlIFNhZmFyaSBhY3R1YWxseSBQUkVGRVIgdGhlIHByZWZpeGVkIHByb3BlcnR5IGFuZCBtaXMtcmVwb3J0IHRoZSB1bnByZWZpeGVkIHZhbHVlIGxpa2UgY2xpcFBhdGggKEJVRykuIEluIG90aGVyIHdvcmRzLCBldmVuIHRob3VnaCBjbGlwUGF0aCBleGlzdHMgaW4gdGhlIHN0eWxlIChcImNsaXBQYXRoXCIgaW4gdGFyZ2V0LnN0eWxlKSBhbmQgaXQncyBzZXQgaW4gdGhlIENTUyBwcm9wZXJseSAoYWxvbmcgd2l0aCAtd2Via2l0LWNsaXAtcGF0aCksIFNhZmFyaSByZXBvcnRzIGNsaXBQYXRoIGFzIFwibm9uZVwiIHdoZXJlYXMgV2Via2l0Q2xpcFBhdGggcmVwb3J0cyBhY2N1cmF0ZWx5IGxpa2UgXCJlbGxpcHNlKDEwMCUgMCUgYXQgNTAlIDAlKVwiLCBzbyBpbiB0aGlzIGNhc2Ugd2UgbXVzdCBTV0lUQ0ggdG8gdXNpbmcgdGhlIHByZWZpeGVkIHByb3BlcnR5IGluc3RlYWQuIFNlZSBodHRwczovL2dzYXAuY29tL2ZvcnVtcy90b3BpYy8xODMxMC1jbGlwcGF0aC1kb2VzbnQtd29yay1vbi1pb3MvXG4gICAgdmFyIHAgPSBfY2hlY2tQcm9wUHJlZml4KHByb3AsIHRhcmdldCwgMSksXG4gICAgICAgI
4674HMgPSBwICYmIF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgcCwgMSk7XG5cbiAgICBpZiAocyAmJiBzICE9PSBzdGFydCkge1xuICAgICAgcHJvcCA9IHA7XG4gICAgICBzdGFydCA9IHM7XG4gICAgfSBlbHNlIGlmIChwcm9wID09PSBcImJvcmRlckNvbG9yXCIpIHtcbiAgICAgIHN0YXJ0ID0gX2dldENvbXB1dGVkUHJvcGVydHkodGFyZ2V0LCBcImJvcmRlclRvcENvbG9yXCIpOyAvLyBGaXJlZm94IGJ1ZzogYWx3YXlzIHJlcG9ydHMgXCJib3JkZXJDb2xvclwiIGFzIFwiXCIsIHNvIHdlIG11c3QgZmFsbCBiYWNrIHRvIGJvcmRlclRvcENvbG9yLiBTZWUgaHR0cHM6Ly9nc2FwLmNvbS9mb3J1bXMvdG9waWMvMjQ1ODMtaG93LXRvLXJldHVybi1jb2xvcnMtdGhhdC1pLWhhZC1hZnRlci1yZXZlcnNlL1xuICAgIH1cbiAgfVxuXG4gIHZhciBwdCA9IG5ldyBQcm9wVHdlZW4odGhpcy5fcHQsIHRhcmdldC5zdHlsZSwgcHJvcCwgMCwgMSwgX3JlbmRlckNvbXBsZXhTdHJpbmcpLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgbWF0Y2hJbmRleCA9IDAsXG4gICAgICBhLFxuICAgICAgcmVzdWx0LFxuICAgICAgc3RhcnRWYWx1ZXMsXG4gICAgICBzdGFydE51bSxcbiAgICAgIGNvbG9yLFxuICAgICAgc3RhcnRWYWx1ZSxcbiAgICAgIGVuZFZhbHVlLFxuICAgICAgZW5kTnVtLFxuICAgICAgY2h1bmssXG4gICAgICBlbmRVbml0LFxuICAgICAgc3RhcnRVbml0LFxuICAgICAgZW5kVmFsdWVzO1xuICBwdC5iID0gc3RhcnQ7XG4gIHB0LmUgPSBlbmQ7XG4gIHN0YXJ0ICs9IFwiXCI7IC8vIGVuc3VyZSB2YWx1ZXMgYXJlIHN0cmluZ3NcblxuICBlbmQgKz0gXCJcIjtcblxuICBpZiAoZW5kLnN1YnN0cmluZygwLCA2KSA9PT0gXCJ2YXIoLS1cIikge1xuICAgIGVuZCA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgZW5kLnN1YnN0cmluZyg0LCBlbmQuaW5kZXhPZihcIilcIikpKTtcbiAgfVxuXG4gIGlmIChlbmQgPT09IFwiYXV0b1wiKSB7XG4gICAgc3RhcnRWYWx1ZSA9IHRhcmdldC5zdHlsZVtwcm9wXTtcbiAgICB0YXJnZXQuc3R5bGVbcHJvcF0gPSBlbmQ7XG4gICAgZW5kID0gX2dldENvbXB1dGVkUHJvcGVydHkodGFyZ2V0LCBwcm9wKSB8fCBlbmQ7XG4gICAgc3RhcnRWYWx1ZSA/IHRhcmdldC5zdHlsZVtwcm9wXSA9IHN0YXJ0VmFsdWUgOiBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBwcm9wKTtcbiAgfVxuXG4gIGEgPSBbc3RhcnQsIGVuZF07XG5cbiAgX2NvbG9yU3RyaW5nRmlsdGVyKGEpOyAvLyBwYXNzIGFuIGFycmF5IHdpdGggdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdmFsdWVzIGFuZCBsZXQgdGhlIGZpbHRlciBkbyB3aGF0ZXZlciBpdCBuZWVkcyB0byB0aGUgdmFsdWVzLiBJZiBjb2xvcnMgYXJlIGZvdW5kLCBpdCByZXR1cm5zIHRydWUgYW5kIHRoZW4gd2UgbXVzdCBtYXRjaCB3aGVyZSB0aGUgY29sb3Igc2hvd3MgdXAgb3JkZXItd2lzZSBiZWNhdXNlIGZvciB0aGluZ3MgbGlrZSBib3hTaGFkb3csIHNvbWV0aW1lcyB0aGUgYnJvd3NlciBwcm92aWRlcyB0aGUgY29tcHV0ZWQgdmFsdWVzIHdpdGggdGhlIGNvbG9yIEZJUlNULCBidXQgdGhlIHVzZXIgcHJvdmlkZXMgaXQgd2l0aCB0aGUgY29sb3IgTEFTVCwgc28gZmxpcCB0aGVtIGlmIG5lY2Vzc2FyeS4gU2FtZSBmb3IgZHJvcC1zaGFkb3coKS5cblxuXG4gIHN0YXJ0ID0gYVswXTtcbiAgZW5kID0gYVsxXTtcbiAgc3RhcnRWYWx1ZXMgPSBzdGFydC5tYXRjaChfbnVtV2l0aFVuaXRFeHApIHx8IFtdO1xuICBlbmRWYWx1ZXMgPSBlbmQubWF0Y2goX251bVdpdGhVbml0RXhwKSB8fCBbXTtcblxuICBpZiAoZW5kVmFsdWVzLmxlbmd0aCkge1xuICAgIHdoaWxlIChyZXN1bHQgPSBfbnVtV2l0aFVuaXRFeHAuZXhlYyhlbmQpKSB7XG4gICAgICBlbmRWYWx1ZSA9IHJlc3VsdFswXTtcbiAgICAgIGNodW5rID0gZW5kLnN1YnN0cmluZyhpbmRleCwgcmVzdWx0LmluZGV4KTtcblxuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgIGNvbG9yID0gKGNvbG9yICsgMSkgJSA1O1xuICAgICAgfSBlbHNlIGlmIChjaHVuay5zdWJzdHIoLTUpID09PSBcInJnYmEoXCIgfHwgY2h1bmsuc3Vic3RyKC01KSA9PT0gXCJoc2xhKFwiKSB7XG4gICAgICAgIGNvbG9yID0gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuZFZhbHVlICE9PSAoc3RhcnRWYWx1ZSA9IHN0YXJ0VmFsdWVzW21hdGNoSW5kZXgrK10gfHwgXCJcIikpIHtcbiAgICAgICAgc3RhcnROdW0gPSBwYXJzZUZsb2F0KHN0YXJ0VmFsdWUpIHx8IDA7XG4gICAgICAgIHN0YXJ0VW5pdCA9IHN0YXJ0VmFsdWUuc3Vic3RyKChzdGFydE51bSArIFwiXCIpLmxlbmd0aCk7XG4gICAgICAgIGVuZFZhbHVlLmNoYXJBdCgxKSA9PT0gXCI9XCIgJiYgKGVuZFZhbHVlID0gX3BhcnNlUmVsYXRpdmUoc3RhcnROdW0sIG
4674VuZFZhbHVlKSArIHN0YXJ0VW5pdCk7XG4gICAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpO1xuICAgICAgICBlbmRVbml0ID0gZW5kVmFsdWUuc3Vic3RyKChlbmROdW0gKyBcIlwiKS5sZW5ndGgpO1xuICAgICAgICBpbmRleCA9IF9udW1XaXRoVW5pdEV4cC5sYXN0SW5kZXggLSBlbmRVbml0Lmxlbmd0aDtcblxuICAgICAgICBpZiAoIWVuZFVuaXQpIHtcbiAgICAgICAgICAvL2lmIHNvbWV0aGluZyBsaWtlIFwicGVyc3BlY3RpdmU6MzAwXCIgaXMgcGFzc2VkIGluIGFuZCB3ZSBtdXN0IGFkZCBhIHVuaXQgdG8gdGhlIGVuZFxuICAgICAgICAgIGVuZFVuaXQgPSBlbmRVbml0IHx8IF9jb25maWcudW5pdHNbcHJvcF0gfHwgc3RhcnRVbml0O1xuXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBlbmQubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbmQgKz0gZW5kVW5pdDtcbiAgICAgICAgICAgIHB0LmUgKz0gZW5kVW5pdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnRVbml0ICE9PSBlbmRVbml0KSB7XG4gICAgICAgICAgc3RhcnROdW0gPSBfY29udmVydFRvVW5pdCh0YXJnZXQsIHByb3AsIHN0YXJ0VmFsdWUsIGVuZFVuaXQpIHx8IDA7XG4gICAgICAgIH0gLy8gdGhlc2UgbmVzdGVkIFByb3BUd2VlbnMgYXJlIGhhbmRsZWQgaW4gYSBzcGVjaWFsIHdheSAtIHdlJ2xsIG5ldmVyIGFjdHVhbGx5IGNhbGwgYSByZW5kZXIgb3Igc2V0dGVyIG1ldGhvZCBvbiB0aGVtLiBXZSdsbCBqdXN0IGxvb3AgdGhyb3VnaCB0aGVtIGluIHRoZSBwYXJlbnQgY29tcGxleCBzdHJpbmcgUHJvcFR3ZWVuJ3MgcmVuZGVyIG1ldGhvZC5cblxuXG4gICAgICAgIHB0Ll9wdCA9IHtcbiAgICAgICAgICBfbmV4dDogcHQuX3B0LFxuICAgICAgICAgIHA6IGNodW5rIHx8IG1hdGNoSW5kZXggPT09IDEgPyBjaHVuayA6IFwiLFwiLFxuICAgICAgICAgIC8vbm90ZTogU1ZHIHNwZWMgYWxsb3dzIG9taXNzaW9uIG9mIGNvbW1hL3NwYWNlIHdoZW4gYSBuZWdhdGl2ZSBzaWduIGlzIHdlZGdlZCBiZXR3ZWVuIHR3byBudW1iZXJzLCBsaWtlIDIuNS01LjMgaW5zdGVhZCBvZiAyLjUsLTUuMyBidXQgd2hlbiB0d2VlbmluZywgdGhlIG5lZ2F0aXZlIHZhbHVlIG1heSBzd2l0Y2ggdG8gcG9zaXRpdmUsIHNvIHdlIGluc2VydCB0aGUgY29tbWEganVzdCBpbiBjYXNlLlxuICAgICAgICAgIHM6IHN0YXJ0TnVtLFxuICAgICAgICAgIGM6IGVuZE51bSAtIHN0YXJ0TnVtLFxuICAgICAgICAgIG06IGNvbG9yICYmIGNvbG9yIDwgNCB8fCBwcm9wID09PSBcInpJbmRleFwiID8gTWF0aC5yb3VuZCA6IDBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdC5jID0gaW5kZXggPCBlbmQubGVuZ3RoID8gZW5kLnN1YnN0cmluZyhpbmRleCwgZW5kLmxlbmd0aCkgOiBcIlwiOyAvL3dlIHVzZSB0aGUgXCJjXCIgb2YgdGhlIFByb3BUd2VlbiB0byBzdG9yZSB0aGUgZmluYWwgcGFydCBvZiB0aGUgc3RyaW5nIChhZnRlciB0aGUgbGFzdCBudW1iZXIpXG4gIH0gZWxzZSB7XG4gICAgcHQuciA9IHByb3AgPT09IFwiZGlzcGxheVwiICYmIGVuZCA9PT0gXCJub25lXCIgPyBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZU9ubHlBdEVuZCA6IF9yZW5kZXJOb25Ud2VlbmluZ1ZhbHVlO1xuICB9XG5cbiAgX3JlbEV4cC50ZXN0KGVuZCkgJiYgKHB0LmUgPSAwKTsgLy9pZiB0aGUgZW5kIHN0cmluZyBjb250YWlucyByZWxhdGl2ZSB2YWx1ZXMgb3IgZHluYW1pYyByYW5kb20oLi4uKSB2YWx1ZXMsIGRlbGV0ZSB0aGUgZW5kIGl0IHNvIHRoYXQgb24gdGhlIGZpbmFsIHJlbmRlciB3ZSBkb24ndCBhY3R1YWxseSBzZXQgaXQgdG8gdGhlIHN0cmluZyB3aXRoICs9IG9yIC09IGNoYXJhY3RlcnMgKGZvcmNlcyBpdCB0byB1c2UgdGhlIGNhbGN1bGF0ZWQgdmFsdWUpLlxuXG4gIHRoaXMuX3B0ID0gcHQ7IC8vc3RhcnQgdGhlIGxpbmtlZCBsaXN0IHdpdGggdGhpcyBuZXcgUHJvcFR3ZWVuLiBSZW1lbWJlciwgd2UgY2FsbCBfdHdlZW5Db21wbGV4Q1NTU3RyaW5nLmNhbGwocGx1Z2luSW5zdGFuY2UuLi4pIHRvIGVuc3VyZSB0aGF0IGl0J3Mgc2NvcGVkIHByb3Blcmx5LiBXZSBtYXkgY2FsbCBpdCBmcm9tIHdpdGhpbiBhbm90aGVyIHBsdWdpbiB0b28sIHRodXMgXCJ0aGlzXCIgd291bGQgcmVmZXIgdG8gdGhlIHBsdWdpbi5cblxuICByZXR1cm4gcHQ7XG59LFxuICAgIF9rZXl3b3JkVG9QZXJjZW50ID0ge1xuICB0b3A6IFwiMCVcIixcbiAgYm90dG9tOiBcIjEwMCVcIixcbiAgbGVmdDogXCIwJVwiLFxuICByaWdodDogXCIxMDAlXCIsXG4gIGNlbnRlcjogXCI1MCVcIlxufSxcbiAgICBfY29udmVydEtleXdvcmRzVG9QZXJjZW50YWdlcyA9IGZ1bmN0aW9uIF9jb252ZXJ0S2V5d29yZHNUb1BlcmNlbnRhZ2VzKHZhbHVlKSB7XG4gIHZhciBzcGxpdCA9IHZhbHVlLnNwbGl0KFwiIFwiKSxcbiAgICAgIHggPSBzcGxpdFswXSxcbiAgICAgIHkgPSBzcGxpdFsxXSB8fCBcIjUwJVwiO1xuXG4gIGlmICh4ID09PSBcInRvcFwiIHx8IHggPT09IFwiYm90dG9tXCIgfHwgeSA9PT0gXCJsZWZ0XCIgfHwgeSA9PT0gXCJyaWdodFwiKSB7XG4gICAgLy90aGUgdXNlciBwcm92aWRlZCB0aGVtIGluIHRoZSB3cm9uZyBvcmRlciwgc28gZmxpcCB0aGVtXG4gICAgdmFsdWUgPSB4O1xuICAgIHggPSB5O1xuICAgIHkgPSB2YWx1ZTtcbiAgfVxuXG4gIHNwbGl0WzBdID0gX2tleXdvcmRUb1BlcmNlbnRbeF0gfHwgeDtcbiAgc3BsaXRbMV0gPSBfa2V5d29yZFRvUGVyY2VudFt5XSB8fCB5O1xuICByZXR1cm4gc3BsaXQuam9pbihcIiBcIik7XG59LFxuICAgIF9yZW5kZXJDbGVhclByb3BzID0gZnVuY3Rpb24gX3JlbmRlckNsZWFyUHJvcHMocmF0aW8sIGRhdGEpIHtcbiAgaWYgKGRhdGEudHdlZW4gJiYgZGF0YS50d2Vlbi5fdGltZSA9PT0gZGF0YS50d2Vlbi5fZHVyKSB7XG4gICAgdmFyIHRhcmdldCA9IGRhdGEudCxcbiAgICAgICAgc3R5bGUgPSB0YXJnZXQuc3R5bGUsXG4gICAgICAgIHByb3BzID0gZGF0YS51LFxuICAgICAgICBjYWNoZSA9IHRhcmdldC5fZ3NhcCxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgY2xlYXJUcmFuc2Zvcm1zLFxuICAgICAgICBpO1xuXG4gICAgaWYgKHByb3BzID09PSBcImFsbFwiIHx8IHByb3BzID09PSB0cnVlKSB7XG4gICAgICBzdHlsZS5jc3NUZXh0ID0gXCJcIjtcbiAgICAgIGNsZWFyVHJhbnNmb3JtcyA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3BzID0gcHJvcHMuc3BsaXQoXCIsXCIpO1xuICAgICAgaSA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKC0taSA+IC0xKSB7XG4gICAgICAgI
4674HByb3AgPSBwcm9wc1tpXTtcblxuICAgICAgICBpZiAoX3RyYW5zZm9ybVByb3BzW3Byb3BdKSB7XG4gICAgICAgICAgY2xlYXJUcmFuc2Zvcm1zID0gMTtcbiAgICAgICAgICBwcm9wID0gcHJvcCA9PT0gXCJ0cmFuc2Zvcm1PcmlnaW5cIiA/IF90cmFuc2Zvcm1PcmlnaW5Qcm9wIDogX3RyYW5zZm9ybVByb3A7XG4gICAgICAgIH1cblxuICAgICAgICBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBwcm9wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xlYXJUcmFuc2Zvcm1zKSB7XG4gICAgICBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBfdHJhbnNmb3JtUHJvcCk7XG5cbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjYWNoZS5zdmcgJiYgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTtcbiAgICAgICAgc3R5bGUuc2NhbGUgPSBzdHlsZS5yb3RhdGUgPSBzdHlsZS50cmFuc2xhdGUgPSBcIm5vbmVcIjtcblxuICAgICAgICBfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCAxKTsgLy8gZm9yY2UgYWxsIHRoZSBjYWNoZWQgdmFsdWVzIGJhY2sgdG8gXCJub3JtYWxcIi9pZGVudGl0eSwgb3RoZXJ3aXNlIGlmIHRoZXJlJ3MgYW5vdGhlciB0d2VlbiB0aGF0J3MgYWxyZWFkeSBzZXQgdG8gcmVuZGVyIHRyYW5zZm9ybXMgb24gdGhpcyBlbGVtZW50LCBpdCBjb3VsZCBkaXNwbGF5IHRoZSB3cm9uZyB2YWx1ZXMuXG5cblxuICAgICAgICBjYWNoZS51bmNhY2hlID0gMTtcblxuICAgICAgICBfcmVtb3ZlSW5kZXBlbmRlbnRUcmFuc2Zvcm1zKHN0eWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0sXG4gICAgLy8gbm90ZTogc3BlY2lhbFByb3BzIHNob3VsZCByZXR1cm4gMSBpZiAoYW5kIG9ubHkgaWYpIHRoZXkgaGF2ZSBhIG5vbi16ZXJvIHByaW9yaXR5LiBJdCBpbmRpY2F0ZXMgd2UgbmVlZCB0byBzb3J0IHRoZSBsaW5rZWQgbGlzdC5cbl9zcGVjaWFsUHJvcHMgPSB7XG4gIGNsZWFyUHJvcHM6IGZ1bmN0aW9uIGNsZWFyUHJvcHMocGx1Z2luLCB0YXJnZXQsIHByb3BlcnR5LCBlbmRWYWx1ZSwgdHdlZW4pIHtcbiAgICBpZiAodHdlZW4uZGF0YSAhPT0gXCJpc0Zyb21TdGFydFwiKSB7XG4gICAgICB2Y
4674XIgcHQgPSBwbHVnaW4uX3B0ID0gbmV3IFByb3BUd2VlbihwbHVnaW4uX3B0LCB0YXJnZXQsIHByb3BlcnR5LCAwLCAwLCBfcmVuZGVyQ2xlYXJQcm9wcyk7XG4gICAgICBwdC51ID0gZW5kVmFsdWU7XG4gICAgICBwdC5wciA9IC0xMDtcbiAgICAgIHB0LnR3ZWVuID0gdHdlZW47XG5cbiAgICAgIHBsdWdpbi5fcHJvcHMucHVzaChwcm9wZXJ0eSk7XG5cbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuICAvKiBjbGFzc05hbWUgZmVhdHVyZSAoYWJvdXQgMC40a2IgZ3ppcHBlZCkuXG4gICwgY2xhc3NOYW1lKHBsdWdpbiwgdGFyZ2V0LCBwcm9wZXJ0eSwgZW5kVmFsdWUsIHR3ZWVuKSB7XG4gIFx0bGV0IF9yZW5kZXJDbGFzc05hbWUgPSAocmF0aW8sIGRhdGEpID0+IHtcbiAgXHRcdFx0ZGF0YS5jc3MucmVuZGVyKHJhdGlvLCBkYXRhLmNzcyk7XG4gIFx0XHRcdGlmICghcmF0aW8gfHwgcmF0aW8gPT09IDEpIHtcbiAgXHRcdFx0XHRsZXQgaW5saW5lID0gZGF0YS5ybXYsXG4gIFx0XHRcdFx0XHR0YXJnZXQgPSBkYXRhLnQsXG4gIFx0XHRcdFx0XHRwO1xuICBcdFx0XHRcdHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCByYXRpbyA/IGRhdGEuZSA6IGRhdGEuYik7XG4gIFx0XHRcdFx0Zm9yIChwIGluIGlubGluZSkge1xuICBcdFx0XHRcdFx0X3JlbW92ZVByb3BlcnR5KHRhcmdldCwgcCk7XG4gIFx0XHRcdFx0fVxuICBcdFx0XHR9XG4gIFx0XHR9LFxuICBcdFx0X2dldEFsbFN0eWxlcyA9ICh0YXJnZXQpID0+IHtcbiAgXHRcdFx0bGV0IHN0eWxlcyA9IHt9LFxuICBcdFx0XHRcdGNvbXB1dGVkID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLFxuICBcdFx0XHRcdHA7XG4gIFx0XHRcdGZvciAocCBpbiBjb21wdXRlZCkge1xuICBcdFx0XHRcdGlmIChpc05hTihwKSAmJiBwICE9PSBcImNzc1RleHRcIiAmJiBwICE9PSBcImxlbmd0aFwiKSB7XG4gIFx0XHRcdFx0XHRzdHlsZXNbcF0gPSBjb21wdXRlZFtwXTtcbiAgXHRcdFx0XHR9XG4gIFx0XHRcdH1cbiAgXHRcdFx0X3NldERlZmF1bHRzKHN0eWxlcywgX3BhcnNlVHJhbnNmb3JtKHRhcmdldCwgMSkpO1xuICBcdFx0XHRyZXR1cm4gc3R5bGVzO1xuICBcdFx0fSxcbiAgXHRcdHN0YXJ0Q2xhc3NMaXN0ID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpLFxuICBcdFx0c3R5bGUgPSB0YXJnZXQuc3R5bGUsXG4gIFx0XHRjc3NUZXh0ID0gc3R5bGUuY3NzVGV4dCxcbiAgXHRcdGNhY2hlID0gdGFyZ2V0Ll9nc2FwLFxuICBcdFx0Y2xhc3NQVCA9IGNhY2hlLmNsYXNzUFQsXG4gIFx0XHRpbmxpbmVUb1JlbW92ZUF0RW5kID0ge30sXG4gIFx0XHRkYXRhID0ge3Q6dGFyZ2V0LCBwbHVnaW46cGx1Z2luLCBybXY6aW5saW5lVG9SZW1vdmVBdEVuZCwgYjpzdGFydENsYXNzTGlzdCwgZTooZW5kVmFsdWUuY2hhckF0KDEpICE9PSBcIj1cIikgPyBlbmRWYWx1ZSA6IHN0YXJ0Q2xhc3NMaXN0LnJlcGxhY2UobmV3IFJlZ0V4cChcIig/OlxcXFxzfF4pXCIgKyBlbmRWYWx1ZS5zdWJzdHIoMikgKyBcIig/IVtcXFxcdy1dKVwiKSwgXCJcIikgKyAoKGVuZFZhbHVlLmNoYXJBdCgwKSA9PT0gXCIrXCIpID8gXCIgXCIgKyBlbmRWYWx1ZS5zdWJzdHIoMikgOiBcIlwiKX0sXG4gIFx0XHRjaGFuZ2luZ1ZhcnMgPSB7fSxcbiAgXHRcdHN0YXJ0VmFycyA9IF9nZXRBbGxTdHlsZXModGFyZ2V0KSxcbiAgXHRcdHRyYW5zZm9ybVJlbGF0ZWQgPSAvKHRyYW5zZm9ybXxwZXJzcGVjdGl2ZSkvaSxcbiAgXHRcdGVuZFZhcnMsIHA7XG4gIFx0aWYgKGNsYXNzUFQpIHtcbiAgXHRcdGNsYXNzUFQucigxLCBjbGFzc1BULmQpO1xuICBcdFx0X3JlbW92ZUxpbmtlZExpc3RJdGVtKGNsYXNzUFQuZC5wbHVnaW4sIGNsYXNzUFQsIFwiX3B0XCIpO1xuICBcdH1cbiAgXHR0YXJnZXQuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgZGF0YS5lKTtcbiAgXHRlbmRWYXJzID0gX2dldEFsbFN0eWxlcyh0YXJnZXQsIHRydWUpO1xuICBcdHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBzdGFydENsYXNzTGlzdCk7XG4gIFx0Zm9yIChwIGluIGVuZFZhcnMpIHtcbiAgXHRcdGlmIChlbmRWYXJzW3BdICE9PSBzdGFydFZhcnNbcF0gJiYgIXRyYW5zZm9ybVJlbGF0ZWQudGVzdChwKSkge1xuICBcdFx0XHRjaGFuZ2luZ1ZhcnNbcF0gPSBlbmRWYXJzW3BdO1xuICBcdFx0XHRpZiAoIXN0eWxlW3BdICYmIHN0eWxlW3BdICE9PSBcIjBcIikge1xuICBcdFx0XHRcdGlubGluZVRvUmVtb3ZlQXRFbmRbcF0gPSAxO1xuICBcdFx0XHR9XG4gIFx0XHR9XG4gIFx0fVxuICBcdGNhY2hlLmNsYXNzUFQgPSBwbHVnaW4uX3B0ID0gbmV3IFByb3BUd2VlbihwbHVnaW4uX3B0LCB0YXJnZXQsIFwiY2xhc3NOYW1lXCIsIDAsIDAsIF9yZW5kZXJDbGFzc05hbWUsIGRhdGEsIDAsIC0xMSk7XG4gIFx0aWYgKHN0eWxlLmNzc1RleHQgIT09IGNzc1RleHQpIHsgLy9vbmx5IGFwcGx5IGlmIHRoaW5ncyBjaGFuZ2UuIE90aGVyd2lzZSwgaW4gY2FzZXMgbGlrZSBhIGJhY2tncm91bmQtaW1hZ2UgdGhhdCdzIHB1bGxlZCBkeW5hbWljYWxseSwgaXQgY291bGQgY2F1c2UgYSByZWZyZXNoLiBTZWUgaHR0cHM6Ly9nc2FwLmNvbS9mb3J1bXMvdG9waWMvMjAzNjgtcG9zc2libGUtZ3NhcC1idWctc3dpdGNoaW5nLWNsYXNzbmFtZXMtaW4tY2hyb21lLy5cbiAgXHRcdHN0eWxlLmNzc1RleHQgPSBjc3NUZXh0OyAvL3dlIHJlY29yZGVkIGNzc1RleHQgYmVmb3JlIHdlIHN3YXBwZWQgY2xhc3NlcyBhbmQgcmFuIF9nZXRBbGxTdHlsZXMoKSBiZWNhdXNlIGluIGNhc2VzIHdoZW4gYSBjbGFzc05hbWUgdHdlZW4gaXMgb3ZlcndyaXR0ZW4sIHdlIHJlbW92ZSBhbGwgdGhlIHJlbGF0ZWQgdHdlZW5pbmcgcHJvcGVydGllcyBmcm9tIHRoYXQgY2xhc3MgY2hhbmdlIChvdGhlcndpc2UgY2xhc3Mtc3BlY2lmaWMgc3R1ZmYgY2FuJ3Qgb3ZlcnJpZGUgcHJvcGVydGllcyB3ZSd2ZSBkaXJlY3RseSBzZXQgb24gdGhlIHRhcmdldCdzIHN0eWxlIG9iamVjdCBkdWUgdG8gc3BlY2lmaWNpdHkpLlxuICBcdH1cbiAgXHRfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCB0cnVlKTsgLy90byBjbGVhciB0aGUgY2FjaGluZyBvZiB0cmFuc2Zvcm1zXG4gIFx0ZGF0YS5jc3MgPSBuZXcgZ3NhcC5wbHVnaW5zLm
4674NzcygpO1xuICBcdGRhdGEuY3NzLmluaXQodGFyZ2V0LCBjaGFuZ2luZ1ZhcnMsIHR3ZWVuKTtcbiAgXHRwbHVnaW4uX3Byb3BzLnB1c2goLi4uZGF0YS5jc3MuX3Byb3BzKTtcbiAgXHRyZXR1cm4gMTtcbiAgfVxuICAqL1xuXG59LFxuXG4vKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFRSQU5TRk9STVNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cbl9pZGVudGl0eTJETWF0cml4ID0gWzEsIDAsIDAsIDEsIDAsIDBdLFxuICAgIF9yb3RhdGlvbmFsUHJvcGVydGllcyA9IHt9LFxuICAgIF9pc051bGxUcmFuc2Zvcm0gPSBmdW5jdGlvbiBfaXNOdWxsVHJhbnNmb3JtKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gXCJtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMClcIiB8fCB2YWx1ZSA9PT0gXCJub25lXCIgfHwgIXZhbHVlO1xufSxcbiAgICBfZ2V0Q29tcHV0ZWRUcmFuc2Zvcm1NYXRyaXhBc0FycmF5ID0gZnVuY3Rpb24gX2dldENvbXB1dGVkVHJhbnNmb3JtTWF0cml4QXNBcnJheSh0YXJnZXQpIHtcbiAgdmFyIG1hdHJpeFN0cmluZyA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgX3RyYW5zZm9ybVByb3ApO1xuXG4gIHJldHVybiBfaXNOdWxsVHJhbnNmb3JtKG1hdHJpeFN0cmluZykgPyBfaWRlbnRpdHkyRE1hdHJpeCA6IG1hdHJpeFN0cmluZy5zdWJzdHIoNykubWF0Y2goX251bUV4cCkubWFwKF9yb3VuZCk7XG59LFxuICAgIF9nZXRNYXRyaXggPSBmdW5jdGlvbiBfZ2V0TWF0cml4KHRhcmdldCwgZm9yY2UyRCkge1xuICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXAgfHwgX2dldENhY2hlKHRhcmdldCksXG4gICAgICBzdHlsZSA9IHRhcmdldC5zdHlsZSxcbiAgICAgIG1hdHJpeCA9IF9nZXRDb21wdXRlZFRyYW5zZm9ybU1hdHJpeEFzQXJyYXkodGFyZ2V0KSxcbiAgICAgIHBhcmVudCxcbiAgICAgIG5leHRTaWJsaW5nLFxuICAgICAgdGVtcCxcbiAgICAgIGFkZGVkVG9ET007XG5cbiAgaWYgKGNhY2hlLnN2ZyAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIpKSB7XG4gICAgdGVtcCA9IHRhcmdldC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpLm1hdHJpeDsgLy9lbnN1cmVzIHRoYXQgZXZlbiBjb21wbGV4IHZhbHVlcyBsaWtlIFwidHJhbnNsYXRlKDUwLDYwKSByb3RhdGUoMTM1LDAsMClcIiBhcmUgcGFyc2VkIGJlY2F1c2UgaXQgbWFzaGVzIGl0IGludG8gYSBtYXRyaXguXG5cbiAgICBtYXRyaXggPSBbdGVtcC5hLCB0ZW1wLmIsIHRlbXAuYywgdGVtcC5kLCB0ZW1wLmUsIHRlbXAuZl07XG4gICAgcmV0dXJuIG1hdHJpeC5qb2luKFwiLFwiKSA9PT0gXCIxLDAsMCwxLDAsMFwiID8gX2lkZW50aXR5MkRNYXRyaXggOiBtYXRyaXg7XG4gIH0gZWxzZSBpZiAobWF0cml4ID09PSBfaWRlbnRpdHkyRE1hdHJpeCAmJiAhdGFyZ2V0Lm9mZnNldFBhcmVudCAmJiB0YXJnZXQgIT09IF9kb2NFbGVtZW50ICYmICFjYWNoZS5zdmcpIHtcbiAgICAvL25vdGU6IGlmIG9mZnNldFBhcmVudCBpcyBudWxsLCB0aGF0IG1lYW5zIHRoZSBlbGVtZW50IGlzbid0IGluIHRoZSBub3JtYWwgZG9jdW1lbnQgZmxvdywgbGlrZSBpZiBpdCBoYXMgZGlzcGxheTpub25lIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzIGhhcyBkaXNwbGF5Om5vbmUpLiBGaXJlZm94IHJldHVybnMgbnVsbCBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSgpIGlmIHRoZSBlbGVtZW50IGlzIGluIGFuIGlmcmFtZSB0aGF0IGhhcyBkaXNwbGF5Om5vbmUuIGh0dHBzOi8vYnVnemlsbGEubW96
4674aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTU0ODM5N1xuICAgIC8vYnJvd3NlcnMgZG9uJ3QgcmVwb3J0IHRyYW5zZm9ybXMgYWNjdXJhdGVseSB1bmxlc3MgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIERPTSBhbmQgaGFzIGEgZGlzcGxheSB2YWx1ZSB0aGF0J3Mgbm90IFwibm9uZVwiLiBGaXJlZm94IGFuZCBNaWNyb3NvZnQgYnJvd3NlcnMgaGF2ZSBhIHBhcnRpYWwgYnVnIHdoZXJlIHRoZXknbGwgcmVwb3J0IHRyYW5zZm9ybXMgZXZlbiBpZiBkaXNwbGF5Om5vbmUgQlVUIG5vdCBhbnkgcGVyY2VudGFnZS1iYXNlZCB2YWx1ZXMgbGlrZSB0cmFuc2xhdGUoLTUwJSwgOHB4KSB3aWxsIGJlIHJlcG9ydGVkIGFzIGlmIGl0J3MgdHJhbnNsYXRlKDAsIDhweCkuXG4gICAgdGVtcCA9IHN0eWxlLmRpc3BsYXk7XG4gICAgc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICBwYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZTtcblxuICAgIGlmICghcGFyZW50IHx8ICF0YXJnZXQub2Zmc2V0UGFyZW50ICYmICF0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpIHtcbiAgICAgIC8vIG5vdGU6IGluIDMuMy4wIHdlIHN3aXRjaGVkIHRhcmdldC5vZmZzZXRQYXJlbnQgdG8gX2RvYy5ib2R5LmNvbnRhaW5zKHRhcmdldCkgdG8gYXZvaWQgW3NvbWV0aW1lcyB1bm5lY2Vzc2FyeV0gTXV0YXRpb25PYnNlcnZlciBjYWxscyBidXQgdGhhdCB3YXNuJ3QgYWRlcXVhdGUgYmVjYXVzZSB0aGVyZSBhcmUgZWRnZSBjYXNlcyB3aGVyZSBuZXN0ZWQgcG9zaXRpb246IGZpeGVkIGVsZW1lbnRzIG5lZWQgdG8gZ2V0IHJlcGFyZW50ZWQgdG8gYWNjdXJhdGVseSBzZW5zZSB0cmFuc2Zvcm1zLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dyZWVuc29jay9HU0FQL2lzc3Vlcy8zODggYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmVlbnNvY2svR1NBUC9pc3N1ZXMvMzc1LiBOb3RlOiBwb3NpdGlvbjogZml4ZWQgZWxlbWVudHMgcmVwb3J0IGEgbnVsbCBvZmZzZXRQYXJlbnQgYnV0IHRoZXkgY291bGQgYWxzbyBiZSBpbnZpc2libGUgYmVjYXVzZSB0aGV5J3JlIGluIGFuIGFuY2VzdG9yIHdpdGggZGlzcGxheTogbm9uZSwgc28gd2UgY2hlY2sgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuIFdlIG9ubHkgd2FudCB0byBhbHRlciB0aGUgRE9NIGlmIHdlIGFic29sdXRlbHkgaGF2ZSB0byBiZWNhdXNlIGl0IGNhbiBjYXVzZSBpZnJhbWUgY29udGVudCB0byByZWxvYWQsIGxpa2UgYSBWaW1lbyB2aWRlby5cbiAgICAgIGFkZGVkVG9ET00gPSAxOyAvL2ZsYWdcblxuICAgICAgbmV4dFNpYmxpbmcgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICBfZG9jRWxlbWVudC5hcHBlbmRDaGlsZCh0YXJnZXQpOyAvL3dlIG11c3QgYWRkIGl0IHRvIHRoZSBET00gaW4gb3JkZXIgdG8gZ2V0IHZhbHVlcyBwcm9wZXJseVxuXG4gICAgfVxuXG4gICAgbWF0cml4ID0gX2dldENvbXB1dGVkVHJhbnNmb3JtTWF0cml4QXNBcnJheSh0YXJnZXQpO1xuICAgIHRlbXAgPyBzdHlsZS5kaXNwbGF5ID0gdGVtcCA6IF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIFwiZGlzcGxheVwiKTtcblxuICAgIGlmIChhZGRlZFRvRE9NKSB7XG4gICAgICBuZXh0U2libGluZyA/IHBhcmVudC5pbnNlcnRCZWZvcmUodGFyZ2V0LCBuZXh0U2libGluZykgOiBwYXJlbnQgPyBwYXJlbnQuYXBwZW5kQ2hpbGQodGFyZ2V0KSA6IF9kb2NFbGVtZW50LnJlbW92ZUNoaWxkKHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZvcmNlMkQgJiYgbWF0cml4Lmxlbmd0aCA+IDYgPyBbbWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFs0XSwgbWF0cml4WzVdLCBtYXRyaXhbMTJdLCBtYXRyaXhbMTNdXSA6IG1hdHJpeDtcbn0sXG4gICAgX2FwcGx5U1ZHT3JpZ2luID0gZnVuY3Rpb24gX2FwcGx5U1ZHT3JpZ2luKHRhcmdldCwgb3JpZ2luLCBvcmlnaW5Jc0Fic29sdXRlLCBzbW9vdGgsIG1hdHJpeEFycmF5LCBwbHVnaW5Ub0FkZFByb3BUd2VlbnNUbykge1xuICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXAsXG4gICAgICBtYXRyaXggPSBtYXRyaXhBcnJheSB8fCBfZ2V0TWF0cml4KHRhcmdldCwgdHJ1ZSksXG4gICAgICB4T3JpZ2luT2xkID0gY2FjaGUueE9yaWdpbiB8fCAwLFxuICAgICAgeU9yaWdpbk9sZCA9IGNhY2hlLnlPcmlnaW4gfHwgMCxcbiAgICAgIHhPZmZzZXRPbGQgPSBjYWNoZS54T2Zmc2V0IHx8IDAsXG4gICAgICB5T2Zmc2V0T2xkID0gY2FjaGUueU9mZnNldCB8fCAwLFxuICAgICAgYSA9IG1hdHJpeFswXSxcbiAgICAgIGIgPSBtYXRyaXhbMV0sXG4gICAgICBjID0gbWF0cml4WzJdLFxuICAgICAgZCA9IG1hdHJpeFszXSxcbiAgICAgIHR4ID0gbWF0cml4WzRdLFxuICAgICAgdHkgPSBtYXRyaXhbNV0sXG4gICAgICBvcmlnaW5TcGxpdCA9IG9yaWdpbi5zcGxpdChcIiBcIiksXG4gICAgICB4T3JpZ2luID0gcGFyc2VGbG9hdChvcmlnaW5TcGxpdFswXSkgfHwgMCxcbiAgICAgIHlPcmlnaW4gPSBwYXJzZUZsb2F0KG9yaWdpblNwbGl0WzFdKSB8fCAwLFxuICAgICAgYm91bmRzLFxuICAgICAgZGV0ZXJtaW5hbnQsXG4gICAgICB4LFxuICAgICAgeTtcblxuICBpZiAoIW9yaWdpbklzQWJzb2x1dGUpIHtcbiAgICBib3VuZHMgPSBfZ2V0QkJveCh0YXJnZXQpO1xuICAgIHhPcmlnaW4gPSBib3VuZHMueCArICh+b3JpZ2luU3BsaXRbMF0uaW5kZXhPZihcIiVcIikgPyB4T3JpZ2luIC8gMTAwICogYm91bmRzLndpZHRoIDogeE9yaWdpbik7XG4gICAgeU9yaWdpbiA9IGJvdW5kcy55ICsgKH4ob3JpZ2luU3BsaXRbMV0gfHwgb3JpZ2luU3BsaXRbMF0pLmluZGV4T2YoXCIlXCIpID8geU9yaWdpbiAvIDEwMCAqIGJvdW5kcy5oZWlnaHQgOiB5T3JpZ2luKTsgLy8gaWYgKCEoXCJ4T3JpZ2luXCIgaW4gY2FjaGUpICYmICh4T3JpZ2luIHx8IHlPcmlnaW4pKSB7IC8vIGFkZGVkIGluIDMuMTIuMywgcmV2ZXJ0ZWQgaW4gMy4xMi40OyByZXF1aXJlcyBtb3JlIGV4cGxvcmF0aW9uXG4gICAgLy8gXHR4T3JpZ2luIC09IGJvdW5kcy54O1xuICAgIC8vIFx0eU9yaWdpbiAtPSBib3VuZHMueTtcbiAgICAvLyB9XG4gIH0gZWxzZSBpZiAobWF0cml4ICE9PSBfaWRlbnRpdHkyRE1hdHJpeCAmJiAoZGV0ZXJtaW5hbnQgPSBhICogZCAtIGIgKiBjKSkge1xuICAgIC8vaWYgaXQncyB6ZXJvIChsaWtlIGlmIHNjYWxlWCBhbmQgc2NhbGVZIGFyZSB6ZXJvKSwgc2tpcCBpdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBkaXZpZGluZyBieSB6ZXJvLlxuICAgIHggPSB4T3JpZ2luICogKGQgLyBkZXRlcm1pbmFudCkgKyB5T3Jp
4674Z2luICogKC1jIC8gZGV0ZXJtaW5hbnQpICsgKGMgKiB0eSAtIGQgKiB0eCkgLyBkZXRlcm1pbmFudDtcbiAgICB5ID0geE9yaWdpbiAqICgtYiAvIGRldGVybWluYW50KSArIHlPcmlnaW4gKiAoYSAvIGRldGVybWluYW50KSAtIChhICogdHkgLSBiICogdHgpIC8gZGV0ZXJtaW5hbnQ7XG4gICAgeE9yaWdpbiA9IHg7XG4gICAgeU9yaWdpbiA9IHk7IC8vIHRoZW9yeTogd2Ugb25seSBoYWQgdG8gZG8gdGhpcyBmb3Igc21vb3RoaW5nIGFuZCBpdCBhc3N1bWVzIHRoYXQgdGhlIHByZXZpb3VzIG9uZSB3YXMgbm90IG9yaWdpbklzQWJzb2x1dGUuXG4gIH1cblxuICBpZiAoc21vb3RoIHx8IHNtb290aCAhPT0gZmFsc2UgJiYgY2FjaGUuc21vb3RoKSB7XG4gICAgdHggPSB4T3JpZ2luIC0geE9yaWdpbk9sZDtcbiAgICB0eSA9IHlPcmlnaW4gLSB5T3JpZ2luT2xkO1xuICAgIGNhY2hlLnhPZmZzZXQgPSB4T2Zmc2V0T2xkICsgKHR4ICogYSArIHR5ICogYykgLSB0eDtcbiAgICBjYWNoZS55T2Zmc2V0ID0geU9mZnNldE9sZCArICh0eCAqIGIgKyB0eSAqIGQpIC0gdHk7XG4gIH0gZWxzZSB7XG4gICAgY2FjaGUueE9mZnNldCA9IGNhY2hlLnlPZmZzZXQgPSAwO1xuICB9XG5cbiAgY2FjaGUueE9yaWdpbiA9IHhPcmlnaW47XG4gIGNhY2hlLnlPcmlnaW4gPSB5T3JpZ2luO1xuICBjYWNoZS5zbW9vdGggPSAhIXNtb290aDtcbiAgY2FjaGUub3JpZ2luID0gb3JpZ2luO1xuICBjYWNoZS5vcmlnaW5Jc0Fic29sdXRlID0gISFvcmlnaW5Jc0Fic29sdXRlO1xuICB0YXJnZXQuc3R5bGVbX3RyYW5zZm9ybU9yaWdpblByb3BdID0gXCIwcHggMHB4XCI7IC8vb3RoZXJ3aXNlLCBpZiBzb21lb25lIHNldHMgIGFuIG9yaWdpbiB2aWEgQ1NTLCBpdCB3aWxsIGxpa2VseSBpbnRlcmZlcmUgd2l0aCB0aGUgU1ZHIHRyYW5zZm9ybSBhdHRyaWJ1dGUgb25lcyAoYmVjYXVzZSByZW1lbWJlciwgd2UncmUgYmFraW5nIHRoZSBvcmlnaW4gaW50byB0aGUgbWF0cml4KCkgdmFsdWUpLlxuXG4gIGlmIChwbHVnaW5Ub0FkZFByb3BUd2VlbnNUbykge1xuICAgIF9hZGROb25Ud2VlbmluZ1BUKHBsdWdpblRvQWRkUHJvcFR3ZWVuc1RvLCBjYWNoZSwgXCJ4T3JpZ2luXCIsIHhPcmlnaW5PbGQsIHhPcmlnaW4pO1xuXG4gICAgX2FkZE5vblR3ZWVuaW5nUFQocGx1Z2luVG9BZGRQcm9wVHdlZW5zVG8sIGNhY2hlLCBcInlPcmlnaW5cIiwgeU9yaWdpbk9sZCwgeU9yaWdpbik7XG5cbiAgICBfYWRkTm9uVHdlZW5pbmdQVChwbHVnaW5Ub0FkZFByb3BUd2VlbnNUbywgY2FjaGUsIFwieE9mZnNldFwiLCB4T2Zmc2V0T2xkLCBjYWNoZS54T2Zmc2V0KTtcblxuICAgIF9hZGROb25Ud2VlbmluZ1BUKHBsdWdpblRvQWRkUHJvcFR3ZWVuc1RvLCBjYWNoZSwgXCJ5T2Zmc2V0XCIsIHlPZmZzZXRPbGQsIGNhY2hlLnlPZmZzZXQpO1xuICB9XG5cbiAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcImRhdGEtc3ZnLW9yaWdpblwiLCB4T3JpZ2luICsgXCIgXCIgKyB5T3JpZ2luKTtcbn0sXG4gICAgX3BhcnNlVHJhbnNmb3JtID0gZnVuY3Rpb24gX3BhcnNlVHJhbnNmb3JtKHRhcmdldCwgdW5jYWNoZSkge1xuICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXAgfHwgbmV3IEdTQ2FjaGUodGFyZ2V0KTtcblxuICBpZiAoXCJ4XCIgaW4gY2FjaGUgJiYgIXVuY2FjaGUgJiYgIWNhY2hlLnVuY2FjaGUpIHtcbiAgICByZXR1cm4gY2FjaGU7XG4gIH1cblxuICB2YXIgc3R5bGUgPSB0YXJnZXQuc3R5bGUsXG4gICAgICBpbnZlcnRlZFNjYWxlWCA9IGNhY2hlLnNjYWxlWCA8IDAsXG4gICAgICBweCA9IFwicHhcIixcbiAgICAgIGRlZyA9IFwiZGVnXCIsXG4gICAgICBjcyA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KSxcbiAgICAgIG9yaWdpbiA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgX3RyYW5zZm9ybU9yaWdpblByb3ApIHx8IFwiMFwiLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB6LFxuICAgICAgc2NhbGVYLFxuICAgICAgc2NhbGVZLFxuICAgICAgcm90YXRpb24sXG4gICAgICByb3RhdGlvblgsXG4gICAgICByb3RhdGlvblksXG4gICAgICBza2V3WCxcbiAgICAgIHNrZXdZLFxuICAgICAgcGVyc3BlY3RpdmUsXG4gICAgICB4T3JpZ2luLFxuICAgICAgeU9yaWdpbixcbiAgICAgIG1hdHJpeCxcbiAgICAgIGFuZ2xlLFxuICAgICAgY29zLFxuICAgICAgc2luLFxuICAgICAgYSxcbiAgICAgIGIsXG4gICAgICBjLFxuICAgICAgZCxcbiAgICAgIGExMixcbiAgICAgIGEyMixcbiAgICAgIHQxLFxuICAgICAgdDIsXG4gICAgICB0MyxcbiAgICAgIGExMyxcbiAgICAgIGEyMyxcbiAgICAgIGEzMyxcbiAgICAgIGE0MixcbiAgICAgIGE0MyxcbiAgICAgIGEzMjtcbiAgeCA9IHkgPSB6ID0gcm90YXRpb24gPSByb3RhdGlvblggPSByb3RhdGlvblkgPSBza2V3WCA9IHNrZXdZID0gcGVyc3BlY3RpdmUgPSAwO1xuICBzY2FsZVggPSBzY2FsZVkgPSAxO1xuICBjYWNoZS5zdmcgPSAhISh0YXJnZXQuZ2V0Q1RNICYmIF9pc1NWRyh0YXJnZXQpKTtcblxuICBpZiAoY3MudHJhbnNsYXRlKSB7XG4gICAgLy8gYWNjb21tb2RhdGUgaW5kZXBlbmRlbnQgdHJhbnNmb3JtcyBieSBjb21iaW5pbmcgdGhlbSBpbnRvIG5vcm1hbCBvbmVzLlxuICAgIGlmIChjcy50cmFuc2xhdGUgIT09IFwibm9uZVwiIHx8IGNzLnNjYWxlICE9PSBcIm5vbmVcIiB8fCBjcy5yb3RhdGUgIT09IFwibm9uZVwiKSB7XG4gICAgICBzdHlsZVtfdHJhbnNmb3JtUHJvcF0gPSAoY3MudHJhbnNsYXRlICE9PSBcIm5vbmVcIiA/IFwidHJhbnNsYXRlM2QoXCIgKyAoY3MudHJhbnNsYXRlICsgXCIgMCAwXCIpLnNwbGl0KFwiIFwiKS5zbGljZSgwLCAzKS5qb2luKFwiLCBcIikgKyBcIikgXCIgOiBcIlwiKSArIChjcy5yb3RhdGUgIT09IFwibm9uZVwiID8gXCJyb3RhdGUoXCIgKyBjcy5yb3RhdGUgKyBcIikgXCIgOiBcIlwiKSArIChjcy5zY2FsZSAhPT0gXCJub25lXCIgPyBcInNjYWxlKFwiICsgY3Muc2NhbGUuc3BsaXQoXCIgXCIpLmpvaW4oXCIsXCIpICsgXCIpIFwiIDogXCJcIikgKyAoY3NbX3RyYW5zZm9ybVByb3BdICE9PSBcIm5vbmVcIiA/IGNzW190cmFuc2Zvcm1Qcm9wXSA6IFwiXCIpO1xuICAgIH1cblxuICAgI
4674HN0eWxlLnNjYWxlID0gc3R5bGUucm90YXRlID0gc3R5bGUudHJhbnNsYXRlID0gXCJub25lXCI7XG4gIH1cblxuICBtYXRyaXggPSBfZ2V0TWF0cml4KHRhcmdldCwgY2FjaGUuc3ZnKTtcblxuICBpZiAoY2FjaGUuc3ZnKSB7XG4gICAgaWYgKGNhY2hlLnVuY2FjaGUpIHtcbiAgICAgIC8vIGlmIGNhY2hlLnVuY2FjaGUgaXMgdHJ1ZSAoYW5kIG1heWJlIGlmIG9yaWdpbiBpcyAwLDApLCB3ZSBuZWVkIHRvIHNldCBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IChjYWNoZS54T3JpZ2luIC0gYmJveC54KSArIFwicHggXCIgKyAoY2FjaGUueU9yaWdpbiAtIGJib3gueSkgKyBcInB4XCIuIFByZXZpb3VzbHkgd2UgbGV0IHRoZSBkYXRhLXN2Zy1vcmlnaW4gc3RheSBpbnN0ZWFkLCBidXQgd2hlbiBpbnRyb2R1Y2luZyByZXZlcnQoKSwgaXQgY29tcGxpY2F0ZWQgdGhpbmdzLlxuICAgICAgdDIgPSB0YXJnZXQuZ2V0QkJveCgpO1xuICAgICAgb3JpZ2luID0gY2FjaGUueE9yaWdpbiAtIHQyLnggKyBcInB4IFwiICsgKGNhY2hlLnlPcmlnaW4gLSB0Mi55KSArIFwicHhcIjtcbiAgICAgIHQxID0gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdDEgPSAhdW5jYWNoZSAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zdmctb3JpZ2luXCIpOyAvLyAgUmVtZW1iZXIsIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgaW5jb25zaXN0ZW5jaWVzIHdlIGFsd2F5cyBmb3JjZSBTVkcgZWxlbWVudHMnIHRyYW5zZm9ybU9yaWdpbiB0byAwLDAgYW5kIG9mZnNldCB0aGUgdHJhbnNsYXRpb24gYWNjb3JkaW5nbHkuXG4gICAgfVxuXG4gICAgX2FwcGx5U1ZHT3JpZ2luKHRhcmdldCwgdDEgfHwgb3JpZ2luLCAhIXQxIHx8IGNhY2hlLm9yaWdpbklzQWJzb2x1dGUsIGNhY2hlLnNtb290aCAhPT0gZmFsc2UsIG1hdHJpeCk7XG4gIH1cblxuICB4T3JpZ2luID0gY2FjaGUueE9yaWdpbiB8fCAwO1xuICB5T3JpZ2luID0gY2FjaGUueU9yaWdpbiB8fCAwO1xuXG4gIGlmIChtYXRyaXggIT09IF9pZGVudGl0eTJETWF0cml4KSB7XG4gICAgYSA9IG1hdHJpeFswXTsgLy9hMTFcblxuICAgIGIgPSBtYXRyaXhbMV07IC8vYTIxXG5cbiAgICBjID0gbWF0cml4WzJdOyAvL2EzMVxuXG4gICAgZCA9IG1hdHJpeFszXTsgLy9hNDFcblxuICAgI
4674HggPSBhMTIgPSBtYXRyaXhbNF07XG4gICAgeSA9IGEyMiA9IG1hdHJpeFs1XTsgLy8yRCBtYXRyaXhcblxuICAgIGlmIChtYXRyaXgubGVuZ3RoID09PSA2KSB7XG4gICAgICBzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG4gICAgICBzY2FsZVkgPSBNYXRoLnNxcnQoZCAqIGQgKyBjICogYyk7XG4gICAgICByb3RhdGlvbiA9IGEgfHwgYiA/IF9hdGFuMihiLCBhKSAqIF9SQUQyREVHIDogMDsgLy9ub3RlOiBpZiBzY2FsZVggaXMgMCwgd2UgY2Fubm90IGFjY3VyYXRlbHkgbWVhc3VyZSByb3RhdGlvbi4gU2FtZSBmb3Igc2tld1ggd2l0aCBhIHNjYWxlWSBvZiAwLiBUaGVyZWZvcmUsIHdlIGRlZmF1bHQgdG8gdGhlIHByZXZpb3VzbHkgcmVjb3JkZWQgdmFsdWUgKG9yIHplcm8gaWYgdGhhdCBkb2Vzbid0IGV4aXN0KS5cblxuICAgICAgc2tld1ggPSBjIHx8IGQgPyBfYXRhbjIoYywgZCkgKiBfUkFEMkRFRyArIHJvdGF0aW9uIDogMDtcbiAgICAgIHNrZXdYICYmIChzY2FsZVkgKj0gTWF0aC5hYnMoTWF0aC5jb3Moc2tld1ggKiBfREVHMlJBRCkpKTtcblxuICAgICAgaWYgKGNhY2hlLnN2Zykge1xuICAgICAgICB4IC09IHhPcmlnaW4gLSAoeE9yaWdpbiAqIGEgKyB5T3JpZ2luICogYyk7XG4gICAgICAgIHkgLT0geU9yaWdpbiAtICh4T3JpZ2luICogYiArIHlPcmlnaW4gKiBkKTtcbiAgICAgIH0gLy8zRCBtYXRyaXhcblxuICAgIH0gZWxzZSB7XG4gICAgICBhMzIgPSBtYXRyaXhbNl07XG4gICAgICBhNDIgPSBtYXRyaXhbN107XG4gICAgICBhMTMgPSBtYXRyaXhbOF07XG4gICAgICBhMjMgPSBtYXRyaXhbOV07XG4gICAgICBhMzMgPSBtYXRyaXhbMTBdO1xuICAgICAgYTQzID0gbWF0cml4WzExXTtcbiAgICAgIHggPSBtYXRyaXhbMTJdO1xuICAgICAgeSA9IG1hdHJpeFsxM107XG4gICAgICB6ID0gbWF0cml4WzE0XTtcbiAgICAgIGFuZ2xlID0gX2F0YW4yKGEzMiwgYTMzKTtcbiAgICAgIHJvdGF0aW9uWCA9IGFuZ2xlICogX1JBRDJERUc7IC8vcm90YXRpb25YXG5cbiAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICBjb3MgPSBNYXRoLmNvcygtYW5nbGUpO1xuICAgICAgICBzaW4gPSBNYXRoLnNpbigtYW5nbGUpO1xuICAgICAgICB0MSA9IGExMiAqIGNvcyArIGExMyAqIHNpbjtcbiAgICAgICAgdDIgPSBhMjIgKiBjb3MgKyBhMjMgKiBzaW47XG4gICAgICAgIHQzID0gYTMyICogY29zICsgYTMzICogc2luO1xuICAgICAgICBhMTMgPSBhMTIgKiAtc2luICsgYTEzICogY29zO1xuICAgICAgICBhMjMgPSBhMjIgKiAtc2luICsgYTIzICogY29zO1xuICAgICAgICBhMzMgPSBhMzIgKiAtc2luICsgYTMzICogY29zO1xuICAgICAgICBhNDMgPSBhNDIgKiAtc2luICsgYTQzICogY29zO1xuICAgICAgICBhMTIgPSB0MTtcbiAgICAgICAgYTIyID0gdDI7XG4gICAgICAgIGEzMiA9IHQzO1xuICAgICAgfSAvL3JvdGF0aW9uWVxuXG5cbiAgICAgIGFuZ2xlID0gX2F0YW4yKC1jLCBhMzMpO1xuICAgICAgcm90YXRpb25ZID0gYW5nbGUgKiBfUkFEMkRFRztcblxuICAgICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIGNvcyA9IE1hdGguY29zKC1hbmdsZSk7XG4gICAgICAgIHNpbiA9IE1hdGguc2luKC1hbmdsZSk7XG4gICAgICAgIHQxID0gYSAqIGNvcyAtIGExMyAqIHNpbjtcbiAgICAgICAgdDIgPSBiICogY29zIC0gYTIzICogc2luO1xuICAgICAgICB0MyA9IGMgKiBjb3MgLSBhMzMgKiBzaW47XG4gICAgICAgIGE0MyA9IGQgKiBzaW4gKyBhNDMgKiBjb3M7XG4gICAgICAgIGEgPSB0MTtcbiAgICAgICAgYiA9IHQyO1xuICAgICAgICBjID0gdDM7XG4gICAgICB9IC8vcm90YXRpb25aXG5cblxuICAgICAgYW5nbGUgPSBfYXRhbjIoYiwgYSk7XG4gICAgICByb3RhdGlvbiA9IGFuZ2xlICogX1JBRDJERUc7XG5cbiAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgdDEgPSBhICogY29zICsgYiAqIHNpbjtcbiAgICAgICAgdDIgPSBhMTIgKiBjb3MgKyBhMjIgKiBzaW47XG4gICAgICAgIGIgPSBiICogY29zIC0gYSAqIHNpbjtcbiAgICAgICAgYTIyID0gYTIyICogY29zIC0gYTEyICogc2luO1xuICAgICAgICBhID0gdDE7XG4gICAgICAgIGExMiA9IHQyO1xuICAgICAgfVxuXG4gICAgICBpZiAocm90YXRpb25YICYmIE1hdGguYWJzKHJvdGF0aW9uWCkgKyBNYXRoLmFicyhyb3RhdGlvbikgPiAzNTkuOSkge1xuICAgICAgICAvL3doZW4gcm90YXRpb25ZIGlzIHNldCwgaXQgd2lsbCBvZnRlbiBiZSBwYXJzZWQgYXMgMTgwIGRlZ3JlZXMgZGlmZmVyZW50IHRoYW4gaXQgc2hvdWxkIGJlLCBhbmQgcm90YXRpb25YIGFuZCByb3RhdGlvbiBib3RoIGJlaW5nIDE4MCAoaXQgbG9va3MgdGhlIHNhbWUpLCBzbyB3ZSBhZGp1c3QgZm9yIHRoYXQgaGVyZS5cbiAgICAgICAgcm90YXRpb25YID0gcm90YXRpb24gPSAwO1xuICAgICAgICByb3RhdGlvblkgPSAxODAgLSByb3RhdGlvblk7XG4gICAgICB9XG5cbiAgICAgIHNjYWxlWCA9IF9yb3VuZChNYXRoLnNxcnQoYSAqIGEgKyBiICogYiArIGMgKiBjKSk7XG4gICAgICBzY2FsZVkgPSBfcm91bmQoTWF0aC5zcXJ0KGEyMiAqIGEyMiArIGEzMiAqIGEzMikpO1xuICAgICAgYW5nbGUgPSBfYXRhbjIoYTEyLCBhMjIpO1xuICAgICAgc2tld1ggPSBNYXRoLmFicyhhbmdsZSkgPiAwLjAwMDIgPyBhbmdsZSAqIF9SQUQyREVHIDogMDtcbiAgICAgIHBlcnNwZWN0aXZlID0gYTQzID8gMSAvIChhNDMgPCAwID8gLWE0MyA6IGE0MykgOiAwO1xuICAgIH1cblxuICAgIGlmIChjYWNoZS5zdmcpIHtcbiAgICAgIC8vc2Vuc2UgaWYgdGhlcmUgYXJlIENTUyB0cmFuc2Zvcm1zIGFwcGxpZWQgb24gYW4gU1ZHIGVsZW1lbnQgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IG92ZXJ3cml0ZSB0aGVtIHdoZW4gcmVuZGVyaW5nLiBUaGUgdHJhbnNmb3JtIGF0dHJpYnV0ZSBpcyBtb3JlIHJlbGlhYmxlIGNyb3NzLWJyb3dzZXIsIGJ1dCB3ZSBjYW4ndCBqdXN0IHJlbW92ZSB0aGUgQ1NTIG9uZXMgYmVjYXVzZSB0aGV5IG1heSBiZSBhcHBsaWVkIGluIGEgQ1NTIHJ1bGUgc29tZXdoZXJlIChub3QganVzdCBpbmxpbmUpLlxuICAgICAgdDEgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIpO1xuICAgICAgY2FjaGUuZm9yY2VDU1MgPSB0YXJnZXQuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIFwiXCIpIHx8ICFfaXNOdWxsVHJhbnNmb3JtKF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgX3RyYW5zZm9ybVByb3ApKTtcbiAgICAgIHQxICYmIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdDEpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChNYXRoLmFicyhza2V3WCkgPiA5MCAmJiBNYXRoLmFicyhza2V3WCkgPCAyNzApIHtcbiAgICBpZiAoaW52ZXJ0ZWRTY2FsZVgpIHtcbiAgICAgIHNjYWxlWCAqPSAtMTtcbiAgICAgIHNrZXdYICs9IHJvdGF0aW9uIDw9IDAgPyAxODAgOiAtMTgwO1xuICAgICAgcm90YXRpb24gKz0gcm90YXRpb24gPD0gMCA/IDE4MCA6IC0xODA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlWSAqPSAtMTtcbiAgICAgIHNrZXdYICs9IHNrZXdYIDw9IDAgPyAxODAgOiAtMTgwO1xuICAgIH1cbiAgfVxuXG4gIHVuY2FjaGUgPSB1bmNhY2hlIHx8IGNhY2hlLnVuY2FjaGU7XG4gIGNhY2hlLnggPSB4IC0gKChjYWNoZS54UGVyY2VudCA9IHggJiYgKCF1bmNhY2hlICYmIGNhY2hlLnhQZXJjZW50IHx8IChNYXRoLnJvdW5kKHRhcmdldC5vZmZzZXRXaWR0aCAvIDIpID09PSBNYXRoLnJvdW5kKC14KSA/IC01MCA6IDApKSkgPyB0YXJnZXQub2Zmc2V0V2lkdGggKiBjYWNoZS54UGVyY2VudCAvIDEwMCA6IDApICsgcHg7XG4gIGNhY2hlLnkgPSB5IC0gKC
4674hjYWNoZS55UGVyY2VudCA9IHkgJiYgKCF1bmNhY2hlICYmIGNhY2hlLnlQZXJjZW50IHx8IChNYXRoLnJvdW5kKHRhcmdldC5vZmZzZXRIZWlnaHQgLyAyKSA9PT0gTWF0aC5yb3VuZCgteSkgPyAtNTAgOiAwKSkpID8gdGFyZ2V0Lm9mZnNldEhlaWdodCAqIGNhY2hlLnlQZXJjZW50IC8gMTAwIDogMCkgKyBweDtcbiAgY2FjaGUueiA9IHogKyBweDtcbiAgY2FjaGUuc2NhbGVYID0gX3JvdW5kKHNjYWxlWCk7XG4gIGNhY2hlLnNjYWxlWSA9IF9yb3VuZChzY2FsZVkpO1xuICBjYWNoZS5yb3RhdGlvbiA9IF9yb3VuZChyb3RhdGlvbikgKyBkZWc7XG4gIGNhY2hlLnJvdGF0aW9uWCA9IF9yb3VuZChyb3RhdGlvblgpICsgZGVnO1xuICBjYWNoZS5yb3RhdGlvblkgPSBfcm91bmQocm90YXRpb25ZKSArIGRlZztcbiAgY2FjaGUuc2tld1ggPSBza2V3WCArIGRlZztcbiAgY2FjaGUuc2tld1kgPSBza2V3WSArIGRlZztcbiAgY2FjaGUudHJhbnNmb3JtUGVyc3BlY3RpdmUgPSBwZXJzcGVjdGl2ZSArIHB4O1xuXG4gIGlmIChjYWNoZS56T3JpZ2luID0gcGFyc2VGbG9hdChvcmlnaW4uc3BsaXQoXCIgXCIpWzJdKSB8fCAhdW5jYWNoZSAmJiBjYWNoZS56T3JpZ2luIHx8IDApIHtcbiAgICBzdHlsZVtfdHJhbnNmb3JtT3JpZ2luUHJvcF0gPSBfZmlyc3RUd29Pbmx5KG9yaWdpbik7XG4gIH1cblxuICBjYWNoZS54T2Zmc2V0ID0gY2FjaGUueU9mZnNldCA9IDA7XG4gIGNhY2hlLmZvcmNlM0QgPSBfY29uZmlnLmZvcmNlM0Q7XG4gIGNhY2hlLnJlbmRlclRyYW5zZm9ybSA9IGNhY2hlLnN2ZyA/IF9yZW5kZXJTVkdUcmFuc2Zvcm1zIDogX3N1cHBvcnRzM0QgPyBfcmVuZGVyQ1NTVHJhbnNmb3JtcyA6IF9yZW5kZXJOb24zRFRyYW5zZm9ybXM7XG4gIGNhY2hlLnVuY2FjaGUgPSAwO1xuICByZXR1cm4gY2FjaGU7XG59LFxuICAgIF9maXJzdFR3b09ubHkgPSBmdW5jdGlvbiBfZmlyc3RUd29Pbmx5KHZhbHVlKSB7XG4gIHJldHVybiAodmFsdWUgPSB2YWx1ZS5zcGxpdChcIiBcIikpWzBdICsgXCIgXCIgKyB2YWx1ZVsxXTtcbn0sXG4gICAgLy9mb3IgaGFuZGxpbmcgdHJhbnNmb3JtT3JpZ2luIHZhbHVlcywgc3RyaXBwaW5nIG91dCB0aGUgM3JkIGRpbWVuc2lvblxuX2FkZFB4VHJhbnNsYXRlID0gZnVuY3Rpb24gX2FkZFB4VHJhbnNsYXRlKHRhcmdldCwgc3RhcnQsIHZhbHVlKSB7XG4gIHZhciB1bml0ID0gZ2V0VW5pdChzdGFydCk7XG4gIHJldHVybiBfcm91bmQocGFyc2VGbG9hdChzdGFydCkgKyBwYXJzZUZsb2F0KF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgXCJ4XCIsIHZhbHVlICsgXCJweFwiLCB1bml0KSkpICsgdW5pdDtcbn0sXG4gICAgX3JlbmRlck5vbjNEVHJhbnNmb3JtcyA9IGZ1bmN0aW9uIF9yZW5kZXJOb24zRFRyYW5zZm9ybXMocmF0aW8sIGNhY2hlKSB7XG4gIGNhY2hlLnogPSBcIjBweFwiO1xuICBjYWNoZS5yb3RhdGlvblkgPSBjYWNoZS5yb3RhdGlvblggPSBcIjBkZWdcIjtcbiAgY2FjaGUuZm9yY2UzRCA9IDA7XG5cbiAgX3JlbmRlckNTU1RyYW5zZm9ybXMocmF0aW8sIGNhY2hlKTtcbn0sXG4gICAgX3plcm9EZWcgPSBcIjBkZWdcIixcbiAgICBfemVyb1B4ID0gXCIwcHhcIixcbiAgICBfZW5kUGFyZW50aGVzaXMgPSBcIikgXCIsXG4gICAgX3JlbmRlckNTU1RyYW5zZm9ybXMgPSBmdW5jdGlvbiBfcmVuZGVyQ1NTVHJhbnNmb3JtcyhyYXRpbywgY2FjaGUpIHtcbiAgdmFyIF9yZWYgPSBjYWNoZSB8fCB0aGlzLFxuICAgICAgeFBlcmNlbnQgPSBfcmVmLnhQZXJjZW50LFxuICAgICAgeVBlcmNlbnQgPSBfcmVmLnlQZXJjZW50LFxuICAgICAgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnksXG4gICAgICB6ID0gX3JlZi56LFxuICAgICAgcm90YXRpb24gPSBfcmVmLnJvdGF0aW9uLFxuICAgICAgcm90YXRpb25ZID0gX3JlZi5yb3RhdGlvblksXG4gICAgICByb3RhdGlvblggPSBfcmVmLnJvdGF0aW9uWCxcbiAgICAgIHNrZXdYID0gX3JlZi5za2V3WCxcbiAgICAgIHNrZXdZID0gX3JlZi5za2V3WSxcbiAgICAgIHNjYWxlWCA9IF9yZWYuc2NhbGVYLFxuICAgICAgc2NhbGVZID0gX3JlZi5zY2FsZVksXG4gICAgICB0cmFuc2Zvcm1QZXJzcGVjdGl2ZSA9IF9yZWYudHJhbnNmb3JtUGVyc3BlY3RpdmUsXG4gICAgICBmb3JjZTNEID0gX3JlZi5mb3JjZTNELFxuICAgICAgdGFyZ2V0ID0gX3JlZi50YXJnZXQsXG4gICAgICB6T3JpZ2luID0gX3JlZi56T3JpZ2luLFxuICAgICAgdHJhbnNmb3JtcyA9IFwiXCIsXG4gICAgICB1c2UzRCA9IGZvcmNlM0QgPT09IFwiYXV0b1wiICYmIHJhdGlvICYmIHJhdGlvICE9PSAxIHx8IGZvcmNlM0QgPT09IHRydWU7IC8vIFNhZmFyaSBoYXMgYSBidWcgdGhhdCBjYXVzZXMgaXQgbm90IHRvIHJlbmRlciAzRCB0cmFuc2Zvcm0tb3JpZ2luIHZhbHVlcyBwcm9wZXJseSwgc28gd2UgZm9yY2UgdGhlIHogb3JpZ2luIHRvIDAsIHJlY29yZCBpdCBpbiB0aGUgY2FjaGUsIGFuZCB0aGVuIGRvIHRoZSBtYXRoIGhlcmUgdG8gb2Zmc2V0IHRoZSB0cmFuc2xhdGUgdmFsdWVzIGFjY29yZGluZ2x5IChiYXNpY2FsbHkgZG8gdGhlIDNEIHRyYW5zZm9ybS1vcmlnaW4gcGFydCBtYW51YWxseSlcblxuXG4gIGlmICh6T3JpZ2luICYmIChyb3RhdGlvblggIT09IF96ZXJvRGVnIHx8IHJvdGF0aW9uWSAhPT0gX3plcm9EZWcpKSB7XG4gICAgdmFyIGFuZ2xlID0gcGFyc2VGbG9hdChyb3RhdGlvblkpICogX0RFRzJSQUQsXG4gICAgICAgIGExMyA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgYTMzID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICBjb3M7XG5cbiAgICBhbmdsZSA9IHBhcnNlRmxvYXQocm90YXRpb25YKSAqIF9ERUcyUkFEO1xuICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICB4ID0gX2FkZFB4VHJhbnNsYXRlKHRhcmdldCwgeCwgYTEzICogY29zICogLXpPcmlnaW4pO1xuICAgIHkgPSBfYWRkUHhUcmFuc2xhdGUodGFyZ2V0LCB5LCAtTWF0aC5zaW4oYW5nbGUpICogLXpPcmlnaW4pO1xuICAgIHogPSBfYWRkUHhUcmFuc2xhdGUodGFyZ2V0LCB6LCBhMzMgKiBjb3MgKiAtek9yaWdpbiArIHpPcmlnaW4pO1xuICB9XG5cbiAgaWYgKHRyYW5zZm9ybVBlcnNwZWN0aXZlICE9PSBfemVyb1B4KSB7XG4gICAgdHJhbnNmb3JtcyArPSBcInBlcnNwZWN0aXZlKFwiICsgdHJhbnNmb3JtUGVyc3BlY3RpdmUgKyBfZW5kUGFyZW50aGVzaXM7XG4gIH1cblxuICBpZiAoeFBlcmNlbnQgfHwgeVBlcmNlbnQpIHtcbiAgICB0cmFuc2Zvcm1zICs9IFwidHJhbnNsYXRlKFwiICsgeFBlcmNlbnQgKyBcIiUsIFwiICsgeVBlcmNlbnQgKyBcIiUpIFwiO1xuICB9XG5cbiAgaWYgKHVzZTNEIHx8IHggIT09IF96ZXJvUHggfHwgeSAhPT0gX3plcm9QeCB8fCB6ICE9PSBfemVyb1B4KSB7XG4gICAgdHJhbnNmb3JtcyArPSB6ICE9PSBfemVyb1B4IHx8IHVzZTNEID8gXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcIiwgXCIgKyB5ICsgXCIsIFwiICsgeiArIFwiKSBcIiA6IFwidHJhbnNsYXRlKFwiICsgeCArIFwiLCBcIiArIHkgKyBfZW5kUGFyZW50aGVzaXM7XG4gIH1cblxuICBpZiAocm90YXRpb24gIT09IF96ZXJvRGVnKSB7XG4gICAgdHJhbnNmb3JtcyArPSBcInJvdGF0ZShcIiArIHJvdGF0aW9uICsgX2VuZFBhcmVudGhlc2lzO1xuICB9XG5cbiAgaWYgKHJvdGF0aW9uWSAhPT0gX3plcm9EZWcpIHtcbiAgICB0cmFuc2Zvcm1zICs9IFwicm90YXRlWShcIiArIHJvdGF0aW9uWSArIF9lbmRQYXJlbnRoZXNpcztcbiAgfVxuXG4gIGlmIChyb3RhdGlvblggIT09IF96ZXJvRGVnKSB7XG4gICAgdHJhbnNmb3JtcyArPSBcInJvdGF0ZVgoXCIgKyByb3RhdGlvblggKyBfZW5kUGFyZW50aGVzaXM7XG4gIH1cblxuICBpZiAoc2tld1ggIT09IF96ZXJvRGVnIHx8IHNrZXdZICE9PSBfemVyb0RlZykge1xuICAgIHRyYW5zZm9ybXMgKz0gXCJza2V3KFwiICsgc2tld1ggKyBcIiwgXCIgKyBza2V3WSArIF9lbmRQYXJlbnRoZXNpcztcbiAgfVxuXG4gIGlmIChzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxKSB7XG4gICAgdHJhbnNmb3JtcyArPSBcInNjYWxlKFwiICsgc2NhbGVYICsgXCIsIFwiICsgc2NhbGVZICsgX2VuZFBhcmVudGhlc2lzO1xuICB9XG5cbiAgdGFyZ2V0LnN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHRyYW5zZm9ybXMgfHwgXCJ0cmFuc2xhdGUoMCwgMClcIjtcbn0sXG4gICAgX3JlbmRlclNWR1RyYW5zZm9ybXMgPSBmdW5jdGlvbiBfcmVuZGVyU1ZHVHJhbnNmb3JtcyhyYXRpbywgY2FjaGUpIHtcbiAgdmFyIF9yZWYyID0gY2FjaGUgfHwgdGhpcyxcbiAgICAgIHhQZXJjZW50ID0gX3JlZjIueFBlcmNlbnQsXG4gICAgICB5UGVyY2VudCA9IF9yZWYyLnlQZXJjZW50LFxuICAgICAgeCA9IF9yZWYyLngsXG4gICAgICB5ID0gX3JlZjIueSxcbiAgICAgIHJvdGF0aW9uID0gX3JlZjIucm90YXRpb24sXG4gICAgICBza2V3WCA9IF9yZWYyLnNrZXdYLFxuICAgICAgc2tld1kgPSBfcmVmMi5za2V3WSxcbiAgICAgIHNjYWxlWCA9IF9yZWYyLnNjYWxlWCxcbiAgICAgIHNjYWxlWSA9I
4674F9yZWYyLnNjYWxlWSxcbiAgICAgIHRhcmdldCA9IF9yZWYyLnRhcmdldCxcbiAgICAgIHhPcmlnaW4gPSBfcmVmMi54T3JpZ2luLFxuICAgICAgeU9yaWdpbiA9IF9yZWYyLnlPcmlnaW4sXG4gICAgICB4T2Zmc2V0ID0gX3JlZjIueE9mZnNldCxcbiAgICAgIHlPZmZzZXQgPSBfcmVmMi55T2Zmc2V0LFxuICAgICAgZm9yY2VDU1MgPSBfcmVmMi5mb3JjZUNTUyxcbiAgICAgIHR4ID0gcGFyc2VGbG9hdCh4KSxcbiAgICAgIHR5ID0gcGFyc2VGbG9hdCh5KSxcbiAgICAgIGExMSxcbiAgICAgIGEyMSxcbiAgICAgIGExMixcbiAgICAgIGEyMixcbiAgICAgIHRlbXA7XG5cbiAgcm90YXRpb24gPSBwYXJzZUZsb2F0KHJvdGF0aW9uKTtcbiAgc2tld1ggPSBwYXJzZUZsb2F0KHNrZXdYKTtcbiAgc2tld1kgPSBwYXJzZUZsb2F0KHNrZXdZKTtcblxuICBpZiAoc2tld1kpIHtcbiAgICAvL2ZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSBjb21iaW5lIGFsbCBza2V3aW5nIGludG8gdGhlIHNrZXdYIGFuZCByb3RhdGlvbiB2YWx1ZXMuIFJlbWVtYmVyLCBhIHNrZXdZIG9mIDEwIGRlZ3JlZXMgbG9va3MgdGhlIHNhbWUgYXMgYSByb3RhdGlvbiBvZiAxMCBkZWdyZWVzIHBsdXMgYSBza2V3WCBvZiAxMCBkZWdyZWVzLlxuICAgIHNrZXdZID0gcGFyc2VGbG9hdChza2V3WSk7XG4gICAgc2tld1ggKz0gc2tld1k7XG4gICAgcm90YXRpb24gKz0gc2tld1k7XG4gIH1cblxuICBpZiAocm90YXRpb24gfHwgc2tld1gpIHtcbiAgICByb3RhdGlvbiAqPSBfREVHMlJBRDtcbiAgICBza2V3WCAqPSBfREVHMlJBRDtcbiAgICBhMTEgPSBNYXRoLmNvcyhyb3RhdGlvbikgKiBzY2FsZVg7XG4gICAgYTIxID0gTWF0aC5zaW4ocm90YXRpb24pICogc2NhbGVYO1xuICAgIGExMiA9IE1hdGguc2luKHJvdGF0aW9uIC0gc2tld1gpICogLXNjYWxlWTtcbiAgICBhMjIgPSBNYXRoLmNvcyhyb3RhdGlvbiAtIHNrZXdYKSAqIHNjYWxlWTtcblxuICAgIGlmIChza2V3WCkge1xuICAgICAgc2tld1kgKj0gX0RFRzJSQUQ7XG4gICAgICB0ZW1wID0gTWF0aC50YW4oc2tld1ggLSBza2V3WSk7XG4gICAgICB0ZW1wID0gTWF0aC5zcXJ0KDEgKyB0ZW1wICogdGVtcCk7XG4gICAgICBhMTIgKj0gdGVtcDtcbiAgICAgIGEyMiAqPSB0ZW1wO1xuXG4gICAgICBpZiAoc2tld1kpIHtcbiAgICAgICAgdGVtcCA9IE1hdGgudGFuKHNrZXdZKTtcbiAgICAgICAgdGVtcCA9IE1hdGguc3FydCgxICsgdGVtcCAqIHRlbXApO1xuICAgICAgICBhMTEgKj0gdGVtcDtcbiAgICAgICAgYTIxICo9IHRlbXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYTExID0gX3JvdW5kKGExMSk7XG4gICAgYTIxID0gX3JvdW5kKGEyMSk7XG4gICAgYTEyID0gX3JvdW5kKGExMik7XG4gICAgYTIyID0gX3JvdW5kKGEyMik7XG4gIH0gZWxzZSB7XG4gICAgYTExID0gc2NhbGVYO1xuICAgIGEyMiA9IHNjYWxlWTtcbiAgICBhMjEgPSBhMTIgPSAwO1xuICB9XG5cbiAgaWYgKHR4ICYmICF+KHggKyBcIlwiKS5pbmRleE9mKFwicHhcIikgfHwgdHkgJiYgIX4oeSArIFwiXCIpLmluZGV4T2YoXCJweFwiKSkge1xuICAgIHR4ID0gX2NvbnZlcnRUb1VuaXQodGFyZ2V0LCBcInhcIiwgeCwgXCJweFwiKTtcbiAgICB0eSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgXCJ5XCIsIHksIFwicHhcIik7XG4gIH1cblxuICBpZiAoeE9yaWdpbiB8fCB5T3JpZ2luIHx8IHhPZmZzZXQgfHwgeU9mZnNldCkge1xuICAgIHR4ID0gX3JvdW5kKHR4ICsgeE9yaWdpbiAtICh4T3JpZ2luICogYTExICsgeU9yaWdpbiAqIGExMikgKyB4T2Zmc2V0KTtcbiAgICB0eSA9IF9yb3VuZCh0eSArIHlPcmlnaW4gLSAoeE9yaWdpbiAqIGEyMSArIHlPcmlnaW4gKiBhMjIpICsgeU9mZnNldCk7XG4gIH1cblxuICBpZiAoeFBlcmNlbnQgfHwgeVBlcmNlbnQpIHtcbiAgICAvL1RoZSBTVkcgc3BlYyBkb2Vzbid0IHN1cHBvcnQgcGVyY2VudGFnZS1iYXNlZCB0cmFuc2xhdGlvbiBpbiB0aGUgXCJ0cmFuc2Zvcm1cIiBhdHRyaWJ1dGUsIHNvIHdlIG1lcmdlIGl0IGludG8gdGhlIHRyYW5zbGF0aW9uIHRvIHNpbXVsYXRlIGl0LlxuICAgIHRlbXAgPSB0YXJnZXQuZ2V0QkJveCgpO1xuICAgIHR4ID0gX3JvdW5kKHR4ICsgeFBlcmNlbnQgLyAxMDAgKiB0ZW1wLndpZHRoKTtcbiAgICB0eSA9IF9yb3VuZCh0eSArIHlQZXJjZW50IC8gMTAwICogdGVtcC5oZWlnaHQpO1xuICB9XG5cbiAgdGVtcCA9IFwibWF0cml4KFwiICsgYTExICsgXCIsXCIgKyBhMjEgKyBcIixcIiArIGExMiArIFwiLFwiICsgYTIyICsgXCIsXCIgKyB0eCArIFwiLFwiICsgdHkgKyBcIilcIjtcbiAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB0ZW1wKTtcbiAgZm9yY2VDU1MgJiYgKHRhcmdldC5zdHlsZVtfdHJhbnNmb3JtUHJvcF0gPSB0ZW1wKTsgLy9zb21lIGJyb3dzZXJzIHByaW9yaXRpemUgQ1NTIHRyYW5zZm9ybXMgb3ZlciB0aGUgdHJhbnNmb3JtIGF0dHJpYnV0ZS4gV2hlbiB3ZSBzZW5zZSB0aGF0IHRoZSB1c2VyIGhhcyBDU1MgdHJhbnNmb3JtcyBhcHBsaWVkLCB3ZSBtdXN0IG92ZXJ3cml0ZSB0aGVtIHRoaXMgd2F5IChvdGhlcndpc2Ugc29tZSBicm93c2VyIHNpbXBseSB3b24ndCByZW5kZXIgdGhlIHRyYW5zZm9ybSBhdHRyaWJ1dGUgY2hhbmdlcyEpXG59LFxuICAgIF9hZGRSb3RhdGlvbmFsUHJvcFR3ZWVuID0gZnVuY3Rpb24gX2FkZFJvdGF0aW9uYWxQcm9wVHdlZW4ocGx1Z2luLCB0YXJnZXQsIHByb3BlcnR5LCBzdGFydE51bSwgZW5kVmFsdWUpIHtcbiAgdmFyIGNhcCA9IDM2MCxcbiAgICAgIGlzU3RyaW5nID0gX2lzU3RyaW5nKGVuZFZhbHVlKSxcbiAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpICogKGlzU3RyaW5nICYmIH5lbmRWYWx1ZS5pbmRleE9mKFwicmFkXCIpID8gX1JBRDJERUcgOiAxKSxcbiAgICAgIGNoYW5nZSA9IGVuZE51bSAtIHN0YXJ0TnVtLFxuICAgICAgZmluYWxWYWx1ZSA9IHN0YXJ0TnVtICsgY2hhbmdlICsgXCJkZWdcIixcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIHB0O1xuXG4gIGlmIChpc1N0cmluZykge1xuICAgIGRpcmVjdGlvbiA9IGVuZFZhbHVlLnNwbGl0KFwiX1wiKVsxXTtcblxuICAgIGlmIChkaXJlY3Rpb24gPT09IFwic2hvcnRcIikge1xuICAgICAgY2hhbmdlICU9IGNhcDtcblxuICAgICAgaWYgKGNoYW5nZSAhPT0gY2hhbmdlICUgKGNhcCAvIDIpKSB7XG4gICAgICAgIGNoYW5nZSArPSBjaGFuZ2UgPCAwID8gY2FwI
4674DogLWNhcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSBcImN3XCIgJiYgY2hhbmdlIDwgMCkge1xuICAgICAgY2hhbmdlID0gKGNoYW5nZSArIGNhcCAqIF9iaWdOdW0pICUgY2FwIC0gfn4oY2hhbmdlIC8gY2FwKSAqIGNhcDtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gXCJjY3dcIiAmJiBjaGFuZ2UgPiAwKSB7XG4gICAgICBjaGFuZ2UgPSAoY2hhbmdlIC0gY2FwICogX2JpZ051bSkgJSBjYXAgLSB+fihjaGFuZ2UgLyBjYXApICogY2FwO1xuICAgIH1cbiAgfVxuXG4gIHBsdWdpbi5fcHQgPSBwdCA9IG5ldyBQcm9wVHdlZW4ocGx1Z2luLl9wdCwgdGFyZ2V0LCBwcm9wZXJ0eSwgc3RhcnROdW0sIGNoYW5nZSwgX3JlbmRlclByb3BXaXRoRW5kKTtcbiAgcHQuZSA9IGZpbmFsVmFsdWU7XG4gIHB0LnUgPSBcImRlZ1wiO1xuXG4gIHBsdWdpbi5fcHJvcHMucHVzaChwcm9wZXJ0eSk7XG5cbiAgcmV0dXJuIHB0O1xufSxcbiAgICBfYXNzaWduID0gZnVuY3Rpb24gX2Fzc2lnbih0YXJnZXQsIHNvdXJjZSkge1xuICAvLyBJbnRlcm5ldCBFeHBsb3JlciBkb2Vzbid0IGhhdmUgT2JqZWN0LmFzc2lnbigpLCBzbyB3ZSByZWNyZWF0ZSBpdCBoZXJlLlxuICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgIHRhcmdldFtwXSA9IHNvdXJjZVtwXTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59LFxuICAgIF9hZGRSYXdUcmFuc2Zvcm1QVHMgPSBmdW5jdGlvbiBfYWRkUmF3VHJhbnNmb3JtUFRzKHBsdWdpbiwgdHJhbnNmb3JtcywgdGFyZ2V0KSB7XG4gIC8vZm9yIGhhbmRsaW5nIGNhc2VzIHdoZXJlIHNvbWVvbmUgcGFzc2VzIGluIGEgd2hvbGUgdHJhbnNmb3JtIHN0cmluZywgbGlrZSB0cmFuc2Zvcm06IFwic2NhbGUoMiwgMykgcm90YXRlKDIwZGVnKSB0cmFuc2xhdGVZKDMwZW0pXCJcbiAgdmFyIHN0YXJ0Q2FjaGUgPSBfYXNzaWduKHt9LCB0YXJnZXQuX2dzYXApLFxuICAgICAgZXhjbHVkZSA9IFwicGVyc3BlY3RpdmUsZm9yY2UzRCx0cmFuc2Zvcm1PcmlnaW4sc3ZnT3JpZ2luXCIsXG4gICAgICBzdHlsZSA9IHRhcmdldC5zdHlsZSxcbiAgICAgIGVuZENhY2hlLFxuICAgICAgcCxcbiAgICAgIHN0YXJ0VmFsdWUsXG4gICAgICBlbmRWYWx1ZSxcbiAgICAgIHN0YXJ0TnVtLFxuICAgICAgZW5kTnVtLFxuICAgICAgc3RhcnRVbml0LFxuICAgICAgZW5kVW5pdDtcblxuICBpZiAoc3RhcnRDYWNoZS5zdmcpIHtcbiAgICBzdGFydFZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTtcbiAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIFwiXCIpO1xuICAgIHN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHRyYW5zZm9ybXM7XG4gICAgZW5kQ2FjaGUgPSBfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCAxKTtcblxuICAgIF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIF90cmFuc2Zvcm1Qcm9wKTtcblxuICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgc3RhcnRWYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KVtfdHJhbnNmb3JtUHJvcF07XG4gICAgc3R5bGVbX3RyYW5zZm9ybVByb3BdID0gdHJhbnNmb3JtcztcbiAgICBlbmRDYWNoZSA9IF9wYXJzZVRyYW5zZm9ybSh0YXJnZXQsIDEpO1xuICAgIHN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHN0YXJ0VmFsdWU7XG4gIH1cblxuICBmb3IgKHAgaW4gX3RyYW5zZm9ybVByb3BzKSB7XG4gICAgc3RhcnRWYWx1ZSA9IHN0YXJ0Q2FjaGVbcF07XG4gICAgZW5kVmFsdWUgPSBlbmRDYWNoZVtwXTtcblxuICAgIGlmIChzdGFydFZhbHVlICE9PSBlbmRWYWx1ZSAmJiBleGNsdWRlLmluZGV4T2YocCkgPCAwKSB7XG4gICAgICAvL3R3ZWVuaW5nIHRvIG5vIHBlcnNwZWN0aXZlIGdpdmVzIHZlcnkgdW5pbnR1aXRpdmUgcmVzdWx0cyAtIGp1c3Qga2VlcCB0aGUgc2FtZSBwZXJzcGVjdGl2ZSBpbiB0aGF0IGNhc2UuXG4gICAgICBzdGFydFVuaXQgPSBnZXRVbml0KHN0YXJ0VmFsdWUpO1xuICAgICAgZW5kVW5pdCA9IGdldFVuaXQoZW5kVmFsdWUpO1xuICAgICAgc3RhcnROdW0gPSBzdGFydFVuaXQgIT09IGVuZFVuaXQgPyBfY29udmVydFRvVW5pdCh0YXJnZXQsIHAsIHN0YXJ0VmFsdWUsIGVuZFVuaXQpIDogcGFyc2VGbG9hdChzdGFydFZhbHVlKTtcbiAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpO1xuICAgICAgcGx1Z2luLl9wdCA9IG5ldyBQcm9wVHdlZW4ocGx1Z2luLl9wdCwgZW5kQ2FjaGUsIHAsIHN0YXJ0TnVtLCBlbmROdW0gLSBzdGFydE51bSwgX3JlbmRlckNTU1Byb3ApO1xuICAgICAgcGx1Z2luLl9wdC51ID0gZW5kVW5pdCB8fCAwO1xuXG4gICAgICBwbHVnaW4uX3Byb3BzLnB1c2gocCk7XG4gICAgfVxuICB9XG5cbiAgX2Fzc2lnbihlbmRDYWNoZSwgc3RhcnRDYWNoZSk7XG59OyAvLyBoYW5kbGUgc3BsaXR0aW5nIGFwYXJ0IHBhZGRpbmcsIG1hcmdpbiwgYm9yZGVyV2lkdGgsIGFuZCBib3JkZXJSYWRpdXMgaW50byB0aGVpciA0IGNvbXBvbmVudHMuIEZpcmVmb3gsIGZvciBleGFtcGxlLCB3b24ndCByZXBvcnQgYm9yZGVyUmFkaXVzIGNvcnJlY3RseSAtIGl0IHdpbGwgb25seSBkbyBib3JkZXJUb3BMZWZ0UmFkaXVzIGFuZCB0aGUgb3RoZXIgY29ybmVycy4gV2UgYWxzbyB3YW50IHRvIGhhbmRsZSBwYWRkaW5nVG9wLCBtYXJnaW5MZWZ0LCBib3JkZXJSaWdodFdpZHRoLCBldGMuXG5cblxuX2ZvckVhY2hOYW1lKFwicGFkZGluZyxtYXJnaW4sV2lkdGgsUmFkaXVzXCIsIGZ1bmN0aW9uIChuYW1lLCBpbmRleCkge1xuICB2YXIgdCA9IFwiVG9wXCIsXG4gICAgICByID0gXCJSaWdodFwiLFxuICAgICAgYiA9IFwiQm90dG9tXCIsXG4gICAgICBsID0gXCJMZWZ0XCIsXG4gICAgICBwcm9wcyA9IChpbmRleCA8IDMgPyBbdCwgciwgYiwgbF0gOiBbdCArIGwsIHQgKyByLCBiICsgciwgYiArIGxdKS5tYXAoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gaW5kZXggPCAyID8gbmFtZSArIHNpZGUgOiBcImJvcmRlclwiICsgc2lkZSArIG5hbWU7XG4gIH0pO1xuXG4gIF9zcGVjaWFsUHJvcHNbaW5kZXggPiAxID8gXCJib3JkZXJcIiArIG5hbWUgOiBuYW1lXSA9IGZ1bmN0aW9uIChwbHVnaW4sIHRhcmdldCwgcHJvcGVydHksIGVuZFZhbHVlLCB0d2Vlbikge1xuICAgIHZhciBhLCB2YXJzO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSB7XG4gICAgICAvLyBnZXR0ZXIsIHBhc3NlZCB0YXJnZXQsIHByb3BlcnR5LCBhbmQgdW5pdCAoZnJvbSBfZ2V0KCkpXG4gICAgICBhID0gcHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgI
4674HJldHVybiBfZ2V0KHBsdWdpbiwgcHJvcCwgcHJvcGVydHkpO1xuICAgICAgfSk7XG4gICAgICB2YXJzID0gYS5qb2luKFwiIFwiKTtcbiAgICAgIHJldHVybiB2YXJzLnNwbGl0KGFbMF0pLmxlbmd0aCA9PT0gNSA/IGFbMF0gOiB2YXJzO1xuICAgIH1cblxuICAgIGEgPSAoZW5kVmFsdWUgKyBcIlwiKS5zcGxpdChcIiBcIik7XG4gICAgdmFycyA9IHt9O1xuICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3AsIGkpIHtcbiAgICAgIHJldHVybiB2YXJzW3Byb3BdID0gYVtpXSA9IGFbaV0gfHwgYVsoaSAtIDEpIC8gMiB8IDBdO1xuICAgIH0pO1xuICAgIHBsdWdpbi5pbml0KHRhcmdldCwgdmFycywgdHdlZW4pO1xuICB9O1xufSk7XG5cbmV4cG9ydCB2YXIgQ1NTUGx1Z2luID0ge1xuICBuYW1lOiBcImNzc1wiLFxuICByZWdpc3RlcjogX2luaXRDb3JlLFxuICB0YXJnZXRUZXN0OiBmdW5jdGlvbiB0YXJnZXRUZXN0KHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQuc3R5bGUgJiYgdGFyZ2V0Lm5vZGVUeXBlO1xuICB9LFxuICBpbml0OiBmdW5jdGlvbiBpbml0KHRhcmdldCwgdmFycywgdHdlZW4sIGluZGV4LCB0YXJnZXRzKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5fcHJvcHMsXG4gICAgICAgIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxuICAgICAgICBzdGFydEF0ID0gdHdlZW4udmFycy5zdGFydEF0LFxuICAgICAgICBzdGFydFZhbHVlLFxuICAgICAgICBlbmRWYWx1ZSxcbiAgICAgICAgZW5kTnVtLFxuICAgICAgICBzdGFydE51bSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgc3BlY2lhbFByb3AsXG4gICAgICAgIHAsXG4gICAgICAgIHN0YXJ0VW5pdCxcbiAgICAgICAgZW5kVW5pdCxcbiAgICAgICAgcmVsYXRpdmUsXG4gICAgICAgIGlzVHJhbnNmb3JtUmVsYXRlZCxcbiAgICAgICAgdHJhbnNmb3JtUHJvcFR3ZWVuLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgc21vb3RoLFxuICAgICAgICBoYXNQcmlvcml0eSxcbiAgICAgICAgaW5saW5lUHJvcHMsXG4gICAgICAgIGZpbmFsVHJhbnNmb3JtVmFsdWU7XG4gICAgX3BsdWdpbkluaXR0ZWQgfHwgX2luaXRDb3JlKCk7IC8vIHdlIG1heSBjYWxsIGluaXQoKSBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBwbHVnaW4gaW5zdGFuY2UsIGxpa2Ugd2hlbiBhZGRpbmcgc3BlY2lhbCBwcm9wZXJ0aWVzLCBzbyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIHRoZSByZXZlcnQgZGF0YSBvciBpbmxpbmVQcm9wc1xuXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLnN0eWxlcyB8fCBfZ2V0U3R5bGVTYXZlcih0YXJnZXQpO1xuICAgIGlubGluZVByb3BzID0gdGhpcy5zdHlsZXMucHJvcHM7XG4gICAgdGhpcy50d2VlbiA9IHR3ZWVuO1xuXG4gICAgZm9yIChwIGluIHZhcnMpIHtcbiAgICAgIGlmIChwID09PSBcImF1dG9Sb3VuZFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBlbmRWYWx1ZSA9IHZhcnNbcF07XG5cbiAgICAgIGlmIChfcGx1Z2luc1twXSAmJiBfY2hlY2tQbHVnaW4ocCwgdmFycywgdHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpKSB7XG4gICAgICAgIC8vIHBsdWdpbnNcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHR5cGUgPSB0eXBlb2YgZW5kVmFsdWU7XG4gICAgICBzcGVjaWFsUHJvcCA9IF9zcGVjaWFsUHJvcHNbcF07XG5cbiAgICAgIGlmICh0eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZW5kVmFsdWUgPSBlbmRWYWx1ZS5jYWxsKHR3ZWVuLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzKTtcbiAgICAgICAgdHlwZSA9IHR5cGVvZiBlbmRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIgJiYgfmVuZFZhbHVlLmluZGV4T2YoXCJyYW5kb20oXCIpKSB7XG4gICAgICAgIGVuZFZhbHVlID0gX3JlcGxhY2VSYW5kb20oZW5kVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3BlY2lhbFByb3ApIHtcbiAgICAgICAgc3BlY2lhbFByb3AodGhpcywgdGFyZ2V0LCBwLCBlbmRWYWx1ZSwgdHdlZW4pICYmIChoYXNQcmlvcml0eSA9IDEpO1xuICAgICAgfSBlbHNlIGlmIChwLnN1YnN0cigwLCAyKSA9PT0gXCItLVwiKSB7XG4gICAgICAgIC8vQ1NTIHZhcmlhYmxlXG4gICAgICAgIHN0YXJ0VmFsdWUgPSAoZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUocCkgKyBcIlwiKS50cmltKCk7XG4gICAgICAgIGVuZFZhbHVlICs9IFwiXCI7XG4gICAgICAgIF9jb2xvckV4cC5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAgIGlmICghX2NvbG9yRXhwLnRlc3Qoc3RhcnRWYWx1ZSkpIHtcbiAgICAgICAgICAvLyBjb2xvcnMgZG9uJ3QgaGF2ZSB1bml0c1xuICAgICAgICAgIHN0YXJ0VW5pdCA9IGdldFVuaXQoc3RhcnRWYWx1ZSk7XG4gICAgICAgICAgZW5kVW5pdCA9IGdldFVuaXQoZW5kVmFsdWUpO1xuICAgICAgICAgIGVuZFVuaXQgPyBzdGFydFVuaXQgIT09IGVuZFVuaXQgJiYgKHN0YXJ0VmFsdWUgPSBfY29udmVydFRvVW5pdCh0YXJnZXQsIHAsIHN0YXJ0VmFsdWUsIGVuZFVuaXQpICsgZW5kVW5pdCkgOiBzdGFydFVuaXQgJiYgKGVuZFZhbHVlICs9IHN0YXJ0VW5pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZChzdHlsZSwgXCJzZXRQcm9wZXJ0eVwiLCBzdGFydFZhbHVlLCBlbmRWYWx1ZSwgaW5kZXgsIHRhcmdldHMsIDAsIDAsIHApO1xuICAgICAgICBwcm9wcy5wdXNoKHApO1xuICAgICAgICBpbmxpbmVQcm9wcy5wdXNoKHAsIDAsIHN0eWxlW3BdKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAoc3RhcnRBdCAmJiBwIGluIHN0YXJ0QXQpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIHNvbWVvbmUgaGFyZC1jb2RlcyBhIGNvbXBsZXggdmFsdWUgYXMgdGhlIHN0YXJ0LCBsaWtlIHRvcDogXCJjYWxjKDJ2aCAvIDIpXCIuIFdpdGhvdXQgdGhpcywgaXQnZCB1c2UgdGhlIGNvbXB1dGVkIHZhbHVlIChhbHdheXMgaW4gcHgpXG4gICAgICAgICAgc3RhcnRWYWx1ZSA9IHR5cGVvZiBzdGFydEF0W3BdID09PSBcImZ1bmN0aW9uXCIgPyBzdGFydEF0W3BdLmNhbGwodHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpIDogc3RhcnRBdFtwXTtcbiAgICAgICAgICBfaXNTdHJpbmcoc3RhcnRWYWx1ZSkgJiYgfnN0YXJ0VmFsdWUuaW5kZXhPZihcInJhbmRvbShcIikgJiYgKHN0YXJ0VmFsdWUgPSBfcmVwbGFjZVJhbmRvbShzdGFydFZhbHVlKSk7XG4gICAgICAgICAgZ2V0VW5pdChzdGFydFZhbHVlICsgXCJcIikgfHwgc3RhcnRWYWx1ZSA9PT0gXCJhdXRvXCIgfHwgKHN0YXJ0VmFsdWUgKz0gX2NvbmZpZy51bml0c1twXSB8fCBnZXRVbml0KF9nZXQodGFyZ2V0LCBwKSkgfHwgXCJcIik7IC8vIGZvciBjYXNlcyB3aGVuIHNvbWVvbmUgcGFzc2VzIGluIGEgdW5pdGxlc3MgdmFsdWUgbGlrZSB7eDogMTAwfTsgaWYgd2UgdHJ5IHNldHRpbmcgdHJhbnNsYXRlKDEwMCwgMHB4KSBpdCB3b24ndCB3b3JrLlxuXG4gICAgICAgICAgKHN0YXJ0VmFsdWUgKyBcIlwiKS5jaGFyQXQoMSkgPT09IFwiPVwiICYmIChzdGFydFZhbHVlID0gX2dldCh0YXJnZXQsIHApKTsgLy8gY2FuJ3Qgd29yayB3aXRoIHJlbGF0aXZlIHZhbHVlc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgI
4674HN0YXJ0VmFsdWUgPSBfZ2V0KHRhcmdldCwgcCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE51bSA9IHBhcnNlRmxvYXQoc3RhcnRWYWx1ZSk7XG4gICAgICAgIHJlbGF0aXZlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBlbmRWYWx1ZS5jaGFyQXQoMSkgPT09IFwiPVwiICYmIGVuZFZhbHVlLnN1YnN0cigwLCAyKTtcbiAgICAgICAgcmVsYXRpdmUgJiYgKGVuZFZhbHVlID0gZW5kVmFsdWUuc3Vic3RyKDIpKTtcbiAgICAgICAgZW5kTnVtID0gcGFyc2VGbG9hdChlbmRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKHAgaW4gX3Byb3BlcnR5QWxpYXNlcykge1xuICAgICAgICAgIGlmIChwID09PSBcImF1dG9BbHBoYVwiKSB7XG4gICAgICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGVyZSB3ZSBjb250cm9sIHRoZSB2aXNpYmlsaXR5IGFsb25nIHdpdGggb3BhY2l0eS4gV2Ugc3RpbGwgYWxsb3cgdGhlIG9wYWNpdHkgdmFsdWUgdG8gcGFzcyB0aHJvdWdoIGFuZCBnZXQgdHdlZW5lZC5cbiAgICAgICAgICAgIGlmIChzdGFydE51bSA9PT0gMSAmJiBfZ2V0KHRhcmdldCwgXCJ2aXNpYmlsaXR5XCIpID09PSBcImhpZGRlblwiICYmIGVuZE51bSkge1xuICAgICAgICAgICAgICAvL2lmIHZpc2liaWxpdHkgaXMgaW5pdGlhbGx5IHNldCB0byBcImhpZGRlblwiLCB3ZSBzaG91bGQgaW50ZXJwcmV0IHRoYXQgYXMgaW50ZW50IHRvIG1ha2Ugb3BhY2l0eSAwIChhIGNvbnZlbmllbmNlKVxuICAgICAgICAgICAgICBzdGFydE51bSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlubGluZVByb3BzLnB1c2goXCJ2aXNpYmlsaXR5XCIsIDAsIHN0eWxlLnZpc2liaWxpdHkpO1xuXG4gICAgICAgICAgICBfYWRkTm9uVHdlZW5pbmdQVCh0aGlzLCBzdHlsZSwgXCJ2aXNpYmlsaXR5XCIsIHN0YXJ0TnVtID8gXCJpbmhlcml0XCIgOiBcImhpZGRlblwiLCBlbmROdW0gPyBcImluaGVyaXRcIiA6IFwiaGlkZGVuXCIsICFlbmROdW0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwICE9PSBcInNjYWxlXCIgJiYgcCAhPT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgcCA9IF9wcm9wZXJ0eUFsaWFzZXNbcF07XG4gICAgICAgICAgICB+cC5pbmRleE9mKFwiLFwiKSAmJiAocCA9IHAuc3BsaXQoXCIsXCIpWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpc1RyYW5zZm9ybVJlbGF0ZWQgPSBwIGluIF90cmFuc2Zvcm1Qcm9wczsgLy8tLS0gVFJBTlNGT1JNLVJFTEFURUQgLS0tXG5cbiAgICAgICAgaWYgKGlzVHJhbnNmb3JtUmVsYXRlZCkge1xuICAgICAgICAgIHRoaXMuc3R5bGVzLnNhdmUocCk7XG4gICAgICAgICAgZmluYWxUcmFuc2Zvcm1WYWx1ZSA9IGVuZFZhbHVlOyAvLyB0aGlzIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyBlbmRWYWx1ZSBleGNlcHQgd2hlbiBpdCdzIGEgdmFyKC0tKSB2YWx1ZSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgZW5kIHZhbHVlLlxuXG4gICAgICAgICAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIgJiYgZW5kVmFsdWUuc3Vic3RyaW5nKDAsIDYpID09PSBcInZhcigtLVwiKSB7XG4gICAgICAgICAgICBlbmRWYWx1ZSA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgZW5kVmFsdWUuc3Vic3RyaW5nKDQsIGVuZFZhbHVlLmluZGV4T2YoXCIpXCIpKSk7XG5cbiAgICAgICAgICAgIGlmIChlbmRWYWx1ZS5zdWJzdHJpbmcoMCwgNSkgPT09IFwiY2FsYyhcIikge1xuICAgICAgICAgICAgICB2Y
4674XIgb3JpZ1BlcnNwZWN0aXZlID0gdGFyZ2V0LnN0eWxlLnBlcnNwZWN0aXZlO1xuICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUucGVyc3BlY3RpdmUgPSBlbmRWYWx1ZTtcbiAgICAgICAgICAgICAgZW5kVmFsdWUgPSBfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIFwicGVyc3BlY3RpdmVcIik7XG4gICAgICAgICAgICAgIG9yaWdQZXJzcGVjdGl2ZSA/IHRhcmdldC5zdHlsZS5wZXJzcGVjdGl2ZSA9IG9yaWdQZXJzcGVjdGl2ZSA6IF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIFwicGVyc3BlY3RpdmVcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdHJhbnNmb3JtUHJvcFR3ZWVuKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRhcmdldC5fZ3NhcDtcbiAgICAgICAgICAgIGNhY2hlLnJlbmRlclRyYW5zZm9ybSAmJiAhdmFycy5wYXJzZVRyYW5zZm9ybSB8fCBfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCB2YXJzLnBhcnNlVHJhbnNmb3JtKTsgLy8gaWYsIGZvciBleGFtcGxlLCBnc2FwLnNldCguLi4ge3RyYW5zZm9ybTpcInRyYW5zbGF0ZVgoNTB2dylcIn0pLCB0aGUgX2dldCgpIGNhbGwgZG9lc24ndCBwYXJzZSB0aGUgdHJhbnNmb3JtLCB0aHVzIGNhY2hlLnJlbmRlclRyYW5zZm9ybSB3b24ndCBiZSBzZXQgeWV0IHNvIGZvcmNlIHRoZSBwYXJzaW5nIG9mIHRoZSB0cmFuc2Zvcm0gaGVyZS5cblxuICAgICAgICAgICAgc21vb3RoID0gdmFycy5zbW9vdGhPcmlnaW4gIT09IGZhbHNlICYmIGNhY2hlLnNtb290aDtcbiAgICAgICAgICAgIHRyYW5zZm9ybVByb3BUd2VlbiA9IHRoaXMuX3B0ID0gbmV3IFByb3BUd2Vlbih0aGlzLl9wdCwgc3R5bGUsIF90cmFuc2Zvcm1Qcm9wLCAwLCAxLCBjYWNoZS5yZW5kZXJUcmFuc2Zvcm0sIGNhY2hlLCAwLCAtMSk7IC8vdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwgY3JlYXRlIHRoZSByZW5kZXJpbmcgUHJvcFR3ZWVuIHNvIHRoYXQgaXQgcnVucyBMQVNUIChpbiB0aGUgbGlua2VkIGxpc3QsIHdlIGtlZXAgYWRkaW5nIHRvIHRoZSBiZWdpbm5pbmcpXG5cbiAgICAgICAgICAgIHRyYW5zZm9ybVByb3BUd2Vlbi5kZXAgPSAxOyAvL2ZsYWcgaXQgYXMgZGVwZW5kZW50IHNvIHRoYXQgaWYgdGhpbmdzIGdldCBraWxsZWQvb3ZlcndyaXR0ZW4gYW5kIHRoaXMgaXMgdGhlIG9ubHkgUHJvcFR3ZWVuIGxlZnQsIHdlIGNhbiBzYWZlbHkga2lsbCB0aGUgd2hvbGUgdHdlZW4uXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHAgPT09IFwic2NhbGVcIikge1xuICAgICAgICAgICAgdGhpcy5fcHQgPSBuZXcgUHJvcFR3ZWVuKHRoaXMuX3B0LCBjYWNoZSwgXCJzY2FsZVlcIiwgY2FjaGUuc2NhbGVZLCAocmVsYXRpdmUgPyBfcGFyc2VSZWxhdGl2ZShjYWNoZS5zY2FsZVksIHJlbGF0aXZlICsgZW5kTnVtKSA6IGVuZE51bSkgLSBjYWNoZS5zY2FsZVkgfHwgMCwgX3JlbmRlckNTU1Byb3ApO1xuICAgICAgICAgICAgdGhpcy5fcHQudSA9IDA7XG4gICAgICAgICAgICBwcm9wcy5wdXNoKFwic2NhbGVZXCIsIHApO1xuICAgICAgICAgICAgcCArPSBcIlhcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHAgPT09IFwidHJhbnNmb3JtT3JpZ2luXCIpIHtcbiAgICAgICAgICAgIGlubGluZVByb3BzLnB1c2goX3RyYW5zZm9ybU9yaWdpblByb3AsIDAsIHN0eWxlW190cmFuc2Zvcm1PcmlnaW5Qcm9wXSk7XG4gICAgICAgICAgICBlbmRWYWx1ZSA9IF9jb252ZXJ0S2V5d29yZHNUb1BlcmNlbnRhZ2VzKGVuZFZhbHVlKTsgLy9pbiBjYXNlIHNvbWV0aGluZyBsaWtlIFwibGVmdCB0b3BcIiBvciBcImJvdHRvbSByaWdodFwiIGlzIHBhc3NlZCBpbi4gQ29udmVydCB0byBwZXJjZW50YWdlcy5cblxuICAgICAgICAgICAgaWYgKGNhY2hlLnN2Zykge1xuICAgICAgICAgICAgICBfYXBwbHlTVkdPcmlnaW4odGFyZ2V0LCBlbmRWYWx1ZSwgMCwgc21vb3RoLCAwLCB0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVuZFVuaXQgPSBwYXJzZUZsb2F0KGVuZFZhbHVlLnNwbGl0KFwiIFwiKVsyXSkgfHwgMDsgLy9oYW5kbGUgdGhlIHpPcmlnaW4gc2VwYXJhdGVseSFcblxuICAgICAgICAgICAgICBlbmRVbml0ICE9PSBjYWNoZS56T3JpZ2luICYmIF9hZGROb25Ud2VlbmluZ1BUKHRoaXMsIGNhY2hlLCBcInpPcmlnaW5cIiwgY2FjaGUuek9yaWdpbiwgZW5kVW5pdCk7XG5cbiAgICAgICAgICAgICAgX2FkZE5vblR3ZWVuaW5nUFQodGhpcywgc3R5bGUsIHAsIF9maXJzdFR3b09ubHkoc3RhcnRWYWx1ZSksIF9maXJzdFR3b09ubHkoZW5kVmFsdWUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChwID09PSBcInN2Z09yaWdpblwiKSB7XG4gICAgICAgICAgICBfYXBwbHlTVkdPcmlnaW4odGFyZ2V0LCBlbmRWYWx1ZSwgMSwgc21vb3RoLCAwLCB0aGlzKTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChwIGluIF9yb3RhdGlvbmFsUHJvcGVydGllcykge1xuICAgICAgICAgICAgX2FkZFJvdGF0aW9uYWxQcm9wVHdlZW4odGhpcywgY2FjaGUsIHAsIHN0YXJ0TnVtLCByZWxhdGl2ZSA/IF9wYXJzZVJlbGF0aXZlKHN0YXJ0TnVtLCByZWxhdGl2ZSArIGVuZFZhbHVlKSA6IGVuZFZhbHVlKTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChwID09PSBcInNtb290aE9yaWdpblwiKSB7XG4gICAgICAgICAgICBfYWRkTm9uVHdlZW5pbmdQVCh0aGlzLCBjYWNoZSwgXCJzbW9vdGhcIiwgY2FjaGUuc21vb3RoLCBlbmRWYWx1ZSk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocCA9PT0gXCJmb3JjZTNEXCIpIHtcbiAgICAgICAgICAgIGNhY2hlW3BdID0gZW5kVmFsdWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHAgPT09IFwidHJhbnNmb3JtXCIpIHtcbiAgICAgICAgICAgIF9hZGRSYXdUcmFuc2Zvcm1QVHModGhpcywgZW5kVmFsdWUsIHRhcmdldCk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgI
4674H1cbiAgICAgICAgfSBlbHNlIGlmICghKHAgaW4gc3R5bGUpKSB7XG4gICAgICAgICAgcCA9IF9jaGVja1Byb3BQcmVmaXgocCkgfHwgcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1RyYW5zZm9ybVJlbGF0ZWQgfHwgKGVuZE51bSB8fCBlbmROdW0gPT09IDApICYmIChzdGFydE51bSB8fCBzdGFydE51bSA9PT0gMCkgJiYgIV9jb21wbGV4RXhwLnRlc3QoZW5kVmFsdWUpICYmIHAgaW4gc3R5bGUpIHtcbiAgICAgICAgICBzdGFydFVuaXQgPSAoc3RhcnRWYWx1ZSArIFwiXCIpLnN1YnN0cigoc3RhcnROdW0gKyBcIlwiKS5sZW5ndGgpO1xuICAgICAgICAgIGVuZE51bSB8fCAoZW5kTnVtID0gMCk7IC8vIHByb3RlY3QgYWdhaW5zdCBOYU5cblxuICAgICAgICAgIGVuZFVuaXQgPSBnZXRVbml0KGVuZFZhbHVlKSB8fCAocCBpbiBfY29uZmlnLnVuaXRzID8gX2NvbmZpZy51bml0c1twXSA6IHN0YXJ0VW5pdCk7XG4gICAgICAgICAgc3RhcnRVbml0ICE9PSBlbmRVbml0ICYmIChzdGFydE51bSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcCwgc3RhcnRWYWx1ZSwgZW5kVW5pdCkpO1xuICAgICAgICAgIHRoaXMuX3B0ID0gbmV3IFByb3BUd2Vlbih0aGlzLl9wdCwgaXNUcmFuc2Zvcm1SZWxhdGVkID8gY2FjaGUgOiBzdHlsZSwgcCwgc3RhcnROdW0sIChyZWxhdGl2ZSA/IF9wYXJzZVJlbGF0aXZlKHN0YXJ0TnVtLCByZWxhdGl2ZSArIGVuZE51bSkgOiBlbmROdW0pIC0gc3RhcnROdW0sICFpc1RyYW5zZm9ybVJlbGF0ZWQgJiYgKGVuZFVuaXQgPT09IFwicHhcIiB8fCBwID09PSBcInpJbmRleFwiKSAmJiB2YXJzLmF1dG9Sb3VuZCAhPT0gZmFsc2UgPyBfcmVuZGVyUm91bmRlZENTU1Byb3AgOiBfcmVuZGVyQ1NTUHJvcCk7XG4gICAgICAgICAgdGhpcy5fcHQudSA9IGVuZFVuaXQgfHwgMDtcblxuICAgICAgICAgIGlmIChpc1RyYW5zZm9ybVJlbGF0ZWQgJiYgZmluYWxUcmFuc2Zvcm1WYWx1ZSAhPT0gZW5kVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3B0LmIgPSBzdGFydFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fcHQuZSA9IGZpbmFsVHJhbnNmb3JtVmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9wdC5yID0gX3JlbmRlckNTU1Byb3BXaXRoQmVnaW5uaW5nQW5kRW5kO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRVbml0ICE9PSBlbmRVbml0ICYmIGVuZFVuaXQgIT09IFwiJVwiKSB7XG4gICAgICAgICAgICAvL3doZW4gdGhlIHR3ZWVuIGdvZXMgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYmVnaW5uaW5nLCB3ZSBuZWVkIHRvIHJldmVydCBpdCB0byB0aGUgT0xEL09SSUdJTkFMIHZhbHVlICh3aXRoIHRob3NlIHVuaXRzKS4gV2UgcmVjb3JkIHRoYXQgYXMgYSBcImJcIiAoYmVnaW5uaW5nKSBwcm9wZXJ0eSBhbmQgcG9pbnQgdG8gYSByZW5kZXIgbWV0aG9kIHRoYXQgaGFuZGxlcyB0aGF0LiAocGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uKVxuICAgICAgICAgICAgdGhpcy5fcHQuYiA9IHN0YXJ0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9wdC5yID0gX3JlbmRlckNTU1Byb3BXaXRoQmVnaW5uaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKHAgaW4gc3R5bGUpKSB7XG4gICAgICAgICAgaWYgKHAgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICAvL21heWJlIGl0J3Mgbm90IGEgc3R5bGUgLSBpdCBjb3VsZCBiZSBhIHByb3BlcnR5IGFkZGVkIGRpcmVjdGx5IHRvIGFuIGVsZW1lbnQgaW4gd2hpY2ggY2FzZSB3ZSdsb
4674CB0cnkgdG8gYW5pbWF0ZSB0aGF0LlxuICAgICAgICAgICAgdGhpcy5hZGQodGFyZ2V0LCBwLCBzdGFydFZhbHVlIHx8IHRhcmdldFtwXSwgcmVsYXRpdmUgPyByZWxhdGl2ZSArIGVuZFZhbHVlIDogZW5kVmFsdWUsIGluZGV4LCB0YXJnZXRzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHAgIT09IFwicGFyc2VUcmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgX21pc3NpbmdQbHVnaW4ocCwgZW5kVmFsdWUpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3R3ZWVuQ29tcGxleENTU1N0cmluZy5jYWxsKHRoaXMsIHRhcmdldCwgcCwgc3RhcnRWYWx1ZSwgcmVsYXRpdmUgPyByZWxhdGl2ZSArIGVuZFZhbHVlIDogZW5kVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXNUcmFuc2Zvcm1SZWxhdGVkIHx8IChwIGluIHN0eWxlID8gaW5saW5lUHJvcHMucHVzaChwLCAwLCBzdHlsZVtwXSkgOiB0eXBlb2YgdGFyZ2V0W3BdID09PSBcImZ1bmN0aW9uXCIgPyBpbmxpbmVQcm9wcy5wdXNoKHAsIDIsIHRhcmdldFtwXSgpKSA6IGlubGluZVByb3BzLnB1c2gocCwgMSwgc3RhcnRWYWx1ZSB8fCB0YXJnZXRbcF0pKTtcbiAgICAgICAgcHJvcHMucHVzaChwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNQcmlvcml0eSAmJiBfc29ydFByb3BUd2VlbnNCeVByaW9yaXR5KHRoaXMpO1xuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihyYXRpbywgZGF0YSkge1xuICAgIGlmIChkYXRhLnR3ZWVuLl90aW1lIHx8ICFfcmV2ZXJ0aW5nKCkpIHtcbiAgICAgIHZhciBwdCA9IGRhdGEuX3B0O1xuXG4gICAgICB3aGlsZSAocHQpIHtcbiAgICAgICAgcHQucihyYXRpbywgcHQuZCk7XG4gICAgICAgIHB0ID0gcHQuX25leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEuc3R5bGVzLnJldmVydCgpO1xuICAgIH1cbiAgfSxcbiAgZ2V0OiBfZ2V0LFxuICBhbGlhc2VzOiBfcHJvcGVydHlBbGlhc2VzLFxuICBnZXRTZXR0ZXI6IGZ1bmN0aW9uIGdldFNldHRlcih0YXJnZXQsIHByb3BlcnR5LCBwbHVnaW4pIHtcbiAgICAvL3JldHVybnMgYSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRhcmdldCwgcHJvcGVydHksIHZhbHVlIGFuZCBhcHBsaWVzIGl0IGFjY29yZGluZ2x5LiBSZW1lbWJlciwgcHJvcGVydGllcyBsaWtlIFwieFwiIGFyZW4ndCBhcyBzaW1wbGUgYXMgdGFyZ2V0LnN0eWxlLnByb3BlcnR5ID0gdmFsdWUgYmVjYXVzZSB0aGV5J3ZlIGdvdCB0byBiZSBhcHBsaWVkIHRvIGEgcHJveHkgb2JqZWN0IGFuZCB0aGVuIG1lcmdlZCBpbnRvIGEgdHJhbnNmb3JtIHN0cmluZyBpbiBhIHJlbmRlcmVyLlxuICAgIHZhciBwID0gX3Byb3BlcnR5QWxpYXNlc1twcm9wZXJ0eV07XG4gICAgcCAmJiBwLmluZGV4T2YoXCIsXCIpIDwgMCAmJiAocHJvcGVydHkgPSBwKTtcbiAgICByZXR1cm4gcHJvcGVydHkgaW4gX3RyYW5zZm9ybVByb3BzICYmIHByb3BlcnR5ICE9PSBfdHJhbnNmb3JtT3JpZ2luUHJvcCAmJiAodGFyZ2V0Ll9nc2FwLnggfHwgX2dldCh0YXJnZXQsIFwieFwiKSkgPyBwbHVnaW4gJiYgX3JlY2VudFNldHRlclBsdWdpbiA9PT0gcGx1Z2luID8gcHJvcGVydHkgPT09IFwic2NhbGVcIiA/IF9zZXR0ZXJTY2FsZSA6IF9zZXR0ZXJUcmFuc2Zvcm0gOiAoX3JlY2VudFNldHRlclBsdWdpbiA9IHBsdWdpbiB8fCB7fSkgJiYgKHByb3BlcnR5ID09PSBcInNjYWxlXCIgPyBfc2V0dGVyU2NhbGVXaXRoUmVuZGVyIDogX3NldHRlclRyYW5zZm9ybVdpdGhSZW5kZXIpIDogdGFyZ2V0LnN0eWxlICYmICFfaXNVbmRlZmluZWQodGFyZ2V0LnN0eWxlW3Byb3BlcnR5XSkgPyBfc2V0dGVyQ1NTU3R5bGUgOiB+cHJvcGVydHkuaW5kZXhPZihcIi1cIikgPyBfc2V0dGVyQ1NTUHJvcCA6IF9nZXRTZXR0ZXIodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gIH0sXG4gIGNvcmU6IHtcbiAgICBfcmVtb3ZlUHJvcGVydHk6IF9yZW1vdmVQcm9wZXJ0eSxcbiAgICBfZ2V0TWF0cml4OiBfZ2V0TWF0cml4XG4gIH1cbn07XG5nc2FwLnV0aWxzLmNoZWNrUHJlZml4ID0gX2NoZWNrUHJvcFByZWZpeDtcbmdzYXAuY29yZS5nZXRTdHlsZVNhdmVyID0gX2dldFN0eWxlU2F2ZXI7XG5cbihmdW5jdGlvbiAocG9zaXRpb25BbmRTY2FsZSwgcm90YXRpb24sIG90aGVycywgYWxpYXNlcykge1xuICB2YXIgYWxsID0gX2ZvckVhY2hOYW1lKHBvc2l0aW9uQW5kU2NhbGUgKyBcIixcIiArIHJvdGF0aW9uICsgXCIsXCIgKyBvdGhlcnMsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX3RyYW5zZm9ybVByb3BzW25hbWVdID0gMTtcbiAgfSk7XG5cbiAgX2ZvckVhY2hOYW1lKHJvdGF0aW9uLCBmdW5jdGlvbiAobmFtZSkge1xuICAgIF9jb25maWcudW5pdHNbbmFtZV0gPSBcImRlZ1wiO1xuICAgIF9yb3RhdGlvbmFsUHJvcGVydGllc1tuYW1lXSA9IDE7XG4gIH0pO1xuXG4gIF9wcm9wZXJ0eUFsaWFzZXNbYWxsWzEzXV0gPSBwb3NpdGlvbkFuZFNjYWxlICsgXCIsXCIgKyByb3RhdGlvbjtcblxuICBfZm9yRWFjaE5hbWUoYWxpYXNlcywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgc3BsaXQgPSBuYW1lLnNwbGl0KFwiOlwiKTtcbiAgICBfcHJvcGVydHlBbGlhc2VzW3NwbGl0WzFdXSA9IGFsbFtzcGxpdFswXV07XG4gIH0pO1xufSkoXCJ4LHkseixzY2FsZSxzY2FsZVgsc2NhbGVZLHhQZXJjZW50LHlQZXJjZW50XCIsIFwicm90YXRpb24scm90YXRpb25YLHJvdGF0aW9uWSxza2V3WCxza2V3WVwiLCBcInRyYW5zZm9ybSx0cmFuc2Zvcm1PcmlnaW4sc3ZnT3JpZ2luLGZvcmNlM0Qsc21vb3RoT3JpZ2luLHRyYW5zZm9ybVBlcnNwZWN0aXZlXCIsIFwiMDp0cmFuc2xhdGVYLDE6dHJhbnNsYXRlWSwyOnRyYW5zbGF0ZVosODpyb3RhdGUsODpyb3RhdGlvblosODpyb3RhdGVaLDk6cm90YXRlWCwxMDpyb3RhdGVZXCIpO1xuXG5fZm9yRWFjaE5hbWUoXCJ4LHkseix0b3AscmlnaHQsYm90dG9tLGxlZnQsd2lkdGgsaGVpZ2h0LGZvbnRTaXplLHBhZGRpbmcsbWFyZ2luLHBlcnNwZWN0aXZlXCIsIGZ1bmN0aW9uIChuYW1lKSB7XG4gIF9jb25maWcudW5pdHNbbmFtZV0gPSBcInB4XCI7XG59KTtcblxuZ3NhcC5yZWdpc3RlclBsdWdpbihDU1NQbHVnaW4pO1xuZXhwb3J0IHsgQ1NTUGx1Z2luIGFzIGRlZmF1bHQsIF9nZXRCQm94LCBfY3JlYXRlRWxlbWVudCwgX2NoZWNrUHJvcFByZWZpeCBhcyBjaGVja1ByZWZpeCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
4675//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/CSSPlugin.js
4676
4677}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/Observer.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
4678/* harmony export */ __webpack_require__.d(__webpack_exports__, {
vendor: 10,476 bytes, lines 4679-4933
4679/* harmony export */   Observer: () => (/* binding */ Observer),
4680/* harmony export */   _getProxyProp: () => (/* binding */ _getProxyProp),
4681/* harmony export */   _getScrollFunc: () => (/* binding */ _getScrollFunc),
4682/* harmony export */   _getTarget: () => (/* binding */ _getTarget),
4683/* harmony export */   _getVelocityProp: () => (/* binding */ _getVelocityProp),
4684/* harmony export */   _horizontal: () => (/* binding */ _horizontal),
4685/* harmony export */   _isViewport: () => (/* binding */ _isViewport),
4686/* harmony export */   _proxies: () => (/* binding */ _proxies),
4687/* harmony export */   _scrollers: () => (/* binding */ _scrollers),
4688/* harmony export */   _vertical: () => (/* binding */ _vertical),
4689/* harmony export */   "default": () => (/* binding */ Observer)
4690/* harmony export */ });
4691function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
4692
4693function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
4694
4695/*!
4696 * Observer 3.15.0
4697 * https://gsap.com
4698 *
4699 * @license Copyright 2008-2026, GreenSock. All rights reserved.
4700 * Subject to the terms at https://gsap.com/standard-license
4701 * @author: Jack Doyle, [email protected]
4702*/
4703
4704/* eslint-disable */
4705var gsap,
4706    _coreInitted,
4707    _clamp,
4708    _win,
4709    _doc,
4710    _docEl,
4711    _body,
4712    _isTouch,
4713    _pointerType,
4714    ScrollTrigger,
4715    _root,
4716    _normalizer,
4717    _eventTypes,
4718    _context,
4719    _getGSAP = function _getGSAP() {
4720  return gsap || typeof window !== "undefined" && (gsap = window.gsap) && gsap.registerPlugin && gsap;
4721},
4722    _startup = 1,
4723    _observers = [],
4724    _scrollers = [],
4725    _proxies = [],
4726    _getTime = Date.now,
4727    _bridge = function _bridge(name, value) {
4728  return value;
4729},
4730    _integrate = function _integrate() {
4731  var core = ScrollTrigger.core,
4732      data = core.bridge || {},
4733      scrollers = core._scrollers,
4734      proxies = core._proxies;
4735  scrollers.push.apply(scrollers, _scrollers);
4736  proxies.push.apply(proxies, _proxies);
4737  _scrollers = scrollers;
4738  _proxies = proxies;
4739
4740  _bridge = function _bridge(name, value) {
4741    return data[name](value);
4742  };
4743},
4744    _getProxyProp = function _getProxyProp(element, property) {
4745  return ~_proxies.indexOf(element) && _proxies[_proxies.indexOf(element) + 1][property];
4746},
4747    _isViewport = function _isViewport(el) {
4748  return !!~_root.indexOf(el);
4749},
4750    _addListener = function _addListener(element, type, func, passive, capture) {
4751  return element.addEventListener(type, func, {
4752    passive: passive !== false,
4753    capture: !!capture
4754  });
4755},
4756    _removeListener = function _removeListener(element, type, func, capture) {
4757  return element.removeEventListener(type, func, !!capture);
4758},
4759    _scrollLeft = "scrollLeft",
4760    _scrollTop = "scrollTop",
4761    _onScroll = function _onScroll() {
4762  return _normalizer && _normalizer.isPressed || _scrollers.cache++;
4763},
4764    _scrollCacheFunc = function _scrollCacheFunc(f, doNotCache) {
4765  var cachingFunc = function cachingFunc(value) {
4766    // since reading the scrollTop/scrollLeft/pageOffsetY/pageOffsetX can trigger a layout, this function allows us to cache the value so it only gets read fresh after a "scroll" event fires (or while we're refreshing because that can lengthen the page and alter the scroll position). when "soft" is true, that means don't actually set the scroll, but cache the new value instead (useful in ScrollSmoother)
4767    if (value || value === 0) {
4768      _startup && (_win.history.scrollRestoration = "manual"); // otherwise the new position will get overwritten by the browser onload.
4769
4770      var isNormalizing = _normalizer && _normalizer.isPressed;
4771      value = cachingFunc.v = Math.round(value) || (_normalizer && _normalizer.iOS ? 1 : 0); //TODO: iOS Bug: if you allow it to go to 0, Safari can start to report super strange (wildly inaccurate) touch positions!
4772
4773      f(value);
4774      cachingFunc.cacheID = _scrollers.cache;
4775      isNormalizing && _bridge("ss", value); // set scroll (notify ScrollTrigger so it can dispatch a "scrollStart" event if necessary
4776    } else if (doNotCache || _scrollers.cache !== cachingFunc.cacheID || _bridge("ref")) {
4777      cachingFunc.cacheID = _scrollers.cache;
4778      cachingFunc.v = f();
4779    }
4780
4781    return cachingFunc.v + cachingFunc.offset;
4782  };
4783
4784  cachingFunc.offset = 0;
4785  return f && cachingFunc;
4786},
4787    _horizontal = {
4788  s: _scrollLeft,
4789  p: "left",
4790  p2: "Left",
4791  os: "right",
4792  os2: "Right",
4793  d: "width",
4794  d2: "Width",
4795  a: "x",
4796  sc: _scrollCacheFunc(function (value) {
4797    return arguments.length ? _win.scrollTo(value, _vertical.sc()) : _win.pageXOffset || _doc[_scrollLeft] || _docEl[_scrollLeft] || _body[_scrollLeft] || 0;
4798  })
4799},
4800    _vertical = {
4801  s: _scrollTop,
4802  p: "top",
4803  p2: "Top",
4804  os: "bottom",
4805  os2: "Bottom",
4806  d: "height",
4807  d2: "Height",
4808  a: "y",
4809  op: _horizontal,
4810  sc: _scrollCacheFunc(function (value) {
4811    return arguments.length ? _win.scrollTo(_horizontal.sc(), value) : _win.pageYOffset || _doc[_scrollTop] || _docEl[_scrollTop] || _body[_scrollTop] || 0;
4812  })
4813},
4814    _getTarget = function _getTarget(t, self) {
4815  return (self && self._ctx && self._ctx.selector || gsap.utils.toArray)(t)[0] || (typeof t === "string" && gsap.config().nullTargetWarn !== false ? console.warn("Element not found:", t) : null);
4816},
4817    _isWithin = function _isWithin(element, list) {
4818  // check if the element is in the list or is a descendant of an element in the list.
4819  var i = list.length;
4820
4821  while (i--) {
4822    if (list[i] === element || list[i].contains(element)) {
4823      return true;
4824    }
4825  }
4826
4827  return false;
4828},
4829    _getScrollFunc = function _getScrollFunc(element, _ref) {
4830  var s = _ref.s,
4831      sc = _ref.sc;
4832  // we store the scroller functions in an alternating sequenced Array like [element, verticalScrollFunc, horizontalScrollFunc, ...] so that we can minimize memory, maximize performance, and we also record the last position as a ".rec" property in order to revert to that after refreshing to ensure things don't shift around.
4833  _isViewport(element) && (element = _doc.scrollingElement || _docEl);
4834
4835  var i = _scrollers.indexOf(element),
4836      offset = sc === _vertical.sc ? 1 : 2;
4837
4838  !~i && (i = _scrollers.push(element) - 1);
4839  _scrollers[i + offset] || _addListener(element, "scroll", _onScroll); // clear the cache when a scroll occurs
4840
4841  var prev = _scrollers[i + offset],
4842      func = prev || (_scrollers[i + offset] = _scrollCacheFunc(_getProxyProp(element, s), true) || (_isViewport(element) ? sc : _scrollCacheFunc(function (value) {
4843    return arguments.length ? element[s] = value : element[s];
4844  })));
4845  func.target = element;
4846  prev || (func.smooth = gsap.getProperty(element, "scrollBehavior") === "smooth"); // only set it the first time (don't reset every time a scrollFunc is requested because perhaps it happens during a refresh() when it's disabled in ScrollTrigger.
4847
4848  return func;
4849},
4850    _getVelocityProp = function _getVelocityProp(value, minTimeRefresh, useDelta) {
4851  var v1 = value,
4852      v2 = value,
4853      t1 = _getTime(),
4854      t2 = t1,
4855      min = minTimeRefresh || 50,
4856      dropToZeroTime = Math.max(500, min * 3),
4857      update = function update(value, force) {
4858    var t = _getTime();
4859
4860    if (force || t - t1 > min) {
4861      v2 = v1;
4862      v1 = value;
4863      t2 = t1;
4864      t1 = t;
4865    } else if (useDelta) {
4866      v1 += value;
4867    } else {
4868      // not totally necessary, but makes it a bit more accurate by adjusting the v1 value according to the new slope. This way we're not just ignoring the incoming data. Removing for now because it doesn't seem to make much practical difference and it's probably not worth the kb.
4869      v1 = v2 + (value - v2) / (t - t2) * (t1 - t2);
4870    }
4871  },
4872      reset = function reset() {
4873    v2 = v1 = useDelta ? 0 : v1;
4874    t2 = t1 = 0;
4875  },
4876      getVelocity = function getVelocity(latestValue) {
4877    var tOld = t2,
4878        vOld = v2,
4879        t = _getTime();
4880
4881    (latestValue || latestValue === 0) && latestValue !== v1 && update(latestValue);
4882    return t1 === t2 || t - t2 > dropToZeroTime ? 0 : (v1 + (useDelta ? vOld : -vOld)) / ((useDelta ? t : t1) - tOld) * 1000;
4883  };
4884
4885  return {
4886    update: update,
4887    reset: reset,
4888    getVelocity: getVelocity
4889  };
4890},
4891    _getEvent = function _getEvent(e, preventDefault) {
4892  preventDefault && !e._gsapAllow && e.cancelable !== false && e.preventDefault();
4893  return e.changedTouches ? e.changedTouches[0] : e;
4894},
4895    _getAbsoluteMax = function _getAbsoluteMax(a) {
4896  var max = Math.max.apply(Math, a),
4897      min = Math.min.apply(Math, a);
4898  return Math.abs(max) >= Math.abs(min) ? max : min;
4899},
4900    _setScrollTrigger = function _setScrollTrigger() {
4901  ScrollTrigger = gsap.core.globals().ScrollTrigger;
4902  ScrollTrigger && ScrollTrigger.core && _integrate();
4903},
4904    _initCore = function _initCore(core) {
4905  gsap = core || _getGSAP();
4906
4907  if (!_coreInitted && gsap && typeof document !== "undefined" && document.body) {
4908    _win = window;
4909    _doc = document;
4910    _docEl = _doc.documentElement;
4911    _body = _doc.body;
4912    _root = [_win, _doc, _docEl, _body];
4913    _clamp = gsap.utils.clamp;
4914
4915    _context = gsap.core.context || function () {};
4916
4917    _pointerType = "onpointerenter" in _body ? "pointer" : "mouse"; // isTouch is 0 if no touch, 1 if ONLY touch, and 2 if it can accommodate touch but also other types like mouse/pointer.
4918
4919    _isTouch = Observer.isTouch = _win.matchMedia && _win.matchMedia("(hover: none), (pointer: coarse)").matches ? 1 : "ontouchstart" in _win || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 ? 2 : 0;
4920    _eventTypes = Observer.eventTypes = ("ontouchstart" in _docEl ? "touchstart,touchmove,touchcancel,touchend" : !("onpointerdown" in _docEl) ? "mousedown,mousemove,mouseup,mouseup" : "pointerdown,pointermove,pointercancel,pointerup").split(",");
4921    setTimeout(function () {
4922      return _startup = 0;
4923    }, 500);
4924    _coreInitted = 1;
4925  }
4926
4927  ScrollTrigger || _setScrollTrigger(); // Observer might be initted BEFORE ScrollTrigger, so don't put this with the initting code. ScrollTrigger will call Observer.register() when it inits.
4928
4929  return _coreInitted;
4930};
4931
4932_horizontal.op = _vertical;
4933_scrollers.cache = 0;
vendor: 16,441 bytes, lines 4934-5396
4934var Observer = /*#__PURE__*/function () {
4935  function Observer(vars) {
4936    this.init(vars);
4937  }
4938
4939  var _proto = Observer.prototype;
4940
4941  _proto.init = function init(vars) {
4942    _coreInitted || _initCore(gsap) || console.warn("Please gsap.registerPlugin(Observer)");
4943    ScrollTrigger || _setScrollTrigger();
4944    var tolerance = vars.tolerance,
4945        dragMinimum = vars.dragMinimum,
4946        type = vars.type,
4947        target = vars.target,
4948        lineHeight = vars.lineHeight,
4949        debounce = vars.debounce,
4950        preventDefault = vars.preventDefault,
4951        onStop = vars.onStop,
4952        onStopDelay = vars.onStopDelay,
4953        ignore = vars.ignore,
4954        wheelSpeed = vars.wheelSpeed,
4955        event = vars.event,
4956        onDragStart = vars.onDragStart,
4957        onDragEnd = vars.onDragEnd,
4958        onDrag = vars.onDrag,
4959        onPress = vars.onPress,
4960        onRelease = vars.onRelease,
4961        onRight = vars.onRight,
4962        onLeft = vars.onLeft,
4963        onUp = vars.onUp,
4964        onDown = vars.onDown,
4965        onChangeX = vars.onChangeX,
4966        onChangeY = vars.onChangeY,
4967        onChange = vars.onChange,
4968        onToggleX = vars.onToggleX,
4969        onToggleY = vars.onToggleY,
4970        onHover = vars.onHover,
4971        onHoverEnd = vars.onHoverEnd,
4972        onMove = vars.onMove,
4973        ignoreCheck = vars.ignoreCheck,
4974        isNormalizer = vars.isNormalizer,
4975        onGestureStart = vars.onGestureStart,
4976        onGestureEnd = vars.onGestureEnd,
4977        onWheel = vars.onWheel,
4978        onEnable = vars.onEnable,
4979        onDisable = vars.onDisable,
4980        onClick = vars.onClick,
4981        scrollSpeed = vars.scrollSpeed,
4982        capture = vars.capture,
4983        allowClicks = vars.allowClicks,
4984        lockAxis = vars.lockAxis,
4985        onLockAxis = vars.onLockAxis;
4986    this.target = target = _getTarget(target) || _docEl;
4987    this.vars = vars;
4988    ignore && (ignore = gsap.utils.toArray(ignore));
4989    tolerance = tolerance || 1e-9;
4990    dragMinimum = dragMinimum || 0;
4991    wheelSpeed = wheelSpeed || 1;
4992    scrollSpeed = scrollSpeed || 1;
4993    type = type || "wheel,touch,pointer";
4994    debounce = debounce !== false;
4995    lineHeight || (lineHeight = parseFloat(_win.getComputedStyle(_body).lineHeight) || 22); // note: browser may report "normal", so default to 22.
4996
4997    var id,
4998        onStopDelayedCall,
4999        dragged,
5000        moved,
5001        wheeled,
5002        locked,
5003        axis,
5004        self = this,
5005        prevDeltaX = 0,
5006        prevDeltaY = 0,
5007        passive = vars.passive || !preventDefault && vars.passive !== false,
5008        scrollFuncX = _getScrollFunc(target, _horizontal),
5009        scrollFuncY = _getScrollFunc(target, _vertical),
5010        scrollX = scrollFuncX(),
5011        scrollY = scrollFuncY(),
5012        limitToTouch = ~type.indexOf("touch") && !~type.indexOf("pointer") && _eventTypes[0] === "pointerdown",
5013        // for devices that accommodate mouse events and touch events, we need to distinguish.
5014    isViewport = _isViewport(target),
5015        ownerDoc = target.ownerDocument || _doc,
5016        deltaX = [0, 0, 0],
5017        // wheel, scroll, pointer/touch
5018    deltaY = [0, 0, 0],
5019        onClickTime = 0,
5020        clickCapture = function clickCapture() {
5021      return onClickTime = _getTime();
5022    },
5023        _ignoreCheck = function _ignoreCheck(e, isPointerOrTouch) {
5024      return (self.event = e) && ignore && _isWithin(e.target, ignore) || isPointerOrTouch && limitToTouch && e.pointerType !== "touch" || ignoreCheck && ignoreCheck(e, isPointerOrTouch);
5025    },
5026        onStopFunc = function onStopFunc() {
5027      self._vx.reset();
5028
5029      self._vy.reset();
5030
5031      onStopDelayedCall.pause();
5032      onStop && onStop(self);
5033    },
5034        update = function update() {
5035      var dx = self.deltaX = _getAbsoluteMax(deltaX),
5036          dy = self.deltaY = _getAbsoluteMax(deltaY),
5037          changedX = Math.abs(dx) >= tolerance,
5038          changedY = Math.abs(dy) >= tolerance;
5039
5040      onChange && (changedX || changedY) && onChange(self, dx, dy, deltaX, deltaY); // in ScrollTrigger.normalizeScroll(), we need to know if it was touch/pointer so we need access to the deltaX/deltaY Arrays before we clear them out.
5041
5042      if (changedX) {
5043        onRight && self.deltaX > 0 && onRight(self);
5044        onLeft && self.deltaX < 0 && onLeft(self);
5045        onChangeX && onChangeX(self);
5046        onToggleX && self.deltaX < 0 !== prevDeltaX < 0 && onToggleX(self);
5047        prevDeltaX = self.deltaX;
5048        deltaX[0] = deltaX[1] = deltaX[2] = 0;
5049      }
5050
5051      if (changedY) {
5052        onDown && self.deltaY > 0 && onDown(self);
5053        onUp && self.deltaY < 0 && onUp(self);
5054        onChangeY && onChangeY(self);
5055        onToggleY && self.deltaY < 0 !== prevDeltaY < 0 && onToggleY(self);
5056        prevDeltaY = self.deltaY;
5057        deltaY[0] = deltaY[1] = deltaY[2] = 0;
5058      }
5059
5060      if (moved || dragged) {
5061        onMove && onMove(self);
5062
5063        if (dragged) {
5064          onDragStart && dragged === 1 && onDragStart(self);
5065          onDrag && onDrag(self);
5066          dragged = 0;
5067        }
5068
5069        moved = false;
5070      }
5071
5072      locked && !(locked = false) && onLockAxis && onLockAxis(self);
5073
5074      if (wheeled) {
5075        onWheel(self);
5076        wheeled = false;
5077      }
5078
5079      id = 0;
5080    },
5081        onDelta = function onDelta(x, y, index) {
5082      deltaX[index] += x;
5083      deltaY[index] += y;
5084
5085      self._vx.update(x);
5086
5087      self._vy.update(y);
5088
5089      debounce ? id || (id = requestAnimationFrame(update)) : update();
5090    },
5091        onTouchOrPointerDelta = function onTouchOrPointerDelta(x, y) {
5092      if (lockAxis && !axis) {
5093        self.axis = axis = Math.abs(x) > Math.abs(y) ? "x" : "y";
5094        locked = true;
5095      }
5096
5097      if (axis !== "y") {
5098        deltaX[2] += x;
5099
5100        self._vx.update(x, true); // update the velocity as frequently as possible instead of in the debounced function so that very quick touch-scrolls (flicks) feel natural. If it's the mouse/touch/pointer, force it so that we get snappy/accurate momentum scroll.
5101
5102      }
5103
5104      if (axis !== "x") {
5105        deltaY[2] += y;
5106
5107        self._vy.update(y, true);
5108      }
5109
5110      debounce ? id || (id = requestAnimationFrame(update)) : update();
5111    },
5112        _onDrag = function _onDrag(e) {
5113      if (_ignoreCheck(e, 1)) {
5114        return;
5115      }
5116
5117      e = _getEvent(e, preventDefault);
5118      var x = e.clientX,
5119          y = e.clientY,
5120          dx = x - self.x,
5121          dy = y - self.y,
5122          isDragging = self.isDragging;
5123      self.x = x;
5124      self.y = y;
5125
5126      if (isDragging || (dx || dy) && (Math.abs(self.startX - x) >= dragMinimum || Math.abs(self.startY - y) >= dragMinimum)) {
5127        dragged || (dragged = isDragging ? 2 : 1); // dragged: 0 = not dragging, 1 = first drag, 2 = normal drag
5128
5129        isDragging || (self.isDragging = true);
5130        onTouchOrPointerDelta(dx, dy);
5131      }
5132    },
5133        _onPress = self.onPress = function (e) {
5134      if (_ignoreCheck(e, 1) || e && e.button) {
5135        return;
5136      }
5137
5138      self.axis = axis = null;
5139      onStopDelayedCall.pause();
5140      self.isPressed = true;
5141      e = _getEvent(e); // note: may need to preventDefault(?) Won't side-scroll on iOS Safari if we do, though.
5142
5143      prevDeltaX = prevDeltaY = 0;
5144      self.startX = self.x = e.clientX;
5145      self.startY = self.y = e.clientY;
5146
5147      self._vx.reset(); // otherwise the t2 may be stale if the user touches and flicks super fast and releases in less than 2 requestAnimationFrame ticks, causing velocity to be 0.
5148
5149
5150      self._vy.reset();
5151
5152      _addListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, passive, true);
5153
5154      self.deltaX = self.deltaY = 0;
5155      onPress && onPress(self);
5156    },
5157        _onRelease = self.onRelease = function (e) {
5158      if (_ignoreCheck(e, 1)) {
5159        return;
5160      }
5161
5162      _removeListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, true);
5163
5164      var isTrackingDrag = !isNaN(self.y - self.startY),
5165          wasDragging = self.isDragging,
5166          isDragNotClick = wasDragging && (Math.abs(self.x - self.startX) > 3 || Math.abs(self.y - self.startY) > 3),
5167          // some touch devices need some wiggle room in terms of sensing clicks - the finger may move a few pixels.
5168      eventData = _getEvent(e);
5169
5170      if (!isDragNotClick && isTrackingDrag) {
5171        self._vx.reset();
5172
5173        self._vy.reset(); //if (preventDefault && allowClicks && self.isPressed) { // check isPressed because in a rare edge case, the inputObserver in ScrollTrigger may stopPropagation() on the press/drag, so the onRelease may get fired without the onPress/onDrag ever getting called, thus it could trigger a click to occur on a link after scroll-dragging it.
5174
5175
5176        if (preventDefault && allowClicks) {
5177          gsap.delayedCall(0.08, function () {
5178            // some browsers (like Firefox) won't trust script-generated clicks, so if the user tries to click on a video to play it, for example, it simply won't work. Since a regular "click" event will most likely be generated anyway (one that has its isTrusted flag set to true), we must slightly delay our script-generated click so that the "real"/trusted one is prioritized. Remember, when there are duplicate events in quick succession, we suppress all but the first one. Some browsers don't even trigger the "real" one at all, so our synthetic one is a safety valve that ensures that no matter what, a click event does get dispatched.
5179            if (_getTime() - onClickTime > 300 && !e.defaultPrevented) {
5180              if (e.target.click) {
5181                //some browsers (like mobile Safari) don't properly trigger the click event
5182                e.target.click();
5183              } else if (ownerDoc.createEvent) {
5184                var syntheticEvent = ownerDoc.createEvent("MouseEvents");
5185                syntheticEvent.initMouseEvent("click", true, true, _win, 1, eventData.screenX, eventData.screenY, eventData.clientX, eventData.clientY, false, false, false, false, 0, null);
5186                e.target.dispatchEvent(syntheticEvent);
5187              }
5188            }
5189          });
5190        }
5191      }
5192
5193      self.isDragging = self.isGesturing = self.isPressed = false;
5194      onStop && wasDragging && !isNormalizer && onStopDelayedCall.restart(true);
5195      dragged && update(); // in case debouncing, we don't want onDrag to fire AFTER onDragEnd().
5196
5197      onDragEnd && wasDragging && onDragEnd(self);
5198      onRelease && onRelease(self, isDragNotClick);
5199    },
5200        _onGestureStart = function _onGestureStart(e) {
5201      return e.touches && e.touches.length > 1 && (self.isGesturing = true) && onGestureStart(e, self.isDragging);
5202    },
5203        _onGestureEnd = function _onGestureEnd() {
5204      return (self.isGesturing = false) || onGestureEnd(self);
5205    },
5206        onScroll = function onScroll(e) {
5207      if (_ignoreCheck(e)) {
5208        return;
5209      }
5210
5211      var x = scrollFuncX(),
5212          y = scrollFuncY();
5213      onDelta((x - scrollX) * scrollSpeed, (y - scrollY) * scrollSpeed, 1);
5214      scrollX = x;
5215      scrollY = y;
5216      onStop && onStopDelayedCall.restart(true);
5217    },
5218        _onWheel = function _onWheel(e) {
5219      if (_ignoreCheck(e)) {
5220        return;
5221      }
5222
5223      e = _getEvent(e, preventDefault);
5224      onWheel && (wheeled = true);
5225      var multiplier = (e.deltaMode === 1 ? lineHeight : e.deltaMode === 2 ? _win.innerHeight : 1) * wheelSpeed;
5226      onDelta(e.deltaX * multiplier, e.deltaY * multiplier, 0);
5227      onStop && !isNormalizer && onStopDelayedCall.restart(true);
5228    },
5229        _onMove = function _onMove(e) {
5230      if (_ignoreCheck(e)) {
5231        return;
5232      }
5233
5234      var x = e.clientX,
5235          y = e.clientY,
5236          dx = x - self.x,
5237          dy = y - self.y;
5238      self.x = x;
5239      self.y = y;
5240      moved = true;
5241      onStop && onStopDelayedCall.restart(true);
5242      (dx || dy) && onTouchOrPointerDelta(dx, dy);
5243    },
5244        _onHover = function _onHover(e) {
5245      self.event = e;
5246      onHover(self);
5247    },
5248        _onHoverEnd = function _onHoverEnd(e) {
5249      self.event = e;
5250      onHoverEnd(self);
5251    },
5252        _onClick = function _onClick(e) {
5253      return _ignoreCheck(e) || _getEvent(e, preventDefault) && onClick(self);
5254    };
5255
5256    onStopDelayedCall = self._dc = gsap.delayedCall(onStopDelay || 0.25, onStopFunc).pause();
5257    self.deltaX = self.deltaY = 0;
5258    self._vx = _getVelocityProp(0, 50, true);
5259    self._vy = _getVelocityProp(0, 50, true);
5260    self.scrollX = scrollFuncX;
5261    self.scrollY = scrollFuncY;
5262    self.isDragging = self.isGesturing = self.isPressed = false;
5263
5264    _context(this);
5265
5266    self.enable = function (e) {
5267      if (!self.isEnabled) {
5268        _addListener(isViewport ? ownerDoc : target, "scroll", _onScroll);
5269
5270        type.indexOf("scroll") >= 0 && _addListener(isViewport ? ownerDoc : target, "scroll", onScroll, passive, capture);
5271        type.indexOf("wheel") >= 0 && _addListener(target, "wheel", _onWheel, passive, capture);
5272
5273        if (type.indexOf("touch") >= 0 && _isTouch || type.indexOf("pointer") >= 0) {
5274          _addListener(target, _eventTypes[0], _onPress, passive, capture);
5275
5276          _addListener(ownerDoc, _eventTypes[2], _onRelease);
5277
5278          _addListener(ownerDoc, _eventTypes[3], _onRelease);
5279
5280          allowClicks && _addListener(target, "click", clickCapture, true, true);
5281          onClick && _addListener(target, "click", _onClick);
5282          onGestureStart && _addListener(ownerDoc, "gesturestart", _onGestureStart);
5283          onGestureEnd && _addListener(ownerDoc, "gestureend", _onGestureEnd);
5284          onHover && _addListener(target, _pointerType + "enter", _onHover);
5285          onHoverEnd && _addListener(target, _pointerType + "leave", _onHoverEnd);
5286          onMove && _addListener(target, _pointerType + "move", _onMove);
5287        }
5288
5289        self.isEnabled = true;
5290        self.isDragging = self.isGesturing = self.isPressed = moved = dragged = false;
5291
5292        self._vx.reset();
5293
5294        self._vy.reset();
5295
5296        scrollX = scrollFuncX();
5297        scrollY = scrollFuncY();
5298        e && e.type && _onPress(e);
5299        onEnable && onEnable(self);
5300      }
5301
5302      return self;
5303    };
5304
5305    self.disable = function () {
5306      if (self.isEnabled) {
5307        // only remove the _onScroll listener if there aren't any others that rely on the functionality.
5308        _observers.filter(function (o) {
5309          return o !== self && _isViewport(o.target);
5310        }).length || _removeListener(isViewport ? ownerDoc : target, "scroll", _onScroll);
5311
5312        if (self.isPressed) {
5313          self._vx.reset();
5314
5315          self._vy.reset();
5316
5317          _removeListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, true);
5318        }
5319
5320        _removeListener(isViewport ? ownerDoc : target, "scroll", onScroll, capture);
5321
5322        _removeListener(target, "wheel", _onWheel, capture);
5323
5324        _removeListener(target, _eventTypes[0], _onPress, capture);
5325
5326        _removeListener(ownerDoc, _eventTypes[2], _onRelease);
5327
5328        _removeListener(ownerDoc, _eventTypes[3], _onRelease);
5329
5330        _removeListener(target, "click", clickCapture, true);
5331
5332        _removeListener(target, "click", _onClick);
5333
5334        _removeListener(ownerDoc, "gesturestart", _onGestureStart);
5335
5336        _removeListener(ownerDoc, "gestureend", _onGestureEnd);
5337
5338        _removeListener(target, _pointerType + "enter", _onHover);
5339
5340        _removeListener(target, _pointerType + "leave", _onHoverEnd);
5341
5342        _removeListener(target, _pointerType + "move", _onMove);
5343
5344        self.isEnabled = self.isPressed = self.isDragging = false;
5345        onDisable && onDisable(self);
5346      }
5347    };
5348
5349    self.kill = self.revert = function () {
5350      self.disable();
5351
5352      var i = _observers.indexOf(self);
5353
5354      i >= 0 && _observers.splice(i, 1);
5355      _normalizer === self && (_normalizer = 0);
5356    };
5357
5358    _observers.push(self);
5359
5360    isNormalizer && _isViewport(target) && (_normalizer = self);
5361    self.enable(event);
5362  };
5363
5364  _createClass(Observer, [{
5365    key: "velocityX",
5366    get: function get() {
5367      return this._vx.getVelocity();
5368    }
5369  }, {
5370    key: "velocityY",
5371    get: function get() {
5372      return this._vy.getVelocity();
5373    }
5374  }]);
5375
5376  return Observer;
5377}();
5378Observer.version = "3.15.0";
5379
5380Observer.create = function (vars) {
5381  return new Observer(vars);
5382};
5383
5384Observer.register = _initCore;
5385
5386Observer.getAll = function () {
5387  return _observers.slice();
5388};
5389
5390Observer.getById = function (id) {
5391  return _observers.filter(function (o) {
5392    return o.vars.id === id;
5393  })[0];
5394};
5395
5396_getGSAP() && gsap.registerPlugin(Observer);
5397//# sourceURL=[module]
5398//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvT2JzZXJ2ZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBNEMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RDs7QUFFL1AsOERBQThELHNFQUFzRSw4REFBOEQ7O0FBRWxNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEOztBQUUvRDtBQUNBLDZGQUE2Rjs7QUFFN0Y7QUFDQTtBQUNBLDZDQUE2QztBQUM3QyxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0VBQXdFOztBQUV4RTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxvRkFBb0Y7O0FBRXBGO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9FQUFvRTs7QUFFcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0Rjs7QUFFNUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvRkFBb0Y7O0FBRXBGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGtDQUFrQzs7QUFFbEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQ7O0FBRW5EO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0I7OztBQUd4Qjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwQkFBMEIseURBQXlEOzs7QUFHbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtB
5398QUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS9nc2FwQDMuMTUuMC9ub2RlX21vZHVsZXMvZ3NhcC9PYnNlcnZlci5qcz9lNmIwIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci
53985rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLyohXG4gKiBPYnNlcnZlciAzLjE1LjBcbiAqIGh0dHBzOi8vZ3NhcC5jb21cbiAqXG4gKiBAbGljZW5zZSBDb3B5cmlnaHQgMjAwOC0yMDI2LCBHcmVlblNvY2suIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwczovL2dzYXAuY29tL3N0YW5kYXJkLWxpY2Vuc2VcbiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbVxuKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cbnZhciBnc2FwLFxuICAgIF9jb3JlSW5pdHRlZCxcbiAgICBfY2xhbXAsXG4gICAgX3dpbixcbiAgICBfZG9jLFxuICAgIF9kb2NFbCxcbiAgICBfYm9keSxcbiAgICBfaXNUb3VjaCxcbiAgICBfcG9pbnRlclR5cGUsXG4gICAgU2Nyb2xsVHJpZ2dlcixcbiAgICBfcm9vdCxcbiAgICBfbm9ybWFsaXplcixcbiAgICBfZXZlbnRUeXBlcyxcbiAgICBfY29udGV4dCxcbiAgICBfZ2V0R1NBUCA9IGZ1bmN0aW9uIF9nZXRHU0FQKCkge1xuICByZXR1cm4gZ3NhcCB8fCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIChnc2FwID0gd2luZG93LmdzYXApICYmIGdzYXAucmVnaXN0ZXJQbHVnaW4gJiYgZ3NhcDtcbn0sXG4gICAgX3N0YXJ0dXAgPSAxLFxuICAgIF9vYnNlcnZlcnMgPSBbXSxcbiAgICBfc2Nyb2xsZXJzID0gW10sXG4gICAgX3Byb3hpZXMgPSBbXSxcbiAgICBfZ2V0VGltZSA9IERhdGUubm93LFxuICAgIF9icmlkZ2UgPSBmdW5jdGlvbiBfYnJpZGdlKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn0sXG4gICAgX2ludGVncmF0ZSA9IGZ1bmN0aW9uIF9pbnRlZ3JhdGUoKSB7XG4gIHZhciBjb3JlID0gU2Nyb2xsVHJpZ2dlci5jb3JlLFxuICAgICAgZGF0YSA9IGNvcmUuYnJpZGdlIHx8IHt9LFxuICAgICAgc2Nyb2xsZXJzID0gY29yZS5fc2Nyb2xsZXJzLFxuICAgICAgcHJveGllcyA9IGNvcmUuX3Byb3hpZXM7XG4gIHNjcm9sbGVycy5wdXNoLmFwcGx5KHNjcm9sbGVycywgX3Njcm9sbGVycyk7XG4gIHByb3hpZXMucHVzaC5hcHBseShwcm94aWVzLCBfcHJveGllcyk7XG4gIF9zY3JvbGxlcnMgPSBzY3JvbGxlcnM7XG4gIF9wcm94aWVzID0gcHJveGllcztcblxuICBfYnJpZGdlID0gZnVuY3Rpb24gX2JyaWRnZShuYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiBkYXRhW25hbWVdKHZhbHVlKTtcbiAgfTtcbn0sXG4gICAgX2dldFByb3h5UHJvcCA9IGZ1bmN0aW9uIF9nZXRQcm94eVByb3AoZWxlbWVudCwgcHJvcGVydHkpIHtcbiAgcmV0dXJuIH5fcHJveGllcy5pbmRleE9mKGVsZW1lbnQpICYmIF9wcm94aWVzW19wcm94aWVzLmluZGV4T2YoZWxlbWVudCkgKyAxXVtwcm9wZXJ0eV07XG59LFxuICAgIF9pc1ZpZXdwb3J0ID0gZnVuY3Rpb24gX2lzVmlld3BvcnQoZWwpIHtcbiAgcmV0dXJuICEhfl9yb290LmluZGV4T2YoZWwpO1xufSxcbiAgICBfYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBfYWRkTGlzdGVuZXIoZWxlbWVudCwgdHlwZSwgZnVuYywgcGFzc2l2ZSwgY2FwdHVyZSkge1xuICByZXR1cm4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmMsIHtcbiAgICBwYXNzaXZlOiBwYXNzaXZlICE9PSBmYWxzZSxcbiAgICBjYXB0dXJlOiAhIWNhcHR1cmVcbiAgfSk7XG59LFxuICAgIF9yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIF9yZW1vdmVMaXN0ZW5lcihlbGVtZW50LCB0eXBlLCBmdW5jLCBjYXB0dXJlKSB7XG4gIHJldHVybiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZnVuYywgISFjYXB0dXJlKTtcbn0sXG4gICAgX3Njcm9sbExlZnQgPSBcInNjcm9sbExlZnRcIixcbiAgICBfc2Nyb2xsVG9wID0gXCJzY3JvbGxUb3BcIixcbiAgICBfb25TY3JvbGwgPSBmdW5jdGlvbiBfb25TY3JvbGwoKSB7XG4gIHJldHVybiBfbm9ybWFsaXplciAmJiBfbm9ybWFsaXplci5pc1ByZXNzZWQgfHwgX3Njcm9sbGVycy5jYWNoZSsrO1xufSxcbiAgICBfc2Nyb2xsQ2FjaGVGdW5jID0gZnVuY3Rpb24gX3Njcm9sbENhY2hlRnVuYyhmLCBkb05vdENhY2hlKSB7XG4gIHZhciBjYWNoaW5nRnVuYyA9IGZ1bmN0aW9uIGNhY2hpbmdGdW5jKHZhbHVlKSB7XG4gICAgLy8gc2luY2UgcmVhZGluZyB0aGUgc2Nyb2xsVG9wL3Njcm9sbExlZnQvcGFnZU9mZnNldFkvcGFnZU9mZnNldFggY2FuIHRyaWdnZXIgYSBsYXlvdXQsIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIGNhY2hlIHRoZSB2YWx1ZSBzbyBpdCBvbmx5IGdldHMgcmVhZCBmcmVzaCBhZnRlciBhIFwic2Nyb2xsXCIgZXZlbnQgZmlyZXMgKG9yIHdoaWxlIHdlJ3JlIHJlZnJlc2hpbmcgYmVjYXVzZSB0aGF0IGNhbiBsZW5ndGhlbiB0aGUgcGFnZSBhbmQgYWx0ZXIgdGhlIHNjcm9sbCBwb3NpdGlvbikuIHdoZW4gXCJzb2Z0XCIgaXMgdHJ1ZSwgdGhhdCBtZWFucyBkb24ndCBhY3R1YWxseSBzZXQgdGhlIHNjcm9sbCwgYnV0IGNhY2hlIHRoZSBuZXcgdmFsdWUgaW5zdGVhZCAodXNlZnVsIGluIFNjcm9sbFNtb290aGVyKVxuICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xuICAgICAgX3N0YXJ0dXAgJiYgKF93aW4uaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCIpOyAvLyBvdGhlcndpc2UgdGhlIG5ldyBwb3NpdGlvbiB3aWxsIGdldCBvdmVyd3JpdHRlbiBieSB0aGUgYnJvd3NlciBvbmxvYWQuXG5cbiAgICAgIHZhciBpc05vcm1hbGl6aW5nID0gX25vcm1hbGl6ZXIgJiYgX25vcm1hbGl6ZXIuaXNQcmVzc2VkO1xuICAgICAgdmFsdWUgPSBjYWNoaW5nRnVuYy52ID0gTWF0aC5yb3VuZCh2YWx1ZSkgfHwgKF9ub3JtYWxpemVyICYmIF9ub3JtYWxpemVyLmlPUyA/IDEgOiAwKTsgLy9UT0RPOiBpT1MgQnVnOiBpZiB5b3UgYWxsb3cgaXQgdG8gZ28gdG8gMCwgU2FmYXJpIGNhbiBzdGFydCB0byByZXBvcnQgc3VwZXIgc3RyYW5nZSAod2lsZGx5IGluYWNjdXJhdGUpIHRvdWNoIHBvc2l0aW9ucyFcblxuICAgICAgZih2YWx1ZSk7XG4gICAgICBjYWNoaW5nRnVuYy5jYWNoZUlEID0gX3Njcm9sbGVycy5jYWNoZTtcbiAgICAgIGlzTm9ybWFsaXppbmcgJiYgX2JyaWRnZShcInNzXCIsIHZhbHVlKTsgLy8gc2V0IHNjcm9sbCAobm90aWZ5IFNjcm9sbFRyaWdnZXIgc28gaXQgY2FuIGRpc3BhdGNoIGEgXCJzY3JvbGxTdGFydFwiIGV2ZW50IGlmIG5lY2Vzc2FyeVxuICAgIH0gZWxzZSBpZiAoZG9Ob3RDYWNoZSB8fCBfc2Nyb2xsZXJzLmNhY2hlICE9PSBjYWNoaW5nRnVuYy5jYWNoZUlEIHx8IF9icmlkZ2UoXCJyZWZcIikpIHtcbiAgICAgIGNhY2hpbmdGdW5jLmNhY2hlSUQgPSBfc2Nyb2xsZXJzLmNhY2hlO1xuICAgICAgY2FjaGluZ0Z1bmMudiA9IGYoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGluZ0Z1bmMudiArIGNhY2hpbmdGdW5jLm9mZnNldDtcbiAgfTtcblxuICBjYWNoaW5nRnVuYy5vZmZzZXQgPSAwO1xuICByZXR1cm4gZiAmJiBjYWNoaW5nRnVuYztcbn0sXG4gICAgX2hvcml6b250YWwgPSB7XG4gIHM6IF9zY3JvbGxMZWZ0LFxuICBwOiBcImxlZnRcIixcbiAgcDI6IFwiTGVmdFwiLFxuICBvczogXCJyaWdodFwiLFxuICBvczI6IFwiUmlnaHRcIixcbiAgZDogXCJ3aWR0aFwiLFxuICBkMjogXCJXaWR0aFwiLFxuICBhOiBcInhcIixcbiAgc2M6IF9zY3JvbGxDYWNoZUZ1bmMoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBfd2luLnNjcm9sbFRvKHZhbHVlLCBfdmVydGljYWwuc2MoKSkgOiBfd2luLnBhZ2VYT2Zmc2V0IHx8IF9kb2NbX3Njcm9sbExlZnRdIHx8IF9kb2NFbFtfc2Nyb2xsTGVmdF0gfHwgX2JvZHlbX3Njcm9sbExlZnRdIHx8IDA7XG4gIH0pXG59LFxuICAgIF92ZXJ0aWNhbCA9IHtcbiAgczogX3Njcm9sbFRvcCxcbiAgcDogXCJ0b3BcIixcbiAgcDI6IFwiVG9wXCIsXG4gIG9zOiBcImJvdHRvbVwiLFxuICBvczI6IFwiQm90dG9tXCIsXG4gIGQ6IFwiaGVpZ2h0XCIsXG4gIGQyOiBcIkhlaWdodFwiLFxuICBhOiBcInlcIixcbiAgb3A6IF9ob3Jpem9udGFsLFxuICBzYzogX3Njcm9sbENhY2hlRnVuYyhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IF93aW4uc2Nyb2xsVG8oX2hvcml6b250YWwuc2MoKSwgdmFsdWUpIDogX3dpbi5wYWdlWU9mZnNldCB8fCBfZG9jW19zY3JvbGxUb3BdIHx8IF9kb2NFbFtfc2Nyb2xsVG9wXSB8fCBfYm9keVtfc2Nyb2xsVG9wXSB8fCAwO1xuICB9KVxufSxcbiAgICBfZ2V0VGFyZ2V0ID0gZnVuY3Rpb24gX2dldFRhcmdldCh0LCBzZWxmKSB7XG4gIHJldHVybiAoc2VsZiAmJiBzZWxmLl9jdHggJiYgc2VsZi5fY3R4LnNlbGVjdG9yIHx8IGdzYXAudXRpbHMudG9BcnJheSkodClbMF0gfHwgKHR5cGVvZiB0ID09PSBcInN0cmluZ1wiICYmIGdzYXAuY29uZmlnKCkub
5398nVsbFRhcmdldFdhcm4gIT09IGZhbHNlID8gY29uc29sZS53YXJuKFwiRWxlbWVudCBub3QgZm91bmQ6XCIsIHQpIDogbnVsbCk7XG59LFxuICAgIF9pc1dpdGhpbiA9IGZ1bmN0aW9uIF9pc1dpdGhpbihlbGVtZW50LCBsaXN0KSB7XG4gIC8vIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBsaXN0IG9yIGlzIGEgZGVzY2VuZGFudCBvZiBhbiBlbGVtZW50IGluIHRoZSBsaXN0LlxuICB2YXIgaSA9IGxpc3QubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBpZiAobGlzdFtpXSA9PT0gZWxlbWVudCB8fCBsaXN0W2ldLmNvbnRhaW5zKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59LFxuICAgIF9nZXRTY3JvbGxGdW5jID0gZnVuY3Rpb24gX2dldFNjcm9sbEZ1bmMoZWxlbWVudCwgX3JlZikge1xuICB2YXIgcyA9IF9yZWYucyxcbiAgICAgIHNjID0gX3JlZi5zYztcbiAgLy8gd2Ugc3RvcmUgdGhlIHNjcm9sbGVyIGZ1bmN0aW9ucyBpbiBhbiBhbHRlcm5hdGluZyBzZXF1ZW5jZWQgQXJyYXkgbGlrZSBbZWxlbWVudCwgdmVydGljYWxTY3JvbGxGdW5jLCBob3Jpem9udGFsU2Nyb2xsRnVuYywgLi4uXSBzbyB0aGF0IHdlIGNhbiBtaW5pbWl6ZSBtZW1vcnksIG1heGltaXplIHBlcmZvcm1hbmNlLCBhbmQgd2UgYWxzbyByZWNvcmQgdGhlIGxhc3QgcG9zaXRpb24gYXMgYSBcIi5yZWNcIiBwcm9wZXJ0eSBpbiBvcmRlciB0byByZXZlcnQgdG8gdGhhdCBhZnRlciByZWZyZXNoaW5nIHRvIGVuc3VyZSB0aGluZ3MgZG9uJ3Qgc2hpZnQgYXJvdW5kLlxuICBfaXNWaWV3cG9ydChlbGVtZW50KSAmJiAoZWxlbWVudCA9IF9kb2Muc2Nyb2xsaW5nRWxlbWVudCB8fCBfZG9jRWwpO1xuXG4gIHZhciBpID0gX3Njcm9sbGVycy5pbmRleE9mKGVsZW1lbnQpLFxuICAgICAgb2Zmc2V0ID0gc2MgPT09IF92ZXJ0aWNhbC5zYyA/IDEgOiAyO1xuXG4gICF+aSAmJiAoaSA9IF9zY3JvbGxlcnMucHVzaChlbGVtZW50KSAtIDEpO1xuICBfc2Nyb2xsZXJzW2kgKyBvZmZzZXRdIHx8IF9hZGRMaXN0ZW5lcihlbGVtZW50LCBcInNjcm9sbFwiLCBfb25TY3JvbGwpOyAvLyBjbGVhciB0aGUgY2FjaGUgd2hlbiBhIHNjcm9sbCBvY2N1cnNcblxuICB2YXIgcHJldiA9IF9zY3JvbGxlcnNbaSArIG9mZnNldF0sXG4gICAgICBmdW5jID0gcHJldiB8fCAoX3Njcm9sbGVyc1tpICsgb2Zmc2V0XSA9IF9zY3JvbGxDYWNoZUZ1bmMoX2dldFByb3h5UHJvcChlbGVtZW50LCBzKSwgdHJ1ZSkgfHwgKF9pc1ZpZXdwb3J0KGVsZW1lbnQpID8gc2MgOiBfc2Nyb2xsQ2FjaGVGdW5jKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZWxlbWVudFtzXSA9IHZhbHVlIDogZWxlbWVudFtzXTtcbiAgfSkpKTtcbiAgZnVuYy50YXJnZXQgPSBlbGVtZW50O1xuICBwcmV2IHx8IChmdW5jLnNtb290aCA9IGdzYXAuZ2V0UHJvcGVydHkoZWxlbWVudCwgXCJzY3JvbGxCZWhhdmlvclwiKSA9PT0gXCJzbW9vdGhcIik7IC8vIG9ubHkgc2V0IGl0IHRoZSBmaXJzdCB0aW1lIChkb24ndCByZXNldCBldmVyeSB0aW1lIGEgc2Nyb2xsRnVuYyBpcyByZXF1ZXN0ZWQgYmVjYXVzZSBwZXJoYXBzIGl0IGhhcHBlbnMgZHVyaW5nIGEgcmVmcmVzaCgpIHdoZW4gaXQncyBkaXNhYmxlZCBpbiBTY3JvbGxUcmlnZ2VyLlxuXG4gIHJldHVybiBmdW5jO1xufSxcbiAgICBfZ2V0VmVsb2NpdHlQcm9wID0gZnVuY3Rpb24gX2dldFZlbG9jaXR5UHJvcCh2YWx1ZSwgbWluVGltZVJlZnJlc2gsIHVzZURlbHRhKSB7XG4gIHZhciB2MSA9IHZhbHVlLFxuICAgICAgdjIgPSB2YWx1ZSxcbiAgICAgIHQxID0gX2dldFRpbWUoKSxcbiAgICAgIHQyID0gdDEsXG4gICAgICBtaW4gPSBtaW5UaW1lUmVmcmVzaCB8fCA1MCxcbiAgICAgIGRyb3BUb1plcm9UaW1lID0gTWF0aC5tYXgoNTAwLCBtaW4gKiAzKSxcbiAgICAgIHVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSh2YWx1ZSwgZm9yY2UpIHtcbiAgICB2YXIgdCA9IF9nZXRUaW1lKCk7XG5cbiAgICBpZiAoZm9yY2UgfHwgdCAtIHQxID4gbWluKSB7XG4gICAgICB2MiA9IHYxO1xuICAgICAgdjEgPSB2YWx1ZTtcbiAgICAgIHQyID0gdDE7XG4gICAgICB0MSA9IHQ7XG4gICAgfSBlbHNlIGlmICh1c2VEZWx0YSkge1xuICAgICAgdjEgKz0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdCB0b3RhbGx5IG5lY2Vzc2FyeSwgYnV0IG1ha2VzIGl0IGEgYml0IG1vcmUgYWNjdXJhdGUgYnkgYWRqdXN0aW5nIHRoZSB2MSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIG5ldyBzbG9wZS4gVGhpcyB3YXkgd2UncmUgbm90IGp1c3QgaWdub3JpbmcgdGhlIGluY29taW5nIGRhdGEuIFJlbW92aW5nIGZvciBub3cgYmVjYXVzZSBpdCBkb2Vzbid0IHNlZW0gdG8gbWFrZSBtdWNoIHByYWN0aWNhbCBkaWZmZXJlbmNlIGFuZCBpdCdzIHByb2JhYmx5IG5vdCB3b3J0aCB0aGUga2IuXG4gICAgICB2MSA9IHYyICsgKHZhbHVlIC0gdjIpIC8gKHQgLSB0MikgKiAodDEgLSB0Mik7XG4gICAgfVxuICB9LFxuICAgICAgcmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICB2MiA9IHYxID0gdXNlRGVsdGEgPyAwIDogdjE7XG4gICAgdDIgPSB0MSA9IDA7XG4gIH0sXG4gICAgICBnZXRWZWxvY2l0eSA9IGZ1bmN0aW9uIGdldFZlbG9jaXR5KGxhdGVzdFZhbHVlKSB7XG4gICAgdmFyIHRPbGQgPSB0MixcbiAgICAgICAgdk9sZCA9IHYyLFxuICAgICAgICB0ID0gX2dldFRpbWUoKTtcblxuICAgIChsYXRlc3RWYWx1ZSB8fCBsYXRlc3RWYWx1ZSA9PT0gMCkgJiYgbGF0ZXN0VmFsdWUgIT09IHYxICYmIHVwZGF0ZShsYXRlc3RWYWx1ZSk7XG4gICAgcmV0dXJuIHQxID09PSB0MiB8fCB0IC0gdDIgPiBkcm9wVG9aZXJvVGltZSA/IDAgOiAodjEgKyAodXNlRGVsdGEgPyB2T2xkIDogLXZPbGQpKSAvICgodXNlRGVsdGEgPyB0IDogdDEpIC0gdE9sZCkgKiAxMDAwO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiB1cGRhdGUsXG4gICAgcmVzZXQ6IHJlc2V0LFxuICAgIGdldFZlbG9jaXR5OiBnZXRWZWxvY2l0eVxuICB9O1xufSxcbiAgICBfZ2V0RXZlbnQgPSBmdW5jdGlvbiBfZ2V0RXZlbnQoZSwgcHJldmVudERlZmF1bHQpIHtcbiAgcHJldmVudERlZmF1bHQgJiYgIWUuX2dzYXBBbGxvdyAmJiBlLmNhbmNlbGFibG
5398UgIT09IGZhbHNlICYmIGUucHJldmVudERlZmF1bHQoKTtcbiAgcmV0dXJuIGUuY2hhbmdlZFRvdWNoZXMgPyBlLmNoYW5nZWRUb3VjaGVzWzBdIDogZTtcbn0sXG4gICAgX2dldEFic29sdXRlTWF4ID0gZnVuY3Rpb24gX2dldEFic29sdXRlTWF4KGEpIHtcbiAgdmFyIG1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGEpLFxuICAgICAgbWluID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgYSk7XG4gIHJldHVybiBNYXRoLmFicyhtYXgpID49IE1hdGguYWJzKG1pbikgPyBtYXggOiBtaW47XG59LFxuICAgIF9zZXRTY3JvbGxUcmlnZ2VyID0gZnVuY3Rpb24gX3NldFNjcm9sbFRyaWdnZXIoKSB7XG4gIFNjcm9sbFRyaWdnZXIgPSBnc2FwLmNvcmUuZ2xvYmFscygpLlNjcm9sbFRyaWdnZXI7XG4gIFNjcm9sbFRyaWdnZXIgJiYgU2Nyb2xsVHJpZ2dlci5jb3JlICYmIF9pbnRlZ3JhdGUoKTtcbn0sXG4gICAgX2luaXRDb3JlID0gZnVuY3Rpb24gX2luaXRDb3JlKGNvcmUpIHtcbiAgZ3NhcCA9IGNvcmUgfHwgX2dldEdTQVAoKTtcblxuICBpZiAoIV9jb3JlSW5pdHRlZCAmJiBnc2FwICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgX3dpbiA9IHdpbmRvdztcbiAgICBfZG9jID0gZG9jdW1lbnQ7XG4gICAgX2RvY0VsID0gX2RvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgX2JvZHkgPSBfZG9jLmJvZHk7XG4gICAgX3Jvb3QgPSBbX3dpbiwgX2RvYywgX2RvY0VsLCBfYm9keV07XG4gICAgX2NsYW1wID0gZ3NhcC51dGlscy5jbGFtcDtcblxuICAgIF9jb250ZXh0ID0gZ3NhcC5jb3JlLmNvbnRleHQgfHwgZnVuY3Rpb24gKCkge307XG5cbiAgICBfcG9pbnRlclR5cGUgPSBcIm9ucG9pbnRlcmVudGVyXCIgaW4gX2JvZHkgPyBcInBvaW50ZXJcIiA6IFwibW91c2VcIjsgLy8gaXNUb3VjaCBpcyAwIGlmIG5vIHRvdWNoLCAxIGlmIE9OTFkgdG91Y2gsIGFuZCAyIGlmIGl0IGNhbiBhY2NvbW1vZGF0ZSB0b3VjaCBidXQgYWxzbyBvdGhlciB0eXBlcyBsaWtlIG1vdXNlL3BvaW50ZXIuXG5cbiAgICBfaXNUb3VjaCA9IE9ic2VydmVyLmlzVG91Y2ggPSBfd2luLm1hdGNoTWVkaWEgJiYgX3dpbi5tYXRjaE1lZGlhKFwiKGhvdmVyOiBub25lKSwgKHBvaW50ZXI6IGNvYXJzZSlcIikubWF0Y2hlcyA/IDEgOiBcIm9udG91Y2hzdGFydFwiIGluIF93aW4gfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMCB8fCBuYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cyA+IDAgPyAyIDogMDtcbiAgICBfZXZlbnRUeXBlcyA9IE9ic2VydmVyLmV2ZW50VHlwZXMgPSAoXCJvbnRvdWNoc3RhcnRcIiBpbiBfZG9jRWwgPyBcInRvdWNoc3RhcnQsdG91Y2htb3ZlLHRvdWNoY2FuY2VsLHRvdWNoZW5kXCIgOiAhKFwib25wb2ludGVyZG93blwiIGluIF9kb2NFbCkgPyBcIm1vdXNlZG93bixtb3VzZW1vdmUsbW91c2V1cCxtb3VzZXVwXCIgOiBcInBvaW50ZXJkb3duLHBvaW50ZXJtb3ZlLHBvaW50ZXJjYW5jZWwscG9pbnRlcnVwXCIpLnNwbGl0KFwiLFwiKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfc3RhcnR1cCA9IDA7XG4gICAgfSwgNTAwKTtcbiAgICBfY29yZUluaXR0ZWQgPSAxO1xuICB9XG5cbiAgU2Nyb2xsVHJpZ2dlciB8fCBfc2V0U2Nyb2xsVHJpZ2dlcigpOyAvLyBPYnNlcnZlciBtaWdodCBiZSBpbml0dGVkIEJFRk9SRSBTY3JvbGxUcmlnZ2VyLCBzbyBkb24ndCBwdXQgdGhpcyB3aXRoIHRoZSBpbml0dGluZyBjb2RlLiBTY3JvbGxUcmlnZ2VyIHdpbGwgY2FsbCBPYnNlcnZlci5yZWdpc3RlcigpIHdoZW4gaXQgaW5pdHMuXG5cbiAgcmV0dXJuIF9jb3JlSW5pdHRlZDtcbn07XG5cbl9ob3Jpem9udGFsLm9wID0gX3ZlcnRpY2FsO1xuX3Njcm9sbGVycy5jYWNoZSA9IDA7XG5leHBvcnQgdmFyIE9ic2VydmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gT2JzZXJ2ZXIodmFycykge1xuICAgIHRoaXMuaW5pdCh2YXJzKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBPYnNlcnZlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmluaXQgPSBmdW5jdGlvbiBpbml0KHZhcnMpIHtcbiAgICBfY29yZUluaXR0ZWQgfHwgX2luaXRDb3JlKGdzYXApIHx8IGNvbnNvbGUud2FybihcIlBsZWFzZSBnc2FwLnJlZ2lzdGVyUGx1Z2luKE9ic2VydmVyKVwiKTtcbiAgICBTY3JvbGxUcmlnZ2VyIHx8IF9zZXRTY3JvbGxUcmlnZ2VyKCk7XG4gICAgdmFyIHRvbGVyYW5jZSA9IHZhcnMudG9sZXJhbmNlLFxuICAgICAgICBkcmFnTWluaW11bSA9IHZhcnMuZHJhZ01pbmltdW0sXG4gICAgICAgIHR5cGUgPSB2YXJzLnR5cGUsXG4gICAgICAgIHRhcmdldCA9IHZhcnMudGFyZ2V0LFxuICAgICAgICBsaW5lSGVpZ2h0ID0gdmFycy5saW5lSGVpZ2h0LFxuICAgICAgICBkZWJvdW5jZSA9IHZhcnMuZGVib3VuY2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0ID0gdmFycy5wcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgb25TdG9wID0gdmFycy5vblN0b3AsXG4gICAgICAgIG9uU3RvcERlbGF5ID0gdmFycy5vblN0b3BEZWxheSxcbiAgICAgICAgaWdub3JlID0gdmFycy5pZ25vcmUsXG4gICAgICAgIHdoZWVsU3BlZWQgPSB2YXJzLndoZWVsU3BlZWQsXG4gICAgICAgIGV2ZW50ID0gdmFycy5ldmVudCxcbiAgICAgICAgb25EcmFnU3RhcnQgPSB2YXJzLm9uRHJhZ1N0YXJ0LFxuICAgICAgICBvbkRyYWdFbmQgPSB2YXJzLm9uRHJhZ0VuZCxcbiAgICAgICAgb25EcmFnID0gdmFycy5vbkRyYWcsXG4gICAgICAgIG9uUHJlc3MgPSB2YXJzLm9uUHJlc3MsXG4gICAgICAgIG9uUmVsZWFzZSA9IHZhcnMub25SZWxlYXNlLFxuICAgICAgICBvblJpZ2h0ID0gdmFycy5vblJpZ2h0LFxuICAgICAgICBvbkxlZnQgPSB2YXJzLm9uTGVmdCxcbiAgICAgICAgb25VcCA9IHZhcnMub25VcCxcbiAgICAgICAgb25Eb3duID0gdmFycy5vbkRvd24sXG4gICAgICAgIG9uQ2hhbmdlWCA9IHZhcnMub25DaGFuZ2VYLFxuICAgICAgICBvbkNoYW5nZVkgPSB2YXJzLm9uQ2hhbmdlWSxcbiAgICAgICAgb25DaGFuZ2UgPSB2YXJzLm9uQ2hhbmdlLFxuICAgICAgICBvblRvZ2dsZVggPSB2YXJzLm9uVG9nZ2xlWCxcbiAgICAgICAgb25Ub2dnbGVZID0gdmFycy5vblRvZ2dsZVksXG4gICAgICAgIG9uSG92ZXIgPSB2YXJzLm9uSG92ZXIsXG4gICAgICAgIG9uSG92ZXJFbmQgPSB2YXJzLm9uSG92ZXJFbmQsXG4gICAgICAgIG9uTW92ZSA9IHZhcnMub25Nb3ZlLFxuICAgICAgICBpZ25vcmVDaGVjayA9IHZhcnMuaWdub3JlQ2hlY2ssXG4gICAgICAgIGlzTm9ybWFsaXplciA9IHZhcnMuaXNOb3JtYWxpem
5398VyLFxuICAgICAgICBvbkdlc3R1cmVTdGFydCA9IHZhcnMub25HZXN0dXJlU3RhcnQsXG4gICAgICAgIG9uR2VzdHVyZUVuZCA9IHZhcnMub25HZXN0dXJlRW5kLFxuICAgICAgICBvbldoZWVsID0gdmFycy5vbldoZWVsLFxuICAgICAgICBvbkVuYWJsZSA9IHZhcnMub25FbmFibGUsXG4gICAgICAgIG9uRGlzYWJsZSA9IHZhcnMub25EaXNhYmxlLFxuICAgICAgICBvbkNsaWNrID0gdmFycy5vbkNsaWNrLFxuICAgICAgICBzY3JvbGxTcGVlZCA9IHZhcnMuc2Nyb2xsU3BlZWQsXG4gICAgICAgIGNhcHR1cmUgPSB2YXJzLmNhcHR1cmUsXG4gICAgICAgIGFsbG93Q2xpY2tzID0gdmFycy5hbGxvd0NsaWNrcyxcbiAgICAgICAgbG9ja0F4aXMgPSB2YXJzLmxvY2tBeGlzLFxuICAgICAgICBvbkxvY2tBeGlzID0gdmFycy5vbkxvY2tBeGlzO1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0ID0gX2dldFRhcmdldCh0YXJnZXQpIHx8IF9kb2NFbDtcbiAgICB0aGlzLnZhcnMgPSB2YXJzO1xuICAgIGlnbm9yZSAmJiAoaWdub3JlID0gZ3NhcC51dGlscy50b0FycmF5KGlnbm9yZSkpO1xuICAgIHRvbGVyYW5jZSA9IHRvbGVyYW5jZSB8fCAxZS05O1xuICAgIGRyYWdNaW5pbXVtID0gZHJhZ01pbmltdW0gfHwgMDtcbiAgICB3aGVlbFNwZWVkID0gd2hlZWxTcGVlZCB8fCAxO1xuICAgIHNjcm9sbFNwZWVkID0gc2Nyb2xsU3BlZWQgfHwgMTtcbiAgICB0eXBlID0gdHlwZSB8fCBcIndoZWVsLHRvdWNoLHBvaW50ZXJcIjtcbiAgICBkZWJvdW5jZSA9IGRlYm91bmNlICE9PSBmYWxzZTtcbiAgICBsaW5lSGVpZ2h0IHx8IChsaW5lSGVpZ2h0ID0gcGFyc2VGbG9hdChfd2luLmdldENvbXB1dGVkU3R5bGUoX2JvZHkpLmxpbmVIZWlnaHQpIHx8IDIyKTsgLy8gbm90ZTogYnJvd3NlciBtYXkgcmVwb3J0IFwibm9ybWFsXCIsIHNvIGRlZmF1bHQgdG8gMjIuXG5cbiAgICB2YXIgaWQsXG4gICAgICAgIG9uU3RvcERlbGF5ZWRDYWxsLFxuICAgICAgICBkcmFnZ2VkLFxuICAgICAgICBtb3ZlZCxcbiAgICAgICAgd2hlZWxlZCxcbiAgICAgICAgbG9ja2VkLFxuICAgICAgICBheGlzLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgcHJldkRlbHRhWCA9IDAsXG4gICAgICAgIHByZXZEZWx0YVkgPSAwLFxuICAgICAgICBwYXNzaXZlID0gdmFycy5wYXNzaXZlIHx8ICFwcmV2ZW50RGVmYXVsdCAmJiB2YXJzLnBhc3NpdmUgIT09IGZhbHNlLFxuICAgICAgICBzY3JvbGxGdW5jWCA9IF9nZXRTY3JvbGxGdW5jKHRhcmdldCwgX2hvcml6b250YWwpLFxuICAgICAgICBzY3JvbGxGdW5jWSA9IF9nZXRTY3JvbGxGdW5jKHRhcmdldCwgX3ZlcnRpY2FsKSxcbiAgICAgICAgc2Nyb2xsWCA9IHNjcm9sbEZ1bmNYKCksXG4gICAgICAgIHNjcm9sbFkgPSBzY3JvbGxGdW5jWSgpLFxuICAgICAgICBsaW1pdFRvVG91Y2ggPSB+dHlwZS5pbmRleE9mKFwidG91Y2hcIikgJiYgIX50eXBlLmluZGV4T2YoXCJwb2ludGVyXCIpICYmIF9ldmVudFR5cGVzWzBdID09PSBcInBvaW50ZXJkb3duXCIsXG4gICAgICAgIC8vIGZvciBkZXZpY2VzIHRoYXQgYWNjb21tb2RhdGUgbW91c2UgZXZlbnRzIGFuZCB0b3VjaCBldmVudHMsIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2guXG4gICAgaXNWaWV3cG9ydCA9IF9pc1ZpZXdwb3J0KHRhcmdldCksXG4gICAgICAgIG93bmVyRG9jID0gdGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgX2RvYyxcbiAgICAgICAgZGVsdGFYID0gWzAsIDAsIDBdLFxuICAgICAgICAvLyB3aGVlbCwgc2Nyb2xsLCBwb2ludGVyL3RvdWNoXG4gICAgZGVsdGFZID0gWzAsIDAsIDBdLFxuICAgICAgICBvbkNsaWNrVGltZSA9IDAsXG4gICAgICAgIGNsaWNrQ2FwdHVyZSA9IGZ1bmN0aW9uIGNsaWNrQ2FwdHVyZSgpIHtcbiAgICAgIHJldHVybiBvbkNsaWNrVGltZSA9IF9nZXRUaW1lKCk7XG4gICAgfSxcbiAgICAgICAgX2lnbm9yZUNoZWNrID0gZnVuY3Rpb24gX2lnbm9yZUNoZWNrKGUsIGlzUG9pbnRlck9yVG91Y2gpIHtcbiAgICAgIHJldHVybiAoc2VsZi5ldmVudCA9IGUpICYmIGlnbm9yZSAmJiBfaXNXaXRoaW4oZS50YXJnZXQsIGlnbm9yZSkgfHwgaXNQb2ludGVyT3JUb3VjaCAmJiBsaW1pdFRvVG91Y2ggJiYgZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiIHx8IGlnbm9yZUNoZWNrICYmIGlnbm9yZUNoZWNrKGUsIGlzUG9pbnRlck9yVG91Y2gpO1xuICAgIH0sXG4gICAgICAgIG9uU3RvcEZ1bmMgPSBmdW5jdGlvbiBvblN0b3BGdW5jKCkge1xuICAgICAgc2VsZi5fdngucmVzZXQoKTtcblxuICAgICAgc2VsZi5fdnkucmVzZXQoKTtcblxuICAgICAgb25TdG9wRGVsYXllZENhbGwucGF1c2UoKTtcbiAgICAgIG9uU3RvcCAmJiBvblN0b3Aoc2VsZik7XG4gICAgfSxcbiAgICAgICAgdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgdmFyIGR4ID0gc2VsZi5kZWx0YVggPSBfZ2V0QWJzb2x1dGVNYXgoZGVsdGFYKSxcbiAgICAgICAgICBkeSA9IHNlbGYuZGVsdGFZID0gX2dldEFic29sdXRlTWF4KGRlbHRhWSksXG4gICAgICAgICAgY2hhbmdlZFggPSBNYXRoLmFicyhkeCkgPj0gdG9sZXJhbmNlLFxuICAgICAgICAgIGNoYW5nZWRZID0gTWF0aC5hYnMoZHkpID49IHRvbGVyYW5jZTtcblxuICAgICAgb25DaGFuZ2UgJiYgKGNoYW5nZWRYIHx8IGNoYW5nZWRZKSAmJiBvbkNoYW5nZShzZWxmLCBkeCwgZHksIGRlbHRhWCwgZGVsdGFZKTsgLy8gaW4gU2Nyb2xsVHJpZ2dlci5ub3JtYWxpemVTY3JvbGwoKSwgd2UgbmVlZCB0byBrbm93IGlmIGl0IHdhcyB0b3VjaC9wb2ludGVyIHNvIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBkZWx0YVgvZGVsdGFZIEFycmF5cyBiZWZvcmUgd2UgY2xlYXIgdGhlbSBvdXQuXG5cbiAgICAgIGlmIChjaGFuZ2VkWCkge1xuICAgICAgICBvblJpZ2h0ICYmIHNlbGYuZGVsdGFYID4gMCAmJiBvblJpZ2h0KHNlbGYpO1xuICAgICAgICBvbkxlZnQgJiYgc2VsZi5kZWx0YVggPCAwICYmIG9uTGVmdChzZWxmKTtcbiAgICAgICAgb25DaGFuZ2VYICYmIG9uQ2hhbmdlWChzZWxmKTtcbiAgICAgICAgb25Ub2dnbGVYICYmIHNlbGYuZGVsdGFYIDwgMCAhPT0gcHJldkRlbHRhWCA8IDAgJiYgb25Ub2dnbGVYKHNlbGYpO1xuICAgICAgICBwcmV2RGVsdGFYID0gc2VsZi5kZWx0YVg7XG4gICAgICAgIGRlbHRhWFswXSA9IGRlbHRhWFsxXSA9IGRlbHRhWFsyXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkWSkge1xuICAgICAgICBvbkRvd24gJiYgc2VsZi5kZWx0YVkgPiAwICYmIG9uRG93bihzZWxmKTtcbiAgICAgICAgb25VcCAmJiBzZWxmLmRlbHRhWSA8IDAgJiYgb25VcChzZWxmKTtcbiAgICAgICAgb25DaGFuZ2VZICYmIG9uQ2hhbmdlWShzZWxmKTtcbiAgICAgICAgb25Ub2dnbGVZICYmIHNlbGYuZGVsdGFZIDwgMCAhPT0gcHJldkRlbHRhWSA8IDAgJiYgb25Ub2dnbGVZKHNlbGYpO1xuICAgICAgICBwcmV2RGVsdGFZID0gc2VsZi5kZWx0YVk7XG4gICAgICAgIGRlbHRhWVswXSA9IGRlbHRhWVsxXSA9IGRlbHRhWVsyXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb3ZlZCB8fCBkcmFnZ2VkKSB7XG4gICAgICAgIG9uTW92ZSAmJi
5398Bvbk1vdmUoc2VsZik7XG5cbiAgICAgICAgaWYgKGRyYWdnZWQpIHtcbiAgICAgICAgICBvbkRyYWdTdGFydCAmJiBkcmFnZ2VkID09PSAxICYmIG9uRHJhZ1N0YXJ0KHNlbGYpO1xuICAgICAgICAgIG9uRHJhZyAmJiBvbkRyYWcoc2VsZik7XG4gICAgICAgICAgZHJhZ2dlZCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBtb3ZlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsb2NrZWQgJiYgIShsb2NrZWQgPSBmYWxzZSkgJiYgb25Mb2NrQXhpcyAmJiBvbkxvY2tBeGlzKHNlbGYpO1xuXG4gICAgICBpZiAod2hlZWxlZCkge1xuICAgICAgICBvbldoZWVsKHNlbGYpO1xuICAgICAgICB3aGVlbGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlkID0gMDtcbiAgICB9LFxuICAgICAgICBvbkRlbHRhID0gZnVuY3Rpb24gb25EZWx0YSh4LCB5LCBpbmRleCkge1xuICAgICAgZGVsdGFYW2luZGV4XSArPSB4O1xuICAgICAgZGVsdGFZW2luZGV4XSArPSB5O1xuXG4gICAgICBzZWxmLl92eC51cGRhdGUoeCk7XG5cbiAgICAgIHNlbGYuX3Z5LnVwZGF0ZSh5KTtcblxuICAgICAgZGVib3VuY2UgPyBpZCB8fCAoaWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlKSkgOiB1cGRhdGUoKTtcbiAgICB9LFxuICAgICAgICBvblRvdWNoT3JQb2ludGVyRGVsdGEgPSBmdW5jdGlvbiBvblRvdWNoT3JQb2ludGVyRGVsdGEoeCwgeSkge1xuICAgICAgaWYgKGxvY2tBeGlzICYmICFheGlzKSB7XG4gICAgICAgIHNlbGYuYXhpcyA9IGF4aXMgPSBNYXRoLmFicyh4KSA+IE1hdGguYWJzKHkpID8gXCJ4XCIgOiBcInlcIjtcbiAgICAgICAgbG9ja2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMgIT09IFwieVwiKSB7XG4gICAgICAgIGRlbHRhWFsyXSArPSB4O1xuXG4gICAgICAgIHNlbGYuX3Z4LnVwZGF0ZSh4LCB0cnVlKTsgLy8gdXBkYXRlIHRoZSB2ZWxvY2l0eSBhcyBmcmVxdWVudGx5IGFzIHBvc3NpYmxlIGluc3RlYWQgb2YgaW4gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiBzbyB0aGF0IHZlcnkgcXVpY2sgdG91Y2gtc2Nyb2xscyAo
5398ZmxpY2tzKSBmZWVsIG5hdHVyYWwuIElmIGl0J3MgdGhlIG1vdXNlL3RvdWNoL3BvaW50ZXIsIGZvcmNlIGl0IHNvIHRoYXQgd2UgZ2V0IHNuYXBweS9hY2N1cmF0ZSBtb21lbnR1bSBzY3JvbGwuXG5cbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMgIT09IFwieFwiKSB7XG4gICAgICAgIGRlbHRhWVsyXSArPSB5O1xuXG4gICAgICAgIHNlbGYuX3Z5LnVwZGF0ZSh5LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgZGVib3VuY2UgPyBpZCB8fCAoaWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlKSkgOiB1cGRhdGUoKTtcbiAgICB9LFxuICAgICAgICBfb25EcmFnID0gZnVuY3Rpb24gX29uRHJhZyhlKSB7XG4gICAgICBpZiAoX2lnbm9yZUNoZWNrKGUsIDEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZSA9IF9nZXRFdmVudChlLCBwcmV2ZW50RGVmYXVsdCk7XG4gICAgICB2YXIgeCA9IGUuY2xpZW50WCxcbiAgICAgICAgICB5ID0gZS5jbGllbnRZLFxuICAgICAgICAgIGR4ID0geCAtIHNlbGYueCxcbiAgICAgICAgICBkeSA9IHkgLSBzZWxmLnksXG4gICAgICAgICAgaXNEcmFnZ2luZyA9IHNlbGYuaXNEcmFnZ2luZztcbiAgICAgIHNlbGYueCA9IHg7XG4gICAgICBzZWxmLnkgPSB5O1xuXG4gICAgICBpZiAoaXNEcmFnZ2luZyB8fCAoZHggfHwgZHkpICYmIChNYXRoLmFicyhzZWxmLnN0YXJ0WCAtIHgpID49IGRyYWdNaW5pbXVtIHx8IE1hdGguYWJzKHNlbGYuc3RhcnRZIC0geSkgPj0gZHJhZ01pbmltdW0pKSB7XG4gICAgICAgIGRyYWdnZWQgfHwgKGRyYWdnZWQgPSBpc0RyYWdnaW5nID8gMiA6IDEpOyAvLyBkcmFnZ2VkOiAwID0gbm90IGRyYWdnaW5nLCAxID0gZmlyc3QgZHJhZywgMiA9IG5vcm1hbCBkcmFnXG5cbiAgICAgICAgaXNEcmFnZ2luZyB8fCAoc2VsZi5pc0RyYWdnaW5nID0gdHJ1ZSk7XG4gICAgICAgIG9uVG91Y2hPclBvaW50ZXJEZWx0YShkeCwgZHkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgICAgIF9vblByZXNzID0gc2VsZi5vblByZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChfaWdub3JlQ2hlY2soZSwgMSkgfHwgZSAmJiBlLmJ1dHRvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuYXhpcyA9IGF4aXMgPSBudWxsO1xuICAgICAgb25TdG9wRGVsYXllZENhbGwucGF1c2UoKTtcbiAgICAgIHNlbGYuaXNQcmVzc2VkID0gdHJ1ZTtcbiAgICAgIGUgPSBfZ2V0RXZlbnQoZSk7IC8vIG5vdGU6IG1heSBuZWVkIHRvIHByZXZlbnREZWZhdWx0KD8pIFdvbid0IHNpZGUtc2Nyb2xsIG9uIGlPUyBTYWZhcmkgaWYgd2UgZG8sIHRob3VnaC5cblxuICAgICAgcHJldkRlbHRhWCA9IHByZXZEZWx0YVkgPSAwO1xuICAgICAgc2VsZi5zdGFydFggPSBzZWxmLnggPSBlLmNsaWVudFg7XG4gICAgICBzZWxmLnN0YXJ0WSA9IHNlbGYueSA9IGUuY2xpZW50WTtcblxuICAgICAgc2VsZi5fdngucmVzZXQoKTsgLy8gb3RoZXJ3aXNlIHRoZSB0MiBtYXkgYmUgc3RhbGUgaWYgdGhlIHVzZXIgdG91Y2hlcyBhbmQgZmxpY2tzIHN1cGVyIGZhc3QgYW5kIHJlbGVhc2VzIGluIGxlc3MgdGhhbiAyIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0aWNrcywgY2F1c2luZyB2ZWxvY2l0eSB0byBiZSAwLlxuXG5cbiAgICAgIHNlbGYuX3Z5LnJlc2V0KCk7XG5cbiAgICAgIF9hZGRMaXN0ZW5lcihpc05vcm1hbGl6ZXIgPyB0YXJnZXQgOiBvd25lckRvYywgX2V2ZW50VHlwZXNbMV0sIF9vbkRyYWcsIHBhc3NpdmUsIHRydWUpO1xuXG4gICAgICBzZWxmLmRlbHRhWCA9IHNlbGYuZGVsdGFZID0gMDtcbiAgICAgIG9uUHJlc3MgJiYgb25QcmVzcyhzZWxmKTtcbiAgICB9LFxuICAgICAgICBfb25SZWxlYXNlID0gc2VsZi5vblJlbGVhc2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKF9pZ25vcmVDaGVjayhlLCAxKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF9yZW1vdmVMaXN0ZW5lcihpc05vcm1hbGl6ZXIgPyB0YXJnZXQgOiBvd25lckRvYywgX2V2ZW50VHlwZXNbMV0sIF9vbkRyYWcsIHRydWUpO1xuXG4gICAgICB2Y
5398XIgaXNUcmFja2luZ0RyYWcgPSAhaXNOYU4oc2VsZi55IC0gc2VsZi5zdGFydFkpLFxuICAgICAgICAgIHdhc0RyYWdnaW5nID0gc2VsZi5pc0RyYWdnaW5nLFxuICAgICAgICAgIGlzRHJhZ05vdENsaWNrID0gd2FzRHJhZ2dpbmcgJiYgKE1hdGguYWJzKHNlbGYueCAtIHNlbGYuc3RhcnRYKSA+IDMgfHwgTWF0aC5hYnMoc2VsZi55IC0gc2VsZi5zdGFydFkpID4gMyksXG4gICAgICAgICAgLy8gc29tZSB0b3VjaCBkZXZpY2VzIG5lZWQgc29tZSB3aWdnbGUgcm9vbSBpbiB0ZXJtcyBvZiBzZW5zaW5nIGNsaWNrcyAtIHRoZSBmaW5nZXIgbWF5IG1vdmUgYSBmZXcgcGl4ZWxzLlxuICAgICAgZXZlbnREYXRhID0gX2dldEV2ZW50KGUpO1xuXG4gICAgICBpZiAoIWlzRHJhZ05vdENsaWNrICYmIGlzVHJhY2tpbmdEcmFnKSB7XG4gICAgICAgIHNlbGYuX3Z4LnJlc2V0KCk7XG5cbiAgICAgICAgc2VsZi5fdnkucmVzZXQoKTsgLy9pZiAocHJldmVudERlZmF1bHQgJiYgYWxsb3dDbGlja3MgJiYgc2VsZi5pc1ByZXNzZWQpIHsgLy8gY2hlY2sgaXNQcmVzc2VkIGJlY2F1c2UgaW4gYSByYXJlIGVkZ2UgY2FzZSwgdGhlIGlucHV0T2JzZXJ2ZXIgaW4gU2Nyb2xsVHJpZ2dlciBtYXkgc3RvcFByb3BhZ2F0aW9uKCkgb24gdGhlIHByZXNzL2RyYWcsIHNvIHRoZSBvblJlbGVhc2UgbWF5IGdldCBmaXJlZCB3aXRob3V0IHRoZSBvblByZXNzL29uRHJhZyBldmVyIGdldHRpbmcgY2FsbGVkLCB0aHVzIGl0IGNvdWxkIHRyaWdnZXIgYSBjbGljayB0byBvY2N1ciBvbiBhIGxpbmsgYWZ0ZXIgc2Nyb2xsLWRyYWdnaW5nIGl0LlxuXG5cbiAgICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmIGFsbG93Q2xpY2tzKSB7XG4gICAgICAgICAgZ3NhcC5kZWxheWVkQ2FsbCgwLjA4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBzb21lIGJyb3dzZXJzIChsaWtlIEZpcmVmb3gpIHdvbid0IHRydXN0IHNjcmlwdC1nZW5lcmF0ZWQgY2xpY2tzLCBzbyBpZiB0aGUgdXNlciB0cmllcyB0byBjbGljayBvbiBhIHZpZGVvIHRvIHBsYXkgaXQsIGZvciBleGFtcGxlLCBpdCBzaW1wbHkgd29uJ3Qgd29yay4gU2luY2UgYSByZWd1bGFyIFwiY2xpY2tcIiBldmVudCB3aWxsIG1vc3QgbGlrZWx5IGJlIGdlbmVyYXRlZCBhbnl3YXkgKG9uZSB0aGF0IGhhcyBpdHMgaXNUcnVzdGVkIGZsYWcgc2V0IHRvIHRydWUpLCB3ZSBtdXN0IHNsaWdodGx5IGRlbGF5IG91ciBzY3JpcHQtZ2VuZXJhdGVkIGNsaWNrIHNvIHRoYXQgdGhlIFwicmVhbFwiL3RydXN0ZWQgb25lIGlzIHByaW9yaXRpemVkLiBSZW1lbWJlciwgd2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlIGV2ZW50cyBpbiBxdWljayBzdWNjZXNzaW9uLCB3ZSBzdXBwcmVzcyBhbGwgYnV0IHRoZSBmaXJzdCBvbmUuIFNvbWUgYnJvd3NlcnMgZG9uJ3QgZXZlbiB0cmlnZ2VyIHRoZSBcInJlYWxcIiBvbmUgYXQgYWxsLCBzbyBvdXIgc3ludGhldGljIG9uZSBpcyBhIHNhZmV0eSB2YWx2ZSB0aGF0IGVuc3VyZXMgdGhhdCBubyBtYXR0ZXIgd2hhdCwgYSBjbGljayBldmVudCBkb2VzIGdldCBkaXNwYXRjaGVkLlxuICAgICAgICAgICAgaWYgKF9nZXRUaW1lKCkgLSBvbkNsaWNrVGltZSA+IDMwMCAmJiAhZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgIGlmIChlLnRhcmdldC5jbGljaykge1xuICAgICAgICAgICAgICAgIC8vc29tZSBicm93c2VycyAobGlrZSBtb2JpbGUgU2FmYXJpKSBkb24ndCBwcm9wZXJseSB0cmlnZ2VyIHRoZSBjbGljayBldmVudFxuICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNsaWNrKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAob3duZXJEb2MuY3JlYXRlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB2Y
5398XIgc3ludGhldGljRXZlbnQgPSBvd25lckRvYy5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRzXCIpO1xuICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V2ZW50LmluaXRNb3VzZUV2ZW50KFwiY2xpY2tcIiwgdHJ1ZSwgdHJ1ZSwgX3dpbiwgMSwgZXZlbnREYXRhLnNjcmVlblgsIGV2ZW50RGF0YS5zY3JlZW5ZLCBldmVudERhdGEuY2xpZW50WCwgZXZlbnREYXRhLmNsaWVudFksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKTtcbiAgICAgICAgICAgICAgICBlLnRhcmdldC5kaXNwYXRjaEV2ZW50KHN5bnRoZXRpY0V2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNlbGYuaXNEcmFnZ2luZyA9IHNlbGYuaXNHZXN0dXJpbmcgPSBzZWxmLmlzUHJlc3NlZCA9IGZhbHNlO1xuICAgICAgb25TdG9wICYmIHdhc0RyYWdnaW5nICYmICFpc05vcm1hbGl6ZXIgJiYgb25TdG9wRGVsYXllZENhbGwucmVzdGFydCh0cnVlKTtcbiAgICAgIGRyYWdnZWQgJiYgdXBkYXRlKCk7IC8vIGluIGNhc2UgZGVib3VuY2luZywgd2UgZG9uJ3Qgd2FudCBvbkRyYWcgdG8gZmlyZSBBRlRFUiBvbkRyYWdFbmQoKS5cblxuICAgICAgb25EcmFnRW5kICYmIHdhc0RyYWdnaW5nICYmIG9uRHJhZ0VuZChzZWxmKTtcbiAgICAgIG9uUmVsZWFzZSAmJiBvblJlbGVhc2Uoc2VsZiwgaXNEcmFnTm90Q2xpY2spO1xuICAgIH0sXG4gICAgICAgIF9vbkdlc3R1cmVTdGFydCA9IGZ1bmN0aW9uIF9vbkdlc3R1cmVTdGFydChlKSB7XG4gICAgICByZXR1cm4gZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxICYmIChzZWxmLmlzR2VzdHVyaW5nID0gdHJ1ZSkgJiYgb25HZXN0dXJlU3RhcnQoZSwgc2VsZi5pc0RyYWdnaW5nKTtcbiAgICB9LFxuICAgICAgICBfb25HZXN0dXJlRW5kID0gZnVuY3Rpb24gX29uR2VzdHVyZUVuZCgpIHtcbiAgICAgIHJldHVybiAoc2VsZi5pc0dlc3R1cmluZyA9IGZhbHNlKSB8fCBvbkdlc3R1cmVFbmQoc2VsZik7XG4gICAgfSxcbiAgICAgICAgb25TY3JvbGwgPSBmdW5jdGlvbiBvblNjcm9sbChlKSB7XG4gICAgICBpZiAoX2lnbm9yZUNoZWNrKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHggPSBzY3JvbGxGdW5jWCgpLFxuICAgICAgICAgIHkgPSBzY3JvbGxGdW5jWSgpO1xuICAgICAgb25EZWx0YSgoeCAtIHNjcm9sbFgpICogc2Nyb2xsU3BlZWQsICh5IC0gc2Nyb2xsWSkgKiBzY3JvbGxTcGVlZCwgMSk7XG4gICAgICBzY3JvbGxYID0geDtcbiAgICAgIHNjcm9sbFkgPSB5O1xuICAgICAgb25TdG9wICYmIG9uU3RvcERlbGF5ZWRDYWxsLnJlc3RhcnQodHJ1ZSk7XG4gICAgfSxcbiAgICAgICAgX29uV2hlZWwgPSBmdW5jdGlvbiBfb25XaGVlbChlKSB7XG4gICAgICBpZiAoX2lnbm9yZUNoZWNrKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZSA9IF9nZXRFdmVudChlLCBwcmV2ZW50RGVmYXVsdCk7XG4gICAgICBvbldoZWVsICYmICh3aGVlbGVkID0gdHJ1ZSk7XG4gICAgICB2Y
5398XIgbXVsdGlwbGllciA9IChlLmRlbHRhTW9kZSA9PT0gMSA/IGxpbmVIZWlnaHQgOiBlLmRlbHRhTW9kZSA9PT0gMiA/IF93aW4uaW5uZXJIZWlnaHQgOiAxKSAqIHdoZWVsU3BlZWQ7XG4gICAgICBvbkRlbHRhKGUuZGVsdGFYICogbXVsdGlwbGllciwgZS5kZWx0YVkgKiBtdWx0aXBsaWVyLCAwKTtcbiAgICAgIG9uU3RvcCAmJiAhaXNOb3JtYWxpemVyICYmIG9uU3RvcERlbGF5ZWRDYWxsLnJlc3RhcnQodHJ1ZSk7XG4gICAgfSxcbiAgICAgICAgX29uTW92ZSA9IGZ1bmN0aW9uIF9vbk1vdmUoZSkge1xuICAgICAgaWYgKF9pZ25vcmVDaGVjayhlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB4ID0gZS5jbGllbnRYLFxuICAgICAgICAgIHkgPSBlLmNsaWVudFksXG4gICAgICAgICAgZHggPSB4IC0gc2VsZi54LFxuICAgICAgICAgIGR5ID0geSAtIHNlbGYueTtcbiAgICAgIHNlbGYueCA9IHg7XG4gICAgICBzZWxmLnkgPSB5O1xuICAgICAgbW92ZWQgPSB0cnVlO1xuICAgICAgb25TdG9wICYmIG9uU3RvcERlbGF5ZWRDYWxsLnJlc3RhcnQodHJ1ZSk7XG4gICAgICAoZHggfHwgZHkpICYmIG9uVG91Y2hPclBvaW50ZXJEZWx0YShkeCwgZHkpO1xuICAgIH0sXG4gICAgICAgIF9vbkhvdmVyID0gZnVuY3Rpb24gX29uSG92ZXIoZSkge1xuICAgICAgc2VsZi5ldmVudCA9IGU7XG4gICAgICBvbkhvdmVyKHNlbGYpO1xuICAgIH0sXG4gICAgICAgIF9vbkhvdmVyRW5kID0gZnVuY3Rpb24gX29uSG92ZXJFbmQoZSkge1xuICAgICAgc2VsZi5ldmVudCA9IGU7XG4gICAgICBvbkhvdmVyRW5kKHNlbGYpO1xuICAgIH0sXG4gICAgICAgIF9vbkNsaWNrID0gZnVuY3Rpb24gX29uQ2xpY2soZSkge1xuICAgICAgcmV0dXJuIF9pZ25vcmVDaGVjayhlKSB8fCBfZ2V0RXZlbnQoZSwgcHJldmVudERlZmF1bHQpICYmIG9uQ2xpY2soc2VsZik7XG4gICAgfTtcblxuICAgIG9uU3RvcERlbGF5ZWRDYWxsID0gc2VsZi5fZGMgPSBnc2FwLmRlbGF5ZWRDYWxsKG9uU3RvcERlbGF5IHx8IDAuMjUsIG9uU3RvcEZ1bmMpLnBhdXNlKCk7XG4gICAgc2VsZi5kZWx0YVggPSBzZWxmLmRlbHRhWSA9IDA7XG4gICAgc2VsZi5fdnggPSBfZ2V0VmVsb2NpdHlQcm9wKDAsIDUwLCB0cnVlKTtcbiAgICBzZWxmLl92eSA9IF9nZXRWZWxvY2l0eVByb3AoMCwgNTAsIHRydWUpO1xuICAgIHNlbGYuc2Nyb2xsWCA9IHNjcm9sbEZ1bmNYO1xuICAgIHNlbGYuc2Nyb2xsWSA9IHNjcm9sbEZ1bmNZO1xuICAgIHNlbGYuaXNEcmFnZ2luZyA9IHNlbGYuaXNHZXN0dXJpbmcgPSBzZWxmLmlzUHJlc3NlZCA9IGZhbHNlO1xuXG4gICAgX2NvbnRleHQodGhpcyk7XG5cbiAgICBzZWxmLmVuYWJsZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIXNlbGYuaXNFbmFibGVkKSB7XG4gICAgICAgIF9hZGRMaXN0ZW5lcihpc1ZpZXdwb3J0ID8gb3duZXJEb2MgOiB0YXJnZXQsIFwic2Nyb2xsXCIsIF9vblNjcm9sbCk7XG5cbiAgICAgICAgdHlwZS5pbmRleE9mKFwic2Nyb2xsXCIpID49IDAgJiYgX2FkZExpc3RlbmVyKGlzVmlld3BvcnQgPyBvd25lckRvYyA6IHRhcmdldCwgXCJzY3JvbGxcIiwgb25TY3JvbGwsIHBhc3NpdmUsIGNhcHR1cmUpO1xuICAgICAgICB0eXBlLmluZGV4T2YoXCJ3aGVlbFwiKSA+PSAwICYmIF9hZGRMaXN0ZW5lcih0YXJnZXQsIFwid2hlZWxcIiwgX29uV2hlZWwsIHBhc3NpdmUsIGNhcHR1cmUpO1xuXG4gICAgICAgIGlmICh0eXBlLmluZGV4T2YoXCJ0b3VjaFwiKSA+PSAwICYmIF9pc1RvdWNoIHx8IHR5cGUuaW5kZXhPZihcInBvaW50ZXJcIikgPj0gMCkge1xuICAgICAgICAgIF9hZGRMaXN0ZW5lcih0YXJnZXQsIF9ldmVudFR5cGVzWzBdLCBfb25QcmVzcywgcGFzc2l2ZSwgY2FwdHVyZSk7XG5cbiAgICAgICAgICBfYWRkTGlzdGVuZXIob3duZXJEb2MsIF9ldmVudFR5cGVzWzJdLCBfb25SZWxlYXNlKTtcblxuICAgICAgICAgIF9hZGRMaXN0ZW5lcihvd25lckRvYywgX2V2ZW50VHlwZXNbM10sIF9vblJlbGVhc2UpO1xuXG4gICAgICAgICAgYWxsb3dDbGlja3MgJiYgX2FkZExpc3RlbmVyKHRhcmdldCwgXCJjbGlja1wiLCBjbGlja0NhcHR1cmUsIHRydWUsIHRydWUpO1xuICAgICAgICAgIG9uQ2xpY2sgJiYgX2FkZExpc3RlbmVyKHRhcmdldCwgXCJjbGlja1wiLCBfb25DbGljayk7XG4gICAgICAgICAgb25HZXN0dXJlU3RhcnQgJiYgX2FkZExpc3RlbmVyKG93bmVyRG9jLCBcImdlc3R1cmVzdGFydFwiLCBfb25HZXN0dXJlU3RhcnQpO1xuICAgICAgICAgIG9uR2VzdHVyZUVuZCAmJiBfYWRkTGlzdGVuZXIob3duZXJEb2MsIFwiZ2VzdHVyZWVuZFwiLCBfb25HZXN0dXJlRW5kKTtcbiAgICAgICAgICBvbkhvdmVyICYmIF9hZGRMaXN0ZW5lcih0YXJnZXQsIF9wb2ludGVyVHlwZSArIFwiZW50ZXJcIiwgX29uSG92ZXIpO1xuICAgICAgICAgIG9uSG92ZXJFbmQgJiYgX2FkZExpc3RlbmVyKHRhcmdldCwgX3BvaW50ZXJUeXBlICsgXCJsZWF2ZVwiLCBfb25Ib3ZlckVuZCk7XG4gICAgICAgICAgb25Nb3ZlICYmIF9hZGRMaXN0ZW5lcih0YXJnZXQsIF9wb2ludGVyVHlwZSArIFwibW92ZVwiLCBfb25Nb3ZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5pc0RyYWdnaW5nID0gc2VsZi5pc0dlc3R1cmluZyA9IHNlbGYuaXNQcmVzc2VkID0gbW92ZWQgPSBkcmFnZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgc2VsZi5fdngucmVzZXQoKTtcblxuICAgICAgICBzZWxmLl92eS5yZXNldCgpO1xuXG4gICAgICAgIHNjcm9sbFggPSBzY3JvbGxGdW5jWCgpO1xuICAgICAgICBzY3JvbGxZID0gc2Nyb2xsRnVuY1koKTtcbiAgICAgICAgZSAmJiBlLnR5cGUgJiYgX29uUHJlc3MoZSk7XG4gICAgICAgIG9uRW5hYmxlICYmIG9uRW5hYmxlKHNlbGYpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuXG4gICAgc2VsZi5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYuaXNFbmFibGVkKSB7XG4gICAgICAgIC8vIG9ubHkgcmVtb3ZlIHRoZSBfb25TY3JvbGwgbGlzdGVuZXIgaWYgdGhlcmUgYXJlbid0IGFueSBvdGhlcnMgdGhhdCByZWx5IG9uIHRoZSBmdW5jdGlvbmFsaXR5LlxuICAgICAgICBfb2JzZXJ2ZXJzLmZpbHRlcihmdW5jdGlvbiAobykge1xuICAgICAgICAgI
vendor: 8,319 bytes, lines 5398-5527
5398HJldHVybiBvICE9PSBzZWxmICYmIF9pc1ZpZXdwb3J0KG8udGFyZ2V0KTtcbiAgICAgICAgfSkubGVuZ3RoIHx8IF9yZW1vdmVMaXN0ZW5lcihpc1ZpZXdwb3J0ID8gb3duZXJEb2MgOiB0YXJnZXQsIFwic2Nyb2xsXCIsIF9vblNjcm9sbCk7XG5cbiAgICAgICAgaWYgKHNlbGYuaXNQcmVzc2VkKSB7XG4gICAgICAgICAgc2VsZi5fdngucmVzZXQoKTtcblxuICAgICAgICAgIHNlbGYuX3Z5LnJlc2V0KCk7XG5cbiAgICAgICAgICBfcmVtb3ZlTGlzdGVuZXIoaXNOb3JtYWxpemVyID8gdGFyZ2V0IDogb3duZXJEb2MsIF9ldmVudFR5cGVzWzFdLCBfb25EcmFnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihpc1ZpZXdwb3J0ID8gb3duZXJEb2MgOiB0YXJnZXQsIFwic2Nyb2xsXCIsIG9uU2Nyb2xsLCBjYXB0dXJlKTtcblxuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBcIndoZWVsXCIsIF9vbldoZWVsLCBjYXB0dXJlKTtcblxuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBfZXZlbnRUeXBlc1swXSwgX29uUHJlc3MsIGNhcHR1cmUpO1xuXG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihvd25lckRvYywgX2V2ZW50VHlwZXNbMl0sIF9vblJlbGVhc2UpO1xuXG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihvd25lckRvYywgX2V2ZW50VHlwZXNbM10sIF9vblJlbGVhc2UpO1xuXG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcih0YXJnZXQsIFwiY2xpY2tcIiwgY2xpY2tDYXB0dXJlLCB0cnVlKTtcblxuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBcImNsaWNrXCIsIF9vbkNsaWNrKTtcblxuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIob3duZXJEb2MsIFwiZ2VzdHVyZXN0YXJ0XCIsIF9vbkdlc3R1cmVTdGFydCk7XG5cbiAgICAgICAgX3JlbW92ZUxpc3RlbmVyKG93bmVyRG9jLCBcImdlc3R1cmVlbmRcIiwgX29uR2VzdHVyZUVuZCk7XG5cbiAgICAgICAgX3JlbW92ZUxpc3RlbmVyKHRhcmdldCwgX3BvaW50ZXJUeXBlICsgXCJlbnRlclwiLCBfb25Ib3Zlcik7XG5cbiAgICAgICAgX3JlbW92ZUxpc3RlbmVyKHRhcmdldCwgX3BvaW50ZXJUeXBlICsgXCJsZWF2ZVwiLCBfb25Ib3ZlckVuZCk7XG5cbiAgICAgICAgX3JlbW92ZUxpc3RlbmVyKHRhcmdldCwgX3BvaW50ZXJUeXBlICsgXCJtb3ZlXCIsIF9vbk1vdmUpO1xuXG4gICAgICAgIHNlbGYuaXNFbmFibGVkID0gc2VsZi5pc1ByZXNzZWQgPSBzZWxmLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgb25EaXNhYmxlICYmIG9uRGlzYWJsZShzZWxmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2VsZi5raWxsID0gc2VsZi5yZXZlcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmRpc2FibGUoKTtcblxuICAgICAgdmFyIGkgPSBfb2JzZXJ2ZXJzLmluZGV4T2Yoc2VsZik7XG5cbiAgICAgIGkgPj0gMCAmJiBfb2JzZXJ2ZXJzLnNwbGljZShpLCAxKTtcbiAgICAgIF9ub3JtYWxpemVyID09PSBzZWxmICYmIChfbm9ybWFsaXplciA9IDApO1xuICAgIH07XG5cbiAgICBfb2JzZXJ2ZXJzLnB1c2goc2VsZik7XG5cbiAgICBpc05vcm1hbGl6ZXIgJiYgX2lzVmlld3BvcnQodGFyZ2V0KSAmJiAoX25vcm1hbGl6ZXIgPSBzZWxmKTtcbiAgICBzZWxmLmVuYWJsZShldmVudCk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKE9ic2VydmVyLCBbe1xuICAgIGtleTogXCJ2ZWxvY2l0eVhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl92eC5nZXRWZWxvY2l0eSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ2ZWxvY2l0eVlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl92eS5nZXRWZWxvY2l0eSgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBPYnNlcnZlcjtcbn0oKTtcbk9ic2VydmVyLnZlcnNpb24gPSBcIjMuMTUuMFwiO1xuXG5PYnNlcnZlci5jcmVhdGUgPSBmdW5jdGlvbiAodmFycykge1xuICByZXR1cm4gbmV3IE9ic2VydmVyKHZhcnMpO1xufTtcblxuT2JzZXJ2ZXIucmVnaXN0ZXIgPSBfaW5pdENvcmU7XG5cbk9ic2VydmVyLmdldEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9vYnNlcnZlcnMuc2xpY2UoKTtcbn07XG5cbk9ic2VydmVyLmdldEJ5SWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIF9vYnNlcnZlcnMuZmlsdGVyKGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8udmFycy5pZCA9PT0gaWQ7XG4gIH0pWzBdO1xufTtcblxuX2dldEdTQVAoKSAmJiBnc2FwLnJlZ2lzdGVyUGx1Z2luKE9ic2VydmVyKTtcbmV4cG9ydCB7IE9ic2VydmVyIGFzIGRlZmF1bHQsIF9pc1ZpZXdwb3J0LCBfc2Nyb2xsZXJzLCBfZ2V0U2Nyb2xsRnVuYywgX2dldFByb3h5UHJvcCwgX3Byb3hpZXMsIF9nZXRWZWxvY2l0eVByb3AsIF92ZXJ0aWNhbCwgX2hvcml6b250YWwsIF9nZXRUYXJnZXQgfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
5399//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/Observer.js
5400
5401}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/ScrollTrigger.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
5402/* harmony export */ __webpack_require__.d(__webpack_exports__, {
5403/* harmony export */   ScrollTrigger: () => (/* binding */ ScrollTrigger),
5404/* harmony export */   "default": () => (/* binding */ ScrollTrigger)
5405/* harmony export */ });
5406/* harmony import */ var _Observer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Observer.js */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/Observer.js");
5407/*!
5408 * ScrollTrigger 3.15.0
5409 * https://gsap.com
5410 *
5411 * @license Copyright 2008-2026, GreenSock. All rights reserved.
5412 * Subject to the terms at https://gsap.com/standard-license
5413 * @author: Jack Doyle, [email protected]
5414*/
5415
5416/* eslint-disable */
5417
5418
5419var gsap,
5420    _coreInitted,
5421    _win,
5422    _doc,
5423    _docEl,
5424    _body,
5425    _root,
5426    _resizeDelay,
5427    _toArray,
5428    _clamp,
5429    _time2,
5430    _syncInterval,
5431    _refreshing,
5432    _pointerIsDown,
5433    _transformProp,
5434    _i,
5435    _prevWidth,
5436    _prevHeight,
5437    _autoRefresh,
5438    _sort,
5439    _suppressOverwrites,
5440    _ignoreResize,
5441    _normalizer,
5442    _ignoreMobileResize,
5443    _baseScreenHeight,
5444    _baseScreenWidth,
5445    _fixIOSBug,
5446    _context,
5447    _scrollRestoration,
5448    _div100vh,
5449    _100vh,
5450    _isReverted,
5451    _clampingMax,
5452    _limitCallbacks,
5453    // if true, we'll only trigger callbacks if the active state toggles, so if you scroll immediately past both the start and end positions of a ScrollTrigger (thus inactive to inactive), neither its onEnter nor onLeave will be called. This is useful during startup.
5454_startup = 1,
5455    _getTime = Date.now,
5456    _time1 = _getTime(),
5457    _lastScrollTime = 0,
5458    _enabled = 0,
5459    _parseClamp = function _parseClamp(value, type, self) {
5460  var clamp = _isString(value) && (value.substr(0, 6) === "clamp(" || value.indexOf("max") > -1);
5461  self["_" + type + "Clamp"] = clamp;
5462  return clamp ? value.substr(6, value.length - 7) : value;
5463},
5464    _keepClamp = function _keepClamp(value, clamp) {
5465  return clamp && (!_isString(value) || value.substr(0, 6) !== "clamp(") ? "clamp(" + value + ")" : value;
5466},
5467    _rafBugFix = function _rafBugFix() {
5468  return _enabled && requestAnimationFrame(_rafBugFix);
5469},
5470    // in some browsers (like Firefox), screen repaints weren't consistent unless we had SOMETHING queued up in requestAnimationFrame()! So this just creates a super simple loop to keep it alive and smooth out repaints.
5471_pointerDownHandler = function _pointerDownHandler() {
5472  return _pointerIsDown = 1;
5473},
5474    _pointerUpHandler = function _pointerUpHandler() {
5475  return _pointerIsDown = 0;
5476},
5477    _passThrough = function _passThrough(v) {
5478  return v;
5479},
5480    _round = function _round(value) {
5481  return Math.round(value * 100000) / 100000 || 0;
5482},
5483    _windowExists = function _windowExists() {
5484  return typeof window !== "undefined";
5485},
5486    _getGSAP = function _getGSAP() {
5487  return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap;
5488},
5489    _isViewport = function _isViewport(e) {
5490  return !!~_root.indexOf(e);
5491},
5492    _getViewportDimension = function _getViewportDimension(dimensionProperty) {
5493  return (dimensionProperty === "Height" ? _100vh : _win["inner" + dimensionProperty]) || _docEl["client" + dimensionProperty] || _body["client" + dimensionProperty];
5494},
5495    _getBoundsFunc = function _getBoundsFunc(element) {
5496  return (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(element, "getBoundingClientRect") || (_isViewport(element) ? function () {
5497    _winOffsets.width = _win.innerWidth;
5498    _winOffsets.height = _100vh;
5499    return _winOffsets;
5500  } : function () {
5501    return _getBounds(element);
5502  });
5503},
5504    _getSizeFunc = function _getSizeFunc(scroller, isViewport, _ref) {
5505  var d = _ref.d,
5506      d2 = _ref.d2,
5507      a = _ref.a;
5508  return (a = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(scroller, "getBoundingClientRect")) ? function () {
5509    return a()[d];
5510  } : function () {
5511    return (isViewport ? _getViewportDimension(d2) : scroller["client" + d2]) || 0;
5512  };
5513},
5514    _getOffsetsFunc = function _getOffsetsFunc(element, isViewport) {
5515  return !isViewport || ~_Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies.indexOf(element) ? _getBoundsFunc(element) : function () {
5516    return _winOffsets;
5517  };
5518},
5519    _maxScroll = function _maxScroll(element, _ref2) {
5520  var s = _ref2.s,
5521      d2 = _ref2.d2,
5522      d = _ref2.d,
5523      a = _ref2.a;
5524  return Math.max(0, (s = "scroll" + d2) && (a = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(element, s)) ? a() - _getBoundsFunc(element)()[d] : _isViewport(element) ? (_docEl[s] || _body[s]) - _getViewportDimension(d2) : element[s] - element["offset" + d2]);
5525},
5526    _iterateAutoRefresh = function _iterateAutoRefresh(func, events) {
5527  for (var i = 0; i < _autoRefresh.length; i += 3) {
vendor: 7,374 bytes, lines 5528-5748
5528    (!events || ~events.indexOf(_autoRefresh[i + 1])) && func(_autoRefresh[i], _autoRefresh[i + 1], _autoRefresh[i + 2]);
5529  }
5530},
5531    _isString = function _isString(value) {
5532  return typeof value === "string";
5533},
5534    _isFunction = function _isFunction(value) {
5535  return typeof value === "function";
5536},
5537    _isNumber = function _isNumber(value) {
5538  return typeof value === "number";
5539},
5540    _isObject = function _isObject(value) {
5541  return typeof value === "object";
5542},
5543    _endAnimation = function _endAnimation(animation, reversed, pause) {
5544  return animation && animation.progress(reversed ? 0 : 1) && pause && animation.pause();
5545},
5546    _callback = function _callback(self, func, extraParam) {
5547  if (self.enabled) {
5548    var result = self._ctx ? self._ctx.add(function () {
5549      return func(self, extraParam);
5550    }) : func(self, extraParam);
5551    result && result.totalTime && (self.callbackAnimation = result);
5552  }
5553},
5554    _abs = Math.abs,
5555    _left = "left",
5556    _top = "top",
5557    _right = "right",
5558    _bottom = "bottom",
5559    _width = "width",
5560    _height = "height",
5561    _Right = "Right",
5562    _Left = "Left",
5563    _Top = "Top",
5564    _Bottom = "Bottom",
5565    _padding = "padding",
5566    _margin = "margin",
5567    _Width = "Width",
5568    _Height = "Height",
5569    _px = "px",
5570    _getComputedStyle = function _getComputedStyle(element) {
5571  return _win.getComputedStyle(element.nodeType === Node.DOCUMENT_NODE ? element.scrollingElement : element);
5572},
5573    _makePositionable = function _makePositionable(element) {
5574  // if the element already has position: absolute or fixed, leave that, otherwise make it position: relative
5575  var position = _getComputedStyle(element).position;
5576
5577  element.style.position = position === "absolute" || position === "fixed" ? position : "relative";
5578},
5579    _setDefaults = function _setDefaults(obj, defaults) {
5580  for (var p in defaults) {
5581    p in obj || (obj[p] = defaults[p]);
5582  }
5583
5584  return obj;
5585},
5586    _getBounds = function _getBounds(element, withoutTransforms) {
5587  var tween = withoutTransforms && _getComputedStyle(element)[_transformProp] !== "matrix(1, 0, 0, 1, 0, 0)" && gsap.to(element, {
5588    x: 0,
5589    y: 0,
5590    xPercent: 0,
5591    yPercent: 0,
5592    rotation: 0,
5593    rotationX: 0,
5594    rotationY: 0,
5595    scale: 1,
5596    skewX: 0,
5597    skewY: 0
5598  }).progress(1),
5599      bounds = element.getBoundingClientRect ? element.getBoundingClientRect() : element.scrollingElement.getBoundingClientRect();
5600  tween && tween.progress(0).kill();
5601  return bounds;
5602},
5603    _getSize = function _getSize(element, _ref3) {
5604  var d2 = _ref3.d2;
5605  return element["offset" + d2] || element["client" + d2] || 0;
5606},
5607    _getLabelRatioArray = function _getLabelRatioArray(timeline) {
5608  var a = [],
5609      labels = timeline.labels,
5610      duration = timeline.duration(),
5611      p;
5612
5613  for (p in labels) {
5614    a.push(labels[p] / duration);
5615  }
5616
5617  return a;
5618},
5619    _getClosestLabel = function _getClosestLabel(animation) {
5620  return function (value) {
5621    return gsap.utils.snap(_getLabelRatioArray(animation), value);
5622  };
5623},
5624    _snapDirectional = function _snapDirectional(snapIncrementOrArray) {
5625  var snap = gsap.utils.snap(snapIncrementOrArray),
5626      a = Array.isArray(snapIncrementOrArray) && snapIncrementOrArray.slice(0).sort(function (a, b) {
5627    return a - b;
5628  });
5629  return a ? function (value, direction, threshold) {
5630    if (threshold === void 0) {
5631      threshold = 1e-3;
5632    }
5633
5634    var i;
5635
5636    if (!direction) {
5637      return snap(value);
5638    }
5639
5640    if (direction > 0) {
5641      value -= threshold; // to avoid rounding errors. If we're too strict, it might snap forward, then immediately again, and again.
5642
5643      for (i = 0; i < a.length; i++) {
5644        if (a[i] >= value) {
5645          return a[i];
5646        }
5647      }
5648
5649      return a[i - 1];
5650    } else {
5651      i = a.length;
5652      value += threshold;
5653
5654      while (i--) {
5655        if (a[i] <= value) {
5656          return a[i];
5657        }
5658      }
5659    }
5660
5661    return a[0];
5662  } : function (value, direction, threshold) {
5663    if (threshold === void 0) {
5664      threshold = 1e-3;
5665    }
5666
5667    var snapped = snap(value);
5668    return !direction || Math.abs(snapped - value) < threshold || snapped - value < 0 === direction < 0 ? snapped : snap(direction < 0 ? value - snapIncrementOrArray : value + snapIncrementOrArray);
5669  };
5670},
5671    _getLabelAtDirection = function _getLabelAtDirection(timeline) {
5672  return function (value, st) {
5673    return _snapDirectional(_getLabelRatioArray(timeline))(value, st.direction);
5674  };
5675},
5676    _multiListener = function _multiListener(func, element, types, callback) {
5677  return types.split(",").forEach(function (type) {
5678    return func(element, type, callback);
5679  });
5680},
5681    _addListener = function _addListener(element, type, func, nonPassive, capture) {
5682  return element.addEventListener(type, func, {
5683    passive: !nonPassive,
5684    capture: !!capture
5685  });
5686},
5687    _removeListener = function _removeListener(element, type, func, capture) {
5688  return element.removeEventListener(type, func, !!capture);
5689},
5690    _wheelListener = function _wheelListener(func, el, scrollFunc) {
5691  scrollFunc = scrollFunc && scrollFunc.wheelHandler;
5692
5693  if (scrollFunc) {
5694    func(el, "wheel", scrollFunc);
5695    func(el, "touchmove", scrollFunc);
5696  }
5697},
5698    _markerDefaults = {
5699  startColor: "green",
5700  endColor: "red",
5701  indent: 0,
5702  fontSize: "16px",
5703  fontWeight: "normal"
5704},
5705    _defaults = {
5706  toggleActions: "play",
5707  anticipatePin: 0
5708},
5709    _keywords = {
5710  top: 0,
5711  left: 0,
5712  center: 0.5,
5713  bottom: 1,
5714  right: 1
5715},
5716    _offsetToPx = function _offsetToPx(value, size) {
5717  if (_isString(value)) {
5718    var eqIndex = value.indexOf("="),
5719        relative = ~eqIndex ? +(value.charAt(eqIndex - 1) + 1) * parseFloat(value.substr(eqIndex + 1)) : 0;
5720
5721    if (~eqIndex) {
5722      value.indexOf("%") > eqIndex && (relative *= size / 100);
5723      value = value.substr(0, eqIndex - 1);
5724    }
5725
5726    value = relative + (value in _keywords ? _keywords[value] * size : ~value.indexOf("%") ? parseFloat(value) * size / 100 : parseFloat(value) || 0);
5727  }
5728
5729  return value;
5730},
5731    _createMarker = function _createMarker(type, name, container, direction, _ref4, offset, matchWidthEl, containerAnimation) {
5732  var startColor = _ref4.startColor,
5733      endColor = _ref4.endColor,
5734      fontSize = _ref4.fontSize,
5735      indent = _ref4.indent,
5736      fontWeight = _ref4.fontWeight;
5737
5738  var e = _doc.createElement("div"),
5739      useFixedPosition = _isViewport(container) || (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(container, "pinType") === "fixed",
5740      isScroller = type.indexOf("scroller") !== -1,
5741      parent = useFixedPosition ? _body : container.tagName === "IFRAME" ? container.contentDocument.body : container,
5742      isStart = type.indexOf("start") !== -1,
5743      color = isStart ? startColor : endColor,
5744      css = "border-color:" + color + ";font-size:" + fontSize + ";color:" + color + ";font-weight:" + fontWeight + ";pointer-events:none;white-space:nowrap;font-family:sans-serif,Arial;z-index:1000;padding:4px 8px;border-width:0;border-style:solid;";
5745
5746  css += "position:" + ((isScroller || containerAnimation) && useFixedPosition ? "fixed;" : "absolute;");
5747  (isScroller || containerAnimation || !useFixedPosition) && (css += (direction === _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical ? _right : _bottom) + ":" + (offset + parseFloat(indent)) + "px;");
5748  matchWidthEl && (css += "box-sizing:border-box;text-align:left;
vendor: 12,135 bytes, lines 5748-6043
5748width:" + matchWidthEl.offsetWidth + "px;");
5749  e._isStart = isStart;
5750  e.setAttribute("class", "gsap-marker-" + type + (name ? " marker-" + name : ""));
5751  e.style.cssText = css;
5752  e.innerText = name || name === 0 ? type + "-" + name : type;
5753  parent.children[0] ? parent.insertBefore(e, parent.children[0]) : parent.appendChild(e);
5754  e._offset = e["offset" + direction.op.d2];
5755
5756  _positionMarker(e, 0, direction, isStart);
5757
5758  return e;
5759},
5760    _positionMarker = function _positionMarker(marker, start, direction, flipped) {
5761  var vars = {
5762    display: "block"
5763  },
5764      side = direction[flipped ? "os2" : "p2"],
5765      oppositeSide = direction[flipped ? "p2" : "os2"];
5766  marker._isFlipped = flipped;
5767  vars[direction.a + "Percent"] = flipped ? -100 : 0;
5768  vars[direction.a] = flipped ? "1px" : 0;
5769  vars["border" + side + _Width] = 1;
5770  vars["border" + oppositeSide + _Width] = 0;
5771  vars[direction.p] = start + "px";
5772  gsap.set(marker, vars);
5773},
5774    _triggers = [],
5775    _ids = {},
5776    _rafID,
5777    _sync = function _sync() {
5778  return _getTime() - _lastScrollTime > 34 && (_rafID || (_rafID = requestAnimationFrame(_updateAll)));
5779},
5780    _onScroll = function _onScroll() {
5781  // previously, we tried to optimize performance by batching/deferring to the next requestAnimationFrame(), but discovered that Safari has a few bugs that make this unworkable (especially on iOS). See https://codepen.io/GreenSock/pen/16c435b12ef09c38125204818e7b45fc?editors=0010 and https://codepen.io/GreenSock/pen/JjOxYpQ/3dd65ccec5a60f1d862c355d84d14562?editors=0010 and https://codepen.io/GreenSock/pen/ExbrPNa/087cef197dc35445a0951e8935c41503?editors=0010
5782  if (!_normalizer || !_normalizer.isPressed || _normalizer.startX > _body.clientWidth) {
5783    // if the user is dragging the scrollbar, allow it.
5784    _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++;
5785
5786    if (_normalizer) {
5787      _rafID || (_rafID = requestAnimationFrame(_updateAll));
5788    } else {
5789      _updateAll(); // Safari in particular (on desktop) NEEDS the immediate update rather than waiting for a requestAnimationFrame() whereas iOS seems to benefit from waiting for the requestAnimationFrame() tick, at least when normalizing. See https://codepen.io/GreenSock/pen/qBYozqO?editors=0110
5790
5791    }
5792
5793    _lastScrollTime || _dispatch("scrollStart");
5794    _lastScrollTime = _getTime();
5795  }
5796},
5797    _setBaseDimensions = function _setBaseDimensions() {
5798  _baseScreenWidth = _win.innerWidth;
5799  _baseScreenHeight = _win.innerHeight;
5800},
5801    _onResize = function _onResize(force) {
5802  _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++;
5803  (force === true || !_refreshing && !_ignoreResize && !_doc.fullscreenElement && !_doc.webkitFullscreenElement && (!_ignoreMobileResize || _baseScreenWidth !== _win.innerWidth || Math.abs(_win.innerHeight - _baseScreenHeight) > _win.innerHeight * 0.25)) && _resizeDelay.restart(true);
5804},
5805    // ignore resizes triggered by refresh()
5806_listeners = {},
5807    _emptyArray = [],
5808    _softRefresh = function _softRefresh() {
5809  return _removeListener(ScrollTrigger, "scrollEnd", _softRefresh) || _refreshAll(true);
5810},
5811    _dispatch = function _dispatch(type) {
5812  return _listeners[type] && _listeners[type].map(function (f) {
5813    return f();
5814  }) || _emptyArray;
5815},
5816    _savedStyles = [],
5817    // when ScrollTrigger.saveStyles() is called, the inline styles are recorded in this Array in a sequential format like [element, cssText, gsCache, media]. This keeps it very memory-efficient and fast to iterate through.
5818_revertRecorded = function _revertRecorded(media) {
5819  for (var i = 0; i < _savedStyles.length; i += 5) {
5820    if (!media || _savedStyles[i + 4] && _savedStyles[i + 4].query === media) {
5821      _savedStyles[i].style.cssText = _savedStyles[i + 1];
5822      _savedStyles[i].getBBox && _savedStyles[i].setAttribute("transform", _savedStyles[i + 2] || "");
5823      _savedStyles[i + 3].uncache = 1;
5824    }
5825  }
5826},
5827    _recordScrollPositions = function _recordScrollPositions() {
5828  return _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (obj) {
5829    return _isFunction(obj) && ++obj.cacheID && (obj.rec = obj());
5830  });
5831},
5832    // record the current scroll position. Also force the clearing of the cache because some browsers take a little while to dispatch the "scroll" event and the user may have changed the scroll position and then called ScrollTrigger.refresh() right away
5833_revertAll = function _revertAll(kill, media) {
5834  var trigger;
5835
5836  for (_i = 0; _i < _triggers.length; _i++) {
5837    trigger = _triggers[_i];
5838
5839    if (trigger && (!media || trigger._ctx === media)) {
5840      if (kill) {
5841        trigger.kill(1);
5842      } else {
5843        trigger.revert(true, true);
5844      }
5845    }
5846  }
5847
5848  _isReverted = true;
5849  media && _revertRecorded(media);
5850  media || _dispatch("revert");
5851},
5852    _clearScrollMemory = function _clearScrollMemory(scrollRestoration, force) {
5853  // zero-out all the recorded scroll positions. Don't use _triggers because if, for example, .matchMedia() is used to create some ScrollTriggers and then the user resizes and it removes ALL ScrollTriggers, and then go back to a size where there are ScrollTriggers, it would have kept the position(s) saved from the initial state.
5854  _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++;
5855  (force || !_refreshingAll) && _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (obj) {
5856    return _isFunction(obj) && obj.cacheID++ && (obj.rec = 0);
5857  });
5858  _isString(scrollRestoration) && (_win.history.scrollRestoration = _scrollRestoration = scrollRestoration);
5859},
5860    _refreshingAll,
5861    _refreshID = 0,
5862    _queueRefreshID,
5863    _queueRefreshAll = function _queueRefreshAll() {
5864  // we don't want to call _refreshAll() every time we create a new ScrollTrigger (for performance reasons) - it's better to batch them. Some frameworks dynamically load content and we can't rely on the window's "load" or "DOMContentLoaded" events to trigger it.
5865  if (_queueRefreshID !== _refreshID) {
5866    var id = _queueRefreshID = _refreshID;
5867    requestAnimationFrame(function () {
5868      return id === _refreshID && _refreshAll(true);
5869    });
5870  }
5871},
5872    _refresh100vh = function _refresh100vh() {
5873  _body.appendChild(_div100vh);
5874
5875  _100vh = !_normalizer && _div100vh.offsetHeight || _win.innerHeight;
5876
5877  _body.removeChild(_div100vh);
5878},
5879    _hideAllMarkers = function _hideAllMarkers(hide) {
5880  return _toArray(".gsap-marker-start, .gsap-marker-end, .gsap-marker-scroller-start, .gsap-marker-scroller-end").forEach(function (el) {
5881    return el.style.display = hide ? "none" : "block";
5882  });
5883},
5884    _refreshAll = function _refreshAll(force, skipRevert) {
5885  _docEl = _doc.documentElement; // some frameworks like Astro may cache the <body> and replace it during routing, so we'll just re-record the _docEl and _body for safety (otherwise, the markers may not get added properly).
5886
5887  _body = _doc.body;
5888  _root = [_win, _doc, _docEl, _body];
5889
5890  if (_lastScrollTime && !force && !_isReverted) {
5891    _addListener(ScrollTrigger, "scrollEnd", _softRefresh);
5892
5893    return;
5894  }
5895
5896  _refresh100vh();
5897
5898  _refreshingAll = ScrollTrigger.isRefreshing = true;
5899  _isReverted || _recordScrollPositions();
5900
5901  var refreshInits = _dispatch("refreshInit");
5902
5903  _sort && ScrollTrigger.sort();
5904  skipRevert || _revertAll();
5905
5906  _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (obj) {
5907    if (_isFunction(obj)) {
5908      obj.smooth && (obj.target.style.scrollBehavior = "auto"); // smooth scrolling interferes
5909
5910      obj(0);
5911    }
5912  });
5913
5914  _triggers.slice(0).forEach(function (t) {
5915    return t.refresh();
5916  }); // don't loop with _i because during a refresh() someone could call ScrollTrigger.update() which would iterate through _i resulting in a skip.
5917
5918
5919  _isReverted = false;
5920
5921  _triggers.forEach(function (t) {
5922    // nested pins (pinnedContainer) with pinSpacing may expand the container, so we must accommodate that here.
5923    if (t._subPinOffset && t.pin) {
5924      var prop = t.vars.horizontal ? "offsetWidth" : "offsetHeight",
5925          original = t.pin[prop];
5926      t.revert(true, 1);
5927      t.adjustPinSpacing(t.pin[prop] - original);
5928      t.refresh();
5929    }
5930  });
5931
5932  _clampingMax = 1; // pinSpacing might be propping a page open, thus when we .setPositions() to clamp a ScrollTrigger's end we should leave the pinSpacing alone. That's what this flag is for.
5933
5934  _hideAllMarkers(true);
5935
5936  _triggers.forEach(function (t) {
5937    // the scroller's max scroll position may change after all the ScrollTriggers refreshed (like pinning could push it down), so we need to loop back and correct any with end: "max". Same for anything with a clamped end
5938    var max = _maxScroll(t.scroller, t._dir),
5939        endClamp = t.vars.end === "max" || t._endClamp && t.end > max,
5940        startClamp = t._startClamp && t.start >= max;
5941
5942    (endClamp || startClamp) && t.setPositions(startClamp ? max - 1 : t.start, endClamp ? Math.max(startClamp ? max : t.start + 1, max) : t.end, true);
5943  });
5944
5945  _hideAllMarkers(false);
5946
5947  _clampingMax = 0;
5948  refreshInits.forEach(function (result) {
5949    return result && result.render && result.render(-1);
5950  }); // if the onRefreshInit() returns an animation (typically a gsap.set()), revert it. This makes it easy to put things in a certain spot before refreshing for measurement purposes, and then put things back.
5951
5952  _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (obj) {
5953    if (_isFunction(obj)) {
5954      obj.smooth && requestAnimationFrame(function () {
5955        return obj.target.style.scrollBehavior = "smooth";
5956      });
5957      obj.rec && obj(obj.rec);
5958    }
5959  });
5960
5961  _clearScrollMemory(_scrollRestoration, 1);
5962
5963  _resizeDelay.pause();
5964
5965  _refreshID++;
5966  _refreshingAll = 2;
5967
5968  _updateAll(2);
5969
5970  _triggers.forEach(function (t) {
5971    return _isFunction(t.vars.onRefresh) && t.vars.onRefresh(t);
5972  });
5973
5974  _refreshingAll = ScrollTrigger.isRefreshing = false;
5975
5976  _dispatch("refresh");
5977},
5978    _lastScroll = 0,
5979    _direction = 1,
5980    _primary,
5981    _updateAll = function _updateAll(force) {
5982  if (force === 2 || !_refreshingAll && !_isReverted) {
5983    // _isReverted could be true if, for example, a matchMedia() is in the process of executing. We don't want to update during the time everything is reverted.
5984    ScrollTrigger.isUpdating = true;
5985    _primary && _primary.update(0); // ScrollSmoother uses refreshPriority -9999 to become the primary that gets updated before all others because it affects the scroll position.
5986
5987    var l = _triggers.length,
5988        time = _getTime(),
5989        recordVelocity = time - _time1 >= 50,
5990        scroll = l && _triggers[0].scroll();
5991
5992    _direction = _lastScroll > scroll ? -1 : 1;
5993    _refreshingAll || (_lastScroll = scroll);
5994
5995    if (recordVelocity) {
5996      if (_lastScrollTime && !_pointerIsDown && time - _lastScrollTime > 200) {
5997        _lastScrollTime = 0;
5998
5999        _dispatch("scrollEnd");
6000      }
6001
6002      _time2 = _time1;
6003      _time1 = time;
6004    }
6005
6006    if (_direction < 0) {
6007      _i = l;
6008
6009      while (_i-- > 0) {
6010        _triggers[_i] && _triggers[_i].update(0, recordVelocity);
6011      }
6012
6013      _direction = 1;
6014    } else {
6015      for (_i = 0; _i < l; _i++) {
6016        _triggers[_i] && _triggers[_i].update(0, recordVelocity);
6017      }
6018    }
6019
6020    ScrollTrigger.isUpdating = false;
6021  }
6022
6023  _rafID = 0;
6024},
6025    _propNamesToCopy = [_left, _top, _bottom, _right, _margin + _Bottom, _margin + _Right, _margin + _Top, _margin + _Left, "display", "flexShrink", "float", "zIndex", "gridColumnStart", "gridColumnEnd", "gridRowStart", "gridRowEnd", "gridArea", "justifySelf", "alignSelf", "placeSelf", "order"],
6026    _stateProps = _propNamesToCopy.concat([_width, _height, "boxSizing", "max" + _Width, "max" + _Height, "position", _margin, _padding, _padding + _Top, _padding + _Right, _padding + _Bottom, _padding + _Left]),
6027    _swapPinOut = function _swapPinOut(pin, spacer, state) {
6028  _setState(state);
6029
6030  var cache = pin._gsap;
6031
6032  if (cache.spacerIsNative) {
6033    _setState(cache.spacerState);
6034  } else if (pin._gsap.swappedIn) {
6035    var parent = spacer.parentNode;
6036
6037    if (parent) {
6038      parent.insertBefore(pin, spacer);
6039      parent.removeChild(spacer);
6040    }
6041  }
6042
6043  pin._gsap.swappedIn = false;
vendor: 9,748 bytes, lines 6044-6276
6044},
6045    _swapPinIn = function _swapPinIn(pin, spacer, cs, spacerState) {
6046  if (!pin._gsap.swappedIn) {
6047    var i = _propNamesToCopy.length,
6048        spacerStyle = spacer.style,
6049        pinStyle = pin.style,
6050        p;
6051
6052    while (i--) {
6053      p = _propNamesToCopy[i];
6054      spacerStyle[p] = cs[p];
6055    }
6056
6057    spacerStyle.position = cs.position === "absolute" ? "absolute" : "relative";
6058    cs.display === "inline" && (spacerStyle.display = "inline-block");
6059    pinStyle[_bottom] = pinStyle[_right] = "auto";
6060    spacerStyle.flexBasis = cs.flexBasis || "auto";
6061    spacerStyle.overflow = "visible";
6062    spacerStyle.boxSizing = "border-box";
6063    spacerStyle[_width] = _getSize(pin, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal) + _px;
6064    spacerStyle[_height] = _getSize(pin, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical) + _px;
6065    spacerStyle[_padding] = pinStyle[_margin] = pinStyle[_top] = pinStyle[_left] = "0";
6066
6067    _setState(spacerState);
6068
6069    pinStyle[_width] = pinStyle["max" + _Width] = cs[_width];
6070    pinStyle[_height] = pinStyle["max" + _Height] = cs[_height];
6071    pinStyle[_padding] = cs[_padding];
6072
6073    if (pin.parentNode !== spacer) {
6074      pin.parentNode.insertBefore(spacer, pin);
6075      spacer.appendChild(pin);
6076    }
6077
6078    pin._gsap.swappedIn = true;
6079  }
6080},
6081    _capsExp = /([A-Z])/g,
6082    _setState = function _setState(state) {
6083  if (state) {
6084    var style = state.t.style,
6085        l = state.length,
6086        i = 0,
6087        p,
6088        value;
6089    (state.t._gsap || gsap.core.getCache(state.t)).uncache = 1; // otherwise transforms may be off
6090
6091    for (; i < l; i += 2) {
6092      value = state[i + 1];
6093      p = state[i];
6094
6095      if (value) {
6096        style[p] = value;
6097      } else if (style[p]) {
6098        style.removeProperty(p.replace(_capsExp, "-$1").toLowerCase());
6099      }
6100    }
6101  }
6102},
6103    _getState = function _getState(element) {
6104  // returns an Array with alternating values like [property, value, property, value] and a "t" property pointing to the target (element). Makes it fast and cheap.
6105  var l = _stateProps.length,
6106      style = element.style,
6107      state = [],
6108      i = 0;
6109
6110  for (; i < l; i++) {
6111    state.push(_stateProps[i], style[_stateProps[i]]);
6112  }
6113
6114  state.t = element;
6115  return state;
6116},
6117    _copyState = function _copyState(state, override, omitOffsets) {
6118  var result = [],
6119      l = state.length,
6120      i = omitOffsets ? 8 : 0,
6121      // skip top, left, right, bottom if omitOffsets is true
6122  p;
6123
6124  for (; i < l; i += 2) {
6125    p = state[i];
6126    result.push(p, p in override ? override[p] : state[i + 1]);
6127  }
6128
6129  result.t = state.t;
6130  return result;
6131},
6132    _winOffsets = {
6133  left: 0,
6134  top: 0
6135},
6136    // // potential future feature (?) Allow users to calculate where a trigger hits (scroll position) like getScrollPosition("#id", "top bottom")
6137// _getScrollPosition = (trigger, position, {scroller, containerAnimation, horizontal}) => {
6138// 	scroller = _getTarget(scroller || _win);
6139// 	let direction = horizontal ? _horizontal : _vertical,
6140// 		isViewport = _isViewport(scroller);
6141// 	_getSizeFunc(scroller, isViewport, direction);
6142// 	return _parsePosition(position, _getTarget(trigger), _getSizeFunc(scroller, isViewport, direction)(), direction, _getScrollFunc(scroller, direction)(), 0, 0, 0, _getOffsetsFunc(scroller, isViewport)(), isViewport ? 0 : parseFloat(_getComputedStyle(scroller)["border" + direction.p2 + _Width]) || 0, 0, containerAnimation ? containerAnimation.duration() : _maxScroll(scroller), containerAnimation);
6143// },
6144_parsePosition = function _parsePosition(value, trigger, scrollerSize, direction, scroll, marker, markerScroller, self, scrollerBounds, borderWidth, useFixedPosition, scrollerMax, containerAnimation, clampZeroProp) {
6145  _isFunction(value) && (value = value(self));
6146
6147  if (_isString(value) && value.substr(0, 3) === "max") {
6148    value = scrollerMax + (value.charAt(4) === "=" ? _offsetToPx("0" + value.substr(3), scrollerSize) : 0);
6149  }
6150
6151  var time = containerAnimation ? containerAnimation.time() : 0,
6152      p1,
6153      p2,
6154      element;
6155  containerAnimation && containerAnimation.seek(0);
6156  isNaN(value) || (value = +value); // convert a string number like "45" to an actual number
6157
6158  if (!_isNumber(value)) {
6159    _isFunction(trigger) && (trigger = trigger(self));
6160    var offsets = (value || "0").split(" "),
6161        bounds,
6162        localOffset,
6163        globalOffset,
6164        display;
6165    element = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(trigger, self) || _body;
6166    bounds = _getBounds(element) || {};
6167
6168    if ((!bounds || !bounds.left && !bounds.top) && _getComputedStyle(element).display === "none") {
6169      // if display is "none", it won't report getBoundingClientRect() properly
6170      display = element.style.display;
6171      element.style.display = "block";
6172      bounds = _getBounds(element);
6173      display ? element.style.display = display : element.style.removeProperty("display");
6174    }
6175
6176    localOffset = _offsetToPx(offsets[0], bounds[direction.d]);
6177    globalOffset = _offsetToPx(offsets[1] || "0", scrollerSize);
6178    value = bounds[direction.p] - scrollerBounds[direction.p] - borderWidth + localOffset + scroll - globalOffset;
6179    markerScroller && _positionMarker(markerScroller, globalOffset, direction, scrollerSize - globalOffset < 20 || markerScroller._isStart && globalOffset > 20);
6180    scrollerSize -= scrollerSize - globalOffset; // adjust for the marker
6181  } else {
6182    containerAnimation && (value = gsap.utils.mapRange(containerAnimation.scrollTrigger.start, containerAnimation.scrollTrigger.end, 0, scrollerMax, value));
6183    markerScroller && _positionMarker(markerScroller, scrollerSize, direction, true);
6184  }
6185
6186  if (clampZeroProp) {
6187    self[clampZeroProp] = value || -0.001;
6188    value < 0 && (value = 0);
6189  }
6190
6191  if (marker) {
6192    var position = value + scrollerSize,
6193        isStart = marker._isStart;
6194    p1 = "scroll" + direction.d2;
6195
6196    _positionMarker(marker, position, direction, isStart && position > 20 || !isStart && (useFixedPosition ? Math.max(_body[p1], _docEl[p1]) : marker.parentNode[p1]) <= position + 1);
6197
6198    if (useFixedPosition) {
6199      scrollerBounds = _getBounds(markerScroller);
6200      useFixedPosition && (marker.style[direction.op.p] = scrollerBounds[direction.op.p] - direction.op.m - marker._offset + _px);
6201    }
6202  }
6203
6204  if (containerAnimation && element) {
6205    p1 = _getBounds(element);
6206    containerAnimation.seek(scrollerMax);
6207    p2 = _getBounds(element);
6208    containerAnimation._caScrollDist = p1[direction.p] - p2[direction.p];
6209    value = value / containerAnimation._caScrollDist * scrollerMax;
6210  }
6211
6212  containerAnimation && containerAnimation.seek(time);
6213  return containerAnimation ? value : Math.round(value);
6214},
6215    _prefixExp = /(webkit|moz|length|cssText|inset)/i,
6216    _reparent = function _reparent(element, parent, top, left) {
6217  if (element.parentNode !== parent) {
6218    var style = element.style,
6219        p,
6220        cs;
6221
6222    if (parent === _body) {
6223      element._stOrig = style.cssText; // record original inline styles so we can revert them later
6224
6225      cs = _getComputedStyle(element);
6226
6227      for (p in cs) {
6228        // must copy all relevant styles to ensure that nothing changes visually when we reparent to the <body>. Skip the vendor prefixed ones.
6229        if (!+p && !_prefixExp.test(p) && cs[p] && typeof style[p] === "string" && p !== "0") {
6230          style[p] = cs[p];
6231        }
6232      }
6233
6234      style.top = top;
6235      style.left = left;
6236    } else {
6237      style.cssText = element._stOrig;
6238    }
6239
6240    gsap.core.getCache(element).uncache = 1;
6241    parent.appendChild(element);
6242  }
6243},
6244    _interruptionTracker = function _interruptionTracker(getValueFunc, initialValue, onInterrupt) {
6245  var last1 = initialValue,
6246      last2 = last1;
6247  return function (value) {
6248    var current = Math.round(getValueFunc()); // round because in some [very uncommon] Windows environments, scroll can get reported with decimals even though it was set without.
6249
6250    if (current !== last1 && current !== last2 && Math.abs(current - last1) > 3 && Math.abs(current - last2) > 3) {
6251      // if the user scrolls, kill the tween. iOS Safari intermittently misreports the scroll position, it may be the most recently-set one or the one before that! When Safari is zoomed (CMD-+), it often misreports as 1 pixel off too! So if we set the scroll position to 125, for example, it'll actually report it as 124.
6252      value = current;
6253      onInterrupt && onInterrupt();
6254    }
6255
6256    last2 = last1;
6257    last1 = Math.round(value);
6258    return last1;
6259  };
6260},
6261    _shiftMarker = function _shiftMarker(marker, direction, value) {
6262  var vars = {};
6263  vars[direction.p] = "+=" + value;
6264  gsap.set(marker, vars);
6265},
6266    // _mergeAnimations = animations => {
6267// 	let tl = gsap.timeline({smoothChildTiming: true}).startTime(Math.min(...animations.map(a => a.globalTime(0))));
6268// 	animations.forEach(a => {let time = a.totalTime(); tl.add(a); a.totalTime(time); });
6269// 	tl.smoothChildTiming = false;
6270// 	return tl;
6271// },
6272// returns a function that can be used to tween the scroll position in the direction provided, and when doing so it'll add a .tween property to the FUNCTION itself, and remove it when the tween completes or gets killed. This gives us a way to have multiple ScrollTriggers use a central function for any given scroller and see if there's a scroll tween running (which would affect if/how things get updated)
6273_getTweenCreator = function _getTweenCreator(scroller, direction) {
6274  var getScroll = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(scroller, direction),
6275      prop = "_scroll" + direction.p2,
6276      // add a tweenable property to the scroller that's a getter/setter function, like _scrollTop or _scrollLeft. This way, if someone does gsap.killTweensOf(scroller) it'll 
vendor: 4,505 bytes, lines 6276-6385
6276kill the scroll tween.
6277  getTween = function getTween(scrollTo, vars, initialValue, change1, change2) {
6278    var tween = getTween.tween,
6279        onComplete = vars.onComplete,
6280        modifiers = {};
6281    initialValue = initialValue || getScroll();
6282
6283    var checkForInterruption = _interruptionTracker(getScroll, initialValue, function () {
6284      tween.kill();
6285      getTween.tween = 0;
6286    });
6287
6288    change2 = change1 && change2 || 0; // if change1 is 0, we set that to the difference and ignore change2. Otherwise, there would be a compound effect.
6289
6290    change1 = change1 || scrollTo - initialValue;
6291    tween && tween.kill();
6292    vars[prop] = scrollTo;
6293    vars.inherit = false;
6294    vars.modifiers = modifiers;
6295
6296    modifiers[prop] = function () {
6297      return checkForInterruption(initialValue + change1 * tween.ratio + change2 * tween.ratio * tween.ratio);
6298    };
6299
6300    vars.onUpdate = function () {
6301      _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++;
6302      getTween.tween && _updateAll(); // if it was interrupted/killed, like in a context.revert(), don't force an updateAll()
6303    };
6304
6305    vars.onComplete = function () {
6306      getTween.tween = 0;
6307      onComplete && onComplete.call(tween);
6308    };
6309
6310    tween = getTween.tween = gsap.to(scroller, vars);
6311    return tween;
6312  };
6313
6314  scroller[prop] = getScroll;
6315
6316  getScroll.wheelHandler = function () {
6317    return getTween.tween && getTween.tween.kill() && (getTween.tween = 0);
6318  };
6319
6320  _addListener(scroller, "wheel", getScroll.wheelHandler); // Windows machines handle mousewheel scrolling in chunks (like "3 lines per scroll") meaning the typical strategy for cancelling the scroll isn't as sensitive. It's much more likely to match one of the previous 2 scroll event positions. So we kill any snapping as soon as there's a wheel event.
6321
6322
6323  ScrollTrigger.isTouch && _addListener(scroller, "touchmove", getScroll.wheelHandler);
6324  return getTween;
6325};
6326
6327var ScrollTrigger = /*#__PURE__*/function () {
6328  function ScrollTrigger(vars, animation) {
6329    _coreInitted || ScrollTrigger.register(gsap) || console.warn("Please gsap.registerPlugin(ScrollTrigger)");
6330
6331    _context(this);
6332
6333    this.init(vars, animation);
6334  }
6335
6336  var _proto = ScrollTrigger.prototype;
6337
6338  _proto.init = function init(vars, animation) {
6339    this.progress = this.start = 0;
6340    this.vars && this.kill(true, true); // in case it's being initted again
6341
6342    if (!_enabled) {
6343      this.update = this.refresh = this.kill = _passThrough;
6344      return;
6345    }
6346
6347    vars = _setDefaults(_isString(vars) || _isNumber(vars) || vars.nodeType ? {
6348      trigger: vars
6349    } : vars, _defaults);
6350
6351    var _vars = vars,
6352        onUpdate = _vars.onUpdate,
6353        toggleClass = _vars.toggleClass,
6354        id = _vars.id,
6355        onToggle = _vars.onToggle,
6356        onRefresh = _vars.onRefresh,
6357        scrub = _vars.scrub,
6358        trigger = _vars.trigger,
6359        pin = _vars.pin,
6360        pinSpacing = _vars.pinSpacing,
6361        invalidateOnRefresh = _vars.invalidateOnRefresh,
6362        anticipatePin = _vars.anticipatePin,
6363        onScrubComplete = _vars.onScrubComplete,
6364        onSnapComplete = _vars.onSnapComplete,
6365        once = _vars.once,
6366        snap = _vars.snap,
6367        pinReparent = _vars.pinReparent,
6368        pinSpacer = _vars.pinSpacer,
6369        containerAnimation = _vars.containerAnimation,
6370        fastScrollEnd = _vars.fastScrollEnd,
6371        preventOverlaps = _vars.preventOverlaps,
6372        direction = vars.horizontal || vars.containerAnimation && vars.horizontal !== false ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal : _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical,
6373        isToggle = !scrub && scrub !== 0,
6374        scroller = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(vars.scroller || _win),
6375        scrollerCache = gsap.core.getCache(scroller),
6376        isViewport = _isViewport(scroller),
6377        useFixedPosition = ("pinType" in vars ? vars.pinType : (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(scroller, "pinType") || isViewport && "fixed") === "fixed",
6378        callbacks = [vars.onEnter, vars.onLeave, vars.onEnterBack, vars.onLeaveBack],
6379        toggleActions = isToggle && vars.toggleActions.split(" "),
6380        markers = "markers" in vars ? vars.markers : _defaults.markers,
6381        borderWidth = isViewport ? 0 : parseFloat(_getComputedStyle(scroller)["border" + direction.p2 + _Width]) || 0,
6382        self = this,
6383        onRefreshInit = vars.onRefreshInit && function () {
6384      return vars.onRefreshInit(self);
6385    },
vendor: 7,186 bytes, lines 6386-6545
6386        getScrollerSize = _getSizeFunc(scroller, isViewport, direction),
6387        getScrollerOffsets = _getOffsetsFunc(scroller, isViewport),
6388        lastSnap = 0,
6389        lastRefresh = 0,
6390        prevProgress = 0,
6391        scrollFunc = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(scroller, direction),
6392        tweenTo,
6393        pinCache,
6394        snapFunc,
6395        scroll1,
6396        scroll2,
6397        start,
6398        end,
6399        markerStart,
6400        markerEnd,
6401        markerStartTrigger,
6402        markerEndTrigger,
6403        markerVars,
6404        executingOnRefresh,
6405        change,
6406        pinOriginalState,
6407        pinActiveState,
6408        pinState,
6409        spacer,
6410        offset,
6411        pinGetter,
6412        pinSetter,
6413        pinStart,
6414        pinChange,
6415        spacingStart,
6416        spacerState,
6417        markerStartSetter,
6418        pinMoves,
6419        markerEndSetter,
6420        cs,
6421        snap1,
6422        snap2,
6423        scrubTween,
6424        scrubSmooth,
6425        snapDurClamp,
6426        snapDelayedCall,
6427        prevScroll,
6428        prevAnimProgress,
6429        caMarkerSetter,
6430        customRevertReturn; // for the sake of efficiency, _startClamp/_endClamp serve like a truthy value indicating that clamping was enabled on the start/end, and ALSO store the actual pre-clamped numeric value. We tap into that in ScrollSmoother for speed effects. So for example, if start="clamp(top bottom)" results in a start of -100 naturally, it would get clamped to 0 but -100 would be stored in _startClamp.
6431
6432
6433    self._startClamp = self._endClamp = false;
6434    self._dir = direction;
6435    anticipatePin *= 45;
6436    self.scroller = scroller;
6437    self.scroll = containerAnimation ? containerAnimation.time.bind(containerAnimation) : scrollFunc;
6438    scroll1 = scrollFunc();
6439    self.vars = vars;
6440    animation = animation || vars.animation;
6441
6442    if ("refreshPriority" in vars) {
6443      _sort = 1;
6444      vars.refreshPriority === -9999 && (_primary = self); // used by ScrollSmoother
6445    }
6446
6447    scrollerCache.tweenScroll = scrollerCache.tweenScroll || {
6448      top: _getTweenCreator(scroller, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical),
6449      left: _getTweenCreator(scroller, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal)
6450    };
6451    self.tweenTo = tweenTo = scrollerCache.tweenScroll[direction.p];
6452
6453    self.scrubDuration = function (value) {
6454      scrubSmooth = _isNumber(value) && value;
6455
6456      if (!scrubSmooth) {
6457        scrubTween && scrubTween.progress(1).kill();
6458        scrubTween = 0;
6459      } else {
6460        scrubTween ? scrubTween.duration(value) : scrubTween = gsap.to(animation, {
6461          ease: "expo",
6462          totalProgress: "+=0",
6463          inherit: false,
6464          duration: scrubSmooth,
6465          paused: true,
6466          onComplete: function onComplete() {
6467            return onScrubComplete && onScrubComplete(self);
6468          }
6469        });
6470      }
6471    };
6472
6473    if (animation) {
6474      animation.vars.lazy = false;
6475      animation._initted && !self.isReverted || animation.vars.immediateRender !== false && vars.immediateRender !== false && animation.duration() && animation.render(0, true, true); // special case: if this ScrollTrigger gets re-initted, a from() tween with a stagger could get initted initially and then reverted on the re-init which means it'll need to get rendered again here to properly display things. Otherwise, See https://gsap.com/forums/topic/36777-scrollsmoother-splittext-nextjs/ and https://codepen.io/GreenSock/pen/eYPyPpd?editors=0010
6476
6477      self.animation = animation.pause();
6478      animation.scrollTrigger = self;
6479      self.scrubDuration(scrub);
6480      snap1 = 0;
6481      id || (id = animation.vars.id);
6482    }
6483
6484    if (snap) {
6485      // TODO: potential idea: use legitimate CSS scroll snapping by pushing invisible elements into the DOM that serve as snap positions, and toggle the document.scrollingElement.style.scrollSnapType onToggle. See https://codepen.io/GreenSock/pen/JjLrgWM for a quick proof of concept.
6486      if (!_isObject(snap) || snap.push) {
6487        snap = {
6488          snapTo: snap
6489        };
6490      }
6491
6492      "scrollBehavior" in _body.style && gsap.set(isViewport ? [_body, _docEl] : scroller, {
6493        scrollBehavior: "auto"
6494      }); // smooth scrolling doesn't work with snap.
6495
6496      _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (o) {
6497        return _isFunction(o) && o.target === (isViewport ? _doc.scrollingElement || _docEl : scroller) && (o.smooth = false);
6498      }); // note: set smooth to false on both the vertical and horizontal scroll getters/setters
6499
6500
6501      snapFunc = _isFunction(snap.snapTo) ? snap.snapTo : snap.snapTo === "labels" ? _getClosestLabel(animation) : snap.snapTo === "labelsDirectional" ? _getLabelAtDirection(animation) : snap.directional !== false ? function (value, st) {
6502        return _snapDirectional(snap.snapTo)(value, _getTime() - lastRefresh < 500 ? 0 : st.direction);
6503      } : gsap.utils.snap(snap.snapTo);
6504      snapDurClamp = snap.duration || {
6505        min: 0.1,
6506        max: 2
6507      };
6508      snapDurClamp = _isObject(snapDurClamp) ? _clamp(snapDurClamp.min, snapDurClamp.max) : _clamp(snapDurClamp, snapDurClamp);
6509      snapDelayedCall = gsap.delayedCall(snap.delay || scrubSmooth / 2 || 0.1, function () {
6510        var scroll = scrollFunc(),
6511            refreshedRecently = _getTime() - lastRefresh < 500,
6512            tween = tweenTo.tween;
6513
6514        if ((refreshedRecently || Math.abs(self.getVelocity()) < 10) && !tween && !_pointerIsDown && lastSnap !== scroll) {
6515          var progress = (scroll - start) / change,
6516              totalProgress = animation && !isToggle ? animation.totalProgress() : progress,
6517              velocity = refreshedRecently ? 0 : (totalProgress - snap2) / (_getTime() - _time2) * 1000 || 0,
6518              change1 = gsap.utils.clamp(-progress, 1 - progress, _abs(velocity / 2) * velocity / 0.185),
6519              naturalEnd = progress + (snap.inertia === false ? 0 : change1),
6520              endValue,
6521              endScroll,
6522              _snap = snap,
6523              onStart = _snap.onStart,
6524              _onInterrupt = _snap.onInterrupt,
6525              _onComplete = _snap.onComplete;
6526          endValue = snapFunc(naturalEnd, self);
6527          _isNumber(endValue) || (endValue = naturalEnd); // in case the function didn't return a number, fall back to using the naturalEnd
6528
6529          endScroll = Math.max(0, Math.round(start + endValue * change));
6530
6531          if (scroll <= end && scroll >= start && endScroll !== scroll) {
6532            if (tween && !tween._initted && tween.data <= _abs(endScroll - scroll)) {
6533              // there's an overlapping snap! So we must figure out which one is closer and let that tween live.
6534              return;
6535            }
6536
6537            if (snap.inertia === false) {
6538              change1 = endValue - progress;
6539            }
6540
6541            tweenTo(endScroll, {
6542              duration: snapDurClamp(_abs(Math.max(_abs(naturalEnd - totalProgress), _abs(endValue - totalProgress)) * 0.185 / velocity / 0.05 || 0)),
6543              ease: snap.ease || "power3",
6544              data: _abs(endScroll - scroll),
6545              // record the distance so that if another snap tween occurs (conflict) we 
vendor: 4,285 bytes, lines 6545-6616
6545can prioritize the closest snap.
6546              onInterrupt: function onInterrupt() {
6547                return snapDelayedCall.restart(true) && _onInterrupt && _callback(self, _onInterrupt);
6548              },
6549              onComplete: function onComplete() {
6550                self.update();
6551                lastSnap = scrollFunc();
6552
6553                if (animation && !isToggle) {
6554                  // the resolution of the scrollbar is limited, so we should correct the scrubbed animation's playhead at the end to match EXACTLY where it was supposed to snap
6555                  scrubTween ? scrubTween.resetTo("totalProgress", endValue, animation._tTime / animation._tDur) : animation.progress(endValue);
6556                }
6557
6558                snap1 = snap2 = animation && !isToggle ? animation.totalProgress() : self.progress;
6559                onSnapComplete && onSnapComplete(self);
6560                _onComplete && _callback(self, _onComplete);
6561              }
6562            }, scroll, change1 * change, endScroll - scroll - change1 * change);
6563            onStart && _callback(self, onStart, tweenTo.tween);
6564          }
6565        } else if (self.isActive && lastSnap !== scroll) {
6566          snapDelayedCall.restart(true);
6567        }
6568      }).pause();
6569    }
6570
6571    id && (_ids[id] = self);
6572    trigger = self.trigger = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(trigger || pin !== true && pin); // if a trigger has some kind of scroll-related effect applied that could contaminate the "y" or "x" position (like a ScrollSmoother effect), we needed a way to temporarily revert it, so we use the stRevert property of the gsCache. It can return another function that we'll call at the end so it can return to its normal state.
6573
6574    customRevertReturn = trigger && trigger._gsap && trigger._gsap.stRevert;
6575    customRevertReturn && (customRevertReturn = customRevertReturn(self));
6576    pin = pin === true ? trigger : (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(pin);
6577    _isString(toggleClass) && (toggleClass = {
6578      targets: trigger,
6579      className: toggleClass
6580    });
6581
6582    if (pin) {
6583      pinSpacing === false || pinSpacing === _margin || (pinSpacing = !pinSpacing && pin.parentNode && pin.parentNode.style && _getComputedStyle(pin.parentNode).display === "flex" ? false : _padding); // if the parent is display: flex, don't apply pinSpacing by default. We should check that pin.parentNode is an element (not shadow dom window)
6584
6585      self.pin = pin;
6586      pinCache = gsap.core.getCache(pin);
6587
6588      if (!pinCache.spacer) {
6589        // record the spacer and pinOriginalState on the cache in case someone tries pinning the same element with MULTIPLE ScrollTriggers - we don't want to have multiple spacers or record the "original" pin state after it has already been affected by another ScrollTrigger.
6590        if (pinSpacer) {
6591          pinSpacer = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(pinSpacer);
6592          pinSpacer && !pinSpacer.nodeType && (pinSpacer = pinSpacer.current || pinSpacer.nativeElement); // for React & Angular
6593
6594          pinCache.spacerIsNative = !!pinSpacer;
6595          pinSpacer && (pinCache.spacerState = _getState(pinSpacer));
6596        }
6597
6598        pinCache.spacer = spacer = pinSpacer || _doc.createElement("div");
6599        spacer.classList.add("pin-spacer");
6600        id && spacer.classList.add("pin-spacer-" + id);
6601        pinCache.pinState = pinOriginalState = _getState(pin);
6602      } else {
6603        pinOriginalState = pinCache.pinState;
6604      }
6605
6606      vars.force3D !== false && gsap.set(pin, {
6607        force3D: true
6608      });
6609      self.spacer = spacer = pinCache.spacer;
6610      cs = _getComputedStyle(pin);
6611      spacingStart = cs[pinSpacing + direction.os2];
6612      pinGetter = gsap.getProperty(pin);
6613      pinSetter = gsap.quickSetter(pin, direction.a, _px); // pin.firstChild && !_maxScroll(pin, direction) && (pin.style.overflow = "hidden"); // protects from collapsing margins, but can have unintended consequences as demonstrated here: https://codepen.io/GreenSock/pen/1e42c7a73bfa409d2cf1e184e7a4248d so it was removed in favor of just telling people to set up their CSS to avoid the collapsing margins (overflow: hidden | auto is just one option. Another is border-top: 1px solid transparent).
6614
6615      _swapPinIn(pin, spacer, cs);
6616
vendor: 13,030 bytes, lines 6617-6879
6617      pinState = _getState(pin);
6618    }
6619
6620    if (markers) {
6621      markerVars = _isObject(markers) ? _setDefaults(markers, _markerDefaults) : _markerDefaults;
6622      markerStartTrigger = _createMarker("scroller-start", id, scroller, direction, markerVars, 0);
6623      markerEndTrigger = _createMarker("scroller-end", id, scroller, direction, markerVars, 0, markerStartTrigger);
6624      offset = markerStartTrigger["offset" + direction.op.d2];
6625
6626      var content = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)((0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(scroller, "content") || scroller);
6627
6628      markerStart = this.markerStart = _createMarker("start", id, content, direction, markerVars, offset, 0, containerAnimation);
6629      markerEnd = this.markerEnd = _createMarker("end", id, content, direction, markerVars, offset, 0, containerAnimation);
6630      containerAnimation && (caMarkerSetter = gsap.quickSetter([markerStart, markerEnd], direction.a, _px));
6631
6632      if (!useFixedPosition && !(_Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies.length && (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(scroller, "fixedMarkers") === true)) {
6633        _makePositionable(isViewport ? _body : scroller);
6634
6635        gsap.set([markerStartTrigger, markerEndTrigger], {
6636          force3D: true
6637        });
6638        markerStartSetter = gsap.quickSetter(markerStartTrigger, direction.a, _px);
6639        markerEndSetter = gsap.quickSetter(markerEndTrigger, direction.a, _px);
6640      }
6641    }
6642
6643    if (containerAnimation) {
6644      var oldOnUpdate = containerAnimation.vars.onUpdate,
6645          oldParams = containerAnimation.vars.onUpdateParams;
6646      containerAnimation.eventCallback("onUpdate", function () {
6647        self.update(0, 0, 1);
6648        oldOnUpdate && oldOnUpdate.apply(containerAnimation, oldParams || []);
6649      });
6650    }
6651
6652    self.previous = function () {
6653      return _triggers[_triggers.indexOf(self) - 1];
6654    };
6655
6656    self.next = function () {
6657      return _triggers[_triggers.indexOf(self) + 1];
6658    };
6659
6660    self.revert = function (revert, temp) {
6661      if (!temp) {
6662        return self.kill(true);
6663      } // for compatibility with gsap.context() and gsap.matchMedia() which call revert()
6664
6665
6666      var r = revert !== false || !self.enabled,
6667          prevRefreshing = _refreshing;
6668
6669      if (r !== self.isReverted) {
6670        if (r) {
6671          prevScroll = Math.max(scrollFunc(), self.scroll.rec || 0); // record the scroll so we can revert later (repositioning/pinning things can affect scroll position). In the static refresh() method, we first record all the scroll positions as a reference.
6672
6673          prevProgress = self.progress;
6674          prevAnimProgress = animation && animation.progress();
6675        }
6676
6677        markerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(function (m) {
6678          return m.style.display = r ? "none" : "block";
6679        });
6680
6681        if (r) {
6682          _refreshing = self;
6683          self.update(r); // make sure the pin is back in its original position so that all the measurements are correct. do this BEFORE swapping the pin out
6684        }
6685
6686        if (pin && (!pinReparent || !self.isActive)) {
6687          if (r) {
6688            _swapPinOut(pin, spacer, pinOriginalState);
6689          } else {
6690            _swapPinIn(pin, spacer, _getComputedStyle(pin), spacerState);
6691          }
6692        }
6693
6694        r || self.update(r); // when we're restoring, the update should run AFTER swapping the pin into its pin-spacer.
6695
6696        _refreshing = prevRefreshing; // restore. We set it to true during the update() so that things fire properly in there.
6697
6698        self.isReverted = r;
6699      }
6700    };
6701
6702    self.refresh = function (soft, force, position, pinOffset) {
6703      // position is typically only defined if it's coming from setPositions() - it's a way to skip the normal parsing. pinOffset is also only from setPositions() and is mostly related to fancy stuff we need to do in ScrollSmoother with effects
6704      if ((_refreshing || !self.enabled) && !force) {
6705        return;
6706      }
6707
6708      if (pin && soft && _lastScrollTime) {
6709        _addListener(ScrollTrigger, "scrollEnd", _softRefresh);
6710
6711        return;
6712      }
6713
6714      !_refreshingAll && onRefreshInit && onRefreshInit(self);
6715      _refreshing = self;
6716
6717      if (tweenTo.tween && !position) {
6718        // we skip this if a position is passed in because typically that's from .setPositions() and it's best to allow in-progress snapping to continue.
6719        tweenTo.tween.kill();
6720        tweenTo.tween = 0;
6721      }
6722
6723      scrubTween && scrubTween.pause();
6724
6725      if (invalidateOnRefresh && animation) {
6726        animation.revert({
6727          kill: false
6728        }).invalidate();
6729        animation.getChildren ? animation.getChildren(true, true, false).forEach(function (t) {
6730          return t.vars.immediateRender && t.render(0, true, true);
6731        }) : animation.vars.immediateRender && animation.render(0, true, true); // any from() or fromTo() tweens should render immediately (well, unless they have immediateRender: false)
6732      }
6733
6734      self.isReverted || self.revert(true, true);
6735      self._subPinOffset = false; // we'll set this to true in the sub-pins if we find any
6736
6737      var size = getScrollerSize(),
6738          scrollerBounds = getScrollerOffsets(),
6739          max = containerAnimation ? containerAnimation.duration() : _maxScroll(scroller, direction),
6740          isFirstRefresh = change <= 0.01 || !change,
6741          offset = 0,
6742          otherPinOffset = pinOffset || 0,
6743          parsedEnd = _isObject(position) ? position.end : vars.end,
6744          parsedEndTrigger = vars.endTrigger || trigger,
6745          parsedStart = _isObject(position) ? position.start : vars.start || (vars.start === 0 || !trigger ? 0 : pin ? "0 0" : "0 100%"),
6746          pinnedContainer = self.pinnedContainer = vars.pinnedContainer && (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(vars.pinnedContainer, self),
6747          triggerIndex = trigger && Math.max(0, _triggers.indexOf(self)) || 0,
6748          i = triggerIndex,
6749          cs,
6750          bounds,
6751          scroll,
6752          isVertical,
6753          override,
6754          curTrigger,
6755          curPin,
6756          oppositeScroll,
6757          initted,
6758          revertedPins,
6759          forcedOverflow,
6760          markerStartOffset,
6761          markerEndOffset;
6762
6763      if (markers && _isObject(position)) {
6764        // if we alter the start/end positions with .setPositions(), it generally feeds in absolute NUMBERS which don't convey information about where to line up the markers, so to keep it intuitive, we record how far the trigger positions shift after applying the new numbers and then offset by that much in the opposite direction. We do the same to the associated trigger markers too of course.
6765        markerStartOffset = gsap.getProperty(markerStartTrigger, direction.p);
6766        markerEndOffset = gsap.getProperty(markerEndTrigger, direction.p);
6767      }
6768
6769      while (i-- > 0) {
6770        // user might try to pin the same element more than once, so we must find any prior triggers with the same pin, revert them, and determine how long they're pinning so that we can offset things appropriately. Make sure we revert from last to first so that things "rewind" properly.
6771        curTrigger = _triggers[i];
6772        curTrigger.end || curTrigger.refresh(0, 1) || (_refreshing = self); // if it's a timeline-based trigger that hasn't been fully initialized yet because it's waiting for 1 tick, just force the refresh() here, otherwise if it contains a pin that's supposed to affect other ScrollTriggers further down the page, they won't be adjusted properly.
6773
6774        curPin = curTrigger.pin;
6775
6776        if (curPin && (curPin === trigger || curPin === pin || curPin === pinnedContainer) && !curTrigger.isReverted) {
6777          revertedPins || (revertedPins = []);
6778          revertedPins.unshift(curTrigger); // we'll revert from first to last to make sure things reach their end state properly
6779
6780          curTrigger.revert(true, true);
6781        }
6782
6783        if (curTrigger !== _triggers[i]) {
6784          // in case it got removed.
6785          triggerIndex--;
6786          i--;
6787        }
6788      }
6789
6790      _isFunction(parsedStart) && (parsedStart = parsedStart(self));
6791      parsedStart = _parseClamp(parsedStart, "start", self);
6792      start = _parsePosition(parsedStart, trigger, size, direction, scrollFunc(), markerStart, markerStartTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation, self._startClamp && "_startClamp") || (pin ? -0.001 : 0);
6793      _isFunction(parsedEnd) && (parsedEnd = parsedEnd(self));
6794
6795      if (_isString(parsedEnd) && !parsedEnd.indexOf("+=")) {
6796        if (~parsedEnd.indexOf(" ")) {
6797          parsedEnd = (_isString(parsedStart) ? parsedStart.split(" ")[0] : "") + parsedEnd;
6798        } else {
6799          offset = _offsetToPx(parsedEnd.substr(2), size);
6800          parsedEnd = _isString(parsedStart) ? parsedStart : (containerAnimation ? gsap.utils.mapRange(0, containerAnimation.duration(), containerAnimation.scrollTrigger.start, containerAnimation.scrollTrigger.end, start) : start) + offset; // _parsePosition won't factor in the offset if the start is a number, so do it here.
6801
6802          parsedEndTrigger = trigger;
6803        }
6804      }
6805
6806      parsedEnd = _parseClamp(parsedEnd, "end", self);
6807      end = Math.max(start, _parsePosition(parsedEnd || (parsedEndTrigger ? "100% 0" : max), parsedEndTrigger, size, direction, scrollFunc() + offset, markerEnd, markerEndTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation, self._endClamp && "_endClamp")) || -0.001;
6808      offset = 0;
6809      i = triggerIndex;
6810
6811      while (i--) {
6812        curTrigger = _triggers[i] || {};
6813        curPin = curTrigger.pin;
6814
6815        if (curPin && curTrigger.start - curTrigger._pinPush <= start && !containerAnimation && curTrigger.end > 0) {
6816          cs = curTrigger.end - (self._startClamp ? Math.max(0, curTrigger.start) : curTrigger.start);
6817
6818          if ((curPin === trigger && curTrigger.start - curTrigger._pinPush < start || curPin === pinnedContainer) && isNaN(parsedStart)) {
6819            // numeric start values shouldn't be offset at all - treat them as absolute
6820            offset += cs * (1 - curTrigger.progress);
6821          }
6822
6823          curPin === pin && (otherPinOffset += cs);
6824        }
6825      }
6826
6827      start += offset;
6828      end += offset;
6829      self._startClamp && (self._startClamp += offset);
6830
6831      if (self._endClamp && !_refreshingAll) {
6832        self._endClamp = end || -0.001;
6833        end = Math.min(end, _maxScroll(scroller, direction));
6834      }
6835
6836      change = end - start || (start -= 0.01) && 0.001;
6837
6838      if (isFirstRefresh) {
6839        // on the very first refresh(), the prevProgress couldn't have been accurate yet because the start/end were never calculated, so we set it here. Before 3.11.5, it could lead to an inaccurate scroll position restoration with snapping.
6840        prevProgress = gsap.utils.clamp(0, 1, gsap.utils.normalize(start, end, prevScroll));
6841      }
6842
6843      self._pinPush = otherPinOffset;
6844
6845      if (markerStart && offset) {
6846        // offset the markers if necessary
6847        cs = {};
6848        cs[direction.a] = "+=" + offset;
6849        pinnedContainer && (cs[direction.p] = "-=" + scrollFunc());
6850        gsap.set([markerStart, markerEnd], cs);
6851      }
6852
6853      if (pin && !(_clampingMax && self.end >= _maxScroll(scroller, direction))) {
6854        cs = _getComputedStyle(pin);
6855        isVertical = direction === _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical;
6856        scroll = scrollFunc(); // recalculate because the triggers can affect the scroll
6857
6858        pinStart = parseFloat(pinGetter(direction.a)) + otherPinOffset;
6859
6860        if (!max && end > 1) {
6861          // makes sure the scroller has a scrollbar, otherwise if something has width: 100%, for example, it would be too big (exclude the scrollbar). See https://gsap.com/forums/topic/25182-scrolltrigger-width-of-page-increase-where-markers-are-set-to-false/
6862          forcedOverflow = (isViewport ? _doc.scrollingElement || _docEl : scroller).style;
6863          forcedOverflow = {
6864            style: forcedOverflow,
6865            value: forcedOverflow["overflow" + direction.a.toUpperCase()]
6866          };
6867
6868          if (isViewport && _getComputedStyle(_body)["overflow" + direction.a.toUpperCase()] !== "scroll") {
6869            // avoid an extra scrollbar if BOTH <html> and <body> have overflow set to "scroll"
6870            forcedOverflow.style["overflow" + direction.a.toUpperCase()] = "scroll";
6871          }
6872        }
6873
6874        _swapPinIn(pin, spacer, cs);
6875
6876        pinState = _getState(pin); // transforms will interfere with the top/left/right/bottom placement, so remove them temporarily. getBoundingClientRect() factors in transforms.
6877
6878        bounds = _getBounds(pin, true);
6879        oppositeScroll = useFixedPosition && (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(scroller, isVertical ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal : _Observer_js__WEBPACK_IMPORTED_MODULE_0__.
vendor: 14,242 bytes, lines 6879-7138
6879_vertical)();
6880
6881        if (pinSpacing) {
6882          spacerState = [pinSpacing + direction.os2, change + otherPinOffset + _px];
6883          spacerState.t = spacer;
6884          i = pinSpacing === _padding ? _getSize(pin, direction) + change + otherPinOffset : 0;
6885
6886          if (i) {
6887            spacerState.push(direction.d, i + _px); // for box-sizing: border-box (must include padding).
6888
6889            spacer.style.flexBasis !== "auto" && (spacer.style.flexBasis = i + _px);
6890          }
6891
6892          _setState(spacerState);
6893
6894          if (pinnedContainer) {
6895            // in ScrollTrigger.refresh(), we need to re-evaluate the pinContainer's size because this pinSpacing may stretch it out, but we can't just add the exact distance because depending on layout, it may not push things down or it may only do so partially.
6896            _triggers.forEach(function (t) {
6897              if (t.pin === pinnedContainer && t.vars.pinSpacing !== false) {
6898                t._subPinOffset = true;
6899              }
6900            });
6901          }
6902
6903          useFixedPosition && scrollFunc(prevScroll);
6904        } else {
6905          i = _getSize(pin, direction);
6906          i && spacer.style.flexBasis !== "auto" && (spacer.style.flexBasis = i + _px);
6907        }
6908
6909        if (useFixedPosition) {
6910          override = {
6911            top: bounds.top + (isVertical ? scroll - start : oppositeScroll) + _px,
6912            left: bounds.left + (isVertical ? oppositeScroll : scroll - start) + _px,
6913            boxSizing: "border-box",
6914            position: "fixed"
6915          };
6916          override[_width] = override["max" + _Width] = Math.ceil(bounds.width) + _px;
6917          override[_height] = override["max" + _Height] = Math.ceil(bounds.height) + _px;
6918          override[_margin] = override[_margin + _Top] = override[_margin + _Right] = override[_margin + _Bottom] = override[_margin + _Left] = "0";
6919          override[_padding] = cs[_padding];
6920          override[_padding + _Top] = cs[_padding + _Top];
6921          override[_padding + _Right] = cs[_padding + _Right];
6922          override[_padding + _Bottom] = cs[_padding + _Bottom];
6923          override[_padding + _Left] = cs[_padding + _Left];
6924          pinActiveState = _copyState(pinOriginalState, override, pinReparent);
6925          _refreshingAll && scrollFunc(0);
6926        }
6927
6928        if (animation) {
6929          // the animation might be affecting the transform, so we must jump to the end, check the value, and compensate accordingly. Otherwise, when it becomes unpinned, the pinSetter() will get set to a value that doesn't include whatever the animation did.
6930          initted = animation._initted; // if not, we must invalidate() after this step, otherwise it could lock in starting values prematurely.
6931
6932          _suppressOverwrites(1);
6933
6934          animation.render(animation.duration(), true, true);
6935          pinChange = pinGetter(direction.a) - pinStart + change + otherPinOffset;
6936          pinMoves = Math.abs(change - pinChange) > 1;
6937          useFixedPosition && pinMoves && pinActiveState.splice(pinActiveState.length - 2, 2); // transform is the last property/value set in the state Array. Since the animation is controlling that, we should omit it.
6938
6939          animation.render(0, true, true);
6940          initted || animation.invalidate(true);
6941          animation.parent || animation.totalTime(animation.totalTime()); // if, for example, a toggleAction called play() and then refresh() happens and when we render(1) above, it would cause the animation to complete and get removed from its parent, so this makes sure it gets put back in.
6942
6943          _suppressOverwrites(0);
6944        } else {
6945          pinChange = change;
6946        }
6947
6948        forcedOverflow && (forcedOverflow.value ? forcedOverflow.style["overflow" + direction.a.toUpperCase()] = forcedOverflow.value : forcedOverflow.style.removeProperty("overflow-" + direction.a));
6949      } else if (trigger && scrollFunc() && !containerAnimation) {
6950        // it may be INSIDE a pinned element, so walk up the tree and look for any elements with _pinOffset to compensate because anything with pinSpacing that's already scrolled would throw off the measurements in getBoundingClientRect()
6951        bounds = trigger.parentNode;
6952
6953        while (bounds && bounds !== _body) {
6954          if (bounds._pinOffset) {
6955            start -= bounds._pinOffset;
6956            end -= bounds._pinOffset;
6957          }
6958
6959          bounds = bounds.parentNode;
6960        }
6961      }
6962
6963      revertedPins && revertedPins.forEach(function (t) {
6964        return t.revert(false, true);
6965      });
6966      self.start = start;
6967      self.end = end;
6968      scroll1 = scroll2 = _refreshingAll ? prevScroll : scrollFunc(); // reset velocity
6969
6970      if (!containerAnimation && !_refreshingAll) {
6971        scroll1 < prevScroll && scrollFunc(prevScroll);
6972        self.scroll.rec = 0;
6973      }
6974
6975      self.revert(false, true);
6976      lastRefresh = _getTime();
6977
6978      if (snapDelayedCall) {
6979        lastSnap = -1; // just so snapping gets re-enabled, clear out any recorded last value
6980        // self.isActive && scrollFunc(start + change * prevProgress); // previously this line was here to ensure that when snapping kicks in, it's from the previous progress but in some cases that's not desirable, like an all-page ScrollTrigger when new content gets added to the page, that'd totally change the progress.
6981
6982        snapDelayedCall.restart(true);
6983      }
6984
6985      _refreshing = 0;
6986      animation && isToggle && (animation._initted || prevAnimProgress) && animation.progress() !== prevAnimProgress && animation.progress(prevAnimProgress || 0, true).render(animation.time(), true, true); // must force a re-render because if saveStyles() was used on the target(s), the styles could have been wiped out during the refresh().
6987
6988      if (isFirstRefresh || prevProgress !== self.progress || containerAnimation || invalidateOnRefresh || animation && !animation._initted) {
6989        // ensures that the direction is set properly (when refreshing, progress is set back to 0 initially, then back again to wherever it needs to be) and that callbacks are triggered.
6990        animation && !isToggle && (animation._initted || prevProgress || animation.vars.immediateRender !== false) && animation.totalProgress(containerAnimation && start < -0.001 && !prevProgress ? gsap.utils.normalize(start, end, 0) : prevProgress, true); // to avoid issues where animation callbacks like onStart aren't triggered.
6991
6992        self.progress = isFirstRefresh || (scroll1 - start) / change === prevProgress ? 0 : prevProgress;
6993      }
6994
6995      pin && pinSpacing && (spacer._pinOffset = Math.round(self.progress * pinChange));
6996      scrubTween && scrubTween.invalidate();
6997
6998      if (!isNaN(markerStartOffset)) {
6999        // numbers were passed in for the position which are absolute, so instead of just putting the markers at the very bottom of the viewport, we figure out how far they shifted down (it's safe to assume they were originally positioned in closer relation to the trigger element with values like "top", "center", a percentage or whatever, so we offset that much in the opposite direction to basically revert them to the relative position thy were at previously.
7000        markerStartOffset -= gsap.getProperty(markerStartTrigger, direction.p);
7001        markerEndOffset -= gsap.getProperty(markerEndTrigger, direction.p);
7002
7003        _shiftMarker(markerStartTrigger, direction, markerStartOffset);
7004
7005        _shiftMarker(markerStart, direction, markerStartOffset - (pinOffset || 0));
7006
7007        _shiftMarker(markerEndTrigger, direction, markerEndOffset);
7008
7009        _shiftMarker(markerEnd, direction, markerEndOffset - (pinOffset || 0));
7010      }
7011
7012      isFirstRefresh && !_refreshingAll && self.update(); // edge case - when you reload a page when it's already scrolled down, some browsers fire a "scroll" event before DOMContentLoaded, triggering an updateAll(). If we don't update the self.progress as part of refresh(), then when it happens next, it may record prevProgress as 0 when it really shouldn't, potentially causing a callback in an animation to fire again.
7013
7014      if (onRefresh && !_refreshingAll && !executingOnRefresh) {
7015        // when refreshing all, we do extra work to correct pinnedContainer sizes and ensure things don't exceed the maxScroll, so we should do all the refreshes at the end after all that work so that the start/end values are corrected.
7016        executingOnRefresh = true;
7017        onRefresh(self);
7018        executingOnRefresh = false;
7019      }
7020    };
7021
7022    self.getVelocity = function () {
7023      return (scrollFunc() - scroll2) / (_getTime() - _time2) * 1000 || 0;
7024    };
7025
7026    self.endAnimation = function () {
7027      _endAnimation(self.callbackAnimation);
7028
7029      if (animation) {
7030        scrubTween ? scrubTween.progress(1) : !animation.paused() ? _endAnimation(animation, animation.reversed()) : isToggle || _endAnimation(animation, self.direction < 0, 1);
7031      }
7032    };
7033
7034    self.labelToScroll = function (label) {
7035      return animation && animation.labels && (start || self.refresh() || start) + animation.labels[label] / animation.duration() * change || 0;
7036    };
7037
7038    self.getTrailing = function (name) {
7039      var i = _triggers.indexOf(self),
7040          a = self.direction > 0 ? _triggers.slice(0, i).reverse() : _triggers.slice(i + 1);
7041
7042      return (_isString(name) ? a.filter(function (t) {
7043        return t.vars.preventOverlaps === name;
7044      }) : a).filter(function (t) {
7045        return self.direction > 0 ? t.end <= start : t.start >= end;
7046      });
7047    };
7048
7049    self.update = function (reset, recordVelocity, forceFake) {
7050      if (containerAnimation && !forceFake && !reset) {
7051        return;
7052      }
7053
7054      var scroll = _refreshingAll === true ? prevScroll : self.scroll(),
7055          p = reset ? 0 : (scroll - start) / change,
7056          clipped = p < 0 ? 0 : p > 1 ? 1 : p || 0,
7057          prevProgress = self.progress,
7058          isActive,
7059          wasActive,
7060          toggleState,
7061          action,
7062          stateChanged,
7063          toggled,
7064          isAtMax,
7065          isTakingAction;
7066
7067      if (recordVelocity) {
7068        scroll2 = scroll1;
7069        scroll1 = containerAnimation ? scrollFunc() : scroll;
7070
7071        if (snap) {
7072          snap2 = snap1;
7073          snap1 = animation && !isToggle ? animation.totalProgress() : clipped;
7074        }
7075      } // anticipate the pinning a few ticks ahead of time based on velocity to avoid a visual glitch due to the fact that most browsers do scrolling on a separate thread (not synced with requestAnimationFrame).
7076
7077
7078      if (anticipatePin && pin && !_refreshing && !_startup && _lastScrollTime) {
7079        if (!clipped && start < scroll + (scroll - scroll2) / (_getTime() - _time2) * anticipatePin) {
7080          clipped = 0.0001;
7081        } else if (clipped === 1 && end > scroll + (scroll - scroll2) / (_getTime() - _time2) * anticipatePin) {
7082          clipped = 0.9999;
7083        }
7084      }
7085
7086      if (clipped !== prevProgress && self.enabled) {
7087        isActive = self.isActive = !!clipped && clipped < 1;
7088        wasActive = !!prevProgress && prevProgress < 1;
7089        toggled = isActive !== wasActive;
7090        stateChanged = toggled || !!clipped !== !!prevProgress; // could go from start all the way to end, thus it didn't toggle but it did change state in a sense (may need to fire a callback)
7091
7092        self.direction = clipped > prevProgress ? 1 : -1;
7093        self.progress = clipped;
7094
7095        if (stateChanged && !_refreshing) {
7096          toggleState = clipped && !prevProgress ? 0 : clipped === 1 ? 1 : prevProgress === 1 ? 2 : 3; // 0 = enter, 1 = leave, 2 = enterBack, 3 = leaveBack (we prioritize the FIRST encounter, thus if you scroll really fast past the onEnter and onLeave in one tick, it'd prioritize onEnter.
7097
7098          if (isToggle) {
7099            action = !toggled && toggleActions[toggleState + 1] !== "none" && toggleActions[toggleState + 1] || toggleActions[toggleState]; // if it didn't toggle, that means it shot right past and since we prioritize the "enter" action, we should switch to the "leave" in this case (but only if one is defined)
7100
7101            isTakingAction = animation && (action === "complete" || action === "reset" || action in animation);
7102          }
7103        }
7104
7105        preventOverlaps && (toggled || isTakingAction) && (isTakingAction || scrub || !animation) && (_isFunction(preventOverlaps) ? preventOverlaps(self) : self.getTrailing(preventOverlaps).forEach(function (t) {
7106          return t.endAnimation();
7107        }));
7108
7109        if (!isToggle) {
7110          if (scrubTween && !_refreshing && !_startup) {
7111            scrubTween._dp._time - scrubTween._start !== scrubTween._time && scrubTween.render(scrubTween._dp._time - scrubTween._start); // if there's a scrub on both the container animation and this one (or a ScrollSmoother), the update order would cause this one not to have rendered yet, so it wouldn't make any progress before we .restart() it heading toward the new progress so it'd appear stuck thus we force a render here.
7112
7113            if (scrubTween.resetTo) {
7114              scrubTween.resetTo("totalProgress", clipped, animation._tTime / animation._tDur);
7115            } else {
7116              // legacy support (courtesy), before 3.10.0
7117              scrubTween.vars.totalProgress = clipped;
7118              scrubTween.invalidate().restart();
7119            }
7120          } else if (animation) {
7121            animation.totalProgress(clipped, !!(_refreshing && (lastRefresh || reset)));
7122          }
7123        }
7124
7125        if (pin) {
7126          reset && pinSpacing && (spacer.style[pinSpacing + direction.os2] = spacingStart);
7127
7128          if (!useFixedPosition) {
7129            pinSetter(_round(pinStart + pinChange * clipped));
7130          } else if (stateChanged) {
7131            isAtMax = !reset && clipped > prevProgress && end + 1 > scroll && scroll + 1 >= _maxScroll(scroller, direction); // if it's at the VERY end of the page, don't switch away from position: fixed because it's pointless and it could cause a brief flash when the user scrolls back up (when it gets pinned again)
7132
7133            if (pinReparent) {
7134              if (!reset && (isActive || isAtMax)) {
7135                var bounds = _getBounds(pin, true),
7136                    _offset = scroll - start;
7137
7138                _reparent(pin, _body, bounds.top + (direction === _
7138Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical ? _offset : 0) + _px, bounds.left + (direction === _Observer_js__WEBPACK_IMPORTED_MODULE_0__.
vendor: 8,830 bytes, lines 7138-7346
7138_vertical ? 0 : _offset) + _px);
7139              } else {
7140                _reparent(pin, spacer);
7141              }
7142            }
7143
7144            _setState(isActive || isAtMax ? pinActiveState : pinState);
7145
7146            pinMoves && clipped < 1 && isActive || pinSetter(pinStart + (clipped === 1 && !isAtMax ? pinChange : 0));
7147          }
7148        }
7149
7150        snap && !tweenTo.tween && !_refreshing && !_startup && snapDelayedCall.restart(true);
7151        toggleClass && (toggled || once && clipped && (clipped < 1 || !_limitCallbacks)) && _toArray(toggleClass.targets).forEach(function (el) {
7152          return el.classList[isActive || once ? "add" : "remove"](toggleClass.className);
7153        }); // classes could affect positioning, so do it even if reset or refreshing is true.
7154
7155        onUpdate && !isToggle && !reset && onUpdate(self);
7156
7157        if (stateChanged && !_refreshing) {
7158          if (isToggle) {
7159            if (isTakingAction) {
7160              if (action === "complete") {
7161                animation.pause().totalProgress(1);
7162              } else if (action === "reset") {
7163                animation.restart(true).pause();
7164              } else if (action === "restart") {
7165                animation.restart(true);
7166              } else {
7167                animation[action]();
7168              }
7169            }
7170
7171            onUpdate && onUpdate(self);
7172          }
7173
7174          if (toggled || !_limitCallbacks) {
7175            // on startup, the page could be scrolled and we don't want to fire callbacks that didn't toggle. For example onEnter shouldn't fire if the ScrollTrigger isn't actually entered.
7176            onToggle && toggled && _callback(self, onToggle);
7177            callbacks[toggleState] && _callback(self, callbacks[toggleState]);
7178            once && (clipped === 1 ? self.kill(false, 1) : callbacks[toggleState] = 0); // a callback shouldn't be called again if once is true.
7179
7180            if (!toggled) {
7181              // it's possible to go completely past, like from before the start to after the end (or vice-versa) in which case BOTH callbacks should be fired in that order
7182              toggleState = clipped === 1 ? 1 : 3;
7183              callbacks[toggleState] && _callback(self, callbacks[toggleState]);
7184            }
7185          }
7186
7187          if (fastScrollEnd && !isActive && Math.abs(self.getVelocity()) > (_isNumber(fastScrollEnd) ? fastScrollEnd : 2500)) {
7188            _endAnimation(self.callbackAnimation);
7189
7190            scrubTween ? scrubTween.progress(1) : _endAnimation(animation, action === "reverse" ? 1 : !clipped, 1);
7191          }
7192        } else if (isToggle && onUpdate && !_refreshing) {
7193          onUpdate(self);
7194        }
7195      } // update absolutely-positioned markers (only if the scroller isn't the viewport)
7196
7197
7198      if (markerEndSetter) {
7199        var n = containerAnimation ? scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0) : scroll;
7200        markerStartSetter(n + (markerStartTrigger._isFlipped ? 1 : 0));
7201        markerEndSetter(n);
7202      }
7203
7204      caMarkerSetter && caMarkerSetter(-scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0));
7205    };
7206
7207    self.enable = function (reset, refresh) {
7208      if (!self.enabled) {
7209        self.enabled = true;
7210
7211        _addListener(scroller, "resize", _onResize);
7212
7213        isViewport || _addListener(scroller, "scroll", _onScroll);
7214        onRefreshInit && _addListener(ScrollTrigger, "refreshInit", onRefreshInit);
7215
7216        if (reset !== false) {
7217          self.progress = prevProgress = 0;
7218          scroll1 = scroll2 = lastSnap = scrollFunc();
7219        }
7220
7221        refresh !== false && self.refresh();
7222      }
7223    };
7224
7225    self.getTween = function (snap) {
7226      return snap && tweenTo ? tweenTo.tween : scrubTween;
7227    };
7228
7229    self.setPositions = function (newStart, newEnd, keepClamp, pinOffset) {
7230      // doesn't persist after refresh()! Intended to be a way to override values that were set during refresh(), like you could set it in onRefresh()
7231      if (containerAnimation) {
7232        // convert ratios into scroll positions. Remember, start/end values on ScrollTriggers that have a containerAnimation refer to the time (in seconds), NOT scroll positions.
7233        var st = containerAnimation.scrollTrigger,
7234            duration = containerAnimation.duration(),
7235            _change = st.end - st.start;
7236
7237        newStart = st.start + _change * newStart / duration;
7238        newEnd = st.start + _change * newEnd / duration;
7239      }
7240
7241      self.refresh(false, false, {
7242        start: _keepClamp(newStart, keepClamp && !!self._startClamp),
7243        end: _keepClamp(newEnd, keepClamp && !!self._endClamp)
7244      }, pinOffset);
7245      self.update();
7246    };
7247
7248    self.adjustPinSpacing = function (amount) {
7249      if (spacerState && amount) {
7250        var i = spacerState.indexOf(direction.d) + 1;
7251        spacerState[i] = parseFloat(spacerState[i]) + amount + _px;
7252        spacerState[1] = parseFloat(spacerState[1]) + amount + _px;
7253
7254        _setState(spacerState);
7255      }
7256    };
7257
7258    self.disable = function (reset, allowAnimation) {
7259      reset !== false && self.revert(true, true);
7260
7261      if (self.enabled) {
7262        self.enabled = self.isActive = false;
7263        allowAnimation || scrubTween && scrubTween.pause();
7264        prevScroll = 0;
7265        pinCache && (pinCache.uncache = 1);
7266        onRefreshInit && _removeListener(ScrollTrigger, "refreshInit", onRefreshInit);
7267
7268        if (snapDelayedCall) {
7269          snapDelayedCall.pause();
7270          tweenTo.tween && tweenTo.tween.kill() && (tweenTo.tween = 0);
7271        }
7272
7273        if (!isViewport) {
7274          var i = _triggers.length;
7275
7276          while (i--) {
7277            if (_triggers[i].scroller === scroller && _triggers[i] !== self) {
7278              return; //don't remove the listeners if there are still other triggers referencing it.
7279            }
7280          }
7281
7282          _removeListener(scroller, "resize", _onResize);
7283
7284          isViewport || _removeListener(scroller, "scroll", _onScroll);
7285        }
7286      }
7287    };
7288
7289    self.kill = function (revert, allowAnimation) {
7290      self.disable(revert, allowAnimation);
7291      scrubTween && !allowAnimation && scrubTween.kill();
7292      id && delete _ids[id];
7293
7294      var i = _triggers.indexOf(self);
7295
7296      i >= 0 && _triggers.splice(i, 1);
7297      i === _i && _direction > 0 && _i--; // if we're in the middle of a refresh() or update(), splicing would cause skips in the index, so adjust...
7298      // if no other ScrollTrigger instances of the same scroller are found, wipe out any recorded scroll position. Otherwise, in a single page application, for example, it could maintain scroll position when it really shouldn't.
7299
7300      i = 0;
7301
7302      _triggers.forEach(function (t) {
7303        return t.scroller === self.scroller && (i = 1);
7304      });
7305
7306      i || _refreshingAll || (self.scroll.rec = 0);
7307
7308      if (animation) {
7309        animation.scrollTrigger = null;
7310        revert && animation.revert({
7311          kill: false
7312        });
7313        allowAnimation || animation.kill();
7314      }
7315
7316      markerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(function (m) {
7317        return m.parentNode && m.parentNode.removeChild(m);
7318      });
7319      _primary === self && (_primary = 0);
7320
7321      if (pin) {
7322        pinCache && (pinCache.uncache = 1);
7323        i = 0;
7324
7325        _triggers.forEach(function (t) {
7326          return t.pin === pin && i++;
7327        });
7328
7329        i || (pinCache.spacer = 0); // if there aren't any more ScrollTriggers with the same pin, remove the spacer, otherwise it could be contaminated with old/stale values if the user re-creates a ScrollTrigger for the same element.
7330      }
7331
7332      vars.onKill && vars.onKill(self);
7333    };
7334
7335    _triggers.push(self);
7336
7337    self.enable(false, false);
7338    customRevertReturn && customRevertReturn(self);
7339
7340    if (animation && animation.add && !change) {
7341      // if the animation is a timeline, it may not have been populated yet, so it wouldn't render at the proper place on the first refresh(), thus we should schedule one for the next tick. If "change" is defined, we know it must be re-enabling, thus we can refresh() right away.
7342      var updateFunc = self.update; // some browsers may fire a scroll event BEFORE a tick elapses and/or the DOMContentLoaded fires. So there's a chance update() will be called BEFORE a refresh() has happened on a Timeline-attached ScrollTrigger which means the start/end won't be calculated yet. We don't want to add conditional logic inside the update() method (like check to see if end is defined and if not, force a refresh()) because that's a function that gets hit a LOT (performance). So we swap out the real update() method for this one that'll re-attach it the first time it gets called and of course forces a refresh().
7343
7344      self.update = function () {
7345        self.update = updateFunc;
7346        _
vendor: 14,990 bytes, lines 7346-7711
7346Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++; // otherwise a cached scroll position may get used in the refresh() in a very rare scenario, like if ScrollTriggers are created inside a DOMContentLoaded event and the queued requestAnimationFrame() fires beforehand. See https://gsap.com/community/forums/topic/41267-scrolltrigger-breaks-on-refresh-when-using-domcontentloaded/
7347
7348        start || end || self.refresh();
7349      };
7350
7351      gsap.delayedCall(0.01, self.update);
7352      change = 0.01;
7353      start = end = 0;
7354    } else {
7355      self.refresh();
7356    }
7357
7358    pin && _queueRefreshAll(); // pinning could affect the positions of other things, so make sure we queue a full refresh()
7359  };
7360
7361  ScrollTrigger.register = function register(core) {
7362    if (!_coreInitted) {
7363      gsap = core || _getGSAP();
7364      _windowExists() && window.document && ScrollTrigger.enable();
7365      _coreInitted = _enabled;
7366    }
7367
7368    return _coreInitted;
7369  };
7370
7371  ScrollTrigger.defaults = function defaults(config) {
7372    if (config) {
7373      for (var p in config) {
7374        _defaults[p] = config[p];
7375      }
7376    }
7377
7378    return _defaults;
7379  };
7380
7381  ScrollTrigger.disable = function disable(reset, kill) {
7382    _enabled = 0;
7383
7384    _triggers.forEach(function (trigger) {
7385      return trigger[kill ? "kill" : "disable"](reset);
7386    });
7387
7388    _removeListener(_win, "wheel", _onScroll);
7389
7390    _removeListener(_doc, "scroll", _onScroll);
7391
7392    clearInterval(_syncInterval);
7393
7394    _removeListener(_doc, "touchcancel", _passThrough);
7395
7396    _removeListener(_body, "touchstart", _passThrough);
7397
7398    _multiListener(_removeListener, _doc, "pointerdown,touchstart,mousedown", _pointerDownHandler);
7399
7400    _multiListener(_removeListener, _doc, "pointerup,touchend,mouseup", _pointerUpHandler);
7401
7402    _resizeDelay.kill();
7403
7404    _iterateAutoRefresh(_removeListener);
7405
7406    for (var i = 0; i < _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.length; i += 3) {
7407      _wheelListener(_removeListener, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i], _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i + 1]);
7408
7409      _wheelListener(_removeListener, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i], _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i + 2]);
7410    }
7411  };
7412
7413  ScrollTrigger.enable = function enable() {
7414    _win = window;
7415    _doc = document;
7416    _docEl = _doc.documentElement;
7417    _body = _doc.body;
7418
7419    if (gsap) {
7420      _toArray = gsap.utils.toArray;
7421      _clamp = gsap.utils.clamp;
7422      _context = gsap.core.context || _passThrough;
7423      _suppressOverwrites = gsap.core.suppressOverwrites || _passThrough;
7424      _scrollRestoration = _win.history.scrollRestoration || "auto";
7425      _lastScroll = _win.pageYOffset || 0;
7426      gsap.core.globals("ScrollTrigger", ScrollTrigger); // must register the global manually because in Internet Explorer, functions (classes) don't have a "name" property.
7427
7428      if (_body) {
7429        _enabled = 1;
7430        _div100vh = document.createElement("div"); // to solve mobile browser address bar show/hide resizing, we shouldn't rely on window.innerHeight. Instead, use a <div> with its height set to 100vh and measure that since that's what the scrolling is based on anyway and it's not affected by address bar showing/hiding.
7431
7432        _div100vh.style.height = "100vh";
7433        _div100vh.style.position = "absolute";
7434
7435        _refresh100vh();
7436
7437        _rafBugFix();
7438
7439        _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.register(gsap); // isTouch is 0 if no touch, 1 if ONLY touch, and 2 if it can accommodate touch but also other types like mouse/pointer.
7440
7441        ScrollTrigger.isTouch = _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch;
7442        _fixIOSBug = _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch && /(iPad|iPhone|iPod|Mac)/g.test(navigator.userAgent); // since 2017, iOS has had a bug that causes event.clientX/Y to be inaccurate when a scroll occurs, thus we must alternate ignoring every other touchmove event to work around it. See https://bugs.webkit.org/show_bug.cgi?id=181954 and https://codepen.io/GreenSock/pen/ExbrPNa/087cef197dc35445a0951e8935c41503
7443
7444        _ignoreMobileResize = _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch === 1;
7445
7446        _addListener(_win, "wheel", _onScroll); // mostly for 3rd party smooth scrolling libraries.
7447
7448
7449        _root = [_win, _doc, _docEl, _body];
7450
7451        if (gsap.matchMedia) {
7452          ScrollTrigger.matchMedia = function (vars) {
7453            var mm = gsap.matchMedia(),
7454                p;
7455
7456            for (p in vars) {
7457              mm.add(p, vars[p]);
7458            }
7459
7460            return mm;
7461          };
7462
7463          gsap.addEventListener("matchMediaInit", function () {
7464            _recordScrollPositions();
7465
7466            _revertAll();
7467          });
7468          gsap.addEventListener("matchMediaRevert", function () {
7469            return _revertRecorded();
7470          });
7471          gsap.addEventListener("matchMedia", function () {
7472            _refreshAll(0, 1);
7473
7474            _dispatch("matchMedia");
7475          });
7476          gsap.matchMedia().add("(orientation: portrait)", function () {
7477            // when orientation changes, we should take new base measurements for the ignoreMobileResize feature.
7478            _setBaseDimensions();
7479
7480            return _setBaseDimensions;
7481          });
7482        } else {
7483          console.warn("Requires GSAP 3.11.0 or later");
7484        }
7485
7486        _setBaseDimensions();
7487
7488        _addListener(_doc, "scroll", _onScroll); // some browsers (like Chrome), the window stops dispatching scroll events on the window if you scroll really fast, but it's consistent on the document!
7489
7490
7491        var bodyHasStyle = _body.hasAttribute("style"),
7492            bodyStyle = _body.style,
7493            border = bodyStyle.borderTopStyle,
7494            AnimationProto = gsap.core.Animation.prototype,
7495            bounds,
7496            i;
7497
7498        AnimationProto.revert || Object.defineProperty(AnimationProto, "revert", {
7499          value: function value() {
7500            return this.time(-0.01, true);
7501          }
7502        }); // only for backwards compatibility (Animation.revert() was added after 3.10.4)
7503
7504        bodyStyle.borderTopStyle = "solid"; // works around an issue where a margin of a child element could throw off the bounds of the _body, making it seem like there's a margin when there actually isn't. The border ensures that the bounds are accurate.
7505
7506        bounds = _getBounds(_body);
7507        _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical.m = Math.round(bounds.top + _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical.sc()) || 0; // accommodate the offset of the <body> caused by margins and/or padding
7508
7509        _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal.m = Math.round(bounds.left + _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal.sc()) || 0;
7510        border ? bodyStyle.borderTopStyle = border : bodyStyle.removeProperty("border-top-style");
7511
7512        if (!bodyHasStyle) {
7513          // SSR frameworks like Next.js complain if this attribute gets added.
7514          _body.setAttribute("style", ""); // it's not enough to just removeAttribute() - we must first set it to empty, otherwise Next.js complains.
7515
7516
7517          _body.removeAttribute("style");
7518        } // TODO: (?) maybe move to leveraging the velocity mechanism in Observer and skip intervals.
7519
7520
7521        _syncInterval = setInterval(_sync, 250);
7522        gsap.delayedCall(0.5, function () {
7523          return _startup = 0;
7524        });
7525
7526        _addListener(_doc, "touchcancel", _passThrough); // some older Android devices intermittently stop dispatching "touchmove" events if we don't listen for "touchcancel" on the document.
7527
7528
7529        _addListener(_body, "touchstart", _passThrough); //works around Safari bug: https://gsap.com/forums/topic/21450-draggable-in-iframe-on-mobile-is-buggy/
7530
7531
7532        _multiListener(_addListener, _doc, "pointerdown,touchstart,mousedown", _pointerDownHandler);
7533
7534        _multiListener(_addListener, _doc, "pointerup,touchend,mouseup", _pointerUpHandler);
7535
7536        _transformProp = gsap.utils.checkPrefix("transform");
7537
7538        _stateProps.push(_transformProp);
7539
7540        _coreInitted = _getTime();
7541        _resizeDelay = gsap.delayedCall(0.2, _refreshAll).pause();
7542        _autoRefresh = [_doc, "visibilitychange", function () {
7543          var w = _win.innerWidth,
7544              h = _win.innerHeight;
7545
7546          if (_doc.hidden) {
7547            _prevWidth = w;
7548            _prevHeight = h;
7549          } else if (_prevWidth !== w || _prevHeight !== h) {
7550            _onResize();
7551          }
7552        }, _doc, "DOMContentLoaded", _refreshAll, _win, "load", _refreshAll, _win, "resize", _onResize];
7553
7554        _iterateAutoRefresh(_addListener);
7555
7556        _triggers.forEach(function (trigger) {
7557          return trigger.enable(0, 1);
7558        });
7559
7560        for (i = 0; i < _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.length; i += 3) {
7561          _wheelListener(_removeListener, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i], _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i + 1]);
7562
7563          _wheelListener(_removeListener, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i], _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i + 2]);
7564        }
7565      } else if (_doc) {
7566        var onLoad = function onLoad() {
7567          ScrollTrigger.enable();
7568
7569          _doc.removeEventListener("DOMContentLoaded", onLoad);
7570        };
7571
7572        _doc.addEventListener("DOMContentLoaded", onLoad);
7573      }
7574    }
7575  };
7576
7577  ScrollTrigger.config = function config(vars) {
7578    "limitCallbacks" in vars && (_limitCallbacks = !!vars.limitCallbacks);
7579    var ms = vars.syncInterval;
7580    ms && clearInterval(_syncInterval) || (_syncInterval = ms) && setInterval(_sync, ms);
7581    "ignoreMobileResize" in vars && (_ignoreMobileResize = ScrollTrigger.isTouch === 1 && vars.ignoreMobileResize);
7582
7583    if ("autoRefreshEvents" in vars) {
7584      _iterateAutoRefresh(_removeListener) || _iterateAutoRefresh(_addListener, vars.autoRefreshEvents || "none");
7585      _ignoreResize = (vars.autoRefreshEvents + "").indexOf("resize") === -1;
7586    }
7587  };
7588
7589  ScrollTrigger.scrollerProxy = function scrollerProxy(target, vars) {
7590    var t = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(target),
7591        i = _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.indexOf(t),
7592        isViewport = _isViewport(t);
7593
7594    if (~i) {
7595      _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.splice(i, isViewport ? 6 : 2);
7596    }
7597
7598    if (vars) {
7599      isViewport ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies.unshift(_win, vars, _body, vars, _docEl, vars) : _Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies.unshift(t, vars);
7600    }
7601  };
7602
7603  ScrollTrigger.clearMatchMedia = function clearMatchMedia(query) {
7604    _triggers.forEach(function (t) {
7605      return t._ctx && t._ctx.query === query && t._ctx.kill(true, true);
7606    });
7607  };
7608
7609  ScrollTrigger.isInViewport = function isInViewport(element, ratio, horizontal) {
7610    var bounds = (_isString(element) ? (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(element) : element).getBoundingClientRect(),
7611        offset = bounds[horizontal ? _width : _height] * ratio || 0;
7612    return horizontal ? bounds.right - offset > 0 && bounds.left + offset < _win.innerWidth : bounds.bottom - offset > 0 && bounds.top + offset < _win.innerHeight;
7613  };
7614
7615  ScrollTrigger.positionInViewport = function positionInViewport(element, referencePoint, horizontal) {
7616    _isString(element) && (element = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(element));
7617    var bounds = element.getBoundingClientRect(),
7618        size = bounds[horizontal ? _width : _height],
7619        offset = referencePoint == null ? size / 2 : referencePoint in _keywords ? _keywords[referencePoint] * size : ~referencePoint.indexOf("%") ? parseFloat(referencePoint) * size / 100 : parseFloat(referencePoint) || 0;
7620    return horizontal ? (bounds.left + offset) / _win.innerWidth : (bounds.top + offset) / _win.innerHeight;
7621  };
7622
7623  ScrollTrigger.killAll = function killAll(allowListeners) {
7624    _triggers.slice(0).forEach(function (t) {
7625      return t.vars.id !== "ScrollSmoother" && t.kill();
7626    });
7627
7628    if (allowListeners !== true) {
7629      var listeners = _listeners.killAll || [];
7630      _listeners = {};
7631      listeners.forEach(function (f) {
7632        return f();
7633      });
7634    }
7635  };
7636
7637  return ScrollTrigger;
7638}();
7639ScrollTrigger.version = "3.15.0";
7640
7641ScrollTrigger.saveStyles = function (targets) {
7642  return targets ? _toArray(targets).forEach(function (target) {
7643    // saved styles are recorded in a consecutive alternating Array, like [element, cssText, transform attribute, cache, matchMedia, ...]
7644    if (target && target.style) {
7645      var i = _savedStyles.indexOf(target);
7646
7647      i >= 0 && _savedStyles.splice(i, 5);
7648
7649      _savedStyles.push(target, target.style.cssText, target.getBBox && target.getAttribute("transform"), gsap.core.getCache(target), _context());
7650    }
7651  }) : _savedStyles;
7652};
7653
7654ScrollTrigger.revert = function (soft, media) {
7655  return _revertAll(!soft, media);
7656};
7657
7658ScrollTrigger.create = function (vars, animation) {
7659  return new ScrollTrigger(vars, animation);
7660};
7661
7662ScrollTrigger.refresh = function (safe) {
7663  return safe ? _onResize(true) : (_coreInitted || ScrollTrigger.register()) && _refreshAll(true);
7664};
7665
7666ScrollTrigger.update = function (force) {
7667  return ++_Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache && _updateAll(force === true ? 2 : 0);
7668};
7669
7670ScrollTrigger.clearScrollMemory = _clearScrollMemory;
7671
7672ScrollTrigger.maxScroll = function (element, horizontal) {
7673  return _maxScroll(element, horizontal ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal : _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical);
7674};
7675
7676ScrollTrigger.getScrollFunc = function (element, horizontal) {
7677  return (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)((0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(element), horizontal ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal : _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical);
7678};
7679
7680ScrollTrigger.getById = function (id) {
7681  return _ids[id];
7682};
7683
7684ScrollTrigger.getAll = function () {
7685  return _triggers.filter(function (t) {
7686    return t.vars.id !== "ScrollSmoother";
7687  });
7688}; // it's common for people to ScrollTrigger.getAll(t => t.kill()) on page routes, for example, and we don't want it to ruin smooth scrolling by killing the main ScrollSmoother one.
7689
7690
7691ScrollTrigger.isScrolling = function () {
7692  return !!_lastScrollTime;
7693};
7694
7695ScrollTrigger.snapDirectional = _snapDirectional;
7696
7697ScrollTrigger.addEventListener = function (type, callback) {
7698  var a = _listeners[type] || (_listeners[type] = []);
7699  ~a.indexOf(callback) || a.push(callback);
7700};
7701
7702ScrollTrigger.removeEventListener = function (type, callback) {
7703  var a = _listeners[type],
7704      i = a && a.indexOf(callback);
7705  i >= 0 && a.splice(i, 1);
7706};
7707
7708ScrollTrigger.batch = function (targets, vars) {
7709  var result = [],
7710      varsCopy = {},
7711      interval = vars.interval || 0.016,
vendor: 5,654 bytes, lines 7712-7850
7712      batchMax = vars.batchMax || 1e9,
7713      proxyCallback = function proxyCallback(type, callback) {
7714    var elements = [],
7715        triggers = [],
7716        delay = gsap.delayedCall(interval, function () {
7717      callback(elements, triggers);
7718      elements = [];
7719      triggers = [];
7720    }).pause();
7721    return function (self) {
7722      elements.length || delay.restart(true);
7723      elements.push(self.trigger);
7724      triggers.push(self);
7725      batchMax <= elements.length && delay.progress(1);
7726    };
7727  },
7728      p;
7729
7730  for (p in vars) {
7731    varsCopy[p] = p.substr(0, 2) === "on" && _isFunction(vars[p]) && p !== "onRefreshInit" ? proxyCallback(p, vars[p]) : vars[p];
7732  }
7733
7734  if (_isFunction(batchMax)) {
7735    batchMax = batchMax();
7736
7737    _addListener(ScrollTrigger, "refresh", function () {
7738      return batchMax = vars.batchMax();
7739    });
7740  }
7741
7742  _toArray(targets).forEach(function (target) {
7743    var config = {};
7744
7745    for (p in varsCopy) {
7746      config[p] = varsCopy[p];
7747    }
7748
7749    config.trigger = target;
7750    result.push(ScrollTrigger.create(config));
7751  });
7752
7753  return result;
7754}; // to reduce file size. clamps the scroll and also returns a duration multiplier so that if the scroll gets chopped shorter, the duration gets curtailed as well (otherwise if you're very close to the top of the page, for example, and swipe up really fast, it'll suddenly slow down and take a long time to reach the top).
7755
7756
7757var _clampScrollAndGetDurationMultiplier = function _clampScrollAndGetDurationMultiplier(scrollFunc, current, end, max) {
7758  current > max ? scrollFunc(max) : current < 0 && scrollFunc(0);
7759  return end > max ? (max - current) / (end - current) : end < 0 ? current / (current - end) : 1;
7760},
7761    _allowNativePanning = function _allowNativePanning(target, direction) {
7762  if (direction === true) {
7763    target.style.removeProperty("touch-action");
7764  } else {
7765    target.style.touchAction = direction === true ? "auto" : direction ? "pan-" + direction + (_Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch ? " pinch-zoom" : "") : "none"; // note: Firefox doesn't support it pinch-zoom properly, at least in addition to a pan-x or pan-y.
7766  }
7767
7768  target === _docEl && _allowNativePanning(_body, direction);
7769},
7770    _overflow = {
7771  auto: 1,
7772  scroll: 1
7773},
7774    _nestedScroll = function _nestedScroll(_ref5) {
7775  var event = _ref5.event,
7776      target = _ref5.target,
7777      axis = _ref5.axis;
7778
7779  var node = (event.changedTouches ? event.changedTouches[0] : event).target,
7780      cache = node._gsap || gsap.core.getCache(node),
7781      time = _getTime(),
7782      cs;
7783
7784  if (!cache._isScrollT || time - cache._isScrollT > 2000) {
7785    // cache for 2 seconds to improve performance.
7786    while (node && node !== _body && (node.scrollHeight <= node.clientHeight && node.scrollWidth <= node.clientWidth || !(_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]))) {
7787      node = node.parentNode;
7788    }
7789
7790    cache._isScroll = node && node !== target && !_isViewport(node) && (_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]);
7791    cache._isScrollT = time;
7792  }
7793
7794  if (cache._isScroll || axis === "x") {
7795    event.stopPropagation();
7796    event._gsapAllow = true;
7797  }
7798},
7799    // capture events on scrollable elements INSIDE the <body> and allow those by calling stopPropagation() when we find a scrollable ancestor
7800_inputObserver = function _inputObserver(target, type, inputs, nested) {
7801  return _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.create({
7802    target: target,
7803    capture: true,
7804    debounce: false,
7805    lockAxis: true,
7806    type: type,
7807    onWheel: nested = nested && _nestedScroll,
7808    onPress: nested,
7809    onDrag: nested,
7810    onScroll: nested,
7811    onEnable: function onEnable() {
7812      return inputs && _addListener(_doc, _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.eventTypes[0], _captureInputs, false, true);
7813    },
7814    onDisable: function onDisable() {
7815      return _removeListener(_doc, _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.eventTypes[0], _captureInputs, true);
7816    }
7817  });
7818},
7819    _inputExp = /(input|label|select|textarea)/i,
7820    _inputIsFocused,
7821    _captureInputs = function _captureInputs(e) {
7822  var isInput = _inputExp.test(e.target.tagName);
7823
7824  if (isInput || _inputIsFocused) {
7825    e._gsapAllow = true;
7826    _inputIsFocused = isInput;
7827  }
7828},
7829    _getScrollNormalizer = function _getScrollNormalizer(vars) {
7830  _isObject(vars) || (vars = {});
7831  vars.preventDefault = vars.isNormalizer = vars.allowClicks = true;
7832  vars.type || (vars.type = "wheel,touch");
7833  vars.debounce = !!vars.debounce;
7834  vars.id = vars.id || "normalizer";
7835
7836  var _vars2 = vars,
7837      normalizeScrollX = _vars2.normalizeScrollX,
7838      momentum = _vars2.momentum,
7839      allowNestedScroll = _vars2.allowNestedScroll,
7840      onRelease = _vars2.onRelease,
7841      self,
7842      maxY,
7843      target = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(vars.target) || _docEl,
7844      smoother = gsap.core.globals().ScrollSmoother,
7845      smootherInstance = smoother && smoother.get(),
7846      content = _fixIOSBug && (vars.content && (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(vars.content) || smootherInstance && vars.content !== false && !smootherInstance.smooth() && smootherInstance.content()),
7847      scrollFuncY = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical),
7848      scrollFuncX = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal),
7849      scale = 1,
7850      initialScale = (_Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch && _win.visualVie
vendor: 11,530 bytes, lines 7850-8110
7850wport ? _win.visualViewport.scale * _win.visualViewport.width : _win.outerWidth) / _win.innerWidth,
7851      wheelRefresh = 0,
7852      resolveMomentumDuration = _isFunction(momentum) ? function () {
7853    return momentum(self);
7854  } : function () {
7855    return momentum || 2.8;
7856  },
7857      lastRefreshID,
7858      skipTouchMove,
7859      inputObserver = _inputObserver(target, vars.type, true, allowNestedScroll),
7860      resumeTouchMove = function resumeTouchMove() {
7861    return skipTouchMove = false;
7862  },
7863      scrollClampX = _passThrough,
7864      scrollClampY = _passThrough,
7865      updateClamps = function updateClamps() {
7866    maxY = _maxScroll(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical);
7867    scrollClampY = _clamp(_fixIOSBug ? 1 : 0, maxY);
7868    normalizeScrollX && (scrollClampX = _clamp(0, _maxScroll(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal)));
7869    lastRefreshID = _refreshID;
7870  },
7871      removeContentOffset = function removeContentOffset() {
7872    content._gsap.y = _round(parseFloat(content._gsap.y) + scrollFuncY.offset) + "px";
7873    content.style.transform = "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, " + parseFloat(content._gsap.y) + ", 0, 1)";
7874    scrollFuncY.offset = scrollFuncY.cacheID = 0;
7875  },
7876      ignoreDrag = function ignoreDrag() {
7877    if (skipTouchMove) {
7878      requestAnimationFrame(resumeTouchMove);
7879
7880      var offset = _round(self.deltaY / 2),
7881          scroll = scrollClampY(scrollFuncY.v - offset);
7882
7883      if (content && scroll !== scrollFuncY.v + scrollFuncY.offset) {
7884        scrollFuncY.offset = scroll - scrollFuncY.v;
7885
7886        var y = _round((parseFloat(content && content._gsap.y) || 0) - scrollFuncY.offset);
7887
7888        content.style.transform = "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, " + y + ", 0, 1)";
7889        content._gsap.y = y + "px";
7890        scrollFuncY.cacheID = _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache;
7891
7892        _updateAll();
7893      }
7894
7895      return true;
7896    }
7897
7898    scrollFuncY.offset && removeContentOffset();
7899    skipTouchMove = true;
7900  },
7901      tween,
7902      startScrollX,
7903      startScrollY,
7904      onStopDelayedCall,
7905      onResize = function onResize() {
7906    // if the window resizes, like on an iPhone which Apple FORCES the address bar to show/hide even if we event.preventDefault(), it may be scrolling too far now that the address bar is showing, so we must dynamically adjust the momentum tween.
7907    updateClamps();
7908
7909    if (tween.isActive() && tween.vars.scrollY > maxY) {
7910      scrollFuncY() > maxY ? tween.progress(1) && scrollFuncY(maxY) : tween.resetTo("scrollY", maxY);
7911    }
7912  };
7913
7914  content && gsap.set(content, {
7915    y: "+=0"
7916  }); // to ensure there's a cache (element._gsap)
7917
7918  vars.ignoreCheck = function (e) {
7919    return _fixIOSBug && e.type === "touchmove" && ignoreDrag(e) || scale > 1.05 && e.type !== "touchstart" || self.isGesturing || e.touches && e.touches.length > 1;
7920  };
7921
7922  vars.onPress = function () {
7923    skipTouchMove = false;
7924    var prevScale = scale;
7925    scale = _round((_win.visualViewport && _win.visualViewport.scale || 1) / initialScale);
7926    tween.pause();
7927    prevScale !== scale && _allowNativePanning(target, scale > 1.01 ? true : normalizeScrollX ? false : "x");
7928    startScrollX = scrollFuncX();
7929    startScrollY = scrollFuncY();
7930    updateClamps();
7931    lastRefreshID = _refreshID;
7932  };
7933
7934  vars.onRelease = vars.onGestureStart = function (self, wasDragging) {
7935    scrollFuncY.offset && removeContentOffset();
7936
7937    if (!wasDragging) {
7938      onStopDelayedCall.restart(true);
7939    } else {
7940      _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++; // make sure we're pulling the non-cached value
7941      // alternate algorithm: durX = Math.min(6, Math.abs(self.velocityX / 800)),	dur = Math.max(durX, Math.min(6, Math.abs(self.velocityY / 800))); dur = dur * (0.4 + (1 - _power4In(dur / 6)) * 0.6)) * (momentumSpeed || 1)
7942
7943      var dur = resolveMomentumDuration(),
7944          currentScroll,
7945          endScroll;
7946
7947      if (normalizeScrollX) {
7948        currentScroll = scrollFuncX();
7949        endScroll = currentScroll + dur * 0.05 * -self.velocityX / 0.227; // the constant .227 is from power4(0.05). velocity is inverted because scrolling goes in the opposite direction.
7950
7951        dur *= _clampScrollAndGetDurationMultiplier(scrollFuncX, currentScroll, endScroll, _maxScroll(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal));
7952        tween.vars.scrollX = scrollClampX(endScroll);
7953      }
7954
7955      currentScroll = scrollFuncY();
7956      endScroll = currentScroll + dur * 0.05 * -self.velocityY / 0.227; // the constant .227 is from power4(0.05)
7957
7958      dur *= _clampScrollAndGetDurationMultiplier(scrollFuncY, currentScroll, endScroll, _maxScroll(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical));
7959      tween.vars.scrollY = scrollClampY(endScroll);
7960      tween.invalidate().duration(dur).play(0.01);
7961
7962      if (_fixIOSBug && tween.vars.scrollY >= maxY || currentScroll >= maxY - 1) {
7963        // iOS bug: it'll show the address bar but NOT fire the window "resize" event until the animation is done but we must protect against overshoot so we leverage an onUpdate to do so.
7964        gsap.to({}, {
7965          onUpdate: onResize,
7966          duration: dur
7967        });
7968      }
7969    }
7970
7971    onRelease && onRelease(self);
7972  };
7973
7974  vars.onWheel = function () {
7975    tween._ts && tween.pause();
7976
7977    if (_getTime() - wheelRefresh > 1000) {
7978      // after 1 second, refresh the clamps otherwise that'll only happen when ScrollTrigger.refresh() is called or for touch-scrolling.
7979      lastRefreshID = 0;
7980      wheelRefresh = _getTime();
7981    }
7982  };
7983
7984  vars.onChange = function (self, dx, dy, xArray, yArray) {
7985    _refreshID !== lastRefreshID && updateClamps();
7986    dx && normalizeScrollX && scrollFuncX(scrollClampX(xArray[2] === dx ? startScrollX + (self.startX - self.x) : scrollFuncX() + dx - xArray[1])); // for more precision, we track pointer/touch movement from the start, otherwise it'll drift.
7987
7988    if (dy) {
7989      scrollFuncY.offset && removeContentOffset();
7990      var isTouch = yArray[2] === dy,
7991          y = isTouch ? startScrollY + self.startY - self.y : scrollFuncY() + dy - yArray[1],
7992          yClamped = scrollClampY(y);
7993      isTouch && y !== yClamped && (startScrollY += yClamped - y);
7994      scrollFuncY(yClamped);
7995    }
7996
7997    (dy || dx) && _updateAll();
7998  };
7999
8000  vars.onEnable = function () {
8001    _allowNativePanning(target, normalizeScrollX ? false : "x");
8002
8003    ScrollTrigger.addEventListener("refresh", onResize);
8004
8005    _addListener(_win, "resize", onResize);
8006
8007    if (scrollFuncY.smooth) {
8008      scrollFuncY.target.style.scrollBehavior = "auto";
8009      scrollFuncY.smooth = scrollFuncX.smooth = false;
8010    }
8011
8012    inputObserver.enable();
8013  };
8014
8015  vars.onDisable = function () {
8016    _allowNativePanning(target, true);
8017
8018    _removeListener(_win, "resize", onResize);
8019
8020    ScrollTrigger.removeEventListener("refresh", onResize);
8021    inputObserver.kill();
8022  };
8023
8024  vars.lockAxis = vars.lockAxis !== false;
8025  self = new _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer(vars);
8026  self.iOS = _fixIOSBug; // used in the Observer getCachedScroll() function to work around an iOS bug that wreaks havoc with TouchEvent.clientY if we allow scroll to go all the way back to 0.
8027
8028  _fixIOSBug && !scrollFuncY() && scrollFuncY(1); // iOS bug causes event.clientY values to freak out (wildly inaccurate) if the scroll position is exactly 0.
8029
8030  _fixIOSBug && gsap.ticker.add(_passThrough); // prevent the ticker from sleeping
8031
8032  onStopDelayedCall = self._dc;
8033  tween = gsap.to(self, {
8034    ease: "power4",
8035    paused: true,
8036    inherit: false,
8037    scrollX: normalizeScrollX ? "+=0.1" : "+=0",
8038    scrollY: "+=0.1",
8039    modifiers: {
8040      scrollY: _interruptionTracker(scrollFuncY, scrollFuncY(), function () {
8041        return tween.pause();
8042      })
8043    },
8044    onUpdate: _updateAll,
8045    onComplete: onStopDelayedCall.vars.onComplete
8046  }); // we need the modifier to sense if the scroll position is altered outside of the momentum tween (like with a scrollTo tween) so we can pause() it to prevent conflicts.
8047
8048  return self;
8049};
8050
8051ScrollTrigger.sort = function (func) {
8052  if (_isFunction(func)) {
8053    return _triggers.sort(func);
8054  }
8055
8056  var scroll = _win.pageYOffset || 0;
8057  ScrollTrigger.getAll().forEach(function (t) {
8058    return t._sortY = t.trigger ? scroll + t.trigger.getBoundingClientRect().top : t.start + _win.innerHeight;
8059  });
8060  return _triggers.sort(func || function (a, b) {
8061    return (a.vars.refreshPriority || 0) * -1e6 + (a.vars.containerAnimation ? 1e6 : a._sortY) - ((b.vars.containerAnimation ? 1e6 : b._sortY) + (b.vars.refreshPriority || 0) * -1e6);
8062  }); // anything with a containerAnimation should refresh last.
8063};
8064
8065ScrollTrigger.observe = function (vars) {
8066  return new _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer(vars);
8067};
8068
8069ScrollTrigger.normalizeScroll = function (vars) {
8070  if (typeof vars === "undefined") {
8071    return _normalizer;
8072  }
8073
8074  if (vars === true && _normalizer) {
8075    return _normalizer.enable();
8076  }
8077
8078  if (vars === false) {
8079    _normalizer && _normalizer.kill();
8080    _normalizer = vars;
8081    return;
8082  }
8083
8084  var normalizer = vars instanceof _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer ? vars : _getScrollNormalizer(vars);
8085  _normalizer && _normalizer.target === normalizer.target && _normalizer.kill();
8086  _isViewport(normalizer.target) && (_normalizer = normalizer);
8087  return normalizer;
8088};
8089
8090ScrollTrigger.core = {
8091  // smaller file size way to leverage in ScrollSmoother and Observer
8092  _getVelocityProp: _Observer_js__WEBPACK_IMPORTED_MODULE_0__._getVelocityProp,
8093  _inputObserver: _inputObserver,
8094  _scrollers: _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers,
8095  _proxies: _Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies,
8096  bridge: {
8097    // when normalizeScroll sets the scroll position (ss = setScroll)
8098    ss: function ss() {
8099      _lastScrollTime || _dispatch("scrollStart");
8100      _lastScrollTime = _getTime();
8101    },
8102    // a way to get the _refreshing value in Observer
8103    ref: function ref() {
8104      return _refreshing;
8105    }
8106  }
8107};
8108_getGSAP() && gsap.registerPlugin(ScrollTrigger);
8109//# sourceURL=[module]
8110//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvU2Nyb2xsVHJpZ2dlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ29KOztBQUVwSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLFNBQVMsMkRBQWE7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMkRBQWE7QUFDM0I7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHlCQUF5QixrREFBUTtBQUNqQztBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsMkRBQWE7QUFDOUQsQ0FBQztBQUNEO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtB
8110QUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQixrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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BQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOOztBQUVBO0FBQ0EsYUFBYSxrREFBUTtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsa0RBQVE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQiwwREFBZ0I7QUFDcEM7QUFDQSxjQUFjLG9EQUFVO0FBQ3hCLFlBQVksa0RBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS9nc2FwQDMuMTUuMC9ub2RlX21vZHVsZXMvZ3NhcC9TY3JvbGxUcmlnZ2VyLmpzP2I0ODciXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBTY3JvbGxUcmlnZ2VyIDMuMTUuMFxuICogaHR0cHM6Ly9nc2FwLmNvbVxuICpcbiAqIEBsaWNlbnNlIENvcHlyaWdodCAyMDA4LTIwMjYsIEdyZWVuU29jay4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFN1YmplY3QgdG8gdGhlIHRlcm1zIGF0IGh0dHBzOi8vZ3NhcC5jb20vc3RhbmRhcmQtbGljZW5zZVxuICogQGF1dGhvcjogSmFjayBEb3lsZSwgamFja0BncmVlbnNvY2suY29tXG4qL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgT2JzZXJ2ZXIsIF9nZXRUYXJnZXQsIF92ZXJ0aWNhbCwgX2hvcml6b250YWwsIF9zY3JvbGxlcnMsIF9wcm94aWVzLCBfZ2V0U2Nyb2xsRnVuYywgX2dldFByb3h5UHJvcCwgX2dldFZlbG9jaXR5UHJvcCB9IGZyb20gXCIuL09ic2VydmVyLmpzXCI7XG5cbnZhciBnc2FwLFxuICAgIF9jb3JlSW5pdHRlZCxcbiAgICBfd2luLFxuICAgIF9kb2MsXG4gICAgX2RvY0VsLFxuICAgIF9ib2R5LFxuICAgIF9yb290LFxuICAgIF9yZXNpemVEZWxheSxcbiAgICBfdG9BcnJheSxcbiAgICBfY2xhbXAsXG4gICAgX3RpbWUyLFxuICAgIF9zeW5jSW50ZXJ2YWwsXG4gICAgX3JlZnJlc2hpbmcsXG4gICAgX3BvaW50ZXJJc0Rvd24sXG4gICAgX3RyYW5zZm9ybVByb3AsXG4gICAgX2ksXG4gICAgX3ByZXZXaWR0aCxcbiAgICBfcHJldkhlaWdodCxcbiAgICBfYXV0b1JlZnJlc2gsXG4gICAgX3NvcnQsXG4gICAgX3N1cHByZXNzT3ZlcndyaXRlcyxcbiAgICBfaWdub3JlUmVzaXplLFxuICAgIF9ub3JtYWxpemVyLFxuICAgIF9pZ25vcmVNb2JpbGVSZXNpemUsXG4gICAgX2Jhc2VTY3JlZW5IZWlnaHQsXG4gICAgX2Jhc2VTY3JlZW5XaWR0aCxcbiAgICBfZml4SU9TQnVnLFxuICAgIF9jb250ZXh0LFxuICAgIF9zY3JvbGxSZXN0b3JhdGlvbixcbiAgICBfZGl2MTAwdmgsXG4gICAgXzEwMHZoLFxuICAgIF9pc1JldmVydGVkLFxuICAgIF9jbGFtcGluZ01heCxcbiAgICBfbGltaXRDYWxsYmFja3MsXG4gICAgLy8gaWYgdHJ1ZSwgd2UnbGwgb25seSB0cmlnZ2VyIGNhbGxiYWNrcyBpZiB0aGUgYWN0aXZlIHN0YXRlIHRvZ2dsZXMsIHNvIGlmIHlvdSBzY3JvbGwgaW1tZWRpYXRlbHkgcGFzdCBib3RoIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiBhIFNjcm9sbFRyaWdnZXIgKHRodXMgaW5hY3RpdmUgdG8gaW5hY3RpdmUpLCBuZWl0aGVyIGl0cyBvbkVudGVyIG5vciBvbkxlYXZlIHdpbGwgYmUgY2FsbGVkLiBUaGlzIGlzIHVzZWZ1bCBkdXJpbmcgc3RhcnR1cC5cbl9zdGFydHVwID0gMSxcbiAgICBfZ2V0VGltZSA9IERhdGUubm93LFxuICAgIF90aW1lMSA9IF9nZXRUaW1lKCksXG4gICAgX2xhc3RTY3JvbGxUaW1lID0gMCxcbiAgICBfZW5hYmxlZCA9IDAsXG4gICAgX3BhcnNlQ2xhbXAgPSBmdW5jdGlvbiBfcGFyc2VDbGFtcCh2YWx1ZSwgdHlwZSwgc2VsZikge1xuICB2YXIgY2xhbXAgPSBfaXNTdHJpbmcodmFsdWUpICYmICh2YWx1ZS5zdWJzdHIoMCwgNikgPT09IFwiY2xhbXAoXCIgfHwgdmFsdWUuaW5kZXhPZihcIm1heFwiKSA+IC0xKTtcbiAgc2VsZltcIl9cIiArIHR5cGUgKyBcIkNsYW1wXCJdID0gY2xhbXA7XG4gIHJldHVybiBjbGFtcCA/IHZhbHVlLnN1YnN0cig2LCB2YWx1ZS5sZW5ndGggLSA3KSA6IHZhbHVlO1xufSxcbiAgICBfa2VlcENsYW1wID0gZnVuY3Rpb24gX2tlZXBDbGFtcCh2YWx1ZSwgY2xhbXApIHtcbiAgcmV0dXJuIGNsYW1wICYmICghX2lzU3RyaW5nKHZhbHVlKSB8fCB2YWx1ZS
81105zdWJzdHIoMCwgNikgIT09IFwiY2xhbXAoXCIpID8gXCJjbGFtcChcIiArIHZhbHVlICsgXCIpXCIgOiB2YWx1ZTtcbn0sXG4gICAgX3JhZkJ1Z0ZpeCA9IGZ1bmN0aW9uIF9yYWZCdWdGaXgoKSB7XG4gIHJldHVybiBfZW5hYmxlZCAmJiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3JhZkJ1Z0ZpeCk7XG59LFxuICAgIC8vIGluIHNvbWUgYnJvd3NlcnMgKGxpa2UgRmlyZWZveCksIHNjcmVlbiByZXBhaW50cyB3ZXJlbid0IGNvbnNpc3RlbnQgdW5sZXNzIHdlIGhhZCBTT01FVEhJTkcgcXVldWVkIHVwIGluIHJlcXVlc3RBbmltYXRpb25GcmFtZSgpISBTbyB0aGlzIGp1c3QgY3JlYXRlcyBhIHN1cGVyIHNpbXBsZSBsb29wIHRvIGtlZXAgaXQgYWxpdmUgYW5kIHNtb290aCBvdXQgcmVwYWludHMuXG5fcG9pbnRlckRvd25IYW5kbGVyID0gZnVuY3Rpb24gX3BvaW50ZXJEb3duSGFuZGxlcigpIHtcbiAgcmV0dXJuIF9wb2ludGVySXNEb3duID0gMTtcbn0sXG4gICAgX3BvaW50ZXJVcEhhbmRsZXIgPSBmdW5jdGlvbiBfcG9pbnRlclVwSGFuZGxlcigpIHtcbiAgcmV0dXJuIF9wb2ludGVySXNEb3duID0gMDtcbn0sXG4gICAgX3Bhc3NUaHJvdWdoID0gZnVuY3Rpb24gX3Bhc3NUaHJvdWdoKHYpIHtcbiAgcmV0dXJuIHY7XG59LFxuICAgIF9yb3VuZCA9IGZ1bmN0aW9uIF9yb3VuZCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwMDAwMCkgLyAxMDAwMDAgfHwgMDtcbn0sXG4gICAgX3dpbmRvd0V4aXN0cyA9IGZ1bmN0aW9uIF93aW5kb3dFeGlzdHMoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xufSxcbiAgICBfZ2V0R1NBUCA9IGZ1bmN0aW9uIF9nZXRHU0FQKCkge1xuICByZXR1cm4gZ3NhcCB8fCBfd2luZG93RXhpc3RzKCkgJiYgKGdzYXAgPSB3aW5kb3cuZ3NhcCkgJiYgZ3NhcC5yZWdpc3RlclBsdWdpbiAmJiBnc2FwO1xufSxcbiAgICBfaXNWaWV3cG9ydCA9IGZ1bmN0aW9uIF9pc1ZpZXdwb3J0KGUpIHtcbiAgcmV0dXJuICEhfl9yb290LmluZGV4T2YoZSk7XG59LFxuICAgIF9nZXRWaWV3cG9ydERpbWVuc2lvbiA9IGZ1bmN0aW9uIF9nZXRWaWV3cG9ydERpbWVuc2lvbihkaW1lbnNpb25Qcm9wZXJ0eSkge1xuICByZXR1cm4gKGRpbWVuc2lvblByb3BlcnR5ID09PSBcIkhlaWdodFwiID8gXzEwMHZoIDogX3dpbltcImlubmVyXCIgKyBkaW1lbnNpb25Qcm9wZXJ0eV0pIHx8IF9kb2NFbFtcImNsaWVudFwiICsgZGltZW5zaW9uUHJvcGVydHldIHx8IF9ib2R5W1wiY2xpZW50XCIgKyBkaW1lbnNpb25Qcm9wZXJ0eV07XG59LFxuICAgIF9nZXRCb3VuZHNGdW5jID0gZnVuY3Rpb24gX2dldEJvdW5kc0Z1bmMoZWxlbWVudCkge1xuICByZXR1cm4gX2dldFByb3h5UHJvcChlbGVtZW50LCBcImdldEJvdW5kaW5nQ2xpZW50UmVjdFwiKSB8fCAoX2lzVmlld3BvcnQoZWxlbWVudCkgPyBmdW5jdGlvbiAoKSB7XG4gICAgX3dpbk9mZnNldHMud2lkdGggPSBfd2luLmlubmVyV2lkdGg7XG4gICAgX3dpbk9mZnNldHMuaGVpZ2h0ID0gXzEwMHZoO1xuICAgIHJldHVybiBfd2luT2Zmc2V0cztcbiAgfSA6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2dldEJvdW5kcyhlbGVtZW50KTtcbiAgfSk7XG59LFxuICAgIF9nZXRTaXplRnVuYyA9IGZ1bmN0aW9uIF9nZXRTaXplRnVuYyhzY3JvbGxlciwgaXNWaWV3cG9ydCwgX3JlZikge1xuICB2YXIgZCA9IF9yZWYuZCxcbiAgICAgIGQyID0gX3JlZi5kMixcbiAgICAgIGEgPSBfcmVmLmE7XG4gIHJldHVybiAoYSA9IF9nZXRQcm94eVByb3Aoc2Nyb2xsZXIsIFwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0XCIpKSA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYSgpW2RdO1xuICB9IDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAoaXNWaWV3cG9ydCA/IF9nZXRWaWV3cG9ydERpbWVuc2lvbihkMikgOiBzY3JvbGxlcltcImNsaWVudFwiICsgZDJdKSB8fCAwO1xuICB9O1xufSxcbiAgICBfZ2V0T2Zmc2V0c0Z1bmMgPSBmdW5jdGlvbiBfZ2V0T2Zmc2V0c0Z1bmMoZWxlbWVudCwgaXNWaWV3cG9ydCkge1xuICByZXR1cm4gIWlzVmlld3BvcnQgfHwgfl9wcm94aWVzLmluZGV4T2YoZWxlbWVudCkgPyBfZ2V0Qm91bmRzRnVuYyhlbGVtZW50KSA6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3dpbk9mZnNldHM7XG4gIH07XG59LFxuICAgIF9tYXhTY3JvbGwgPSBmdW5jdGlvbiBfbWF4U2Nyb2xsKGVsZW1lbnQsIF9yZWYyKSB7XG4gIHZhciBzID0gX3JlZjIucyxcbiAgICAgIGQyID0gX3JlZjIuZDIsXG4gICAgICBkID0gX3JlZjIuZCxcbiAgICAgIGEgPSBfcmVmMi5hO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgKHMgPSBcInNjcm9sbFwiICsgZDIpICYmIChhID0gX2dldFByb3h5UHJvcChlbGVtZW50LCBzKSkgPyBhKCkgLSBfZ2V0Qm91bmRzRnVuYyhlbGVtZW50KSgpW2RdIDogX2lzVmlld3BvcnQoZWxlbWVudCkgPyAoX2RvY0VsW3NdIHx8IF9ib2R5W3NdKSAtIF9nZXRWaWV3cG9ydERpbWVuc2lvbihkMikgOiBlbGVtZW50W3NdIC0gZWxlbWVudFtcIm9mZnNldFwiICsgZDJdKTtcbn0sXG4gICAgX2l0ZXJhdGVBdXRvUmVmcmVzaCA9IGZ1bmN0aW9uIF9pdGVyYXRlQXV0b1JlZnJlc2goZnVuYywgZXZlbnRzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgX2F1dG9SZWZyZXNoLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgKCFldmVudHMgfHwgfmV2ZW50cy5pbmRleE9mKF9hdXRvUmVmcmVzaFtpICsgMV0pKSAmJiBmdW5jKF9hdXRvUmVmcmVzaFtpXSwgX2F1dG9SZWZyZXNoW2kgKyAxXSwgX2F1dG9SZWZyZXNoW2kgKyAyXSk7XG4gIH1cbn0sXG4gICAgX2lzU3RyaW5nID0gZnVuY3Rpb24gX2lzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG59LFxuICAgIF9pc0Z1bmN0aW9uID0gZnVuY3Rpb24gX2lzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufSxcbiAgICBfaXNOdW1iZXIgPSBmdW5jdGlvbiBfaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcbn0sXG4gICAgX2lzT2JqZWN0ID0gZnVuY3Rpb24gX2lzT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybi
8110B0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCI7XG59LFxuICAgIF9lbmRBbmltYXRpb24gPSBmdW5jdGlvbiBfZW5kQW5pbWF0aW9uKGFuaW1hdGlvbiwgcmV2ZXJzZWQsIHBhdXNlKSB7XG4gIHJldHVybiBhbmltYXRpb24gJiYgYW5pbWF0aW9uLnByb2dyZXNzKHJldmVyc2VkID8gMCA6IDEpICYmIHBhdXNlICYmIGFuaW1hdGlvbi5wYXVzZSgpO1xufSxcbiAgICBfY2FsbGJhY2sgPSBmdW5jdGlvbiBfY2FsbGJhY2soc2VsZiwgZnVuYywgZXh0cmFQYXJhbSkge1xuICBpZiAoc2VsZi5lbmFibGVkKSB7XG4gICAgdmFyIHJlc3VsdCA9IHNlbGYuX2N0eCA/IHNlbGYuX2N0eC5hZGQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgZXh0cmFQYXJhbSk7XG4gICAgfSkgOiBmdW5jKHNlbGYsIGV4dHJhUGFyYW0pO1xuICAgIHJlc3VsdCAmJiByZXN1bHQudG90YWxUaW1lICYmIChzZWxmLmNhbGxiYWNrQW5pbWF0aW9uID0gcmVzdWx0KTtcbiAgfVxufSxcbiAgICBfYWJzID0gTWF0aC5hYnMsXG4gICAgX2xlZnQgPSBcImxlZnRcIixcbiAgICBfdG9wID0gXCJ0b3BcIixcbiAgICBfcmlnaHQgPSBcInJpZ2h0XCIsXG4gICAgX2JvdHRvbSA9IFwiYm90dG9tXCIsXG4gICAgX3dpZHRoID0gXCJ3aWR0aFwiLFxuICAgIF9oZWlnaHQgPSBcImhlaWdodFwiLFxuICAgIF9SaWdodCA9IFwiUmlnaHRcIixcbiAgICBfTGVmdCA9IFwiTGVmdFwiLFxuICAgIF9Ub3AgPSBcIlRvcFwiLFxuICAgIF9Cb3R0b20gPSBcIkJvdHRvbVwiLFxuICAgIF9wYWRkaW5nID0gXCJwYWRkaW5nXCIsXG4gICAgX21hcmdpbiA9IFwibWFyZ2luXCIsXG4gICAgX1dpZHRoID0gXCJXaWR0aFwiLFxuICAgIF9IZWlnaHQgPSBcIkhlaWdodFwiLFxuICAgIF9weCA9IFwicHhcIixcbiAgICBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uIF9nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIF93aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkRPQ1VNRU5UX05PREUgPyBlbGVtZW50LnNjcm9sbGluZ0VsZW1lbnQgOiBlbGVtZW50KTtcbn0sXG4gICAgX21ha2VQb3NpdGlvbmFibGUgPSBmdW5jdGlvbiBfbWFrZVBvc2l0aW9uYWJsZShlbGVtZW50KSB7XG4gIC8vIGlmIHRoZSBlbGVtZW50IGFscmVhZHkgaGFzIHBvc2l0aW9uOiBhYnNvbHV0ZSBvciBmaXhlZCwgbGVhdmUgdGhhdCwgb3RoZXJ3aXNlIG1ha2UgaXQgcG9zaXRpb246IHJlbGF0aXZlXG4gIHZhciBwb3NpdGlvbiA9IF9nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uO1xuXG4gIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgPyBwb3NpdGlvbiA6IFwicmVsYXRpdmVcIjtcbn0sXG4gICAgX3NldERlZmF1bHRzID0gZnVuY3Rpb24gX3NldERlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHtcbiAgZm9yICh2YXIgcCBpbiBkZWZhdWx0cykge1xuICAgIHAgaW4gb2JqIHx8IChvYmpbcF0gPSBkZWZhdWx0c1twXSk7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSxcbiAgICBfZ2V0Qm91bmRzID0gZnVuY3Rpb24gX2dldEJvdW5kcyhlbGVtZW50LCB3aXRob3V0VHJhbnNmb3Jtcykge1xuICB2YXIgdHdlZW4gPSB3aXRob3V0VHJhbnNmb3JtcyAmJiBfZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVtfdHJhbnNmb3JtUHJvcF0gIT09IFwibWF0cml4KDEsIDAsIDAsIDEsIDAsIDApXCIgJiYgZ3NhcC50byhlbGVtZW50LCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHhQZXJjZW50OiAwLFxuICAgIHlQZXJjZW50OiAwLFxuICAgIHJvdGF0aW9uOiAwLFxuICAgIHJvdGF0aW9uWDogMCxcbiAgICByb3RhdGlvblk6IDAsXG4gICAgc2NhbGU6IDEsXG4gICAgc2tld1g6IDAsXG4gICAgc2tld1k6IDBcbiAgfSkucHJvZ3Jlc3MoMSksXG4gICAgICBib3VuZHMgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBlbGVtZW50LnNjcm9sbGluZ0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHR3ZWVuICYmIHR3ZWVuLnByb2dyZXNzKDApLmtpbGwoKTtcbiAgcmV0dXJuIGJvdW5kcztcbn0sXG4gICAgX2dldFNpemUgPSBmdW5jdGlvbiBfZ2V0U2l6ZShlbGVtZW50LCBfcmVmMykge1xuICB2YXIgZDIgPSBfcmVmMy5kMjtcbiAgcmV0dXJuIGVsZW1lbnRbXCJvZmZzZXRcIiArIGQyXSB8fCBlbGVtZW50W1wiY2xpZW50XCIgKyBkMl0gfHwgMDtcbn0sXG4gICAgX2dldExhYmVsUmF0aW9BcnJheSA9IGZ1bmN0aW9uIF9nZXRMYWJlbFJhdGlvQXJyYXkodGltZWxpbmUpIHtcbiAgdmFyIGEgPSBbXSxcbiAgICAgIGxhYmVscyA9IHRpbWVsaW5lLmxhYmVscyxcbiAgICAgIGR1cmF0aW9uID0gdGltZWxpbmUuZHVyYXRpb24oKSxcbiAgICAgIHA7XG5cbiAgZm9yIChwIGluIGxhYmVscykge1xuICAgIGEucHVzaChsYWJlbHNbcF0gLyBkdXJhdGlvbik7XG4gIH1cblxuICByZXR1cm4gYTtcbn0sXG4gICAgX2dldENsb3Nlc3RMYWJlbCA9IGZ1bmN0aW9uIF9nZXRDbG9zZXN0TGFiZWwoYW5pbWF0aW9uKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gZ3NhcC51dGlscy5zbmFwKF9nZXRMYWJlbFJhdGlvQXJyYXkoYW5pbWF0aW9uKSwgdmFsdWUpO1xuICB9O1xufSxcbiAgICBfc25hcERpcmVjdGlvbmFsID0gZnVuY3Rpb24gX3NuYXBEaXJlY3Rpb25hbChzbmFwSW5jcmVtZW50T3JBcnJheSkge1xuICB2YXIgc25hcCA9IGdzYXAudXRpbHMuc25hcChzbmFwSW5jcmVtZW50T3JBcnJheSksXG4gICAgICBhID0gQXJyYXkuaXNBcnJheShzbmFwSW5jcmVtZW50T3JBcnJheSkgJiYgc25hcEluY3JlbWVudE9yQXJyYXkuc2xpY2UoMCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSk7XG4gIHJldHVybiBhID8gZnVuY3Rpb24gKHZhbHVlLCBkaXJlY3Rpb24sIHRocmVzaG9sZCkge1xuICAgIGlmICh0aHJlc2hvbGQgPT09IHZvaWQgMCkge1xuICAgICAgdGhyZXNob2xkID0gMWUtMztcbiAgICB9XG5cbiAgICB2YXIgaTtcblxuICAgIGlmICghZGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gc25hcCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGRpcmVjdGlvbiA+IDApIHtcbiAgICAgIHZhbHVlIC09IHRocmVzaG9sZDsgLy8gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzLiBJZiB3ZSdyZSB0b28gc3RyaWN0LCBpdCBtaWdodCBzbmFwIGZvcndhcmQsIHRoZW4gaW1tZWRpYXRlbHkgYWdhaW4sIGFuZCBhZ2Fpbi5cblxuICAgICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFbaV0gPj0gdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYVtpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYVtpIC0gMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGkgPSBhLmxlbmd0aDtcbiAgICAgIHZhbHVlICs9IHRocmVzaG9sZDtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAoYVtpXSA8PSB2YWx1ZSkge1xuICAgICAgICAgI
8110HJldHVybiBhW2ldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFbMF07XG4gIH0gOiBmdW5jdGlvbiAodmFsdWUsIGRpcmVjdGlvbiwgdGhyZXNob2xkKSB7XG4gICAgaWYgKHRocmVzaG9sZCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aHJlc2hvbGQgPSAxZS0zO1xuICAgIH1cblxuICAgIHZhciBzbmFwcGVkID0gc25hcCh2YWx1ZSk7XG4gICAgcmV0dXJuICFkaXJlY3Rpb24gfHwgTWF0aC5hYnMoc25hcHBlZCAtIHZhbHVlKSA8IHRocmVzaG9sZCB8fCBzbmFwcGVkIC0gdmFsdWUgPCAwID09PSBkaXJlY3Rpb24gPCAwID8gc25hcHBlZCA6IHNuYXAoZGlyZWN0aW9uIDwgMCA/IHZhbHVlIC0gc25hcEluY3JlbWVudE9yQXJyYXkgOiB2YWx1ZSArIHNuYXBJbmNyZW1lbnRPckFycmF5KTtcbiAgfTtcbn0sXG4gICAgX2dldExhYmVsQXREaXJlY3Rpb24gPSBmdW5jdGlvbiBfZ2V0TGFiZWxBdERpcmVjdGlvbih0aW1lbGluZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlLCBzdCkge1xuICAgIHJldHVybiBfc25hcERpcmVjdGlvbmFsKF9nZXRMYWJlbFJhdGlvQXJyYXkodGltZWxpbmUpKSh2YWx1ZSwgc3QuZGlyZWN0aW9uKTtcbiAgfTtcbn0sXG4gICAgX211bHRpTGlzdGVuZXIgPSBmdW5jdGlvbiBfbXVsdGlMaXN0ZW5lcihmdW5jLCBlbGVtZW50LCB0eXBlcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHR5cGVzLnNwbGl0KFwiLFwiKS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgcmV0dXJuIGZ1bmMoZWxlbWVudCwgdHlwZSwgY2FsbGJhY2spO1xuICB9KTtcbn0sXG4gICAgX2FkZExpc3RlbmVyID0gZnVuY3Rpb24gX2FkZExpc3RlbmVyKGVsZW1lbnQsIHR5cGUsIGZ1bmMsIG5vblBhc3NpdmUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmdW5jLCB7XG4gICAgcGFzc2l2ZTogIW5vblBhc3NpdmUsXG4gICAgY2FwdHVyZTogISFjYXB0dXJlXG4gIH0pO1xufSxcbiAgICBfcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiBfcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgdHlwZSwgZnVuYywgY2FwdHVyZSkge1xuICByZXR1cm4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmMsICEhY2FwdHVyZSk7XG59LFxuICAgIF93aGVlbExpc3RlbmVyID0gZnVuY3Rpb24gX3doZWVsTGlzdGVuZXIoZnVuYywgZWwsIHNjcm9sbEZ1bmMpIHtcbiAgc2Nyb2xsRnVuYyA9IHNjcm9sbEZ1bmMgJiYgc2Nyb2xsRnVuYy53aGVlbEhhbmRsZXI7XG5cbiAgaWYgKHNjcm9sbEZ1bmMpIHtcbiAgICBmdW5jKGVsLCBcIndoZWVsXCIsIHNjcm9sbEZ1bmMpO1xuICAgIGZ1bmMoZWwsIFwidG91Y2htb3ZlXCIsIHNjcm9sbEZ1bmMpO1xuICB9XG59LFxuICAgIF9tYXJrZXJEZWZhdWx0cyA9IHtcbiAgc3RhcnRDb2xvcjogXCJncmVlblwiLFxuICBlbmRDb2xvcjogXCJyZWRcIixcbiAgaW5kZW50OiAwLFxuICBmb250U2l6ZTogXCIxNnB4XCIsXG4gIGZvbnRXZWlnaHQ6IFwibm9ybWFsXCJcbn0sXG4gICAgX2RlZmF1bHRzID0ge1xuICB0b2dnbGVBY3Rpb25zOiBcInBsYXlcIixcbiAgYW50aWNpcGF0ZVBpbjogMFxufSxcbiAgICBfa2V5d29yZHMgPSB7XG4gIHRvcDogMCxcbiAgbGVmdDogMCxcbiAgY2VudGVyOiAwLjUsXG4gIGJvdHRvbTogMSxcbiAgcmlnaHQ6IDFcbn0sXG4gICAgX29mZnNldFRvUHggPSBmdW5jdGlvbiBfb2Zmc2V0VG9QeCh2YWx1ZSwgc2l6ZSkge1xuICBpZiAoX2lzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBlcUluZGV4ID0gdmFsdWUuaW5kZXhPZihcIj1cIiksXG4gICAgICAgIHJlbGF0aXZlID0gfmVxSW5kZXggPyArKHZhbHVlLmNoYXJBdChlcUluZGV4IC0gMSkgKyAxKSAqIHBhcnNlRmxvYXQodmFsdWUuc3Vic3RyKGVxSW5kZXggKyAxKSkgOiAwO1xuXG4gICAgaWYgKH5lcUluZGV4KSB7XG4gICAgICB2YWx1ZS5pbmRleE9mKFwiJVwiKSA+IGVxSW5kZXggJiYgKHJlbGF0aXZlICo9IHNpemUgLyAxMDApO1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHIoMCwgZXFJbmRleCAtIDEpO1xuICAgIH1cblxuICAgIHZhbHVlID0gcmVsYXRpdmUgKyAodmFsdWUgaW4gX2tleXdvcmRzID8gX2tleXdvcmRzW3ZhbHVlXSAqIHNpemUgOiB+dmFsdWUuaW5kZXhPZihcIiVcIikgPyBwYXJzZUZsb2F0KHZhbHVlKSAqIHNpemUgLyAxMDAgOiBwYXJzZUZsb2F0KHZhbHVlKSB8fCAwKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn0sXG4gICAgX2NyZWF0ZU1hcmtlciA9IGZ1bmN0aW9uIF9jcmVhdGVNYXJrZXIodHlwZSwgbmFtZSwgY29udGFpbmVyLCBkaXJlY3Rpb24sIF9yZWY0LCBvZmZzZXQsIG1hdGNoV2lkdGhFbCwgY29udGFpbmVyQW5pbWF0aW9uKSB7XG4gIHZhciBzdGFydENvbG9yID0gX3JlZjQuc3RhcnRDb2xvcixcbiAgICAgIGVuZENvbG9yID0gX3JlZjQuZW5kQ29sb3IsXG4gICAgICBmb250U2l6ZSA9IF9yZWY0LmZvbnRTaXplLFxuICAgICAgaW5kZW50ID0gX3JlZjQuaW5kZW50LFxuICAgICAgZm9udFdlaWdodCA9IF9yZWY0LmZvbnRXZWlnaHQ7XG5cbiAgdmFyIGUgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICB1c2VGaXhlZFBvc2l0aW9uID0gX2lzVmlld3BvcnQoY29udGFpbmVyKSB8fCBfZ2V0UHJveHlQcm9wKGNvbnRhaW5lciwgXCJwaW5UeXBlXCIpID09PSBcImZpeGVkXCIsXG4gICAgICBpc1Njcm9sbGVyID0gdHlwZS5pbmRleE9mKFwic2Nyb2xsZXJcIikgIT09IC0xLFxuICAgICAgcGFyZW50ID0gdXNlRml4ZWRQb3NpdGlvbiA/IF9ib2R5IDogY29udGFpbmVyLnRhZ05hbWUgPT09IFwiSUZSQU1FXCIgPyBjb250YWluZXIuY29udGVudERvY3VtZW50LmJvZHkgOiBjb250YWluZXIsXG4gICAgICBpc1N0YXJ0ID0gdHlwZS5pbmRleE9mKFwic3RhcnRcIikgIT09IC0xLFxuICAgICAgY29sb3IgPSBpc1N0YXJ0ID8gc3RhcnRDb2xvciA6IGVuZENvbG9yLFxuICAgICAgY3NzID0gXCJib3JkZXItY29sb3I6XCIgKyBjb2xvciArIFwiO2ZvbnQtc2l6ZTpcIiArIGZvbnRTaXplICsgXCI7Y29sb3I6XCIgKyBjb2xvciArIFwiO2ZvbnQtd2VpZ2h0OlwiICsgZm9udFdlaWdodCArIFwiO3BvaW50ZXItZXZlbnRzOm5vbmU7d2hpdGUtc3BhY2U6bm93cmFwO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsQXJpYWw7ei1pbmRleDoxMDAwO3BhZGRpbmc6NHB4IDhweDtib3JkZXItd2lkdGg6MDtib3JkZXItc3R5bGU6c29saWQ7XCI7XG5cbiAgY3NzICs9IFwicG9zaXRpb246XCIgKyAoKGlzU2Nyb2xsZXIgfHwgY29udGFpbmVyQW5pbWF0aW9uKSAmJiB1c2VGaXhlZFBvc2l0aW9uID8gXCJmaXhlZDtcIiA6IFwiYWJzb2x1dGU7XCIpO1xuICAoaXNTY3JvbGxlciB8fCBjb250YWluZXJBbmltYXRpb24gfHwgIXVzZUZpeGVkUG9zaXRpb24pICYmIChjc3MgKz0gKGRpcmVjdGlvbiA9PT0gX3ZlcnRpY2FsID8gX3JpZ2h0IDogX2JvdHRvbSkgKyBcIjpcIiArIChvZmZzZXQgKyBwYXJzZU
8110Zsb2F0KGluZGVudCkpICsgXCJweDtcIik7XG4gIG1hdGNoV2lkdGhFbCAmJiAoY3NzICs9IFwiYm94LXNpemluZzpib3JkZXItYm94O3RleHQtYWxpZ246bGVmdDt3aWR0aDpcIiArIG1hdGNoV2lkdGhFbC5vZmZzZXRXaWR0aCArIFwicHg7XCIpO1xuICBlLl9pc1N0YXJ0ID0gaXNTdGFydDtcbiAgZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImdzYXAtbWFya2VyLVwiICsgdHlwZSArIChuYW1lID8gXCIgbWFya2VyLVwiICsgbmFtZSA6IFwiXCIpKTtcbiAgZS5zdHlsZS5jc3NUZXh0ID0gY3NzO1xuICBlLmlubmVyVGV4dCA9IG5hbWUgfHwgbmFtZSA9PT0gMCA/IHR5cGUgKyBcIi1cIiArIG5hbWUgOiB0eXBlO1xuICBwYXJlbnQuY2hpbGRyZW5bMF0gPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGUsIHBhcmVudC5jaGlsZHJlblswXSkgOiBwYXJlbnQuYXBwZW5kQ2hpbGQoZSk7XG4gIGUuX29mZnNldCA9IGVbXCJvZmZzZXRcIiArIGRpcmVjdGlvbi5vcC5kMl07XG5cbiAgX3Bvc2l0aW9uTWFya2VyKGUsIDAsIGRpcmVjdGlvbiwgaXNTdGFydCk7XG5cbiAgcmV0dXJuIGU7XG59LFxuICAgIF9wb3NpdGlvbk1hcmtlciA9IGZ1bmN0aW9uIF9wb3NpdGlvbk1hcmtlcihtYXJrZXIsIHN0YXJ0LCBkaXJlY3Rpb24sIGZsaXBwZWQpIHtcbiAgdmFyIHZhcnMgPSB7XG4gICAgZGlzcGxheTogXCJibG9ja1wiXG4gIH0sXG4gICAgICBzaWRlID0gZGlyZWN0aW9uW2ZsaXBwZWQgPyBcIm9zMlwiIDogXCJwMlwiXSxcbiAgICAgIG9wcG9zaXRlU2lkZSA9IGRpcmVjdGlvbltmbGlwcGVkID8gXCJwMlwiIDogXCJvczJcIl07XG4gIG1hcmtlci5faXNGbGlwcGVkID0gZmxpcHBlZDtcbiAgdmFyc1tkaXJlY3Rpb24uYSArIFwiUGVyY2VudFwiXSA9IGZsaXBwZWQgPyAtMTAwIDogMDtcbiAgdmFyc1tkaXJlY3Rpb24uYV0gPSBmbGlwcGVkID8gXCIxcHhcIiA6IDA7XG4gIHZhcnNbXCJib3JkZXJcIiArIHNpZGUgKyBfV2lkdGhdID0gMTtcbiAgdmFyc1tcImJvcmRlclwiICsgb3Bwb3NpdGVTaWRlICsgX1dpZHRoXSA9IDA7XG4gIHZhcnNbZGlyZWN0aW9uLnBdID0gc3RhcnQgKyBcInB4XCI7XG4gIGdzYXAuc2V0KG1hcmtlciwgdmFycyk7XG59LFxuICAgIF90cmlnZ2VycyA9IFtdLFxuICAgIF9pZHMgPSB7fSxcbiAgICBfcmFmSUQsXG4gICAgX3N5bmMgPSBmdW5jdGlvbiBfc3luYygpIHtcbiAgcmV0dXJuIF9nZXRUaW1lKCkgLSBfbGFzdFNjcm9sbFRpbWUgPiAzNCAmJiAoX3JhZklEIHx8IChfcmFmSUQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3VwZGF0ZUFsbCkpKTtcbn0sXG4gICAgX29uU2Nyb2xsID0gZnVuY3Rpb24gX29uU2Nyb2xsKCkge1xuICAvLyBwcmV2aW91c2x5LCB3ZSB0cmllZCB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZSBieSBiYXRjaGluZy9kZWZlcnJpbmcgdG8gdGhlIG5leHQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCksIGJ1dCBkaXNjb3ZlcmVkIHRoYXQgU2FmYXJpIGhhcyBhIGZldyBidWdzIHRoYXQgbWFrZSB0aGlzIHVud29ya2FibGUgKGVzcGVjaWFsbHkgb24gaU9TKS4gU2VlIGh0dHBzOi8vY29kZXBlbi5pby9HcmVlblNvY2svcGVuLzE2YzQzNWIxMmVmMDljMzgxMjUyMDQ4MThlN2I0NWZjP2VkaXRvcnM9MDAxMCBhbmQgaHR0cHM6Ly9jb2RlcGVuLmlvL0dyZWVuU29jay9wZW4vSmpPeFlwUS8zZGQ2NWNjZWM1YTYwZjFkODYyYzM1NWQ4NGQxNDU2Mj9lZGl0b3JzPTAwMTAgYW5kIGh0dHBzOi8vY29kZXBlbi5pby9HcmVlblNvY2svcGVuL0V4YnJQTmEvMDg3Y2VmMTk3ZGMzNTQ0NWEwOTUxZTg5MzVjNDE1MDM/ZWRpdG9ycz0wMDEwXG4gIGlmICghX25vcm1hbGl6ZXIgfHwgIV9ub3JtYWxpemVyLmlzUHJlc3NlZCB8fCBfbm9ybWFsaXplci5zdGFydFggPiBfYm9keS5jbGllbnRXaWR0aCkge1xuICAgIC8vIGlmIHRoZSB1c2VyIGlzIGRyYWdnaW5nIHRoZSBzY3JvbGxiYXIsIGFsbG93IGl0LlxuICAgIF9zY3JvbGxlcnMuY2FjaGUrKztcblxuICAgIGlmIChfbm9ybWFsaXplcikge1xuICAgICAgX3JhZklEIHx8IChfcmFmSUQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3VwZGF0ZUFsbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdXBkYXRlQWxsKCk7IC8vIFNhZmFyaSBpbiBwYXJ0aWN1bGFyIChvbiBkZXNrdG9wKSBORUVEUyB0aGUgaW1tZWRpYXRlIHVwZGF0ZSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSgpIHdoZXJlYXMgaU9TIHNlZW1zIHRvIGJlbmVmaXQgZnJvbSB3YWl0aW5nIGZvciB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCkgdGljaywgYXQgbGVhc3Qgd2hlbiBub3JtYWxpemluZy4gU2VlIGh0dHBzOi8vY29kZXBlbi5pby9HcmVlblNvY2svcGVuL3FCWW96cU8/ZWRpdG9ycz0wMTEwXG5cbiAgICB9XG5cbiAgICBfbGFzdFNjcm9sbFRpbWUgfHwgX2Rpc3BhdGNoKFwic2Nyb2xsU3RhcnRcIik7XG4gICAgX2xhc3RTY3JvbGxUaW1lID0gX2dldFRpbWUoKTtcbiAgfVxufSxcbiAgICBfc2V0QmFzZURpbWVuc2lvbnMgPSBmdW5jdGlvbiBfc2V0QmFzZURpbWVuc2lvbnMoKSB7XG4gIF9iYXNlU2NyZWVuV2lkdGggPSBfd2luLmlubmVyV2lkdGg7XG4gIF9iYXNlU2NyZWVuSGVpZ2h0ID0gX3dpbi5pbm5lckhlaWdodDtcbn0sXG4gICAgX29uUmVzaXplID0gZnVuY3Rpb24gX29uUmVzaXplKGZvcmNlKSB7XG4gIF9zY3JvbGxlcnMuY2FjaGUrKztcbiAgKGZvcmNlID09PSB0cnVlIHx8ICFfcmVmcmVzaGluZyAmJiAhX2lnbm9yZVJlc2l6ZSAmJiAhX2RvYy5mdWxsc2NyZWVuRWxlbWVudCAmJiAhX2RvYy53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCAmJiAoIV9pZ25vcmVNb2JpbGVSZXNpemUgfHwgX2Jhc2VTY3JlZW5XaWR0aCAhPT0gX3dpbi5pbm5lcldpZHRoIHx8IE1hdGguYWJzKF93aW4uaW5uZXJIZWlnaHQgLSBfYmFzZVNjcmVlbkhlaWdodCkgPiBfd2luLmlubmVySGVpZ2h0ICogMC4yNSkpICYmIF9yZXNpemVEZWxheS5yZXN0YXJ0KHRydWUpO1xufSxcbiAgICAvLyBpZ25vcmUgcmVzaXplcyB0cmlnZ2VyZWQgYnkgcmVmcmVzaCgpXG5fbGlzdGVuZXJzID0ge30sXG4gICAgX2VtcHR5QXJyYXkgPSBbXSxcbiAgICBfc29mdFJlZnJlc2ggPSBmdW5jdGlvbiBfc29mdFJlZnJlc2goKSB7XG4gIHJldHVybi
8110BfcmVtb3ZlTGlzdGVuZXIoU2Nyb2xsVHJpZ2dlciwgXCJzY3JvbGxFbmRcIiwgX3NvZnRSZWZyZXNoKSB8fCBfcmVmcmVzaEFsbCh0cnVlKTtcbn0sXG4gICAgX2Rpc3BhdGNoID0gZnVuY3Rpb24gX2Rpc3BhdGNoKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnNbdHlwZV0gJiYgX2xpc3RlbmVyc1t0eXBlXS5tYXAoZnVuY3Rpb24gKGYpIHtcbiAgICByZXR1cm4gZigpO1xuICB9KSB8fCBfZW1wdHlBcnJheTtcbn0sXG4gICAgX3NhdmVkU3R5bGVzID0gW10sXG4gICAgLy8gd2hlbiBTY3JvbGxUcmlnZ2VyLnNhdmVTdHlsZXMoKSBpcyBjYWxsZWQsIHRoZSBpbmxpbmUgc3R5bGVzIGFyZSByZWNvcmRlZCBpbiB0aGlzIEFycmF5IGluIGEgc2VxdWVudGlhbCBmb3JtYXQgbGlrZSBbZWxlbWVudCwgY3NzVGV4dCwgZ3NDYWNoZSwgbWVkaWFdLiBUaGlzIGtlZXBzIGl0IHZlcnkgbWVtb3J5LWVmZmljaWVudCBhbmQgZmFzdCB0byBpdGVyYXRlIHRocm91Z2guXG5fcmV2ZXJ0UmVjb3JkZWQgPSBmdW5jdGlvbiBfcmV2ZXJ0UmVjb3JkZWQobWVkaWEpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBfc2F2ZWRTdHlsZXMubGVuZ3RoOyBpICs9IDUpIHtcbiAgICBpZiAoIW1lZGlhIHx8IF9zYXZlZFN0eWxlc1tpICsgNF0gJiYgX3NhdmVkU3R5bGVzW2kgKyA0XS5xdWVyeSA9PT0gbWVkaWEpIHtcbiAgICAgIF9zYXZlZFN0eWxlc1tpXS5zdHlsZS5jc3NUZXh0ID0gX3NhdmVkU3R5bGVzW2kgKyAxXTtcbiAgICAgIF9zYXZlZFN0eWxlc1tpXS5nZXRCQm94ICYmIF9zYXZlZFN0eWxlc1tpXS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgX3NhdmVkU3R5bGVzW2kgKyAyXSB8fCBcIlwiKTtcbiAgICAgIF9zYXZlZFN0eWxlc1tpICsgM10udW5jYWNoZSA9IDE7XG4gICAgfVxuICB9XG59LFxuICAgIF9yZWNvcmRTY3JvbGxQb3NpdGlvbnMgPSBmdW5jdGlvbiBfcmVjb3JkU2Nyb2xsUG9zaXRpb25zKCkge1xuICByZXR1cm4gX3Njcm9sbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gX2lzRnVuY3Rpb24ob2JqKSAmJiArK29iai5jYWNoZUlEICYmIChvYmoucmVjID0gb2JqKCkpO1xuICB9KTtcbn0sXG4gICAgLy8gcmVjb3JkIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbi4gQWxzbyBmb3JjZSB0aGUgY2xlYXJpbmcgb2YgdGhlIGNhY2hlIGJlY2F1c2Ugc29tZSBicm93c2VycyB0YWtlIGEgbGl0dGxlIHdoaWxlIHRvIGRpc3BhdGNoIHRoZSBcInNjcm9sbFwiIGV2ZW50IGFuZCB0aGUgdXNlciBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIHRoZW4gY2FsbGVkIFNjcm9sbFRyaWdnZXIucmVmcmVzaCgpIHJpZ2h0IGF3YXlcbl9yZXZlcnRBbGwgPSBmdW5jdGlvbiBfcmV2ZXJ0QWxsKGtpbGwsIG1lZGlhKSB7XG4gIHZhciB0cmlnZ2VyO1xuXG4gIGZvciAoX2kgPSAwOyBfaSA8IF90cmlnZ2Vycy5sZW5ndGg7IF9pKyspIHtcbiAgICB0cmlnZ2VyID0gX3RyaWdnZXJzW19pXTtcblxuICAgIGlmICh0cmlnZ2VyICYmICghbWVkaWEgfHwgdHJpZ2dlci5fY3R4ID09PSBtZWRpYSkpIHtcbiAgICAgIGlmIChraWxsKSB7XG4gICAgICAgIHRyaWdnZXIua2lsbCgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXIucmV2ZXJ0KHRydWUsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9pc1JldmVydGVkID0gdHJ1ZTtcbiAgbWVkaWEgJiYgX3JldmVydFJlY29yZGVkKG1lZGlhKTtcbiAgbWVkaWEgfHwgX2Rpc3BhdGNoKFwicmV2ZXJ0XCIpO1xufSxcbiAgICBfY2xlYXJTY3JvbGxNZW1vcnkgPSBmdW5jdGlvbiBfY2xlYXJTY3JvbGxNZW1vcnkoc2Nyb2xsUmVzdG9yYXRpb24sIGZvcmNlKSB7XG4gIC8vIHplcm8tb3V0IGFsbCB0aGUgcmVjb3JkZWQgc2Nyb2xsIHBvc2l0aW9ucy4gRG9uJ3QgdXNlIF90cmlnZ2VycyBiZWNhdXNlIGlmLCBmb3IgZXhhbXBsZSwgLm1hdGNoTWVkaWEoKSBpcyB1c2VkIHRvIGNyZWF0ZSBzb21lIFNjcm9sbFRyaWdnZXJzIGFuZCB0aGVuIHRoZSB1c2VyIHJlc2l6ZXMgYW5kIGl0IHJlbW92ZXMgQUxMIFNjcm9sbFRyaWdnZXJzLCBhbmQgdGhlbiBnbyBiYWNrIHRvIGEgc2l6ZSB3aGVyZSB0aGVyZSBhcmUgU2Nyb2xsVHJpZ2dlcnMsIGl0IHdvdWxkIGhhdmUga2VwdCB0aGUgcG9zaXRpb24ocykgc2F2ZWQgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAgX3Njcm9sbGVycy5jYWNoZSsrO1xuICAoZm9yY2UgfHwgIV9yZWZyZXNoaW5nQWxsKSAmJiBfc2Nyb2xsZXJzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBfaXNGdW5jdGlvbihvYmopICYmIG9iai5jYWNoZUlEKysgJiYgKG9iai5yZWMgPSAwKTtcbiAgfSk7XG4gIF9pc1N0cmluZyhzY3JvbGxSZXN0b3JhdGlvbikgJiYgKF93aW4uaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IF9zY3JvbGxSZXN0b3JhdGlvbiA9IHNjcm9sbFJlc3RvcmF0aW9uKTtcbn0sXG4gICAgX3JlZnJlc2hpbmdBbGwsXG4gICAgX3JlZnJlc2hJRCA9IDAsXG4gICAgX3F1ZXVlUmVmcmVzaElELFxuICAgIF9xdWV1ZVJlZnJlc2hBbGwgPSBmdW5jdGlvbiBfcXVldWVSZWZyZXNoQWxsKCkge1xuICAvLyB3ZSBkb24ndCB3YW50IHRvIGNhbGwgX3JlZnJlc2hBbGwoKSBldmVyeSB0aW1lIHdlIGNyZWF0ZSBhIG5ldyBTY3JvbGxUcmlnZ2VyIChmb3IgcGVyZm9ybWFuY2UgcmVhc29ucykgLSBpdCdzIGJldHRlciB0byBiYXRjaCB0aGVtLiBTb21lIGZyYW1ld29ya3MgZHluYW1pY2FsbHkgbG9hZCBjb250ZW50IGFuZCB3ZSBjYW4ndCByZWx5IG9uIHRoZSB3aW5kb3cncyBcImxvYWRcIiBvciBcIkRPTUNvbnRlbnRMb2FkZWRcIiBldmVudHMgdG8gdHJpZ2dlciBpdC5cbiAgaWYgKF9xdWV1ZVJlZnJlc2hJRCAhPT0gX3JlZnJlc2hJRCkge1xuICAgIHZhciBpZCA9IF9xdWV1ZVJlZnJlc2hJRCA9IF9yZWZyZXNoSUQ7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpZCA9PT0gX3JlZnJlc2hJRCAmJiBfcmVmcmVzaEFsbCh0cnVlKTtcbiAgICB9KTtcbiAgfVxufSxcbiAgICBfcmVmcmVzaDEwMHZoID0gZnVuY3Rpb24gX3JlZnJlc2gxMDB2aCgpIHtcbiAgX2JvZHkuYXBwZW5kQ2hpbGQoX2RpdjEwMHZoKTtcblxuICBfMTAwdmggPSAhX25vcm1hbGl6ZXIgJiYgX2RpdjEwMHZoLm9mZnNldEhlaWdodCB8fCBfd2luLmlubmVySGVpZ2h0O1xuXG4gIF9ib2R5LnJlbW92ZUNoaWxkKF9kaXYxMDB2aCk7XG59LFxuICAgIF9oaWRlQWxsTWFya2VycyA9IGZ1bmN0aW9uIF9oaWRlQWxsTWFya2VycyhoaWRlKSB7XG4gIHJldHVybi
8110BfdG9BcnJheShcIi5nc2FwLW1hcmtlci1zdGFydCwgLmdzYXAtbWFya2VyLWVuZCwgLmdzYXAtbWFya2VyLXNjcm9sbGVyLXN0YXJ0LCAuZ3NhcC1tYXJrZXItc2Nyb2xsZXItZW5kXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgcmV0dXJuIGVsLnN0eWxlLmRpc3BsYXkgPSBoaWRlID8gXCJub25lXCIgOiBcImJsb2NrXCI7XG4gIH0pO1xufSxcbiAgICBfcmVmcmVzaEFsbCA9IGZ1bmN0aW9uIF9yZWZyZXNoQWxsKGZvcmNlLCBza2lwUmV2ZXJ0KSB7XG4gIF9kb2NFbCA9IF9kb2MuZG9jdW1lbnRFbGVtZW50OyAvLyBzb21lIGZyYW1ld29ya3MgbGlrZSBBc3RybyBtYXkgY2FjaGUgdGhlIDxib2R5PiBhbmQgcmVwbGFjZSBpdCBkdXJpbmcgcm91dGluZywgc28gd2UnbGwganVzdCByZS1yZWNvcmQgdGhlIF9kb2NFbCBhbmQgX2JvZHkgZm9yIHNhZmV0eSAob3RoZXJ3aXNlLCB0aGUgbWFya2VycyBtYXkgbm90IGdldCBhZGRlZCBwcm9wZXJseSkuXG5cbiAgX2JvZHkgPSBfZG9jLmJvZHk7XG4gIF9yb290ID0gW193aW4sIF9kb2MsIF9kb2NFbCwgX2JvZHldO1xuXG4gIGlmIChfbGFzdFNjcm9sbFRpbWUgJiYgIWZvcmNlICYmICFfaXNSZXZlcnRlZCkge1xuICAgIF9hZGRMaXN0ZW5lcihTY3JvbGxUcmlnZ2VyLCBcInNjcm9sbEVuZFwiLCBfc29mdFJlZnJlc2gpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3JlZnJlc2gxMDB2aCgpO1xuXG4gIF9yZWZyZXNoaW5nQWxsID0gU2Nyb2xsVHJpZ2dlci5pc1JlZnJlc2hpbmcgPSB0cnVlO1xuICBfaXNSZXZlcnRlZCB8fCBfcmVjb3JkU2Nyb2xsUG9zaXRpb25zKCk7XG5cbiAgdmFyIHJlZnJlc2hJbml0cyA9IF9kaXNwYXRjaChcInJlZnJlc2hJbml0XCIpO1xuXG4gIF9zb3J0ICYmIFNjcm9sbFRyaWdnZXIuc29ydCgpO1xuICBza2lwUmV2ZXJ0IHx8IF9yZXZlcnRBbGwoKTtcblxuICBfc2Nyb2xsZXJzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgIGlmIChfaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICBvYmouc21vb3RoICYmIChvYmoudGFyZ2V0LnN0eWxlLnNjcm9sbEJlaGF2aW9yID0gXCJhdXRvXCIpOyAvLyBzbW9vdGggc2Nyb2xsaW5nIGludGVyZmVyZXNcblxuICAgICAgb2JqKDApO1xuICAgIH1cbiAgfSk7XG5cbiAgX3RyaWdnZXJzLnNsaWNlKDApLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5yZWZyZXNoKCk7XG4gIH0pOyAvLyBkb24ndCBsb29wIHdpdGggX2kgYmVjYXVzZSBkdXJpbmcgYSByZWZyZXNoKCkgc29tZW9uZSBjb3VsZCBjYWxsIFNjcm9sbFRyaWdnZXIudXBkYXRlKCkgd2hpY2ggd291bGQgaXRlcmF0ZSB0aHJvdWdoIF9pIHJlc3VsdGluZyBpbiBhIHNraXAuXG5cblxuICBfaXNSZXZlcnRlZCA9IGZhbHNlO1xuXG4gIF90cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgLy8gbmVzdGVkIHBpbnMgKHBpbm5lZENvbnRhaW5lcikgd2l0aCBwaW5TcGFjaW5nIG1heSBleHBhbmQgdGhlIGNvbnRhaW5lciwgc28gd2UgbXVzdCBhY2NvbW1vZGF0ZSB0aGF0IGhlcmUuXG4gICAgaWYgKHQuX3N1YlBpbk9mZnNldCAmJiB0LnBpbikge1xuICAgICAgdmFyIHByb3AgPSB0LnZhcnMuaG9yaXpvbn
8110RhbCA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCIsXG4gICAgICAgICAgb3JpZ2luYWwgPSB0LnBpbltwcm9wXTtcbiAgICAgIHQucmV2ZXJ0KHRydWUsIDEpO1xuICAgICAgdC5hZGp1c3RQaW5TcGFjaW5nKHQucGluW3Byb3BdIC0gb3JpZ2luYWwpO1xuICAgICAgdC5yZWZyZXNoKCk7XG4gICAgfVxuICB9KTtcblxuICBfY2xhbXBpbmdNYXggPSAxOyAvLyBwaW5TcGFjaW5nIG1pZ2h0IGJlIHByb3BwaW5nIGEgcGFnZSBvcGVuLCB0aHVzIHdoZW4gd2UgLnNldFBvc2l0aW9ucygpIHRvIGNsYW1wIGEgU2Nyb2xsVHJpZ2dlcidzIGVuZCB3ZSBzaG91bGQgbGVhdmUgdGhlIHBpblNwYWNpbmcgYWxvbmUuIFRoYXQncyB3aGF0IHRoaXMgZmxhZyBpcyBmb3IuXG5cbiAgX2hpZGVBbGxNYXJrZXJzKHRydWUpO1xuXG4gIF90cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgLy8gdGhlIHNjcm9sbGVyJ3MgbWF4IHNjcm9sbCBwb3NpdGlvbiBtYXkgY2hhbmdlIGFmdGVyIGFsbCB0aGUgU2Nyb2xsVHJpZ2dlcnMgcmVmcmVzaGVkIChsaWtlIHBpbm5pbmcgY291bGQgcHVzaCBpdCBkb3duKSwgc28gd2UgbmVlZCB0byBsb29wIGJhY2sgYW5kIGNvcnJlY3QgYW55IHdpdGggZW5kOiBcIm1heFwiLiBTYW1lIGZvciBhbnl0aGluZyB3aXRoIGEgY2xhbXBlZCBlbmRcbiAgICB2YXIgbWF4ID0gX21heFNjcm9sbCh0LnNjcm9sbGVyLCB0Ll9kaXIpLFxuICAgICAgICBlbmRDbGFtcCA9IHQudmFycy5lbmQgPT09IFwibWF4XCIgfHwgdC5fZW5kQ2xhbXAgJiYgdC5lbmQgPiBtYXgsXG4gICAgICAgIHN0YXJ0Q2xhbXAgPSB0Ll9zdGFydENsYW1wICYmIHQuc3RhcnQgPj0gbWF4O1xuXG4gICAgKGVuZENsYW1wIHx8IHN0YXJ0Q2xhbXApICYmIHQuc2V0UG9zaXRpb25zKHN0YXJ0Q2xhbXAgPyBtYXggLSAxIDogdC5zdGFydCwgZW5kQ2xhbXAgPyBNYXRoLm1heChzdGFydENsYW1wID8gbWF4IDogdC5zdGFydCArIDEsIG1heCkgOiB0LmVuZCwgdHJ1ZSk7XG4gIH0pO1xuXG4gIF9oaWRlQWxsTWFya2VycyhmYWxzZSk7XG5cbiAgX2NsYW1waW5nTWF4ID0gMDtcbiAgcmVmcmVzaEluaXRzLmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LnJlbmRlciAmJiByZXN1bHQucmVuZGVyKC0xKTtcbiAgfSk7IC8vIGlmIHRoZSBvblJlZnJlc2hJbml0KCkgcmV0dXJucyBhbiBhbmltYXRpb24gKHR5cGljYWxseSBhIGdzYXAuc2V0KCkpLCByZXZlcnQgaXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBwdXQgdGhpbmdzIGluIGEgY2VydGFpbiBzcG90IGJlZm9yZSByZWZyZXNoaW5nIGZvciBtZWFzdXJlbWVudCBwdXJwb3NlcywgYW5kIHRoZW4gcHV0IHRoaW5ncyBiYWNrLlxuXG4gIF9zY3JvbGxlcnMuZm9yRWFjaChmdW5jdGlvbiAob2JqKSB7XG4gICAgaWYgKF9pc0Z1bmN0aW9uKG9iaikpIHtcbiAgICAgIG9iai5zbW9vdGggJiYgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG9iai50YXJnZXQuc3R5bGUuc2Nyb2xsQmVoYXZpb3IgPSBcInNtb290aFwiO1xuICAgICAgfSk7XG4gICAgICBvYmoucmVjICYmIG9iaihvYmoucmVjKTtcbiAgICB9XG4gIH0pO1xuXG4gIF9jbGVhclNjcm9sbE1lbW9yeShfc2Nyb2xsUmVzdG9yYXRpb24sIDEpO1xuXG4gIF9yZXNpemVEZWxheS5wYXVzZSgpO1xuXG4gIF9yZWZyZXNoSUQrKztcbiAgX3JlZnJlc2hpbmdBbGwgPSAyO1xuXG4gIF91cGRhdGVBbGwoMik7XG5cbiAgX3RyaWdnZXJzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gX2lzRnVuY3Rpb24odC52YXJzLm9uUmVmcmVzaCkgJiYgdC52YXJzLm9uUmVmcmVzaCh0KTtcbiAgfSk7XG5cbiAgX3JlZnJlc2hpbmdBbGwgPSBTY3JvbGxUcmlnZ2VyLmlzUmVmcmVzaGluZyA9IGZhbHNlO1xuXG4gIF9kaXNwYXRjaChcInJlZnJlc2hcIik7XG59LFxuICAgIF9sYXN0U2Nyb2xsID0gMCxcbiAgICBfZGlyZWN0aW9uID0gMSxcbiAgICBfcHJpbWFyeSxcbiAgICBfdXBkYXRlQWxsID0gZnVuY3Rpb24gX3VwZGF0ZUFsbChmb3JjZSkge1xuICBpZiAoZm9yY2UgPT09IDIgfHwgIV9yZWZyZXNoaW5nQWxsICYmICFfaXNSZXZlcnRlZCkge1xuICAgIC8vIF9pc1JldmVydGVkIGNvdWxkIGJlIHRydWUgaWYsIGZvciBleGFtcGxlLCBhIG1hdGNoTWVkaWEoKSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBleGVjdXRpbmcuIFdlIGRvbid0IHdhbnQgdG8gdXBkYXRlIGR1cmluZyB0aGUgdGltZSBldmVyeXRoaW5nIGlzIHJldmVydGVkLlxuICAgIFNjcm9sbFRyaWdnZXIuaXNVcGRhdGluZyA9IHRydWU7XG4gICAgX3ByaW1hcnkgJiYgX3ByaW1hcnkudXBkYXRlKDApOyAvLyBTY3JvbGxTbW9vdGhlciB1c2VzIHJlZnJlc2hQcmlvcml0eSAtOTk5OSB0byBiZWNvbWUgdGhlIHByaW1hcnkgdGhhdCBnZXRzIHVwZGF0ZWQgYmVmb3JlIGFsbCBvdGhlcnMgYmVjYXVzZSBpdCBhZmZlY3RzIHRoZSBzY3JvbGwgcG9zaXRpb24uXG5cbiAgICB2YXIgbCA9IF90cmlnZ2Vycy5sZW5ndGgsXG4gICAgICAgIHRpbWUgPSBfZ2V0VGltZSgpLFxuICAgICAgICByZWNvcmRWZWxvY2l0eSA9IHRpbWUgLSBfdGltZTEgPj0gNTAsXG4gICAgICAgIHNjcm9sbCA9IGwgJiYgX3RyaWdnZXJzWzBdLnNjcm9sbCgpO1xuXG4gICAgX2RpcmVjdGlvbiA9IF9sYXN0U2Nyb2xsID4gc2Nyb2xsID8gLTEgOiAxO1xuICAgIF9yZWZyZXNoaW5nQWxsIHx8IChfbGFzdFNjcm9sbCA9IHNjcm9sbCk7XG5cbiAgICBpZiAocmVjb3JkVmVsb2NpdHkpIHtcbiAgICAgIGlmIChfbGFzdFNjcm9sbFRpbWUgJiYgIV9wb2ludGVySXNEb3duICYmIHRpbWUgLSBfbGFzdFNjcm9sbFRpbWUgPiAyMDApIHtcbiAgICAgICAgX2xhc3RTY3JvbGxUaW1lID0gMDtcblxuICAgICAgICBfZGlzcGF0Y2goXCJzY3JvbGxFbmRcIik7XG4gICAgICB9XG5cbiAgICAgIF90aW1lMiA9IF90aW1lMTtcbiAgICAgIF90aW1lMSA9IHRpbWU7XG4gICAgfVxuXG4gICAgaWYgKF9kaXJlY3Rpb24gPCAwKSB7XG4gICAgICBfaSA9IGw7XG5cbiAgICAgIHdoaWxlIChfaS0tID4gMCkge1xuICAgICAgICBfdHJpZ2dlcnNbX2ldICYmIF90cmlnZ2Vyc1tfaV0udXBkYXRlKDAsIHJlY29yZFZlbG9jaXR5KTtcbiAgICAgIH1cblxuICAgICAgX2RpcmVjdGlvbiA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoX2kgPSAwOyBfaSA8IGw7IF9pKyspIHtcbiAgICAgICAgX3RyaWdnZXJzW19pXSAmJiBfdHJpZ2dlcnNbX2ldLnVwZGF0ZSgwLCByZWNvcmRWZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgU2Nyb2xsVHJpZ2dlci5pc1VwZGF0aW5nID0gZmFsc2U7XG4gIH1cblxuICBfcmFmSUQgPSAwO1xufSxcbiAgICBfcHJv
8110cE5hbWVzVG9Db3B5ID0gW19sZWZ0LCBfdG9wLCBfYm90dG9tLCBfcmlnaHQsIF9tYXJnaW4gKyBfQm90dG9tLCBfbWFyZ2luICsgX1JpZ2h0LCBfbWFyZ2luICsgX1RvcCwgX21hcmdpbiArIF9MZWZ0LCBcImRpc3BsYXlcIiwgXCJmbGV4U2hyaW5rXCIsIFwiZmxvYXRcIiwgXCJ6SW5kZXhcIiwgXCJncmlkQ29sdW1uU3RhcnRcIiwgXCJncmlkQ29sdW1uRW5kXCIsIFwiZ3JpZFJvd1N0YXJ0XCIsIFwiZ3JpZFJvd0VuZFwiLCBcImdyaWRBcmVhXCIsIFwianVzdGlmeVNlbGZcIiwgXCJhbGlnblNlbGZcIiwgXCJwbGFjZVNlbGZcIiwgXCJvcmRlclwiXSxcbiAgICBfc3RhdGVQcm9wcyA9IF9wcm9wTmFtZXNUb0NvcHkuY29uY2F0KFtfd2lkdGgsIF9oZWlnaHQsIFwiYm94U2l6aW5nXCIsIFwibWF4XCIgKyBfV2lkdGgsIFwibWF4XCIgKyBfSGVpZ2h0LCBcInBvc2l0aW9uXCIsIF9tYXJnaW4sIF9wYWRkaW5nLCBfcGFkZGluZyArIF9Ub3AsIF9wYWRkaW5nICsgX1JpZ2h0LCBfcGFkZGluZyArIF9Cb3R0b20sIF9wYWRkaW5nICsgX0xlZnRdKSxcbiAgICBfc3dhcFBpbk91dCA9IGZ1bmN0aW9uIF9zd2FwUGluT3V0KHBpbiwgc3BhY2VyLCBzdGF0ZSkge1xuICBfc2V0U3RhdGUoc3RhdGUpO1xuXG4gIHZhciBjYWNoZSA9IHBpbi5fZ3NhcDtcblxuICBpZiAoY2FjaGUuc3BhY2VySXNOYXRpdmUpIHtcbiAgICBfc2V0U3RhdGUoY2FjaGUuc3BhY2VyU3RhdGUpO1xuICB9IGVsc2UgaWYgKHBpbi5fZ3NhcC5zd2FwcGVkSW4pIHtcbiAgICB2YXIgcGFyZW50ID0gc3BhY2VyLnBhcmVudE5vZGU7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHBpbiwgc3BhY2VyKTtcbiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChzcGFjZXIpO1xuICAgIH1cbiAgfVxuXG4gIHBpbi5fZ3NhcC5zd2FwcGVkSW4gPSBmYWxzZTtcbn0sXG4gICAgX3N3YXBQaW5JbiA9IGZ1bmN0aW9uIF9zd2FwUGluSW4ocGluLCBzcGFjZXIsIGNzLCBzcGFjZXJTdGF0ZSkge1xuICBpZiAoIXBpbi5fZ3NhcC5zd2FwcGVkSW4pIHtcbiAgICB2YXIgaSA9IF9wcm9wTmFtZXNUb0NvcHkubGVuZ3RoLFxuICAgICAgICBzcGFjZXJTdHlsZSA9IHNwYWNlci5zdHlsZSxcbiAgICAgICAgcGluU3R5bGUgPSBwaW4uc3R5bGUsXG4gICAgICAgIHA7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBwID0gX3Byb3BOYW1lc1RvQ29weVtpXTtcbiAgICAgIHNwYWNlclN0eWxlW3BdID0gY3NbcF07XG4gICAgfVxuXG4gICAgc3BhY2VyU3R5bGUucG9zaXRpb24gPSBjcy5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiID8gXCJhYnNvbHV0ZVwiIDogXCJyZWxhdGl2ZVwiO1xuICAgIGNzLmRpc3BsYXkgPT09IFwiaW5saW5lXCIgJiYgKHNwYWNlclN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiKTtcbiAgICBwaW5TdHlsZVtfYm90dG9tXSA9IHBpblN0eWxlW19yaWdodF0gPSBcImF1dG9cIjtcbiAgICBzcGFjZXJTdHlsZS5mbGV4QmFzaXMgPSBjcy5mbGV4QmFzaXMgfHwgXCJhdXRvXCI7XG4gICAgc3BhY2VyU3R5bGUub3ZlcmZsb3cgPSBcInZpc2libGVcIjtcbiAgICBzcGFjZXJTdHlsZS5ib3hTaXppbmcgPSBcImJvcmRlci1ib3hcIjtcbiAgICBzcGFjZXJTdHlsZVtfd2lkdGhdID0gX2dldFNpemUocGluLCBfaG9yaXpvbnRhbCkgKyBfcHg7XG4gICAgc3BhY2VyU3R5bGVbX2hlaWdodF0gPSBfZ2V0U2l6ZShwaW4sIF92ZXJ0aWNhbCkgKyBfcHg7XG4gICAgc3BhY2VyU3R5bGVbX3BhZGRpbmddID0gcGluU3R5bGVbX21hcmdpbl0gPSBwaW5TdHlsZVtfdG9wXSA9IHBpblN0eWxlW19sZWZ0XSA9IFwiMFwiO1xuXG4gICAgX3NldFN0YXRlKHNwYWNlclN0YXRlKTtcblxuICAgIHBpblN0eWxlW193aWR0aF0gPSBwaW5TdHlsZVtcIm1heFwiICsgX1dpZHRoXSA9IGNzW193aWR0aF07XG4gICAgcGluU3R5bGVbX2hlaWdodF0gPSBwaW5TdHlsZVtcIm1heFwiICsgX0hlaWdodF0gPSBjc1tfaGVpZ2h0XTtcbiAgICBwaW5TdHlsZVtfcGFkZGluZ10gPSBjc1tfcGFkZGluZ107XG5cbiAgICBpZiAocGluLnBhcmVudE5vZGUgIT09IHNwYWNlcikge1xuICAgICAgcGluLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNwYWNlciwgcGluKTtcbiAgICAgIHNwYWNlci5hcHBlbmRDaGlsZChwaW4pO1xuICAgIH1cblxuICAgIHBpbi5fZ3NhcC5zd2FwcGVkSW4gPSB0cnVlO1xuICB9XG59LFxuICAgIF9jYXBzRXhwID0gLyhbQS1aXSkvZyxcbiAgICBfc2V0U3RhdGUgPSBmdW5jdGlvbiBfc2V0U3RhdGUoc3RhdGUpIHtcbiAgaWYgKHN0YXRl
8110KSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUudC5zdHlsZSxcbiAgICAgICAgbCA9IHN0YXRlLmxlbmd0aCxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIHAsXG4gICAgICAgIHZhbHVlO1xuICAgIChzdGF0ZS50Ll9nc2FwIHx8IGdzYXAuY29yZS5nZXRDYWNoZShzdGF0ZS50KSkudW5jYWNoZSA9IDE7IC8vIG90aGVyd2lzZSB0cmFuc2Zvcm1zIG1heSBiZSBvZmZcblxuICAgIGZvciAoOyBpIDwgbDsgaSArPSAyKSB7XG4gICAgICB2YWx1ZSA9IHN0YXRlW2kgKyAxXTtcbiAgICAgIHAgPSBzdGF0ZVtpXTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHN0eWxlW3BdID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHN0eWxlW3BdKSB7XG4gICAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KHAucmVwbGFjZShfY2Fwc0V4cCwgXCItJDFcIikudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59LFxuICAgIF9nZXRTdGF0ZSA9IGZ1bmN0aW9uIF9nZXRTdGF0ZShlbGVtZW50KSB7XG4gIC8vIHJldHVybnMgYW4gQXJyYXkgd2l0aCBhbHRlcm5hdGluZyB2YWx1ZXMgbGlrZSBbcHJvcGVydHksIHZhbHVlLCBwcm9wZXJ0eSwgdmFsdWVdIGFuZCBhIFwidFwiIHByb3BlcnR5IHBvaW50aW5nIHRvIHRoZSB0YXJnZXQgKGVsZW1lbnQpLiBNYWtlcyBpdCBmYXN0IGFuZCBjaGVhcC5cbiAgdmFyIGwgPSBfc3RhdGVQcm9wcy5sZW5ndGgsXG4gICAgICBzdHlsZSA9IGVsZW1lbnQuc3R5bGUsXG4gICAgICBzdGF0ZSA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICBzdGF0ZS5wdXNoKF9zdGF0ZVByb3BzW2ldLCBzdHlsZVtfc3RhdGVQcm9wc1tpXV0pO1xuICB9XG5cbiAgc3RhdGUudCA9IGVsZW1lbnQ7XG4gIHJldHVybiBzdGF0ZTtcbn0sXG4gICAgX2NvcHlTdGF0ZSA9IGZ1bmN0aW9uIF9jb3B5U3RhdGUoc3RhdGUsIG92ZXJyaWRlLCBvbWl0T2Zmc2V0cykge1xuICB2YXIgcmVzdWx0ID0gW10sXG4gICAgICBsID0gc3RhdGUubGVuZ3RoLFxuICAgICAgaSA9IG9taXRPZmZzZXRzID8gOCA6IDAsXG4gICAgICAvLyBza2lwIHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSBpZiBvbWl0T2Zmc2V0cyBpcyB0cnVlXG4gIHA7XG5cbiAgZm9yICg7IGkgPCBsOyBpICs9IDIpIHtcbiAgICBwID0gc3RhdGVbaV07XG4gICAgcmVzdWx0LnB1c2gocCwgcCBpbiBvdmVycmlkZSA/IG92ZXJyaWRlW3BdIDogc3RhdGVbaSArIDFdKTtcbiAgfVxuXG4gIHJlc3VsdC50ID0gc3RhdGUudDtcbiAgcmV0dXJuIHJlc3VsdDtcbn0sXG4gICAgX3dpbk9mZnNldHMgPSB7XG4gIGxlZnQ6IDAsXG4gIHRvcDogMFxufSxcbiAgICAvLyAvLyBwb3RlbnRpYWwgZnV0dXJlIGZlYXR1cmUgKD8pIEFsbG93IHVzZXJzIHRvIGNhbGN1bGF0ZSB3aGVyZSBhIHRyaWdnZXIgaGl0cyAoc2Nyb2xsIHBvc2l0aW9uKSBsaWtlIGdldFNjcm9sbFBvc2l0aW9uKFwiI2lkXCIsIFwidG9wIGJvdHRvbVwiKVxuLy8gX2dldFNjcm9sbFBvc2l0aW9uID0gKHRyaWdnZXIsIHBvc2l0aW9uLCB7c2Nyb2xsZXIsIGNvbnRhaW5lckFuaW1hdGlvbiwgaG9yaXpvbnRhbH0pID0+IHtcbi8vIFx0c2Nyb2xsZXIgPSBfZ2V0VGFyZ2V0KHNjcm9sbGVyIHx8IF93aW4pO1xuLy8gXHRsZXQgZGlyZWN0aW9uID0gaG9yaXpvbnRhbCA/IF9ob3Jpem9udGFsIDogX3ZlcnRpY2FsLFxuLy8gXHRcdGlzVmlld3BvcnQgPSBfaXNWaWV3cG9ydChzY3JvbGxlcik7XG4vLyBcdF9nZXRTaXplRnVuYyhzY3JvbGxlciwgaXNWaWV3cG9ydCwgZGlyZWN0aW9uKTtcbi8vIFx0cmV0dXJuIF9wYXJzZVBvc2l0aW9uKHBvc2l0aW9uLCBfZ2V0VGFyZ2V0KHRyaWdnZXIpLCBfZ2V0U2l6ZUZ1bmMoc2Nyb2xsZXIsIGlzVmlld3BvcnQsIGRpcmVjdGlvbikoKSwgZGlyZWN0aW9uLCBfZ2V0U2Nyb2xsRnVuYyhzY3JvbGxlciwgZGlyZWN0aW9uKSgpLCAwLCAwLCAwLCBfZ2V0T2Zmc2V0c0Z1bmMoc2Nyb2xsZXIsIGlzVmlld3BvcnQpKCksIGlzVmlld3BvcnQgPyAwIDogcGFyc2VGbG9hdChfZ2V0Q29tcHV0ZWRTdHlsZShzY3JvbGxlcilbXCJib3JkZXJcIiArIGRpcmVjdGlvbi5wMiArIF9XaWR0aF0pIHx8IDAsIDAsIGNvbnRhaW5lckFuaW1hdGlvbiA/IGNvbnRhaW5lckFuaW1hdGlvbi5kdXJhdGlvbigpIDogX21heFNjcm9sbChzY3JvbGxlciksIGNvbnRhaW5lckFuaW1hdGlvbik7XG4vLyB9LFxuX3BhcnNlUG9zaXRpb24gPSBmdW5jdGlvbiBfcGFyc2VQb3NpdGlvbih2YWx1ZSwgdHJpZ2dlciwgc2Nyb2xsZXJTaXplLCBkaXJlY3Rpb24sIHNjcm9sbCwgbWFya2VyLCBtYXJrZXJTY3JvbGxlciwgc2VsZiwgc2Nyb2xsZXJCb3VuZHMsIGJvcmRlcldpZHRoLCB1c2VGaXhlZFBvc2l0aW9uLCBzY3JvbGxlck1heCwgY29udGFpbmVyQW5pbWF0aW9uLCBjbGFtcFplcm9Qcm9wKSB7XG4gIF9pc0Z1bmN0aW9uKHZhbHVlKSAmJiAodmFsdWUgPSB2YWx1ZShzZWxmKSk7XG5cbiAgaWYgKF9pc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUuc3Vic3RyKDAsIDMpID09PSBcIm1heFwiKSB7XG4gICAgdmFsdWUgPSBzY3JvbGxlck1heCArICh2YWx1ZS5jaGFyQXQoNCkgPT09IFwiPVwiID8gX29mZnNldFRvUHgoXCIwXCIgKyB2YWx1ZS5zdWJzdHIoMyksIHNjcm9sbGVyU2l6ZSkgOiAwKTtcbiAgfVxuXG4gIHZhciB0aW1lID0gY29udGFpbmVyQW5pbWF0aW9uID8gY29udGFpbmVyQW5pbWF0aW9uLnRpbWUoKSA6IDAsXG4gICAgICBwMSxcbiAgICAgIHAyLFxuICAgICAgZWxlbWVudDtcbiAgY29udGFpbmVyQW5pbWF0aW9uICYmIGNvbnRhaW5lckFuaW1hdGlvbi5zZWVrKDApO1xuICBpc05hTih2YWx1ZSkgfHwgKHZhbHVlID0gK3ZhbHVlKTsgLy8gY29udmVydCBhIHN0cmluZyBudW1iZXIgbGlrZSBcIjQ1XCIgdG8gYW4gYWN0dWFsIG51bWJlclxuXG4gIGlmICghX2lzTnVtYmVyKHZhbHVlKSkge1xuICAgIF9pc0Z1bmN0aW9uKHRyaWdnZXIpICYmICh0cmlnZ2VyID0gdHJpZ2dlcihzZWxmKSk7XG4gICAgdmFyIG9mZnNldHMgPSAodmFsdWUgfHwgXCIwXCIpLnNwbGl0KFwiIFwiKSxcbiAgICAgICAgYm91bmRzLFxuICAgICAgICBsb2NhbE9mZnNldCxcbiAgICAgICAgZ2xvYmFsT2Zmc2V0LFxuICAgICAgICBkaXNwbGF5O1xuICAgIGVsZW1lbnQgPSBfZ2V0VGFyZ2V0KHRyaWdnZXIsIHNlbGYpIHx8IF9ib2R5O1xuICAgIGJvdW5kcyA9IF9nZXRCb3VuZHMoZWxlbWVudCkgfHwge307XG5cbiAgICBpZiAoKCFib3VuZHMgfHwgIWJvdW5kcy5sZWZ0ICYmICFib3VuZHMudG9wKSAmJiBfZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xuICAgICAgLy8gaWYgZGlzcGxheSBpcyBcIm5vbmVcIiwgaXQgd29uJ3QgcmVwb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHByb3Blcmx5XG4gICAgICBkaXNwbGF5ID0gZWxlbWVudC5zdHlsZS5kaXNwbGF5O1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgYm91bmRzID0gX2dldEJvdW5kcyhlbGVtZW50KTtcbiAgICAgIGRpc3BsYXkgPyBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5IDogZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcImRpc3BsYXlcIik7XG4gICAgfVxuXG4gICAgbG9jYWxPZmZzZXQgPSBfb2Zmc2V0VG9QeChvZmZzZXRzWzBdLCBib3VuZHNbZGlyZWN0aW9uLmRdKTtcbiAgICBnbG9iYWxPZmZzZXQgPSBfb2Zmc2V0VG9QeChvZmZzZXRzWzFdIHx8IFwiMFwiLCBzY3JvbGxlclNpemUpO1xuICAgIHZhbHVlID0gYm91bmRzW2R
8110pcmVjdGlvbi5wXSAtIHNjcm9sbGVyQm91bmRzW2RpcmVjdGlvbi5wXSAtIGJvcmRlcldpZHRoICsgbG9jYWxPZmZzZXQgKyBzY3JvbGwgLSBnbG9iYWxPZmZzZXQ7XG4gICAgbWFya2VyU2Nyb2xsZXIgJiYgX3Bvc2l0aW9uTWFya2VyKG1hcmtlclNjcm9sbGVyLCBnbG9iYWxPZmZzZXQsIGRpcmVjdGlvbiwgc2Nyb2xsZXJTaXplIC0gZ2xvYmFsT2Zmc2V0IDwgMjAgfHwgbWFya2VyU2Nyb2xsZXIuX2lzU3RhcnQgJiYgZ2xvYmFsT2Zmc2V0ID4gMjApO1xuICAgIHNjcm9sbGVyU2l6ZSAtPSBzY3JvbGxlclNpemUgLSBnbG9iYWxPZmZzZXQ7IC8vIGFkanVzdCBmb3IgdGhlIG1hcmtlclxuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lckFuaW1hdGlvbiAmJiAodmFsdWUgPSBnc2FwLnV0aWxzLm1hcFJhbmdlKGNvbnRhaW5lckFuaW1hdGlvbi5zY3JvbGxUcmlnZ2VyLnN0YXJ0LCBjb250YWluZXJBbmltYXRpb24uc2Nyb2xsVHJpZ2dlci5lbmQsIDAsIHNjcm9sbGVyTWF4LCB2YWx1ZSkpO1xuICAgIG1hcmtlclNjcm9sbGVyICYmIF9wb3NpdGlvbk1hcmtlcihtYXJrZXJTY3JvbGxlciwgc2Nyb2xsZXJTaXplLCBkaXJlY3Rpb24sIHRydWUpO1xuICB9XG5cbiAgaWYgKGNsYW1wWmVyb1Byb3ApIHtcbiAgICBzZWxmW2NsYW1wWmVyb1Byb3BdID0gdmFsdWUgfHwgLTAuMDAxO1xuICAgIHZhbHVlIDwgMCAmJiAodmFsdWUgPSAwKTtcbiAgfVxuXG4gIGlmIChtYXJrZXIpIHtcbiAgICB2YXIgcG9zaXRpb24gPSB2YWx1ZSArIHNjcm9sbGVyU2l6ZSxcbiAgICAgICAgaXNTdGFydCA9IG1hcmtlci5faXNTdGFydDtcbiAgICBwMSA9IFwic2Nyb2xsXCIgKyBkaXJlY3Rpb24uZDI7XG5cbiAgICBfcG9zaXRpb25NYXJrZXIobWFya2VyLCBwb3NpdGlvbiwgZGlyZWN0aW9uLCBpc1N0YXJ0ICYmIHBvc2l0aW9uID4gMjAgfHwgIWlzU3RhcnQgJiYgKHVzZUZpeGVkUG9zaXRpb24gPyBNYXRoLm1heChfYm9keVtwMV0sIF9kb2NFbFtwMV0pIDogbWFya2VyLnBhcmVudE5vZGVbcDFdKSA8PSBwb3NpdGlvbiArIDEpO1xuXG4gICAgaWYgKHVzZUZpeGVkUG9zaXRpb24pIHtcbiAgICAgIHNjcm9sbGVyQm91bmRzID0gX2dldEJvdW5kcyhtYXJrZXJTY3JvbGxlcik7XG4gICAgICB1c2VGaXhlZFBvc2l0aW9uICYmIChtYXJrZXIuc3R5bGVbZGlyZWN0aW9uLm9wLnBdID0gc2Nyb2xsZXJCb3VuZHNbZGlyZWN0aW9uLm9wLnBdIC0gZGlyZWN0aW9uLm9wLm0gLSBtYXJrZXIuX29mZnNldCArIF9weCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRhaW5lckFuaW1hdGlvbiAmJiBlbGVtZW50KSB7XG4gICAgcDEgPSBfZ2V0Qm91bmRzKGVsZW1lbnQpO1xuICAgIGNvbnRhaW5lckFuaW1hdGlvbi5zZWVrKHNjcm9sbGVyTWF4KTtcbiAgICBwMiA9IF9nZXRCb3VuZHMoZWxlbWVudCk7XG4gICAgY29udGFpbmVyQW5pbWF0aW9uLl9jYVNjcm9sbERpc3QgPSBwMVtkaXJlY3Rpb24ucF0gLSBwMltkaXJlY3Rpb24ucF07XG4gICAgdmFsdWUgPSB2YWx1ZSAvIGNvbnRhaW5lckFuaW1hdGlvbi5fY2FTY3JvbGxEaXN0ICogc2Nyb2xsZXJNYXg7XG4gIH1cblxuICBjb250YWluZXJBbmltYXRpb24gJiYgY29udGFpbmVyQW5pbWF0aW9uLnNlZWsodGltZSk7XG4gIHJldHVybiBjb250YWluZXJBbmltYXRpb24gPyB2YWx1ZSA6IE1hdGgucm91bmQodmFsdWUpO1xufSxcbiAgICBfcHJlZml4RXhwID0gLyh3ZWJraXR8bW96fGxlbmd0aHxjc3NUZXh0fGluc2V0KS9pLFxuICAgIF9yZXBhcmVudCA9IGZ1bmN0aW9uIF9yZXBhcmVudChlbGVtZW50LCBwYXJlbnQsIHRvcCwgbGVmdCkge1xuICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICE9PSBwYXJlbnQpIHtcbiAgICB2YXIgc3R5bGUgPSBlbGVtZW50LnN0eWxlLFxuICAgICAgICBwLFxuICAgICAgICBjcztcblxuICAgIGlmIChwYXJlbnQgPT09IF9ib2R5KSB7XG4gICAgICBlbGVtZW50Ll9zdE9yaWcgPSBzdHlsZS5jc3NUZXh0OyAvLyByZWNvcmQgb3JpZ2luYWwgaW5saW5lIHN0eWxlcyBzbyB3ZSBjYW4gcmV2ZXJ0IHRoZW0gbGF0ZXJcblxuICAgICAgY3MgPSBfZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICAgICAgZm9yIChwIGluIGNzKSB7XG4gICAgICAgIC8vIG11c3QgY29weSBhbGwgcmVsZXZhbnQgc3R5bGVzIHRvIGVuc3VyZSB0aGF0IG5vdGhpbmcgY2hhbmdlcyB2aXN1YWxseSB3aGVuIHdlIHJlcGFyZW50IHRvIHRoZSA8Ym9keT4uIFNraXAgdGhlIHZlbmRvciBwcmVmaXhlZCBvbmVzLlxuICAgICAgICBpZiAoIStwICYmICFfcHJlZml4RXhwLnRlc3QocCkgJiYgY3NbcF0gJiYgdHlwZW9mIHN0eWxlW3BdID09PSBcInN0cmluZ1wiICYmIHAgIT09IFwiMFwiKSB7XG4gICAgICAgICAgc3R5bGVbcF0gPSBjc1twXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdHlsZS50b3AgPSB0b3A7XG4gICAgICBzdHlsZS5sZWZ0ID0gbGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuY3NzVGV4dCA9IGVsZW1lbnQuX3N0T3JpZztcbiAgICB9XG5cbiAgICBnc2FwLmNvcmUuZ2V0Q2FjaGUoZWxlbWVudCkudW5jYWNoZSA9IDE7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICB9XG59LFxuICAgIF9pbnRlcnJ1cHRpb25UcmFja2VyID0gZnVuY3Rpb24gX2ludGVycnVwdGlvblRyYWNrZXIoZ2V0VmFsdWVGdW5jLCBpbml0aWFsVmFsdWUsIG9uSW50ZXJydXB0KSB7XG4gIHZhciBsYXN0MSA9IGluaXRpYWxWYWx1ZSxcbiAgICAgIGxhc3QyID0gbGFzdDE7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQoZ2V0VmFsdWVGdW5jKCkpOyAvLyByb3VuZCBiZWNhdXNlIGluIHNvbWUgW3ZlcnkgdW5jb21tb25dIFdpbmRvd3MgZW52aXJvbm1lbnRzLCBzY3JvbGwgY2FuIGdldCByZXBvcnRlZCB3aXRoIGRlY2ltYWxzIGV2ZW4gdGhvdWdoIGl0IHdhcyBzZXQgd2l0aG91dC5cblxuICAgIGlmIChjdXJyZW50ICE9PSBsYXN0MSAmJiBjdXJyZW50ICE9PSBsYXN0MiAmJiBNYXRoLmFicyhjdXJyZW50IC0gbGFzdDEpID4gMyAmJiBNYXRoLmFicyhjdXJyZW50IC0gbGFzdDIpID4gMykge1xuICAgICAgLy8gaWYgdGhlIHVzZXIgc2Nyb2xscywga2lsbCB0aGUgdHdlZW4uIGlPUyBTYWZhcmkgaW50ZXJtaXR0ZW50bHkgbWlzcmVwb3J0cyB0aGUgc2Nyb2xsIHBvc2l0aW9uLCBpdCBtYXkgYmUgdGhlIG1vc3QgcmVjZW50bHktc2V0IG9uZSBvciB0aGUgb25lIGJlZm9yZSB0aGF0ISBXaGVuIFNhZmFyaSBpcyB6b29tZWQgKENNRC0rKSwgaXQgb2Z0ZW4gbWlzcmVwb3J0cyBhcyAxIHBpeGVsIG9mZiB0b28hIFNvIGlmIHdlIHNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uIHRvIDEyNSwgZm9yIGV4YW1wbGUsIGl0J2xsIGFjdHVhbGx5IHJlcG9ydCBpdCBhcyAxMjQuXG4gICAgICB2YWx1ZSA9IGN1cnJlbnQ7XG4gICAgICBvbkludGVycnVwdCAmJiBvbkludGVycnVwdCgpO1xuICAgIH1cblxuICAgIGxhc3QyID0gbGFzdDE7XG4gICAgbGFzdDEgPSBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICByZXR1cm4gbGFzdDE7XG4gIH07XG59LFxuICAgIF9zaGlmdE1hcmtlciA9IGZ1bmN0aW9uIF9zaGlmdE1hcmtlcihtYXJrZXIsIGRpcmVjdGlvbiwgdmFsdWUpIHtcbiAgdmFyIHZhcnMgPSB7fTtcbiAgdmFyc1tkaXJlY3Rpb24ucF0gPSBcIis9XCIgKyB2YWx1ZTtcbiAgZ3NhcC5zZXQobWFya2VyLCB2YXJzKTtcbn0sXG4gICAgLy8gX21lcmdlQW5pbWF0aW9ucyA9IGFuaW1hdGlvbnMgPT4ge1xuLy8gXHRsZXQgdGwgPSBnc2FwLnRpbWVsaW5lKHtzbW9vdGhDaGlsZFRpbWluZzogdHJ1ZX0pLnN0YXJ0VGltZShNYXRoLm1pbiguLi5hbmltYXRpb25zLm1hcChhID0+IGEuZ2xvYmFsVGltZSgwKSkpKTtcbi8vIFx0YW5pbWF0aW9ucy5mb3JFYWNoKGEgPT4ge2xldCB0aW1lID0gYS50b3RhbFRpbWUoKTsgdGwuYWRkKGEpOyBhLnRvdGFsVGltZS
8110h0aW1lKTsgfSk7XG4vLyBcdHRsLnNtb290aENoaWxkVGltaW5nID0gZmFsc2U7XG4vLyBcdHJldHVybiB0bDtcbi8vIH0sXG4vLyByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byB0d2VlbiB0aGUgc2Nyb2xsIHBvc2l0aW9uIGluIHRoZSBkaXJlY3Rpb24gcHJvdmlkZWQsIGFuZCB3aGVuIGRvaW5nIHNvIGl0J2xsIGFkZCBhIC50d2VlbiBwcm9wZXJ0eSB0byB0aGUgRlVOQ1RJT04gaXRzZWxmLCBhbmQgcmVtb3ZlIGl0IHdoZW4gdGhlIHR3ZWVuIGNvbXBsZXRlcyBvciBnZXRzIGtpbGxlZC4gVGhpcyBnaXZlcyB1cyBhIHdheSB0byBoYXZlIG11bHRpcGxlIFNjcm9sbFRyaWdnZXJzIHVzZSBhIGNlbnRyYWwgZnVuY3Rpb24gZm9yIGFueSBnaXZlbiBzY3JvbGxlciBhbmQgc2VlIGlmIHRoZXJlJ3MgYSBzY3JvbGwgdHdlZW4gcnVubmluZyAod2hpY2ggd291bGQgYWZmZWN0IGlmL2hvdyB0aGluZ3MgZ2V0IHVwZGF0ZWQpXG5fZ2V0VHdlZW5DcmVhdG9yID0gZnVuY3Rpb24gX2dldFR3ZWVuQ3JlYXRvcihzY3JvbGxlciwgZGlyZWN0aW9uKSB7XG4gIHZhciBnZXRTY3JvbGwgPSBfZ2V0U2Nyb2xsRnVuYyhzY3JvbGxlciwgZGlyZWN0aW9uKSxcbiAgICAgIHByb3AgPSBcIl9zY3JvbGxcIiArIGRpcmVjdGlvbi5wMixcbiAgICAgIC8vIGFkZCBhIHR3ZWVuYWJsZSBwcm9wZXJ0eSB0byB0aGUgc2Nyb2xsZXIgdGhhdCdzIGEgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiwgbGlrZSBfc2Nyb2xsVG9wIG9yIF9zY3JvbGxMZWZ0LiBUaGlzIHdheSwgaWYgc29tZW9uZSBkb2VzIGdzYXAua2lsbFR3ZWVuc09mKHNjcm9sbGVyKSBpdCdsbCBraWxsIHRoZSBzY3JvbGwgdHdlZW4uXG4gIGdldFR3ZWVuID0gZnVuY3Rpb24gZ2V0VHdlZW4oc2Nyb2xsVG8sIHZhcnMsIGluaXRpYWxWYWx1ZSwgY2hhbmdlMSwgY2hhbmdlMikge1xuICAgIHZhciB0d2VlbiA9IGdldFR3ZWVuLnR3ZWVuLFxuICAgICAgICBvbkNvbXBsZXRlID0gdmFycy5vbkNvbXBsZXRlLFxuICAgICAgICBtb2RpZmllcnMgPSB7fTtcbiAgICBpbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWUgfHwgZ2V0U2Nyb2xsKCk7XG5cbiAgICB2YXIgY2hlY2tGb3JJbnRlcnJ1cHRpb24gPSBfaW50ZXJydXB0aW9uVHJhY2tlcihnZXRTY3JvbGwsIGluaXRpYWxWYWx1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgdHdlZW4ua2lsbCgpO1xuICAgICAgZ2V0VHdlZW4udHdlZW4gPSAwO1xuICAgIH0pO1xuXG4gICAgY2hhbmdlMiA9IGNoYW5nZTEgJiYgY2hhbmdlMiB8fCAwOyAvLyBpZiBjaGFuZ2UxIGlzIDAsIHdlIHNldCB0aGF0IHRvIHRoZSBkaWZmZXJlbmNlIGFuZCBpZ25vcmUgY2hhbmdlMi4gT3RoZXJ3aXNlLCB0aGVyZSB3b3VsZCBiZSBhIGNvbXBvdW5kIGVmZmVjdC5cblxuICAgIGNoYW5nZTEgPSBjaGFuZ2UxIHx8IHNjcm9sbFRvIC0gaW5pdGlhbFZhbHVlO1xuICAgIHR3ZWVuICYmIHR3ZWVuLmtpbGwoKTtcbiAgICB2YXJzW3Byb3BdID0gc2Nyb2xsVG87XG4gICAgdmFycy5pbmhlcml0ID0gZmFsc2U7XG4gICAgdmFycy5tb2RpZmllcnMgPSBtb2RpZmllcnM7XG5cbiAgICBtb2RpZmllcnNbcHJvcF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2hlY2tGb3JJbnRlcnJ1cHRpb24oaW5pdGlhbFZhbHVlICsgY2hhbmdlMSAqIHR3ZWVuLnJhdGlvICsgY2hhbmdlMiAqIHR3ZWVuLnJhdGlvICogdHdlZW4ucmF0aW8pO1xuICAgIH07XG5cbiAgICB2YXJzLm9uVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3Njcm9sbGVycy5jYWNoZSsrO1xuICAgICAgZ2V0VHdlZW4udHdlZW4gJiYgX3VwZGF0ZUFsbCgpOyAvLyBpZiBpdCB3YXMgaW50ZXJydXB0ZWQva2lsbGVkLCBsaWtlIGluIGEgY29udGV4dC5yZXZlcnQoKSwgZG9uJ3QgZm9yY2UgYW4gdXBkYXRlQWxsKClcbiAgICB9O1xuXG4gICAgdmFycy5vbkNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0VHdlZW4udHdlZW4gPSAwO1xuICAgICAgb25Db21wbGV0ZSAmJiBvbkNvbXBsZXRlLmNhbGwodHdlZW4pO1xuICAgIH07XG5cbiAgICB0d2VlbiA9IGdldFR3ZWVuLnR3ZWVuID0gZ3NhcC50byhzY3JvbGxlciwgdmFycyk7XG4gICAgcmV0dXJuIHR3ZWVuO1xuICB9O1xuXG4gIHNjcm9sbGVyW3Byb3BdID0gZ2V0U2Nyb2xsO1xuXG4gIGdldFNjcm9sbC53aGVlbEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldFR3ZWVuLnR3ZWVuICYmIGdldFR3ZWVuLnR3ZWVuLmtpbGwoKSAmJiAoZ2V0VHdlZW4udHdlZW4gPSAwKTtcbiAgfTtcblxuICBfYWRkTGlzdGVuZXIoc2Nyb2xsZXIsIFwid2hlZWxcIiwgZ2V0U2Nyb2xsLndoZWVsSGFuZGxlcik7IC8vIFdpbmRvd3MgbWFjaGluZXMgaGFuZGxlIG1vdXNld2hlZWwgc2Nyb2xsaW5nIGluIGNodW5rcyAobGlrZSBcIjMgbGluZXMgcGVyIHNjcm9sbFwiKSBtZWFuaW5nIHRoZSB0eXBpY2FsIHN0cmF0ZWd5IGZvciBjYW5jZWxsaW5nIHRoZSBzY3JvbGwgaXNuJ3QgYXMgc2Vuc2l0aXZlLiBJdCdzIG11Y2ggbW9yZSBsaWtlbHkgdG8gbWF0Y2ggb25lIG9mIHRoZSBwcmV2aW91cyAyIHNjcm9sbCBldmVudCBwb3NpdGlvbnMuIFNvIHdlIGtpbGwgYW55IHNuYXBwaW5nIGFzIHNvb24gYXMgdGhlcmUncyBhIHdoZWVsIGV2ZW50LlxuXG5cbiAgU2Nyb2xsVHJpZ2dlci5pc1RvdWNoICYmIF9hZGRMaXN0ZW5lcihzY3JvbGxlciwgXCJ0b3VjaG1vdmVcIiwgZ2V0U2Nyb2xsLndoZWVsSGFuZGxlcik7XG4gIHJldHVybiBnZXRUd2Vlbjtcbn07XG5cbmV4cG9ydCB2YXIgU2Nyb2xsVHJpZ2dlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNjcm9sbFRyaWdnZXIodmFycywgYW5pbWF0aW9uKSB7XG4gICAgX2NvcmVJbml0dGVkIHx8IFNjcm9sbFRyaWdnZXIucmVnaXN0ZXIoZ3NhcCkgfHwgY29uc29sZS53YXJuKFwiUGxlYXNlIGdzYXAucmVnaXN0ZXJQbHVnaW4oU2Nyb2xsVHJpZ2dlcilcIik7XG5cbiAgICBfY29udGV4dCh0aGlzKTtcblxuICAgIHRoaXMuaW5pdCh2YXJzLCBhbmltYXRpb24pO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNjcm9sbFRyaWdnZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5pbml0ID0gZnVuY3Rpb24gaW5pdCh2YXJzLCBhbmltYXRpb24pIHtcbiAgICB0aGlzLnByb2dyZXNzID0gdGhpcy5zdGFydCA9IDA7XG4gICAgdGhpcy52YXJzICYmIHRoaXMua2lsbCh0cnVlLCB0cnVlKTsgLy8gaW4gY2FzZSBpdCdzIGJlaW5nIGluaXR0ZWQgYWdhaW5cblxuICAgIGlmICghX2VuYWJsZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlID0gdGhpcy5yZWZyZXNoID0gdGh
8110pcy5raWxsID0gX3Bhc3NUaHJvdWdoO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhcnMgPSBfc2V0RGVmYXVsdHMoX2lzU3RyaW5nKHZhcnMpIHx8IF9pc051bWJlcih2YXJzKSB8fCB2YXJzLm5vZGVUeXBlID8ge1xuICAgICAgdHJpZ2dlcjogdmFyc1xuICAgIH0gOiB2YXJzLCBfZGVmYXVsdHMpO1xuXG4gICAgdmFyIF92YXJzID0gdmFycyxcbiAgICAgICAgb25VcGRhdGUgPSBfdmFycy5vblVwZGF0ZSxcbiAgICAgICAgdG9nZ2xlQ2xhc3MgPSBfdmFycy50b2dnbGVDbGFzcyxcbiAgICAgICAgaWQgPSBfdmFycy5pZCxcbiAgICAgICAgb25Ub2dnbGUgPSBfdmFycy5vblRvZ2dsZSxcbiAgICAgICAgb25SZWZyZXNoID0gX3ZhcnMub25SZWZyZXNoLFxuICAgICAgICBzY3J1YiA9IF92YXJzLnNjcnViLFxuICAgICAgICB0cmlnZ2VyID0gX3ZhcnMudHJpZ2dlcixcbiAgICAgICAgcGluID0gX3ZhcnMucGluLFxuICAgICAgICBwaW5TcGFjaW5nID0gX3ZhcnMucGluU3BhY2luZyxcbiAgICAgICAgaW52YWxpZGF0ZU9uUmVmcmVzaCA9IF92YXJzLmludmFsaWRhdGVPblJlZnJlc2gsXG4gICAgICAgIGFudGljaXBhdGVQaW4gPSBfdmFycy5hbnRpY2lwYXRlUGluLFxuICAgICAgICBvblNjcnViQ29tcGxldGUgPSBfdmFycy5vblNjcnViQ29tcGxldGUsXG4gICAgICAgIG9uU25hcENvbXBsZXRlID0gX3ZhcnMub25TbmFwQ29tcGxldGUsXG4gICAgICAgIG9uY2UgPSBfdmFycy5vbmNlLFxuICAgICAgICBzbmFwID0gX3ZhcnMuc25hcCxcbiAgICAgICAgcGluUmVwYXJlbnQgPSBfdmFycy5waW5SZXBhcmVudCxcbiAgICAgICAgcGluU3BhY2VyID0gX3ZhcnMucGluU3BhY2VyLFxuICAgICAgICBjb250YWluZXJBbmltYXRpb24gPSBfdmFycy5jb250YWluZXJBbmltYXRpb24sXG4gICAgICAgIGZhc3RTY3JvbGxFbmQgPSBfdmFycy5mYXN0U2Nyb2xsRW5kLFxuICAgICAgICBwcmV2ZW50T3ZlcmxhcHMgPSBfdmFycy5wcmV2ZW50T3ZlcmxhcHMsXG4gICAgICAgIGRpcmVjdGlvbiA9IHZhcnMuaG9yaXpvbn
8110RhbCB8fCB2YXJzLmNvbnRhaW5lckFuaW1hdGlvbiAmJiB2YXJzLmhvcml6b250YWwgIT09IGZhbHNlID8gX2hvcml6b250YWwgOiBfdmVydGljYWwsXG4gICAgICAgIGlzVG9nZ2xlID0gIXNjcnViICYmIHNjcnViICE9PSAwLFxuICAgICAgICBzY3JvbGxlciA9IF9nZXRUYXJnZXQodmFycy5zY3JvbGxlciB8fCBfd2luKSxcbiAgICAgICAgc2Nyb2xsZXJDYWNoZSA9IGdzYXAuY29yZS5nZXRDYWNoZShzY3JvbGxlciksXG4gICAgICAgIGlzVmlld3BvcnQgPSBfaXNWaWV3cG9ydChzY3JvbGxlciksXG4gICAgICAgIHVzZUZpeGVkUG9zaXRpb24gPSAoXCJwaW5UeXBlXCIgaW4gdmFycyA/IHZhcnMucGluVHlwZSA6IF9nZXRQcm94eVByb3Aoc2Nyb2xsZXIsIFwicGluVHlwZVwiKSB8fCBpc1ZpZXdwb3J0ICYmIFwiZml4ZWRcIikgPT09IFwiZml4ZWRcIixcbiAgICAgICAgY2FsbGJhY2tzID0gW3ZhcnMub25FbnRlciwgdmFycy5vbkxlYXZlLCB2YXJzLm9uRW50ZXJCYWNrLCB2YXJzLm9uTGVhdmVCYWNrXSxcbiAgICAgICAgdG9nZ2xlQWN0aW9ucyA9IGlzVG9nZ2xlICYmIHZhcnMudG9nZ2xlQWN0aW9ucy5zcGxpdChcIiBcIiksXG4gICAgICAgIG1hcmtlcnMgPSBcIm1hcmtlcnNcIiBpbiB2YXJzID8gdmFycy5tYXJrZXJzIDogX2RlZmF1bHRzLm1hcmtlcnMsXG4gICAgICAgIGJvcmRlcldpZHRoID0gaXNWaWV3cG9ydCA/IDAgOiBwYXJzZUZsb2F0KF9nZXRDb21wdXRlZFN0eWxlKHNjcm9sbGVyKVtcImJvcmRlclwiICsgZGlyZWN0aW9uLnAyICsgX1dpZHRoXSkgfHwgMCxcbiAgICAgICAgc2VsZiA9IHRoaXMsXG4gICAgICAgIG9uUmVmcmVzaEluaXQgPSB2YXJzLm9uUmVmcmVzaEluaXQgJiYgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHZhcnMub25SZWZyZXNoSW5pdChzZWxmKTtcbiAgICB9LFxuICAgICAgICBnZXRTY3JvbGxlclNpemUgPSBfZ2V0U2l6ZUZ1bmMoc2Nyb2xsZXIsIGlzVmlld3BvcnQsIGRpcmVjdGlvbiksXG4gICAgICAgIGdldFNjcm9sbGVyT2Zmc2V0cyA9IF9nZXRPZmZzZXRzRnVuYyhzY3JvbGxlciwgaXNWaWV3cG9ydCksXG4gICAgICAgIGxhc3RTbmFwID0gMCxcbiAgICAgICAgbGFzdFJlZnJlc2ggPSAwLFxuICAgICAgICBwcmV2UHJvZ3Jlc3MgPSAwLFxuICAgICAgICBzY3JvbGxGdW5jID0gX2dldFNjcm9sbEZ1bmMoc2Nyb2xsZXIsIGRpcmVjdGlvbiksXG4gICAgICAgIHR3ZWVuVG8sXG4gICAgICAgIHBpbkNhY2hlLFxuICAgICAgICBzbmFwRnVuYyxcbiAgICAgICAgc2Nyb2xsMSxcbiAgICAgICAgc2Nyb2xsMixcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZCxcbiAgICAgICAgbWFya2VyU3RhcnQsXG4gICAgICAgIG1hcmtlckVuZCxcbiAgICAgICAgbWFya2VyU3RhcnRUcmlnZ2VyLFxuICAgICAgICBtYXJrZXJFbmRUcmlnZ2VyLFxuICAgICAgICBtYXJrZXJWYXJzLFxuICAgICAgICBleGVjdXRpbmdPblJlZnJlc2gsXG4gICAgICAgIGNoYW5nZSxcbiAgICAgICAgcGluT3JpZ2luYWxTdGF0ZSxcbiAgICAgICAgcGluQWN0aXZlU3RhdGUsXG4gICAgICAgIHBpblN0YXRlLFxuICAgICAgICBzcGFjZXIsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgcGluR2V0dGVyLFxuICAgICAgICBwaW5TZXR0ZXIsXG4gICAgICAgIHBpblN0YXJ0LFxuICAgICAgICBwaW5DaGFuZ2UsXG4gICAgICAgIHNwYWNpbmdTdGFydCxcbiAgICAgICAgc3BhY2VyU3RhdGUsXG4gICAgICAgIG1hcmtlclN0YXJ0U2V0dGVyLFxuICAgICAgICBwaW5Nb3ZlcyxcbiAgICAgICAgbWFya2VyRW5kU2V0dGVyLFxuICAgICAgICBjcyxcbiAgICAgICAgc25hcDEsXG4gICAgICAgIHNuYXAyLFxuICAgICAgICBzY3J1YlR3ZWVuLFxuICAgICAgICBzY3J1YlNtb290aCxcbiAgICAgICAgc25hcER1ckNsYW1wLFxuICAgICAgICBzbmFwRGVsYXllZENhbGwsXG4gICAgICAgIHByZXZTY3JvbGwsXG4gICAgICAgIHByZXZBbmltUHJvZ3Jlc3MsXG4gICAgICAgIGNhTWFya2VyU2V0dGVyLFxuICAgICAgICBjdXN0b21SZXZlcnRSZXR1cm47IC8vIGZvciB0aGUgc2FrZSBvZiBlZmZpY2llbmN5LCBfc3RhcnRDbGFtcC9fZW5kQ2xhbXAgc2VydmUgbGlrZSBhIHRydXRoeSB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgY2xhbXBpbmcgd2FzIGVuYWJsZWQgb24gdGhlIHN0YXJ0L2VuZCwgYW5kIEFMU08gc3RvcmUgdGhlIGFjdHVhbCBwcmUtY2xhbXBlZCBudW1lcmljIHZhbHVlLiBXZSB0YXAgaW50byB0aGF0IGluIFNjcm9sbFNtb290aGVyIGZvciBzcGVlZCBlZmZlY3RzLiBTbyBmb3IgZXhhbXBsZSwgaWYgc3RhcnQ9XCJjbGFtcCh0b3AgYm90dG9tKVwiIHJlc3VsdHMgaW4gYSBzdGFydCBvZiAtMTAwIG5hdHVyYWxseSwgaXQgd291bGQgZ2V0IGNsYW1wZWQgdG8gMCBidXQgLTEwMCB3b3VsZCBiZSBzdG9yZWQgaW4gX3N0YXJ0Q2xhbXAuXG5cblxuICAgIHNlbGYuX3N0YXJ0Q2xhbXAgPSBzZWxmLl9lbmRDbGFtcCA9IGZhbHNlO1xuICAgIHNlbGYuX2RpciA9IGRpcmVjdGlvbjtcbiAgICBhbnRpY2lwYXRlUGluICo9IDQ1O1xuICAgIHNlbGYuc2Nyb2xsZXIgPSBzY3JvbGxlcjtcbiAgICBzZWxmLnNjcm9sbCA9IGNvbnRhaW5lckFuaW1hdGlvbiA/IGNvbnRhaW5lckFuaW1hdGlvbi50aW1lLmJpbmQoY29udGFpbmVyQW5pbWF0aW9uKSA6IHNjcm9sbEZ1bmM7XG4gICAgc2Nyb2xsMSA9IHNjcm9sbEZ1bmMoKTtcbiAgICBzZWxmLnZhcnMgPSB2YXJzO1xuICAgIGFuaW1hdGlvbiA9IGFuaW1hdGlvbiB8fCB2YXJzLmFuaW1hdGlvbjtcblxuICAgIGlmIChcInJlZnJlc2hQcmlvcml0eVwiIGluIHZhcnMpIHtcbiAgICAgIF9zb3J0ID0gMTtcbiAgICAgIHZhcnMucmVmcmVzaFByaW9yaXR5ID09PSAtOTk5OSAmJiAoX3ByaW1hcnkgPSBzZWxmKTsgLy8gdXNlZCBieSBTY3JvbGxTbW9vdGhlclxuICAgIH1cblxuICAgIHNjcm9sbGVyQ2FjaGUudHdlZW5TY3JvbGwgPSBzY3JvbGxlckNhY2hlLnR3ZWVuU2Nyb2xsIHx8IHtcbiAgICAgIHRvcDogX2dldFR3ZWVuQ3JlYXRvcihzY3JvbGxlciwgX3ZlcnRpY2FsKSxcbiAgICAgIGxlZnQ6IF9nZXRUd2VlbkNyZWF0b3Ioc2Nyb2xsZXIsIF9ob3Jpem9udGFsKVxuICAgIH07XG4gICAgc2VsZi50d2VlblRvID0gdHdlZW5UbyA9IHNjcm9sbGVyQ2FjaGUudHdlZW5TY3JvbGxbZGlyZWN0aW9uLnBdO1xuXG4gICAgc2VsZi5zY3J1YkR1cmF0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBzY3J1YlNtb290aCA9IF9pc051bWJlcih2YWx1ZSkgJiYgdmFsdWU7XG5cbiAgICAgIGlmICghc2NydWJTbW9vdGgpIHtcbiAgICAgICAgc2NydWJUd2VlbiAmJiBzY3J1YlR3ZWVuLnByb2dyZXNzKDEpLmtpbGwoKTtcbiAgICAgICAgc2NydWJUd2VlbiA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY3J1YlR3ZWVuID8gc2NydWJUd2Vlbi5kdXJhdGlvbih2YWx1ZSkgOiBzY3J1YlR3ZWVuID0gZ3NhcC50byhhbmltYXRpb24sIHtcbiAgICAgICAgICBlYXNlOiBcImV4cG9cIixcbiAgICAgICAgICB0b3RhbFByb2dyZXNzOiBcIis9MFwiLFxuICAgICAgICAgIGluaGVyaXQ6IGZhbHNlLFxuICAgICAgICAgIGR1cmF0aW9uOiBzY3J1YlNtb290aCxcbiAgICAgICAgICBwYXVzZWQ6IHRydWUsXG4gICAgICAgICAgb25Db21wbGV0ZTogZnVuY3Rpb24gb25Db21wbGV0ZSgpIHtcbiAgICAgICAgICAgI
8110HJldHVybiBvblNjcnViQ29tcGxldGUgJiYgb25TY3J1YkNvbXBsZXRlKHNlbGYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChhbmltYXRpb24pIHtcbiAgICAgIGFuaW1hdGlvbi52YXJzLmxhenkgPSBmYWxzZTtcbiAgICAgIGFuaW1hdGlvbi5faW5pdHRlZCAmJiAhc2VsZi5pc1JldmVydGVkIHx8IGFuaW1hdGlvbi52YXJzLmltbWVkaWF0ZVJlbmRlciAhPT0gZmFsc2UgJiYgdmFycy5pbW1lZGlhdGVSZW5kZXIgIT09IGZhbHNlICYmIGFuaW1hdGlvbi5kdXJhdGlvbigpICYmIGFuaW1hdGlvbi5yZW5kZXIoMCwgdHJ1ZSwgdHJ1ZSk7IC8vIHNwZWNpYWwgY2FzZTogaWYgdGhpcyBTY3JvbGxUcmlnZ2VyIGdldHMgcmUtaW5pdHRlZCwgYSBmcm9tKCkgdHdlZW4gd2l0aCBhIHN0YWdnZXIgY291bGQgZ2V0IGluaXR0ZWQgaW5pdGlhbGx5IGFuZCB0aGVuIHJldmVydGVkIG9uIHRoZSByZS1pbml0IHdoaWNoIG1lYW5zIGl0J2xsIG5lZWQgdG8gZ2V0IHJlbmRlcmVkIGFnYWluIGhlcmUgdG8gcHJvcGVybHkgZGlzcGxheSB0aGluZ3MuIE90aGVyd2lzZSwgU2VlIGh0dHBzOi8vZ3NhcC5jb20vZm9ydW1zL3RvcGljLzM2Nzc3LXNjcm9sbHNtb290aGVyLXNwbGl0dGV4dC1uZXh0anMvIGFuZCBodHRwczovL2NvZGVwZW4uaW8vR3JlZW5Tb2NrL3Blbi9lWVB5UHBkP2VkaXRvcnM9MDAxMFxuXG4gICAgICBzZWxmLmFuaW1hdGlvbiA9IGFuaW1hdGlvbi5wYXVzZSgpO1xuICAgICAgYW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIgPSBzZWxmO1xuICAgICAgc2VsZi5zY3J1YkR1cmF0aW9uKHNjcnViKTtcbiAgICAgIHNuYXAxID0gMDtcbiAgICAgIGlkIHx8IChpZCA9IGFuaW1hdGlvbi52YXJzLmlkKTtcbiAgICB9XG5cbiAgICBpZiAoc25hcCkge1xuICAgICAgLy8gVE9ETzogcG90ZW50aWFsIGlkZWE6IHVzZSBsZWdpdGltYXRlIENTUyBzY3JvbGwgc25hcHBpbmcgYnkgcHVzaGluZyBpbnZpc2libGUgZWxlbWVudHMgaW50byB0aGUgRE9NIHRoYXQgc2VydmUgYXMgc25hcCBwb3NpdGlvbnMsIGFuZCB0b2dnbGUgdGhlIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc3R5bGUuc2Nyb2xsU25hcFR5cGUgb25Ub2dnbGUuIFNlZSBodHRwczovL2NvZGVwZW4uaW8vR3JlZW5Tb2NrL3Blbi9KakxyZ1dNIGZvciBhIHF1aWNrIHByb29mIG9mIGNvbmNlcHQuXG4gICAgICBpZiAoIV9pc09iamVjdChzbmFwKSB8fCBzbmFwLnB1c2gpIHtcbiAgICAgICAgc25hcCA9IHtcbiAgICAgICAgICBzbmFwVG86IHNuYXBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgXCJzY3JvbGxCZWhhdmlvclwiIGluIF9ib2R5LnN0eWxlICYmIGdzYXAuc2V0KGlzVmlld3BvcnQgPyBbX2JvZHksIF9kb2NFbF0gOiBzY3JvbGxlciwge1xuICAgICAgICBzY3JvbGxCZWhhdmlvcjogXCJhdXRvXCJcbiAgICAgIH0pOyAvLyBzbW9vdGggc2Nyb2xsaW5nIGRvZXNuJ3Qgd29yayB3aXRoIHNuYXAuXG5cbiAgICAgIF9zY3JvbGxlcnMuZm9yRWFjaChmdW5jdGlvbiAobykge1xuICAgICAgICByZXR1cm4gX2lzRnVuY3Rpb24obykgJiYgby50YXJnZXQgPT09IChpc1ZpZXdwb3J0ID8gX2RvYy5zY3JvbGxpbmdFbGVtZW50IHx8IF9kb2NFbCA6IHNjcm9sbGVyKSAmJiAoby5zbW9vdGggPSBmYWxzZSk7XG4gICAgICB9KTsgLy8gbm90ZTogc2V0IHNtb290aCB0byBmYWxzZSBvbiBib3RoIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBzY3JvbGwgZ2V0dGVycy9zZXR0ZXJzXG5cblxuICAgICAgc25hcEZ1bmMgPSBfaXNGdW5jdGlvbihzbmFwLnNuYXBUbykgPyBzbmFwLnNuYXBUbyA6IHNuYXAuc25hcFRvID09PSBcImxhYmVsc1wiID8gX2dldENsb3Nlc3RMYWJlbChhbmltYXRpb24pIDogc25hcC5zbmFwVG8gPT09IFwibGFiZWxzRGlyZWN0aW9uYWxcIiA/IF9nZXRMYWJlbEF0RGlyZWN0aW9uKGFuaW1hdGlvbikgOiBzbmFwLmRpcmVjdGlvbmFsICE9PSBmYWxzZSA/IGZ1bmN0aW9uICh2YWx1ZSwgc3QpIHtcbiAgICAgICAgcmV0dXJuIF9zbmFwRGlyZWN0aW9uYWwoc25hcC5zbmFwVG8pKHZhbHVlLCBfZ2V0VGltZSgpIC0gbGFzdFJlZnJlc2ggPCA1MDAgPyAwIDogc3QuZGlyZWN0aW9uKTtcbiAgICAgIH0gOiBnc2FwLnV0aWxzLnNuYXAoc25hcC5zbmFwVG8pO1xuICAgICAgc25hcER1ckNsYW1wID0gc25hcC5kdXJhdGlvbiB8fCB7XG4gICAgICAgIG1pbjogMC4xLFxuICAgICAgICBtYXg6IDJcbiAgICAgIH07XG4gICAgICBzbmFwRHVyQ2xhbXAgPSBfaXNPYmplY3Qoc25hcER1ckNsYW1wKSA/IF9jbGFtcChzbmFwRHVyQ2xhbXAubWluLCBzbmFwRHVyQ2xhbXAubWF4KSA6IF9jbGFtcChzbmFwRHVyQ2xhbXAsIHNuYXBEdXJDbGFtcCk7XG4gICAgICBzbmFwRGVsYXllZENhbGwgPSBnc2FwLmRlbGF5ZWRDYWxsKHNuYXAuZGVsYXkgfHwgc2NydWJTbW9vdGggLyAyIHx8IDAuMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
8110XIgc2Nyb2xsID0gc2Nyb2xsRnVuYygpLFxuICAgICAgICAgICAgcmVmcmVzaGVkUmVjZW50bHkgPSBfZ2V0VGltZSgpIC0gbGFzdFJlZnJlc2ggPCA1MDAsXG4gICAgICAgICAgICB0d2VlbiA9IHR3ZWVuVG8udHdlZW47XG5cbiAgICAgICAgaWYgKChyZWZyZXNoZWRSZWNlbnRseSB8fCBNYXRoLmFicyhzZWxmLmdldFZlbG9jaXR5KCkpIDwgMTApICYmICF0d2VlbiAmJiAhX3BvaW50ZXJJc0Rvd24gJiYgbGFzdFNuYXAgIT09IHNjcm9sbCkge1xuICAgICAgICAgIHZhciBwcm9ncmVzcyA9IChzY3JvbGwgLSBzdGFydCkgLyBjaGFuZ2UsXG4gICAgICAgICAgICAgIHRvdGFsUHJvZ3Jlc3MgPSBhbmltYXRpb24gJiYgIWlzVG9nZ2xlID8gYW5pbWF0aW9uLnRvdGFsUHJvZ3Jlc3MoKSA6IHByb2dyZXNzLFxuICAgICAgICAgICAgICB2ZWxvY2l0eSA9IHJlZnJlc2hlZFJlY2VudGx5ID8gMCA6ICh0b3RhbFByb2dyZXNzIC0gc25hcDIpIC8gKF9nZXRUaW1lKCkgLSBfdGltZTIpICogMTAwMCB8fCAwLFxuICAgICAgICAgICAgICBjaGFuZ2UxID0gZ3NhcC51dGlscy5jbGFtcCgtcHJvZ3Jlc3MsIDEgLSBwcm9ncmVzcywgX2Ficyh2ZWxvY2l0eSAvIDIpICogdmVsb2NpdHkgLyAwLjE4NSksXG4gICAgICAgICAgICAgIG5hdHVyYWxFbmQgPSBwcm9ncmVzcyArIChzbmFwLmluZXJ0aWEgPT09IGZhbHNlID8gMCA6IGNoYW5nZTEpLFxuICAgICAgICAgICAgICBlbmRWYWx1ZSxcbiAgICAgICAgICAgICAgZW5kU2Nyb2xsLFxuICAgICAgICAgICAgICBfc25hcCA9IHNuYXAsXG4gICAgICAgICAgICAgIG9uU3RhcnQgPSBfc25hcC5vblN0YXJ0LFxuICAgICAgICAgICAgICBfb25JbnRlcnJ1cHQgPSBfc25hcC5vbkludGVycnVwdCxcbiAgICAgICAgICAgICAgX29uQ29tcGxldGUgPSBfc25hcC5vbkNvbXBsZXRlO1xuICAgICAgICAgIGVuZFZhbHVlID0gc25hcEZ1bmMobmF0dXJhbEVuZCwgc2VsZik7XG4gICAgICAgICAgX2lzTnVtYmVyKGVuZFZhbHVlKSB8fCAoZW5kVmFsdWUgPSBuYXR1cmFsRW5kKTsgLy8gaW4gY2FzZSB0aGUgZnVuY3Rpb24gZGlkbid0IHJldHVybiBhIG51bWJlciwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBuYXR1cmFsRW5kXG5cbiAgICAgICAgICBlbmRTY3JvbGwgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHN0YXJ0ICsgZW5kVmFsdWUgKiBjaGFuZ2UpKTtcblxuICAgICAgICAgIGlmIChzY3JvbGwgPD0gZW5kICYmIHNjcm9sbCA+PSBzdGFydCAmJiBlbmRTY3JvbGwgIT09IHNjcm9sbCkge1xuICAgICAgICAgICAgaWYgKHR3ZWVuICYmICF0d2Vlbi5faW5pdHRlZCAmJiB0d2Vlbi5kYXRhIDw9IF9hYnMoZW5kU2Nyb2xsIC0gc2Nyb2xsKSkge1xuICAgICAgICAgICAgICAvLyB0aGVyZSdzIGFuIG92ZXJsYXBwaW5nIHNuYXAhIFNvIHdlIG11c3QgZmlndXJlIG91dCB3aGljaCBvbmUgaXMgY2xvc2VyIGFuZCBsZXQgdGhhdCB0d2VlbiBsaXZlLlxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzbmFwLmluZXJ0aWEgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGNoYW5nZTEgPSBlbmRWYWx1ZSAtIHByb2dyZXNzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0d2VlblRvKGVuZFNjcm9sbCwge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogc25hcER1ckNsYW1wKF9hYnMoTWF0aC5tYXgoX2FicyhuYXR1cmFsRW5kIC0gdG90YWxQcm9ncmVzcyksIF9hYnMoZW5kVmFsdWUgLSB0b3RhbFByb2dyZXNzKSkgKiAwLjE4NSAvIHZlbG9jaXR5IC8gMC4wNSB8fCAwKSksXG4gICAgICAgICAgICAgIGVhc2U6IHNuYXAuZWFzZSB8fCBcInBvd2VyM1wiLFxuICAgICAgICAgICAgICBkYXRhOiBfYWJzKGVuZFNjcm9sbCAtIHNjcm9sbCksXG4gICAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgZGlzdGFuY2Ugc28gdGhhdCBpZiBhbm90aGVyIHNuYXAgdHdlZW4gb2NjdXJzIChjb25mbGljdCkgd2UgY2FuIHByaW9yaXRpemUgdGhlIGNsb3Nlc3Qgc25hcC5cbiAgICAgICAgICAgICAgb25JbnRlcnJ1cHQ6IGZ1bmN0aW9uIG9uSW50ZXJydXB0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzbmFwRGVsYXllZENhbGwucmVzdGFydCh0cnVlKSAmJiBfb25JbnRlcnJ1cHQgJiYgX2NhbGxiYWNrKHNlbGYsIF9vbkludGVycnVwdCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uIG9uQ29tcGxldGUoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICBsYXN0U25hcCA9IHNjcm9sbEZ1bmMoKTtcblxuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb24gJiYgIWlzVG9nZ2xlKSB7XG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgc2Nyb2xsYmFyIGlzIGxpbWl0ZWQsIHNvIHdlIHNob3VsZCBjb3JyZWN0IHRoZSBzY3J1YmJlZCBhbmltYXRpb24ncyBwbGF5aGVhZCBhdCB0aGUgZW5kIHRvIG1hdGNoIEVYQUNUTFkgd2hlcmUgaXQgd2FzIHN1cHBvc2VkIHRvIHNuYXBcbiAgICAgICAgICAgICAgICAgIHNjcnViVHdlZW4gPyBzY3J1YlR3ZWVuLnJlc2V0VG8oXCJ0b3RhbFByb2dyZXNzXCIsIGVuZFZhbHVlLCBhbmltYXRpb24uX3RUaW1lIC8gYW5pbWF0aW9uLl90RHVyKSA6IGFuaW1hdGlvbi5wcm9ncmVzcyhlbmRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc25hcDEgPSBzbmFwMiA9IGFuaW1hdGlvbiAmJiAhaXNUb2dnbGUgPyBhbmltYXRpb24udG90YWxQcm9ncmVzcygpIDogc2VsZi5wcm9ncmVzcztcbiAgICAgICAgICAgICAgICBvblNuYXBDb21wbGV0ZSAmJiBvblNuYXBDb21wbGV0ZShzZWxmKTtcbiAgICAgICAgICAgICAgICBfb25Db21wbGV0ZSAmJiBfY2FsbGJhY2soc2VsZiwgX29uQ29tcGxldGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBzY3JvbGwsIGNoYW5nZTEgKiBjaGFuZ2UsIGVuZFNjcm9sbCAtIHNjcm9sbCAtIGNoYW5nZTEgKiBjaGFuZ2UpO1xuICAgICAgICAgICAgb25TdGFydCAmJiBfY2FsbGJhY2soc2VsZiwgb25TdGFydCwgdHdlZW5Uby50d2Vlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNlbGYuaXNBY3RpdmUgJiYgbGFzdFNuYXAgIT09IHNjcm9sbCkge1xuICAgICAgICAgI
8110HNuYXBEZWxheWVkQ2FsbC5yZXN0YXJ0KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KS5wYXVzZSgpO1xuICAgIH1cblxuICAgIGlkICYmIChfaWRzW2lkXSA9IHNlbGYpO1xuICAgIHRyaWdnZXIgPSBzZWxmLnRyaWdnZXIgPSBfZ2V0VGFyZ2V0KHRyaWdnZXIgfHwgcGluICE9PSB0cnVlICYmIHBpbik7IC8vIGlmIGEgdHJpZ2dlciBoYXMgc29tZSBraW5kIG9mIHNjcm9sbC1yZWxhdGVkIGVmZmVjdCBhcHBsaWVkIHRoYXQgY291bGQgY29udGFtaW5hdGUgdGhlIFwieVwiIG9yIFwieFwiIHBvc2l0aW9uIChsaWtlIGEgU2Nyb2xsU21vb3RoZXIgZWZmZWN0KSwgd2UgbmVlZGVkIGEgd2F5IHRvIHRlbXBvcmFyaWx5IHJldmVydCBpdCwgc28gd2UgdXNlIHRoZSBzdFJldmVydCBwcm9wZXJ0eSBvZiB0aGUgZ3NDYWNoZS4gSXQgY2FuIHJldHVybiBhbm90aGVyIGZ1bmN0aW9uIHRoYXQgd2UnbGwgY2FsbCBhdCB0aGUgZW5kIHNvIGl0IGNhbiByZXR1cm4gdG8gaXRzIG5vcm1hbCBzdGF0ZS5cblxuICAgIGN1c3RvbVJldmVydFJldHVybiA9IHRyaWdnZXIgJiYgdHJpZ2dlci5fZ3NhcCAmJiB0cmlnZ2VyLl9nc2FwLnN0UmV2ZXJ0O1xuICAgIGN1c3RvbVJldmVydFJldHVybiAmJiAoY3VzdG9tUmV2ZXJ0UmV0dXJuID0gY3VzdG9tUmV2ZXJ0UmV0dXJuKHNlbGYpKTtcbiAgICBwaW4gPSBwaW4gPT09IHRydWUgPyB0cmlnZ2VyIDogX2dldFRhcmdldChwaW4pO1xuICAgIF9pc1N0cmluZyh0b2dnbGVDbGFzcykgJiYgKHRvZ2dsZUNsYXNzID0ge1xuICAgICAgdGFyZ2V0czogdHJpZ2dlcixcbiAgICAgIGNsYXNzTmFtZTogdG9nZ2xlQ2xhc3NcbiAgICB9KTtcblxuICAgIGlmIChwaW4pIHtcbiAgICAgIHBpblNwYWNpbmcgPT09IGZhbHNlIHx8IHBpblNwYWNpbmcgPT09IF9tYXJnaW4gfHwgKHBpblNwYWNpbmcgPSAhcGluU3BhY2luZyAmJiBwaW4ucGFyZW50Tm9kZSAmJiBwaW4ucGFyZW50Tm9kZS5zdHlsZSAmJiBfZ2V0Q29tcHV0ZWRTdHlsZShwaW4ucGFyZW50Tm9kZSkuZGlzcGxheSA9PT0gXCJmbGV4XCIgPyBmYWxzZSA6IF9wYWRkaW5nKTsgLy8gaWYgdGhlIHBhcmVudCBpcyBkaXNwbGF5OiBmbGV4LCBkb24ndCBhcHBseSBwaW5TcGFjaW5nIGJ5IGRlZmF1bHQuIFdlIHNob3VsZCBjaGVjayB0aGF0IHBpbi5wYXJlbnROb2RlIGlzIGFuIGVsZW1lbnQgKG5vdCBzaGFkb3cgZG9tIHdpbmRvdylcblxuICAgICAgc2VsZi5waW4gPSBwaW47XG4gICAgICBwaW5DYWNoZSA9IGdzYXAuY29yZS5nZXRDYWNoZShwaW4pO1xuXG4gICAgICBpZiAoIXBpbkNhY2hlLnNwYWNlcikge1xuICAgICAgICAvLyByZWNvcmQgdGhlIHNwYWNlciBhbmQgcGluT3JpZ2luYWxTdGF0ZSBvbiB0aGUgY2FjaGUgaW4gY2FzZSBzb21lb25lIHRyaWVzIHBpbm5pbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIE1VTFRJUExFIFNjcm9sbFRyaWdnZXJzIC0gd2UgZG9uJ3Qgd2FudCB0byBoYXZlIG11bHRpcGxlIHNwYWNlcnMgb3IgcmVjb3JkIHRoZSBcIm9yaWdpbmFsXCIgcGluIHN0YXRlIGFmdGVyIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWZmZWN0ZWQgYnkgYW5vdGhlciBTY3JvbGxUcmlnZ2VyLlxuICAgICAgICBpZiAocGluU3BhY2VyKSB7XG4gICAgICAgICAgcGluU3BhY2VyID0gX2dldFRhcmdldChwaW5TcGFjZXIpO1xuICAgICAgICAgIHBpblNwYWNlciAmJiAhcGluU3BhY2VyLm5vZGVUeXBlICYmIChwaW5TcGFjZXIgPSBwaW5TcGFjZXIuY3VycmVudCB8fCBwaW5TcGFjZXIubmF0aXZlRWxlbWVudCk7IC8vIGZvciBSZWFjdCAmIEFuZ3VsYXJcblxuICAgICAgICAgIHBpbkNhY2hlLnNwYWNlcklzTmF0aXZlID0gISFwaW5TcGFjZXI7XG4gICAgICAgICAgcGluU3BhY2VyICYmIChwaW5DYWNoZS5zcGFjZXJTdGF0ZSA9IF9nZXRTdGF0ZShwaW5TcGFjZXIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBpbkNhY2hlLnNwYWNlciA9IHNwYWNlciA9IHBpblNwYWNlciB8fCBfZG9jLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHNwYWNlci5jbGFzc0xpc3QuYWRkKFwicGluLXNwYWNlclwiKTtcbiAgICAgICAgaWQgJiYgc3BhY2VyLmNsYXNzTGlzdC5hZGQoXCJwaW4tc3BhY2VyLVwiICsgaWQpO1xuICAgICAgICBwaW5DYWNoZS5waW5TdGF0ZSA9IHBpbk9yaWdpbmFsU3RhdGUgPSBfZ2V0U3RhdGUocGluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBpbk9yaWdpbmFsU3RhdGUgPSBwaW5DYWNoZS5waW5TdGF0ZTtcbiAgICAgIH1cblxuICAgICAgdmFycy5mb3JjZTNEICE9PSBmYWxzZSAmJiBnc2FwLnNldChwaW4sIHtcbiAgICAgICAgZm9yY2UzRDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBzZWxmLnNwYWNlciA9IHNwYWNlciA9IHBpbkNhY2hlLnNwYWNlcjtcbiAgICAgIGNzID0gX2dldENvbXB1dGVkU3R5bGUocGluKTtcbiAgICAgIHNwYWNpbmdTdGFydCA9IGNzW3BpblNwYWNpbmcgKyBkaXJlY3Rpb24ub3MyXTtcbiAgICAgIHBpbkdldHRlciA9IGdzYXAuZ2V0UHJvcGVydHkocGluKTtcbiAgICAgIHBpblNldHRlciA9IGdzYXAucXVpY2tTZXR0ZXIocGluLCBkaXJlY3Rpb24uYSwgX3B4KTsgLy8gcGluLmZpcnN0Q2hpbGQgJiYgIV9tYXhTY3JvbGwocGluLCBkaXJlY3Rpb24pICYmIChwaW4uc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiKTsgLy8gcHJvdGVjdHMgZnJvbSBjb2xsYXBzaW5nIG1hcmdpbnMsIGJ1dCBjYW4gaGF2ZSB1bmludGVuZGVkIGNvbnNlcXVlbmNlcyBhcyBkZW1vbnN0cmF0ZWQgaGVyZTogaHR0cHM6Ly9jb2RlcGVuLmlvL0dyZWVuU29jay9wZW4vMWU0MmM3YTczYmZhNDA5ZDJjZjFlMTg0ZTdhNDI0OGQgc28gaXQgd2FzIHJlbW92ZWQgaW4gZmF2b3Igb2YganVzdCB0ZWxsaW5nIHBlb3BsZSB0byBzZXQgdXAgdGhlaXIgQ1NTIHRvIGF2b2lkIHRoZSBjb2xsYXBzaW5nIG1hcmdpbnMgKG92ZXJmbG93OiBoaWRkZW4gfCBhdXRvIGlzIGp1c3Qgb25lIG9wdGlvbi4gQW5vdGhlciBpcyBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQpLlxuXG4gICAgICBfc3dhcFBpbkluKHBpbiwgc3BhY2VyLCBjcyk7XG5cbiAgICAgIHBpblN0YXRlID0gX2dldFN0YXRlKHBpbik7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlcnMpIHtcbiAgICAgIG1hcmtlclZhcnMgPSBfaXNPYmplY3QobWFya2VycykgPyBfc2V0RGVmYXVsdHMobWFya2VycywgX21hcmtlckRlZmF1bHRzKSA6IF9tYXJrZXJEZWZhdWx0cztcbiAgICAgIG1hcmtlclN0YXJ0V
8110HJpZ2dlciA9IF9jcmVhdGVNYXJrZXIoXCJzY3JvbGxlci1zdGFydFwiLCBpZCwgc2Nyb2xsZXIsIGRpcmVjdGlvbiwgbWFya2VyVmFycywgMCk7XG4gICAgICBtYXJrZXJFbmRUcmlnZ2VyID0gX2NyZWF0ZU1hcmtlcihcInNjcm9sbGVyLWVuZFwiLCBpZCwgc2Nyb2xsZXIsIGRpcmVjdGlvbiwgbWFya2VyVmFycywgMCwgbWFya2VyU3RhcnRUcmlnZ2VyKTtcbiAgICAgIG9mZnNldCA9IG1hcmtlclN0YXJ0VHJpZ2dlcltcIm9mZnNldFwiICsgZGlyZWN0aW9uLm9wLmQyXTtcblxuICAgICAgdmFyIGNvbnRlbnQgPSBfZ2V0VGFyZ2V0KF9nZXRQcm94eVByb3Aoc2Nyb2xsZXIsIFwiY29udGVudFwiKSB8fCBzY3JvbGxlcik7XG5cbiAgICAgIG1hcmtlclN0YXJ0ID0gdGhpcy5tYXJrZXJTdGFydCA9IF9jcmVhdGVNYXJrZXIoXCJzdGFydFwiLCBpZCwgY29udGVudCwgZGlyZWN0aW9uLCBtYXJrZXJWYXJzLCBvZmZzZXQsIDAsIGNvbnRhaW5lckFuaW1hdGlvbik7XG4gICAgICBtYXJrZXJFbmQgPSB0aGlzLm1hcmtlckVuZCA9IF9jcmVhdGVNYXJrZXIoXCJlbmRcIiwgaWQsIGNvbnRlbnQsIGRpcmVjdGlvbiwgbWFya2VyVmFycywgb2Zmc2V0LCAwLCBjb250YWluZXJBbmltYXRpb24pO1xuICAgICAgY29udGFpbmVyQW5pbWF0aW9uICYmIChjYU1hcmtlclNldHRlciA9IGdzYXAucXVpY2tTZXR0ZXIoW21hcmtlclN0YXJ0LCBtYXJrZXJFbmRdLCBkaXJlY3Rpb24uYSwgX3B4KSk7XG5cbiAgICAgIGlmICghdXNlRml4ZWRQb3NpdGlvbiAmJiAhKF9wcm94aWVzLmxlbmd0aCAmJiBfZ2V0UHJveHlQcm9wKHNjcm9sbGVyLCBcImZpeGVkTWFya2Vyc1wiKSA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgX21ha2VQb3NpdGlvbmFibGUoaXNWaWV3cG9ydCA/IF9ib2R5IDogc2Nyb2xsZXIpO1xuXG4gICAgICAgIGdzYXAuc2V0KFttYXJrZXJTdGFydFRyaWdnZXIsIG1hcmtlckVuZFRyaWdnZXJdLCB7XG4gICAgICAgICAgZm9yY2UzRDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgbWFya2VyU3RhcnRTZXR0ZXIgPSBnc2FwLnF1aWNrU2V0dGVyKG1hcmtlclN0YXJ0VHJpZ2dlciwgZGlyZWN0aW9uLmEsIF9weCk7XG4gICAgICAgIG1hcmtlckVuZFNldHRlciA9IGdzYXAucXVpY2tTZXR0ZXIobWFya2VyRW5kVHJpZ2dlciwgZGlyZWN0aW9uLmEsIF9weCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lckFuaW1hdGlvbikge1xuICAgICAgdmFyIG9sZE9uVXBkYXRlID0gY29udGFpbmVyQW5pbWF0aW9uLnZhcnMub25VcGRhdGUsXG4gICAgICAgICAgb2xkUGFyYW1zID0gY29udGFpbmVyQW5pbWF0aW9uLnZhcnMub25VcGRhdGVQYXJhbXM7XG4gICAgICBjb250YWluZXJBbmltYXRpb24uZXZlbnRDYWxsYmFjayhcIm9uVXBkYXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi51cGRhdGUoMCwgMCwgMSk7XG4gICAgICAgIG9sZE9uVXBkYXRlICYmIG9sZE9uVXBkYXRlLmFwcGx5KGNvbnRhaW5lckFuaW1hdGlvbiwgb2xkUGFyYW1zIHx8IFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNlbGYucHJldmlvdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RyaWdnZXJzW190cmlnZ2Vycy5pbmRleE9mKHNlbGYpIC0gMV07XG4gICAgfTtcblxuICAgIHNlbGYubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdHJpZ2dlcnNbX3RyaWdnZXJzLmluZGV4T2Yoc2VsZikgKyAxXTtcbiAgICB9O1xuXG4gICAgc2VsZi5yZXZlcnQgPSBmdW5jdGlvbiAocmV2ZXJ0LCB0ZW1wKSB7XG4gICAgICBpZiAoIXRlbXApIHtcbiAgICAgICAgcmV0dXJuIHNlbGYua2lsbCh0cnVlKTtcbiAgICAgIH0gLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBnc2FwLmNvbnRleHQoKSBhbmQgZ3NhcC5tYXRjaE1lZGlhKCkgd2hpY2ggY2FsbCByZXZlcnQoKVxuXG5cbiAgICAgIHZhciByID0gcmV2ZXJ0ICE9PSBmYWxzZSB8fCAhc2VsZi5lbmFibGVkLFxuICAgICAgICAgIHByZXZSZWZyZXNoaW5nID0gX3JlZnJlc2hpbmc7XG5cbiAgICAgIGlmIChyICE9PSBzZWxmLmlzUmV2ZXJ0ZWQpIHtcbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICBwcmV2U2Nyb2xsID0gTWF0aC5tYXgoc2Nyb2xsRnVuYygpLCBzZWxmLnNjcm9sbC5yZWMgfHwgMCk7IC8vIHJlY29yZCB0aGUgc2Nyb2xsIHNvIHdlIGNhbiByZXZlcnQgbGF0ZXIgKHJlcG9zaXRpb25pbmcvcGlubmluZyB0aGluZ3MgY2FuIGFmZmVjdCBzY3JvbGwgcG9zaXRpb24pLiBJbiB0aGUgc3RhdGljIHJlZnJlc2goKSBtZXRob2QsIHdlIGZpcnN0IHJlY29yZCBhbGwgdGhlIHNjcm9sbCBwb3NpdGlvbnMgYXMgYSByZWZlcmVuY2UuXG5cbiAgICAgICAgICBwcmV2UHJvZ3Jlc3MgPSBzZWxmLnByb2dyZXNzO1xuICAgICAgICAgIHByZXZBbmltUHJvZ3Jlc3MgPSBhbmltYXRpb24gJiYgYW5pbWF0aW9uLnByb2dyZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXJrZXJTdGFydCAmJiBbbWFya2VyU3RhcnQsIG1hcmtlckVuZCwgbWFya2VyU3RhcnRUcmlnZ2VyLCBtYXJrZXJFbmRUcmlnZ2VyXS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uc3R5bGUuZGlzcGxheSA9IHIgPyBcIm5vbmVcIiA6IFwiYmxvY2tcIjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICBfcmVmcmVzaGluZyA9IHNlbGY7XG4gICAgICAgICAgc2VsZi51cGRhdGUocik7IC8vIG1ha2Ugc3VyZSB0aGUgcGluIGlzIGJhY2sgaW4gaXRzIG9yaWdpbmFsIHBvc2l0aW9uIHNvIHRoYXQgYWxsIHRoZSBtZWFzdXJlbWVudHMgYXJlIGNvcnJlY3QuIGRvIHRoaXMgQkVGT1JFIHN3YXBwaW5nIHRoZSBwaW4gb3V0XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGluICYmICghcGluUmVwYXJlbnQgfHwgIXNlbGYuaXNBY3RpdmUpKSB7XG4gICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgIF9zd2FwUGluT3V0KHBpbiwgc3BhY2VyLCBwaW5PcmlnaW5hbFN0YXRlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3N3YXBQaW5JbihwaW4sIHNwYWNlciwgX2dldENvbXB1dGVkU3R5bGUocGluKSwgc3BhY2VyU3RhdGUpO1xuICAgICAgICAgI
8110H1cbiAgICAgICAgfVxuXG4gICAgICAgIHIgfHwgc2VsZi51cGRhdGUocik7IC8vIHdoZW4gd2UncmUgcmVzdG9yaW5nLCB0aGUgdXBkYXRlIHNob3VsZCBydW4gQUZURVIgc3dhcHBpbmcgdGhlIHBpbiBpbnRvIGl0cyBwaW4tc3BhY2VyLlxuXG4gICAgICAgIF9yZWZyZXNoaW5nID0gcHJldlJlZnJlc2hpbmc7IC8vIHJlc3RvcmUuIFdlIHNldCBpdCB0byB0cnVlIGR1cmluZyB0aGUgdXBkYXRlKCkgc28gdGhhdCB0aGluZ3MgZmlyZSBwcm9wZXJseSBpbiB0aGVyZS5cblxuICAgICAgICBzZWxmLmlzUmV2ZXJ0ZWQgPSByO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzZWxmLnJlZnJlc2ggPSBmdW5jdGlvbiAoc29mdCwgZm9yY2UsIHBvc2l0aW9uLCBwaW5PZmZzZXQpIHtcbiAgICAgIC8vIHBvc2l0aW9uIGlzIHR5cGljYWxseSBvbmx5IGRlZmluZWQgaWYgaXQncyBjb21pbmcgZnJvbSBzZXRQb3NpdGlvbnMoKSAtIGl0J3MgYSB3YXkgdG8gc2tpcCB0aGUgbm9ybWFsIHBhcnNpbmcuIHBpbk9mZnNldCBpcyBhbHNvIG9ubHkgZnJvbSBzZXRQb3NpdGlvbnMoKSBhbmQgaXMgbW9zdGx5IHJlbGF0ZWQgdG8gZmFuY3kgc3R1ZmYgd2UgbmVlZCB0byBkbyBpbiBTY3JvbGxTbW9vdGhlciB3aXRoIGVmZmVjdHNcbiAgICAgIGlmICgoX3JlZnJlc2hpbmcgfHwgIXNlbGYuZW5hYmxlZCkgJiYgIWZvcmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBpbiAmJiBzb2Z0ICYmIF9sYXN0U2Nyb2xsVGltZSkge1xuICAgICAgICBfYWRkTGlzdGVuZXIoU2Nyb2xsVHJpZ2dlciwgXCJzY3JvbGxFbmRcIiwgX3NvZnRSZWZyZXNoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgICFfcmVmcmVzaGluZ0FsbCAmJiBvblJlZnJlc2hJbml0ICYmIG9uUmVmcmVzaEluaXQoc2VsZik7XG4gICAgICBfcmVmcmVzaGluZyA9IHNlbGY7XG5cbiAgICAgIGlmICh0d2VlblRvLnR3ZWVuICYmICFwb3NpdGlvbikge1xuICAgICAgICAvLyB3ZSBza2lwIHRoaXMgaWYgYSBwb3NpdGlvbiBpcyBwYXNzZWQgaW4gYmVjYXVzZSB0eXBpY2FsbHkgdGhhdCdzIGZyb20gLnNldFBvc2l0aW9ucygpIGFuZCBpdCdzIGJlc3QgdG8gYWxsb3cgaW4tcHJvZ3Jlc3Mgc25hcHBpbmcgdG8gY29udGludWUuXG4gICAgICAgIHR3ZWVuVG8udHdlZW4ua2lsbCgpO1xuICAgICAgICB0d2VlblRvLnR3ZWVuID0gMDtcbiAgICAgIH1cblxuICAgICAgc2NydWJUd2VlbiAmJiBzY3J1YlR3ZWVuLnBhdXNlKCk7XG5cbiAgICAgIGlmIChpbnZhbGlkYXRlT25SZWZyZXNoICYmIGFuaW1hdGlvbikge1xuICAgICAgICBhbmltYXRpb24ucmV2ZXJ0KHtcbiAgICAgICAgICBraWxsOiBmYWxzZVxuICAgICAgICB9KS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIGFuaW1hdGlvbi5nZXRDaGlsZHJlbiA/IGFuaW1hdGlvbi5nZXRDaGlsZHJlbih0cnVlLCB0cnVlLCBmYWxzZSkuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0LnZhcnMuaW1tZWRpYXRlUmVuZGVyICYmIHQucmVuZGVyKDAsIHRydWUsIHRydWUpO1xuICAgICAgICB9KSA6IGFuaW1hdGlvbi52YXJzLmltbWVkaWF0ZVJlbmRlciAmJiBhbmltYXRpb24ucmVuZGVyKDAsIHRydWUsIHRydWUpOyAvLyBhbnkgZnJvbSgpIG9yIGZyb21UbygpIHR3ZWVucyBzaG91bGQgcmVuZGVyIGltbWVkaWF0ZWx5ICh3ZWxsLCB1bmxlc3MgdGhleSBoYXZlIGltbWVkaWF0ZVJlbmRlcjogZmFsc2UpXG4gICAgICB9XG5cbiAgICAgIHNlbGYuaXNSZXZlcnRlZCB8fCBzZWxmLnJldmVydCh0cnVlLCB0cnVlKTtcbiAgICAgIHNlbGYuX3N1YlBpbk9mZnNldCA9IGZhbHNlOyAvLyB3ZSdsbCBzZXQgdGhpcyB0byB0cnVlIGluIHRoZSBzdWItcGlucyBpZiB3ZSBmaW5kIGFueVxuXG4gICAgICB2Y
8110XIgc2l6ZSA9IGdldFNjcm9sbGVyU2l6ZSgpLFxuICAgICAgICAgIHNjcm9sbGVyQm91bmRzID0gZ2V0U2Nyb2xsZXJPZmZzZXRzKCksXG4gICAgICAgICAgbWF4ID0gY29udGFpbmVyQW5pbWF0aW9uID8gY29udGFpbmVyQW5pbWF0aW9uLmR1cmF0aW9uKCkgOiBfbWF4U2Nyb2xsKHNjcm9sbGVyLCBkaXJlY3Rpb24pLFxuICAgICAgICAgIGlzRmlyc3RSZWZyZXNoID0gY2hhbmdlIDw9IDAuMDEgfHwgIWNoYW5nZSxcbiAgICAgICAgICBvZmZzZXQgPSAwLFxuICAgICAgICAgIG90aGVyUGluT2Zmc2V0ID0gcGluT2Zmc2V0IHx8IDAsXG4gICAgICAgICAgcGFyc2VkRW5kID0gX2lzT2JqZWN0KHBvc2l0aW9uKSA/IHBvc2l0aW9uLmVuZCA6IHZhcnMuZW5kLFxuICAgICAgICAgIHBhcnNlZEVuZFRyaWdnZXIgPSB2YXJzLmVuZFRyaWdnZXIgfHwgdHJpZ2dlcixcbiAgICAgICAgICBwYXJzZWRTdGFydCA9IF9pc09iamVjdChwb3NpdGlvbikgPyBwb3NpdGlvbi5zdGFydCA6IHZhcnMuc3RhcnQgfHwgKHZhcnMuc3RhcnQgPT09IDAgfHwgIXRyaWdnZXIgPyAwIDogcGluID8gXCIwIDBcIiA6IFwiMCAxMDAlXCIpLFxuICAgICAgICAgIHBpbm5lZENvbnRhaW5lciA9IHNlbGYucGlubmVkQ29udGFpbmVyID0gdmFycy5waW5uZWRDb250YWluZXIgJiYgX2dldFRhcmdldCh2YXJzLnBpbm5lZENvbnRhaW5lciwgc2VsZiksXG4gICAgICAgICAgdHJpZ2dlckluZGV4ID0gdHJpZ2dlciAmJiBNYXRoLm1heCgwLCBfdHJpZ2dlcnMuaW5kZXhPZihzZWxmKSkgfHwgMCxcbiAgICAgICAgICBpID0gdHJpZ2dlckluZGV4LFxuICAgICAgICAgIGNzLFxuICAgICAgICAgIGJvdW5kcyxcbiAgICAgICAgICBzY3JvbGwsXG4gICAgICAgICAgaXNWZXJ0aWNhbCxcbiAgICAgICAgICBvdmVycmlkZSxcbiAgICAgICAgICBjdXJUcmlnZ2VyLFxuICAgICAgICAgIGN1clBpbixcbiAgICAgICAgICBvcHBvc2l0ZVNjcm9sbCxcbiAgICAgICAgICBpbml0dGVkLFxuICAgICAgICAgIHJldmVydGVkUGlucyxcbiAgICAgICAgICBmb3JjZWRPdmVyZmxvdyxcbiAgICAgICAgICBtYXJrZXJTdGFydE9mZnNldCxcbiAgICAgICAgICBtYXJrZXJFbmRPZmZzZXQ7XG5cbiAgICAgIGlmIChtYXJrZXJzICYmIF9pc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgICAgLy8gaWYgd2UgYWx0ZXIgdGhlIHN0YXJ0L2VuZCBwb3NpdGlvbnMgd2l0aCAuc2V0UG9zaXRpb25zKCksIGl0IGdlbmVyYWxseSBmZWVkcyBpbiBhYnNvbHV0ZSBOVU1CRVJTIHdoaWNoIGRvbid0IGNvbnZleSBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0byBsaW5lIHVwIHRoZSBtYXJrZXJzLCBzbyB0byBrZWVwIGl0IGludHVpdGl2ZSwgd2UgcmVjb3JkIGhvdyBmYXIgdGhlIHRyaWdnZXIgcG9zaXRpb25zIHNoaWZ0IGFmdGVyIGFwcGx5aW5nIHRoZSBuZXcgbnVtYmVycyBhbmQgdGhlbiBvZmZzZXQgYnkgdGhhdCBtdWNoIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uIFdlIGRvIHRoZSBzYW1lIHRvIHRoZSBhc3NvY2lhdGVkIHRyaWdnZXIgbWFya2VycyB0b28gb2YgY291cnNlLlxuICAgICAgICBtYXJrZXJTdGFydE9mZnNldCA9IGdzYXAuZ2V0UHJvcGVydHkobWFya2VyU3RhcnRUcmlnZ2VyLCBkaXJlY3Rpb24ucCk7XG4gICAgICAgIG1hcmtlckVuZE9mZnNldCA9IGdzYXAuZ2V0UHJvcGVydHkobWFya2VyRW5kVHJpZ2dlciwgZGlyZWN0aW9uLnApO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAvLyB1c2VyIG1pZ2h0IHRyeSB0byBwaW4gdGhlIHNhbWUgZWxlbWVudCBtb3JlIHRoYW4gb25jZSwgc28gd2UgbXVzdCBmaW5kIGFueSBwcmlvciB0cmlnZ2VycyB3aXRoIHRoZSBzYW1lIHBpbiwgcmV2ZXJ0IHRoZW0sIGFuZCBkZXRlcm1pbmUgaG93IGxvbmcgdGhleSdyZSBwaW5uaW5nIHNvIHRoYXQgd2UgY2FuIG9mZnNldCB0aGluZ3MgYXBwcm9wcmlhdGVseS4gTWFrZSBzdXJlIHdlIHJldmVydCBmcm9tIGxhc3QgdG8gZmlyc3Qgc28gdGhhdCB0aGluZ3MgXCJyZXdpbmRcIiBwcm9wZXJseS5cbiAgICAgICAgY3VyVHJpZ2dlciA9IF90cmlnZ2Vyc1tpXTtcbiAgICAgICAgY3VyVHJpZ2dlci5lbmQgfHwgY3VyVHJpZ2dlci5yZWZyZXNoKDAsIDEpIHx8IChfcmVmcmVzaGluZyA9IHNlbGYpOyAvLyBpZiBpdCdzIGEgdGltZWxpbmUtYmFzZWQgdHJpZ2dlciB0aGF0IGhhc24ndCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkIHlldCBiZWNhdXNlIGl0J3Mgd2FpdGluZyBmb3IgMSB0aWNrLCBqdXN0IGZvcmNlIHRoZSByZWZyZXNoKCkgaGVyZSwgb3RoZXJ3aXNlIGlmIGl0IGNvbnRhaW5zIGEgcGluIHRoYXQncyBzdXBwb3NlZCB0byBhZmZlY3Qgb3RoZXIgU2Nyb2xsVHJpZ2dlcnMgZnVydGhlciBkb3duIHRoZSBwYWdlLCB0aGV5IHdvbid0IGJlIGFkanVzdGVkIHByb3Blcmx5LlxuXG4gICAgICAgIGN1clBpbiA9IGN1clRyaWdnZXIucGluO1xuXG4gICAgICAgIGlmIChjdXJQaW4gJiYgKGN1clBpbiA9PT0gdHJpZ2dlciB8fCBjdXJQaW4gPT09IHBpbiB8fCBjdXJQaW4gPT09IHBpbm5lZENvbnRhaW5lcikgJiYgIWN1clRyaWdnZXIuaXNSZXZlcnRlZCkge1xuICAgICAgICAgIHJldmVydGVkUGlucyB8fCAocmV2ZXJ0ZWRQaW5zID0gW10pO1xuICAgICAgICAgIHJldmVydGVkUGlucy51bnNoaWZ0KGN1clRyaWdnZXIpOyAvLyB3ZSdsbCByZXZlcnQgZnJvbSBmaXJzdCB0byBsYXN0IHRvIG1ha2Ugc3VyZSB0aGluZ3MgcmVhY2ggdGhlaXIgZW5kIHN0YXRlIHByb3Blcmx5XG5cbiAgICAgICAgICBjdXJUcmlnZ2VyLnJldmVydCh0cnVlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJUcmlnZ2VyICE9PSBfdHJpZ2dlcnNbaV0pIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIGl0IGdvdCByZW1vdmVkLlxuICAgICAgICAgIHRyaWdnZXJJbmRleC0tO1xuICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfaXNGdW5jdGlvbihwYXJzZWRTdGFydCkgJiYgKHBhcnNlZFN0YXJ0ID0gcGFyc2VkU3RhcnQoc2VsZikpO1xuICAgICAgcGFyc2VkU3RhcnQgPSBfcGFyc2VDbGFtcChwYXJzZWRTdGFydCwgXCJzdGFydFwiLCBzZWxmKTtcbiAgICAgIHN0YXJ0ID0gX3BhcnNlUG9zaXRpb24ocGFyc2VkU3RhcnQsIHRyaWdnZXIsIHNpemUsIGRpcmVjdGlvbiwgc2Nyb2xsRnVuYygpLCBtYXJrZXJTdGFydCwgbWFya2VyU3RhcnRUcmlnZ2VyLCBzZWxmLCBzY3JvbGxlckJvdW5kcywgYm9yZGVyV2lkdGgsIHVzZUZpeGVkUG9zaXRpb24sIG1heCwgY29udGFpbmVyQW5pbWF0aW9uLCBzZWxmLl9zdGFydENsYW1wICYmIFwiX3N0YXJ0Q2xhbXBcIikgfHwgKHBpbiA/IC0wLjAwMSA6IDApO1xuICAgICAgX2lzRnVuY3Rpb24ocGFyc2VkRW5kKSAmJiAocGFyc2VkRW5kID0gcGFyc2VkRW5kKHNlbGYpKTtcblxuICAgICAgaWYgKF9pc1N0cmluZyhwYXJzZWRFbmQpICYmICFwYXJzZWRFbmQuaW5kZXhPZihcIis9XCIpKSB7XG4gICAgICAgIGlmICh+cGFyc2VkRW5kLmluZGV4T2YoXCIgXCIpKSB7XG4gICAgICAgICAgcGFyc2VkRW5kID0gKF9pc1N0cmluZyhwYXJzZWRTdGFydCkgPyBwYXJzZWRTdGFydC5zcGxpdChcIiBcIilbMF0gOiBcIlwiKSArIHBhcnNlZEVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgPSBfb2Zmc2V0VG9QeChwYXJzZWRFbmQuc3Vic3RyKDIpLCBzaXplKTtcbiAgICAgICAgICBwYXJzZWRFbmQgPSBfaXNTdHJpbmcocGFyc2VkU3RhcnQpID8gcGFyc2VkU3RhcnQgOiAoY29udGFpbmVyQW5pbWF0aW9uID8gZ3NhcC51dGlscy5tYXBSYW5nZSgwLCBjb250YWluZXJBbmltYXRpb24uZHVyYXRpb24oKSwgY29udGFpbmVyQW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIuc3RhcnQsIGNvbnRhaW5lckFuaW1hdGlvbi5zY3JvbGxUcmlnZ2VyLmVuZCwgc3RhcnQpIDogc3RhcnQpICsgb2Zmc2V0OyAvLyBfcGFyc2VQb3NpdGlvbiB3b24ndCBmYWN0b3IgaW4gdGhlIG9mZnNldCBpZiB0aGUgc3RhcnQgaXMgYSBudW1iZXIsIHNvIGRvIGl0IGhlcmUuXG5cbiAgICAgICAgICBwYXJzZWRFbmRUcmlnZ2VyID0gdHJpZ2dlcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYXJzZWRFbmQgPSBfcGFyc2VDbGFtcChwYXJzZWRFbmQsIFwiZW5kXCIsIHNlbGYpO1xuICAgICAgZW5kID0gTWF0aC5tYXgoc3RhcnQsIF9wYXJzZVBvc2l0aW9uKHBhcnNlZEVuZCB8fCAocGFyc2VkRW5kVHJpZ2dlciA/IFwiMTAwJSAwXCIgOiBtYXgpLCBwYXJzZWRFbmRUcmlnZ2VyLCBzaXplLCBkaXJlY3Rpb24sIHNjcm9sbEZ1bmMoKSArIG9mZnNldCwgbWFya2VyRW5kLCBtYXJrZXJFbmRUcmlnZ2VyLCBzZWxmLCBzY3JvbGxlckJvdW5kcywgYm9yZGVyV2lkdGgsIHVzZUZpeGVkUG9zaXRpb24sIG1heCwgY29udGFpbmVyQW5pbWF0aW9uLCBzZWxmLl9lbmRDbGFtcCAmJiBcIl9lbmRDbGFtcFwiKSkgfHwgLTAuMDAxO1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgIGkgPSB0cmlnZ2VySW5kZXg7XG5cbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY3VyVHJpZ2dlciA9IF90cmlnZ2Vyc1tpXSB8fCB7fTtcbiAgICAgICAgY3VyUGluID0gY3VyVHJpZ2dlci5waW47XG5cbiAgICAgICAgaWYgKGN1clBpbiAmJiBjdXJUcmlnZ2VyLnN0YXJ0IC0gY3VyVHJpZ2dlci5fcGluUHVzaCA8PSBzdGFydCAmJiAhY29udGFpbmVyQW5pbWF0aW9uICYmIGN1clRyaWdnZXIuZW5kID4gMCkge1xuICAgICAgICAgIGNzID0gY3VyVHJpZ2dlci5lbmQgLSAoc2VsZi5fc3RhcnRDbGFtcCA/IE1hdGgubWF4KDAsIGN1clRyaWdnZXIuc3RhcnQpIDogY3VyVHJpZ2dlci5zdGFydCk7XG5cbiAgICAgICAgICBpZiAoKGN1clBpbiA9PT0gdHJpZ2dlciAmJiBjdXJUcmlnZ2VyLnN0YXJ0IC0gY3VyVHJpZ2dlci5fcGluUHVzaCA8IHN0YXJ0IHx8IGN1clBpbiA9PT0gcGlubmVkQ29udGFpbmVyKSAmJiBpc05hTihwYXJzZWRTdGFydCkpIHtcbiAgICAgICAgICAgIC8vIG51bWVyaWMgc3RhcnQgdmFsdWVzIHNob3VsZG4ndCBiZSBvZmZzZXQgYXQgYWxsIC0gdHJlYXQgdGhlbSBhcyBhYnNvbHV0ZVxuICAgICAgICAgICAgb2Zmc2V0ICs9IGNzICogKDEgLSBjdXJUcmlnZ2VyLnByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjdXJQaW4gPT
811009IHBpbiAmJiAob3RoZXJQaW5PZmZzZXQgKz0gY3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0YXJ0ICs9IG9mZnNldDtcbiAgICAgIGVuZCArPSBvZmZzZXQ7XG4gICAgICBzZWxmLl9zdGFydENsYW1wICYmIChzZWxmLl9zdGFydENsYW1wICs9IG9mZnNldCk7XG5cbiAgICAgIGlmIChzZWxmLl9lbmRDbGFtcCAmJiAhX3JlZnJlc2hpbmdBbGwpIHtcbiAgICAgICAgc2VsZi5fZW5kQ2xhbXAgPSBlbmQgfHwgLTAuMDAxO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbihlbmQsIF9tYXhTY3JvbGwoc2Nyb2xsZXIsIGRpcmVjdGlvbikpO1xuICAgICAgfVxuXG4gICAgICBjaGFuZ2UgPSBlbmQgLSBzdGFydCB8fCAoc3RhcnQgLT0gMC4wMSkgJiYgMC4wMDE7XG5cbiAgICAgIGlmIChpc0ZpcnN0UmVmcmVzaCkge1xuICAgICAgICAvLyBvbiB0aGUgdmVyeSBmaXJzdCByZWZyZXNoKCksIHRoZSBwcmV2UHJvZ3Jlc3MgY291bGRuJ3QgaGF2ZSBiZWVuIGFjY3VyYXRlIHlldCBiZWNhdXNlIHRoZSBzdGFydC9lbmQgd2VyZSBuZXZlciBjYWxjdWxhdGVkLCBzbyB3ZSBzZXQgaXQgaGVyZS4gQmVmb3JlIDMuMTEuNSwgaXQgY291bGQgbGVhZCB0byBhbiBpbmFjY3VyYXRlIHNjcm9sbCBwb3NpdGlvbiByZXN0b3JhdGlvbiB3aXRoIHNuYXBwaW5nLlxuICAgICAgICBwcmV2UHJvZ3Jlc3MgPSBnc2FwLnV0aWxzLmNsYW1wKDAsIDEsIGdzYXAudXRpbHMubm9ybWFsaXplKHN0YXJ0LCBlbmQsIHByZXZTY3JvbGwpKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5fcGluUHVzaCA9IG90aGVyUGluT2Zmc2V0O1xuXG4gICAgICBpZiAobWFya2VyU3RhcnQgJiYgb2Zmc2V0KSB7XG4gICAgICAgIC8vIG9mZnNldCB0aGUgbWFya2VycyBpZiBuZWNlc3NhcnlcbiAgICAgICAgY3MgPSB7fTtcbiAgICAgICAgY3NbZGlyZWN0aW9uLmFdID0gXCIrPVwiICsgb2Zmc2V0O1xuICAgICAgICBwaW5uZWRDb250YWluZXIgJiYgKGNzW2RpcmVjdGlvbi5wXSA9IFwiLT1cIiArIHNjcm9sbEZ1bmMoKSk7XG4gICAgICAgIGdzYXAuc2V0KFttYXJrZXJTdGFydCwgbWFya2VyRW5kXSwgY3MpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGluICYmICEoX2NsYW1waW5nTWF4ICYmIHNlbGYuZW5kID49IF9tYXhTY3JvbGwoc2Nyb2xsZXIsIGRpcmVjdGlvbikpKSB7XG4gICAgICAgIGNzID0gX2dldENvbXB1dGVkU3R5bGUocGluKTtcbiAgICAgICAgaXNWZXJ0aWNhbCA9IGRpcmVjdGlvbiA9PT0gX3ZlcnRpY2FsO1xuICAgICAgICBzY3JvbGwgPSBzY3JvbGxGdW5jKCk7IC8vIHJlY2FsY3VsYXRlIGJlY2F1c2UgdGhlIHRyaWdnZXJzIGNhbiBhZmZlY3QgdGhlIHNjcm9sbFxuXG4gICAgICAgIHBpblN0YXJ0ID0gcGFyc2VGbG9hdChwaW5HZXR0ZXIoZGlyZWN0aW9uLmEpKSArIG90aGVyUGluT2Zmc2V0O1xuXG4gICAgICAgIGlmICghbWF4ICYmIGVuZCA+IDEpIHtcbiAgICAgICAgICAvLyBtYWtlcyBzdXJlIHRoZSBzY3JvbGxlciBoYXMgYSBzY3JvbGxiYXIsIG90aGVyd2lzZSBpZiBzb21ldGhpbmcgaGFzIHdpZHRoOiAxMDAlLCBmb3IgZXhhbXBsZSwgaXQgd291bGQgYmUgdG9vIGJpZyAoZXhjbHVkZSB0aGUgc2Nyb2xsYmFyKS4gU2VlIGh0dHBzOi8vZ3NhcC5jb20vZm9ydW1zL3RvcGljLzI1MTgyLXNjcm9sbHRyaWdnZXItd2lkdGgtb2YtcGFnZS1pbmNyZWFzZS13aGVyZS1tYXJrZXJzLWFyZS1zZXQtdG8tZmFsc2UvXG4gICAgICAgICAgZm9yY2VkT3ZlcmZsb3cgPSAoaXNWaWV3cG9ydCA/IF9kb2Muc2Nyb2xsaW5nRWxlbWVudCB8fCBfZG9jRWwgOiBzY3JvbGxlcikuc3R5bGU7XG4gICAgICAgICAgZm9yY2VkT3ZlcmZsb3cgPSB7XG4gICAgICAgICAgICBzdHlsZTogZm9yY2VkT3ZlcmZsb3csXG4gICAgICAgICAgICB2YWx1ZTogZm9yY2VkT3ZlcmZsb3dbXCJvdmVyZmxvd1wiICsgZGlyZWN0aW9uLmEudG9VcHBlckNhc2UoKV1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGlzVmlld3BvcnQgJiYgX2dldENvbXB1dGVkU3R5bGUoX2JvZHkpW1wib3ZlcmZsb3dcIiArIGRpcmVjdGlvbi5hLnRvVXBwZXJDYXNlKCldICE9PSBcInNjcm9sbFwiKSB7XG4gICAgICAgICAgICAvLyBhdm9pZCBhbiBleHRyYSBzY3JvbGxiYXIgaWYgQk9USCA8aHRtbD4gYW5kIDxib2R5PiBoYXZlIG92ZXJmbG93IHNldCB0byBcInNjcm9sbFwiXG4gICAgICAgICAgICBmb3JjZWRPdmVyZmxvdy5zdHlsZVtcIm92ZXJmbG93XCIgKyBkaXJlY3Rpb24uYS50b1VwcGVyQ2FzZSgpXSA9IFwic2Nyb2xsXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3N3YXBQaW5JbihwaW4sIHNwYWNlciwgY3MpO1xuXG4gICAgICAgIHBpblN0YXRlID0gX2dldFN0YXRlKHBpbik7IC8vIHRyYW5zZm9ybXMgd2lsbCBpbnRlcmZlcmUgd2l0aCB0aGUgdG9wL2xlZnQvcmlnaHQvYm90dG9tIHBsYWNlbWVudCwgc28gcmVtb3ZlIHRoZW0gdGVtcG9yYXJpbHkuIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGZhY3RvcnMgaW4gdHJhbnNmb3Jtcy5cblxuICAgICAgICBib3VuZHMgPSBfZ2V0Qm91bmRzKHBpbiwgdHJ1ZSk7XG4gICAgICAgIG9wcG9zaXRlU2Nyb2xsID0gdXNlRml4ZWRQb3NpdGlvbiAmJiBfZ2V0U2Nyb2xsRnVuYyhzY3JvbGxlciwgaXNWZXJ0aWNhbCA/IF9ob3Jpem9udGFsIDogX3ZlcnRpY2FsKSgpO1xuXG4gICAgICAgIGlmIChwaW5TcGFjaW5nKSB7XG4gICAgICAgICAgc3BhY2VyU3RhdGUgPSBbcGluU3BhY2luZyArIGRpcmVjdGlvbi5vczIsIGNoYW5nZSArIG90aGVyUGluT2Zmc2V0ICsgX3B4XTtcbiAgICAgICAgICBzcGFjZXJTdGF0ZS50ID0gc3BhY2VyO1xuICAgICAgICAgIGkgPSBwaW5TcGFjaW5nID09PSBfcGFkZGluZyA/IF9nZXRTaXplKHBpbiwgZGlyZWN0aW9uKSArIGNoYW5nZSArIG90aGVyUGluT2Zmc2V0IDogMDtcblxuICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICBzcGFjZXJTdGF0ZS5wdXNoKGRpcmVjdGlvbi5kLCBpICsgX3B4KTsgLy8gZm9yIGJveC1zaXppbmc6IGJvcmRlci1ib3ggKG11c3QgaW5jbHVkZSBwYWRkaW5nKS5cblxuICAgICAgICAgICAgc3BhY2VyLnN0eWxlLmZsZXhCYXNpcyAhPT0gXCJhdXRvXCIgJiYgKHNwYWNlci5zdHlsZS5mbGV4QmFzaXMgPSBpICsgX3B4KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfc2V0U3RhdGUoc3BhY2VyU3RhdGUpO1xuXG4gICAgICAgICAgaWYgKHBpbm5lZENvbnRhaW5lcikge1xuICAgICAgICAgICAgLy8gaW4gU2Nyb2xsVHJpZ2dlci5yZWZyZXNoKCksIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgdGhlIHBpbkNvbnRhaW5lcidzIHNpemUgYmVjYXVzZSB0aGlzIHBpblNwYWNpbmcgbWF5IHN0cmV0Y2ggaXQgb3V0LCBidXQgd2UgY2FuJ3QganVzdCBhZGQgdGhlIGV4YWN0IGRpc3R
8110hbmNlIGJlY2F1c2UgZGVwZW5kaW5nIG9uIGxheW91dCwgaXQgbWF5IG5vdCBwdXNoIHRoaW5ncyBkb3duIG9yIGl0IG1heSBvbmx5IGRvIHNvIHBhcnRpYWxseS5cbiAgICAgICAgICAgIF90cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIGlmICh0LnBpbiA9PT0gcGlubmVkQ29udGFpbmVyICYmIHQudmFycy5waW5TcGFjaW5nICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHQuX3N1YlBpbk9mZnNldCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVzZUZpeGVkUG9zaXRpb24gJiYgc2Nyb2xsRnVuYyhwcmV2U2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gX2dldFNpemUocGluLCBkaXJlY3Rpb24pO1xuICAgICAgICAgIGkgJiYgc3BhY2VyLnN0eWxlLmZsZXhCYXNpcyAhPT0gXCJhdXRvXCIgJiYgKHNwYWNlci5zdHlsZS5mbGV4QmFzaXMgPSBpICsgX3B4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1c2VGaXhlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgb3ZlcnJpZGUgPSB7XG4gICAgICAgICAgICB0b3A6IGJvdW5kcy50b3AgKyAoaXNWZXJ0aWNhbCA/IHNjcm9sbCAtIHN0YXJ0IDogb3Bwb3NpdGVTY3JvbGwpICsgX3B4LFxuICAgICAgICAgICAgbGVmdDogYm91bmRzLmxlZnQgKyAoaXNWZXJ0aWNhbCA/IG9wcG9zaXRlU2Nyb2xsIDogc2Nyb2xsIC0gc3RhcnQpICsgX3B4LFxuICAgICAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCJcbiAgICAgICAgICB9O1xuICAgICAgICAgIG92ZXJyaWRlW193aWR0aF0gPSBvdmVycmlkZVtcIm1heFwiICsgX1dpZHRoXSA9IE1hdGguY2VpbChib3VuZHMud2lkdGgpICsgX3B4O1xuICAgICAgICAgIG92ZXJyaWRlW19oZWlnaHRdID0gb3ZlcnJpZGVbXCJtYXhcIiArIF9IZWlnaHRdID0gTWF0aC5jZWlsKGJvdW5kcy5oZWlnaHQpICsgX3B4O1xuICAgICAgICAgIG92ZXJyaWRlW19tYXJnaW5dID0gb3ZlcnJpZGVbX21hcmdpbiArIF9Ub3BdID0gb3ZlcnJpZGVbX21hcmdpbiArIF9SaWdodF0gPSBvdmVycmlkZVtfbWFyZ2luICsgX0JvdHRvbV0gPSBvdmVycmlkZVtfbWFyZ2luICsgX0xlZnRdID0gXCIwXCI7XG4gICAgICAgICAgb3ZlcnJpZGVbX3BhZGRpbmddID0gY3NbX3BhZGRpbmddO1xuICAgICAgICAgIG92ZXJyaWRlW19wYWRkaW5nICsgX1RvcF0gPSBjc1tfcGFkZGluZyArIF9Ub3BdO1xuICAgICAgICAgIG92ZXJyaWRlW19wYWRkaW5nICsgX1JpZ2h0XSA9IGNzW19wYWRkaW5nICsgX1JpZ2h0XTtcbiAgICAgICAgICBvdmVycmlkZVtfcGFkZGluZyArIF9Cb3R0b21dID0gY3NbX3BhZGRpbmcgKyBfQm90dG9tXTtcbiAgICAgICAgICBvdmVycmlkZVtfcGFkZGluZyArIF9MZWZ0XSA9IGNzW19wYWRkaW5nICsgX0xlZnRdO1xuICAgICAgICAgIHBpbkFjdGl2ZVN0YXRlID0gX2NvcHlTdGF0ZShwaW5PcmlnaW5hbFN0YXRlLCBvdmVycmlkZSwgcGluUmVwYXJlbnQpO1xuICAgICAgICAgIF9yZWZyZXNoaW5nQWxsICYmIHNjcm9sbEZ1bmMoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgLy8gdGhlIGFuaW1hdGlvbiBtaWdodCBiZSBhZmZlY3RpbmcgdGhlIHRyYW5zZm9ybSwgc28gd2UgbXVzdCBqdW1wIHRvIHRoZSBlbmQsIGNoZWNrIHRoZSB2YWx1ZSwgYW5kIGNvbXBlbnNhdGUgYWNjb3JkaW5nbHkuIE90aGVyd2lzZSwgd2hlbiBpdCBiZWNvbWVzIHVucGlubmVkLCB0aGUgcGluU2V0dGVyKCkgd2lsbCBnZXQgc2V0IHRvIGEgdmFsdWUgdGhhdCBkb2Vzbid0IGluY2x1ZGUgd2hhdGV2ZXIgdGhlIGFuaW1hdGlvbiBkaWQuXG4gICAgICAgICAgaW5pdHRlZCA9IGFuaW1hdGlvbi5faW5pdHRlZDsgLy8gaWYgbm90LCB3ZSBtdXN0IGludmFsaWRhdGUoKSBhZnRlciB0aGlzIHN0ZXAsIG90aGVyd2lzZSBpdCBjb3VsZCBsb2NrIGluIHN0YXJ0aW5nIHZhbHVlcyBwcmVtYXR1cmVseS5cblxuICAgICAgICAgIF9zdXBwcmVzc092ZXJ3cml0ZXMoMSk7XG5cbiAgICAgICAgICBhbmltYXRpb24ucmVuZGVyKGFuaW1hdGlvbi5kdXJhdGlvbigpLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBwaW5DaGFuZ2UgPSBwaW5HZXR0ZXIoZGlyZWN0aW9uLmEpIC0gcGluU3RhcnQgKyBjaGFuZ2UgKyBvdGhlclBpbk9mZnNldDtcbiAgICAgICAgICBwaW5Nb3ZlcyA9IE1hdGguYWJzKGNoYW5nZSAtIHBpbkNoYW5nZSkgPiAxO1xuICAgICAgICAgIHVzZUZpeGVkUG9zaXRpb24gJiYgcGluTW92ZXMgJiYgcGluQWN0aXZlU3RhdGUuc3BsaWNlKHBpbkFjdGl2ZVN0YXRlLmxlbmd0aCAtIDIsIDIpOyAvLyB0cmFuc2Zvcm0gaXMgdGhlIGxhc3QgcHJvcGVydHkvdmFsdWUgc2V0IGluIHRoZSBzdGF0ZSBBcnJheS4gU2luY2UgdGhlIGFuaW1hdGlvbiBpcyBjb250cm9sbGluZyB0aGF0LCB3ZSBzaG91bGQgb21pdCBpdC5cblxuICAgICAgICAgIGFuaW1hdGlvbi5yZW5kZXIoMCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgaW5pdHRlZCB8fCBhbmltYXRpb24uaW52YWxpZGF0ZSh0cnVlKTtcbiAgICAgICAgICBhbmltYXRpb24ucGFyZW50IHx8IGFuaW1hdGlvbi50b3RhbFRpbWUoYW5pbWF0aW9uLnRvdGFsVGltZSgpKTsgLy8gaWYsIGZvciBleGFtcGxlLCBhIHRvZ2dsZUFjdGlvbiBjYWxsZWQgcGxheSgpIGFuZCB0aGVuIHJlZnJlc2goKSBoYXBwZW5zIGFuZCB3aGVuIHdlIHJlbmRlcigxKSBhYm92ZSwgaXQgd291bGQgY2F1c2UgdGhlIGFuaW1hdGlvbiB0byBjb21wbGV0ZSBhbmQgZ2V0IHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50LCBzbyB0aGlzIG1ha2VzIHN1cmUgaXQgZ2V0cyBwdXQgYmFjayBpbi5cblxuICAgICAgICAgIF9zdXBwcmVzc092ZXJ3cml0ZXMoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGluQ2hhbmdlID0gY2hhbmdlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yY2VkT3ZlcmZsb3cgJiYgKGZvcmNlZE92ZXJmbG93LnZhbHVlID8gZm9yY2VkT3ZlcmZsb3cuc3R5bGVbXCJvdmVyZmxvd1wiICsgZGlyZWN0aW9uLmEudG9VcHBlckNhc2UoKV0gPSBmb3JjZWRPdmVyZmxvdy52YWx1ZSA6IGZvcmNlZE92ZXJmbG93LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwib3ZlcmZsb3ctXCIgKyBkaXJlY3Rpb24uYSkpO1xuICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyICYmIHNjcm9sbEZ1bmMoKSAmJiAhY29udGFpbmVyQW5pbWF0aW9uKSB7XG4gICAgICAgIC8vIGl0IG1heSBiZSBJTlNJREUgYS
8110BwaW5uZWQgZWxlbWVudCwgc28gd2FsayB1cCB0aGUgdHJlZSBhbmQgbG9vayBmb3IgYW55IGVsZW1lbnRzIHdpdGggX3Bpbk9mZnNldCB0byBjb21wZW5zYXRlIGJlY2F1c2UgYW55dGhpbmcgd2l0aCBwaW5TcGFjaW5nIHRoYXQncyBhbHJlYWR5IHNjcm9sbGVkIHdvdWxkIHRocm93IG9mZiB0aGUgbWVhc3VyZW1lbnRzIGluIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGJvdW5kcyA9IHRyaWdnZXIucGFyZW50Tm9kZTtcblxuICAgICAgICB3aGlsZSAoYm91bmRzICYmIGJvdW5kcyAhPT0gX2JvZHkpIHtcbiAgICAgICAgICBpZiAoYm91bmRzLl9waW5PZmZzZXQpIHtcbiAgICAgICAgICAgIHN0YXJ0IC09IGJvdW5kcy5fcGluT2Zmc2V0O1xuICAgICAgICAgICAgZW5kIC09IGJvdW5kcy5fcGluT2Zmc2V0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJvdW5kcyA9IGJvdW5kcy5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldmVydGVkUGlucyAmJiByZXZlcnRlZFBpbnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5yZXZlcnQoZmFsc2UsIHRydWUpO1xuICAgICAgfSk7XG4gICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICBzZWxmLmVuZCA9IGVuZDtcbiAgICAgIHNjcm9sbDEgPSBzY3JvbGwyID0gX3JlZnJlc2hpbmdBbGwgPyBwcmV2U2Nyb2xsIDogc2Nyb2xsRnVuYygpOyAvLyByZXNldCB2ZWxvY2l0eVxuXG4gICAgICBpZiAoIWNvbnRhaW5lckFuaW1hdGlvbiAmJiAhX3JlZnJlc2hpbmdBbGwpIHtcbiAgICAgICAgc2Nyb2xsMSA8IHByZXZTY3JvbGwgJiYgc2Nyb2xsRnVuYyhwcmV2U2Nyb2xsKTtcbiAgICAgICAgc2VsZi5zY3JvbGwucmVjID0gMDtcbiAgICAgIH1cblxuICAgICAgc2VsZi5yZXZlcnQoZmFsc2UsIHRydWUpO1xuICAgICAgbGFzdFJlZnJlc2ggPSBfZ2V0VGltZSgpO1xuXG4gICAgICBpZiAoc25hcERlbGF5ZWRDYWxsKSB7XG4gICAgICAgIGxhc3RTbmFwID0gLTE7IC8vIGp1c3Qgc28gc25hcHBpbmcgZ2V0cyByZS1lbmFibGVkLCBjbGVhciBvdXQgYW55IHJlY29yZGVkIGxhc3QgdmFsdWVcbiAgICAgICAgLy8gc2VsZi5pc0FjdGl2ZSAmJiBzY3JvbGxGdW5jKHN0YXJ0ICsgY2hhbmdlICogcHJldlByb2dyZXNzKTsgLy8gcHJldmlvdXNseSB0aGlzIGxpbmUgd2FzIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2hlbiBzbmFwcGluZyBraWNrcyBpbiwgaXQncyBmcm9tIHRoZSBwcmV2aW91cyBwcm9ncmVzcyBidXQgaW4gc29tZSBjYXNlcyB0aGF0J3Mgbm90IGRlc2lyYWJsZSwgbGlrZSBhbiBhbGwtcGFnZSBTY3JvbGxUcmlnZ2VyIHdoZW4gbmV3IGNvbnRlbnQgZ2V0cyBhZGRlZCB0byB0aGUgcGFnZSwgdGhhdCdkIHRvdGFsbHkgY2hhbmdlIHRoZSBwcm9ncmVzcy5cblxuICAgICAgICBzbmFwRGVsYXllZENhbGwucmVzdGFydCh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgX3JlZnJlc2hpbmcgPSAwO1xuICAgICAgYW5pbWF0aW9uICYmIGlzVG9nZ2xlICYmIChhbmltYXRpb24uX2luaXR0ZWQgfHwgcHJldkFuaW1Qcm9ncmVzcykgJiYgYW5pbWF0aW9uLnByb2dyZXNzKCkgIT09IHByZXZBbmltUHJvZ3Jlc3MgJiYgYW5pbWF0aW9uLnByb2dyZXNzKHByZXZBbmltUHJvZ3Jlc3MgfHwgMCwgdHJ1ZSkucmVuZGVyKGFuaW1hdGlvbi50aW1lKCksIHRydWUsIHRydWUpOyAvLyBtdXN0IGZvcmNlIGEgcmUtcmVuZGVyIGJlY2F1c2UgaWYgc2F2ZVN0eWxlcygpIHdhcyB1c2VkIG9uIHRoZSB0YXJnZXQocyksIHRoZSBzdHlsZXMgY291bGQgaGF2ZSBiZWVuIHdpcGVkIG91dCBkdXJpbmcgdGhlIHJlZnJlc2goKS5cblxuICAgICAgaWYgKGlzRmlyc3RSZWZyZXNoIHx8IHByZXZQcm9ncmVzcyAhPT0gc2VsZi5wcm9ncmVzcyB8fCBjb250YWluZXJBbmltYXRpb24gfHwgaW52YWxpZGF0ZU9uUmVmcmVzaCB8fCBhbmltYXRpb24gJiYgIWFuaW1hdGlvbi5faW5pdHRlZCkge1xuICAgICAgICAvLyBlbnN1cmVzIHRoYXQgdGhlIGRpcmVjdGlvbiBpcyBzZXQgcHJvcGVybHkgKHdoZW4gcmVmcmVzaGluZywgcHJvZ3Jlc3MgaXMgc2V0IGJhY2sgdG8gMCBpbml0aWFsbHksIHRoZW4gYmFjayBhZ2FpbiB0byB3aGVyZXZlciBpdCBuZWVkcyB0byBiZSkgYW5kIHRoYXQgY2FsbGJhY2tzIGFyZSB0cmlnZ2VyZWQuXG4gICAgICAgIGFuaW1hdGlvbiAmJiAhaXNUb2dnbGUgJiYgKGFuaW1hdGlvbi5faW5pdHRlZCB8fCBwcmV2UHJvZ3Jlc3MgfHwgYW5pbWF0aW9uLnZhcnMuaW1tZWRpYXRlUmVuZGVyICE9PSBmYWxzZSkgJiYgYW5pbWF0aW9uLnRvdGFsUHJvZ3Jlc3MoY29udGFpbmVyQW5pbWF0aW9uICYmIHN0YXJ0IDwgLTAuMDAxICYmICFwcmV2UHJvZ3Jlc3MgPyBnc2FwLnV0aWxzLm5vcm1hbGl6ZShzdGFydCwgZW5kLCAwKSA6IHByZXZQcm9ncmVzcywgdHJ1ZSk7IC8vIHRvIGF2b2lkIGlzc3VlcyB3aGVyZSBhbmltYXRpb24gY2FsbGJhY2tzIGxpa2Ugb25TdGFydCBhcmVuJ3QgdHJpZ2dlcmVkLlxuXG4gICAgICAgIHNlbGYucHJvZ3Jlc3MgPSBpc0ZpcnN0UmVmcmVzaCB8fCAoc2Nyb2xsMSAtIHN0YXJ0KSAvIGNoYW5nZSA9PT0gcHJldlByb2dyZXNzID8gMCA6IHByZXZQcm9ncmVzcztcbiAgICAgIH1cblxuICAgICAgcGluICYmIHBpblNwYWNpbmcgJiYgKHNwYWNlci5fcGluT2Zmc2V0ID0gTWF0aC5yb3VuZChzZWxmLnByb2dyZXNzICogcGluQ2hhbmdlKSk7XG4gICAgICBzY3J1YlR3ZWVuICYmIHNjcnViVHdlZW4uaW52YWxpZGF0ZSgpO1xuXG4gICAgICBpZiAoIWlzTmFOKG1hcmtlclN0YXJ0T2Zmc2V0KSkge1xuICAgICAgICAvLyBudW1iZXJzIHdlcmUgcGFzc2VkIGluIGZvciB0aGUgcG9zaXRpb24gd2hpY2ggYXJlIGFic29sdXRlLCBzbyBpbnN0ZWFkIG9mIGp1c3QgcHV0dGluZyB0aGUgbWFya2VycyBhdCB0aGUgdmVyeSBib3R0b20gb2YgdGhlIHZpZXdwb3J0LCB3ZSBmaWd1cmUgb3V0IGhvdyBmYXIgdGhleSBzaGlmdGVkIGRvd24gKGl0J3Mgc2FmZSB0byBhc3N1bWUgdGhleSB3ZXJlIG9yaWdpbmFsbHkgcG9zaXRpb25lZCBpbiBjbG9zZXIgcmVsYXRpb24gdG8gdGhlIHRyaWdnZXIgZWxlbWVudCB3aXRoIHZhbHVlcyBsaWtlIFwidG9wXCIsIFwiY2VudGVyXCIsIGEgcGVyY2VudGFnZSBvciB3aGF0ZXZlciwgc28gd2Ugb2Zmc2V0IHRoYXQgbXVjaCBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIHRvIGJhc2ljYWxseSByZXZlcnQgdGhlbSB0byB0aGUgcmVsYXRpdmUgcG9zaXRpb24gdGh5IHdlcmUgYXQgcHJldmlvdXNseS5cbiAgICAgICAgbWFya2VyU3RhcnRPZmZzZXQgLT0gZ3NhcC5nZXRQcm9wZXJ0eShtYXJrZXJTdGFydFRyaWdnZXIsIGRpcmVjdGlvbi5wKTtcbiAgICAgICAgbWFya2VyRW5kT2Zmc2V0IC09IGdzYXAuZ2V0UHJvcGVydHkobWFya2VyRW5kVHJpZ2dlciwgZGlyZWN0aW9uLnApO1xuXG4gICAgICAgIF9zaGlmdE1hcmtlcihtYXJrZXJTdGFydFRyaWdnZXIsIGRpcmVjdGlvbiwgbWFya2VyU3RhcnRPZmZzZXQpO1xuXG4gICAgICAgIF9zaGlmdE1hcmtlcihtYXJrZXJTdGFydCwgZGlyZWN0aW9uLCBtYXJrZXJTdGFydE9mZnNldCAtIChwaW5PZmZzZXQgfHwgMCkpO1xuXG4gICAgICAgIF9zaGlmdE1hcmtlcihtYXJrZXJFbmRUcmlnZ2VyLCBkaXJlY3Rpb24sIG1hcmtlckVuZE9mZnNldCk7XG5cbiAgICAgICAgX3NoaWZ0TWFya2VyKG1hcmtlckVuZCwgZGlyZWN0aW9uLCBtYXJrZXJFbmRPZmZzZXQgLSAocGluT2Zmc2V0IHx8IDApKTtcbiAgICAgIH1cblxuICAgICAgaXNGaXJzdFJlZnJlc2ggJiYgIV9yZWZyZXNoaW5nQWxsICYmIHNlbGYudXBkYXRlKCk7IC8vIGVkZ2UgY2FzZSAtIHdoZW4geW91IHJlbG9hZCBh
8110IHBhZ2Ugd2hlbiBpdCdzIGFscmVhZHkgc2Nyb2xsZWQgZG93biwgc29tZSBicm93c2VycyBmaXJlIGEgXCJzY3JvbGxcIiBldmVudCBiZWZvcmUgRE9NQ29udGVudExvYWRlZCwgdHJpZ2dlcmluZyBhbiB1cGRhdGVBbGwoKS4gSWYgd2UgZG9uJ3QgdXBkYXRlIHRoZSBzZWxmLnByb2dyZXNzIGFzIHBhcnQgb2YgcmVmcmVzaCgpLCB0aGVuIHdoZW4gaXQgaGFwcGVucyBuZXh0LCBpdCBtYXkgcmVjb3JkIHByZXZQcm9ncmVzcyBhcyAwIHdoZW4gaXQgcmVhbGx5IHNob3VsZG4ndCwgcG90ZW50aWFsbHkgY2F1c2luZyBhIGNhbGxiYWNrIGluIGFuIGFuaW1hdGlvbiB0byBmaXJlIGFnYWluLlxuXG4gICAgICBpZiAob25SZWZyZXNoICYmICFfcmVmcmVzaGluZ0FsbCAmJiAhZXhlY3V0aW5nT25SZWZyZXNoKSB7XG4gICAgICAgIC8vIHdoZW4gcmVmcmVzaGluZyBhbGwsIHdlIGRvIGV4dHJhIHdvcmsgdG8gY29ycmVjdCBwaW5uZWRDb250YWluZXIgc2l6ZXMgYW5kIGVuc3VyZSB0aGluZ3MgZG9uJ3QgZXhjZWVkIHRoZSBtYXhTY3JvbGwsIHNvIHdlIHNob3VsZCBkbyBhbGwgdGhlIHJlZnJlc2hlcyBhdCB0aGUgZW5kIGFmdGVyIGFsbCB0aGF0IHdvcmsgc28gdGhhdCB0aGUgc3RhcnQvZW5kIHZhbHVlcyBhcmUgY29ycmVjdGVkLlxuICAgICAgICBleGVjdXRpbmdPblJlZnJlc2ggPSB0cnVlO1xuICAgICAgICBvblJlZnJlc2goc2VsZik7XG4gICAgICAgIGV4ZWN1dGluZ09uUmVmcmVzaCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzZWxmLmdldFZlbG9jaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIChzY3JvbGxGdW5jKCkgLSBzY3JvbGwyKSAvIChfZ2V0VGltZSgpIC0gX3RpbWUyKSAqIDEwMDAgfHwgMDtcbiAgICB9O1xuXG4gICAgc2VsZi5lbmRBbmltYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfZW5kQW5pbWF0aW9uKHNlbGYuY2FsbGJhY2tBbmltYXRpb24pO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIHNjcnViVHdlZW4gPyBzY3J1YlR3ZWVuLnByb2dyZXNzKDEpIDogIWFuaW1hdGlvbi5wYXVzZWQoKSA/IF9lbmRBbmltYXRpb24oYW5pbWF0aW9uLCBhbmltYXRpb24ucmV2ZXJzZWQoKSkgOiBpc1RvZ2dsZSB8fCBfZW5kQW5pbWF0aW9uKGFuaW1hdGlvbiwgc2VsZi5kaXJlY3Rpb24gPCAwLCAxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2VsZi5sYWJlbFRvU2Nyb2xsID0gZnVuY3Rpb24gKGxhYmVsKSB7XG4gICAgICByZXR1cm4gYW5pbWF0aW9uICYmIGFuaW1hdGlvbi5sYWJlbHMgJiYgKHN0YXJ0IHx8IHNlbGYucmVmcmVzaCgpIHx8IHN0YXJ0KSArIGFuaW1hdGlvbi5sYWJlbHNbbGFiZWxdIC8gYW5pbWF0aW9uLmR1cmF0aW9uKCkgKiBjaGFuZ2UgfHwgMDtcbiAgICB9O1xuXG4gICAgc2VsZi5nZXRUcmFpbGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2Y
8110XIgaSA9IF90cmlnZ2Vycy5pbmRleE9mKHNlbGYpLFxuICAgICAgICAgIGEgPSBzZWxmLmRpcmVjdGlvbiA+IDAgPyBfdHJpZ2dlcnMuc2xpY2UoMCwgaSkucmV2ZXJzZSgpIDogX3RyaWdnZXJzLnNsaWNlKGkgKyAxKTtcblxuICAgICAgcmV0dXJuIChfaXNTdHJpbmcobmFtZSkgPyBhLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC52YXJzLnByZXZlbnRPdmVybGFwcyA9PT0gbmFtZTtcbiAgICAgIH0pIDogYSkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBzZWxmLmRpcmVjdGlvbiA+IDAgPyB0LmVuZCA8PSBzdGFydCA6IHQuc3RhcnQgPj0gZW5kO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNlbGYudXBkYXRlID0gZnVuY3Rpb24gKHJlc2V0LCByZWNvcmRWZWxvY2l0eSwgZm9yY2VGYWtlKSB7XG4gICAgICBpZiAoY29udGFpbmVyQW5pbWF0aW9uICYmICFmb3JjZUZha2UgJiYgIXJlc2V0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNjcm9sbCA9IF9yZWZyZXNoaW5nQWxsID09PSB0cnVlID8gcHJldlNjcm9sbCA6IHNlbGYuc2Nyb2xsKCksXG4gICAgICAgICAgcCA9IHJlc2V0ID8gMCA6IChzY3JvbGwgLSBzdGFydCkgLyBjaGFuZ2UsXG4gICAgICAgICAgY2xpcHBlZCA9IHAgPCAwID8gMCA6IHAgPiAxID8gMSA6IHAgfHwgMCxcbiAgICAgICAgICBwcmV2UHJvZ3Jlc3MgPSBzZWxmLnByb2dyZXNzLFxuICAgICAgICAgIGlzQWN0aXZlLFxuICAgICAgICAgIHdhc0FjdGl2ZSxcbiAgICAgICAgICB0b2dnbGVTdGF0ZSxcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgc3RhdGVDaGFuZ2VkLFxuICAgICAgICAgIHRvZ2dsZWQsXG4gICAgICAgICAgaXNBdE1heCxcbiAgICAgICAgICBpc1Rha2luZ0FjdGlvbjtcblxuICAgICAgaWYgKHJlY29yZFZlbG9jaXR5KSB7XG4gICAgICAgIHNjcm9sbDIgPSBzY3JvbGwxO1xuICAgICAgICBzY3JvbGwxID0gY29udGFpbmVyQW5pbWF0aW9uID8gc2Nyb2xsRnVuYygpIDogc2Nyb2xsO1xuXG4gICAgICAgIGlmIChzbmFwKSB7XG4gICAgICAgICAgc25hcDIgPSBzbmFwMTtcbiAgICAgICAgICBzbmFwMSA9IGFuaW1hdGlvbiAmJiAhaXNUb2dnbGUgPyBhbmltYXRpb24udG90YWxQcm9ncmVzcygpIDogY2xpcHBlZDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBhbnRpY2lwYXRlIHRoZSBwaW5uaW5nIGEgZmV3IHRpY2tzIGFoZWFkIG9mIHRpbWUgYmFzZWQgb24gdmVsb2NpdHkgdG8gYXZvaWQgYSB2aXN1YWwgZ2xpdGNoIGR1ZSB0byB0aGUgZmFjdCB0aGF0IG1vc3QgYnJvd3NlcnMgZG8gc2Nyb2xsaW5nIG9uIGEgc2VwYXJhdGUgdGhyZWFkIChub3Qgc3luY2VkIHdpdGggcmVxdWVzdEFuaW1hdGlvbkZyYW1lKS5cblxuXG4gICAgICBpZiAoYW50aWNpcGF0ZVBpbiAmJiBwaW4gJiYgIV9yZWZyZXNoaW5nICYmICFfc3RhcnR1cCAmJiBfbGFzdFNjcm9sbFRpbWUpIHtcbiAgICAgICAgaWYgKCFjbGlwcGVkICYmIHN0YXJ0IDwgc2Nyb2xsICsgKHNjcm9sbCAtIHNjcm9sbDIpIC8gKF9nZXRUaW1lKCkgLSBfdGltZTIpICogYW50aWNpcGF0ZVBpbikge1xuICAgICAgICAgIGNsaXBwZWQgPSAwLjAwMDE7XG4gICAgICAgIH0gZWxzZSBpZiAoY2xpcHBlZCA9PT0gMSAmJiBlbmQgPiBzY3JvbGwgKyAoc2Nyb2xsIC0gc2Nyb2xsMikgLyAoX2dldFRpbWUoKSAtIF90aW1lMikgKiBhbnRpY2lwYXRlUGluKSB7XG4gICAgICAgICAgY2xpcHBlZCA9IDAuOTk5OTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2xpcHBlZCAhPT0gcHJldlByb2dyZXNzICYmIHNlbGYuZW5hYmxlZCkge1xuICAgICAgICBpc0FjdGl2ZSA9IHNlbGYuaXNBY3RpdmUgPSAhIWNsaXBwZWQgJiYgY2xpcHBlZCA8IDE7XG4gICAgICAgIHdhc0FjdGl2ZSA9ICEhcHJldlByb2dyZXNzICYmIHByZXZQcm9ncmVzcyA8IDE7XG4gICAgICAgIHRvZ2dsZWQgPSBpc0FjdGl2ZSAhPT0gd2FzQWN0aXZlO1xuICAgICAgICBzdGF0ZUNoYW5nZWQgPSB0b2dnbGVkIHx8ICEhY2xpcHBlZCAhPT0gISFwcmV2UHJvZ3Jlc3M7IC8vIGNvdWxkIGdvIGZyb20gc3RhcnQgYWxsIHRoZSB3YXkgdG8gZW5kLCB0aHVzIGl0IGRpZG4ndCB0b2dnbGUgYnV0IGl0IGRpZCBjaGFuZ2Ugc3RhdGUgaW4gYSBzZW5zZSAobWF5IG5lZWQgdG8gZmlyZSBhIGNhbGxiYWNrKVxuXG4gICAgICAgIHNlbGYuZGlyZWN0aW9uID0gY2xpcHBlZCA+IHByZXZQcm9ncmVzcyA/IDEgOiAtMTtcbiAgICAgICAgc2VsZi5wcm9ncmVzcyA9IGNsaXBwZWQ7XG5cbiAgICAgICAgaWYgKHN0YXRlQ2hhbmdlZCAmJiAhX3JlZnJlc2hpbmcpIHtcbiAgICAgICAgICB0b2dnbGVTdGF0ZSA9IGNsaXBwZWQgJiYgIXByZXZQcm9ncmVzcyA/IDAgOiBjbGlwcGVkID09PSAxID8gMSA6IHByZXZQcm9ncmVzcyA9PT0gMSA/IDIgOiAzOyAvLyAwID0gZW50ZXIsIDEgPSBsZWF2ZSwgMiA9IGVudGVyQmFjaywgMyA9IGxlYXZlQmFjayAod2UgcHJpb3JpdGl6ZSB0aGUgRklSU1QgZW5jb3VudGVyLCB0aHVzIGlmIHlvdSBzY3JvbGwgcmVhbGx5IGZhc3QgcGFzdCB0aGUgb25FbnRlciBhbmQgb25MZWF2ZSBpbiBvbmUgdGljaywgaXQnZCBwcmlvcml0aXplIG9uRW50ZXIuXG5cbiAgICAgICAgICBpZiAoaXNUb2dnbGUpIHtcbiAgICAgICAgICAgIGFjdGlvbiA9ICF0b2dnbGVkICYmIHRvZ2dsZUFjdGlvbnNbdG9nZ2xlU3RhdGUgKyAxXSAhPT0gXCJub25lXCIgJiYgdG9nZ2xlQWN0aW9uc1t0b2dnbGVTdGF0ZSArIDFdIHx8IHRvZ2dsZUFjdGlvbnNbdG9nZ2xlU3RhdGVdOyAvLyBpZiBpdCBkaWRuJ3QgdG9nZ2xlLCB0aGF0IG1lYW5zIGl0IHNob3QgcmlnaHQgcGFzdCBhbmQgc2luY2Ugd2UgcHJpb3JpdGl6ZSB0aGUgXCJlbnRlclwiIGFjdGlvbiwgd2Ugc2hvdWxkIHN3aXRjaCB0byB0aGUgXCJsZWF2ZVwiIGluIHRoaXMgY2FzZSAoYnV0IG9ubHkgaWYgb25lIGlzIGRlZmluZWQpXG5cbiAgICAgICAgICAgIGlzVGFraW5nQWN0aW9uID0gYW5pbWF0aW9uICYmIChhY3Rpb24gPT09IFwiY29tcGxldGVcIiB8fCBhY3Rpb24gPT09IFwicmVzZXRcIiB8fCBhY3Rpb24gaW4gYW5pbWF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgI
8110H1cblxuICAgICAgICBwcmV2ZW50T3ZlcmxhcHMgJiYgKHRvZ2dsZWQgfHwgaXNUYWtpbmdBY3Rpb24pICYmIChpc1Rha2luZ0FjdGlvbiB8fCBzY3J1YiB8fCAhYW5pbWF0aW9uKSAmJiAoX2lzRnVuY3Rpb24ocHJldmVudE92ZXJsYXBzKSA/IHByZXZlbnRPdmVybGFwcyhzZWxmKSA6IHNlbGYuZ2V0VHJhaWxpbmcocHJldmVudE92ZXJsYXBzKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQuZW5kQW5pbWF0aW9uKCk7XG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoIWlzVG9nZ2xlKSB7XG4gICAgICAgICAgaWYgKHNjcnViVHdlZW4gJiYgIV9yZWZyZXNoaW5nICYmICFfc3RhcnR1cCkge1xuICAgICAgICAgICAgc2NydWJUd2Vlbi5fZHAuX3RpbWUgLSBzY3J1YlR3ZWVuLl9zdGFydCAhPT0gc2NydWJUd2Vlbi5fdGltZSAmJiBzY3J1YlR3ZWVuLnJlbmRlcihzY3J1YlR3ZWVuLl9kcC5fdGltZSAtIHNjcnViVHdlZW4uX3N0YXJ0KTsgLy8gaWYgdGhlcmUncyBhIHNjcnViIG9uIGJvdGggdGhlIGNvbnRhaW5lciBhbmltYXRpb24gYW5kIHRoaXMgb25lIChvciBhIFNjcm9sbFNtb290aGVyKSwgdGhlIHVwZGF0ZSBvcmRlciB3b3VsZCBjYXVzZSB0aGlzIG9uZSBub3QgdG8gaGF2ZSByZW5kZXJlZCB5ZXQsIHNvIGl0IHdvdWxkbid0IG1ha2UgYW55IHByb2dyZXNzIGJlZm9yZSB3ZSAucmVzdGFydCgpIGl0IGhlYWRpbmcgdG93YXJkIHRoZSBuZXcgcHJvZ3Jlc3Mgc28gaXQnZCBhcHBlYXIgc3R1Y2sgdGh1cyB3ZSBmb3JjZSBhIHJlbmRlciBoZXJlLlxuXG4gICAgICAgICAgICBpZiAoc2NydWJUd2Vlbi5yZXNldFRvKSB7XG4gICAgICAgICAgICAgIHNjcnViVHdlZW4ucmVzZXRUbyhcInRvdGFsUHJvZ3Jlc3NcIiwgY2xpcHBlZCwgYW5pbWF0aW9uLl90VGltZSAvIGFuaW1hdGlvbi5fdER1cik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydCAoY291cnRlc3kpLCBiZWZvcmUgMy4xMC4wXG4gICAgICAgICAgICAgIHNjcnViVHdlZW4udmFycy50b3RhbFByb2dyZXNzID0gY2xpcHBlZDtcbiAgICAgICAgICAgICAgc2NydWJUd2Vlbi5pbnZhbGlkYXRlKCkucmVzdGFydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBhbmltYXRpb24udG90YWxQcm9ncmVzcyhjbGlwcGVkLCAhIShfcmVmcmVzaGluZyAmJiAobGFzdFJlZnJlc2ggfHwgcmVzZXQpKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBpbikge1xuICAgICAgICAgIHJlc2V0ICYmIHBpblNwYWNpbmcgJiYgKHNwYWNlci5zdHlsZVtwaW5TcGFjaW5nICsgZGlyZWN0aW9uLm9zMl0gPSBzcGFjaW5nU3RhcnQpO1xuXG4gICAgICAgICAgaWYgKCF1c2VGaXhlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBwaW5TZXR0ZXIoX3JvdW5kKHBpblN0YXJ0ICsgcGluQ2hhbmdlICogY2xpcHBlZCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgICBpc0F0TWF4ID0gIXJlc2V0ICYmIGNsaXBwZWQgPiBwcmV2UHJvZ3Jlc3MgJiYgZW5kICsgMSA+IHNjcm9sbCAmJiBzY3JvbGwgKyAxID49IF9tYXhTY3JvbGwoc2Nyb2xsZXIsIGRpcmVjdGlvbik7IC8vIGlmIGl0J3MgYXQgdGhlIFZFUlkgZW5kIG9mIHRoZSBwYWdlLCBkb24ndCBzd2l0Y2ggYXdheSBmcm9tIHBvc2l0aW9uOiBmaXhlZCBiZWNhdXNlIGl0J3MgcG9pbnRsZXNzIGFuZCBpdCBjb3VsZCBjYXVzZSBhIGJyaWVmIGZsYXNoIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyBiYWNrIHVwICh3aGVuIGl0IGdldHMgcGlubmVkIGFnYWluKVxuXG4gICAgICAgICAgICBpZiAocGluUmVwYXJlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKCFyZXNldCAmJiAoaXNBY3RpdmUgfHwgaXNBdE1heCkpIHtcbiAgICAgICAgICAgICAgICB2Y
8110XIgYm91bmRzID0gX2dldEJvdW5kcyhwaW4sIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBfb2Zmc2V0ID0gc2Nyb2xsIC0gc3RhcnQ7XG5cbiAgICAgICAgICAgICAgICBfcmVwYXJlbnQocGluLCBfYm9keSwgYm91bmRzLnRvcCArIChkaXJlY3Rpb24gPT09IF92ZXJ0aWNhbCA/IF9vZmZzZXQgOiAwKSArIF9weCwgYm91bmRzLmxlZnQgKyAoZGlyZWN0aW9uID09PSBfdmVydGljYWwgPyAwIDogX29mZnNldCkgKyBfcHgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF9yZXBhcmVudChwaW4sIHNwYWNlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3NldFN0YXRlKGlzQWN0aXZlIHx8IGlzQXRNYXggPyBwaW5BY3RpdmVTdGF0ZSA6IHBpblN0YXRlKTtcblxuICAgICAgICAgICAgcGluTW92ZXMgJiYgY2xpcHBlZCA8IDEgJiYgaXNBY3RpdmUgfHwgcGluU2V0dGVyKHBpblN0YXJ0ICsgKGNsaXBwZWQgPT09IDEgJiYgIWlzQXRNYXggPyBwaW5DaGFuZ2UgOiAwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc25hcCAmJiAhdHdlZW5Uby50d2VlbiAmJiAhX3JlZnJlc2hpbmcgJiYgIV9zdGFydHVwICYmIHNuYXBEZWxheWVkQ2FsbC5yZXN0YXJ0KHRydWUpO1xuICAgICAgICB0b2dnbGVDbGFzcyAmJiAodG9nZ2xlZCB8fCBvbmNlICYmIGNsaXBwZWQgJiYgKGNsaXBwZWQgPCAxIHx8ICFfbGltaXRDYWxsYmFja3MpKSAmJiBfdG9BcnJheSh0b2dnbGVDbGFzcy50YXJnZXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5jbGFzc0xpc3RbaXNBY3RpdmUgfHwgb25jZSA/IFwiYWRkXCIgOiBcInJlbW92ZVwiXSh0b2dnbGVDbGFzcy5jbGFzc05hbWUpO1xuICAgICAgICB9KTsgLy8gY2xhc3NlcyBjb3VsZCBhZmZlY3QgcG9zaXRpb25pbmcsIHNvIGRvIGl0IGV2ZW4gaWYgcmVzZXQgb3IgcmVmcmVzaGluZyBpcyB0cnVlLlxuXG4gICAgICAgIG9uVXBkYXRlICYmICFpc1RvZ2dsZSAmJiAhcmVzZXQgJiYgb25VcGRhdGUoc2VsZik7XG5cbiAgICAgICAgaWYgKHN0YXRlQ2hhbmdlZCAmJiAhX3JlZnJlc2hpbmcpIHtcbiAgICAgICAgICBpZiAoaXNUb2dnbGUpIHtcbiAgICAgICAgICAgIGlmIChpc1Rha2luZ0FjdGlvbikge1xuICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSBcImNvbXBsZXRlXCIpIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24ucGF1c2UoKS50b3RhbFByb2dyZXNzKDEpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gXCJyZXNldFwiKSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uLnJlc3RhcnQodHJ1ZSkucGF1c2UoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09IFwicmVzdGFydFwiKSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uLnJlc3RhcnQodHJ1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uW2FjdGlvbl0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvblVwZGF0ZSAmJiBvblVwZGF0ZShzZWxmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodG9nZ2xlZCB8fCAhX2xpbWl0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAvLyBvbiBzdGFydHVwLCB0aGUgcGFnZSBjb3VsZCBiZSBzY3JvbGxlZCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBmaXJlIGNhbGxiYWNrcyB0aGF0IGRpZG4ndCB0b2dnbGUuIEZvciBleGFtcGxlIG9uRW50ZXIgc2hvdWxkbid0IGZpcmUgaWYgdGhlIFNjcm9sbFRyaWdnZXIgaXNuJ3QgYWN0dWFsbHkgZW50ZXJlZC5cbiAgICAgICAgICAgIG9uVG9nZ2xlICYmIHRvZ2dsZWQgJiYgX2NhbGxiYWNrKHNlbGYsIG9uVG9nZ2xlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrc1t0b2dnbGVTdGF0ZV0gJiYgX2NhbGxiYWNrKHNlbGYsIGNhbGxiYWNrc1t0b2dnbGVTdGF0ZV0pO1xuICAgICAgICAgICAgb25jZSAmJiAoY2xpcHBlZCA9PT0gMSA/IHNlbGYua2lsbChmYWxzZSwgMSkgOiBjYWxsYmFja3NbdG9nZ2xlU3RhdGVdID0gMCk7IC8vIGEgY2FsbGJhY2sgc2hvdWxkbid0IGJlIGNhbGxlZCBhZ2FpbiBpZiBvbmNlIGlzIHRydWUuXG5cbiAgICAgICAgICAgIGlmICghdG9nZ2xlZCkge1xuICAgICAgICAgICAgICAvLyBpdCdzIHBvc3NpYmxlIHRvIGdvIGNvbXBsZXRlbHkgcGFzdCwgbGlrZSBmcm9tIGJlZm9yZSB0aGUgc3RhcnQgdG8gYWZ0ZXIgdGhlIGVuZCAob3IgdmljZS12ZXJzYSkgaW4gd2hpY2ggY2FzZSBCT1RIIGNhbGxiYWNrcyBzaG91bGQgYmUgZmlyZWQgaW4gdGhhdCBvcmRlclxuICAgICAgICAgICAgICB0b2dnbGVTdGF0ZSA9IGNsaXBwZWQgPT09IDEgPyAxIDogMztcbiAgICAgICAgICAgICAgY2FsbGJhY2tzW3RvZ2dsZVN0YXRlXSAmJiBfY2FsbGJhY2soc2VsZiwgY2FsbGJhY2tzW3RvZ2dsZVN0YXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZhc3RTY3JvbGxFbmQgJiYgIWlzQWN0aXZlICYmIE1hdGguYWJzKHNlbGYuZ2V0VmVsb2NpdHkoKSkgPiAoX2lzTnVtYmVyKGZhc3RTY3JvbGxFbmQpID8gZmFzdFNjcm9sbEVuZCA6IDI1MDApKSB7XG4gICAgICAgICAgICBfZW5kQW5pbWF0aW9uKHNlbGYuY2FsbGJhY2tBbmltYXRpb24pO1xuXG4gICAgICAgICAgICBzY3J1YlR3ZWVuID8gc2NydWJUd2Vlbi5wcm9ncmVzcygxKSA6IF9lbmRBbmltYXRpb24oYW5pbWF0aW9uLCBhY3Rpb24gPT09IFwicmV2ZXJzZVwiID8gMSA6ICFjbGlwcGVkLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNUb2dnbGUgJiYgb25VcGRhdGUgJiYgIV9yZWZyZXNoaW5nKSB7XG4gICAgICAgICAgb25VcGRhdGUoc2VsZik7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gdXBkYXRlIGFic29sdXRlbHktcG9zaXRpb25lZCBtYXJrZXJzIChvbmx5IGlmIHRoZSBzY3JvbGxlciBpc24ndCB0aGUgdmlld3BvcnQpXG5cblxuICAgICAgaWYgKG1hcmtlckVuZFNldHRlcikge1xuICAgICAgICB2Y
8110XIgbiA9IGNvbnRhaW5lckFuaW1hdGlvbiA/IHNjcm9sbCAvIGNvbnRhaW5lckFuaW1hdGlvbi5kdXJhdGlvbigpICogKGNvbnRhaW5lckFuaW1hdGlvbi5fY2FTY3JvbGxEaXN0IHx8IDApIDogc2Nyb2xsO1xuICAgICAgICBtYXJrZXJTdGFydFNldHRlcihuICsgKG1hcmtlclN0YXJ0VHJpZ2dlci5faXNGbGlwcGVkID8gMSA6IDApKTtcbiAgICAgICAgbWFya2VyRW5kU2V0dGVyKG4pO1xuICAgICAgfVxuXG4gICAgICBjYU1hcmtlclNldHRlciAmJiBjYU1hcmtlclNldHRlcigtc2Nyb2xsIC8gY29udGFpbmVyQW5pbWF0aW9uLmR1cmF0aW9uKCkgKiAoY29udGFpbmVyQW5pbWF0aW9uLl9jYVNjcm9sbERpc3QgfHwgMCkpO1xuICAgIH07XG5cbiAgICBzZWxmLmVuYWJsZSA9IGZ1bmN0aW9uIChyZXNldCwgcmVmcmVzaCkge1xuICAgICAgaWYgKCFzZWxmLmVuYWJsZWQpIHtcbiAgICAgICAgc2VsZi5lbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICBfYWRkTGlzdGVuZXIoc2Nyb2xsZXIsIFwicmVzaXplXCIsIF9vblJlc2l6ZSk7XG5cbiAgICAgICAgaXNWaWV3cG9ydCB8fCBfYWRkTGlzdGVuZXIoc2Nyb2xsZXIsIFwic2Nyb2xsXCIsIF9vblNjcm9sbCk7XG4gICAgICAgIG9uUmVmcmVzaEluaXQgJiYgX2FkZExpc3RlbmVyKFNjcm9sbFRyaWdnZXIsIFwicmVmcmVzaEluaXRcIiwgb25SZWZyZXNoSW5pdCk7XG5cbiAgICAgICAgaWYgKHJlc2V0ICE9PSBmYWxzZSkge1xuICAgICAgICAgIHNlbGYucHJvZ3Jlc3MgPSBwcmV2UHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgIHNjcm9sbDEgPSBzY3JvbGwyID0gbGFzdFNuYXAgPSBzY3JvbGxGdW5jKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZWZyZXNoICE9PSBmYWxzZSAmJiBzZWxmLnJlZnJlc2goKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2VsZi5nZXRUd2VlbiA9IGZ1bmN0aW9uIChzbmFwKSB7XG4gICAgICByZXR1cm4gc25hcCAmJiB0d2VlblRvID8gdHdlZW5Uby50d2VlbiA6IHNjcnViVHdlZW47XG4gICAgfTtcblxuICAgIHNlbGYuc2V0UG9zaXRpb25zID0gZnVuY3Rpb24gKG5ld1N0YXJ0LCBuZXdFbmQsIGtlZXBDbGFtcCwgcGluT2Zmc2V0KSB7XG4gICAgICAvLyBkb2Vzbid0IHBlcnNpc3QgYWZ0ZXIgcmVmcmVzaCgpISBJbnRlbmRlZCB0byBiZSBhIHdheSB0byBvdmVycmlkZSB2YWx1ZXMgdGhhdCB3ZXJlIHNldCBkdXJpbmcgcmVmcmVzaCgpLCBsaWtlIHlvdSBjb3VsZCBzZXQgaXQgaW4gb25SZWZyZXNoKClcbiAgICAgIGlmIChjb250YWluZXJBbmltYXRpb24pIHtcbiAgICAgICAgLy8gY29udmVydCByYXRpb3MgaW50byBzY3JvbGwgcG9zaXRpb25zLiBSZW1lbWJlciwgc3RhcnQvZW5kIHZhbHVlcyBvbiBTY3JvbGxUcmlnZ2VycyB0aGF0IGhhdmUgYSBjb250YWluZXJBbmltYXRpb24gcmVmZXIgdG8gdGhlIHRpbWUgKGluIHNlY29uZHMpLCBOT1Qgc2Nyb2xsIHBvc2l0aW9ucy5cbiAgICAgICAgdmFyIHN0ID0gY29udGFpbmVyQW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIsXG4gICAgICAgICAgICBkdXJhdGlvbiA9IGNvbnRhaW5lckFuaW1hdGlvbi5kdXJhdGlvbigpLFxuICAgICAgICAgICAgX2NoYW5nZSA9IHN0LmVuZCAtIHN0LnN0YXJ0O1xuXG4gICAgICAgIG5ld1N0YXJ0ID0gc3Quc3RhcnQgKyBfY2hhbmdlICogbmV3U3RhcnQgLyBkdXJhdGlvbjtcbiAgICAgICAgbmV3RW5kID0gc3Quc3RhcnQgKyBfY2hhbmdlICogbmV3RW5kIC8gZHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIHNlbGYucmVmcmVzaChmYWxzZSwgZmFsc2UsIHtcbiAgICAgICAgc3RhcnQ6IF9rZWVwQ2xhbXAobmV3U3RhcnQsIGtlZXBDbGFtcCAmJiAhIXNlbGYuX3N0YXJ0Q2xhbXApLFxuICAgICAgICBlbmQ6IF9rZWVwQ2xhbXAobmV3RW5kLCBrZWVwQ2xhbXAgJiYgISFzZWxmLl9lbmRDbGFtcClcbiAgICAgIH0sIHBpbk9mZnNldCk7XG4gICAgICBzZWxmLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBzZWxmLmFkanVzdFBpblNwYWNpbmcgPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICBpZiAoc3BhY2VyU3RhdGUgJiYgYW1vdW50KSB7XG4gICAgICAgIHZhciBpID0gc3BhY2VyU3RhdGUuaW5kZXhPZihkaXJlY3Rpb24uZCkgKyAxO1xuICAgICAgICBzcGFjZXJTdGF0ZVtpXSA9IHBhcnNlRmxvYXQoc3BhY2VyU3RhdGVbaV0pICsgYW1vdW50ICsgX3B4O1xuICAgICAgICBzcGFjZXJTdGF0ZVsxXSA9IHBhcnNlRmxvYXQoc3BhY2VyU3RhdGVbMV0pICsgYW1vdW50ICsgX3B4O1xuXG4gICAgICAgIF9zZXRTdGF0ZShzcGFjZXJTdGF0ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNlbGYuZGlzYWJsZSA9IGZ1bmN0aW9uIChyZXNldCwgYWxsb3dBbmltYXRpb24pIHtcbiAgICAgIHJlc2V0ICE9PSBmYWxzZSAmJiBzZWxmLnJldmVydCh0cnVlLCB0cnVlKTtcblxuICAgICAgaWYgKHNlbGYuZW5hYmxlZCkge1xuICAgICAgICBzZWxmLmVuYWJsZWQgPSBzZWxmLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGFsbG93QW5pbWF0aW9uIHx8IHNjcnViVHdlZW4gJiYgc2NydWJUd2Vlbi5wYXVzZSgpO1xuICAgICAgICBwcmV2U2Nyb2xsID0gMDtcbiAgICAgICAgcGluQ2FjaGUgJiYgKHBpbkNhY2hlLnVuY2FjaGUgPSAxKTtcbiAgICAgICAgb25SZWZyZXNoSW5pdCAmJiBfcmVtb3ZlTGlzdGVuZXIoU2Nyb2xsVHJpZ2dlciwgXCJyZWZyZXNoSW5pdFwiLCBvblJlZnJlc2hJbml0KTtcblxuICAgICAgICBpZiAoc25hcERlbGF5ZWRDYWxsKSB7XG4gICAgICAgICAgc25hcERlbGF5ZWRDYWxsLnBhdXNlKCk7XG4gICAgICAgICAgdHdlZW5Uby50d2VlbiAmJiB0d2VlblRvLnR3ZWVuLmtpbGwoKSAmJiAodHdlZW5Uby50d2VlbiA9IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZpZXdwb3J0KSB7XG4gICAgICAgICAgdmFyIGkgPSBfdHJpZ2dlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgaWYgKF90cmlnZ2Vyc1tpXS5zY3JvbGxlciA9PT0gc2Nyb2xsZXIgJiYgX3RyaWdnZXJzW2ldICE9PSBzZWxmKSB7XG4gICAgICAgICAgICAgIHJldHVybjsgLy9kb24ndCByZW1vdmUgdGhlIGxpc3RlbmVycyBpZiB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdHJpZ2dlcnMgcmVmZXJlbmNpbmcgaXQuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3JlbW92ZUxpc3RlbmVyKHNjcm9sbGVyLCBcInJlc2l6ZVwiLCBfb25S
8110ZXNpemUpO1xuXG4gICAgICAgICAgaXNWaWV3cG9ydCB8fCBfcmVtb3ZlTGlzdGVuZXIoc2Nyb2xsZXIsIFwic2Nyb2xsXCIsIF9vblNjcm9sbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2VsZi5raWxsID0gZnVuY3Rpb24gKHJldmVydCwgYWxsb3dBbmltYXRpb24pIHtcbiAgICAgIHNlbGYuZGlzYWJsZShyZXZlcnQsIGFsbG93QW5pbWF0aW9uKTtcbiAgICAgIHNjcnViVHdlZW4gJiYgIWFsbG93QW5pbWF0aW9uICYmIHNjcnViVHdlZW4ua2lsbCgpO1xuICAgICAgaWQgJiYgZGVsZXRlIF9pZHNbaWRdO1xuXG4gICAgICB2YXIgaSA9IF90cmlnZ2Vycy5pbmRleE9mKHNlbGYpO1xuXG4gICAgICBpID49IDAgJiYgX3RyaWdnZXJzLnNwbGljZShpLCAxKTtcbiAgICAgIGkgPT09IF9pICYmIF9kaXJlY3Rpb24gPiAwICYmIF9pLS07IC8vIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSByZWZyZXNoKCkgb3IgdXBkYXRlKCksIHNwbGljaW5nIHdvdWxkIGNhdXNlIHNraXBzIGluIHRoZSBpbmRleCwgc28gYWRqdXN0Li4uXG4gICAgICAvLyBpZiBubyBvdGhlciBTY3JvbGxUcmlnZ2VyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzY3JvbGxlciBhcmUgZm91bmQsIHdpcGUgb3V0IGFueSByZWNvcmRlZCBzY3JvbGwgcG9zaXRpb24uIE90aGVyd2lzZSwgaW4gYSBzaW5nbGUgcGFnZSBhcHBsaWNhdGlvbiwgZm9yIGV4YW1wbGUsIGl0IGNvdWxkIG1haW50YWluIHNjcm9sbCBwb3NpdGlvbiB3aGVuIGl0IHJlYWxseSBzaG91bGRuJ3QuXG5cbiAgICAgIGkgPSAwO1xuXG4gICAgICBfdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5zY3JvbGxlciA9PT0gc2VsZi5zY3JvbGxlciAmJiAoaSA9IDEpO1xuICAgICAgfSk7XG5cbiAgICAgIGkgfHwgX3JlZnJlc2hpbmdBbGwgfHwgKHNlbGYuc2Nyb2xsLnJlYyA9IDApO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIGFuaW1hdGlvbi5zY3JvbGxUcmlnZ2VyID0gbnVsbDtcbiAgICAgICAgcmV2ZXJ0ICYmIGFuaW1hdGlvbi5yZXZlcnQoe1xuICAgICAgICAgIGtpbGw6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBhbGxvd0FuaW1hdGlvbiB8fCBhbmltYXRpb24ua2lsbCgpO1xuICAgICAgfVxuXG4gICAgICBtYXJrZXJTdGFydCAmJiBbbWFya2VyU3RhcnQsIG1hcmtlckVuZCwgbWFya2VyU3RhcnRUcmlnZ2VyLCBtYXJrZXJFbmRUcmlnZ2VyXS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIHJldHVybiBtLnBhcmVudE5vZGUgJiYgbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG0pO1xuICAgICAgfSk7XG4gICAgICBfcHJpbWFyeSA9PT0gc2VsZiAmJiAoX3ByaW1hcnkgPSAwKTtcblxuICAgICAgaWYgKHBpbikge1xuICAgICAgICBwaW5DYWNoZSAmJiAocGluQ2FjaGUudW5jYWNoZSA9IDEpO1xuICAgICAgICBpID0gMDtcblxuICAgICAgICBfdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0LnBpbiA9PT0gcGluICYmIGkrKztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaSB8fCAocGluQ2FjaGUuc3BhY2VyID0gMCk7IC8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgbW9yZSBTY3JvbGxUcmlnZ2VycyB3aXRoIHRoZSBzYW1lIHBpbiwgcmVtb3ZlIHRoZSBzcGFjZXIsIG90aGVyd2lzZSBpdCBjb3VsZCBiZSBjb250YW1pbmF0ZWQgd2l0aCBvbGQvc3RhbGUgdmFsdWVzIGlmIHRoZSB1c2VyIHJlLWNyZWF0ZXMgYSBTY3JvbGxUcmlnZ2VyIGZvciB0aGUgc2FtZSBlbGVtZW50LlxuICAgICAgfVxuXG4gICAgICB2Y
8110XJzLm9uS2lsbCAmJiB2YXJzLm9uS2lsbChzZWxmKTtcbiAgICB9O1xuXG4gICAgX3RyaWdnZXJzLnB1c2goc2VsZik7XG5cbiAgICBzZWxmLmVuYWJsZShmYWxzZSwgZmFsc2UpO1xuICAgIGN1c3RvbVJldmVydFJldHVybiAmJiBjdXN0b21SZXZlcnRSZXR1cm4oc2VsZik7XG5cbiAgICBpZiAoYW5pbWF0aW9uICYmIGFuaW1hdGlvbi5hZGQgJiYgIWNoYW5nZSkge1xuICAgICAgLy8gaWYgdGhlIGFuaW1hdGlvbiBpcyBhIHRpbWVsaW5lLCBpdCBtYXkgbm90IGhhdmUgYmVlbiBwb3B1bGF0ZWQgeWV0LCBzbyBpdCB3b3VsZG4ndCByZW5kZXIgYXQgdGhlIHByb3BlciBwbGFjZSBvbiB0aGUgZmlyc3QgcmVmcmVzaCgpLCB0aHVzIHdlIHNob3VsZCBzY2hlZHVsZSBvbmUgZm9yIHRoZSBuZXh0IHRpY2suIElmIFwiY2hhbmdlXCIgaXMgZGVmaW5lZCwgd2Uga25vdyBpdCBtdXN0IGJlIHJlLWVuYWJsaW5nLCB0aHVzIHdlIGNhbiByZWZyZXNoKCkgcmlnaHQgYXdheS5cbiAgICAgIHZhciB1cGRhdGVGdW5jID0gc2VsZi51cGRhdGU7IC8vIHNvbWUgYnJvd3NlcnMgbWF5IGZpcmUgYSBzY3JvbGwgZXZlbnQgQkVGT1JFIGEgdGljayBlbGFwc2VzIGFuZC9vciB0aGUgRE9NQ29udGVudExvYWRlZCBmaXJlcy4gU28gdGhlcmUncyBhIGNoYW5jZSB1cGRhdGUoKSB3aWxsIGJlIGNhbGxlZCBCRUZPUkUgYSByZWZyZXNoKCkgaGFzIGhhcHBlbmVkIG9uIGEgVGltZWxpbmUtYXR0YWNoZWQgU2Nyb2xsVHJpZ2dlciB3aGljaCBtZWFucyB0aGUgc3RhcnQvZW5kIHdvbid0IGJlIGNhbGN1bGF0ZWQgeWV0LiBXZSBkb24ndCB3YW50IHRvIGFkZCBjb25kaXRpb25hbCBsb2dpYyBpbnNpZGUgdGhlIHVwZGF0ZSgpIG1ldGhvZCAobGlrZSBjaGVjayB0byBzZWUgaWYgZW5kIGlzIGRlZmluZWQgYW5kIGlmIG5vdCwgZm9yY2UgYSByZWZyZXNoKCkpIGJlY2F1c2UgdGhhdCdzIGEgZnVuY3Rpb24gdGhhdCBnZXRzIGhpdCBh
8110IExPVCAocGVyZm9ybWFuY2UpLiBTbyB3ZSBzd2FwIG91dCB0aGUgcmVhbCB1cGRhdGUoKSBtZXRob2QgZm9yIHRoaXMgb25lIHRoYXQnbGwgcmUtYXR0YWNoIGl0IHRoZSBmaXJzdCB0aW1lIGl0IGdldHMgY2FsbGVkIGFuZCBvZiBjb3Vyc2UgZm9yY2VzIGEgcmVmcmVzaCgpLlxuXG4gICAgICBzZWxmLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi51cGRhdGUgPSB1cGRhdGVGdW5jO1xuICAgICAgICBfc2Nyb2xsZXJzLmNhY2hlKys7IC8vIG90aGVyd2lzZSBhIGNhY2hlZCBzY3JvbGwgcG9zaXRpb24gbWF5IGdldCB1c2VkIGluIHRoZSByZWZyZXNoKCkgaW4gYSB2ZXJ5IHJhcmUgc2NlbmFyaW8sIGxpa2UgaWYgU2Nyb2xsVHJpZ2dlcnMgYXJlIGNyZWF0ZWQgaW5zaWRlIGEgRE9NQ29udGVudExvYWRlZCBldmVudCBhbmQgdGhlIHF1ZXVlZCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKSBmaXJlcyBiZWZvcmVoYW5kLiBTZWUgaHR0cHM6Ly9nc2FwLmNvbS9jb21tdW5pdHkvZm9ydW1zL3RvcGljLzQxMjY3LXNjcm9sbHRyaWdnZXItYnJlYWtzLW9uLXJlZnJlc2gtd2hlbi11c2luZy1kb21jb250ZW50bG9hZGVkL1xuXG4gICAgICAgIHN0YXJ0IHx8IGVuZCB8fCBzZWxmLnJlZnJlc2goKTtcbiAgICAgIH07XG5cbiAgICAgIGdzYXAuZGVsYXllZENhbGwoMC4wMSwgc2VsZi51cGRhdGUpO1xuICAgICAgY2hhbmdlID0gMC4wMTtcbiAgICAgIHN0YXJ0ID0gZW5kID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcGluICYmIF9xdWV1ZVJlZnJlc2hBbGwoKTsgLy8gcGlubmluZyBjb3VsZCBhZmZlY3QgdGhlIHBvc2l0aW9ucyBvZiBvdGhlciB0aGluZ3MsIHNvIG1ha2Ugc3VyZSB3ZSBxdW
8110V1ZSBhIGZ1bGwgcmVmcmVzaCgpXG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKGNvcmUpIHtcbiAgICBpZiAoIV9jb3JlSW5pdHRlZCkge1xuICAgICAgZ3NhcCA9IGNvcmUgfHwgX2dldEdTQVAoKTtcbiAgICAgIF93aW5kb3dFeGlzdHMoKSAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgU2Nyb2xsVHJpZ2dlci5lbmFibGUoKTtcbiAgICAgIF9jb3JlSW5pdHRlZCA9IF9lbmFibGVkO1xuICAgIH1cblxuICAgIHJldHVybiBfY29yZUluaXR0ZWQ7XG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5kZWZhdWx0cyA9IGZ1bmN0aW9uIGRlZmF1bHRzKGNvbmZpZykge1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gY29uZmlnKSB7XG4gICAgICAgIF9kZWZhdWx0c1twXSA9IGNvbmZpZ1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2RlZmF1bHRzO1xuICB9O1xuXG4gIFNjcm9sbFRyaWdnZXIuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUocmVzZXQsIGtpbGwpIHtcbiAgICBfZW5hYmxlZCA9IDA7XG5cbiAgICBfdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgcmV0dXJuIHRyaWdnZXJba2lsbCA/IFwia2lsbFwiIDogXCJkaXNhYmxlXCJdKHJlc2V0KTtcbiAgICB9KTtcblxuICAgIF9yZW1vdmVMaXN0ZW5lcihfd2luLCBcIndoZWVsXCIsIF9vblNjcm9sbCk7XG5cbiAgICBfcmVtb3ZlTGlzdGVuZXIoX2RvYywgXCJzY3JvbGxcIiwgX29uU2Nyb2xsKTtcblxuICAgIGNsZWFySW50ZXJ2YWwoX3N5bmNJbnRlcnZhbCk7XG5cbiAgICBfcmVtb3ZlTGlzdGVuZXIoX2RvYywgXCJ0b3VjaGNhbmNlbFwiLCBfcGFzc1Rocm91Z2gpO1xuXG4gICAgX3JlbW92ZUxpc3RlbmVyKF9ib2R5LCBcInRvdWNoc3RhcnRcIiwgX3Bhc3NUaHJvdWdoKTtcblxuICAgIF9tdWx0aUxpc3RlbmVyKF9yZW1vdmVMaXN0ZW5lciwgX2RvYywgXCJwb2ludGVyZG93bix0b3VjaHN0YXJ0LG1vdXNlZG93blwiLCBfcG9pbnRlckRvd25IYW5kbGVyKTtcblxuICAgIF9tdWx0aUxpc3RlbmVyKF9yZW1vdmVMaXN0ZW5lciwgX2RvYywgXCJwb2ludGVydXAsdG91Y2hlbmQsbW91c2V1cFwiLCBfcG9pbnRlclVwSGFuZGxlcik7XG5cbiAgICBfcmVzaXplRGVsYXkua2lsbCgpO1xuXG4gICAgX2l0ZXJhdGVBdXRvUmVmcmVzaChfcmVtb3ZlTGlzdGVuZXIpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfc2Nyb2xsZXJzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICBfd2hlZWxMaXN0ZW5lcihfcmVtb3ZlTGlzdGVuZXIsIF9zY3JvbGxlcnNbaV0sIF9zY3JvbGxlcnNbaSArIDFdKTtcblxuICAgICAgX3doZWVsTGlzdGVuZXIoX3JlbW92ZUxpc3RlbmVyLCBfc2Nyb2xsZXJzW2ldLCBfc2Nyb2xsZXJzW2kgKyAyXSk7XG4gICAgfVxuICB9O1xuXG4gIFNjcm9sbFRyaWdnZXIuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIF93aW4gPSB3aW5kb3c7XG4gICAgX2RvYyA9IGRvY3VtZW50O1xuICAgIF9kb2NFbCA9IF9kb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgIF9ib2R5ID0gX2RvYy5ib2R5O1xuXG4gICAgaWYgKGdzYXApIHtcbiAgICAgIF90b0FycmF5ID0gZ3NhcC51dGlscy50b0FycmF5O1xuICAgICAgX2NsYW1wID0gZ3NhcC51dGlscy5jbGFtcDtcbiAgICAgIF9jb250ZXh0ID0gZ3NhcC5jb3JlLmNvbnRleHQgfHwgX3Bhc3NUaHJvdWdoO1xuICAgICAgX3N1cHByZXNzT3ZlcndyaXRlcyA9IGdzYXAuY29yZS5zdXBwcmVzc092ZXJ3cml0ZXMgfHwgX3Bhc3NUaHJvdWdoO1xuICAgICAgX3Njcm9sbFJlc3RvcmF0aW9uID0gX3dpbi5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uIHx8IFwiYXV0b1wiO1xuICAgICAgX2xhc3RTY3JvbGwgPSBfd2luLnBhZ2VZT2Zmc2V0IHx8IDA7XG4gICAgICBnc2FwLmNvcmUuZ2xvYmFscyhcIlNjcm9sbFRyaWdnZXJcIiwgU2Nyb2xsVHJpZ2dlcik7IC8vIG11c3QgcmVnaXN0ZXIgdGhlIGdsb2JhbCBtYW51YWxseSBiZWNhdXNlIGluIEludGVybmV0IEV4cGxvcmVyLCBmdW5jdGlvbnMgKGNsYXNzZXMpIGRvbid0IGhhdmUgYSBcIm5hbWVcIiBwcm9wZXJ0eS5cblxuICAgICAgaWYgKF9ib2R5KSB7XG4gICAgICAgIF9lbmFibGVkID0gMTtcbiAgICAgICAgX2RpdjEwMHZoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTsgLy8gdG8gc29sdmUgbW9iaWxlIGJyb3dzZXIgYWRkcmVzcyBiYXIgc2hvdy9oaWRlIHJlc2l6aW5nLCB3ZSBzaG91bGRuJ3QgcmVseSBvbiB3aW5kb3cuaW5uZXJIZWlnaHQuIEluc3RlYWQsIHVzZSBhIDxkaXY+IHdpdGggaXRzIGhlaWdodCBzZXQgdG8gMTAwdmggYW5kIG1lYXN1cmUgdGhhdCBzaW5jZSB0aGF0J3Mgd2hhdCB0aGUgc2Nyb2xsaW5nIGlzIGJhc2VkIG9uIGFueXdheSBhbmQgaXQncyBub3QgYWZmZWN0ZWQgYnkgYWRkcmVzcyBiYXIgc2hvd2luZy9oaWRpbmcuXG5cbiAgICAgICAgX2RpdjEwMHZoLnN0eWxlLmhlaWdodCA9IFwiMTAwdmhcIjtcbiAgICAgICAgX2RpdjEwMHZoLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXG4gICAgICAgIF9yZWZyZXNoMTAwdmgoKTtcblxuICAgICAgICBfcmFmQnVnRml4KCk7XG5cbiAgICAgICAgT2JzZXJ2ZXIucmVnaXN0ZXIoZ3NhcCk7IC8vIGlzVG91Y2ggaXMgMCBpZiBubyB0b3VjaCwgMSBpZiBPTkxZIHRvdWNoLCBhbmQgMiBpZiBpdCBjYW4gYWNjb21tb2RhdGUgdG91Y2ggYnV0IGFsc28gb3RoZXIgdHlwZXMgbGlrZSBtb3VzZS9wb2ludGVyLlxuXG4gICAgICAgIFNjcm9sbFRyaWdnZXIuaXNUb3VjaCA9IE9ic2VydmVyLmlzVG91Y2g7XG4gICAgICAgIF9maXhJT1NCdWcgPSBPYnNlcnZlci5pc1RvdWNoICYmIC8oaVBhZHxpUGhvbmV8aVBvZHxNYWMpL2cudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsgLy8gc2luY2UgMjAxNywgaU9TIGhhcyBoYWQgYSBidWcgdGhhdCBjYXVzZXMgZXZlbnQuY2xpZW50WC9ZIHRvIGJlIGluYWNjdXJhdGUgd2hlbiBhIHNjcm9sbCBvY2N1cnMsIHRodXMgd2UgbXVzdCBhbHRlcm5hdGUgaWdub3JpbmcgZXZlcnkgb3RoZXIgdG91Y2htb3ZlIGV2ZW50IHRvIHdvcmsgYXJvdW5kIGl0LiBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE4MTk1NCBhbmQgaHR0cHM6Ly9jb2RlcGVuLmlvL0dyZWVuU29jay9wZW4vRXhiclBOYS8wODdjZWYxOTdkYzM1NDQ1YTA5NTFlODkzNWM0MTUwM1xuXG4gICAgICAgIF9pZ25vcmVNb2JpbGVSZXNpemUgPSBPYnNlcnZlci5pc1RvdWNoID09PSAxO1xuXG4gICAgICAgIF9hZGRMaXN0ZW5lcihfd2luLCBcIndoZWVsXCIsIF9vblNjcm9sbCk7IC8vIG1vc3RseSBmb3IgM3JkIHBhcnR5IHNtb290aCBzY3JvbGxpbmcgbGlicmFyaWVzLlxuXG5cbiAgICAgICAgX3Jvb3QgPSBbX3dpbiwgX2RvYywgX2RvY0VsLCBfYm9keV07XG5cbiAgICAgICAgaWYgKGdzYXAubWF0Y2hNZWRpYSkge1xuICAgICAgICAgIFNjcm9sbFRyaWdnZXIubWF0Y2hNZWRpYSA9IGZ1bmN0aW9uICh2YXJzKSB7XG4gICAgICAgICAgICB2Y
8110XIgbW0gPSBnc2FwLm1hdGNoTWVkaWEoKSxcbiAgICAgICAgICAgICAgICBwO1xuXG4gICAgICAgICAgICBmb3IgKHAgaW4gdmFycykge1xuICAgICAgICAgICAgICBtbS5hZGQocCwgdmFyc1twXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtbTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZ3NhcC5hZGRFdmVudExpc3RlbmVyKFwibWF0Y2hNZWRpYUluaXRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3JlY29yZFNjcm9sbFBvc2l0aW9ucygpO1xuXG4gICAgICAgICAgICBfcmV2ZXJ0QWxsKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZ3NhcC5hZGRFdmVudExpc3RlbmVyKFwibWF0Y2hNZWRpYVJldmVydFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3JldmVydFJlY29yZGVkKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZ3NhcC5hZGRFdmVudExpc3RlbmVyKFwibWF0Y2hNZWRpYVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfcmVmcmVzaEFsbCgwLCAxKTtcblxuICAgICAgICAgICAgX2Rpc3BhdGNoKFwibWF0Y2hNZWRpYVwiKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBnc2FwLm1hdGNoTWVkaWEoKS5hZGQoXCIob3JpZW50YXRpb246IHBvcnRyYWl0KVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyB3aGVuIG9yaWVudGF0aW9uIGNoYW5nZXMsIHdlIHNob3VsZCB0YWtlIG5ldyBiYXNlIG1lYXN1cmVtZW50cyBmb3IgdGhlIGlnbm9yZU1vYmlsZVJlc2l6ZSBmZWF0dXJlLlxuICAgICAgICAgICAgX3NldEJhc2VEaW1lbnNpb25zKCk7XG5cbiAgICAgICAgICAgIHJldHVybiBfc2V0QmFzZURpbWVuc2lvbnM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiUmVxdWlyZXMgR1NBUCAzLjExLjAgb3IgbGF0ZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBfc2V0QmFzZURpbWVuc2lvbnMoKTtcblxuICAgICAgICBfYWRkTGlzdGVuZXIoX2RvYywgXCJzY3JvbGxcIiwgX29uU2Nyb2xsKTsgLy8gc29tZSBicm93c2VycyAobGlrZSBDaHJvbWUpLCB0aGUgd2luZG93IHN0b3BzIGRpc3BhdGNoaW5nIHNjcm9sbCBldmVudHMgb24gdGhlIHdpbmRvdyBpZiB5b3Ugc2Nyb2xsIHJlYWxseSBmYXN0LCBidXQgaXQncyBjb25zaXN0ZW50IG9uIHRoZSBkb2N1bWVudCFcblxuXG4gICAgICAgIHZhciBib2R5SGFzU3R5bGUgPSBfYm9keS5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSxcbiAgICAgICAgICAgIGJvZHlTdHlsZSA9IF9ib2R5LnN0eWxlLFxuICAgICAgICAgICAgYm9yZGVyID0gYm9keVN0eWxlLmJvcmRlclRvcFN0eWxlLFxuICAgICAgICAgICAgQW5pbWF0aW9uUHJvdG8gPSBnc2FwLmNvcmUuQW5pbWF0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgICAgIGJvdW5kcyxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgQW5pbWF0aW9uUHJvdG8ucmV2ZXJ0IHx8IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBbmltYXRpb25Qcm90bywgXCJyZXZlcnRcIiwge1xuICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRpbWUoLTAuMDEsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChBbmltYXRpb24ucmV2ZXJ0KCkgd2FzIGFkZGVkIGFmdGVyIDMuMTAuNClcblxuICAgICAgICBib2R5U3R5bGUuYm9yZGVyVG9wU3R5bGUgPSBcInNvbGlkXCI7IC8vIHdvcmtzIGFyb3VuZCBhbiBpc3N1ZSB3aGVyZSBhIG1hcmdpbiBvZiBhIGNoaWxkIGVsZW1lbnQgY291bGQgdGhyb3cgb2ZmIHRoZSBib3VuZHMgb2YgdGhlIF9ib2R5LCBtYWtpbmcgaXQgc2VlbSBsaWtlIHRoZXJlJ3MgYSBtYXJnaW4gd2hlbiB0aGVyZSBhY3R1YWxseSBpc24ndC4gVGhlIGJvcmRlciBlbnN1cmVzIHRoYXQgdGhlIGJvdW5kcyBhcmUgYWNjdXJhdGUuXG5cbiAgICAgICAgYm91bmRzID0gX2dldEJvdW5kcyhfYm9keSk7XG4gICAgICAgIF92ZXJ0aWNhbC5tID0gTWF0aC5yb3VuZChib3VuZHMudG9wICsgX3ZlcnRpY2FsLnNjKCkpIHx8IDA7IC8vIGFjY29tbW9kYXRlIHRoZSBvZmZzZXQgb2YgdGhlIDxib2R5PiBjYXVzZWQgYnkgbWFyZ2lucyBhbmQvb3IgcGFkZGluZ1xuXG4gICAgICAgIF9ob3Jpem9udGFsLm0gPSBNYXRoLnJvdW5kKGJvdW5kcy5sZWZ0ICsgX2hvcml6b250YWwuc2MoKSkgfHwgMDtcbiAgICAgICAgYm9yZGVyID8gYm9keVN0eWxlLmJvcmRlclRvcFN0eWxlID0gYm9yZGVyIDogYm9keVN0eWxlLnJlbW92ZVByb3BlcnR5KFwiYm9yZGVyLXRvcC1zdHlsZVwiKTtcblxuICAgICAgICBpZiAoIWJvZHlIYXNTdHlsZSkge1xuICAgICAgICAgIC8vIFNTUiBmcmFtZXdvcmtzIGxpa2UgTmV4dC5qcyBjb21wbGFpbiBpZiB0aGlzIGF0dHJpYnV0ZSBnZXRzIGFkZGVkLlxuICAgICAgICAgIF9ib2R5LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiXCIpOyAvLyBpdCdzIG5vdCBlbm91Z2ggdG8ganVzdCByZW1vdmVBdHRyaWJ1dGUoKSAtIHdlIG11c3QgZmlyc3Qgc2V0IGl0IHRvIGVtcHR5LCBvdGhlcndpc2UgTmV4dC5qcyBjb21wbGFpbnMuXG5cblxuICAgICAgICAgIF9ib2R5LnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICB9IC8vIFRPRE86ICg/KSBtYXliZSBtb3ZlIHRvIGxldmVyYWdpbmcgdGhlIHZlbG9jaXR5IG1lY2hhbmlzbSBpbiBPYnNlcnZlciBhbmQgc2tpcCBpbnRlcnZhbHMuXG5cblxuICAgICAgICBfc3luY0ludGVydmFsID0gc2V0SW50ZXJ2YWwoX3N5bmMsIDI1MCk7XG4gICAgICAgIGdzYXAuZGVsYXllZENhbGwoMC41LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9zdGFydHVwID0gMDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX2FkZExpc3RlbmVyKF9kb2MsIFwidG91Y2hjYW5jZWxcIiwgX3Bhc3NUaHJvdWdoKTsgLy8gc29tZSBvbGRlciBBbmRyb2lkIGRldmljZXMgaW50ZXJtaXR0ZW50bHkgc3RvcCBkaXNwYXRjaGluZyBcInRvdWNobW92ZVwiIGV2ZW50cyBpZiB3ZSBkb24ndCBsaXN0ZW4gZm9yIFwidG91Y2hjYW5jZWxcIiBvbiB0aGUgZG9jdW1lbnQuXG5cblxuICAgICAgICBfYWRkTGlzdGVuZXIoX2JvZHksIFwidG91Y2hzdGFydFwiLCBfcGFzc1Rocm91Z2gpOyAvL3dvcmtzIGFyb3VuZCBTYWZhcmkgYnVnOiBodHRwczovL2dzYXAuY29tL2ZvcnVtcy90b3BpYy8yMTQ1MC1kcmFnZ2FibGUtaW4taWZyYW1lLW9uLW1vYmlsZS1pcy1idWdneS9cblxuXG4gICAgICAgIF9tdWx0aUxpc3RlbmVyKF9hZGRMaXN0ZW5lciwgX2RvYywgXCJwb2ludGVyZG93bix0b3VjaHN0YXJ0LG1vdXNlZG93blwiLCBfcG9pbnRlckRvd25IYW5kbGVyKTtcblxuICAgICAgICBfbXVsdGlMaXN0ZW5lcihfYWRkTGlzdGVuZXIsIF9kb2MsIFwicG9pbnRlcnVwLH
8110RvdWNoZW5kLG1vdXNldXBcIiwgX3BvaW50ZXJVcEhhbmRsZXIpO1xuXG4gICAgICAgIF90cmFuc2Zvcm1Qcm9wID0gZ3NhcC51dGlscy5jaGVja1ByZWZpeChcInRyYW5zZm9ybVwiKTtcblxuICAgICAgICBfc3RhdGVQcm9wcy5wdXNoKF90cmFuc2Zvcm1Qcm9wKTtcblxuICAgICAgICBfY29yZUluaXR0ZWQgPSBfZ2V0VGltZSgpO1xuICAgICAgICBfcmVzaXplRGVsYXkgPSBnc2FwLmRlbGF5ZWRDYWxsKDAuMiwgX3JlZnJlc2hBbGwpLnBhdXNlKCk7XG4gICAgICAgIF9hdXRvUmVmcmVzaCA9IFtfZG9jLCBcInZpc2liaWxpdHljaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciB3ID0gX3dpbi5pbm5lcldpZHRoLFxuICAgICAgICAgICAgICBoID0gX3dpbi5pbm5lckhlaWdodDtcblxuICAgICAgICAgIGlmIChfZG9jLmhpZGRlbikge1xuICAgICAgICAgICAgX3ByZXZXaWR0aCA9IHc7XG4gICAgICAgICAgICBfcHJldkhlaWdodCA9IGg7XG4gICAgICAgICAgfSBlbHNlIGlmIChfcHJldldpZHRoICE9PSB3IHx8IF9wcmV2SGVpZ2h0ICE9PSBoKSB7XG4gICAgICAgICAgICBfb25SZXNpemUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9kb2MsIFwiRE9NQ29udGVudExvYWRlZFwiLCBfcmVmcmVzaEFsbCwgX3dpbiwgXCJsb2FkXCIsIF9yZWZyZXNoQWxsLCBfd2luLCBcInJlc2l6ZVwiLCBfb25SZXNpemVdO1xuXG4gICAgICAgIF9pdGVyYXRlQXV0b1JlZnJlc2goX2FkZExpc3RlbmVyKTtcblxuICAgICAgICBfdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICAgIHJldHVybiB0cmlnZ2VyLmVuYWJsZSgwLCAxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IF9zY3JvbGxlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICBfd2hlZWxMaXN0ZW5lcihfcmVtb3ZlTGlzdGVuZXIsIF9zY3JvbGxlcnNbaV0sIF9zY3JvbGxlcnNbaSArIDFdKTtcblxuICAgICAgICAgIF93aGVlbExpc3RlbmVyKF9yZW1vdmVMaXN0ZW5lciwgX3Njcm9sbGVyc1tpXSwgX3Njcm9sbGVyc1tpICsgMl0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF9kb2MpIHtcbiAgICAgICAgdmFyIG9uTG9hZCA9IGZ1bmN0aW9uIG9uTG9hZCgpIHtcbiAgICAgICAgICBTY3JvbGxUcmlnZ2VyLmVuYWJsZSgpO1xuXG4gICAgICAgICAgX2RvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBvbkxvYWQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIF9kb2MuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgb25Mb2FkKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5jb25maWcgPSBmdW5jdGlvbiBjb25maWcodmFycykge1xuICAgIFwibGltaXRDYWxsYmFja3NcIiBpbiB2YXJzICYmIChfbGltaXRDYWxsYmFja3MgPSAhIXZhcnMubGltaXRDYWxsYmFja3MpO1xuICAgIHZhciBtcyA9IHZhcnMuc3luY0ludGVydmFsO1xuICAgIG1zICYmIGNsZWFySW50ZXJ2YWwoX3N5bmNJbnRlcnZhbCkgfHwgKF9zeW5jSW50ZXJ2YWwgPSBtcykgJiYgc2V0SW50ZXJ2YWwoX3N5bmMsIG1zKTtcbiAgICBcImlnbm9yZU1vYmlsZVJlc2l6ZVwiIGluIHZhcnMgJiYgKF9pZ25vcmVNb2JpbGVSZXNpemUgPSBTY3JvbGxUcmlnZ2VyLmlzVG91Y2ggPT09IDEgJiYgdmFycy5pZ25vcmVNb2JpbGVSZXNpemUpO1xuXG4gICAgaWYgKFwiYXV0b1JlZnJlc2hFdmVudHNcIiBpbiB2YXJzKSB7XG4gICAgICBfaXRlcmF0ZUF1dG9SZWZyZXNoKF9yZW1vdmVMaXN0ZW5lcikgfHwgX2l0ZXJhdGVBdXRvUmVmcmVzaChfYWRkTGlzdGVuZXIsIHZhcnMuYXV0b1JlZnJlc2hFdmVudHMgfHwgXCJub25lXCIpO1xuICAgICAgX2lnbm9yZVJlc2l6ZSA9ICh2YXJzLmF1dG9SZWZyZXNoRXZlbnRzICsgXCJcIikuaW5kZXhPZihcInJlc2l6ZVwiKSA9PT0gLTE7XG4gICAgfVxuICB9O1xuXG4gIFNjcm9sbFRyaWdnZXIuc2Nyb2xsZXJQcm94eSA9IGZ1bmN0aW9uIHNjcm9sbGVyUHJveHkodGFyZ2V0LCB2YXJzKSB7XG4gICAgdmFyIHQgPSBfZ2V0VGFyZ2V0KHRhcmdldCksXG4gICAgICAgIGkgPSBfc2Nyb2xsZXJzLmluZGV4T2YodCksXG4gICAgICAgIGlzVmlld3BvcnQgPSBfaXNWaWV3cG9ydCh0KTtcblxuICAgIGlmICh+aSkge1xuICAgICAgX3Njcm9sbGVycy5zcGxpY2UoaSwgaXNWaWV3cG9ydCA/IDYgOiAyKTtcbiAgICB9XG5cbiAgICBpZiAodmFycykge1xuICAgICAgaXNWaWV3cG9ydCA/IF9wcm94aWVzLnVuc2hpZnQoX3dpbiwgdmFycywgX2JvZHksIHZhcnMsIF9kb2NFbCwgdmFycykgOiBfcHJveGllcy51bnNoaWZ0KHQsIHZhcnMpO1xuICAgIH1cbiAgfTtcblxuICBTY3JvbGxUcmlnZ2VyLmNsZWFyTWF0Y2hNZWRpYSA9IGZ1bmN0aW9uIGNsZWFyTWF0Y2hNZWRpYShxdWVyeSkge1xuICAgIF90cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5fY3R4ICYmIHQuX2N0eC5xdWVyeSA9PT0gcXVlcnkgJiYgdC5fY3R4LmtpbGwodHJ1ZSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5pc0luVmlld3BvcnQgPSBmdW5jdGlvbiBpc0luVmlld3BvcnQoZWxlbWVudCwgcmF0aW8sIGhvcml6b250YWwpIHtcbiAgICB2YXIgYm91bmRzID0gKF9pc1N0cmluZyhlbGVtZW50KSA/IF9nZXRUYXJnZXQoZWxlbWVudCkgOiBlbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgb2Zmc2V0ID0gYm91bmRzW2hvcml6b250YWwgPyBfd2lkdGggOiBfaGVpZ2h0XSAqIHJhdGlvIHx8IDA7XG4gICAgcmV0dXJuIGhvcml6b250YWwgPyBib3VuZHMucmlnaHQgLSBvZmZzZXQgPiAwICYmIGJvdW5kcy5sZWZ0ICsgb2Zmc2V0IDwgX3dpbi5pbm5lcldpZHRoIDogYm91bmRzLmJvdHRvbSAtIG9mZnNldCA+IDAgJiYgYm91bmRzLnRvcCArIG9mZnNldCA8IF93aW4uaW5uZXJIZWlnaHQ7XG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5wb3NpdGlvbkluVmlld3BvcnQgPSBmdW5jdGlvbiBwb3NpdGlvbkluVmlld3BvcnQoZWxlbWVudCwgcmVmZXJlbmNlUG9pbnQsIGhvcml6b250YWwpIHtcbiAgICBfaXNTdHJpbmcoZWxlbWVudCkgJiYgKGVsZW1lbnQgPSBfZ2V0VGFyZ2V0KGVsZW1lbnQpKTtcbiAgICB2YXIgYm91bmRzID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgc2l6ZSA9IGJvdW5kc1tob3Jpem9udGFsID8gX3dpZHRoIDogX2hlaWdodF0sXG4gICAgICAgIG9mZnNldCA9IHJlZmVyZW5jZVBvaW50ID09IG51bGwgPyBzaXplIC8gMiA6IHJlZmVyZW5jZVBvaW50IGluIF9rZXl3b3JkcyA/IF9rZXl3b3Jkc1tyZWZlcmVuY2VQb2ludF0gKiBzaXplIDogfnJlZmVyZW5jZVBvaW50LmluZGV4T2YoXCIlXCIpID8gcGFyc2VGbG9hdChyZWZlcmVuY2VQb2ludCkgKiBzaXplIC8gMTAwIDogcGFyc2VGbG9hdChyZWZlcmVuY2VQb2ludCkgfHwgMDtcbiAgICByZXR1cm4gaG9yaXpvbn
8110RhbCA/IChib3VuZHMubGVmdCArIG9mZnNldCkgLyBfd2luLmlubmVyV2lkdGggOiAoYm91bmRzLnRvcCArIG9mZnNldCkgLyBfd2luLmlubmVySGVpZ2h0O1xuICB9O1xuXG4gIFNjcm9sbFRyaWdnZXIua2lsbEFsbCA9IGZ1bmN0aW9uIGtpbGxBbGwoYWxsb3dMaXN0ZW5lcnMpIHtcbiAgICBfdHJpZ2dlcnMuc2xpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQudmFycy5pZCAhPT0gXCJTY3JvbGxTbW9vdGhlclwiICYmIHQua2lsbCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKGFsbG93TGlzdGVuZXJzICE9PSB0cnVlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gX2xpc3RlbmVycy5raWxsQWxsIHx8IFtdO1xuICAgICAgX2xpc3RlbmVycyA9IHt9O1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU2Nyb2xsVHJpZ2dlcjtcbn0oKTtcblNjcm9sbFRyaWdnZXIudmVyc2lvbiA9IFwiMy4xNS4wXCI7XG5cblNjcm9sbFRyaWdnZXIuc2F2ZVN0eWxlcyA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gIHJldHVybiB0YXJnZXRzID8gX3RvQXJyYXkodGFyZ2V0cykuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgLy8gc2F2ZWQgc3R5bGVzIGFyZSByZWNvcmRlZCBpbiBhIGNvbnNlY3V0aXZlIGFsdGVybmF0aW5nIEFycmF5LCBsaWtlIFtlbGVtZW50LCBjc3NUZXh0LCB0cmFuc2Zvcm0gYXR0cmlidXRlLCBjYWNoZSwgbWF0Y2hNZWRpYSwgLi4uXVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LnN0eWxlKSB7XG4gICAgICB2Y
8110XIgaSA9IF9zYXZlZFN0eWxlcy5pbmRleE9mKHRhcmdldCk7XG5cbiAgICAgIGkgPj0gMCAmJiBfc2F2ZWRTdHlsZXMuc3BsaWNlKGksIDUpO1xuXG4gICAgICBfc2F2ZWRTdHlsZXMucHVzaCh0YXJnZXQsIHRhcmdldC5zdHlsZS5jc3NUZXh0LCB0YXJnZXQuZ2V0QkJveCAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIpLCBnc2FwLmNvcmUuZ2V0Q2FjaGUodGFyZ2V0KSwgX2NvbnRleHQoKSk7XG4gICAgfVxuICB9KSA6IF9zYXZlZFN0eWxlcztcbn07XG5cblNjcm9sbFRyaWdnZXIucmV2ZXJ0ID0gZnVuY3Rpb24gKHNvZnQsIG1lZGlhKSB7XG4gIHJldHVybiBfcmV2ZXJ0QWxsKCFzb2Z0LCBtZWRpYSk7XG59O1xuXG5TY3JvbGxUcmlnZ2VyLmNyZWF0ZSA9IGZ1bmN0aW9uICh2YXJzLCBhbmltYXRpb24pIHtcbiAgcmV0dXJuIG5ldyBTY3JvbGxUcmlnZ2VyKHZhcnMsIGFuaW1hdGlvbik7XG59O1xuXG5TY3JvbGxUcmlnZ2VyLnJlZnJlc2ggPSBmdW5jdGlvbiAoc2FmZSkge1xuICByZXR1cm4gc2FmZSA/IF9vblJlc2l6ZSh0cnVlKSA6IChfY29yZUluaXR0ZWQgfHwgU2Nyb2xsVHJpZ2dlci5yZWdpc3RlcigpKSAmJiBfcmVmcmVzaEFsbCh0cnVlKTtcbn07XG5cblNjcm9sbFRyaWdnZXIudXBkYXRlID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gIHJldHVybiArK19zY3JvbGxlcnMuY2FjaGUgJiYgX3VwZGF0ZUFsbChmb3JjZSA9PT0gdHJ1ZSA/IDIgOiAwKTtcbn07XG5cblNjcm9sbFRyaWdnZXIuY2xlYXJTY3JvbGxNZW1vcnkgPSBfY2xlYXJTY3JvbGxNZW1vcnk7XG5cblNjcm9sbFRyaWdnZXIubWF4U2Nyb2xsID0gZnVuY3Rpb24gKGVsZW1lbnQsIGhvcml6b250YWwpIHtcbiAgcmV0dXJuIF9tYXhTY3JvbGwoZWxlbWVudCwgaG9yaXpvbnRhbCA/IF9ob3Jpem9udGFsIDogX3ZlcnRpY2FsKTtcbn07XG5cblNjcm9sbFRyaWdnZXIuZ2V0U2Nyb2xsRnVuYyA9IGZ1bmN0aW9uIChlbGVtZW50LCBob3Jpem9udGFsKSB7XG4gIHJldHVybiBfZ2V0U2Nyb2xsRnVuYyhfZ2V0VGFyZ2V0KGVsZW1lbnQpLCBob3Jpem9udGFsID8gX2hvcml6b250YWwgOiBfdmVydGljYWwpO1xufTtcblxuU2Nyb2xsVHJpZ2dlci5nZXRCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBfaWRzW2lkXTtcbn07XG5cblNjcm9sbFRyaWdnZXIuZ2V0QWxsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX3RyaWdnZXJzLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnZhcnMuaWQgIT09IFwiU2Nyb2xsU21vb3RoZXJcIjtcbiAgfSk7XG59OyAvLyBpdCdzIGNvbW1vbiBmb3IgcGVvcGxlIHRvIFNjcm9sbFRyaWdnZXIuZ2V0QWxsKHQgPT4gdC5raWxsKCkpIG9uIHBhZ2Ugcm91dGVzLCBmb3IgZXhhbXBsZSwgYW5kIHdlIGRvbid0IHdhbnQgaXQgdG8gcnVpbiBzbW9vdGggc2Nyb2xsaW5nIGJ5IGtpbGxpbmcgdGhlIG1haW4gU2Nyb2xsU21vb3RoZXIgb25lLlxuXG5cblNjcm9sbFRyaWdnZXIuaXNTY3JvbGxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhIV9sYXN0U2Nyb2xsVGltZTtcbn07XG5cblNjcm9sbFRyaWdnZXIuc25hcERpcmVjdGlvbmFsID0gX3NuYXBEaXJlY3Rpb25hbDtcblxuU2Nyb2xsVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHR5cGUsIGNhbGxiYWNrKSB7XG4gIHZhciBhID0gX2xpc3RlbmVyc1t0eXBlXSB8fCAoX2xpc3RlbmVyc1t0eXBlXSA9IFtdKTtcbiAgfmEuaW5kZXhPZihjYWxsYmFjaykgfHwgYS5wdXNoKGNhbGxiYWNrKTtcbn07XG5cblNjcm9sbFRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBjYWxsYmFjaykge1xuICB2YXIgYSA9IF9saXN0ZW5lcnNbdHlwZV0sXG4gICAgICBpID0gYSAmJiBhLmluZGV4T2YoY2FsbGJhY2spO1xuICBpID49IDAgJiYgYS5zcGxpY2UoaSwgMSk7XG59O1xuXG5TY3JvbGxUcmlnZ2VyLmJhdGNoID0gZnVuY3Rpb24gKHRhcmdldHMsIHZhcnMpIHtcbiAgdmFyIHJlc3VsdCA9IFtdLFxuICAgICAgdmFyc0NvcHkgPSB7fSxcbiAgICAgIGludGVydmFsID0gdmFycy5pbnRlcnZhbCB8fCAwLjAxNixcbiAgICAgIGJhdGNoTWF4ID0gdmFycy5iYXRjaE1heCB8fCAxZTksXG4gICAgICBwcm94eUNhbGxiYWNrID0gZnVuY3Rpb24gcHJveHlDYWxsYmFjayh0eXBlLCBjYWxsYmFjaykge1xuICAgIHZhciBlbGVtZW50cyA9IFtdLFxuICAgICAgICB0cmlnZ2VycyA9IFtdLFxuICAgICAgICBkZWxheSA9IGdzYXAuZGVsYXllZENhbGwoaW50ZXJ2YWwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKGVsZW1lbnRzLCB0cmlnZ2Vycyk7XG4gICAgICBlbGVtZW50cyA9IFtdO1xuICAgICAgdHJpZ2dlcnMgPSBbXTtcbiAgICB9KS5wYXVzZSgpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZikge1xuICAgICAgZWxlbWVudHMubGVuZ3RoIHx8IGRlbGF5LnJlc3RhcnQodHJ1ZSk7XG4gICAgICBlbGVtZW50cy5wdXNoKHNlbGYudHJpZ2dlcik7XG4gICAgICB0cmlnZ2Vycy5wdXNoKHNlbGYpO1xuICAgICAgYmF0Y2hNYXggPD0gZWxlbWVudHMubGVuZ3RoICYmIGRlbGF5LnByb2dyZXNzKDEpO1xuICAgIH07XG4gIH0sXG4gICAgICBwO1xuXG4gIGZvciAocCBpbiB2YXJzKSB7XG4gICAgdmFyc0NvcHlbcF0gPSBwLnN1YnN0cigwLCAyKSA9PT0gXCJvblwiICYmIF9pc0Z1bmN0aW9uKHZhcnNbcF0pICYmIHAgIT09IFwib25SZWZyZXNoSW5pdFwiID8gcHJveHlDYWxsYmFjayhwLCB2YXJzW3BdKSA6IHZhcnNbcF07XG4gIH1cblxuICBpZiAoX2lzRnVuY3Rpb24oYmF0Y2hNYXgpKSB7XG4gICAgYmF0Y2hNYXggPSBiYXRjaE1heCgpO1xuXG4gICAgX2FkZExpc3RlbmVyKFNjcm9sbFRyaWdnZXIsIFwicmVmcmVzaFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYmF0Y2hNYXggPSB2YXJzLmJhdGNoTWF4KCk7XG4gICAgfSk7XG4gIH1cblxuICBfdG9BcnJheSh0YXJnZXRzKS5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICB2YXIgY29uZmlnID0ge307XG5cbiAgICBmb3IgKHAgaW4gdmFyc0NvcHkpIHtcbiAgICAgIGNvbmZpZ1twXSA9IHZhcnNDb3B5W3BdO1xuICAgIH1cblxuICAgIGNvbmZpZy50cmlnZ2VyID0gdGFyZ2V0O1xuICAgIHJlc3VsdC5wdXNoKFNjcm9sbFRyaWdnZXIuY3JlYXRlKGNvbmZpZykpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTsgLy8gdG8gcmVkdWNlIGZpbGUgc2l6ZS4gY2xhbXBzIHRoZSBzY3JvbGwgYW5kIGFsc28gcmV0dXJucyBhIGR1cmF0aW9uIG11bHRpcGxpZXIgc28gdGhhdCBpZiB0aGUgc2Nyb2xsIGdldHMgY2hvcHBlZCBzaG9ydGVyLCB0aGUgZHVyYXRpb24gZ2V0cyBjdXJ0YWlsZWQgYXMgd2VsbCAob3RoZXJ3aXNlIGlmIHlvdSdyZSB2ZXJ5IGNsb3NlIHRvIHRoZSB0b3Agb2YgdGhlIHBhZ2UsIGZvciBleGFtcGxlLCBhbmQgc3dpcGUgdXAgcmVhbGx5IGZhc3QsIGl0J2xsIHN1ZGRlbmx5IHNsb3cgZG93biBhbmQgdGFrZSBhIGxvbmcgdGltZSB0byByZWFjaCB0aGUgdG9wKS5cblxuXG52YXIgX2NsYW1wU2Nyb2xsQW5kR2V0RHVyYXRpb25NdWx0aXBsaWVyID0gZnVuY3Rpb24gX2NsYW1wU2Nyb2xsQW5kR2V0RHVyYXRpb25NdWx0aXBsaWVyKHNjcm9sbEZ1bmMsIGN1cnJlbnQsIGVuZCwgbWF4KSB7XG4gIGN1cnJlbnQgPiBtYXggPyBzY3JvbGxGdW5jKG1heCkgOiBjdXJyZW50IDwgMCAmJiBzY3JvbGxGdW5jKDApO1xuICByZXR1cm4gZW5kID4gbWF4ID8gKG1heCAtIGN1cnJlbnQpIC8gKGVuZCAtIGN1cnJlbnQpIDogZW5kIDwgMCA/IGN1cnJlbnQgLyAoY3VycmVudCAtIGVuZCkgOiAxO1xufSxcbiAgICBfYWxsb3dOYXRpdmVQYW5uaW5nID0gZnVuY3Rpb24gX2FsbG93TmF0aXZlUGFubmluZyh0YXJnZXQsIGRpcmVjdGlvbikge1xuICBpZiAoZGlyZWN0aW9uID09PSB0cnVlKSB7XG4gICAgdGFyZ2V0LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwidG9
81101Y2gtYWN0aW9uXCIpO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldC5zdHlsZS50b3VjaEFjdGlvbiA9IGRpcmVjdGlvbiA9PT0gdHJ1ZSA/IFwiYXV0b1wiIDogZGlyZWN0aW9uID8gXCJwYW4tXCIgKyBkaXJlY3Rpb24gKyAoT2JzZXJ2ZXIuaXNUb3VjaCA/IFwiIHBpbmNoLXpvb21cIiA6IFwiXCIpIDogXCJub25lXCI7IC8vIG5vdGU6IEZpcmVmb3ggZG9lc24ndCBzdXBwb3J0IGl0IHBpbmNoLXpvb20gcHJvcGVybHksIGF0IGxlYXN0IGluIGFkZGl0aW9uIHRvIGEgcGFuLXggb3IgcGFuLXkuXG4gIH1cblxuICB0YXJnZXQgPT09IF9kb2NFbCAmJiBfYWxsb3dOYXRpdmVQYW5uaW5nKF9ib2R5LCBkaXJlY3Rpb24pO1xufSxcbiAgICBfb3ZlcmZsb3cgPSB7XG4gIGF1dG86IDEsXG4gIHNjcm9sbDogMVxufSxcbiAgICBfbmVzdGVkU2Nyb2xsID0gZnVuY3Rpb24gX25lc3RlZFNjcm9sbChfcmVmNSkge1xuICB2YXIgZXZlbnQgPSBfcmVmNS5ldmVudCxcbiAgICAgIHRhcmdldCA9IF9yZWY1LnRhcmdldCxcbiAgICAgIGF4aXMgPSBfcmVmNS5heGlzO1xuXG4gIHZhciBub2RlID0gKGV2ZW50LmNoYW5nZWRUb3VjaGVzID8gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudCkudGFyZ2V0LFxuICAgICAgY2FjaGUgPSBub2RlLl9nc2FwIHx8IGdzYXAuY29yZS5nZXRDYWNoZShub2RlKSxcbiAgICAgIHRpbWUgPSBfZ2V0VGltZSgpLFxuICAgICAgY3M7XG5cbiAgaWYgKCFjYWNoZS5faXNTY3JvbGxUIHx8IHRpbWUgLSBjYWNoZS5faXNTY3JvbGxUID4gMjAwMCkge1xuICAgIC8vIGNhY2hlIGZvciAyIHNlY29uZHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBfYm9keSAmJiAobm9kZS5zY3JvbGxIZWlnaHQgPD0gbm9kZS5jbGllbnRIZWlnaHQgJiYgbm9kZS5zY3JvbGxXaWR0aCA8PSBub2RlLmNsaWVudFdpZHRoIHx8ICEoX292ZXJmbG93WyhjcyA9IF9nZXRDb21wdXRlZFN0eWxlKG5vZGUpKS5vdmVyZmxvd1ldIHx8IF9vdmVyZmxvd1tjcy5vdmVyZmxvd1hdKSkpIHtcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgY2FjaGUuX2lzU2Nyb2xsID0gbm9kZSAmJiBub2RlICE9PSB0YXJnZXQgJiYgIV9pc1ZpZXdwb3J0KG5vZGUpICYmIChfb3ZlcmZsb3dbKGNzID0gX2dldENvbXB1dGVkU3R5bGUobm9kZSkpLm92ZXJmbG93WV0gfHwgX292ZXJmbG93W2NzLm92ZXJmbG93WF0pO1xuICAgIGNhY2hlLl9pc1Njcm9sbFQgPSB0aW1lO1xuICB9XG5cbiAgaWYgKGNhY2hlLl9pc1Njcm9sbCB8fCBheGlzID09PSBcInhcIikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50Ll9nc2FwQWxsb3cgPSB0cnVlO1xuICB9XG59LFxuICAgIC8vIGNhcHR1cmUgZXZlbnRzIG9uIHNjcm9sbGFibGUgZWxlbWVudHMgSU5TSURFIHRoZSA8Ym9keT4gYW5kIGFsbG93IHRob3NlIGJ5IGNhbGxpbmcgc3RvcFByb3BhZ2F0aW9uKCkgd2hlbiB3ZSBmaW5kIGEgc2Nyb2xsYWJsZSBhbmNlc3RvclxuX2lucHV0T2JzZXJ2ZXIgPSBmdW5jdGlvbiBfaW5wdXRPYnNlcnZlcih0YXJnZXQsIHR5cGUsIGlucHV0cywgbmVzdGVkKSB7XG4gIHJldHVybiBPYnNlcnZlci5jcmVhdGUoe1xuICAgIHRhcmdldDogdGFyZ2V0LFxuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgZGVib3VuY2U6IGZhbHNlLFxuICAgIGxvY2tBeGlzOiB0cnVlLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgb25XaGVlbDogbmVzdGVkID0gbmVzdGVkICYmIF9uZXN0ZWRTY3JvbGwsXG4gICAgb25QcmVzczogbmVzdGVkLFxuICAgIG9uRHJhZzogbmVzdGVkLFxuICAgIG9uU2Nyb2xsOiBuZXN0ZWQsXG4gICAgb25FbmFibGU6IGZ1bmN0aW9uIG9uRW5hYmxlKCkge1xuICAgICAgcmV0dXJuIGlucHV0cyAmJiBfYWRkTGlzdGVuZXIoX2RvYywgT2JzZXJ2ZXIuZXZlbnRUeXBlc1swXSwgX2NhcHR1cmVJbnB1dHMsIGZhbHNlLCB0cnVlKTtcbiAgICB9LFxuICAgIG9uRGlzYWJsZTogZnVuY3Rpb24gb25EaXNhYmxlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmVMaXN0ZW5lcihfZG9jLCBPYnNlcnZlci5ldmVudFR5cGVzWzBdLCBfY2FwdHVyZUlucHV0cywgdHJ1ZSk7XG4gICAgfVxuICB9KTtcbn0sXG4gICAgX2lucHV0RXhwID0gLyhpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEpL2ksXG4gICAgX2lucHV0SXNGb2N1c2VkLFxuICAgIF9jYXB0dXJlSW5wdXRzID0gZnVuY3Rpb24gX2NhcHR1cmVJbnB1dHMoZSkge1xuICB2YXIgaXNJbnB1dCA9IF9pbnB1dEV4cC50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpO1xuXG4gIGlmIChpc0lucHV0IHx8IF9pbnB1dElzRm9jdXNlZCkge1xuICAgIGUuX2dzYXBBbGxvdyA9IHRydWU7XG4gICAgX2lucHV0SXNGb2N1c2VkID0gaXNJbnB1dDtcbiAgfVxufSxcbiAgICBfZ2V0U2Nyb2xsTm9ybWFsaXplciA9IGZ1bmN0aW9uIF9nZXRTY3JvbGxOb3JtYWxpemVyKHZhcnMpIHtcbiAgX2lzT2JqZWN0KHZhcnMpIHx8ICh2YXJzID0ge30pO1xuICB2YXJzLnByZXZlbnREZWZhdWx0ID0gdmFycy5pc05vcm1hbGl6ZXIgPSB2YXJzLmFsbG93Q2xpY2tzID0gdHJ1ZTtcbiAgdmFycy50eXBlIHx8ICh2YXJzLnR5cGUgPSBcIndoZWVsLHRvdWNoXCIpO1xuICB2YXJzLmRlYm91bmNlID0gISF2YXJzLmRlYm91bmNlO1xuICB2YXJzLmlkID0gdmFycy5pZCB8fCBcIm5vcm1hbGl6ZXJcIjtcblxuICB2YXIgX3ZhcnMyID0gdmFycyxcbiAgICAgIG5vcm1hbGl6ZVNjcm9sbFggPSBfdmFyczIubm9ybWFsaXplU2Nyb2xsWCxcbiAgICAgIG1vbWVudHVtID0gX3ZhcnMyLm1vbWVudHVtLFxuICAgICAgYWxsb3dOZXN0ZWRTY3JvbGwgPSBfdmFyczIuYWxsb3dOZXN0ZWRTY3JvbGwsXG4gICAgICBvblJlbGVhc2UgPSBfdmFyczIub25SZWxlYXNlLFxuICAgICAgc2VsZixcbiAgICAgIG1heFksXG4gICAgICB0YXJnZXQgPSBfZ2V0VGFyZ2V0KHZhcnMudGFyZ2V0KSB8fCBfZG9jRWwsXG4gICAgICBzbW9vdGhlciA9IGdzYXAuY29yZS5nbG9iYWxzKCkuU2Nyb2xsU21vb3RoZXIsXG4gICAgICBzbW9vdGhlckluc3RhbmNlID0gc21vb3RoZXIgJiYgc21vb3RoZXIuZ2V0KCksXG4gICAgICBjb250ZW50ID0gX2ZpeElPU0J1ZyAmJiAodmFycy5jb250ZW50ICYmIF9nZXRUYXJnZXQodmFycy5jb250ZW50KSB8fCBzbW9vdGhlckluc3RhbmNlICYmIHZhcnMuY29udGVudCAhPT0gZmFsc2UgJiYgIXNtb290aGVySW5zdGFuY2Uuc21vb3RoKCkgJiYgc21vb3RoZXJJbnN0YW5jZS5jb250ZW50KCkpLFxuICAgICAgc2Nyb2xsRnVuY1kgPSBfZ2V0U2Nyb2xsRnVuYyh0YXJnZXQsIF92ZXJ0aWNhbCksXG4gICAgICBzY3JvbGxGdW5jWCA9IF9nZXRTY3JvbGxGdW5jKHRhcmdldCwgX2hvcml6b250YWwpLFxuICAgICAgc2NhbGUgPSAxLFxuICAgICAgaW5pdGlhbFNjYWxlID0gKE9ic2VydmVyLmlzVG91Y2ggJiYgX3dpbi52aXN1YWxWaWV3cG9ydCA/IF93aW4udmlzdWFsVmlld3BvcnQuc2NhbGUgKiBfd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoIDogX3dpbi5vdXRlcldpZHRoKSAvIF93aW4uaW5uZXJXaWR0aCxcbiAgICAgIHdoZWVsUmVmcmVzaCA9IDAsXG4gICAgICByZXNvbHZlTW9tZW50dW1EdXJhdGlvbiA9I
8110F9pc0Z1bmN0aW9uKG1vbWVudHVtKSA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbW9tZW50dW0oc2VsZik7XG4gIH0gOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG1vbWVudHVtIHx8IDIuODtcbiAgfSxcbiAgICAgIGxhc3RSZWZyZXNoSUQsXG4gICAgICBza2lwVG91Y2hNb3ZlLFxuICAgICAgaW5wdXRPYnNlcnZlciA9IF9pbnB1dE9ic2VydmVyKHRhcmdldCwgdmFycy50eXBlLCB0cnVlLCBhbGxvd05lc3RlZFNjcm9sbCksXG4gICAgICByZXN1bWVUb3VjaE1vdmUgPSBmdW5jdGlvbiByZXN1bWVUb3VjaE1vdmUoKSB7XG4gICAgcmV0dXJuIHNraXBUb3VjaE1vdmUgPSBmYWxzZTtcbiAgfSxcbiAgICAgIHNjcm9sbENsYW1wWCA9IF9wYXNzVGhyb3VnaCxcbiAgICAgIHNjcm9sbENsYW1wWSA9IF9wYXNzVGhyb3VnaCxcbiAgICAgIHVwZGF0ZUNsYW1wcyA9IGZ1bmN0aW9uIHVwZGF0ZUNsYW1wcygpIHtcbiAgICBtYXhZID0gX21heFNjcm9sbCh0YXJnZXQsIF92ZXJ0aWNhbCk7XG4gICAgc2Nyb2xsQ2xhbXBZID0gX2NsYW1wKF9maXhJT1NCdWcgPyAxIDogMCwgbWF4WSk7XG4gICAgbm9ybWFsaXplU2Nyb2xsWCAmJiAoc2Nyb2xsQ2xhbXBYID0gX2NsYW1wKDAsIF9tYXhTY3JvbGwodGFyZ2V0LCBfaG9yaXpvbnRhbCkpKTtcbiAgICBsYXN0UmVmcmVzaElEID0gX3JlZnJlc2hJRDtcbiAgfSxcbiAgICAgIHJlbW92ZUNvbnRlbnRPZmZzZXQgPSBmdW5jdGlvbiByZW1vdmVDb250ZW50T2Zmc2V0KCkge1xuICAgIGNvbnRlbnQuX2dzYXAueSA9IF9yb3VuZChwYXJzZUZsb2F0KGNvbnRlbnQuX2dzYXAueSkgKyBzY3JvbGxGdW5jWS5vZmZzZXQpICsgXCJweFwiO1xuICAgIGNvbnRlbnQuc3R5bGUudHJhbnNmb3JtID0gXCJtYXRyaXgzZCgxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCBcIiArIHBhcnNlRmxvYXQoY29udGVudC5fZ3NhcC55KSArIFwiLCAwLCAxKVwiO1xuICAgIHNjcm9sbEZ1bmNZLm9mZnNldCA9IHNjcm9sbEZ1bmNZLmNhY2hlSUQgPSAwO1xuICB9LFxuICAgICAgaWdub3JlRHJhZyA9IGZ1bmN0aW9uIGlnbm9yZURyYWcoKSB7XG4gICAgaWYgKHNraXBUb3VjaE1vdmUpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXN1bWVUb3VjaE1vdmUpO1xuXG4gICAgICB2Y
8110XIgb2Zmc2V0ID0gX3JvdW5kKHNlbGYuZGVsdGFZIC8gMiksXG4gICAgICAgICAgc2Nyb2xsID0gc2Nyb2xsQ2xhbXBZKHNjcm9sbEZ1bmNZLnYgLSBvZmZzZXQpO1xuXG4gICAgICBpZiAoY29udGVudCAmJiBzY3JvbGwgIT09IHNjcm9sbEZ1bmNZLnYgKyBzY3JvbGxGdW5jWS5vZmZzZXQpIHtcbiAgICAgICAgc2Nyb2xsRnVuY1kub2Zmc2V0ID0gc2Nyb2xsIC0gc2Nyb2xsRnVuY1kudjtcblxuICAgICAgICB2YXIgeSA9IF9yb3VuZCgocGFyc2VGbG9hdChjb250ZW50ICYmIGNvbnRlbnQuX2dzYXAueSkgfHwgMCkgLSBzY3JvbGxGdW5jWS5vZmZzZXQpO1xuXG4gICAgICAgIGNvbnRlbnQuc3R5bGUudHJhbnNmb3JtID0gXCJtYXRyaXgzZCgxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCBcIiArIHkgKyBcIiwgMCwgMSlcIjtcbiAgICAgICAgY29udGVudC5fZ3NhcC55ID0geSArIFwicHhcIjtcbiAgICAgICAgc2Nyb2xsRnVuY1kuY2FjaGVJRCA9IF9zY3JvbGxlcnMuY2FjaGU7XG5cbiAgICAgICAgX3VwZGF0ZUFsbCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzY3JvbGxGdW5jWS5vZmZzZXQgJiYgcmVtb3ZlQ29udGVudE9mZnNldCgpO1xuICAgIHNraXBUb3VjaE1vdmUgPSB0cnVlO1xuICB9LFxuICAgICAgdHdlZW4sXG4gICAgICBzdGFydFNjcm9sbFgsXG4gICAgICBzdGFydFNjcm9sbFksXG4gICAgICBvblN0b3BEZWxheWVkQ2FsbCxcbiAgICAgIG9uUmVzaXplID0gZnVuY3Rpb24gb25SZXNpemUoKSB7XG4gICAgLy8gaWYgdGhlIHdpbmRvdyByZXNpemVzLCBsaWtlIG9uIGFuIGlQaG9uZSB3aGljaCBBcHBsZSBGT1JDRVMgdGhlIGFkZHJlc3MgYmFyIHRvIHNob3cvaGlkZSBldmVuIGlmIHdlIGV2ZW50LnByZXZlbnREZWZhdWx0KCksIGl0IG1heSBiZSBzY3JvbGxpbmcgdG9vIGZhciBub3cgdGhhdCB0aGUgYWRkcmVzcyBiYXIgaXMgc2hvd2luZywgc28gd2UgbXVzdCBkeW5hbWljYWxseSBhZGp1c3QgdGhlIG1vbWVudHVtIHR3ZWVuLlxuICAgIHVwZGF0ZUNsYW1wcygpO1xuXG4gICAgaWYgKHR3ZWVuLmlzQWN0aXZlKCkgJiYgdHdlZW4udmFycy5zY3JvbGxZID4gbWF4WSkge1xuICAgICAgc2Nyb2xsRnVuY1koKSA+IG1heFkgPyB0d2Vlbi5wcm9ncmVzcygxKSAmJiBzY3JvbGxGdW5jWShtYXhZKSA6IHR3ZWVuLnJlc2V0VG8oXCJzY3JvbGxZXCIsIG1heFkpO1xuICAgIH1cbiAgfTtcblxuICBjb250ZW50ICYmIGdzYXAuc2V0KGNvbnRlbnQsIHtcbiAgICB5OiBcIis9MFwiXG4gIH0pOyAvLyB0byBlbnN1cmUgdGhlcmUncyBhIGNhY2hlIChlbGVtZW50Ll9nc2FwKVxuXG4gIHZhcnMuaWdub3JlQ2hlY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBfZml4SU9TQnVnICYmIGUudHlwZSA9PT0gXCJ0b3VjaG1vdmVcIiAmJiBpZ25vcmVEcmFnKGUpIHx8IHNjYWxlID4gMS4wNSAmJiBlLnR5cGUgIT09IFwidG91Y2hzdGFydFwiIHx8IHNlbGYuaXNHZXN0dXJpbmcgfHwgZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxO1xuICB9O1xuXG4gIHZhcnMub25QcmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBza2lwVG91Y2hNb3ZlID0gZmFsc2U7XG4gICAgdmFyIHByZXZTY2FsZSA9IHNjYWxlO1xuICAgIHNjYWxlID0gX3JvdW5kKChfd2luLnZpc3VhbFZpZXdwb3J0ICYmIF93aW4udmlzdWFsVmlld3BvcnQuc2NhbGUgfHwgMSkgLyBpbml0aWFsU2NhbGUpO1xuICAgIHR3ZWVuLnBhdXNlKCk7XG4gICAgcHJldlNjYWxlICE9PSBzY2FsZSAmJiBfYWxsb3dOYXRpdmVQYW5uaW5nKHRhcmdldCwgc2NhbGUgPiAxLjAxID8gdHJ1ZSA6IG5vcm1hbGl6ZVNjcm9sbFggPyBmYWxzZSA6IFwieFwiKTtcbiAgICBzdGFydFNjcm9sbFggPSBzY3JvbGxGdW5jWCgpO1xuICAgIHN0YXJ0U2Nyb2xsWSA9IHNjcm9sbEZ1bmNZKCk7XG4gICAgdXBkYXRlQ2xhbXBzKCk7XG4gICAgbGFzdFJlZnJlc2hJRCA9IF9yZWZyZXNoSUQ7XG4gIH07XG5cbiAgdmFycy5vblJlbGVhc2UgPSB2YXJzLm9uR2VzdHVyZVN0YXJ0ID0gZnVuY3Rpb24gKHNlbGYsIHdhc0RyYWdnaW5nKSB7XG4gICAgc2Nyb2xsRnVuY1kub2Zmc2V0ICYmIHJlbW92ZUNvbnRlbnRPZmZzZXQoKTtcblxuICAgIGlmICghd2FzRHJhZ2dpbmcpIHtcbiAgICAgIG9uU3RvcERlbGF5ZWRDYWxsLnJlc3RhcnQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zY3JvbGxlcnMuY2FjaGUrKzsgLy8gbWFrZSBzdXJlIHdlJ3JlIHB1bGxpbmcgdGhlIG5vbi1jYWNoZWQgdmFsdWVcbiAgICAgIC8vIGFsdGVybmF0ZSBhbGdvcml0aG06IGR1clggPSBNYXRoLm1pbig2LCBNYXRoLmFicyhzZWxmLnZlbG9jaXR5WCAvIDgwMCkpLFx0ZHVyID0gTWF0aC5tYXgoZHVyWCwgTWF0aC5taW4oNiwgTWF0aC5hYnMoc2VsZi52ZWxvY2l0eVkgLyA4MDApKSk7IGR1ciA9IGR1ciAqICgwLjQgKyAoMSAtIF9wb3dlcjRJbihkdXIgLyA2KSkgKiAwLjYpKSAqIChtb21lbnR1bVNwZWVkIHx8IDEpXG5cbiAgICAgIHZhciBkdXIgPSByZXNvbHZlTW9tZW50dW1EdXJhdGlvbigpLFxuICAgICAgICAgIGN1cnJlbnRTY3JvbGwsXG4gICAgICAgICAgZW5kU2Nyb2xsO1xuXG4gICAgICBpZiAobm9ybWFsaXplU2Nyb2xsWCkge1xuICAgICAgICBjdXJyZW50U2Nyb2xsID0gc2Nyb2xsRnVuY1goKTtcbiAgICAgICAgZW5kU2Nyb2xsID0gY3VycmVudFNjcm9sbCArIGR1ciAqIDAuMDUgKiAtc2VsZi52ZWxvY2l0eVggLyAwLjIyNzsgLy8gdGhlIGNvbnN0YW50IC4yMjcgaXMgZnJvbSBwb3dlcjQoMC4wNSkuIHZlbG9jaXR5IGlzIGludmVydGVkIGJlY2F1c2Ugc2Nyb2xsaW5nIGdvZXMgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi5cblxuICAgICAgICBkdXIgKj0gX2NsYW1wU2Nyb2xsQW5kR2V0RHVyYXRpb25NdWx0aXBsaWVyKHNjcm9sbEZ1bmNYLCBjdXJyZW50U2Nyb2xsLCBlbmRTY3JvbGwsIF9tYXhTY3JvbGwodGFyZ2V0LCBfaG9yaXpvbnRhbCkpO1xuICAgICAgICB0d2Vlbi52YXJzLnNjcm9sbFggPSBzY3JvbGxDbGFtcFgoZW5kU2Nyb2xsKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFNjcm9sbCA9IHNjcm9sbEZ1bmNZKCk7XG4gICAgICBlbmRTY3JvbGwgP
8110SBjdXJyZW50U2Nyb2xsICsgZHVyICogMC4wNSAqIC1zZWxmLnZlbG9jaXR5WSAvIDAuMjI3OyAvLyB0aGUgY29uc3RhbnQgLjIyNyBpcyBmcm9tIHBvd2VyNCgwLjA1KVxuXG4gICAgICBkdXIgKj0gX2NsYW1wU2Nyb2xsQW5kR2V0RHVyYXRpb25NdWx0aXBsaWVyKHNjcm9sbEZ1bmNZLCBjdXJyZW50U2Nyb2xsLCBlbmRTY3JvbGwsIF9tYXhTY3JvbGwodGFyZ2V0LCBfdmVydGljYWwpKTtcbiAgICAgIHR3ZWVuLnZhcnMuc2Nyb2xsWSA9IHNjcm9sbENsYW1wWShlbmRTY3JvbGwpO1xuICAgICAgdHdlZW4uaW52YWxpZGF0ZSgpLmR1cmF0aW9uKGR1cikucGxheSgwLjAxKTtcblxuICAgICAgaWYgKF9maXhJT1NCdWcgJiYgdHdlZW4udmFycy5zY3JvbGxZID49IG1heFkgfHwgY3VycmVudFNjcm9sbCA+PSBtYXhZIC0gMSkge1xuICAgICAgICAvLyBpT1MgYnVnOiBpdCdsbCBzaG93IHRoZSBhZGRyZXNzIGJhciBidXQgTk9UIGZpcmUgdGhlIHdpbmRvdyBcInJlc2l6ZVwiIGV2ZW50IHVudGlsIHRoZSBhbmltYXRpb24gaXMgZG9uZSBidXQgd2UgbXVzdCBwcm90ZWN0IGFnYWluc3Qgb3ZlcnNob290IHNvIHdlIGxldmVyYWdlIGFuIG9uVXBkYXRlIHRvIGRvIHNvLlxuICAgICAgICBnc2FwLnRvKHt9LCB7XG4gICAgICAgICAgb25VcGRhdGU6IG9uUmVzaXplLFxuICAgICAgICAgIGR1cmF0aW9uOiBkdXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25SZWxlYXNlICYmIG9uUmVsZWFzZShzZWxmKTtcbiAgfTtcblxuICB2YXJzLm9uV2hlZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdHdlZW4uX3RzICYmIHR3ZWVuLnBhdXNlKCk7XG5cbiAgICBpZiAoX2dldFRpbWUoKSAtIHdoZWVsUmVmcmVzaCA+IDEwMDApIHtcbiAgICAgIC8vIGFmdGVyIDEgc2Vjb25kLCByZWZyZXNoIHRoZSBjbGFtcHMgb3RoZXJ3aXNlIHRoYXQnbGwgb25seSBoYXBwZW4gd2hlbiBTY3JvbGxUcmlnZ2VyLnJlZnJlc2goKSBpcyBjYWxsZWQgb3IgZm9yIHRvdWNoLXNjcm9sbGluZy5cbiAgICAgIGxhc3RSZWZyZXNoSUQgPSAwO1xuICAgICAgd2hlZWxSZWZyZXNoID0gX2dldFRpbWUoKTtcbiAgICB9XG4gIH07XG5cbiAgdmFycy5vbkNoYW5nZSA9IGZ1bmN0aW9uIChzZWxmLCBkeCwgZHksIHhBcnJheSwgeUFycmF5KSB7XG4gICAgX3JlZnJlc2hJRCAhPT0gbGFzdFJlZnJlc2hJRCAmJiB1cGRhdGVDbGFtcHMoKTtcbiAgICBkeCAmJiBub3JtYWxpemVTY3JvbGxYICYmIHNjcm9sbEZ1bmNYKHNjcm9sbENsYW1wWCh4QXJyYXlbMl0gPT09IGR4ID8gc3RhcnRTY3JvbGxYICsgKHNlbGYuc3RhcnRYIC0gc2VsZi54KSA6IHNjcm9sbEZ1bmNYKCkgKyBkeCAtIHhBcnJheVsxXSkpOyAvLyBmb3IgbW9yZSBwcmVjaXNpb24sIHdlIHRyYWNrIHBvaW50ZXIvdG91Y2ggbW92ZW1lbnQgZnJvbSB0aGUgc3RhcnQsIG90aGVyd2lzZSBpdCdsbCBkcmlmdC5cblxuICAgIGlmIChkeSkge1xuICAgICAgc2Nyb2xsRnVuY1kub2Zmc2V0ICYmIHJlbW92ZUNvbnRlbnRPZmZzZXQoKTtcbiAgICAgIHZhciBpc1RvdWNoID0geUFycmF5WzJdID09PSBkeSxcbiAgICAgICAgICB5ID0gaXNUb3VjaCA/IHN0YXJ0U2Nyb2xsWSArIHNlbGYuc3RhcnRZIC0gc2VsZi55IDogc2Nyb2xsRnVuY1koKSArIGR5IC0geUFycmF5WzFdLFxuICAgICAgICAgIHlDbGFtcGVkID0gc2Nyb2xsQ2xhbXBZKHkpO1xuICAgICAgaXNUb3VjaCAmJiB5ICE9PSB5Q2xhbXBlZCAmJiAoc3RhcnRTY3JvbGxZICs9IHlDbGFtcGVkIC0geSk7XG4gICAgICBzY3JvbGxGdW5jWSh5Q2xhbXBlZCk7XG4gICAgfVxuXG4gICAgKGR5IHx8IGR4KSAmJiBfdXBkYXRlQWxsKCk7XG4gIH07XG5cbiAgdmFycy5vbkVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBfYWxsb3dOYXRpdmVQYW5uaW5nKHRhcmdldCwgbm9ybWFsaXplU2Nyb2xsWCA/IGZhbHNlIDogXCJ4XCIpO1xuXG4gICAgU2Nyb2xsVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKFwicmVmcmVzaFwiLCBvblJlc2l6ZSk7XG5cbiAgICBfYWRkTGlzdGVuZXIoX3dpbiwgXCJyZXNpemVcIiwgb25SZXNpemUpO1xuXG4gICAgaWYgKHNjcm9sbEZ1bmNZLnNtb290aCkge1xuICAgICAgc2Nyb2xsRnVuY1kudGFyZ2V0LnN0eWxlLnNjcm9sbEJlaGF2aW9yID0gXCJhdXRvXCI7XG4gICAgICBzY3JvbGxGdW5jWS5zbW9vdGggPSBzY3JvbGxGdW5jWC5zbW9vdGggPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpbnB1dE9ic2VydmVyLmVuYWJsZSgpO1xuICB9O1xuXG4gIHZhcnMub25EaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIF9hbGxvd05hdGl2ZVBhbm5pbmcodGFyZ2V0LCB0cnVlKTtcblxuICAgIF9yZW1vdmVMaXN0ZW5lcihfd2luLCBcInJlc2l6ZVwiLCBvblJlc2l6ZSk7XG5cbiAgICBTY3JvbGxUcmlnZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZWZyZXNoXCIsIG9uUmVzaXplKTtcbiAgICBpbnB1dE9ic2VydmVyLmtpbGwoKTtcbiAgfTtcblxuICB2YXJzLmxvY2tBeGlzID0gdmFycy5sb2NrQXhpcyAhPT0gZmFsc2U7XG4gIHNlbGYgPSBuZXcgT2JzZXJ2ZXIodmFycyk7XG4gIHNlbGYuaU9TID0gX2ZpeElPU0J1ZzsgLy8gdXNlZCBpbiB0aGUgT2JzZXJ2ZXIgZ2V0Q2FjaGVkU2Nyb2xsKCkgZnVuY3Rpb24gdG8gd29yayBhcm91bmQgYW4gaU9TIGJ1ZyB0aGF0IHdyZWFrcyBoYXZvYyB3aXRoIFRvdWNoRXZlbnQuY2xpZW50WSBpZiB3ZSBhbGxvdyBzY3JvbGwgdG8gZ28gYWxsIHRoZSB3YXkgYmFjayB0byAwLlxuXG4gIF9maXhJT1NCdWcgJiYgIXNjcm9sbEZ1bmNZKCkgJiYgc2Nyb2xsRnVuY1koMSk7IC8vIGlPUyBidWcgY2F1c2VzIGV2ZW50LmNsaWVudFkgdmFsdWVzIHRvIGZyZWFrIG91dCAod2lsZGx5IGluYWNjdXJhdGUpIGlmIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgZXhhY3RseSAwLlxuXG4gIF9maXhJT1NCdWcgJiYgZ3NhcC50aWNrZXIuYWRkKF9wYXNzVGhyb3VnaCk7IC8vIHByZXZlbnQgdGhlIHRpY2tlciBmcm9tIHNsZWVwaW5nXG5cbiAgb25TdG9wRGVsYXllZENhbGwgPSBzZWxmLl9kYztcbiAgdHdlZW4gPSBnc2FwLnRvKHNlbGYsIHtcbiAgICBlYXNlOiBcInBvd2VyNFwiLFxuICAgIHBhdXNlZDogdHJ1ZSxcbiAgICBpbmhlcml0OiBmYWxzZSxcbiAgICBzY3JvbGxYOiBub3JtYWxpem
8110VTY3JvbGxYID8gXCIrPTAuMVwiIDogXCIrPTBcIixcbiAgICBzY3JvbGxZOiBcIis9MC4xXCIsXG4gICAgbW9kaWZpZXJzOiB7XG4gICAgICBzY3JvbGxZOiBfaW50ZXJydXB0aW9uVHJhY2tlcihzY3JvbGxGdW5jWSwgc2Nyb2xsRnVuY1koKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHdlZW4ucGF1c2UoKTtcbiAgICAgIH0pXG4gICAgfSxcbiAgICBvblVwZGF0ZTogX3VwZGF0ZUFsbCxcbiAgICBvbkNvbXBsZXRlOiBvblN0b3BEZWxheWVkQ2FsbC52YXJzLm9uQ29tcGxldGVcbiAgfSk7IC8vIHdlIG5lZWQgdGhlIG1vZGlmaWVyIHRvIHNlbnNlIGlmIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYWx0ZXJlZCBvdXRzaWRlIG9mIHRoZSBtb21lbnR1bSB0d2VlbiAobGlrZSB3aXRoIGEgc2Nyb2xsVG8gdHdlZW4pIHNvIHdlIGNhbiBwYXVzZSgpIGl0IHRvIHByZXZlbnQgY29uZmxpY3RzLlxuXG4gIHJldHVybiBzZWxmO1xufTtcblxuU2Nyb2xsVHJpZ2dlci5zb3J0ID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgaWYgKF9pc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgcmV0dXJuIF90cmlnZ2Vycy5zb3J0KGZ1bmMpO1xuICB9XG5cbiAgdmFyIHNjcm9sbCA9IF93aW4ucGFnZVlPZmZzZXQgfHwgMDtcbiAgU2Nyb2xsVHJpZ2dlci5nZXRBbGwoKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuX3NvcnRZID0gdC50cmlnZ2VyID8gc2Nyb2xsICsgdC50cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA6IHQuc3RhcnQgKyBfd2luLmlubmVySGVpZ2h0O1xuICB9KTtcbiAgcmV0dXJuIF90cmlnZ2Vycy5zb3J0KGZ1bmMgfHwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gKGEudmFycy5yZWZyZXNoUHJpb3JpdHkgfHwgMCkgKiAtMWU2ICsgKGEudmFycy5jb250YWluZXJBbmltYXRpb24gPyAxZTYgOiBhLl9zb3J0WSkgLSAoKGIudmFycy5jb250YWluZXJBbmltYXRpb24gPyAxZTYgOiBiLl9zb3J0WSkgKyAoYi52YXJzLnJlZnJlc2hQcmlvcml0eSB8fCAwKSAqIC0xZTYpO1xuICB9KTsgLy8gYW55dGhpbmcgd2l0aCBhIGNvbnRhaW5lckFuaW1hdGlvbiBzaG91bGQgcmVmcmVzaCBsYXN0LlxufTtcblxuU2Nyb2xsVHJpZ2dlci5vYnNlcnZlID0gZnVuY3Rpb24gKHZhcnMpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZlcih2YXJzKTtcbn07XG5cblNjcm9sbFRyaWdnZXIubm9ybWFsaXplU2Nyb2xsID0gZnVuY3Rpb24gKHZhcnMpIHtcbiAgaWYgKHR5cGVvZiB2YXJzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIF9ub3JtYWxpemVyO1xuICB9XG5cbiAgaWYgKHZhcnMgPT09IHRydWUgJiYgX25vcm1hbGl6ZXIpIHtcbiAgICByZXR1cm4gX25vcm1hbGl6ZXIuZW5hYmxlKCk7XG4gIH1cblxuICBpZiAodmFycyA9PT0gZmFsc2UpIHtcbiAgICBfbm9ybWFsaXplciAmJiBfbm9ybWFsaXplci5raWxsKCk7XG4gICAgX25vcm1hbGl6ZXIgPSB2YXJzO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBub3JtYWxpemVyID0gdmFycyBpbnN0YW5jZW9mIE9ic2VydmVyID8gdmFycyA6IF9nZXRTY3JvbGxOb3JtYWxpemVyKHZhcnMpO1xuICBfbm9ybWFsaXplciAmJiBfbm9ybWFsaXplci50YXJnZXQgPT09IG5vcm1hbGl6ZXIudGFyZ2V0ICYmIF9ub3JtYWxpemVyLmtpbGwoKTtcbiAgX2lzVmlld3BvcnQobm9ybWFsaXplci50YXJnZXQpICYmIChfbm9ybWFsaXplciA9IG5vcm1hbGl6ZXIpO1xuICByZXR1cm4gbm9ybWFsaXplcjtcbn07XG5cblNjcm9sbFRyaWdnZXIuY29yZSA9IHtcbiAgLy8gc21hbGxlciBmaWxlIHNpemUgd2F5IHRvIGxldmVyYWdlIGluIFNjcm9sbFNtb290aGVyIGFuZCBPYnNlcnZlclxuICBfZ2V0VmVsb2NpdHlQcm9wOiBfZ2V0VmVsb2NpdHlQcm9wLFxuICBfaW5wdXRPYnNlcnZlcjogX2lucHV0T2JzZXJ2ZXIsXG4gIF9zY3JvbGxlcnM6IF9zY3JvbGxlcnMsXG4gIF9wcm94aWVzOiBfcHJveGllcyxcbiAgYnJpZGdlOiB7XG4gICAgLy8gd2hlbiBub3JtYWxpemVTY3JvbGwgc2V0cyB0aGUgc2Nyb2xsIHBvc2l0aW9uIChzcyA9IHNldFNjcm9sbClcbiAgICBzczogZnVuY3Rpb24gc3MoKSB7XG4gICAgICBfbGFzdFNjcm9sbFRpbWUgfHwgX2Rpc3BhdGNoKFwic2Nyb2xsU3RhcnRcIik7XG4gICAgICBfbGFzdFNjcm9sbFRpbWUgPSBfZ2V0VGltZSgpO1xuICAgIH0sXG4gICAgLy8gYSB3YXkgdG8gZ2V0IHRoZSBfcmVmcmVzaGluZyB2YWx1ZSBpbiBPYnNlcnZlclxuICAgIHJlZjogZnVuY3Rpb24gcmVmKCkge1xuICAgICAgcmV0dXJuIF9yZWZyZXNoaW5nO1xuICAgIH1cbiAgfVxufTtcbl9nZXRHU0FQKCkgJiYgZ3NhcC5yZWdpc3RlclBsdWdpbihTY3JvbGxUcmlnZ2VyKTtcbmV4cG9ydCB7IFNjcm9sbFRyaWdnZXIgYXMgZGVmYXVsdCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
8111//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/ScrollTrigger.js
8112
8113}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/gsap-core.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
8114/* harmony export */ __webpack_require__.d(__webpack_exports__, {
8115/* harmony export */   Animation: () => (/* binding */ Animation),
8116/* harmony export */   Back: () => (/* binding */ Back),
8117/* harmony export */   Bounce: () => (/* binding */ Bounce),
8118/* harmony export */   Circ: () => (/* binding */ Circ),
8119/* harmony export */   Cubic: () => (/* binding */ Cubic),
8120/* harmony export */   Elastic: () => (/* binding */ Elastic),
8121/* harmony export */   Expo: () => (/* binding */ Expo),
8122/* harmony export */   GSCache: () => (/* binding */ GSCache),
8123/* harmony export */   Linear: () => (/* binding */ Linear),
8124/* harmony export */   Power0: () => (/* binding */ Power0),
8125/* harmony export */   Power1: () => (/* binding */ Power1),
vendor: 5,881 bytes, lines 8126-8251
8126/* harmony export */   Power2: () => (/* binding */ Power2),
8127/* harmony export */   Power3: () => (/* binding */ Power3),
8128/* harmony export */   Power4: () => (/* binding */ Power4),
8129/* harmony export */   PropTween: () => (/* binding */ PropTween),
8130/* harmony export */   Quad: () => (/* binding */ Quad),
8131/* harmony export */   Quart: () => (/* binding */ Quart),
8132/* harmony export */   Quint: () => (/* binding */ Quint),
8133/* harmony export */   Sine: () => (/* binding */ Sine),
8134/* harmony export */   SteppedEase: () => (/* binding */ SteppedEase),
8135/* harmony export */   Strong: () => (/* binding */ Strong),
8136/* harmony export */   Timeline: () => (/* binding */ Timeline),
8137/* harmony export */   TimelineLite: () => (/* binding */ Timeline),
8138/* harmony export */   TimelineMax: () => (/* binding */ Timeline),
8139/* harmony export */   Tween: () => (/* binding */ Tween),
8140/* harmony export */   TweenLite: () => (/* binding */ Tween),
8141/* harmony export */   TweenMax: () => (/* binding */ Tween),
8142/* harmony export */   _checkPlugin: () => (/* binding */ _checkPlugin),
8143/* harmony export */   _colorExp: () => (/* binding */ _colorExp),
8144/* harmony export */   _colorStringFilter: () => (/* binding */ _colorStringFilter),
8145/* harmony export */   _config: () => (/* binding */ _config),
8146/* harmony export */   _forEachName: () => (/* binding */ _forEachName),
8147/* harmony export */   _getCache: () => (/* binding */ _getCache),
8148/* harmony export */   _getProperty: () => (/* binding */ _getProperty),
8149/* harmony export */   _getSetter: () => (/* binding */ _getSetter),
8150/* harmony export */   _isString: () => (/* binding */ _isString),
8151/* harmony export */   _isUndefined: () => (/* binding */ _isUndefined),
8152/* harmony export */   _missingPlugin: () => (/* binding */ _missingPlugin),
8153/* harmony export */   _numExp: () => (/* binding */ _numExp),
8154/* harmony export */   _numWithUnitExp: () => (/* binding */ _numWithUnitExp),
8155/* harmony export */   _parseRelative: () => (/* binding */ _parseRelative),
8156/* harmony export */   _plugins: () => (/* binding */ _plugins),
8157/* harmony export */   _relExp: () => (/* binding */ _relExp),
8158/* harmony export */   _removeLinkedListItem: () => (/* binding */ _removeLinkedListItem),
8159/* harmony export */   _renderComplexString: () => (/* binding */ _renderComplexString),
8160/* harmony export */   _replaceRandom: () => (/* binding */ _replaceRandom),
8161/* harmony export */   _round: () => (/* binding */ _round),
8162/* harmony export */   _roundModifier: () => (/* binding */ _roundModifier),
8163/* harmony export */   _setDefaults: () => (/* binding */ _setDefaults),
8164/* harmony export */   _sortPropTweensByPriority: () => (/* binding */ _sortPropTweensByPriority),
8165/* harmony export */   _ticker: () => (/* binding */ _ticker),
8166/* harmony export */   clamp: () => (/* binding */ clamp),
8167/* harmony export */   "default": () => (/* binding */ gsap),
8168/* harmony export */   distribute: () => (/* binding */ distribute),
8169/* harmony export */   getUnit: () => (/* binding */ getUnit),
8170/* harmony export */   gsap: () => (/* binding */ gsap),
8171/* harmony export */   interpolate: () => (/* binding */ interpolate),
8172/* harmony export */   mapRange: () => (/* binding */ mapRange),
8173/* harmony export */   normalize: () => (/* binding */ normalize),
8174/* harmony export */   pipe: () => (/* binding */ pipe),
8175/* harmony export */   random: () => (/* binding */ random),
8176/* harmony export */   selector: () => (/* binding */ selector),
8177/* harmony export */   shuffle: () => (/* binding */ shuffle),
8178/* harmony export */   snap: () => (/* binding */ snap),
8179/* harmony export */   splitColor: () => (/* binding */ splitColor),
8180/* harmony export */   toArray: () => (/* binding */ toArray),
8181/* harmony export */   unitize: () => (/* binding */ unitize),
8182/* harmony export */   wrap: () => (/* binding */ wrap),
8183/* harmony export */   wrapYoyo: () => (/* binding */ wrapYoyo)
8184/* harmony export */ });
8185function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
8186
8187function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
8188
8189/*!
8190 * GSAP 3.15.0
8191 * https://gsap.com
8192 *
8193 * @license Copyright 2008-2026, GreenSock. All rights reserved.
8194 * Subject to the terms at https://gsap.com/standard-license
8195 * @author: Jack Doyle, [email protected]
8196*/
8197
8198/* eslint-disable */
8199var _config = {
8200  autoSleep: 120,
8201  force3D: "auto",
8202  nullTargetWarn: 1,
8203  units: {
8204    lineHeight: ""
8205  }
8206},
8207    _defaults = {
8208  duration: .5,
8209  overwrite: false,
8210  delay: 0
8211},
8212    _suppressOverwrites,
8213    _reverting,
8214    _context,
8215    _bigNum = 1e8,
8216    _tinyNum = 1 / _bigNum,
8217    _2PI = Math.PI * 2,
8218    _HALF_PI = _2PI / 4,
8219    _gsID = 0,
8220    _sqrt = Math.sqrt,
8221    _cos = Math.cos,
8222    _sin = Math.sin,
8223    _isString = function _isString(value) {
8224  return typeof value === "string";
8225},
8226    _isFunction = function _isFunction(value) {
8227  return typeof value === "function";
8228},
8229    _isNumber = function _isNumber(value) {
8230  return typeof value === "number";
8231},
8232    _isUndefined = function _isUndefined(value) {
8233  return typeof value === "undefined";
8234},
8235    _isObject = function _isObject(value) {
8236  return typeof value === "object";
8237},
8238    _isNotFalse = function _isNotFalse(value) {
8239  return value !== false;
8240},
8241    _windowExists = function _windowExists() {
8242  return typeof window !== "undefined";
8243},
8244    _isFuncOrString = function _isFuncOrString(value) {
8245  return _isFunction(value) || _isString(value);
8246},
8247    _isTypedArray = typeof ArrayBuffer === "function" && ArrayBuffer.isView || function () {},
8248    // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView().
8249_isArray = Array.isArray,
8250    _randomExp = /random\\([^)]+\\)/g,
8251    _commaDelimExp = /,\\s*/g,
8252    _strictNumExp = /(?:-?\\.?\\d|\\.)+/gi,
8253    //only numbers (including negatives and decimals) but NOT relative values.
8254_numExp = /[-+=.]*\\d+[.e\\-+]*\\d*[e\\-+]*\\d*/g,
8255    //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.
8256_numWithUnitExp = /[-+=.]*\\d+[.e-]*\\d*[a-z%]*/g,
8257    _complexStringNumExp = /[-+=.]*\\d+\\.?\\d*(?:e-|e\\+)?\\d*/gi,
8258    //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too.
8259_relExp = /[+-]=-?[.\\d]+/,
8260    _delimitedValueExp = /[^,'"\\[\\]\\s]+/gi,
8261    // previously /[#\\-+.]*\\b[a-z\\d\\-=+%.]+/gi but didn't catch special characters.
8262_unitExp = /^[+\\-=e\\s\\d]*\\d+[.\\d]*([a-z]*|%)\
vendor: 44,728 bytes, lines 8262-9421
8262\s*$/i,
8263    _globalTimeline,
8264    _win,
8265    _coreInitted,
8266    _doc,
8267    _globals = {},
8268    _installScope = {},
8269    _coreReady,
8270    _install = function _install(scope) {
8271  return (_installScope = _merge(scope, _globals)) && gsap;
8272},
8273    _missingPlugin = function _missingPlugin(property, value) {
8274  return console.warn("Invalid property", property, "set to", value, "Missing plugin? gsap.registerPlugin()");
8275},
8276    _warn = function _warn(message, suppress) {
8277  return !suppress && console.warn(message);
8278},
8279    _addGlobal = function _addGlobal(name, obj) {
8280  return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals;
8281},
8282    _emptyFunc = function _emptyFunc() {
8283  return 0;
8284},
8285    _startAtRevertConfig = {
8286  suppressEvents: true,
8287  isStart: true,
8288  kill: false
8289},
8290    _revertConfigNoKill = {
8291  suppressEvents: true,
8292  kill: false
8293},
8294    _revertConfig = {
8295  suppressEvents: true
8296},
8297    _reservedProps = {},
8298    _lazyTweens = [],
8299    _lazyLookup = {},
8300    _lastRenderedFrame,
8301    _plugins = {},
8302    _effects = {},
8303    _nextGCFrame = 30,
8304    _harnessPlugins = [],
8305    _callbackNames = "",
8306    _harness = function _harness(targets) {
8307  var target = targets[0],
8308      harnessPlugin,
8309      i;
8310  _isObject(target) || _isFunction(target) || (targets = [targets]);
8311
8312  if (!(harnessPlugin = (target._gsap || {}).harness)) {
8313    // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization)
8314    i = _harnessPlugins.length;
8315
8316    while (i-- && !_harnessPlugins[i].targetTest(target)) {}
8317
8318    harnessPlugin = _harnessPlugins[i];
8319  }
8320
8321  i = targets.length;
8322
8323  while (i--) {
8324    targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1);
8325  }
8326
8327  return targets;
8328},
8329    _getCache = function _getCache(target) {
8330  return target._gsap || _harness(toArray(target))[0]._gsap;
8331},
8332    _getProperty = function _getProperty(target, property, v) {
8333  return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v;
8334},
8335    _forEachName = function _forEachName(names, func) {
8336  return (names = names.split(",")).forEach(func) || names;
8337},
8338    //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code).
8339_round = function _round(value) {
8340  return Math.round(value * 100000) / 100000 || 0;
8341},
8342    _roundPrecise = function _roundPrecise(value) {
8343  return Math.round(value * 10000000) / 10000000 || 0;
8344},
8345    // increased precision mostly for timing values.
8346_parseRelative = function _parseRelative(start, value) {
8347  var operator = value.charAt(0),
8348      end = parseFloat(value.substr(2));
8349  start = parseFloat(start);
8350  return operator === "+" ? start + end : operator === "-" ? start - end : operator === "*" ? start * end : start / end;
8351},
8352    _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) {
8353  //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search.
8354  var l = toFind.length,
8355      i = 0;
8356
8357  for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {}
8358
8359  return i < l;
8360},
8361    _lazyRender = function _lazyRender() {
8362  var l = _lazyTweens.length,
8363      a = _lazyTweens.slice(0),
8364      i,
8365      tween;
8366
8367  _lazyLookup = {};
8368  _lazyTweens.length = 0;
8369
8370  for (i = 0; i < l; i++) {
8371    tween = a[i];
8372    tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0);
8373  }
8374},
8375    _isRevertWorthy = function _isRevertWorthy(animation) {
8376  return !!(animation._initted || animation._startAt || animation.add);
8377},
8378    _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) {
8379  _lazyTweens.length && !_reverting && _lazyRender();
8380  animation.render(time, suppressEvents, force || !!(_reverting && time < 0 && _isRevertWorthy(animation)));
8381  _lazyTweens.length && !_reverting && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render.
8382},
8383    _numericIfPossible = function _numericIfPossible(value) {
8384  var n = parseFloat(value);
8385  return (n || n === 0) && (value + "").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value;
8386},
8387    _passThrough = function _passThrough(p) {
8388  return p;
8389},
8390    _setDefaults = function _setDefaults(obj, defaults) {
8391  for (var p in defaults) {
8392    p in obj || (obj[p] = defaults[p]);
8393  }
8394
8395  return obj;
8396},
8397    _setKeyframeDefaults = function _setKeyframeDefaults(excludeDuration) {
8398  return function (obj, defaults) {
8399    for (var p in defaults) {
8400      p in obj || p === "duration" && excludeDuration || p === "ease" || (obj[p] = defaults[p]);
8401    }
8402  };
8403},
8404    _merge = function _merge(base, toMerge) {
8405  for (var p in toMerge) {
8406    base[p] = toMerge[p];
8407  }
8408
8409  return base;
8410},
8411    _mergeDeep = function _mergeDeep(base, toMerge) {
8412  for (var p in toMerge) {
8413    p !== "__proto__" && p !== "constructor" && p !== "prototype" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]);
8414  }
8415
8416  return base;
8417},
8418    _copyExcluding = function _copyExcluding(obj, excluding) {
8419  var copy = {},
8420      p;
8421
8422  for (p in obj) {
8423    p in excluding || (copy[p] = obj[p]);
8424  }
8425
8426  return copy;
8427},
8428    _inheritDefaults = function _inheritDefaults(vars) {
8429  var parent = vars.parent || _globalTimeline,
8430      func = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults;
8431
8432  if (_isNotFalse(vars.inherit)) {
8433    while (parent) {
8434      func(vars, parent.vars.defaults);
8435      parent = parent.parent || parent._dp;
8436    }
8437  }
8438
8439  return vars;
8440},
8441    _arraysMatch = function _arraysMatch(a1, a2) {
8442  var i = a1.length,
8443      match = i === a2.length;
8444
8445  while (match && i-- && a1[i] === a2[i]) {}
8446
8447  return i < 0;
8448},
8449    _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) {
8450  if (firstProp === void 0) {
8451    firstProp = "_first";
8452  }
8453
8454  if (lastProp === void 0) {
8455    lastProp = "_last";
8456  }
8457
8458  var prev = parent[lastProp],
8459      t;
8460
8461  if (sortBy) {
8462    t = child[sortBy];
8463
8464    while (prev && prev[sortBy] > t) {
8465      prev = prev._prev;
8466    }
8467  }
8468
8469  if (prev) {
8470    child._next = prev._next;
8471    prev._next = child;
8472  } else {
8473    child._next = parent[firstProp];
8474    parent[firstProp] = child;
8475  }
8476
8477  if (child._next) {
8478    child._next._prev = child;
8479  } else {
8480    parent[lastProp] = child;
8481  }
8482
8483  child._prev = prev;
8484  child.parent = child._dp = parent;
8485  return child;
8486},
8487    _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) {
8488  if (firstProp === void 0) {
8489    firstProp = "_first";
8490  }
8491
8492  if (lastProp === void 0) {
8493    lastProp = "_last";
8494  }
8495
8496  var prev = child._prev,
8497      next = child._next;
8498
8499  if (prev) {
8500    prev._next = next;
8501  } else if (parent[firstProp] === child) {
8502    parent[firstProp] = next;
8503  }
8504
8505  if (next) {
8506    next._prev = prev;
8507  } else if (parent[lastProp] === child) {
8508    parent[lastProp] = prev;
8509  }
8510
8511  child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list.
8512},
8513    _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) {
8514  child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove && child.parent.remove(child);
8515  child._act = 0;
8516},
8517    _uncache = function _uncache(animation, child) {
8518  if (animation && (!child || child._end > animation._dur || child._start < 0)) {
8519    // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end)
8520    var a = animation;
8521
8522    while (a) {
8523      a._dirty = 1;
8524      a = a.parent;
8525    }
8526  }
8527
8528  return animation;
8529},
8530    _recacheAncestors = function _recacheAncestors(animation) {
8531  var parent = animation.parent;
8532
8533  while (parent && parent.parent) {
8534    //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though.
8535    parent._dirty = 1;
8536    parent.totalDuration();
8537    parent = parent.parent;
8538  }
8539
8540  return animation;
8541},
8542    _rewindStartAt = function _rewindStartAt(tween, totalTime, suppressEvents, force) {
8543  return tween._startAt && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween.vars.immediateRender && !tween.vars.autoRevert || tween._startAt.render(totalTime, true, force));
8544},
8545    _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) {
8546  return !animation || animation._ts && _hasNoPausedAncestors(animation.parent);
8547},
8548    _elapsedCycleDuration = function _elapsedCycleDuration(animation) {
8549  return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0;
8550},
8551    // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle.
8552_animationCycle = function _animationCycle(tTime, cycleDuration) {
8553  var whole = Math.floor(tTime = _roundPrecise(tTime / cycleDuration));
8554  return tTime && whole === tTime ? whole - 1 : whole;
8555},
8556    _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) {
8557  return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur);
8558},
8559    _setEnd = function _setEnd(animation) {
8560  return animation._end = _roundPrecise(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0));
8561},
8562    _alignPlayhead = function _alignPlayhead(animation, totalTime) {
8563  // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for.
8564  var parent = animation._dp;
8565
8566  if (parent && parent.smoothChildTiming && animation._ts) {
8567    animation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts));
8568
8569    _setEnd(animation);
8570
8571    parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here.
8572  }
8573
8574  return animation;
8575},
8576
8577/*
8578_totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => {
8579	let cycleDuration = duration + repeatDelay,
8580		time = _round(clampedTotalTime % cycleDuration);
8581	if (time > duration) {
8582		time = duration;
8583	}
8584	return (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time;
8585},
8586*/
8587_postAddChecks = function _postAddChecks(timeline, child) {
8588  var t;
8589
8590  if (child._time || !child._dur && child._initted || child._start < timeline._time && (child._dur || !child.add)) {
8591    // in case, for example, the _start is moved on a tween that has already rendered, or if it's being inserted into a timeline BEFORE where the playhead is currently. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning. Special case: if it's a timeline (has .add() method) and no duration, we can skip rendering because the user may be populating it AFTER adding it to a parent timeline (unconventional, but possible, and we wouldn't want it to get removed if the parent's autoRemoveChildren is true).
8592    t = _parentToChildTotalTime(timeline.rawTime(), child);
8593
8594    if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) {
8595      child.render(t, true);
8596    }
8597  } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.
8598
8599
8600  if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) {
8601    //in case any of the ancestors had completed but should now be enabled...
8602    if (timeline._dur < timeline.duration()) {
8603      t = timeline;
8604
8605      while (t._dp) {
8606        t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead.
8607
8608        t = t._dp;
8609      }
8610    }
8611
8612    timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order.
8613  }
8614},
8615    _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) {
8616  child.parent && _removeFromParent(child);
8617  child._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay);
8618  child._end = _roundPrecise(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0));
8619
8620  _addLinkedListItem(timeline, child, "_first", "_last", timeline._sort ? "_start" : 0);
8621
8622  _isFromOrFromStart(child) || (timeline._recent = child);
8623  skipChecks || _postAddChecks(timeline, child);
8624  timeline._ts < 0 && _alignPlayhead(timeline, timeline._tTime); // if the timeline is reversed and the new child makes it longer, we may need to adjust the parent's _start (push it back)
8625
8626  return timeline;
8627},
8628    _scrollTrigger = function _scrollTrigger(animation, trigger) {
8629  return (_globals.ScrollTrigger || _missingPlugin("scrollTrigger", trigger)) && _globals.ScrollTrigger.create(trigger, animation);
8630},
8631    _attemptInitTween = function _attemptInitTween(tween, time, force, suppressEvents, tTime) {
8632  _initTween(tween, time, tTime);
8633
8634  if (!tween._initted) {
8635    return 1;
8636  }
8637
8638  if (!force && tween._pt && !_reverting && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) {
8639    _lazyTweens.push(tween);
8640
8641    tween._lazy = [tTime, suppressEvents];
8642    return 1;
8643  }
8644},
8645    _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) {
8646  var parent = _ref.parent;
8647  return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent));
8648},
8649    // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0
8650_isFromOrFromStart = function _isFromOrFromStart(_ref2) {
8651  var data = _ref2.data;
8652  return data === "isFromStart" || data === "isStart";
8653},
8654    _renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) {
8655  var prevRatio = tween.ratio,
8656      ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween)) || (tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)) ? 0 : 1,
8657      // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. Edge case: if a from() or fromTo() stagger tween is placed later in a timeline, the "startAt" zero-duration tween could initially render at a time when the parent timeline's playhead is technically BEFORE where this tween is, so make sure that any "from" and "fromTo" startAt tweens are rendered the first time at a ratio of 1.
8658  repeatDelay = tween._rDelay,
8659      tTime = 0,
8660      pt,
8661      iteration,
8662      prevIteration;
8663
8664  if (repeatDelay && tween._repeat) {
8665    // in case there's a zero-duration tween that has a repeat with a repeatDelay
8666    tTime = _clamp(0, tween._tDur, totalTime);
8667    iteration = _animationCycle(tTime, repeatDelay);
8668    tween._yoyo && iteration & 1 && (ratio = 1 - ratio);
8669
8670    if (iteration !== _animationCycle(tween._tTime, repeatDelay)) {
8671      // if iteration changed
8672      prevRatio = 1 - ratio;
8673      tween.vars.repeatRefresh && tween._initted && tween.invalidate();
8674    }
8675  }
8676
8677  if (ratio !== prevRatio || _reverting || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) {
8678    if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents, tTime)) {
8679      // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.
8680      return;
8681    }
8682
8683    prevIteration = tween._zTime;
8684    tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.
8685
8686    suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates.
8687
8688    tween.ratio = ratio;
8689    tween._from && (ratio = 1 - ratio);
8690    tween._time = 0;
8691    tween._tTime = tTime;
8692    pt = tween._pt;
8693
8694    while (pt) {
8695      pt.r(ratio, pt.d);
8696      pt = pt._next;
8697    }
8698
8699    totalTime < 0 && _rewindStartAt(tween, totalTime, suppressEvents, true);
8700    tween._onUpdate && !suppressEvents && _callback(tween, "onUpdate");
8701    tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, "onRepeat");
8702
8703    if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) {
8704      ratio && _removeFromParent(tween, 1);
8705
8706      if (!suppressEvents && !_reverting) {
8707        _callback(tween, ratio ? "onComplete" : "onReverseComplete", true);
8708
8709        tween._prom && tween._prom();
8710      }
8711    }
8712  } else if (!tween._zTime) {
8713    tween._zTime = totalTime;
8714  }
8715},
8716    _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) {
8717  var child;
8718
8719  if (time > prevTime) {
8720    child = animation._first;
8721
8722    while (child && child._start <= time) {
8723      if (child.data === "isPause" && child._start > prevTime) {
8724        return child;
8725      }
8726
8727      child = child._next;
8728    }
8729  } else {
8730    child = animation._last;
8731
8732    while (child && child._start >= time) {
8733      if (child.data === "isPause" && child._start < prevTime) {
8734        return child;
8735      }
8736
8737      child = child._prev;
8738    }
8739  }
8740},
8741    _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) {
8742  var repeat = animation._repeat,
8743      dur = _roundPrecise(duration) || 0,
8744      totalProgress = animation._tTime / animation._tDur;
8745  totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur);
8746  animation._dur = dur;
8747  animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + animation._rDelay * repeat);
8748  totalProgress > 0 && !leavePlayhead && _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress);
8749  animation.parent && _setEnd(animation);
8750  skipUncache || _uncache(animation.parent, animation);
8751  return animation;
8752},
8753    _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) {
8754  return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur);
8755},
8756    _zeroPosition = {
8757  _start: 0,
8758  endTime: _emptyFunc,
8759  totalDuration: _emptyFunc
8760},
8761    _parsePosition = function _parsePosition(animation, position, percentAnimation) {
8762  var labels = animation.labels,
8763      recent = animation._recent || _zeroPosition,
8764      clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur,
8765      //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead.
8766  i,
8767      offset,
8768      isPercent;
8769
8770  if (_isString(position) && (isNaN(position) || position in labels)) {
8771    //if the string is a number like "1", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).
8772    offset = position.charAt(0);
8773    isPercent = position.substr(-1) === "%";
8774    i = position.indexOf("=");
8775
8776    if (offset === "<" || offset === ">") {
8777      i >= 0 && (position = position.replace(/=/, ""));
8778      return (offset === "<" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1);
8779    }
8780
8781    if (i < 0) {
8782      position in labels || (labels[position] = clippedDuration);
8783      return labels[position];
8784    }
8785
8786    offset = parseFloat(position.charAt(i - 1) + position.substr(i + 1));
8787
8788    if (isPercent && percentAnimation) {
8789      offset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration();
8790    }
8791
8792    return i > 1 ? _parsePosition(animation, position.substr(0, i - 1), percentAnimation) + offset : clippedDuration + offset;
8793  }
8794
8795  return position == null ? clippedDuration : +position;
8796},
8797    _createTweenType = function _createTweenType(type, params, timeline) {
8798  var isLegacy = _isNumber(params[1]),
8799      varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1),
8800      vars = params[varsIndex],
8801      irVars,
8802      parent;
8803
8804  isLegacy && (vars.duration = params[1]);
8805  vars.parent = timeline;
8806
8807  if (type) {
8808    irVars = vars;
8809    parent = timeline;
8810
8811    while (parent && !("immediateRender" in irVars)) {
8812      // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed.
8813      irVars = parent.vars.defaults || {};
8814      parent = _isNotFalse(parent.vars.inherit) && parent.parent;
8815    }
8816
8817    vars.immediateRender = _isNotFalse(irVars.immediateRender);
8818    type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // "from" vars
8819  }
8820
8821  return new Tween(params[0], vars, params[varsIndex + 1]);
8822},
8823    _conditionalReturn = function _conditionalReturn(value, func) {
8824  return value || value === 0 ? func(value) : func;
8825},
8826    _clamp = function _clamp(min, max, value) {
8827  return value < min ? min : value > max ? max : value;
8828},
8829    getUnit = function getUnit(value, v) {
8830  return !_isString(value) || !(v = _unitExp.exec(value)) ? "" : v[1];
8831},
8832    // note: protect against padded numbers as strings, like "100.100". That shouldn't return "00" as the unit. If it's numeric, return no unit.
8833clamp = function clamp(min, max, value) {
8834  return _conditionalReturn(value, function (v) {
8835    return _clamp(min, max, v);
8836  });
8837},
8838    _slice = [].slice,
8839    _isArrayLike = function _isArrayLike(value, nonEmpty) {
8840  return value && _isObject(value) && "length" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win;
8841},
8842    _flatten = function _flatten(ar, leaveStrings, accumulator) {
8843  if (accumulator === void 0) {
8844    accumulator = [];
8845  }
8846
8847  return ar.forEach(function (value) {
8848    var _accumulator;
8849
8850    return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value);
8851  }) || accumulator;
8852},
8853    // takes any value and returns an Array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects.
8854toArray = function toArray(value, scope, leaveStrings) {
8855  return _context && !scope && _context.selector ? _context.selector(value) : _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : [];
8856},
8857    selector = function selector(value) {
8858  value = toArray(value)[0] || _warn("Invalid scope") || {};
8859  return function (v) {
8860    var el = value.current || value.nativeElement || value;
8861    return toArray(v, el.querySelectorAll ? el : el === value ? _warn("Invalid scope") || _doc.createElement("div") : value);
8862  };
8863},
8864    shuffle = function shuffle(a) {
8865  return a.sort(function () {
8866    return .5 - Math.random();
8867  });
8868},
8869    // alternative that's a bit faster and more reliably diverse but bigger:   for (let j, v, i = a.length; i; j = (Math.random() * i) | 0, v = a[--i], a[i] = a[j], a[j] = v); return a;
8870// for distributing values across an Array. Can accept a number, a function or (most commonly) an object which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array.
8871distribute = function distribute(v) {
8872  if (_isFunction(v)) {
8873    return v;
8874  }
8875
8876  var vars = _isObject(v) ? v : {
8877    each: v
8878  },
8879      //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total "amount" that's chunked out among them all.
8880  ease = _parseEase(vars.ease),
8881      from = vars.from || 0,
8882      base = parseFloat(vars.base) || 0,
8883      cache = {},
8884      isDecimal = from > 0 && from < 1,
8885      ratios = isNaN(from) || isDecimal,
8886      axis = vars.axis,
8887      ratioX = from,
8888      ratioY = from;
8889
8890  if (_isString(from)) {
8891    ratioX = ratioY = {
8892      center: .5,
8893      edges: .5,
8894      end: 1
8895    }[from] || 0;
8896  } else if (!isDecimal && ratios) {
8897    ratioX = from[0];
8898    ratioY = from[1];
8899  }
8900
8901  return function (i, target, a) {
8902    var l = (a || vars).length,
8903        distances = cache[l],
8904        originX,
8905        originY,
8906        x,
8907        y,
8908        d,
8909        j,
8910        max,
8911        min,
8912        wrapAt;
8913
8914    if (!distances) {
8915      wrapAt = vars.grid === "auto" ? 0 : (vars.grid || [1, _bigNum])[1];
8916
8917      if (!wrapAt) {
8918        max = -_bigNum;
8919
8920        while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {}
8921
8922        wrapAt < l && wrapAt--;
8923      }
8924
8925      distances = cache[l] = [];
8926      originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt;
8927      originY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0;
8928      max = 0;
8929      min = _bigNum;
8930
8931      for (j = 0; j < l; j++) {
8932        x = j % wrapAt - originX;
8933        y = originY - (j / wrapAt | 0);
8934        distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === "y" ? y : x);
8935        d > max && (max = d);
8936        d < min && (min = d);
8937      }
8938
8939      from === "random" && shuffle(distances);
8940      distances.max = max - min;
8941      distances.min = min;
8942      distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === "y" ? l / wrapAt : wrapAt) || 0) * (from === "edges" ? -1 : 1);
8943      distances.b = l < 0 ? base - l : base;
8944      distances.u = getUnit(vars.amount || vars.each) || 0; //unit
8945
8946      ease = ease && l < 0 ? _invertEase(ease) : ease;
8947    }
8948
8949    l = (distances[i] - distances.min) / distances.max || 0;
8950    return _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors
8951  };
8952},
8953    _roundModifier = function _roundModifier(v) {
8954  //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc.
8955  var p = Math.pow(10, ((v + "").split(".")[1] || "").length); //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed())
8956
8957  return function (raw) {
8958    var n = _roundPrecise(Math.round(parseFloat(raw) / v) * v * p);
8959
8960    return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151!
8961  };
8962},
8963    snap = function snap(snapTo, value) {
8964  var isArray = _isArray(snapTo),
8965      radius,
8966      is2D;
8967
8968  if (!isArray && _isObject(snapTo)) {
8969    radius = isArray = snapTo.radius || _bigNum;
8970
8971    if (snapTo.values) {
8972      snapTo = toArray(snapTo.values);
8973
8974      if (is2D = !_isNumber(snapTo[0])) {
8975        radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop.
8976      }
8977    } else {
8978      snapTo = _roundModifier(snapTo.increment);
8979    }
8980  }
8981
8982  return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) {
8983    is2D = snapTo(raw);
8984    return Math.abs(is2D - raw) <= radius ? is2D : raw;
8985  } : function (raw) {
8986    var x = parseFloat(is2D ? raw.x : raw),
8987        y = parseFloat(is2D ? raw.y : 0),
8988        min = _bigNum,
8989        closest = 0,
8990        i = snapTo.length,
8991        dx,
8992        dy;
8993
8994    while (i--) {
8995      if (is2D) {
8996        dx = snapTo[i].x - x;
8997        dy = snapTo[i].y - y;
8998        dx = dx * dx + dy * dy;
8999      } else {
9000        dx = Math.abs(snapTo[i] - x);
9001      }
9002
9003      if (dx < min) {
9004        min = dx;
9005        closest = i;
9006      }
9007    }
9008
9009    closest = !radius || min <= radius ? snapTo[closest] : raw;
9010    return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw);
9011  });
9012},
9013    random = function random(min, max, roundingIncrement, returnFunction) {
9014  return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () {
9015    return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + "").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction;
9016  });
9017},
9018    pipe = function pipe() {
9019  for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) {
9020    functions[_key] = arguments[_key];
9021  }
9022
9023  return function (value) {
9024    return functions.reduce(function (v, f) {
9025      return f(v);
9026    }, value);
9027  };
9028},
9029    unitize = function unitize(func, unit) {
9030  return function (value) {
9031    return func(parseFloat(value)) + (unit || getUnit(value));
9032  };
9033},
9034    normalize = function normalize(min, max, value) {
9035  return mapRange(min, max, 0, 1, value);
9036},
9037    _wrapArray = function _wrapArray(a, wrapper, value) {
9038  return _conditionalReturn(value, function (index) {
9039    return a[~~wrapper(index)];
9040  });
9041},
9042    wrap = function wrap(min, max, value) {
9043  // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP).
9044  var range = max - min;
9045  return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) {
9046    return (range + (value - min) % range) % range + min;
9047  });
9048},
9049    wrapYoyo = function wrapYoyo(min, max, value) {
9050  var range = max - min,
9051      total = range * 2;
9052  return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) {
9053    value = (total + (value - min) % total) % total || 0;
9054    return min + (value > range ? total - value : value);
9055  });
9056},
9057    _replaceRandom = function _replaceRandom(s) {
9058  return s.replace(_randomExp, function (match) {
9059    //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500])
9060    var arIndex = match.indexOf("[") + 1,
9061        values = match.substring(arIndex || 7, arIndex ? match.indexOf("]") : match.length - 1).split(_commaDelimExp);
9062    return random(arIndex ? values : +values[0], arIndex ? 0 : +values[1], +values[2] || 1e-5);
9063  });
9064},
9065    mapRange = function mapRange(inMin, inMax, outMin, outMax, value) {
9066  var inRange = inMax - inMin,
9067      outRange = outMax - outMin;
9068  return _conditionalReturn(value, function (value) {
9069    return outMin + ((value - inMin) / inRange * outRange || 0);
9070  });
9071},
9072    interpolate = function interpolate(start, end, progress, mutate) {
9073  var func = isNaN(start + end) ? 0 : function (p) {
9074    return (1 - p) * start + p * end;
9075  };
9076
9077  if (!func) {
9078    var isString = _isString(start),
9079        master = {},
9080        p,
9081        i,
9082        interpolators,
9083        l,
9084        il;
9085
9086    progress === true && (mutate = 1) && (progress = null);
9087
9088    if (isString) {
9089      start = {
9090        p: start
9091      };
9092      end = {
9093        p: end
9094      };
9095    } else if (_isArray(start) && !_isArray(end)) {
9096      interpolators = [];
9097      l = start.length;
9098      il = l - 2;
9099
9100      for (i = 1; i < l; i++) {
9101        interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them.
9102      }
9103
9104      l--;
9105
9106      func = function func(p) {
9107        p *= l;
9108        var i = Math.min(il, ~~p);
9109        return interpolators[i](p - i);
9110      };
9111
9112      progress = end;
9113    } else if (!mutate) {
9114      start = _merge(_isArray(start) ? [] : {}, start);
9115    }
9116
9117    if (!interpolators) {
9118      for (p in end) {
9119        _addPropTween.call(master, start, p, "get", end[p]);
9120      }
9121
9122      func = function func(p) {
9123        return _renderPropTweens(p, master) || (isString ? start.p : start);
9124      };
9125    }
9126  }
9127
9128  return _conditionalReturn(progress, func);
9129},
9130    _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) {
9131  //used for nextLabel() and previousLabel()
9132  var labels = timeline.labels,
9133      min = _bigNum,
9134      p,
9135      distance,
9136      label;
9137
9138  for (p in labels) {
9139    distance = labels[p] - fromTime;
9140
9141    if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) {
9142      label = p;
9143      min = distance;
9144    }
9145  }
9146
9147  return label;
9148},
9149    _callback = function _callback(animation, type, executeLazyFirst) {
9150  var v = animation.vars,
9151      callback = v[type],
9152      prevContext = _context,
9153      context = animation._ctx,
9154      params,
9155      scope,
9156      result;
9157
9158  if (!callback) {
9159    return;
9160  }
9161
9162  params = v[type + "Params"];
9163  scope = v.callbackScope || animation;
9164  executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.
9165
9166  context && (_context = context);
9167  result = params ? callback.apply(scope, params) : callback.call(scope);
9168  _context = prevContext;
9169  return result;
9170},
9171    _interrupt = function _interrupt(animation) {
9172  _removeFromParent(animation);
9173
9174  animation.scrollTrigger && animation.scrollTrigger.kill(!!_reverting);
9175  animation.progress() < 1 && _callback(animation, "onInterrupt");
9176  return animation;
9177},
9178    _quickTween,
9179    _registerPluginQueue = [],
9180    _createPlugin = function _createPlugin(config) {
9181  if (!config) return;
9182  config = !config.name && config["default"] || config; // UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}.
9183
9184  if (_windowExists() || config.headless) {
9185    // edge case: some build tools may pass in a null/undefined value
9186    var name = config.name,
9187        isFunc = _isFunction(config),
9188        Plugin = name && !isFunc && config.init ? function () {
9189      this._props = [];
9190    } : config,
9191        //in case someone passes in an object that's not a plugin, like CustomEase
9192    instanceDefaults = {
9193      init: _emptyFunc,
9194      render: _renderPropTweens,
9195      add: _addPropTween,
9196      kill: _killPropTweensOf,
9197      modifier: _addPluginModifier,
9198      rawVars: 0
9199    },
9200        statics = {
9201      targetTest: 0,
9202      get: 0,
9203      getSetter: _getSetter,
9204      aliases: {},
9205      register: 0
9206    };
9207
9208    _wake();
9209
9210    if (config !== Plugin) {
9211      if (_plugins[name]) {
9212        return;
9213      }
9214
9215      _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods
9216
9217
9218      _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods
9219
9220
9221      _plugins[Plugin.prop = name] = Plugin;
9222
9223      if (config.targetTest) {
9224        _harnessPlugins.push(Plugin);
9225
9226        _reservedProps[name] = 1;
9227      }
9228
9229      name = (name === "css" ? "CSS" : name.charAt(0).toUpperCase() + name.substr(1)) + "Plugin"; //for the global name. "motionPath" should become MotionPathPlugin
9230    }
9231
9232    _addGlobal(name, Plugin);
9233
9234    config.register && config.register(gsap, Plugin, PropTween);
9235  } else {
9236    _registerPluginQueue.push(config);
9237  }
9238},
9239
9240/*
9241 * --------------------------------------------------------------------------------------
9242 * COLORS
9243 * --------------------------------------------------------------------------------------
9244 */
9245_255 = 255,
9246    _colorLookup = {
9247  aqua: [0, _255, _255],
9248  lime: [0, _255, 0],
9249  silver: [192, 192, 192],
9250  black: [0, 0, 0],
9251  maroon: [128, 0, 0],
9252  teal: [0, 128, 128],
9253  blue: [0, 0, _255],
9254  navy: [0, 0, 128],
9255  white: [_255, _255, _255],
9256  olive: [128, 128, 0],
9257  yellow: [_255, _255, 0],
9258  orange: [_255, 165, 0],
9259  gray: [128, 128, 128],
9260  purple: [128, 0, 128],
9261  green: [0, 128, 0],
9262  red: [_255, 0, 0],
9263  pink: [_255, 192, 203],
9264  cyan: [0, _255, _255],
9265  transparent: [_255, _255, _255, 0]
9266},
9267    // possible future idea to replace the hard-coded color name values - put this in the ticker.wake() where we set the _doc:
9268// let ctx = _doc.createElement("canvas").getContext("2d");
9269// _forEachName("aqua,lime,silver,black,maroon,teal,blue,navy,white,olive,yellow,orange,gray,purple,green,red,pink,cyan", color => {ctx.fillStyle = color; _colorLookup[color] = splitColor(ctx.fillStyle)});
9270_hue = function _hue(h, m1, m2) {
9271  h += h < 0 ? 1 : h > 1 ? -1 : 0;
9272  return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0;
9273},
9274    splitColor = function splitColor(v, toHSL, forceAlpha) {
9275  var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0,
9276      r,
9277      g,
9278      b,
9279      h,
9280      s,
9281      l,
9282      max,
9283      min,
9284      d,
9285      wasHSL;
9286
9287  if (!a) {
9288    if (v.substr(-1) === ",") {
9289      //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)" - in this example "blue," has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.
9290      v = v.substr(0, v.length - 1);
9291    }
9292
9293    if (_colorLookup[v]) {
9294      a = _colorLookup[v];
9295    } else if (v.charAt(0) === "#") {
9296      if (v.length < 6) {
9297        //for shorthand like #9F0 or #9F0F (could have alpha)
9298        r = v.charAt(1);
9299        g = v.charAt(2);
9300        b = v.charAt(3);
9301        v = "#" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : "");
9302      }
9303
9304      if (v.length === 9) {
9305        // hex with alpha, like #fd5e53ff
9306        a = parseInt(v.substr(1, 6), 16);
9307        return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255];
9308      }
9309
9310      v = parseInt(v.substr(1), 16);
9311      a = [v >> 16, v >> 8 & _255, v & _255];
9312    } else if (v.substr(0, 3) === "hsl") {
9313      a = wasHSL = v.match(_strictNumExp);
9314
9315      if (!toHSL) {
9316        h = +a[0] % 360 / 360;
9317        s = +a[1] / 100;
9318        l = +a[2] / 100;
9319        g = l <= .5 ? l * (s + 1) : l + s - l * s;
9320        r = l * 2 - g;
9321        a.length > 3 && (a[3] *= 1); //cast as number
9322
9323        a[0] = _hue(h + 1 / 3, r, g);
9324        a[1] = _hue(h, r, g);
9325        a[2] = _hue(h - 1 / 3, r, g);
9326      } else if (~v.indexOf("=")) {
9327        //if relative values are found, just return the raw strings with the relative prefixes in place.
9328        a = v.match(_numExp);
9329        forceAlpha && a.length < 4 && (a[3] = 1);
9330        return a;
9331      }
9332    } else {
9333      a = v.match(_strictNumExp) || _colorLookup.transparent;
9334    }
9335
9336    a = a.map(Number);
9337  }
9338
9339  if (toHSL && !wasHSL) {
9340    r = a[0] / _255;
9341    g = a[1] / _255;
9342    b = a[2] / _255;
9343    max = Math.max(r, g, b);
9344    min = Math.min(r, g, b);
9345    l = (max + min) / 2;
9346
9347    if (max === min) {
9348      h = s = 0;
9349    } else {
9350      d = max - min;
9351      s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
9352      h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;
9353      h *= 60;
9354    }
9355
9356    a[0] = ~~(h + .5);
9357    a[1] = ~~(s * 100 + .5);
9358    a[2] = ~~(l * 100 + .5);
9359  }
9360
9361  forceAlpha && a.length < 4 && (a[3] = 1);
9362  return a;
9363},
9364    _colorOrderData = function _colorOrderData(v) {
9365  // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a "c" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors()
9366  var values = [],
9367      c = [],
9368      i = -1;
9369  v.split(_colorExp).forEach(function (v) {
9370    var a = v.match(_numWithUnitExp) || [];
9371    values.push.apply(values, a);
9372    c.push(i += a.length + 1);
9373  });
9374  values.c = c;
9375  return values;
9376},
9377    _formatColors = function _formatColors(s, toHSL, orderMatchData) {
9378  var result = "",
9379      colors = (s + result).match(_colorExp),
9380      type = toHSL ? "hsla(" : "rgba(",
9381      i = 0,
9382      c,
9383      shell,
9384      d,
9385      l;
9386
9387  if (!colors) {
9388    return s;
9389  }
9390
9391  colors = colors.map(function (color) {
9392    return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + "," + color[1] + "%," + color[2] + "%," + color[3] : color.join(",")) + ")";
9393  });
9394
9395  if (orderMatchData) {
9396    d = _colorOrderData(s);
9397    c = orderMatchData.c;
9398
9399    if (c.join(result) !== d.c.join(result)) {
9400      shell = s.replace(_colorExp, "1").split(_numWithUnitExp);
9401      l = shell.length - 1;
9402
9403      for (; i < l; i++) {
9404        result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + "0,0,0,0)" : (d.length ? d : colors.length ? colors : orderMatchData).shift());
9405      }
9406    }
9407  }
9408
9409  if (!shell) {
9410    shell = s.split(_colorExp);
9411    l = shell.length - 1;
9412
9413    for (; i < l; i++) {
9414      result += shell[i] + colors[i];
9415    }
9416  }
9417
9418  return result + shell[l];
9419},
9420    _colorExp = function () {
9421  var s = "(?:\\
9421\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#(?:[0-9a-f]{3,4}){1,2}\\\\b",
9422      //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.,
9423  p;
9424
9425  for (p in _colorLookup) {
9426    s += "|" + p + "\\\\b";
9427  }
9428
9429  return new RegExp(s + ")", "gi");
9430}(),
9431    _hslExp = /hsl[a]?\\(/,
9432    _colorStringFilter = function _colorStringFilter(a) {
9433  var combined = a.join(" "),
9434      toHSL;
9435  _colorExp.lastIndex = 0;
9436
9437  if (_colorExp.test(combined)) {
9438    toHSL = _hslExp.test(combined);
9439    a[1] = _formatColors(a[1], toHSL);
9440    a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value.
9441
9442    return true;
9443  }
9444},
9445
9446/*
9447 * --------------------------------------------------------------------------------------
9448 * TICKER
9449 * --------------------------------------------------------------------------------------
9450 */
9451_tickerActive,
9452    _ticker = function () {
9453  var _getTime = Date.now,
9454      _lagThreshold = 500,
9455      _adjustedLag = 33,
9456      _startTime = _getTime(),
9457      _lastUpdate = _startTime,
9458      _gap = 1000 / 240,
9459      _nextTime = _gap,
9460      _listeners = [],
9461      _id,
9462      _req,
9463      _raf,
9464      _self,
9465      _delta,
9466      _i,
9467      _tick = function _tick(v) {
vendor: 3,476 bytes, lines 9468-9579
9468    var elapsed = _getTime() - _lastUpdate,
9469        manual = v === true,
9470        overlap,
9471        dispatch,
9472        time,
9473        frame;
9474
9475    (elapsed > _lagThreshold || elapsed < 0) && (_startTime += elapsed - _adjustedLag);
9476    _lastUpdate += elapsed;
9477    time = _lastUpdate - _startTime;
9478    overlap = time - _nextTime;
9479
9480    if (overlap > 0 || manual) {
9481      frame = ++_self.frame;
9482      _delta = time - _self.time * 1000;
9483      _self.time = time = time / 1000;
9484      _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap);
9485      dispatch = 1;
9486    }
9487
9488    manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the "tick" event so that timing is maintained. Otherwise, if processing the "tick" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise.
9489
9490    if (dispatch) {
9491      for (_i = 0; _i < _listeners.length; _i++) {
9492        // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop.
9493        _listeners[_i](time, _delta, frame, v);
9494      }
9495    }
9496  };
9497
9498  _self = {
9499    time: 0,
9500    frame: 0,
9501    tick: function tick() {
9502      _tick(true);
9503    },
9504    deltaRatio: function deltaRatio(fps) {
9505      return _delta / (1000 / (fps || 60));
9506    },
9507    wake: function wake() {
9508      if (_coreReady) {
9509        if (!_coreInitted && _windowExists()) {
9510          _win = _coreInitted = window;
9511          _doc = _win.document || {};
9512          _globals.gsap = gsap;
9513          (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version);
9514
9515          _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {});
9516
9517          _registerPluginQueue.forEach(_createPlugin);
9518        }
9519
9520        _raf = typeof requestAnimationFrame !== "undefined" && requestAnimationFrame;
9521        _id && _self.sleep();
9522
9523        _req = _raf || function (f) {
9524          return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0);
9525        };
9526
9527        _tickerActive = 1;
9528
9529        _tick(2);
9530      }
9531    },
9532    sleep: function sleep() {
9533      (_raf ? cancelAnimationFrame : clearTimeout)(_id);
9534      _tickerActive = 0;
9535      _req = _emptyFunc;
9536    },
9537    lagSmoothing: function lagSmoothing(threshold, adjustedLag) {
9538      _lagThreshold = threshold || Infinity; // zero should be interpreted as basically unlimited
9539
9540      _adjustedLag = Math.min(adjustedLag || 33, _lagThreshold);
9541    },
9542    fps: function fps(_fps) {
9543      _gap = 1000 / (_fps || 240);
9544      _nextTime = _self.time * 1000 + _gap;
9545    },
9546    add: function add(callback, once, prioritize) {
9547      var func = once ? function (t, d, f, v) {
9548        callback(t, d, f, v);
9549
9550        _self.remove(func);
9551      } : callback;
9552
9553      _self.remove(callback);
9554
9555      _listeners[prioritize ? "unshift" : "push"](func);
9556
9557      _wake();
9558
9559      return func;
9560    },
9561    remove: function remove(callback, i) {
9562      ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--;
9563    },
9564    _listeners: _listeners
9565  };
9566  return _self;
9567}(),
9568    _wake = function _wake() {
9569  return !_tickerActive && _ticker.wake();
9570},
9571    //also ensures the core classes are initialized.
9572
9573/*
9574* -------------------------------------------------
9575* EASING
9576* -------------------------------------------------
9577*/
9578_easeMap = {},
9579    _customEaseExp = /^[\\d.\\-M][\\d.\\-,\
vendor: 7,316 bytes, lines 9579-9782
9579\s]/,
9580    _quotesExp = /["']/g,
9581    _parseObjectInString = function _parseObjectInString(value) {
9582  //takes a string like "{wiggles:10, type:anticipate})" and turns it into a real object. Notice it ends in ")" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability.
9583  var obj = {},
9584      split = value.substr(1, value.length - 3).split(":"),
9585      key = split[0],
9586      i = 1,
9587      l = split.length,
9588      index,
9589      val,
9590      parsedVal;
9591
9592  for (; i < l; i++) {
9593    val = split[i];
9594    index = i !== l - 1 ? val.lastIndexOf(",") : val.length;
9595    parsedVal = val.substr(0, index);
9596    obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, "").trim() : +parsedVal;
9597    key = val.substr(index + 1).trim();
9598  }
9599
9600  return obj;
9601},
9602    _valueInParentheses = function _valueInParentheses(value) {
9603  var open = value.indexOf("(") + 1,
9604      close = value.indexOf(")"),
9605      nested = value.indexOf("(", open);
9606  return value.substring(open, ~nested && nested < close ? value.indexOf(")", close + 1) : close);
9607},
9608    _configEaseFromString = function _configEaseFromString(name) {
9609  //name can be a string like "elastic.out(1,0.5)", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE).
9610  var split = (name + "").split("("),
9611      ease = _easeMap[split[0]];
9612  return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf("{") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(",").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE("", name) : ease;
9613},
9614    _invertEase = function _invertEase(ease) {
9615  return function (p) {
9616    return 1 - ease(1 - p);
9617  };
9618},
9619    _parseEase = function _parseEase(ease, defaultEase) {
9620  return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase;
9621},
9622    _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) {
9623  if (easeOut === void 0) {
9624    easeOut = function easeOut(p) {
9625      return 1 - easeIn(1 - p);
9626    };
9627  }
9628
9629  if (easeInOut === void 0) {
9630    easeInOut = function easeInOut(p) {
9631      return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2;
9632    };
9633  }
9634
9635  var ease = {
9636    easeIn: easeIn,
9637    easeOut: easeOut,
9638    easeInOut: easeInOut
9639  },
9640      lowercaseName;
9641
9642  _forEachName(names, function (name) {
9643    _easeMap[name] = _globals[name] = ease;
9644    _easeMap[lowercaseName = name.toLowerCase()] = easeOut;
9645
9646    for (var p in ease) {
9647      _easeMap[lowercaseName + (p === "easeIn" ? ".in" : p === "easeOut" ? ".out" : ".inOut")] = _easeMap[name + "." + p] = ease[p];
9648    }
9649  });
9650
9651  return ease;
9652},
9653    _easeInOutFromOut = function _easeInOutFromOut(easeOut) {
9654  return function (p) {
9655    return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2;
9656  };
9657},
9658    _configElastic = function _configElastic(type, amplitude, period) {
9659  var p1 = amplitude >= 1 ? amplitude : 1,
9660      //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1.
9661  p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1),
9662      p3 = p2 / _2PI * (Math.asin(1 / p1) || 0),
9663      easeOut = function easeOut(p) {
9664    return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1;
9665  },
9666      ease = type === "out" ? easeOut : type === "in" ? function (p) {
9667    return 1 - easeOut(1 - p);
9668  } : _easeInOutFromOut(easeOut);
9669
9670  p2 = _2PI / p2; //precalculate to optimize
9671
9672  ease.config = function (amplitude, period) {
9673    return _configElastic(type, amplitude, period);
9674  };
9675
9676  return ease;
9677},
9678    _configBack = function _configBack(type, overshoot) {
9679  if (overshoot === void 0) {
9680    overshoot = 1.70158;
9681  }
9682
9683  var easeOut = function easeOut(p) {
9684    return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0;
9685  },
9686      ease = type === "out" ? easeOut : type === "in" ? function (p) {
9687    return 1 - easeOut(1 - p);
9688  } : _easeInOutFromOut(easeOut);
9689
9690  ease.config = function (overshoot) {
9691    return _configBack(type, overshoot);
9692  };
9693
9694  return ease;
9695}; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.
9696// _weightedEase = ratio => {
9697// 	let y = 0.5 + ratio / 2;
9698// 	return p => (2 * (1 - p) * p * y + p * p);
9699// },
9700// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.
9701// _weightedEaseStrong = ratio => {
9702// 	ratio = .5 + ratio / 2;
9703// 	let o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio),
9704// 		b = ratio - o,
9705// 		c = ratio + o;
9706// 	return p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p;
9707// };
9708
9709
9710_forEachName("Linear,Quad,Cubic,Quart,Quint,Strong", function (name, i) {
9711  var power = i < 5 ? i + 1 : i;
9712
9713  _insertEase(name + ",Power" + (power - 1), i ? function (p) {
9714    return Math.pow(p, power);
9715  } : function (p) {
9716    return p;
9717  }, function (p) {
9718    return 1 - Math.pow(1 - p, power);
9719  }, function (p) {
9720    return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2;
9721  });
9722});
9723
9724_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn;
9725
9726_insertEase("Elastic", _configElastic("in"), _configElastic("out"), _configElastic());
9727
9728(function (n, c) {
9729  var n1 = 1 / c,
9730      n2 = 2 * n1,
9731      n3 = 2.5 * n1,
9732      easeOut = function easeOut(p) {
9733    return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375;
9734  };
9735
9736  _insertEase("Bounce", function (p) {
9737    return 1 - easeOut(1 - p);
9738  }, easeOut);
9739})(7.5625, 2.75);
9740
9741_insertEase("Expo", function (p) {
9742  return Math.pow(2, 10 * (p - 1)) * p + p * p * p * p * p * p * (1 - p);
9743}); // previously 2 ** (10 * (p - 1)) but that doesn't end up with the value quite at the right spot so we do a blended ease to ensure it lands where it should perfectly.
9744
9745
9746_insertEase("Circ", function (p) {
9747  return -(_sqrt(1 - p * p) - 1);
9748});
9749
9750_insertEase("Sine", function (p) {
9751  return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1;
9752});
9753
9754_insertEase("Back", _configBack("in"), _configBack("out"), _configBack());
9755
9756_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = {
9757  config: function config(steps, immediateStart) {
9758    if (steps === void 0) {
9759      steps = 1;
9760    }
9761
9762    var p1 = 1 / steps,
9763        p2 = steps + (immediateStart ? 0 : 1),
9764        p3 = immediateStart ? 1 : 0,
9765        max = 1 - _tinyNum;
9766    return function (p) {
9767      return ((p2 * _clamp(0, max, p) | 0) + p3) * p1;
9768    };
9769  }
9770};
9771_defaults.ease = _easeMap["quad.out"];
9772
9773_forEachName("onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt", function (name) {
9774  return _callbackNames += name + "," + name + "Params,";
9775});
9776/*
9777 * --------------------------------------------------------------------------------------
9778 * CACHE
9779 * --------------------------------------------------------------------------------------
9780 */
9781
9782
9783var GSCache = function GSCache(target, harness) {
9784  this.id = _gsID++;
9785  target._gsap = this;
9786  this.target = target;
9787  this.harness = harness;
9788  this.get = harness ? harness.get : _getProperty;
9789  this.set = harness ? harness.getSetter : _getSetter;
9790};
9791/*
9792 * --------------------------------------------------------------------------------------
9793 * ANIMATION
9794 * --------------------------------------------------------------------------------------
9795 */
9796
vendor: 108,904 bytes, lines 9797-12604
9797var Animation = /*#__PURE__*/function () {
9798  function Animation(vars) {
9799    this.vars = vars;
9800    this._delay = +vars.delay || 0;
9801
9802    if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) {
9803      // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start.
9804      this._rDelay = vars.repeatDelay || 0;
9805      this._yoyo = !!vars.yoyo || !!vars.yoyoEase;
9806    }
9807
9808    this._ts = 1;
9809
9810    _setDuration(this, +vars.duration, 1, 1);
9811
9812    this.data = vars.data;
9813
9814    if (_context) {
9815      this._ctx = _context;
9816
9817      _context.data.push(this);
9818    }
9819
9820    _tickerActive || _ticker.wake();
9821  }
9822
9823  var _proto = Animation.prototype;
9824
9825  _proto.delay = function delay(value) {
9826    if (value || value === 0) {
9827      this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay);
9828      this._delay = value;
9829      return this;
9830    }
9831
9832    return this._delay;
9833  };
9834
9835  _proto.duration = function duration(value) {
9836    return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur;
9837  };
9838
9839  _proto.totalDuration = function totalDuration(value) {
9840    if (!arguments.length) {
9841      return this._tDur;
9842    }
9843
9844    this._dirty = 0;
9845    return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1));
9846  };
9847
9848  _proto.totalTime = function totalTime(_totalTime, suppressEvents) {
9849    _wake();
9850
9851    if (!arguments.length) {
9852      return this._tTime;
9853    }
9854
9855    var parent = this._dp;
9856
9857    if (parent && parent.smoothChildTiming && this._ts) {
9858      _alignPlayhead(this, _totalTime);
9859
9860      !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent.
9861      //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed.
9862
9863      while (parent && parent.parent) {
9864        if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) {
9865          parent.totalTime(parent._tTime, true);
9866        }
9867
9868        parent = parent.parent;
9869      }
9870
9871      if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) {
9872        //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in.
9873        _addToTimeline(this._dp, this, this._start - this._delay);
9874      }
9875    }
9876
9877    if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !this._initted && this._dur && _totalTime || !_totalTime && !this._initted && (this.add || this._ptLookup)) {
9878      // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional)
9879      this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause
9880      //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit)
9881      //   this._lock = 1;
9882
9883      _lazySafeRender(this, _totalTime, suppressEvents); //   this._lock = 0;
9884      //}
9885
9886    }
9887
9888    return this;
9889  };
9890
9891  _proto.time = function time(value, suppressEvents) {
9892    return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay) || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START!
9893  };
9894
9895  _proto.totalProgress = function totalProgress(value, suppressEvents) {
9896    return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.rawTime() >= 0 && this._initted ? 1 : 0;
9897  };
9898
9899  _proto.progress = function progress(value, suppressEvents) {
9900    return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.rawTime() > 0 ? 1 : 0;
9901  };
9902
9903  _proto.iteration = function iteration(value, suppressEvents) {
9904    var cycleDuration = this.duration() + this._rDelay;
9905
9906    return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1;
9907  } // potential future addition:
9908  // isPlayingBackwards() {
9909  // 	let animation = this,
9910  // 		orientation = 1; // 1 = forward, -1 = backward
9911  // 	while (animation) {
9912  // 		orientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1;
9913  // 		animation = animation.parent;
9914  // 	}
9915  // 	return orientation < 0;
9916  // }
9917  ;
9918
9919  _proto.timeScale = function timeScale(value, suppressEvents) {
9920    if (!arguments.length) {
9921      return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed.
9922    }
9923
9924    if (this._rts === value) {
9925      return this;
9926    }
9927
9928    var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation.
9929    // future addition? Up side: fast and minimal file size. Down side: only works on this animation; if a timeline is reversed, for example, its childrens' onReverse wouldn't get called.
9930    //(+value < 0 && this._rts >= 0) && _callback(this, "onReverse", true);
9931    // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes.
9932
9933    this._rts = +value || 0;
9934    this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused.
9935
9936    this.totalTime(_clamp(-Math.abs(this._delay), this.totalDuration(), tTime), suppressEvents !== false);
9937
9938    _setEnd(this); // if parent.smoothChildTiming was false, the end time didn't get updated in the _alignPlayhead() method, so do it here.
9939
9940
9941    return _recacheAncestors(this);
9942  };
9943
9944  _proto.paused = function paused(value) {
9945    if (!arguments.length) {
9946      return this._ps;
9947    } // possible future addition - if an animation is removed from its parent and then .restart() or .play() or .resume() is called, perhaps we should force it back into the globalTimeline but be careful because what if it's already at its end? We don't want it to just persist forever and not get released for GC.
9948    // !this.parent && !value && this._tTime < this._tDur && this !== _globalTimeline && _globalTimeline.add(this);
9949
9950
9951    if (this._ps !== value) {
9952      this._ps = value;
9953
9954      if (value) {
9955        this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming.
9956
9957        this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the "real" timeScale as _rts (recorded time scale)
9958      } else {
9959        _wake();
9960
9961        this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated.
9962
9963        this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum)); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise.
9964      }
9965    }
9966
9967    return this;
9968  };
9969
9970  _proto.startTime = function startTime(value) {
9971    if (arguments.length) {
9972      this._start = _roundPrecise(value);
9973      var parent = this.parent || this._dp;
9974      parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, this._start - this._delay);
9975      return this;
9976    }
9977
9978    return this._start;
9979  };
9980
9981  _proto.endTime = function endTime(includeRepeats) {
9982    return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1);
9983  };
9984
9985  _proto.rawTime = function rawTime(wrapRepeats) {
9986    var parent = this.parent || this._dp; // _dp = detached parent
9987
9988    return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this);
9989  };
9990
9991  _proto.revert = function revert(config) {
9992    if (config === void 0) {
9993      config = _revertConfig;
9994    }
9995
9996    var prevIsReverting = _reverting;
9997    _reverting = config;
9998
9999    if (_isRevertWorthy(this)) {
10000      this.timeline && this.timeline.revert(config);
10001      this.totalTime(-0.01, config.suppressEvents);
10002    }
10003
10004    this.data !== "nested" && config.kill !== false && this.kill();
10005    _reverting = prevIsReverting;
10006    return this;
10007  };
10008
10009  _proto.globalTime = function globalTime(rawTime) {
10010    var animation = this,
10011        time = arguments.length ? rawTime : animation.rawTime();
10012
10013    while (animation) {
10014      time = animation._start + time / (Math.abs(animation._ts) || 1);
10015      animation = animation._dp;
10016    }
10017
10018    return !this.parent && this._sat ? this._sat.globalTime(rawTime) : time; // the _startAt tweens for .fromTo() and .from() that have immediateRender should always be FIRST in the timeline (important for context.revert()). "_sat" stands for _startAtTween, referring to the parent tween that created the _startAt. We must discern if that tween had immediateRender so that we can know whether or not to prioritize it in revert().
10019  };
10020
10021  _proto.repeat = function repeat(value) {
10022    if (arguments.length) {
10023      this._repeat = value === Infinity ? -2 : value;
10024      return _onUpdateTotalDuration(this);
10025    }
10026
10027    return this._repeat === -2 ? Infinity : this._repeat;
10028  };
10029
10030  _proto.repeatDelay = function repeatDelay(value) {
10031    if (arguments.length) {
10032      var time = this._time;
10033      this._rDelay = value;
10034
10035      _onUpdateTotalDuration(this);
10036
10037      return time ? this.time(time) : this;
10038    }
10039
10040    return this._rDelay;
10041  };
10042
10043  _proto.yoyo = function yoyo(value) {
10044    if (arguments.length) {
10045      this._yoyo = value;
10046      return this;
10047    }
10048
10049    return this._yoyo;
10050  };
10051
10052  _proto.seek = function seek(position, suppressEvents) {
10053    return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents));
10054  };
10055
10056  _proto.restart = function restart(includeDelay, suppressEvents) {
10057    this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents));
10058    this._dur || (this._zTime = -_tinyNum); // ensures onComplete fires on a zero-duration animation that gets restarted.
10059
10060    return this;
10061  };
10062
10063  _proto.play = function play(from, suppressEvents) {
10064    from != null && this.seek(from, suppressEvents);
10065    return this.reversed(false).paused(false);
10066  };
10067
10068  _proto.reverse = function reverse(from, suppressEvents) {
10069    from != null && this.seek(from || this.totalDuration(), suppressEvents);
10070    return this.reversed(true).paused(false);
10071  };
10072
10073  _proto.pause = function pause(atTime, suppressEvents) {
10074    atTime != null && this.seek(atTime, suppressEvents);
10075    return this.paused(true);
10076  };
10077
10078  _proto.resume = function resume() {
10079    return this.paused(false);
10080  };
10081
10082  _proto.reversed = function reversed(value) {
10083    if (arguments.length) {
10084      !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum.
10085
10086      return this;
10087    }
10088
10089    return this._rts < 0;
10090  };
10091
10092  _proto.invalidate = function invalidate() {
10093    this._initted = this._act = 0;
10094    this._zTime = -_tinyNum;
10095    return this;
10096  };
10097
10098  _proto.isActive = function isActive() {
10099    var parent = this.parent || this._dp,
10100        start = this._start,
10101        rawTime;
10102    return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum);
10103  };
10104
10105  _proto.eventCallback = function eventCallback(type, callback, params) {
10106    var vars = this.vars;
10107
10108    if (arguments.length > 1) {
10109      if (!callback) {
10110        delete vars[type];
10111      } else {
10112        vars[type] = callback;
10113        params && (vars[type + "Params"] = params);
10114        type === "onUpdate" && (this._onUpdate = callback);
10115      }
10116
10117      return this;
10118    }
10119
10120    return vars[type];
10121  };
10122
10123  _proto.then = function then(onFulfilled) {
10124    var self = this,
10125        prevProm = self._prom;
10126    return new Promise(function (resolve) {
10127      var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough,
10128          _resolve = function _resolve() {
10129        var _then = self.then;
10130        self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322)
10131
10132        prevProm && prevProm();
10133        _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then);
10134        resolve(f);
10135        self.then = _then;
10136      };
10137
10138      if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) {
10139        _resolve();
10140      } else {
10141        self._prom = _resolve;
10142      }
10143    });
10144  };
10145
10146  _proto.kill = function kill() {
10147    _interrupt(this);
10148  };
10149
10150  return Animation;
10151}();
10152
10153_setDefaults(Animation.prototype, {
10154  _time: 0,
10155  _start: 0,
10156  _end: 0,
10157  _tTime: 0,
10158  _tDur: 0,
10159  _dirty: 0,
10160  _repeat: 0,
10161  _yoyo: false,
10162  parent: null,
10163  _initted: false,
10164  _rDelay: 0,
10165  _ts: 1,
10166  _dp: 0,
10167  ratio: 0,
10168  _zTime: -_tinyNum,
10169  _prom: 0,
10170  _ps: false,
10171  _rts: 1
10172});
10173/*
10174 * -------------------------------------------------
10175 * TIMELINE
10176 * -------------------------------------------------
10177 */
10178
10179
10180var Timeline = /*#__PURE__*/function (_Animation) {
10181  _inheritsLoose(Timeline, _Animation);
10182
10183  function Timeline(vars, position) {
10184    var _this;
10185
10186    if (vars === void 0) {
10187      vars = {};
10188    }
10189
10190    _this = _Animation.call(this, vars) || this;
10191    _this.labels = {};
10192    _this.smoothChildTiming = !!vars.smoothChildTiming;
10193    _this.autoRemoveChildren = !!vars.autoRemoveChildren;
10194    _this._sort = _isNotFalse(vars.sortChildren);
10195    _globalTimeline && _addToTimeline(vars.parent || _globalTimeline, _assertThisInitialized(_this), position);
10196    vars.reversed && _this.reverse();
10197    vars.paused && _this.paused(true);
10198    vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger);
10199    return _this;
10200  }
10201
10202  var _proto2 = Timeline.prototype;
10203
10204  _proto2.to = function to(targets, vars, position) {
10205    _createTweenType(0, arguments, this);
10206
10207    return this;
10208  };
10209
10210  _proto2.from = function from(targets, vars, position) {
10211    _createTweenType(1, arguments, this);
10212
10213    return this;
10214  };
10215
10216  _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) {
10217    _createTweenType(2, arguments, this);
10218
10219    return this;
10220  };
10221
10222  _proto2.set = function set(targets, vars, position) {
10223    vars.duration = 0;
10224    vars.parent = this;
10225    _inheritDefaults(vars).repeatDelay || (vars.repeat = 0);
10226    vars.immediateRender = !!vars.immediateRender;
10227    new Tween(targets, vars, _parsePosition(this, position), 1);
10228    return this;
10229  };
10230
10231  _proto2.call = function call(callback, params, position) {
10232    return _addToTimeline(this, Tween.delayedCall(0, callback, params), position);
10233  } //ONLY for backward compatibility! Maybe delete?
10234  ;
10235
10236  _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {
10237    vars.duration = duration;
10238    vars.stagger = vars.stagger || stagger;
10239    vars.onComplete = onCompleteAll;
10240    vars.onCompleteParams = onCompleteAllParams;
10241    vars.parent = this;
10242    new Tween(targets, vars, _parsePosition(this, position));
10243    return this;
10244  };
10245
10246  _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {
10247    vars.runBackwards = 1;
10248    _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender);
10249    return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams);
10250  };
10251
10252  _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) {
10253    toVars.startAt = fromVars;
10254    _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender);
10255    return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams);
10256  };
10257
10258  _proto2.render = function render(totalTime, suppressEvents, force) {
10259    var prevTime = this._time,
10260        tDur = this._dirty ? this.totalDuration() : this._tDur,
10261        dur = this._dur,
10262        tTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime),
10263        // if a paused timeline is resumed (or its _start is updated for another reason...which rounds it), that could result in the playhead shifting a **tiny** amount and a zero-duration child at that spot may get rendered at a different ratio, like its totalTime in render() may be 1e-17 instead of 0, for example.
10264    crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur),
10265        time,
10266        child,
10267        next,
10268        iteration,
10269        cycleDuration,
10270        prevPaused,
10271        pauseTween,
10272        timeScale,
10273        prevStart,
10274        prevIteration,
10275        yoyo,
10276        isYoyo;
10277    this !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur);
10278
10279    if (tTime !== this._tTime || force || crossingStart) {
10280      if (prevTime !== this._time && dur) {
10281        //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).
10282        tTime += this._time - prevTime;
10283        totalTime += this._time - prevTime;
10284      }
10285
10286      time = tTime;
10287      prevStart = this._start;
10288      timeScale = this._ts;
10289      prevPaused = !timeScale;
10290
10291      if (crossingStart) {
10292        dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.
10293
10294        (totalTime || !suppressEvents) && (this._zTime = totalTime);
10295      }
10296
10297      if (this._repeat) {
10298        //adjust the time for repeats and yoyos
10299        yoyo = this._yoyo;
10300        cycleDuration = dur + this._rDelay;
10301
10302        if (this._repeat < -1 && totalTime < 0) {
10303          return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);
10304        }
10305
10306        time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)
10307
10308        if (tTime === tDur) {
10309          // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)
10310          iteration = this._repeat;
10311          time = dur;
10312        } else {
10313          prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)
10314
10315          iteration = ~~prevIteration;
10316
10317          if (iteration && iteration === prevIteration) {
10318            time = dur;
10319            iteration--;
10320          }
10321
10322          time > dur && (time = dur);
10323        }
10324
10325        prevIteration = _animationCycle(this._tTime, cycleDuration);
10326        !prevTime && this._tTime && prevIteration !== iteration && this._tTime - prevIteration * cycleDuration - this._dur <= 0 && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://gsap.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005 also, this._tTime - prevIteration * cycleDuration - this._dur <= 0 just checks to make sure it wasn't previously in the "repeatDelay" portion
10327
10328        if (yoyo && iteration & 1) {
10329          time = dur - time;
10330          isYoyo = 1;
10331        }
10332        /*
10333        make sure children at the end/beginning of the timeline are rendered properly. If, for example,
10334        a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which
10335        would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there
10336        could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So
10337        we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must
10338        ensure that zero-duration tweens at the very beginning or end of the Timeline work.
10339        */
10340
10341
10342        if (iteration !== prevIteration && !this._lock) {
10343          var rewinding = yoyo && prevIteration & 1,
10344              doesWrap = rewinding === (yoyo && iteration & 1);
10345          iteration < prevIteration && (rewinding = !rewinding);
10346          prevTime = rewinding ? 0 : tTime % dur ? dur : tTime; // if the playhead is landing exactly at the end of an iteration, use that totalTime rather than only the duration, otherwise it'll skip the 2nd render since it's effectively at the same time.
10347
10348          this._lock = 1;
10349          this.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0;
10350          this._tTime = tTime; // if a user gets the iteration() inside the onRepeat, for example, it should be accurate.
10351
10352          !suppressEvents && this.parent && _callback(this, "onRepeat");
10353
10354          if (this.vars.repeatRefresh && !isYoyo) {
10355            this.invalidate()._lock = 1;
10356            prevIteration = iteration; // otherwise, the onStart() may fire on the 2nd iteration.
10357          }
10358
10359          if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) {
10360            // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well.
10361            return this;
10362          }
10363
10364          dur = this._dur; // in case the duration changed in the onRepeat
10365
10366          tDur = this._tDur;
10367
10368          if (doesWrap) {
10369            this._lock = 2;
10370            prevTime = rewinding ? dur : -0.0001;
10371            this.render(prevTime, true);
10372            this.vars.repeatRefresh && !isYoyo && this.invalidate();
10373          }
10374
10375          this._lock = 0;
10376
10377          if (!this._ts && !prevPaused) {
10378            return this;
10379          }
10380        }
10381      }
10382
10383      if (this._hasPause && !this._forcing && this._lock < 2) {
10384        pauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time));
10385
10386        if (pauseTween) {
10387          tTime -= time - (time = pauseTween._start);
10388        }
10389      }
10390
10391      this._tTime = tTime;
10392      this._time = time;
10393      this._act = !!timeScale; // as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.
10394
10395      if (!this._initted) {
10396        this._onUpdate = this.vars.onUpdate;
10397        this._initted = 1;
10398        this._zTime = totalTime;
10399        prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}).
10400      }
10401
10402      if (!prevTime && tTime && dur && !suppressEvents && !prevIteration) {
10403        _callback(this, "onStart");
10404
10405        if (this._tTime !== tTime) {
10406          // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.
10407          return this;
10408        }
10409      }
10410
10411      if (time >= prevTime && totalTime >= 0) {
10412        child = this._first;
10413
10414        while (child) {
10415          next = child._next;
10416
10417          if ((child._act || time >= child._start) && child._ts && pauseTween !== child) {
10418            if (child.parent !== this) {
10419              // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.
10420              return this.render(totalTime, suppressEvents, force);
10421            }
10422
10423            child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force);
10424
10425            if (time !== this._time || !this._ts && !prevPaused) {
10426              //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
10427              pauseTween = 0;
10428              next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that the next time render() is called it'll be forced (to render any remaining children)
10429
10430              break;
10431            }
10432          }
10433
10434          child = next;
10435        }
10436      } else {
10437        child = this._last;
10438        var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values.
10439
10440        while (child) {
10441          next = child._prev;
10442
10443          if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) {
10444            if (child.parent !== this) {
10445              // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.
10446              return this.render(totalTime, suppressEvents, force);
10447            }
10448
10449            child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force || _reverting && _isRevertWorthy(child)); // if reverting, we should always force renders of initted tweens (but remember that .fromTo() or .from() may have a _startAt but not _initted yet). If, for example, a .fromTo() tween with a stagger (which creates an internal timeline) gets reverted BEFORE some of its child tweens render for the first time, it may not properly trigger them to revert.
10450
10451            if (time !== this._time || !this._ts && !prevPaused) {
10452              //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
10453              pauseTween = 0;
10454              next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children)
10455
10456              break;
10457            }
10458          }
10459
10460          child = next;
10461        }
10462      }
10463
10464      if (pauseTween && !suppressEvents) {
10465        this.pause();
10466        pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1;
10467
10468        if (this._ts) {
10469          //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened).
10470          this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift.
10471
10472          _setEnd(this);
10473
10474          return this.render(totalTime, suppressEvents, force);
10475        }
10476      }
10477
10478      this._onUpdate && !suppressEvents && _callback(this, "onUpdate", true);
10479      if (tTime === tDur && this._tTime >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) {
10480        // remember, a child's callback may alter this timeline's playhead or timeScale which is why we need to add some of these checks.
10481        (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.
10482
10483        if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) {
10484          _callback(this, tTime === tDur && totalTime >= 0 ? "onComplete" : "onReverseComplete", true);
10485
10486          this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();
10487        }
10488      }
10489    }
10490
10491    return this;
10492  };
10493
10494  _proto2.add = function add(child, position) {
10495    var _this2 = this;
10496
10497    _isNumber(position) || (position = _parsePosition(this, position, child));
10498
10499    if (!(child instanceof Animation)) {
10500      if (_isArray(child)) {
10501        child.forEach(function (obj) {
10502          return _this2.add(obj, position);
10503        });
10504        return this;
10505      }
10506
10507      if (_isString(child)) {
10508        return this.addLabel(child, position);
10509      }
10510
10511      if (_isFunction(child)) {
10512        child = Tween.delayedCall(0, child);
10513      } else {
10514        return this;
10515      }
10516    }
10517
10518    return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child!
10519  };
10520
10521  _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) {
10522    if (nested === void 0) {
10523      nested = true;
10524    }
10525
10526    if (tweens === void 0) {
10527      tweens = true;
10528    }
10529
10530    if (timelines === void 0) {
10531      timelines = true;
10532    }
10533
10534    if (ignoreBeforeTime === void 0) {
10535      ignoreBeforeTime = -_bigNum;
10536    }
10537
10538    var a = [],
10539        child = this._first;
10540
10541    while (child) {
10542      if (child._start >= ignoreBeforeTime) {
10543        if (child instanceof Tween) {
10544          tweens && a.push(child);
10545        } else {
10546          timelines && a.push(child);
10547          nested && a.push.apply(a, child.getChildren(true, tweens, timelines));
10548        }
10549      }
10550
10551      child = child._next;
10552    }
10553
10554    return a;
10555  };
10556
10557  _proto2.getById = function getById(id) {
10558    var animations = this.getChildren(1, 1, 1),
10559        i = animations.length;
10560
10561    while (i--) {
10562      if (animations[i].vars.id === id) {
10563        return animations[i];
10564      }
10565    }
10566  };
10567
10568  _proto2.remove = function remove(child) {
10569    if (_isString(child)) {
10570      return this.removeLabel(child);
10571    }
10572
10573    if (_isFunction(child)) {
10574      return this.killTweensOf(child);
10575    }
10576
10577    child.parent === this && _removeLinkedListItem(this, child);
10578
10579    if (child === this._recent) {
10580      this._recent = this._last;
10581    }
10582
10583    return _uncache(this);
10584  };
10585
10586  _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) {
10587    if (!arguments.length) {
10588      return this._tTime;
10589    }
10590
10591    this._forcing = 1;
10592
10593    if (!this._dp && this._ts) {
10594      //special case for the global timeline (or any other that has no parent or detached parent).
10595      this._start = _roundPrecise(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts));
10596    }
10597
10598    _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents);
10599
10600    this._forcing = 0;
10601    return this;
10602  };
10603
10604  _proto2.addLabel = function addLabel(label, position) {
10605    this.labels[label] = _parsePosition(this, position);
10606    return this;
10607  };
10608
10609  _proto2.removeLabel = function removeLabel(label) {
10610    delete this.labels[label];
10611    return this;
10612  };
10613
10614  _proto2.addPause = function addPause(position, callback, params) {
10615    var t = Tween.delayedCall(0, callback || _emptyFunc, params);
10616    t.data = "isPause";
10617    this._hasPause = 1;
10618    return _addToTimeline(this, t, _parsePosition(this, position));
10619  };
10620
10621  _proto2.removePause = function removePause(position) {
10622    var child = this._first;
10623    position = _parsePosition(this, position);
10624
10625    while (child) {
10626      if (child._start === position && child.data === "isPause") {
10627        _removeFromParent(child);
10628      }
10629
10630      child = child._next;
10631    }
10632  };
10633
10634  _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) {
10635    var tweens = this.getTweensOf(targets, onlyActive),
10636        i = tweens.length;
10637
10638    while (i--) {
10639      _overwritingTween !== tweens[i] && tweens[i].kill(targets, props);
10640    }
10641
10642    return this;
10643  };
10644
10645  _proto2.getTweensOf = function getTweensOf(targets, onlyActive) {
10646    var a = [],
10647        parsedTargets = toArray(targets),
10648        child = this._first,
10649        isGlobalTime = _isNumber(onlyActive),
10650        // a number is interpreted as a global time. If the animation spans
10651    children;
10652
10653    while (child) {
10654      if (child instanceof Tween) {
10655        if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) {
10656          // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted.
10657          a.push(child);
10658        }
10659      } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) {
10660        a.push.apply(a, children);
10661      }
10662
10663      child = child._next;
10664    }
10665
10666    return a;
10667  } // potential future feature - targets() on timelines
10668  // targets() {
10669  // 	let result = [];
10670  // 	this.getChildren(true, true, false).forEach(t => result.push(...t.targets()));
10671  // 	return result.filter((v, i) => result.indexOf(v) === i);
10672  // }
10673  ;
10674
10675  _proto2.tweenTo = function tweenTo(position, vars) {
10676    vars = vars || {};
10677
10678    var tl = this,
10679        endTime = _parsePosition(tl, position),
10680        _vars = vars,
10681        startAt = _vars.startAt,
10682        _onStart = _vars.onStart,
10683        onStartParams = _vars.onStartParams,
10684        immediateRender = _vars.immediateRender,
10685        initted,
10686        tween = Tween.to(tl, _setDefaults({
10687      ease: vars.ease || "none",
10688      lazy: false,
10689      immediateRender: false,
10690      time: endTime,
10691      overwrite: "auto",
10692      duration: vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum,
10693      onStart: function onStart() {
10694        tl.pause();
10695
10696        if (!initted) {
10697          var duration = vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale());
10698          tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true);
10699          initted = 1;
10700        }
10701
10702        _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it.
10703      }
10704    }, vars));
10705
10706    return immediateRender ? tween.render(0) : tween;
10707  };
10708
10709  _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) {
10710    return this.tweenTo(toPosition, _setDefaults({
10711      startAt: {
10712        time: _parsePosition(this, fromPosition)
10713      }
10714    }, vars));
10715  };
10716
10717  _proto2.recent = function recent() {
10718    return this._recent;
10719  };
10720
10721  _proto2.nextLabel = function nextLabel(afterTime) {
10722    if (afterTime === void 0) {
10723      afterTime = this._time;
10724    }
10725
10726    return _getLabelInDirection(this, _parsePosition(this, afterTime));
10727  };
10728
10729  _proto2.previousLabel = function previousLabel(beforeTime) {
10730    if (beforeTime === void 0) {
10731      beforeTime = this._time;
10732    }
10733
10734    return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1);
10735  };
10736
10737  _proto2.currentLabel = function currentLabel(value) {
10738    return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum);
10739  };
10740
10741  _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) {
10742    if (ignoreBeforeTime === void 0) {
10743      ignoreBeforeTime = 0;
10744    }
10745
10746    var child = this._first,
10747        labels = this.labels,
10748        p;
10749    amount = _roundPrecise(amount);
10750
10751    while (child) {
10752      if (child._start >= ignoreBeforeTime) {
10753        child._start += amount;
10754        child._end += amount;
10755      }
10756
10757      child = child._next;
10758    }
10759
10760    if (adjustLabels) {
10761      for (p in labels) {
10762        if (labels[p] >= ignoreBeforeTime) {
10763          labels[p] += amount;
10764        }
10765      }
10766    }
10767
10768    return _uncache(this);
10769  };
10770
10771  _proto2.invalidate = function invalidate(soft) {
10772    var child = this._first;
10773    this._lock = 0;
10774
10775    while (child) {
10776      child.invalidate(soft);
10777      child = child._next;
10778    }
10779
10780    return _Animation.prototype.invalidate.call(this, soft);
10781  };
10782
10783  _proto2.clear = function clear(includeLabels) {
10784    if (includeLabels === void 0) {
10785      includeLabels = true;
10786    }
10787
10788    var child = this._first,
10789        next;
10790
10791    while (child) {
10792      next = child._next;
10793      this.remove(child);
10794      child = next;
10795    }
10796
10797    this._dp && (this._time = this._tTime = this._pTime = 0);
10798    includeLabels && (this.labels = {});
10799    return _uncache(this);
10800  };
10801
10802  _proto2.totalDuration = function totalDuration(value) {
10803    var max = 0,
10804        self = this,
10805        child = self._last,
10806        prevStart = _bigNum,
10807        prev,
10808        start,
10809        parent;
10810
10811    if (arguments.length) {
10812      return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value));
10813    }
10814
10815    if (self._dirty) {
10816      parent = self.parent;
10817
10818      while (child) {
10819        prev = child._prev; //record it here in case the tween changes position in the sequence...
10820
10821        child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it.
10822
10823        start = child._start;
10824
10825        if (start > prevStart && self._sort && child._ts && !self._lock) {
10826          //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence
10827          self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add().
10828
10829          _addToTimeline(self, child, start - child._delay, 1)._lock = 0;
10830        } else {
10831          prevStart = start;
10832        }
10833
10834        if (start < 0 && child._ts) {
10835          //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.
10836          max -= start;
10837
10838          if (!parent && !self._dp || parent && parent.smoothChildTiming) {
10839            self._start += _roundPrecise(start / self._ts);
10840            self._time -= start;
10841            self._tTime -= start;
10842          }
10843
10844          self.shiftChildren(-start, false, -1e999);
10845          prevStart = 0;
10846        }
10847
10848        child._end > max && child._ts && (max = child._end);
10849        child = prev;
10850      }
10851
10852      _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1);
10853
10854      self._dirty = 0;
10855    }
10856
10857    return self._tDur;
10858  };
10859
10860  Timeline.updateRoot = function updateRoot(time) {
10861    if (_globalTimeline._ts) {
10862      _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline));
10863
10864      _lastRenderedFrame = _ticker.frame;
10865    }
10866
10867    if (_ticker.frame >= _nextGCFrame) {
10868      _nextGCFrame += _config.autoSleep || 120;
10869      var child = _globalTimeline._first;
10870      if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) {
10871        while (child && !child._ts) {
10872          child = child._next;
10873        }
10874
10875        child || _ticker.sleep();
10876      }
10877    }
10878  };
10879
10880  return Timeline;
10881}(Animation);
10882
10883_setDefaults(Timeline.prototype, {
10884  _lock: 0,
10885  _hasPause: 0,
10886  _forcing: 0
10887});
10888
10889var _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) {
10890  //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin.
10891  var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter),
10892      index = 0,
10893      matchIndex = 0,
10894      result,
10895      startNums,
10896      color,
10897      endNum,
10898      chunk,
10899      startNum,
10900      hasRandom,
10901      a;
10902  pt.b = start;
10903  pt.e = end;
10904  start += ""; //ensure values are strings
10905
10906  end += "";
10907
10908  if (hasRandom = ~end.indexOf("random(")) {
10909    end = _replaceRandom(end);
10910  }
10911
10912  if (stringFilter) {
10913    a = [start, end];
10914    stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values.
10915
10916    start = a[0];
10917    end = a[1];
10918  }
10919
10920  startNums = start.match(_complexStringNumExp) || [];
10921
10922  while (result = _complexStringNumExp.exec(end)) {
10923    endNum = result[0];
10924    chunk = end.substring(index, result.index);
10925
10926    if (color) {
10927      color = (color + 1) % 5;
10928    } else if (chunk.substr(-5) === "rgba(") {
10929      color = 1;
10930    }
10931
10932    if (endNum !== startNums[matchIndex++]) {
10933      startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.
10934
10935      pt._pt = {
10936        _next: pt._pt,
10937        p: chunk || matchIndex === 1 ? chunk : ",",
10938        //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.
10939        s: startNum,
10940        c: endNum.charAt(1) === "=" ? _parseRelative(startNum, endNum) - startNum : parseFloat(endNum) - startNum,
10941        m: color && color < 4 ? Math.round : 0
10942      };
10943      index = _complexStringNumExp.lastIndex;
10944    }
10945  }
10946
10947  pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number)
10948
10949  pt.fp = funcParam;
10950
10951  if (_relExp.test(end) || hasRandom) {
10952    pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).
10953  }
10954
10955  this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin.
10956
10957  return pt;
10958},
10959    _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam, optional) {
10960  _isFunction(end) && (end = end(index || 0, target, targets));
10961  var currentValue = target[prop],
10962      parsedStart = start !== "get" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf("set") || !_isFunction(target["get" + prop.substr(3)]) ? prop : "get" + prop.substr(3)](funcParam) : target[prop](),
10963      setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc,
10964      pt;
10965
10966  if (_isString(end)) {
10967    if (~end.indexOf("random(")) {
10968      end = _replaceRandom(end);
10969    }
10970
10971    if (end.charAt(1) === "=") {
10972      pt = _parseRelative(parsedStart, end) + (getUnit(parsedStart) || 0);
10973
10974      if (pt || pt === 0) {
10975        // to avoid isNaN, like if someone passes in a value like "!= whatever"
10976        end = pt;
10977      }
10978    }
10979  }
10980
10981  if (!optional || parsedStart !== end || _forceAllPropTweens) {
10982    if (!isNaN(parsedStart * end) && end !== "") {
10983      // fun fact: any number multiplied by "" is evaluated as the number 0!
10984      pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === "boolean" ? _renderBoolean : _renderPlain, 0, setter);
10985      funcParam && (pt.fp = funcParam);
10986      modifier && pt.modifier(modifier, this, target);
10987      return this._pt = pt;
10988    }
10989
10990    !currentValue && !(prop in target) && _missingPlugin(prop, end);
10991    return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam);
10992  }
10993},
10994    //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with "random()" in them. It does NOT process relative values.
10995_processVars = function _processVars(vars, index, target, targets, tween) {
10996  _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets));
10997
10998  if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) {
10999    return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars;
11000  }
11001
11002  var copy = {},
11003      p;
11004
11005  for (p in vars) {
11006    copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets);
11007  }
11008
11009  return copy;
11010},
11011    _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) {
11012  var plugin, pt, ptLookup, i;
11013
11014  if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) {
11015    tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority);
11016
11017    if (tween !== _quickTween) {
11018      ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger.
11019
11020      i = plugin._props.length;
11021
11022      while (i--) {
11023        ptLookup[plugin._props[i]] = pt;
11024      }
11025    }
11026  }
11027
11028  return plugin;
11029},
11030    _overwritingTween,
11031    //store a reference temporarily so we can avoid overwriting itself.
11032_forceAllPropTweens,
11033    _initTween = function _initTween(tween, time, tTime) {
11034  var vars = tween.vars,
11035      ease = vars.ease,
11036      startAt = vars.startAt,
11037      immediateRender = vars.immediateRender,
11038      lazy = vars.lazy,
11039      onUpdate = vars.onUpdate,
11040      runBackwards = vars.runBackwards,
11041      yoyoEase = vars.yoyoEase,
11042      keyframes = vars.keyframes,
11043      autoRevert = vars.autoRevert,
11044      dur = tween._dur,
11045      prevStartAt = tween._startAt,
11046      targets = tween._targets,
11047      parent = tween.parent,
11048      fullTargets = parent && parent.data === "nested" ? parent.vars.targets : targets,
11049      autoOverwrite = tween._overwrite === "auto" && !_suppressOverwrites,
11050      tl = tween.timeline,
11051      reverseEase = vars.easeReverse || yoyoEase,
11052      cleanVars,
11053      i,
11054      p,
11055      pt,
11056      target,
11057      hasPriority,
11058      gsData,
11059      harness,
11060      plugin,
11061      ptLookup,
11062      index,
11063      harnessVars,
11064      overwritten;
11065  tl && (!keyframes || !ease) && (ease = "none");
11066  tween._ease = _parseEase(ease, _defaults.ease);
11067  tween._rEase = reverseEase && (_parseEase(reverseEase) || tween._ease);
11068  tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens.
11069
11070  if (tween._from) tween.ratio = 1;
11071
11072  if (!tl || keyframes && !vars.stagger) {
11073    //if there's an internal timeline, skip all the parsing because we passed that task down the chain.
11074    harness = targets[0] ? _getCache(targets[0]).harness : 0;
11075    harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an "x" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example.
11076
11077    cleanVars = _copyExcluding(vars, _reservedProps);
11078
11079    if (prevStartAt) {
11080      prevStartAt._zTime < 0 && prevStartAt.progress(1); // in case it's a lazy startAt that hasn't rendered yet.
11081
11082      time < 0 && runBackwards && immediateRender && !autoRevert ? prevStartAt.render(-1, true) : prevStartAt.revert(runBackwards && dur ? _revertConfigNoKill : _startAtRevertConfig); // if it's a "startAt" (not "from()" or runBackwards: true), we only need to do a shallow revert (keep transforms cached in CSSPlugin)
11083      // don't just _removeFromParent(prevStartAt.render(-1, true)) because that'll leave inline styles. We're creating a new _startAt for "startAt" tweens that re-capture things to ensure that if the pre-tween values changed since the tween was created, they're recorded.
11084
11085      prevStartAt._lazy = 0;
11086    }
11087
11088    if (startAt) {
11089      _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({
11090        data: "isStart",
11091        overwrite: false,
11092        parent: parent,
11093        immediateRender: true,
11094        lazy: !prevStartAt && _isNotFalse(lazy),
11095        startAt: null,
11096        delay: 0,
11097        onUpdate: onUpdate && function () {
11098          return _callback(tween, "onUpdate");
11099        },
11100        stagger: 0
11101      }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from);
11102
11103
11104      tween._startAt._dp = 0; // don't allow it to get put back into root timeline! Like when revert() is called and totalTime() gets set.
11105
11106      tween._startAt._sat = tween; // used in globalTime(). _sat stands for _startAtTween
11107
11108      time < 0 && (_reverting || !immediateRender && !autoRevert) && tween._startAt.revert(_revertConfigNoKill); // rare edge case, like if a render is forced in the negative direction of a non-initted tween.
11109
11110      if (immediateRender) {
11111        if (dur && time <= 0 && tTime <= 0) {
11112          // check tTime here because in the case of a yoyo tween whose playhead gets pushed to the end like tween.progress(1), we should allow it through so that the onComplete gets fired properly.
11113          time && (tween._zTime = time);
11114          return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.
11115        }
11116      }
11117    } else if (runBackwards && dur) {
11118      // from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards)
11119      if (!prevStartAt) {
11120        time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0
11121
11122        p = _setDefaults({
11123          overwrite: false,
11124          data: "isFromStart",
11125          //we tag the tween with as "isFromStart" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a "from()" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in.
11126          lazy: immediateRender && !prevStartAt && _isNotFalse(lazy),
11127          immediateRender: immediateRender,
11128          //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after)
11129          stagger: 0,
11130          parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(".class", {y: gsap.utils.wrap([-100,100]), stagger: 0.5})
11131
11132        }, cleanVars);
11133        harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}})
11134
11135        _removeFromParent(tween._startAt = Tween.set(targets, p));
11136
11137        tween._startAt._dp = 0; // don't allow it to get put back into root timeline!
11138
11139        tween._startAt._sat = tween; // used in globalTime()
11140
11141        time < 0 && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween._startAt.render(-1, true));
11142        tween._zTime = time;
11143
11144        if (!immediateRender) {
11145          _initTween(tween._startAt, _tinyNum, _tinyNum); //ensures that the initial values are recorded
11146
11147        } else if (!time) {
11148          return;
11149        }
11150      }
11151    }
11152
11153    tween._pt = tween._ptCache = 0;
11154    lazy = dur && _isNotFalse(lazy) || lazy && !dur;
11155
11156    for (i = 0; i < targets.length; i++) {
11157      target = targets[i];
11158      gsData = target._gsap || _harness(targets)[i]._gsap;
11159      tween._ptLookup[i] = ptLookup = {};
11160      _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end)
11161
11162      index = fullTargets === targets ? i : fullTargets.indexOf(target);
11163
11164      if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) {
11165        tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority);
11166
11167        plugin._props.forEach(function (name) {
11168          ptLookup[name] = pt;
11169        });
11170
11171        plugin.priority && (hasPriority = 1);
11172      }
11173
11174      if (!harness || harnessVars) {
11175        for (p in cleanVars) {
11176          if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) {
11177            plugin.priority && (hasPriority = 1);
11178          } else {
11179            ptLookup[p] = pt = _addPropTween.call(tween, target, p, "get", cleanVars[p], index, fullTargets, 0, vars.stringFilter);
11180          }
11181        }
11182      }
11183
11184      tween._op && tween._op[i] && tween.kill(target, tween._op[i]);
11185
11186      if (autoOverwrite && tween._pt) {
11187        _overwritingTween = tween;
11188
11189        _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time)); // make sure the overwriting doesn't overwrite THIS tween!!!
11190
11191
11192        overwritten = !tween.parent;
11193        _overwritingTween = 0;
11194      }
11195
11196      tween._pt && lazy && (_lazyLookup[gsData.id] = 1);
11197    }
11198
11199    hasPriority && _sortPropTweensByPriority(tween);
11200    tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down.
11201  }
11202
11203  tween._onUpdate = onUpdate;
11204  tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick.
11205
11206  keyframes && time <= 0 && tl.render(_bigNum, true, true); // if there's a 0% keyframe, it'll render in the "before" state for any staggered/delayed animations thus when the following tween initializes, it'll use the "before" state instead of the "after" state as the initial values.
11207},
11208    _updatePropTweens = function _updatePropTweens(tween, property, value, start, startIsRelative, ratio, time, skipRecursion) {
11209  var ptCache = (tween._pt && tween._ptCache || (tween._ptCache = {}))[property],
11210      pt,
11211      rootPT,
11212      lookup,
11213      i;
11214
11215  if (!ptCache) {
11216    ptCache = tween._ptCache[property] = [];
11217    lookup = tween._ptLookup;
11218    i = tween._targets.length;
11219
11220    while (i--) {
11221      pt = lookup[i][property];
11222
11223      if (pt && pt.d && pt.d._pt) {
11224        // it's a plugin, so find the nested PropTween
11225        pt = pt.d._pt;
11226
11227        while (pt && pt.p !== property && pt.fp !== property) {
11228          // "fp" is functionParam for things like setting CSS variables which require .setProperty("--var-name", value)
11229          pt = pt._next;
11230        }
11231      }
11232
11233      if (!pt) {
11234        // there is no PropTween associated with that property, so we must FORCE one to be created and ditch out of this
11235        // if the tween has other properties that already rendered at new positions, we'd normally have to rewind to put them back like tween.render(0, true) before forcing an _initTween(), but that can create another edge case like tweening a timeline's progress would trigger onUpdates to fire which could move other things around. It's better to just inform users that .resetTo() should ONLY be used for tweens that already have that property. For example, you can't gsap.to(...{ y: 0 }) and then tween.restTo("x", 200) for example.
11236        _forceAllPropTweens = 1; // otherwise, when we _addPropTween() and it finds no change between the start and end values, it skips creating a PropTween (for efficiency...why tween when there's no difference?) but in this case we NEED that PropTween created so we can edit it.
11237
11238        tween.vars[property] = "+=0";
11239
11240        _initTween(tween, time);
11241
11242        _forceAllPropTweens = 0;
11243        return skipRecursion ? _warn(property + " not eligible for reset. Try splitting into individual properties") : 1; // if someone tries to do a quickTo() on a special property like borderRadius which must get split into 4 different properties, that's not eligible for .resetTo().
11244      }
11245
11246      ptCache.push(pt);
11247    }
11248  }
11249
11250  i = ptCache.length;
11251
11252  while (i--) {
11253    rootPT = ptCache[i];
11254    pt = rootPT._pt || rootPT; // complex values may have nested PropTweens. We only accommodate the FIRST value.
11255
11256    pt.s = (start || start === 0) && !startIsRelative ? start : pt.s + (start || 0) + ratio * pt.c;
11257    pt.c = value - pt.s;
11258    rootPT.e && (rootPT.e = _round(value) + getUnit(rootPT.e)); // mainly for CSSPlugin (end value)
11259
11260    rootPT.b && (rootPT.b = pt.s + getUnit(rootPT.b)); // (beginning value)
11261  }
11262},
11263    _addAliasesToVars = function _addAliasesToVars(targets, vars) {
11264  var harness = targets[0] ? _getCache(targets[0]).harness : 0,
11265      propertyAliases = harness && harness.aliases,
11266      copy,
11267      p,
11268      i,
11269      aliases;
11270
11271  if (!propertyAliases) {
11272    return vars;
11273  }
11274
11275  copy = _merge({}, vars);
11276
11277  for (p in propertyAliases) {
11278    if (p in copy) {
11279      aliases = propertyAliases[p].split(",");
11280      i = aliases.length;
11281
11282      while (i--) {
11283        copy[aliases[i]] = copy[p];
11284      }
11285    }
11286  }
11287
11288  return copy;
11289},
11290    // parses multiple formats, like {"0%": {x: 100}, {"50%": {x: -20}} and { x: {"0%": 100, "50%": -20} }, and an "ease" can be set on any object. We populate an "allProps" object with an Array for each property, like {x: [{}, {}], y:[{}, {}]} with data for each property tween. The objects have a "t" (time), "v", (value), and "e" (ease) property. This allows us to piece together a timeline later.
11291_parseKeyframe = function _parseKeyframe(prop, obj, allProps, easeEach) {
11292  var ease = obj.ease || easeEach || "power1.inOut",
11293      p,
11294      a;
11295
11296  if (_isArray(obj)) {
11297    a = allProps[prop] || (allProps[prop] = []); // t = time (out of 100), v = value, e = ease
11298
11299    obj.forEach(function (value, i) {
11300      return a.push({
11301        t: i / (obj.length - 1) * 100,
11302        v: value,
11303        e: ease
11304      });
11305    });
11306  } else {
11307    for (p in obj) {
11308      a = allProps[p] || (allProps[p] = []);
11309      p === "ease" || a.push({
11310        t: parseFloat(prop),
11311        v: obj[p],
11312        e: ease
11313      });
11314    }
11315  }
11316},
11317    _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) {
11318  return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf("random(") ? _replaceRandom(value) : value;
11319},
11320    _staggerTweenProps = _callbackNames + "repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,easeReverse,autoRevert",
11321    _staggerPropsToSkip = {};
11322
11323_forEachName(_staggerTweenProps + ",id,stagger,delay,duration,paused,scrollTrigger", function (name) {
11324  return _staggerPropsToSkip[name] = 1;
11325});
11326/*
11327 * --------------------------------------------------------------------------------------
11328 * TWEEN
11329 * --------------------------------------------------------------------------------------
11330 */
11331
11332
11333var Tween = /*#__PURE__*/function (_Animation2) {
11334  _inheritsLoose(Tween, _Animation2);
11335
11336  function Tween(targets, vars, position, skipInherit) {
11337    var _this3;
11338
11339    if (typeof vars === "number") {
11340      position.duration = vars;
11341      vars = position;
11342      position = null;
11343    }
11344
11345    _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars)) || this;
11346    var _this3$vars = _this3.vars,
11347        duration = _this3$vars.duration,
11348        delay = _this3$vars.delay,
11349        immediateRender = _this3$vars.immediateRender,
11350        stagger = _this3$vars.stagger,
11351        overwrite = _this3$vars.overwrite,
11352        keyframes = _this3$vars.keyframes,
11353        defaults = _this3$vars.defaults,
11354        scrollTrigger = _this3$vars.scrollTrigger,
11355        parent = vars.parent || _globalTimeline,
11356        parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : "length" in vars) ? [targets] : toArray(targets),
11357        tl,
11358        i,
11359        copy,
11360        l,
11361        p,
11362        curTarget,
11363        staggerFunc,
11364        staggerVarsToMerge;
11365    _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn("GSAP target " + targets + " not found. https://gsap.com", !_config.nullTargetWarn) || [];
11366    _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property
11367
11368    _this3._overwrite = overwrite;
11369
11370    if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {
11371      vars = _this3.vars;
11372      var easeReverse = vars.easeReverse || vars.yoyoEase;
11373      tl = _this3.timeline = new Timeline({
11374        data: "nested",
11375        defaults: defaults || {},
11376        targets: parent && parent.data === "nested" ? parent.vars.targets : parsedTargets
11377      }); // we need to store the targets because for staggers and keyframes, we end up creating an individual tween for each but function-based values need to know the index and the whole Array of targets.
11378
11379      tl.kill();
11380      tl.parent = tl._dp = _assertThisInitialized(_this3);
11381      tl._start = 0;
11382
11383      if (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {
11384        l = parsedTargets.length;
11385        staggerFunc = stagger && distribute(stagger);
11386
11387        if (_isObject(stagger)) {
11388          //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween.
11389          for (p in stagger) {
11390            if (~_staggerTweenProps.indexOf(p)) {
11391              staggerVarsToMerge || (staggerVarsToMerge = {});
11392              staggerVarsToMerge[p] = stagger[p];
11393            }
11394          }
11395        }
11396
11397        for (i = 0; i < l; i++) {
11398          copy = _copyExcluding(vars, _staggerPropsToSkip);
11399          copy.stagger = 0;
11400          easeReverse && (copy.easeReverse = easeReverse);
11401          staggerVarsToMerge && _merge(copy, staggerVarsToMerge);
11402          curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0.
11403
11404          copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets);
11405          copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay;
11406
11407          if (!stagger && l === 1 && copy.delay) {
11408            // if someone does delay:"random(1, 5)", repeat:-1, for example, the delay shouldn't be inside the repeat.
11409            _this3._delay = delay = copy.delay;
11410            _this3._start += delay;
11411            copy.delay = 0;
11412          }
11413
11414          tl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0);
11415          tl._ease = _easeMap.none;
11416        }
11417
11418        tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally!
11419      } else if (keyframes) {
11420        _inheritDefaults(_setDefaults(tl.vars.defaults, {
11421          ease: "none"
11422        }));
11423
11424        tl._ease = _parseEase(keyframes.ease || vars.ease || "none");
11425        var time = 0,
11426            a,
11427            kf,
11428            v;
11429
11430        if (_isArray(keyframes)) {
11431          keyframes.forEach(function (frame) {
11432            return tl.to(parsedTargets, frame, ">");
11433          });
11434          tl.duration(); // to ensure tl._dur is cached because we tap into it for performance purposes in the render() method.
11435        } else {
11436          copy = {};
11437
11438          for (p in keyframes) {
11439            p === "ease" || p === "easeEach" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach);
11440          }
11441
11442          for (p in copy) {
11443            a = copy[p].sort(function (a, b) {
11444              return a.t - b.t;
11445            });
11446            time = 0;
11447
11448            for (i = 0; i < a.length; i++) {
11449              kf = a[i];
11450              v = {
11451                ease: kf.e,
11452                duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration
11453              };
11454              v[p] = kf.v;
11455              tl.to(parsedTargets, v, time);
11456              time += v.duration;
11457            }
11458          }
11459
11460          tl.duration() < duration && tl.to({}, {
11461            duration: duration - tl.duration()
11462          }); // in case keyframes didn't go to 100%
11463        }
11464      }
11465
11466      duration || _this3.duration(duration = tl.duration());
11467    } else {
11468      _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain)
11469    }
11470
11471    if (overwrite === true && !_suppressOverwrites) {
11472      _overwritingTween = _assertThisInitialized(_this3);
11473
11474      _globalTimeline.killTweensOf(parsedTargets);
11475
11476      _overwritingTween = 0;
11477    }
11478
11479    _addToTimeline(parent, _assertThisInitialized(_this3), position);
11480
11481    vars.reversed && _this3.reverse();
11482    vars.paused && _this3.paused(true);
11483
11484    if (immediateRender || !duration && !keyframes && _this3._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== "nested") {
11485      _this3._tTime = -_tinyNum; //forces a render without having to set the render() "force" parameter to true because we want to allow lazying by default (using the "force" parameter always forces an immediate full render)
11486
11487      _this3.render(Math.max(0, -delay) || 0); //in case delay is negative
11488
11489    }
11490
11491    scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger);
11492    return _this3;
11493  }
11494
11495  var _proto3 = Tween.prototype;
11496
11497  _proto3.render = function render(totalTime, suppressEvents, force) {
11498    var prevTime = this._time,
11499        tDur = this._tDur,
11500        dur = this._dur,
11501        isNegative = totalTime < 0,
11502        tTime = totalTime > tDur - _tinyNum && !isNegative ? tDur : totalTime < _tinyNum ? 0 : totalTime,
11503        time,
11504        pt,
11505        iteration,
11506        cycleDuration,
11507        prevIteration,
11508        isYoyo,
11509        ratio,
11510        timeline;
11511
11512    if (!dur) {
11513      _renderZeroDurationTween(this, totalTime, suppressEvents, force);
11514    } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== isNegative || this._lazy) {
11515      // this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0)
11516      time = tTime;
11517      timeline = this.timeline;
11518
11519      if (this._repeat) {
11520        //adjust the time for repeats and yoyos
11521        cycleDuration = dur + this._rDelay;
11522
11523        if (this._repeat < -1 && isNegative) {
11524          return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);
11525        }
11526
11527        time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)
11528
11529        if (tTime === tDur) {
11530          // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)
11531          iteration = this._repeat;
11532          time = dur;
11533        } else {
11534          prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)
11535
11536          iteration = ~~prevIteration;
11537
11538          if (iteration && iteration === prevIteration) {
11539            time = dur;
11540            iteration--;
11541          } else if (time > dur) {
11542            time = dur;
11543          }
11544        }
11545
11546        isYoyo = this._yoyo && iteration & 1;
11547        if (isYoyo) time = dur - time;
11548        prevIteration = _animationCycle(this._tTime, cycleDuration);
11549
11550        if (time === prevTime && !force && this._initted && iteration === prevIteration) {
11551          //could be during the repeatDelay part. No need to render and fire callbacks.
11552          this._tTime = tTime;
11553          return this;
11554        }
11555
11556        if (iteration !== prevIteration) {
11557          //repeatRefresh functionality
11558          if (this.vars.repeatRefresh && !isYoyo && !this._lock && time !== cycleDuration && this._initted) {
11559            // this._time will === cycleDuration when we render at EXACTLY the end of an iteration. Without this condition, it'd often do the repeatRefresh render TWICE (again on the very next tick).
11560            this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick.
11561
11562            this.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0;
11563          }
11564        }
11565      }
11566
11567      if (!this._initted) {
11568        if (_attemptInitTween(this, isNegative ? totalTime : time, force, suppressEvents, tTime)) {
11569          this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number.
11570
11571          return this;
11572        }
11573
11574        if (prevTime !== this._time && !(force && this.vars.repeatRefresh && iteration !== prevIteration)) {
11575          // rare edge case - during initialization, an onUpdate in the _startAt (.fromTo()) might force this tween to render at a different spot in which case we should ditch this render() call so that it doesn't revert the values. But we also don't want to dump if we're doing a repeatRefresh render!
11576          return this;
11577        }
11578
11579        if (dur !== this._dur) {
11580          // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should.
11581          return this.render(totalTime, suppressEvents, force);
11582        }
11583      }
11584
11585      if (this._rEase) {
11586        var inv = time < prevTime;
11587
11588        if (inv !== this._inv) {
11589          var segDur = inv ? prevTime : dur - prevTime;
11590          this._inv = inv;
11591          if (this._from) this.ratio = 1 - this.ratio;
11592          this._invRatio = this.ratio;
11593          this._invTime = prevTime;
11594          this._invRecip = segDur ? (inv ? -1 : 1) / segDur : 0;
11595          this._invScale = inv ? -this.ratio : 1 - this.ratio;
11596          this._invEase = inv ? this._rEase : this._ease;
11597        }
11598
11599        this.ratio = ratio = this._invRatio + this._invScale * this._invEase((time - this._invTime) * this._invRecip);
11600      } else {
11601        this.ratio = ratio = this._ease(time / dur);
11602      }
11603
11604      if (this._from) this.ratio = ratio = 1 - ratio;
11605      this._tTime = tTime;
11606      this._time = time;
11607
11608      if (!this._act && this._ts) {
11609        this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.
11610
11611        this._lazy = 0;
11612      }
11613
11614      if (!prevTime && tTime && !suppressEvents && !prevIteration) {
11615        _callback(this, "onStart");
11616
11617        if (this._tTime !== tTime) {
11618          // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.
11619          return this;
11620        }
11621      }
11622
11623      pt = this._pt;
11624
11625      while (pt) {
11626        pt.r(ratio, pt.d);
11627        pt = pt._next;
11628      }
11629
11630      timeline && timeline.render(totalTime < 0 ? totalTime : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force) || this._startAt && (this._zTime = totalTime);
11631
11632      if (this._onUpdate && !suppressEvents) {
11633        isNegative && _rewindStartAt(this, totalTime, suppressEvents, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.
11634
11635        _callback(this, "onUpdate");
11636      }
11637
11638      this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, "onRepeat");
11639
11640      if ((tTime === this._tDur || !tTime) && this._tTime === tTime) {
11641        isNegative && !this._onUpdate && _rewindStartAt(this, totalTime, true, true);
11642        (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.
11643
11644        if (!suppressEvents && !(isNegative && !prevTime) && (tTime || prevTime || isYoyo)) {
11645          // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play();
11646          _callback(this, tTime === tDur ? "onComplete" : "onReverseComplete", true);
11647
11648          this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();
11649        }
11650      }
11651    }
11652
11653    return this;
11654  };
11655
11656  _proto3.targets = function targets() {
11657    return this._targets;
11658  };
11659
11660  _proto3.invalidate = function invalidate(soft) {
11661    // "soft" gives us a way to clear out everything EXCEPT the recorded pre-"from" portion of from() tweens. Otherwise, for example, if you tween.progress(1).render(0, true true).invalidate(), the "from" values would persist and then on the next render, the from() tweens would initialize and the current value would match the "from" values, thus animate from the same value to the same value (no animation). We tap into this in ScrollTrigger's refresh() where we must push a tween to completion and then back again but honor its init state in case the tween is dependent on another tween further up on the page.
11662    (!soft || !this.vars.runBackwards) && (this._startAt = 0);
11663    this._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0;
11664    this._ptLookup = [];
11665    this.timeline && this.timeline.invalidate(soft);
11666    return _Animation2.prototype.invalidate.call(this, soft);
11667  };
11668
11669  _proto3.resetTo = function resetTo(property, value, start, startIsRelative, skipRecursion) {
11670    _tickerActive || _ticker.wake();
11671    this._ts || this.play();
11672    var time = Math.min(this._dur, (this._dp._time - this._start) * this._ts),
11673        ratio;
11674    this._initted || _initTween(this, time);
11675    ratio = this._ease(time / this._dur); // don't just get tween.ratio because it may not have rendered yet.
11676    // possible future addition to allow an object with multiple values to update, like tween.resetTo({x: 100, y: 200}); At this point, it doesn't seem worth the added kb given the fact that most users will likely opt for the convenient gsap.quickTo() way of interacting with this method.
11677    // if (_isObject(property)) { // performance optimization
11678    // 	for (p in property) {
11679    // 		if (_updatePropTweens(this, p, property[p], value ? value[p] : null, start, ratio, time)) {
11680    // 			return this.resetTo(property, value, start, startIsRelative); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.
11681    // 		}
11682    // 	}
11683    // } else {
11684
11685    if (_updatePropTweens(this, property, value, start, startIsRelative, ratio, time, skipRecursion)) {
11686      return this.resetTo(property, value, start, startIsRelative, 1); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.
11687    } //}
11688
11689
11690    _alignPlayhead(this, 0);
11691
11692    this.parent || _addLinkedListItem(this._dp, this, "_first", "_last", this._dp._sort ? "_start" : 0);
11693    return this.render(0);
11694  };
11695
11696  _proto3.kill = function kill(targets, vars) {
11697    if (vars === void 0) {
11698      vars = "all";
11699    }
11700
11701    if (!targets && (!vars || vars === "all")) {
11702      this._lazy = this._pt = 0;
11703      this.parent ? _interrupt(this) : this.scrollTrigger && this.scrollTrigger.kill(!!_reverting);
11704      return this;
11705    }
11706
11707    if (this.timeline) {
11708      var tDur = this.timeline.totalDuration();
11709      this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt.
11710
11711      this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to.
11712
11713      return this;
11714    }
11715
11716    var parsedTargets = this._targets,
11717        killingTargets = targets ? toArray(targets) : parsedTargets,
11718        propTweenLookup = this._ptLookup,
11719        firstPT = this._pt,
11720        overwrittenProps,
11721        curLookup,
11722        curOverwriteProps,
11723        props,
11724        p,
11725        pt,
11726        i;
11727
11728    if ((!vars || vars === "all") && _arraysMatch(parsedTargets, killingTargets)) {
11729      vars === "all" && (this._pt = 0);
11730      return _interrupt(this);
11731    }
11732
11733    overwrittenProps = this._op = this._op || [];
11734
11735    if (vars !== "all") {
11736      //so people can pass in a comma-delimited list of property names
11737      if (_isString(vars)) {
11738        p = {};
11739
11740        _forEachName(vars, function (name) {
11741          return p[name] = 1;
11742        });
11743
11744        vars = p;
11745      }
11746
11747      vars = _addAliasesToVars(parsedTargets, vars);
11748    }
11749
11750    i = parsedTargets.length;
11751
11752    while (i--) {
11753      if (~killingTargets.indexOf(parsedTargets[i])) {
11754        curLookup = propTweenLookup[i];
11755
11756        if (vars === "all") {
11757          overwrittenProps[i] = vars;
11758          props = curLookup;
11759          curOverwriteProps = {};
11760        } else {
11761          curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {};
11762          props = vars;
11763        }
11764
11765        for (p in props) {
11766          pt = curLookup && curLookup[p];
11767
11768          if (pt) {
11769            if (!("kill" in pt.d) || pt.d.kill(p) === true) {
11770              _removeLinkedListItem(this, pt, "_pt");
11771            }
11772
11773            delete curLookup[p];
11774          }
11775
11776          if (curOverwriteProps !== "all") {
11777            curOverwriteProps[p] = 1;
11778          }
11779        }
11780      }
11781    }
11782
11783    this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening.
11784
11785    return this;
11786  };
11787
11788  Tween.to = function to(targets, vars) {
11789    return new Tween(targets, vars, arguments[2]);
11790  };
11791
11792  Tween.from = function from(targets, vars) {
11793    return _createTweenType(1, arguments);
11794  };
11795
11796  Tween.delayedCall = function delayedCall(delay, callback, params, scope) {
11797    return new Tween(callback, 0, {
11798      immediateRender: false,
11799      lazy: false,
11800      overwrite: false,
11801      delay: delay,
11802      onComplete: callback,
11803      onReverseComplete: callback,
11804      onCompleteParams: params,
11805      onReverseCompleteParams: params,
11806      callbackScope: scope
11807    }); // we must use onReverseComplete too for things like timeline.add(() => {...}) which should be triggered in BOTH directions (forward and reverse)
11808  };
11809
11810  Tween.fromTo = function fromTo(targets, fromVars, toVars) {
11811    return _createTweenType(2, arguments);
11812  };
11813
11814  Tween.set = function set(targets, vars) {
11815    vars.duration = 0;
11816    vars.repeatDelay || (vars.repeat = 0);
11817    return new Tween(targets, vars);
11818  };
11819
11820  Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) {
11821    return _globalTimeline.killTweensOf(targets, props, onlyActive);
11822  };
11823
11824  return Tween;
11825}(Animation);
11826
11827_setDefaults(Tween.prototype, {
11828  _targets: [],
11829  _lazy: 0,
11830  _startAt: 0,
11831  _op: 0,
11832  _onInit: 0
11833}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners)
11834// _forEachName("to,from,fromTo,set,call,add,addLabel,addPause", name => {
11835// 	Tween.prototype[name] = function() {
11836// 		let tl = new Timeline();
11837// 		return _addToTimeline(tl, this)[name].apply(tl, toArray(arguments));
11838// 	}
11839// });
11840//for backward compatibility. Leverage the timeline calls.
11841
11842
11843_forEachName("staggerTo,staggerFrom,staggerFromTo", function (name) {
11844  Tween[name] = function () {
11845    var tl = new Timeline(),
11846        params = _slice.call(arguments, 0);
11847
11848    params.splice(name === "staggerFromTo" ? 5 : 4, 0, 0);
11849    return tl[name].apply(tl, params);
11850  };
11851});
11852/*
11853 * --------------------------------------------------------------------------------------
11854 * PROPTWEEN
11855 * --------------------------------------------------------------------------------------
11856 */
11857
11858
11859var _setterPlain = function _setterPlain(target, property, value) {
11860  return target[property] = value;
11861},
11862    _setterFunc = function _setterFunc(target, property, value) {
11863  return target[property](value);
11864},
11865    _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) {
11866  return target[property](data.fp, value);
11867},
11868    _setterAttribute = function _setterAttribute(target, property, value) {
11869  return target.setAttribute(property, value);
11870},
11871    _getSetter = function _getSetter(target, property) {
11872  return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain;
11873},
11874    _renderPlain = function _renderPlain(ratio, data) {
11875  return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data);
11876},
11877    _renderBoolean = function _renderBoolean(ratio, data) {
11878  return data.set(data.t, data.p, !!(data.s + data.c * ratio), data);
11879},
11880    _renderComplexString = function _renderComplexString(ratio, data) {
11881  var pt = data._pt,
11882      s = "";
11883
11884  if (!ratio && data.b) {
11885    //b = beginning string
11886    s = data.b;
11887  } else if (ratio === 1 && data.e) {
11888    //e = ending string
11889    s = data.e;
11890  } else {
11891    while (pt) {
11892      s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the "p" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors.
11893
11894      pt = pt._next;
11895    }
11896
11897    s += data.c; //we use the "c" of the PropTween to store the final chunk of non-numeric text.
11898  }
11899
11900  data.set(data.t, data.p, s, data);
11901},
11902    _renderPropTweens = function _renderPropTweens(ratio, data) {
11903  var pt = data._pt;
11904
11905  while (pt) {
11906    pt.r(ratio, pt.d);
11907    pt = pt._next;
11908  }
11909},
11910    _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) {
11911  var pt = this._pt,
11912      next;
11913
11914  while (pt) {
11915    next = pt._next;
11916    pt.p === property && pt.modifier(modifier, tween, target);
11917    pt = next;
11918  }
11919},
11920    _killPropTweensOf = function _killPropTweensOf(property) {
11921  var pt = this._pt,
11922      hasNonDependentRemaining,
11923      next;
11924
11925  while (pt) {
11926    next = pt._next;
11927
11928    if (pt.p === property && !pt.op || pt.op === property) {
11929      _removeLinkedListItem(this, pt, "_pt");
11930    } else if (!pt.dep) {
11931      hasNonDependentRemaining = 1;
11932    }
11933
11934    pt = next;
11935  }
11936
11937  return !hasNonDependentRemaining;
11938},
11939    _setterWithModifier = function _setterWithModifier(target, property, value, data) {
11940  data.mSet(target, property, data.m.call(data.tween, value, data.mt), data);
11941},
11942    _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) {
11943  var pt = parent._pt,
11944      next,
11945      pt2,
11946      first,
11947      last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin)
11948
11949  while (pt) {
11950    next = pt._next;
11951    pt2 = first;
11952
11953    while (pt2 && pt2.pr > pt.pr) {
11954      pt2 = pt2._next;
11955    }
11956
11957    if (pt._prev = pt2 ? pt2._prev : last) {
11958      pt._prev._next = pt;
11959    } else {
11960      first = pt;
11961    }
11962
11963    if (pt._next = pt2) {
11964      pt2._prev = pt;
11965    } else {
11966      last = pt;
11967    }
11968
11969    pt = next;
11970  }
11971
11972  parent._pt = first;
11973}; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added)
11974
11975
11976var PropTween = /*#__PURE__*/function () {
11977  function PropTween(next, target, prop, start, change, renderer, data, setter, priority) {
11978    this.t = target;
11979    this.s = start;
11980    this.c = change;
11981    this.p = prop;
11982    this.r = renderer || _renderPlain;
11983    this.d = data || this;
11984    this.set = setter || _setterPlain;
11985    this.pr = priority || 0;
11986    this._next = next;
11987
11988    if (next) {
11989      next._prev = this;
11990    }
11991  }
11992
11993  var _proto4 = PropTween.prototype;
11994
11995  _proto4.modifier = function modifier(func, tween, target) {
11996    this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier)
11997
11998    this.set = _setterWithModifier;
11999    this.m = func;
12000    this.mt = target; //modifier target
12001
12002    this.tween = tween;
12003  };
12004
12005  return PropTween;
12006}(); //Initialization tasks
12007
12008_forEachName(_callbackNames + "parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger,easeReverse", function (name) {
12009  return _reservedProps[name] = 1;
12010});
12011
12012_globals.TweenMax = _globals.TweenLite = Tween;
12013_globals.TimelineLite = _globals.TimelineMax = Timeline;
12014_globalTimeline = new Timeline({
12015  sortChildren: false,
12016  defaults: _defaults,
12017  autoRemoveChildren: true,
12018  id: "root",
12019  smoothChildTiming: true
12020});
12021_config.stringFilter = _colorStringFilter;
12022
12023var _media = [],
12024    _listeners = {},
12025    _emptyArray = [],
12026    _lastMediaTime = 0,
12027    _contextID = 0,
12028    _dispatch = function _dispatch(type) {
12029  return (_listeners[type] || _emptyArray).map(function (f) {
12030    return f();
12031  });
12032},
12033    _onMediaChange = function _onMediaChange() {
12034  var time = Date.now(),
12035      matches = [];
12036
12037  if (time - _lastMediaTime > 2) {
12038    _dispatch("matchMediaInit");
12039
12040    _media.forEach(function (c) {
12041      var queries = c.queries,
12042          conditions = c.conditions,
12043          match,
12044          p,
12045          anyMatch,
12046          toggled;
12047
12048      for (p in queries) {
12049        match = _win.matchMedia(queries[p]).matches; // Firefox doesn't update the "matches" property of the MediaQueryList object correctly - it only does so as it calls its change handler - so we must re-create a media query here to ensure it's accurate.
12050
12051        match && (anyMatch = 1);
12052
12053        if (match !== conditions[p]) {
12054          conditions[p] = match;
12055          toggled = 1;
12056        }
12057      }
12058
12059      if (toggled) {
12060        c.revert();
12061        anyMatch && matches.push(c);
12062      }
12063    });
12064
12065    _dispatch("matchMediaRevert");
12066
12067    matches.forEach(function (c) {
12068      return c.onMatch(c, function (func) {
12069        return c.add(null, func);
12070      });
12071    });
12072    _lastMediaTime = time;
12073
12074    _dispatch("matchMedia");
12075  }
12076};
12077
12078var Context = /*#__PURE__*/function () {
12079  function Context(func, scope) {
12080    this.selector = scope && selector(scope);
12081    this.data = [];
12082    this._r = []; // returned/cleanup functions
12083
12084    this.isReverted = false;
12085    this.id = _contextID++; // to work around issues that frameworks like Vue cause by making things into Proxies which make it impossible to do something like _media.indexOf(this) because "this" would no longer refer to the Context instance itself - it'd refer to a Proxy! We needed a way to identify the context uniquely
12086
12087    func && this.add(func);
12088  }
12089
12090  var _proto5 = Context.prototype;
12091
12092  _proto5.add = function add(name, func, scope) {
12093    // possible future addition if we need the ability to add() an animation to a context and for whatever reason cannot create that animation inside of a context.add(() => {...}) function.
12094    // if (name && _isFunction(name.revert)) {
12095    // 	this.data.push(name);
12096    // 	return (name._ctx = this);
12097    // }
12098    if (_isFunction(name)) {
12099      scope = func;
12100      func = name;
12101      name = _isFunction;
12102    }
12103
12104    var self = this,
12105        f = function f() {
12106      var prev = _context,
12107          prevSelector = self.selector,
12108          result;
12109      prev && prev !== self && prev.data.push(self);
12110      scope && (self.selector = selector(scope));
12111      _context = self;
12112      result = func.apply(self, arguments);
12113      _isFunction(result) && self._r.push(result);
12114      _context = prev;
12115      self.selector = prevSelector;
12116      self.isReverted = false;
12117      return result;
12118    };
12119
12120    self.last = f;
12121    return name === _isFunction ? f(self, function (func) {
12122      return self.add(null, func);
12123    }) : name ? self[name] = f : f;
12124  };
12125
12126  _proto5.ignore = function ignore(func) {
12127    var prev = _context;
12128    _context = null;
12129    func(this);
12130    _context = prev;
12131  };
12132
12133  _proto5.getTweens = function getTweens() {
12134    var a = [];
12135    this.data.forEach(function (e) {
12136      return e instanceof Context ? a.push.apply(a, e.getTweens()) : e instanceof Tween && !(e.parent && e.parent.data === "nested") && a.push(e);
12137    });
12138    return a;
12139  };
12140
12141  _proto5.clear = function clear() {
12142    this._r.length = this.data.length = 0;
12143  };
12144
12145  _proto5.kill = function kill(revert, matchMedia) {
12146    var _this4 = this;
12147
12148    if (revert) {
12149      (function () {
12150        var tweens = _this4.getTweens(),
12151            i = _this4.data.length,
12152            t;
12153
12154        while (i--) {
12155          // Flip plugin tweens are very different in that they should actually be pushed to their end. The plugin replaces the timeline's .revert() method to do exactly that. But we also need to remove any of those nested tweens inside the flip timeline so that they don't get individually reverted.
12156          t = _this4.data[i];
12157
12158          if (t.data === "isFlip") {
12159            t.revert();
12160            t.getChildren(true, true, false).forEach(function (tween) {
12161              return tweens.splice(tweens.indexOf(tween), 1);
12162            });
12163          }
12164        } // save as an object so that we can cache the globalTime for each tween to optimize performance during the sort
12165
12166
12167        tweens.map(function (t) {
12168          return {
12169            g: t._dur || t._delay || t._sat && !t._sat.vars.immediateRender ? t.globalTime(0) : -Infinity,
12170            t: t
12171          };
12172        }).sort(function (a, b) {
12173          return b.g - a.g || -Infinity;
12174        }).forEach(function (o) {
12175          return o.t.revert(revert);
12176        }); // note: all of the _startAt tweens should be reverted in reverse order that they were created, and they'll all have the same globalTime (-1) so the " || -1" in the sort keeps the order properly.
12177
12178        i = _this4.data.length;
12179
12180        while (i--) {
12181          // make sure we loop backwards so that, for example, SplitTexts that were created later on the same element get reverted first
12182          t = _this4.data[i];
12183
12184          if (t instanceof Timeline) {
12185            if (t.data !== "nested") {
12186              t.scrollTrigger && t.scrollTrigger.revert();
12187              t.kill(); // don't revert() the timeline because that's duplicating efforts since we already reverted all the tweens
12188            }
12189          } else {
12190            !(t instanceof Tween) && t.revert && t.revert(revert);
12191          }
12192        }
12193
12194        _this4._r.forEach(function (f) {
12195          return f(revert, _this4);
12196        });
12197
12198        _this4.isReverted = true;
12199      })();
12200    } else {
12201      this.data.forEach(function (e) {
12202        return e.kill && e.kill();
12203      });
12204    }
12205
12206    this.clear();
12207
12208    if (matchMedia) {
12209      var i = _media.length;
12210
12211      while (i--) {
12212        // previously, we checked _media.indexOf(this), but some frameworks like Vue enforce Proxy objects that make it impossible to get the proper result that way, so we must use a unique ID number instead.
12213        _media[i].id === this.id && _media.splice(i, 1);
12214      }
12215    }
12216  } // killWithCleanup() {
12217  // 	this.kill();
12218  // 	this._r.forEach(f => f(false, this));
12219  // }
12220  ;
12221
12222  _proto5.revert = function revert(config) {
12223    this.kill(config || {});
12224  };
12225
12226  return Context;
12227}();
12228
12229var MatchMedia = /*#__PURE__*/function () {
12230  function MatchMedia(scope) {
12231    this.contexts = [];
12232    this.scope = scope;
12233    _context && _context.data.push(this);
12234  }
12235
12236  var _proto6 = MatchMedia.prototype;
12237
12238  _proto6.add = function add(conditions, func, scope) {
12239    _isObject(conditions) || (conditions = {
12240      matches: conditions
12241    });
12242    var context = new Context(0, scope || this.scope),
12243        cond = context.conditions = {},
12244        mq,
12245        p,
12246        active;
12247    _context && !context.selector && (context.selector = _context.selector); // in case a context is created inside a context. Like a gsap.matchMedia() that's inside a scoped gsap.context()
12248
12249    this.contexts.push(context);
12250    func = context.add("onMatch", func);
12251    context.queries = conditions;
12252
12253    for (p in conditions) {
12254      if (p === "all") {
12255        active = 1;
12256      } else {
12257        mq = _win.matchMedia(conditions[p]);
12258
12259        if (mq) {
12260          _media.indexOf(context) < 0 && _media.push(context);
12261          (cond[p] = mq.matches) && (active = 1);
12262          mq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener("change", _onMediaChange);
12263        }
12264      }
12265    }
12266
12267    active && func(context, function (f) {
12268      return context.add(null, f);
12269    });
12270    return this;
12271  } // refresh() {
12272  // 	let time = _lastMediaTime,
12273  // 		media = _media;
12274  // 	_lastMediaTime = -1;
12275  // 	_media = this.contexts;
12276  // 	_onMediaChange();
12277  // 	_lastMediaTime = time;
12278  // 	_media = media;
12279  // }
12280  ;
12281
12282  _proto6.revert = function revert(config) {
12283    this.kill(config || {});
12284  };
12285
12286  _proto6.kill = function kill(revert) {
12287    this.contexts.forEach(function (c) {
12288      return c.kill(revert, true);
12289    });
12290  };
12291
12292  return MatchMedia;
12293}();
12294/*
12295 * --------------------------------------------------------------------------------------
12296 * GSAP
12297 * --------------------------------------------------------------------------------------
12298 */
12299
12300
12301var _gsap = {
12302  registerPlugin: function registerPlugin() {
12303    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
12304      args[_key2] = arguments[_key2];
12305    }
12306
12307    args.forEach(function (config) {
12308      return _createPlugin(config);
12309    });
12310  },
12311  timeline: function timeline(vars) {
12312    return new Timeline(vars);
12313  },
12314  getTweensOf: function getTweensOf(targets, onlyActive) {
12315    return _globalTimeline.getTweensOf(targets, onlyActive);
12316  },
12317  getProperty: function getProperty(target, property, unit, uncache) {
12318    _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in
12319
12320    var getter = _getCache(target || {}).get,
12321        format = unit ? _passThrough : _numericIfPossible;
12322
12323    unit === "native" && (unit = "");
12324    return !target ? target : !property ? function (property, unit, uncache) {
12325      return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));
12326    } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));
12327  },
12328  quickSetter: function quickSetter(target, property, unit) {
12329    target = toArray(target);
12330
12331    if (target.length > 1) {
12332      var setters = target.map(function (t) {
12333        return gsap.quickSetter(t, property, unit);
12334      }),
12335          l = setters.length;
12336      return function (value) {
12337        var i = l;
12338
12339        while (i--) {
12340          setters[i](value);
12341        }
12342      };
12343    }
12344
12345    target = target[0] || {};
12346
12347    var Plugin = _plugins[property],
12348        cache = _getCache(target),
12349        p = cache.harness && (cache.harness.aliases || {})[property] || property,
12350        // in case it's an alias, like "rotate" for "rotation".
12351    setter = Plugin ? function (value) {
12352      var p = new Plugin();
12353      _quickTween._pt = 0;
12354      p.init(target, unit ? value + unit : value, _quickTween, 0, [target]);
12355      p.render(1, p);
12356      _quickTween._pt && _renderPropTweens(1, _quickTween);
12357    } : cache.set(target, p);
12358
12359    return Plugin ? setter : function (value) {
12360      return setter(target, p, unit ? value + unit : value, cache, 1);
12361    };
12362  },
12363  quickTo: function quickTo(target, property, vars) {
12364    var _setDefaults2;
12365
12366    var tween = gsap.to(target, _setDefaults((_setDefaults2 = {}, _setDefaults2[property] = "+=0.1", _setDefaults2.paused = true, _setDefaults2.stagger = 0, _setDefaults2), vars || {})),
12367        func = function func(value, start, startIsRelative) {
12368      return tween.resetTo(property, value, start, startIsRelative);
12369    };
12370
12371    func.tween = tween;
12372    return func;
12373  },
12374  isTweening: function isTweening(targets) {
12375    return _globalTimeline.getTweensOf(targets, true).length > 0;
12376  },
12377  defaults: function defaults(value) {
12378    value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease));
12379    return _mergeDeep(_defaults, value || {});
12380  },
12381  config: function config(value) {
12382    return _mergeDeep(_config, value || {});
12383  },
12384  registerEffect: function registerEffect(_ref3) {
12385    var name = _ref3.name,
12386        effect = _ref3.effect,
12387        plugins = _ref3.plugins,
12388        defaults = _ref3.defaults,
12389        extendTimeline = _ref3.extendTimeline;
12390    (plugins || "").split(",").forEach(function (pluginName) {
12391      return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + " effect requires " + pluginName + " plugin.");
12392    });
12393
12394    _effects[name] = function (targets, vars, tl) {
12395      return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl);
12396    };
12397
12398    if (extendTimeline) {
12399      Timeline.prototype[name] = function (targets, vars, position) {
12400        return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position);
12401      };
12402    }
12403  },
12404  registerEase: function registerEase(name, ease) {
12405    _easeMap[name] = _parseEase(ease);
12406  },
12407  parseEase: function parseEase(ease, defaultEase) {
12408    return arguments.length ? _parseEase(ease, defaultEase) : _easeMap;
12409  },
12410  getById: function getById(id) {
12411    return _globalTimeline.getById(id);
12412  },
12413  exportRoot: function exportRoot(vars, includeDelayedCalls) {
12414    if (vars === void 0) {
12415      vars = {};
12416    }
12417
12418    var tl = new Timeline(vars),
12419        child,
12420        next;
12421    tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming);
12422
12423    _globalTimeline.remove(tl);
12424
12425    tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself).
12426
12427    tl._time = tl._tTime = _globalTimeline._time;
12428    child = _globalTimeline._first;
12429
12430    while (child) {
12431      next = child._next;
12432
12433      if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) {
12434        _addToTimeline(tl, child, child._start - child._delay);
12435      }
12436
12437      child = next;
12438    }
12439
12440    _addToTimeline(_globalTimeline, tl, 0);
12441
12442    return tl;
12443  },
12444  context: function context(func, scope) {
12445    return func ? new Context(func, scope) : _context;
12446  },
12447  matchMedia: function matchMedia(scope) {
12448    return new MatchMedia(scope);
12449  },
12450  matchMediaRefresh: function matchMediaRefresh() {
12451    return _media.forEach(function (c) {
12452      var cond = c.conditions,
12453          found,
12454          p;
12455
12456      for (p in cond) {
12457        if (cond[p]) {
12458          cond[p] = false;
12459          found = 1;
12460        }
12461      }
12462
12463      found && c.revert();
12464    }) || _onMediaChange();
12465  },
12466  addEventListener: function addEventListener(type, callback) {
12467    var a = _listeners[type] || (_listeners[type] = []);
12468    ~a.indexOf(callback) || a.push(callback);
12469  },
12470  removeEventListener: function removeEventListener(type, callback) {
12471    var a = _listeners[type],
12472        i = a && a.indexOf(callback);
12473    i >= 0 && a.splice(i, 1);
12474  },
12475  utils: {
12476    wrap: wrap,
12477    wrapYoyo: wrapYoyo,
12478    distribute: distribute,
12479    random: random,
12480    snap: snap,
12481    normalize: normalize,
12482    getUnit: getUnit,
12483    clamp: clamp,
12484    splitColor: splitColor,
12485    toArray: toArray,
12486    selector: selector,
12487    mapRange: mapRange,
12488    pipe: pipe,
12489    unitize: unitize,
12490    interpolate: interpolate,
12491    shuffle: shuffle
12492  },
12493  install: _install,
12494  effects: _effects,
12495  ticker: _ticker,
12496  updateRoot: Timeline.updateRoot,
12497  plugins: _plugins,
12498  globalTimeline: _globalTimeline,
12499  core: {
12500    PropTween: PropTween,
12501    globals: _addGlobal,
12502    Tween: Tween,
12503    Timeline: Timeline,
12504    Animation: Animation,
12505    getCache: _getCache,
12506    _removeLinkedListItem: _removeLinkedListItem,
12507    reverting: function reverting() {
12508      return _reverting;
12509    },
12510    context: function context(toAdd) {
12511      if (toAdd && _context) {
12512        _context.data.push(toAdd);
12513
12514        toAdd._ctx = _context;
12515      }
12516
12517      return _context;
12518    },
12519    suppressOverwrites: function suppressOverwrites(value) {
12520      return _suppressOverwrites = value;
12521    }
12522  }
12523};
12524
12525_forEachName("to,from,fromTo,delayedCall,set,killTweensOf", function (name) {
12526  return _gsap[name] = Tween[name];
12527});
12528
12529_ticker.add(Timeline.updateRoot);
12530
12531_quickTween = _gsap.to({}, {
12532  duration: 0
12533}); // ---- EXTRA PLUGINS --------------------------------------------------------
12534
12535var _getPluginPropTween = function _getPluginPropTween(plugin, prop) {
12536  var pt = plugin._pt;
12537
12538  while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) {
12539    pt = pt._next;
12540  }
12541
12542  return pt;
12543},
12544    _addModifiers = function _addModifiers(tween, modifiers) {
12545  var targets = tween._targets,
12546      p,
12547      i,
12548      pt;
12549
12550  for (p in modifiers) {
12551    i = targets.length;
12552
12553    while (i--) {
12554      pt = tween._ptLookup[i][p];
12555
12556      if (pt && (pt = pt.d)) {
12557        if (pt._pt) {
12558          // is a plugin
12559          pt = _getPluginPropTween(pt, p);
12560        }
12561
12562        pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p);
12563      }
12564    }
12565  }
12566},
12567    _buildModifierPlugin = function _buildModifierPlugin(name, modifier) {
12568  return {
12569    name: name,
12570    headless: 1,
12571    rawVars: 1,
12572    //don't pre-process function-based values or "random()" strings.
12573    init: function init(target, vars, tween) {
12574      tween._onInit = function (tween) {
12575        var temp, p;
12576
12577        if (_isString(vars)) {
12578          temp = {};
12579
12580          _forEachName(vars, function (name) {
12581            return temp[name] = 1;
12582          }); //if the user passes in a comma-delimited list of property names to roundProps, like "x,y", we round to whole numbers.
12583
12584
12585          vars = temp;
12586        }
12587
12588        if (modifier) {
12589          temp = {};
12590
12591          for (p in vars) {
12592            temp[p] = modifier(vars[p]);
12593          }
12594
12595          vars = temp;
12596        }
12597
12598        _addModifiers(tween, vars);
12599      };
12600    }
12601  };
12602}; //register core plugins
12603
12604
vendor: 3,197 bytes, lines 12605-12666
12605var gsap = _gsap.registerPlugin({
12606  name: "attr",
12607  init: function init(target, vars, tween, index, targets) {
12608    var p, pt, v;
12609    this.tween = tween;
12610
12611    for (p in vars) {
12612      v = target.getAttribute(p) || "";
12613      pt = this.add(target, "setAttribute", (v || 0) + "", vars[p], index, targets, 0, 0, p);
12614      pt.op = p;
12615      pt.b = v; // record the beginning value so we can revert()
12616
12617      this._props.push(p);
12618    }
12619  },
12620  render: function render(ratio, data) {
12621    var pt = data._pt;
12622
12623    while (pt) {
12624      _reverting ? pt.set(pt.t, pt.p, pt.b, pt) : pt.r(ratio, pt.d); // if reverting, go back to the original (pt.b)
12625
12626      pt = pt._next;
12627    }
12628  }
12629}, {
12630  name: "endArray",
12631  headless: 1,
12632  init: function init(target, value) {
12633    var i = value.length;
12634
12635    while (i--) {
12636      this.add(target, i, target[i] || 0, value[i], 0, 0, 0, 0, 0, 1);
12637    }
12638  }
12639}, _buildModifierPlugin("roundProps", _roundModifier), _buildModifierPlugin("modifiers"), _buildModifierPlugin("snap", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way.
12640
12641Tween.version = Timeline.version = gsap.version = "3.15.0";
12642_coreReady = 1;
12643_windowExists() && _wake();
12644var Power0 = _easeMap.Power0,
12645    Power1 = _easeMap.Power1,
12646    Power2 = _easeMap.Power2,
12647    Power3 = _easeMap.Power3,
12648    Power4 = _easeMap.Power4,
12649    Linear = _easeMap.Linear,
12650    Quad = _easeMap.Quad,
12651    Cubic = _easeMap.Cubic,
12652    Quart = _easeMap.Quart,
12653    Quint = _easeMap.Quint,
12654    Strong = _easeMap.Strong,
12655    Elastic = _easeMap.Elastic,
12656    Back = _easeMap.Back,
12657    SteppedEase = _easeMap.SteppedEase,
12658    Bounce = _easeMap.Bounce,
12659    Sine = _easeMap.Sine,
12660    Expo = _easeMap.Expo,
12661    Circ = _easeMap.Circ;
12662
12663 //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it.
12664
12665//# sourceURL=[module]
12666//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvZ3NhcC1jb3JlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUF3Qyx1QkFBdUIseUZBQXlGOztBQUV4SixnREFBZ0QsMERBQTBELDJDQUEyQzs7QUFFcko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsNkZBQTZGO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRCx1QkFBdUI7QUFDdkI7QU
12666FDQSxvQkFBb0I7QUFDcEI7QUFDQSxpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsK0pBQStKO0FBQy9KO0FBQ0E7O0FBRUEsU0FBUywyQ0FBMkM7O0FBRXBEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLDJJQUEySTtBQUMzSTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSxtREFBbUQ7QUFDbkQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBOztBQUVBLGlDQUFpQztBQUNqQztBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaUVBQWlFOztBQUVqRTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlFQUFpRTs7QUFFakUsc0VBQXNFOztBQUV0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2RUFBNkU7QUFDN0U7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0QsNEdBQTRHLEdBQUcsaUVBQWlFO0FBQ2hMLHNKQUFzSixtREFBbUQ7QUFDek07QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEd
12666BQUc7QUFDSCxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDtBQUNBOztBQUVBO0FBQ0EsMEZBQTBGO0FBQzFGO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0E7O0FBRUEsa0VBQWtFO0FBQ2xFO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSwyRUFBMkUsYUFBYTtBQUN4RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSC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FDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxJQUFJOztBQUVKLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUMsR0FBRzs7O0FBR0o7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLG9FQUFvRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QztBQUM5QywyQkFBMkI7QUFDM0I7O0FBRUEseURBQXlEO0FBQ3pEOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3TUFBd007QUFDeE07O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMEdBQTBHO0FBQzFHLHNHQUFzRztBQUN0RztBQUNBOztBQUVBO0FBQ0EsZ0VBQWdFOztBQUVoRTs7QUFFQSxtQkFBbUI7OztBQUduQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLDZFQUE2RTs7QUFFN0Usa0NBQWtDO0FBQ2xDLFFBQVE7QUFDUjs7QUFFQSw4QkFBOEI7O0FBRTlCLCtNQUErTTtBQUMvTTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkVBQTZFO0FBQzdFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEZBQTRGOztBQUU1RjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
12666BRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixnRUFBZ0U7O0FBRWhFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnS0FBZ0s7O0FBRWhLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7O0FBRWhFO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9COztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCOztBQUUzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFEQUFxRCw2TkFBNk4sT0FBTyxXQUFXLEtBQUs7QUFDL1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDs7QUFFMUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSw2REFBNkQ7O0FBRTdEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1UEFBdVA7O0FBRXZQO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRjs7QUFFcEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlIQUF5SDs7QUFFekg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUEsMEVBQTBFO0FBQzFFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0VBQWdFO0FBQ2hFO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0F
12666BRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDRCQUE0Qjs7QUFFNUIsK0NBQStDOztBQUUvQzs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTs7QUFFZjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSw2REFBNkQ7O0FBRTdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUVBQXFFOztBQUVyRTs7QUFFQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxpQkFBaUI7O0FBRWpCO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QU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FBR0k7QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0EscUVBQXFFOztBQUVyRTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHVJQUF1STs7QUFFeEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ21KO0FBQ3FILENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvZ3NhcC1jb3JlLmpzPzc0ODkiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybi
12666BzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vKiFcbiAqIEdTQVAgMy4xNS4wXG4gKiBodHRwczovL2dzYXAuY29tXG4gKlxuICogQGxpY2Vuc2UgQ29weXJpZ2h0IDIwMDgtMjAyNiwgR3JlZW5Tb2NrLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogU3ViamVjdCB0byB0aGUgdGVybXMgYXQgaHR0cHM6Ly9nc2FwLmNvbS9zdGFuZGFyZC1saWNlbnNlXG4gKiBAYXV0aG9yOiBKYWNrIERveWxlLCBqYWNrQGdyZWVuc29jay5jb21cbiovXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG52YXIgX2NvbmZpZyA9IHtcbiAgYXV0b1NsZWVwOiAxMjAsXG4gIGZvcmNlM0Q6IFwiYXV0b1wiLFxuICBudWxsVGFyZ2V0V2FybjogMSxcbiAgdW5pdHM6IHtcbiAgICBsaW5lSGVpZ2h0OiBcIlwiXG4gIH1cbn0sXG4gICAgX2RlZmF1bHRzID0ge1xuICBkdXJhdGlvbjogLjUsXG4gIG92ZXJ3cml0ZTogZmFsc2UsXG4gIGRlbGF5OiAwXG59LFxuICAgIF9zdXBwcmVzc092ZXJ3cml0ZXMsXG4gICAgX3JldmVydGluZyxcbiAgICBfY29udGV4dCxcbiAgICBfYmlnTnVtID0gMWU4LFxuICAgIF90aW55TnVtID0gMSAvIF9iaWdOdW0sXG4gICAgXzJQSSA9IE1hdGguUEkgKiAyLFxuICAgIF9IQUxGX1BJID0gXzJQSSAvIDQsXG4gICAgX2dzSUQgPSAwLFxuICAgIF9zcXJ0ID0gTWF0aC5zcXJ0LFxuICAgIF9jb3MgPSBNYXRoLmNvcyxcbiAgICBfc2luID0gTWF0aC5zaW4sXG4gICAgX2lzU3RyaW5nID0gZnVuY3Rpb24gX2lzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG59LFxuICAgIF9pc0Z1bmN0aW9uID0gZnVuY3Rpb24gX2lzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufSxcbiAgICBfaXNOdW1iZXIgPSBmdW5jdGlvbiBfaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcbn0sXG4gICAgX2lzVW5kZWZpbmVkID0gZnVuY3Rpb24gX2lzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCI7XG59LFxuICAgIF9pc09iamVjdCA9IGZ1bmN0aW9uIF9pc09iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiO1xufSxcbiAgICBfaXNOb3RGYWxzZSA9IGZ1bmN0aW9uIF9pc05vdEZhbHNlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gZmFsc2U7XG59LFxuICAgIF93aW5kb3dFeGlzdHMgPSBmdW5jdGlvbiBfd2luZG93RXhpc3RzKCkge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcbn0sXG4gICAgX2lzRnVuY09yU3RyaW5nID0gZnVuY3Rpb24gX2lzRnVuY09yU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBfaXNGdW5jdGlvbih2YWx1ZSkgfHwgX2lzU3RyaW5nKHZhbHVlKTtcbn0sXG4gICAgX2lzVHlwZWRBcnJheSA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiICYmIEFycmF5QnVmZmVyLmlzVmlldyB8fCBmdW5jdGlvbiAoKSB7fSxcbiAgICAvLyBub3RlOiBJRTEwIGhhcyBBcnJheUJ1ZmZlciwgYnV0IE5PVCBBcnJheUJ1ZmZlci5pc1ZpZXcoKS5cbl9pc0FycmF5ID0gQXJyYXkuaXNBcnJheSxcbiAgICBfcmFuZG9tRXhwID0gL3JhbmRvbVxcKFteKV0rXFwpL2csXG4gICAgX2NvbW1hRGVsaW1FeHAgPSAvLFxccyovZyxcbiAgICBfc3RyaWN0TnVtRXhwID0gLyg/Oi0/XFwuP1xcZHxcXC4pKy9naSxcbiAgICAvL29ubHkgbnVtYmVycyAoaW5jbHVkaW5nIG5lZ2F0aXZlcyBhbmQgZGVjaW1hbHMpIGJ1dCBOT1QgcmVsYXRpdmUgdmFsdWVzLlxuX251bUV4cCA9IC9bLSs9Ll0qXFxkK1suZVxcLStdKlxcZCpbZVxcLStdKlxcZCovZyxcbiAgICAvL2ZpbmRzIGFueSBudW1iZXJzLCBpbmNsdWRpbmcgb25lcyB0aGF0IHN0YXJ0IHdpdGggKz0gb3IgLT0sIG5lZ2F0aXZlIG51bWJlcnMsIGFuZCBvbmVzIGluIHNjaWVudGlmaWMgbm90YXRpb24gbGlrZSAxZS04LlxuX251bVdpdGhVbml0RXhwID0gL1stKz0uXSpcXGQrWy5lLV0qXFxkKlthLXolXSovZyxcbiAgICBfY29tcGxleFN0cmluZ051bUV4cCA9IC9bLSs9Ll0qXFxkK1xcLj9cXGQqKD86ZS18ZVxcKyk/XFxkKi9naSxcbiAgICAvL2R1cGxpY2F0ZSBzbyB0aGF0IHdoaWxlIHdlJ3JlIGxvb3BpbmcgdGhyb3VnaCBtYXRjaGVzIGZyb20gZXhlYygpLCBpdCBkb2Vzbid0IGNvbnRhbWluYXRlIHRoZSBsYXN0SW5kZXggb2YgX251bUV4cCB3aGljaCB3ZSB1c2UgdG8gc2VhcmNoIGZvciBjb2xvcnMgdG9vLlxuX3JlbEV4cCA9IC9bKy1dPS0/Wy5cXGRdKy8sXG4gICAgX2RlbGltaXRlZFZhbHVlRXhwID0gL1teLCdcIlxcW1xcXVxcc10rL2dpLFxuICAgIC8vIHByZXZpb3VzbHkgL1sjXFwtKy5dKlxcYlthLXpcXGRcXC09KyUuXSsvZ2kgYnV0IGRpZG4ndCBjYXRjaCBzcGVjaWFsIGNoYXJhY3RlcnMuXG5fdW5pdEV4cCA9IC9eWytcXC09ZVxcc1xcZF0qXFxkK1suXFxkXSooW2Etel0qfCUpXFxzKiQvaSxcbiAgICBfZ2xvYmFsVGltZWxpbmUsXG4gICAgX3dpbixcbiAgICBfY29yZUluaXR0ZWQsXG4gICAgX2RvYyxcbiAgICBfZ2xvYmFscyA9IHt9LFxuICAgIF9pbnN0YWxsU2NvcGUgPSB7fSxcbiAgICBfY29yZVJlYWR5LFxuICAgIF9pbnN0YWxsID0gZnVuY3Rpb24gX2luc3RhbGwoc2NvcGUpIHtcbiAgcmV0dXJuIChfaW5zdGFsbFNjb3BlID0gX21lcmdlKHNjb3BlLCBfZ2xvYmFscykpICYmIGdzYXA7XG59LFxuICAgIF9taXNzaW5nUGx1Z2luID0gZnVuY3Rpb24gX21pc3NpbmdQbHVnaW4ocHJvcGVydHksIHZhbHVlKSB7XG4gIHJldHVybiBjb25zb2xlLndhcm4oXCJJbnZhbGlkIHByb3BlcnR5XCIsIHByb3BlcnR5LCBcInNldCB0b1wiLCB2YWx1ZSwgXCJNaXNzaW5nIHBsdWdpbj8gZ3NhcC5yZWdpc3RlclBsdWdpbigpXCIpO1xufSxcbiAgICBfd2FybiA9IGZ1bmN0aW9uIF93YXJuKG1lc3NhZ2UsIHN1cHByZXNzKSB7XG4gIHJldHVybiAhc3VwcHJlc3MgJiYgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xufSxcbiAgICBfYWRkR2xvYmFsID0gZnVuY3Rpb24gX2FkZEdsb2JhbChuYW1lLCBvYmopIHtcbiAgcmV0dXJuIG5hbWUgJiYgKF9nbG9iYWxzW25hbWVdID0gb2JqKSAmJiBfaW5zdGFsbFNjb3BlICYmIChfaW5zdGFsbFNjb3BlW25hbWVdID0gb2JqKSB8fCBfZ2xvYmFscztcbn0sXG4gICAgX2VtcHR5RnVuYyA9IGZ1bmN0aW9uIF9lbXB0eUZ1bmMoKSB7XG4gIHJldHVybiAwO1xufSxcbiAgICBfc3RhcnRBdFJldmVydENvbmZpZyA9IHtcbiAgc3VwcHJlc3NFdmVudHM6IHRydWUsXG4gIGlzU3RhcnQ6IHRydWUsXG4gIGtpbGw6IGZhbHNlXG59LFxuICAgIF9yZXZlcnRDb25maWdOb0tpbGwgPSB7XG4gIHN1cHByZXNzRXZlbnRzOiB0cnVlLFxuICBraWxsOiBmYWxzZVxufSxcbiAgICBfcmV2ZXJ0Q29uZmlnID0ge1xuICBzdXBwcmVzc0V2ZW50czogdHJ1ZVxufSxcbiAgICBfcmVzZXJ2ZWRQcm9wcyA9IHt9LFxuICAgIF9sYXp5VHdlZW5zID0gW10sXG4gICAgX2xhenlMb29rdXAgPSB7fSxcbiAgICBfbGFzdFJlbmRlcmVkRnJhbWUsXG4gICAgX3BsdWdpbnMgPSB7fSxcbiAgICBfZWZmZWN0cyA9IHt9LFxuICAgIF9uZXh0R0NGcmFtZSA9IDMwLFxuICAgIF9oYXJuZXNzUGx1Z2lucyA9IFtdLFxuICAgIF9jYWxsYmFja05hbWVzID0gXCJcIixcbiAgICBfaGFybmVzcyA9IGZ1bmN0aW9uIF9oYXJuZXNzKHRhcmdldHMpIHtcbiAgdmFyIHRhcmdldCA9IHRhcmdldHNbMF0sXG4gICAgICBoYXJuZXNzUGx1Z2luLFxuICAgICAgaTtcbiAgX2lzT2JqZWN0KHRhcmdldCkgfHwgX2lzRnVuY3Rpb24odGFyZ2V0KSB8fCAodGFyZ2V0cyA9IFt0YXJnZXRzXSk7XG5cbiAgaWYgKCEoaGFybmVzc1BsdWdpbiA9ICh0YXJnZXQuX2dzYXAgfHwge30pLmhhcm5lc3MpKSB7XG4gICAgLy8gZmluZCB0aGUgZmlyc3QgdGFyZ2V0IHdpdGggYSBoYXJuZXNzLiBXZSBhc3N1bWUgdGFyZ2V0cyBwYXNzZWQgaW50byBhbiBhbmltYXRpb24gd2lsbCBiZSBvZiBzaW1pbGFyIHR5cGUsIG1lYW5pbmcgdGhlIHNhbWUga2luZCBvZiBoYXJuZXNzIGNhbiBiZSB1c2VkIGZvciB0aGVtIGFsbCAocGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uKVxuICAgIGkgPSBfaGFybmVzc1BsdWdpbnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSAmJiAhX2hhcm5lc3NQbHVnaW5zW2ldLnRhcmdldFRlc3QodGFyZ2V0KSkge31cblxuICAgIGhhcm5lc3NQbHVnaW4gPSBfaGFybmVzc1BsdWdpbnNbaV07XG4gIH1cblxuICBpID0gdGFyZ2V0cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHRhcmdldHNbaV0gJiYgKHRhcmdldHNbaV0uX2dzYXAgfHwgKHRhcmdldHNbaV0uX2dzYXAgPSBuZXcgR1NDYWNoZSh0YXJnZXRzW2ldLCBoYXJuZXNzUGx1Z2luKSkpIHx8IHRhcmdldHMuc3BsaWNlKGksIDEpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldHM7XG59LFxuICAgIF9nZXRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRDYWNoZSh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldC5fZ3NhcCB8fCBfaGFybmVzcyh0b0FycmF5KHRhcmdldCkpWzBdLl9nc2FwO1xufSxcbiAgICBfZ2V0UHJvcGVydHkgPSBmdW5jdGlvbiBfZ2V0UHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgdikge1xuICByZXR1cm4gKHYgPSB0YXJnZXRbcHJv
12666cGVydHldKSAmJiBfaXNGdW5jdGlvbih2KSA/IHRhcmdldFtwcm9wZXJ0eV0oKSA6IF9pc1VuZGVmaW5lZCh2KSAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUocHJvcGVydHkpIHx8IHY7XG59LFxuICAgIF9mb3JFYWNoTmFtZSA9IGZ1bmN0aW9uIF9mb3JFYWNoTmFtZShuYW1lcywgZnVuYykge1xuICByZXR1cm4gKG5hbWVzID0gbmFtZXMuc3BsaXQoXCIsXCIpKS5mb3JFYWNoKGZ1bmMpIHx8IG5hbWVzO1xufSxcbiAgICAvL3NwbGl0IGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgbmFtZXMgaW50byBhbiBhcnJheSwgdGhlbiBydW4gYSBmb3JFYWNoKCkgZnVuY3Rpb24gYW5kIHJldHVybiB0aGUgc3BsaXQgYXJyYXkgKHRoaXMgaXMganVzdCBhIHdheSB0byBjb25zb2xpZGF0ZS9zaG9ydGVuIHNvbWUgY29kZSkuXG5fcm91bmQgPSBmdW5jdGlvbiBfcm91bmQodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiAxMDAwMDApIC8gMTAwMDAwIHx8IDA7XG59LFxuICAgIF9yb3VuZFByZWNpc2UgPSBmdW5jdGlvbiBfcm91bmRQcmVjaXNlKHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogMTAwMDAwMDApIC8gMTAwMDAwMDAgfHwgMDtcbn0sXG4gICAgLy8gaW5jcmVhc2VkIHByZWNpc2lvbiBtb3N0bHkgZm9yIHRpbWluZyB2YWx1ZXMuXG5fcGFyc2VSZWxhdGl2ZSA9IGZ1bmN0aW9uIF9wYXJzZVJlbGF0aXZlKHN0YXJ0LCB2YWx1ZSkge1xuICB2YXIgb3BlcmF0b3IgPSB2YWx1ZS5jaGFyQXQoMCksXG4gICAgICBlbmQgPSBwYXJzZUZsb2F0KHZhbHVlLnN1YnN0cigyKSk7XG4gIHN0YXJ0ID0gcGFyc2VGbG9hdChzdGFydCk7XG4gIHJldHVybiBvcGVyYXRvciA9PT0gXCIrXCIgPyBzdGFydCArIGVuZCA6IG9wZXJhdG9yID09PSBcIi1cIiA/IHN0YXJ0IC0gZW5kIDogb3BlcmF0b3IgPT09IFwiKlwiID8gc3RhcnQgKiBlbmQgOiBzdGFydCAvIGVuZDtcbn0sXG4gICAgX2FycmF5Q29udGFpbnNBbnkgPSBmdW5jdGlvbiBfYXJyYXlDb250YWluc0FueSh0b1NlYXJjaCwgdG9GaW5kKSB7XG4gIC8vc2VhcmNoZXMgb25lIGFycmF5IHRvIGZpbmQgbWF0Y2hlcyBmb3IgYW55IG9mIHRoZSBpdGVtcyBpbiB0aGUgdG9GaW5kIGFycmF5LiBBcyBzb29uIGFzIG9uZSBpcyBmb3VuZCwgaXQgcmV0dXJucyB0cnVlLiBJdCBkb2VzIE5PVCByZXR1cm4gYWxsIHRoZSBtYXRjaGVzOyBpdCdzIHNpbXBseSBhIGJvb2xlYW4gc2VhcmNoLlxuICB2YXIgbCA9IHRvRmluZC5sZW5ndGgsXG4gICAgICBpID0gMDtcblxuICBmb3IgKDsgdG9TZWFyY2guaW5kZXhPZih0b0ZpbmRbaV0pIDwgMCAmJiArK2kgPCBsOykge31cblxuICByZXR1cm4gaSA8IGw7XG59LFxuICAgIF9sYXp5UmVuZGVyID0gZnVuY3Rpb24gX2xhenlSZW5kZXIoKSB7XG4gIHZhciBsID0gX2xhenlUd2VlbnMubGVuZ3RoLFxuICAgICAgYSA9IF9sYXp5VHdlZW5zLnNsaWNlKDApLFxuICAgICAgaSxcbiAgICAgIHR3ZWVuO1xuXG4gIF9sYXp5TG9va3VwID0ge307XG4gIF9sYXp5VHdlZW5zLmxlbmd0aCA9IDA7XG5cbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHR3ZWVuID0gYVtpXTtcbiAgICB0d2VlbiAmJiB0d2Vlbi5fbGF6eSAmJiAodHdlZW4ucmVuZGVyKHR3ZWVuLl9sYXp5WzBdLCB0d2Vlbi5fbGF6eVsxXSwgdHJ1ZSkuX2xhenkgPSAwKTtcbiAgfVxufSxcbiAgICBfaXNSZXZlcnRXb3J0aHkgPSBmdW5jdGlvbiBfaXNSZXZlcnRXb3J0aHkoYW5pbWF0aW9uKSB7XG4gIHJldHVybiAhIShhbmltYXRpb24uX2luaXR0ZWQgfHwgYW5pbWF0aW9uLl9zdGFydEF0IHx8IGFuaW1hdGlvbi5hZGQpO1xufSxcbiAgICBfbGF6eVNhZmVSZW5kZXIgPSBmdW5jdGlvbiBfbGF6eVNhZmVSZW5kZXIoYW5pbWF0aW9uLCB0aW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpIHtcbiAgX2xhenlUd2VlbnMubGVuZ3RoICYmICFfcmV2ZXJ0aW5nICYmIF9sYXp5UmVuZGVyKCk7XG4gIGFuaW1hdGlvbi5yZW5kZXIodGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlIHx8ICEhKF9yZXZlcnRpbmcgJiYgdGltZSA8IDAgJiYgX2lzUmV2ZXJ0V29ydGh5KGFuaW1hdGlvbikpKTtcbiAgX2xhenlUd2VlbnMubGVuZ3RoICYmICFfcmV2ZXJ0aW5nICYmIF9sYXp5UmVuZGVyKCk7IC8vaW4gY2FzZSByZW5kZXJpbmcgY2F1c2VkIGFueSB0d2VlbnMgdG8gbGF6eS1pbml0LCB3ZSBzaG91bGQgcmVuZGVyIHRoZW0gYmVjYXVzZSB0eXBpY2FsbHkgd2hlbiBzb21lb25lIGNhbGxzIHNlZWsoKSBvciB0aW1lKCkgb3IgcHJvZ3Jlc3MoKSwgdGhleSBleHBlY3QgYW4gaW1tZWRpYXRlIHJlbmRlci5cbn0sXG4gICAgX251bWVyaWNJZlBvc3NpYmxlID0gZnVuY3Rpb24gX251bWVyaWNJZlBvc3NpYmxlKHZhbHVlKSB7XG4gIHZhciBuID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIHJldHVybiAobiB8fCBuID09PSAwKSAmJiAodmFsdWUgKyBcIlwiKS5tYXRjaChfZGVsaW1pdGVkVmFsdWVFeHApLmxlbmd0aCA8IDIgPyBuIDogX2lzU3RyaW5nKHZhbHVlKSA/IHZhbHVlLnRyaW0oKSA6IHZhbHVlO1xufSxcbiAgICBfcGFzc1Rocm91Z2ggPSBmdW5jdGlvbiBfcGFzc1Rocm91Z2gocCkge1xuICByZXR1cm4gcDtcbn0sXG4gICAgX3NldERlZmF1bHRzID0gZnVuY3Rpb24gX3NldERlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHtcbiAgZm9yICh2YXIgcCBpbiBkZWZhdWx0cykge1xuICAgIHAgaW4gb2JqIHx8IChvYmpbcF0gPSBkZWZhdWx0c1twXSk7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSxcbiAgICBfc2V0S2V5ZnJhbWVEZWZhdWx0cyA9IGZ1bmN0aW9uIF9zZXRLZXlmcmFtZURlZmF1bHRzKGV4Y2x1ZGVEdXJhdGlvbikge1xuICByZXR1cm4gZnVuY3Rpb24gKG9iaiwgZGVmYXVsdHMpIHtcbiAgICBmb3IgKHZhciBwIGluIGRlZmF1bHRzKSB7XG4gICAgICBwIGluIG9iaiB8fCBwID09PSBcImR1cmF0aW9uXCIgJiYgZXhjbHVkZUR1cmF0aW9uIHx8IHAgPT09IFwiZWFzZVwiIHx8IChvYmpbcF0gPSBkZWZhdWx0c1twXSk7XG4gICAgfVxuICB9O1xufSxcbiAgICBfbWVyZ2UgPSBmdW5jdGlvbiBfbWVyZ2UoYmFzZSwgdG9NZXJnZSkge1xuICBmb3IgKHZhciBwIGluIHRvTWVyZ2UpIHtcbiAgICBiYXNlW3BdID0gdG9NZXJnZVtwXTtcbiAgfVxuXG4gIHJldHVybi
12666BiYXNlO1xufSxcbiAgICBfbWVyZ2VEZWVwID0gZnVuY3Rpb24gX21lcmdlRGVlcChiYXNlLCB0b01lcmdlKSB7XG4gIGZvciAodmFyIHAgaW4gdG9NZXJnZSkge1xuICAgIHAgIT09IFwiX19wcm90b19fXCIgJiYgcCAhPT0gXCJjb25zdHJ1Y3RvclwiICYmIHAgIT09IFwicHJvdG90eXBlXCIgJiYgKGJhc2VbcF0gPSBfaXNPYmplY3QodG9NZXJnZVtwXSkgPyBfbWVyZ2VEZWVwKGJhc2VbcF0gfHwgKGJhc2VbcF0gPSB7fSksIHRvTWVyZ2VbcF0pIDogdG9NZXJnZVtwXSk7XG4gIH1cblxuICByZXR1cm4gYmFzZTtcbn0sXG4gICAgX2NvcHlFeGNsdWRpbmcgPSBmdW5jdGlvbiBfY29weUV4Y2x1ZGluZyhvYmosIGV4Y2x1ZGluZykge1xuICB2YXIgY29weSA9IHt9LFxuICAgICAgcDtcblxuICBmb3IgKHAgaW4gb2JqKSB7XG4gICAgcCBpbiBleGNsdWRpbmcgfHwgKGNvcHlbcF0gPSBvYmpbcF0pO1xuICB9XG5cbiAgcmV0dXJuIGNvcHk7XG59LFxuICAgIF9pbmhlcml0RGVmYXVsdHMgPSBmdW5jdGlvbiBfaW5oZXJpdERlZmF1bHRzKHZhcnMpIHtcbiAgdmFyIHBhcmVudCA9IHZhcnMucGFyZW50IHx8IF9nbG9iYWxUaW1lbGluZSxcbiAgICAgIGZ1bmMgPSB2YXJzLmtleWZyYW1lcyA/IF9zZXRLZXlmcmFtZURlZmF1bHRzKF9pc0FycmF5KHZhcnMua2V5ZnJhbWVzKSkgOiBfc2V0RGVmYXVsdHM7XG5cbiAgaWYgKF9pc05vdEZhbHNlKHZhcnMuaW5oZXJpdCkpIHtcbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICBmdW5jKHZhcnMsIHBhcmVudC52YXJzLmRlZmF1bHRzKTtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQgfHwgcGFyZW50Ll9kcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFycztcbn0sXG4gICAgX2FycmF5c01hdGNoID0gZnVuY3Rpb24gX2FycmF5c01hdGNoKGExLCBhMikge1xuICB2YXIgaSA9IGExLmxlbmd0aCxcbiAgICAgIG1hdGNoID0gaSA9PT0gYTIubGVuZ3RoO1xuXG4gIHdoaWxlIChtYXRjaCAmJiBpLS0gJiYgYTFbaV0gPT09IGEyW2ldKSB7fVxuXG4gIHJldHVybiBpIDwgMDtcbn0sXG4gICAgX2FkZExpbmtlZExpc3RJdGVtID0gZnVuY3Rpb24gX2FkZExpbmtlZExpc3RJdGVtKHBhcmVudCwgY2hpbGQsIGZpcnN0UHJvcCwgbGFzdFByb3AsIHNvcnRCeSkge1xuICBpZiAoZmlyc3RQcm9wID09PSB2b2lkIDApIHtcbiAgICBmaXJzdFByb3AgPSBcIl9maXJzdFwiO1xuICB9XG5cbiAgaWYgKGxhc3RQcm9wID09PSB2b2lkIDApIHtcbiAgICBsYXN0UHJvcCA9IFwiX2xhc3RcIjtcbiAgfVxuXG4gIHZhciBwcmV2ID0gcGFyZW50W2xhc3RQcm9wXSxcbiAgICAgIHQ7XG5cbiAgaWYgKHNvcnRCeSkge1xuICAgIHQgPSBjaGlsZFtzb3J0QnldO1xuXG4gICAgd2hpbGUgKHByZXYgJiYgcHJldltzb3J0QnldID4gdCkge1xuICAgICAgcHJldiA9IHByZXYuX3ByZXY7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByZXYpIHtcbiAgICBjaGlsZC5fbmV4dCA9IHByZXYuX25leHQ7XG4gICAgcHJldi5fbmV4dCA9IGNoaWxkO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkLl9uZXh0ID0gcGFyZW50W2ZpcnN0UHJvcF07XG4gICAgcGFyZW50W2ZpcnN0UHJvcF0gPSBjaGlsZDtcbiAgfVxuXG4gIGlmIChjaGlsZC5fbmV4dCkge1xuICAgIGNoaWxkLl9uZXh0Ll9wcmV2ID0gY2hpbGQ7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50W2xhc3RQcm9wXSA9IGNoaWxkO1xuICB9XG5cbiAgY2hpbGQuX3ByZXYgPSBwcmV2O1xuICBjaGlsZC5wYXJlbnQgPSBjaGlsZC5fZHAgPSBwYXJlbnQ7XG4gIHJldHVybiBjaGlsZDtcbn0sXG4gICAgX3JlbW92ZUxpbmtlZExpc3RJdGVtID0gZnVuY3Rpb24gX3JlbW92ZUxpbmtlZExpc3RJdGVtKHBhcmVudCwgY2hpbGQsIGZpcnN0UHJvcCwgbGFzdFByb3ApIHtcbiAgaWYgKGZpcnN0UHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgZmlyc3RQcm9wID0gXCJfZmlyc3RcIjtcbiAgfVxuXG4gIGlmIChsYXN0UHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgbGFzdFByb3AgPSBcIl9sYXN0XCI7XG4gIH1cblxuICB2YXIgcHJldiA9IGNoaWxkLl9wcmV2LFxuICAgICAgbmV4dCA9IGNoaWxkLl9uZXh0O1xuXG4gIGlmIChwcmV2KSB7XG4gICAgcHJldi5fbmV4dCA9IG5leHQ7XG4gIH0gZWxzZSBpZiAocGFyZW50W2ZpcnN0UHJvcF0gPT09IGNoaWxkKSB7XG4gICAgcGFyZW50W2ZpcnN0UHJvcF0gPSBuZXh0O1xuICB9XG5cbiAgaWYgKG5leHQpIHtcbiAgICBuZXh0Ll9wcmV2ID0gcHJldjtcbiAgfSBlbHNlIGlmIChwYXJlbnRbbGFzdFByb3BdID09PSBjaGlsZCkge1xuICAgIHBhcmVudFtsYXN0UHJvcF0gPSBwcmV2O1xuICB9XG5cbiAgY2hpbGQuX25leHQgPSBjaGlsZC5fcHJldiA9IGNoaWxkLnBhcmVudCA9IG51bGw7IC8vIGRvbid0IGRlbGV0ZSB0aGUgX2RwIGp1c3Qgc28gd2UgY2FuIHJldmVydCBpZiBuZWNlc3NhcnkuIEJ1dCBwYXJlbnQgc2hvdWxkIGJlIG51bGwgdG8gaW5kaWNhdGUgdGhlIGl0ZW0gaXNuJ3QgaW4gYSBsaW5rZWQgbGlzdC5cbn0sXG4gICAgX3JlbW92ZUZyb21QYXJlbnQgPSBmdW5jdGlvbiBfcmVtb3ZlRnJvbVBhcmVudChjaGlsZCwgb25seUlmUGFyZW50SGFzQXV0b1JlbW92ZSkge1xuICBjaGlsZC5wYXJlbnQgJiYgKCFvbmx5SWZQYXJlbnRIYXNBdXRvUmVtb3ZlIHx8IGNoaWxkLnBhcmVudC5hdXRvUmVtb3ZlQ2hpbGRyZW4pICYmIGNoaWxkLnBhcmVudC5yZW1vdmUgJiYgY2hpbGQucGFyZW50LnJlbW92ZShjaGlsZCk7XG4gIGNoaWxkLl9hY3QgPSAwO1xufSxcbiAgICBfdW5jYWNoZSA9IGZ1bmN0aW9uIF91bmNhY2hlKGFuaW1hdGlvbiwgY2hpbGQpIHtcbiAgaWYgKGFuaW1hdGlvbiAmJiAoIWNoaWxkIHx8IGNoaWxkLl9lbmQgPiBhbmltYXRpb24uX2R1ciB8fCBjaGlsZC5fc3RhcnQgPCAwKSkge1xuICAgIC8vIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogaWYgYSBjaGlsZCBhbmltYXRpb24gaXMgcGFzc2VkIGluIHdlIHNob3VsZCBvbmx5IHVuY2FjaGUgaWYgdGhhdCBjaGlsZCBFWFRFTkRTIHRoZSBhbmltYXRpb24gKGl0cyBlbmQgdGltZSBpcyBiZXlvbmQgdGhlIGVuZClcbiAgICB2YXIgYSA9IGFuaW1hdGlvbjtcblxuICAgIHdoaWxlIChhKSB7XG4gICAgICBhLl9kaXJ0eSA9IDE7XG4gICAgICBhID0gYS5wYXJlbnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFuaW1hdGlvbjtcbn0sXG4gICAgX3JlY2FjaGVBbmNlc3RvcnMgPSBmdW5jdGlvbiBfcmVjYWNoZUFuY2VzdG9ycyhhbmltYXRpb24pIHtcbiAgdmFyIHBhcmVudCA9IGFuaW1hdGlvbi5wYXJlbnQ7XG5cbiAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQucGFyZW50KSB7XG4gICAgLy9zb21ldGltZXMgd2UgbXVzdCBmb3JjZSBhIHJlLXNvcnQgb2YgYWxsIGNoaWxkcmVuIGFuZCB1cGRhdGUgdGhlIGR1cmF0aW9uL3RvdGFsRHVyYXRpb24gb2YgYWxsIGFuY2VzdG9yIHRpbWVsaW5lcyBpbW1lZGlhdGVseSBpbiBjYXNlLCBmb3IgZXhhbXBsZSwgaW4gdGhlIG1pZGRsZSBvZiBhIHJlbmRlciBsb29wLCBvbmUgdHdlZW4gYWx0ZXJzIGFub3RoZXIgdHdlZW4ncyB0aW1lU2NhbGUgd2hpY2ggc2hvdmVzIGl0cyBzdGFydFRpbWUgYmVmb3JlIDAsIGZvcmNpbmcgdGhlIHBhcmVudCB0aW1lbGluZSB0byBzaGlmdCBhcm91bmQgYW5kIHNoaWZ0Q2hpbGRyZW4oKSB3aGljaCBjb3VsZCBhZmZlY3QgdGhhdCBuZXh0IHR3ZWVuJ3MgcmVuZGVyIChzdGFydFRpbWUpLiBEb2Vzbid0IG1hdHRlciBmb3IgdGhlIHJvb3QgdGltZWxpbmUgdGhvdWdoLlxuICAgIHBhcmVudC5fZGlydHkgPSAxO1xuICAgIHBhcmVudC50b3RhbER1cmF0aW9uKCk7XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgfVxuXG4gIHJldHVybi
12666BhbmltYXRpb247XG59LFxuICAgIF9yZXdpbmRTdGFydEF0ID0gZnVuY3Rpb24gX3Jld2luZFN0YXJ0QXQodHdlZW4sIHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKSB7XG4gIHJldHVybiB0d2Vlbi5fc3RhcnRBdCAmJiAoX3JldmVydGluZyA/IHR3ZWVuLl9zdGFydEF0LnJldmVydChfcmV2ZXJ0Q29uZmlnTm9LaWxsKSA6IHR3ZWVuLnZhcnMuaW1tZWRpYXRlUmVuZGVyICYmICF0d2Vlbi52YXJzLmF1dG9SZXZlcnQgfHwgdHdlZW4uX3N0YXJ0QXQucmVuZGVyKHRvdGFsVGltZSwgdHJ1ZSwgZm9yY2UpKTtcbn0sXG4gICAgX2hhc05vUGF1c2VkQW5jZXN0b3JzID0gZnVuY3Rpb24gX2hhc05vUGF1c2VkQW5jZXN0b3JzKGFuaW1hdGlvbikge1xuICByZXR1cm4gIWFuaW1hdGlvbiB8fCBhbmltYXRpb24uX3RzICYmIF9oYXNOb1BhdXNlZEFuY2VzdG9ycyhhbmltYXRpb24ucGFyZW50KTtcbn0sXG4gICAgX2VsYXBzZWRDeWNsZUR1cmF0aW9uID0gZnVuY3Rpb24gX2VsYXBzZWRDeWNsZUR1cmF0aW9uKGFuaW1hdGlvbikge1xuICByZXR1cm4gYW5pbWF0aW9uLl9yZXBlYXQgPyBfYW5pbWF0aW9uQ3ljbGUoYW5pbWF0aW9uLl90VGltZSwgYW5pbWF0aW9uID0gYW5pbWF0aW9uLmR1cmF0aW9uKCkgKyBhbmltYXRpb24uX3JEZWxheSkgKiBhbmltYXRpb24gOiAwO1xufSxcbiAgICAvLyBmZWVkIGluIHRoZSB0b3RhbFRpbWUgYW5kIGN5Y2xlRHVyYXRpb24gYW5kIGl0J2xsIHJldHVybiB0aGUgY3ljbGUgKGl0ZXJhdGlvbiBtaW51cyAxKSBhbmQgaWYgdGhlIHBsYXloZWFkIGlzIGV4YWN0bHkgYXQgdGhlIHZlcnkgRU5ELCBpdCB3aWxsIE5PVCBidW1wIHVwIHRvIHRoZSBuZXh0IGN5Y2xlLlxuX2FuaW1hdGlvbkN5Y2xlID0gZnVuY3Rpb24gX2FuaW1hdGlvbkN5Y2xlKHRUaW1lLCBjeWNsZUR1cmF0aW9uKSB7XG4gIHZhciB3aG9sZSA9IE1hdGguZmxvb3IodFRpbWUgPSBfcm91bmRQcmVjaXNlKHRUaW1lIC8gY3ljbGVEdXJhdGlvbikpO1xuICByZXR1cm4gdFRpbWUgJiYgd2hvbGUgPT09IHRUaW1lID8gd2hvbGUgLSAxIDogd2hvbGU7XG59LFxuICAgIF9wYXJlbnRUb0NoaWxkVG90YWxUaW1lID0gZnVuY3Rpb24gX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUocGFyZW50VGltZSwgY2hpbGQpIHtcbiAgcmV0dXJuIChwYXJlbnRUaW1lIC0gY2hpbGQuX3N0YXJ0KSAqIGNoaWxkLl90cyArIChjaGlsZC5fdHMgPj0gMCA/IDAgOiBjaGlsZC5fZGlydHkgPyBjaGlsZC50b3RhbER1cmF0aW9uKCkgOiBjaGlsZC5fdER1cik7XG59LFxuICAgIF9zZXRFbmQgPSBmdW5jdGlvbiBfc2V0RW5kKGFuaW1hdGlvbikge1xuICByZXR1cm4gYW5pbWF0aW9uLl9lbmQgPSBfcm91bmRQcmVjaXNlKGFuaW1hdGlvbi5fc3RhcnQgKyAoYW5pbWF0aW9uLl90RHVyIC8gTWF0aC5hYnMoYW5pbWF0aW9uLl90cyB8fCBhbmltYXRpb24uX3J0cyB8fCBfdGlueU51bSkgfHwgMCkpO1xufSxcbiAgICBfYWxpZ25QbGF5aGVhZCA9IGZ1bmN0aW9uIF9hbGlnblBsYXloZWFkKGFuaW1hdGlvbiwgdG90YWxUaW1lKSB7XG4gIC8vIGFkanVzdHMgdGhlIGFuaW1hdGlvbidzIF9zdGFydCBhbmQgX2VuZCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIHRvdGFsVGltZSAob25seSBpZiB0aGUgcGFyZW50J3Mgc21vb3RoQ2hpbGRUaW1pbmcgaXMgdHJ1ZSBhbmQgdGhlIGFuaW1hdGlvbiBpc24ndCBwYXVzZWQpLiBJdCBkb2Vzbid0IGRvIGFueSByZW5kZXJpbmcgb3IgZm9yY2luZyB0aGluZ3MgYmFjayBpbnRvIHBhcmVudCB0aW1lbGluZXMsIGV0Yy4gLSB0aGF0J3Mgd2hhdCB0b3RhbFRpbWUoKSBpcyBmb3IuXG4gIHZhciBwYXJlbnQgPSBhbmltYXRpb24uX2RwO1xuXG4gIGlmIChwYXJlbnQgJiYgcGFyZW50LnNtb290aENoaWxkVGltaW5nICYmIGFuaW1hdGlvbi5fdHMpIHtcbiAgICBhbmltYXRpb24uX3N0YXJ0ID0gX3JvdW5kUHJlY2lzZShwYXJlbnQuX3RpbWUgLSAoYW5pbWF0aW9uLl90cyA+IDAgPyB0b3RhbFRpbWUgLyBhbmltYXRpb24uX3RzIDogKChhbmltYXRpb24uX2RpcnR5ID8gYW5pbWF0aW9uLnRvdGFsRHVyYXRpb24oKSA6IGFuaW1hdGlvbi5fdER1cikgLSB0b3RhbFRpbWUpIC8gLWFuaW1hdGlvbi5fdHMpKTtcblxuICAgIF9zZXRFbmQoYW5pbWF0aW9uKTtcblxuICAgIHBhcmVudC5fZGlydHkgfHwgX3VuY2FjaGUocGFyZW50LCBhbmltYXRpb24pOyAvL2ZvciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4gSWYgdGhlIHBhcmVudCdzIGNhY2hlIGlzIGFscmVhZHkgZGlydHksIGl0IGFscmVhZHkgdG9vayBjYXJlIG9mIG1hcmtpbmcgdGhlIGFuY2VzdG9ycyBhcyBkaXJ0eSB0b28sIHNvIHNraXAgdGhlIGZ1bmN0aW9uIGNhbGwgaGVyZS5cbiAgfVxuXG4gIHJldHVybiBhbmltYXRpb247XG59LFxuXG4vKlxuX3RvdGFsVGltZVRvVGltZSA9IChjbGFtcGVkVG90YWxUaW1lLCBkdXJhdGlvbiwgcmVwZWF0LCByZXBlYXREZWxheSwgeW95bykgPT4ge1xuXHRsZXQgY3ljbGVEdXJhdGlvbiA9IGR1cmF0aW9uICsgcmVwZWF0RGVsYXksXG5cdFx0dGltZSA9IF9yb3VuZChjbGFtcGVkVG90YWxUaW1lICUgY3ljbGVEdXJhdGlvbik7XG5cdGlmICh0aW1lID4gZHVyYXRpb24pIHtcblx0XHR0aW1lID0gZHVyYXRpb247XG5cdH1cblx0cmV0dXJuICh5b3lvICYmICh+fihjbGFtcGVkVG90YWxUaW1lIC8gY3ljbGVEdXJhdGlvbikgJiAxKSkgPyBkdXJhdGlvbiAtIHRpbWUgOiB0aW1lO1xufSxcbiovXG5fcG9zdEFkZENoZWNrcyA9IGZ1bmN0aW9uIF9wb3N0QWRkQ2hlY2tzKHRpbWVsaW5lLCBjaGlsZCkge1xuICB2YXIgdDtcblxuICBpZiAoY2hpbGQuX3RpbWUgfHwgIWNoaWxkLl9kdXIgJiYgY2hpbGQuX2luaXR0ZWQgfHwgY2hpbGQuX3N0YXJ0IDwgdGltZWxpbmUuX3RpbWUgJiYgKGNoaWxkLl9kdXIgfHwgIWNoaWxkLmFkZCkpIHtcbiAgICAvLyBpbiBjYXNlLCBmb3IgZXhhbXBsZSwgdGhlIF9zdGFydCBpcyBtb3ZlZCBvbiBhIHR3ZWVuIHRoYXQgaGFzIGFscmVhZHkgcmVuZGVyZWQsIG9yIGlmIGl0J3MgYmVpbmcgaW5zZXJ0ZWQgaW50byBhIHRpbWVsaW5lIEJFRk9SRSB3aGVyZSB0aGUgcGxheWhlYWQgaXMgY3VycmVudGx5LiBJbWFnaW5lIGl0J3MgYXQgaXRzIGVuZCBzdGF0ZSwgdGhlbiB0aGUgc3RhcnRUaW1lIGlzIG1vdmVkIFdBWSBsYXRlciAoYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIHRpbWVsaW5lKSwgaXQgc2hvdWxkIHJlbmRlciBhdCBpdHMgYmVnaW5uaW5nLiBTcGVjaWFsIGNhc2U6IGlmIGl0J3MgYSB0aW1lbGluZSAoaGFzIC5hZGQoKSBtZXRob2QpIGFuZCBubyBkdXJhdGlvbiwgd2UgY2FuIHNraXAgcmVuZGVyaW5nIGJlY2F1c2UgdGhlIHVzZXIgbWF5IGJlIHBvcHVsYXRpbmcgaXQgQUZURVIgYWRkaW5nIGl0IHRvIGEgcGFyZW50IHRpbWVsaW5lICh1bmNvbnZlbnRpb25hbCwgYnV0IHBvc3NpYmxlLCBhbmQgd2Ugd291bGRuJ3Qgd2FudCBpdCB0byBnZXQgcmVtb3ZlZCBpZiB0aGUgcGFyZW50J3MgYXV0b1JlbW92ZUNoaWxkcmVuIGlzIHRydWUpLlxuICAgIHQgPSBfcGFyZW50VG9DaGlsZFRvdGFsVGltZS
12666h0aW1lbGluZS5yYXdUaW1lKCksIGNoaWxkKTtcblxuICAgIGlmICghY2hpbGQuX2R1ciB8fCBfY2xhbXAoMCwgY2hpbGQudG90YWxEdXJhdGlvbigpLCB0KSAtIGNoaWxkLl90VGltZSA+IF90aW55TnVtKSB7XG4gICAgICBjaGlsZC5yZW5kZXIodCwgdHJ1ZSk7XG4gICAgfVxuICB9IC8vaWYgdGhlIHRpbWVsaW5lIGhhcyBhbHJlYWR5IGVuZGVkIGJ1dCB0aGUgaW5zZXJ0ZWQgdHdlZW4vdGltZWxpbmUgZXh0ZW5kcyB0aGUgZHVyYXRpb24sIHdlIHNob3VsZCBlbmFibGUgdGhpcyB0aW1lbGluZSBhZ2FpbiBzbyB0aGF0IGl0IHJlbmRlcnMgcHJvcGVybHkuIFdlIHNob3VsZCBhbHNvIGFsaWduIHRoZSBwbGF5aGVhZCB3aXRoIHRoZSBwYXJlbnQgdGltZWxpbmUncyB3aGVuIGFwcHJvcHJpYXRlLlxuXG5cbiAgaWYgKF91bmNhY2hlKHRpbWVsaW5lLCBjaGlsZCkuX2RwICYmIHRpbWVsaW5lLl9pbml0dGVkICYmIHRpbWVsaW5lLl90aW1lID49IHRpbWVsaW5lLl9kdXIgJiYgdGltZWxpbmUuX3RzKSB7XG4gICAgLy9pbiBjYXNlIGFueSBvZiB0aGUgYW5jZXN0b3JzIGhhZCBjb21wbGV0ZWQgYnV0IHNob3VsZCBub3cgYmUgZW5hYmxlZC4uLlxuICAgIGlmICh0aW1lbGluZS5fZHVyIDwgdGltZWxpbmUuZHVyYXRpb24oKSkge1xuICAgICAgdCA9IHRpbWVsaW5lO1xuXG4gICAgICB3aGlsZSAodC5fZHApIHtcbiAgICAgICAgdC5yYXdUaW1lKCkgPj0gMCAmJiB0LnRvdGFsVGltZSh0Ll90VGltZSk7IC8vbW92ZXMgdGhlIHRpbWVsaW5lIChzaGlmdHMgaXRzIHN0YXJ0VGltZSkgaWYgbmVjZXNzYXJ5LCBhbmQgYWxzbyBlbmFibGVzIGl0LiBJZiBpdCdzIGN1cnJlbnRseSB6ZXJvLCB0aG91Z2gsIGl0IG1heSBub3QgYmUgc2NoZWR1bGVkIHRvIHJlbmRlciB1bnRpbCBsYXRlciBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gZm9yY2UgaXQgdG8gYWxpZ24gd2l0aCB0aGUgY3VycmVudCBwbGF5aGVhZCBwb3NpdGlvbi4gT25seSBtb3ZlIHRvIGNhdGNoIHVwIHdpdGggdGhlIHBsYXloZWFkLlxuXG4gICAgICAgIHQgPSB0Ll9kcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aW1lbGluZS5felRpbWUgPSAtX3RpbnlOdW07IC8vIGhlbHBzIGVuc3VyZSB0aGF0IHRoZSBuZXh0IHJlbmRlcigpIHdpbGwgYmUgZm9yY2VkIChjcm9zc2luZ1N0YXJ0ID0gdHJ1ZSBpbiByZW5kZXIoKSksIGV2ZW4gaWYgdGhlIGR1cmF0aW9uIGhhc24ndCBjaGFuZ2VkICh3ZSdyZSBhZGRpbmcgYSBjaGlsZCB3aGljaCB3b3VsZCBuZWVkIHRvIGdldCByZW5kZXJlZCkuIERlZmluaXRlbHkgYW4gZWRnZSBjYXNlLiBOb3RlOiB3ZSBNVVNUIGRvIHRoaXMgQUZURVIgdGhlIGxvb3AgYWJvdmUgd2hlcmUgdGhlIHRvdGFsVGltZSgpIG1pZ2h0IHRyaWdnZXIgYSByZW5kZXIoKSBiZWNhdXNlIHRoaXMgX2FkZFRvVGltZWxpbmUoKSBtZXRob2QgZ2V0cyBjYWxsZWQgZnJvbSB0aGUgQW5pbWF0aW9uIGNvbnN0cnVjdG9yLCBCRUZPUkUgdHdlZW5zIGV2ZW4gcmVjb3JkIHRoZWlyIHRhcmdldHMsIGV0Yy4gc28gd2Ugd291bGRuJ3Qgd2FudCB0aGluZ3MgdG8gZ2V0IHRyaWdnZXJlZCBpbiB0aGUgd3Jvbmcgb3JkZXIuXG4gIH1cbn0sXG4gICAgX2FkZFRvVGltZWxpbmUgPSBmdW5jdGlvbiBfYWRkVG9UaW1lbGluZSh0aW1lbGluZSwgY2hpbGQsIHBvc2l0aW9uLCBza2lwQ2hlY2tzKSB7XG4gIGNoaWxkLnBhcmVudCAmJiBfcmVtb3ZlRnJvbVBhcmVudChjaGlsZCk7XG4gIGNoaWxkLl9zdGFydCA9IF9yb3VuZFByZWNpc2UoKF9pc051bWJlcihwb3NpdGlvbikgPyBwb3NpdGlvbiA6IHBvc2l0aW9uIHx8IHRpbWVsaW5lICE9PSBfZ2xvYmFsVGltZWxpbmUgPyBfcGFyc2VQb3NpdGlvbih0aW1lbGluZSwgcG9zaXRpb24sIGNoaWxkKSA6IHRpbWVsaW5lLl90aW1lKSArIGNoaWxkLl9kZWxheSk7XG4gIGNoaWxkLl9lbmQgPSBfcm91bmRQcmVjaXNlKGNoaWxkLl9zdGFydCArIChjaGlsZC50b3RhbER1cmF0aW9uKCkgLyBNYXRoLmFicyhjaGlsZC50aW1lU2NhbGUoKSkgfHwgMCkpO1xuXG4gIF9hZGRMaW5rZWRMaXN0SXRlbSh0aW1lbGluZSwgY2hpbGQsIFwiX2ZpcnN0XCIsIFwiX2xhc3RcIiwgdGltZWxpbmUuX3NvcnQgPyBcIl9zdGFydFwiIDogMCk7XG5cbiAgX2lzRnJvbU9yRnJvbVN0YXJ0KGNoaWxkKSB8fCAodGltZWxpbmUuX3JlY2VudCA9IGNoaWxkKTtcbiAgc2tpcENoZWNrcyB8fCBfcG9zdEFkZENoZWNrcyh0aW1lbGluZSwgY2hpbGQpO1xuICB0aW1lbGluZS5fdHMgPCAwICYmIF9hbGlnblBsYXloZWFkKHRpbWVsaW5lLCB0aW1lbGluZS5fdFRpbWUpOyAvLyBpZiB0aGUgdGltZWxpbmUgaXMgcmV2ZXJzZWQgYW5kIHRoZSBuZXcgY2hpbGQgbWFrZXMgaXQgbG9uZ2VyLCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIHBhcmVudCdzIF9zdGFydCAocHVzaCBpdCBiYWNrKVxuXG4gIHJldHVybiB0aW1lbGluZTtcbn0sXG4gICAgX3Njcm9sbFRyaWdnZXIgPSBmdW5jdGlvbiBfc2Nyb2xsVHJpZ2dlcihhbmltYXRpb24sIHRyaWdnZXIpIHtcbiAgcmV0dXJuIChfZ2xvYmFscy5TY3JvbGxUcmlnZ2VyIHx8IF9taXNzaW5nUGx1Z2luKFwic2Nyb2xsVHJpZ2dlclwiLCB0cmlnZ2VyKSkgJiYgX2dsb2JhbHMuU2Nyb2xsVHJpZ2dlci5jcmVhdGUodHJpZ2dlciwgYW5pbWF0aW9uKTtcbn0sXG4gICAgX2F0dGVtcHRJbml0VHdlZW4gPSBmdW5jdGlvbiBfYXR0ZW1wdEluaXRUd2Vlbih0d2VlbiwgdGltZSwgZm9yY2UsIHN1cHByZXNzRXZlbnRzLCB0VGltZSkge1xuICBfaW5pdFR3ZWVuKHR3ZWVuLCB0aW1lLCB0VGltZSk7XG5cbiAgaWYgKCF0d2Vlbi5faW5pdHRlZCkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKCFmb3JjZSAmJiB0d2Vlbi5fcHQgJiYgIV9yZXZlcnRpbmcgJiYgKHR3ZWVuLl9kdXIgJiYgdHdlZW4udmFycy5sYXp5ICE9PSBmYWxzZSB8fCAhdHdlZW4uX2R1ciAmJiB0d2Vlbi52YXJzLmxhenkpICYmIF9sYXN0UmVuZGVyZWRGcmFtZSAhPT0gX3RpY2tlci5mcmFtZSkge1xuICAgIF9sYXp5VHdlZW5zLnB1c2godHdlZW4pO1xuXG4gICAgdHdlZW4uX2xhenkgPSBbdFRpbWUsIHN1cHByZXNzRXZlbnRzXTtcbiAgICByZXR1cm4gMTtcbiAgfVxufSxcbiAgICBfcGFyZW50UGxheWhlYWRJc0JlZm9yZVN0YXJ0ID0gZnVuY3Rpb24gX3BhcmVudFBsYXloZWFkSXNCZWZvcmVTdGFydChfcmVmKSB7XG4gIHZhciBwYXJlbnQgPSBfcmVmLnBhcmVudDtcbiAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQuX3RzICYmIHBhcmVudC5faW5pdHRlZCAmJiAhcGFyZW50Ll9sb2NrICYmIChwYXJlbnQucmF3VGltZSgpIDwgMCB8fCBfcGFyZW50UGxheWhlYWRJc0JlZm9yZVN0YXJ0KHBhcmVudCkpO1xufSxcbiAgICAvLyBjaGVjayBwYXJlbnQncyBfbG9jayBiZWNhdXNlIHdoZW4gYSB0aW1lbGluZSByZXBlYXRzL3lveW9zIGFuZCBkb2VzIGl0cyBhcnRpZmljaWFsIHdyYXBwaW5nLCB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIHJhdGlvIGJhY2sgdG8gMFxuX2lzRnJvbU9yRnJvbVN0YXJ0ID0gZnVuY3Rpb24gX2lzRnJvbU9yRnJvbVN0YXJ0KF9yZWYyKSB7XG4gIHZhciBkYXRhID0gX3JlZjIuZGF0YTtcbiAgcmV0dXJuIGRhdGEgPT09IFwiaXNGcm9tU3RhcnRcIiB8fCBkYXRhID09PSBcImlzU3RhcnRcIjtcbn0sXG4gICAgX3JlbmRlclplcm9EdXJhdGlvblR3ZWVuID0gZnVuY3Rpb24gX3JlbmRlclplcm9EdXJhdGlvblR3ZWVuKHR3ZWVuLCB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkge1xuICB2YXIgcHJldlJhdGlvID0gdHdlZW4ucmF0aW8sXG4gICAgICByYXRpbyA9IHRvdGFsVGltZSA8IDAgfHwgIXRvdGFsVGltZSAmJiAoIXR3ZWVuLl9zdGFydCAmJiBfcGFyZW50UGxheWhlYWRJc0JlZm9yZVN0YXJ0KHR3ZWVuKSAmJiAhKCF0d2Vlbi5faW5pdHRlZCAmJiBfaXNGcm9tT3JGcm9tU3RhcnQodHdlZW4pKSB8fCAodHdlZW4uX3RzIDwgMCB8fCB0d2Vlbi5fZHAuX3RzIDwgMCkgJiYgIV9pc0Zyb21PckZyb21TdGFydCh0d2VlbikpID8gMCA6IDEsXG4gICAgICAvLyBpZiB0aGUgdHdlZW4gb3IgaXRzIHBhcmVudCBpcyByZXZlcnNlZCBhbmQgdGhlI
12666HRvdGFsVGltZSBpcyAwLCB3ZSBzaG91bGQgZ28gdG8gYSByYXRpbyBvZiAwLiBFZGdlIGNhc2U6IGlmIGEgZnJvbSgpIG9yIGZyb21UbygpIHN0YWdnZXIgdHdlZW4gaXMgcGxhY2VkIGxhdGVyIGluIGEgdGltZWxpbmUsIHRoZSBcInN0YXJ0QXRcIiB6ZXJvLWR1cmF0aW9uIHR3ZWVuIGNvdWxkIGluaXRpYWxseSByZW5kZXIgYXQgYSB0aW1lIHdoZW4gdGhlIHBhcmVudCB0aW1lbGluZSdzIHBsYXloZWFkIGlzIHRlY2huaWNhbGx5IEJFRk9SRSB3aGVyZSB0aGlzIHR3ZWVuIGlzLCBzbyBtYWtlIHN1cmUgdGhhdCBhbnkgXCJmcm9tXCIgYW5kIFwiZnJvbVRvXCIgc3RhcnRBdCB0d2VlbnMgYXJlIHJlbmRlcmVkIHRoZSBmaXJzdCB0aW1lIGF0IGEgcmF0aW8gb2YgMS5cbiAgcmVwZWF0RGVsYXkgPSB0d2Vlbi5fckRlbGF5LFxuICAgICAgdFRpbWUgPSAwLFxuICAgICAgcHQsXG4gICAgICBpdGVyYXRpb24sXG4gICAgICBwcmV2SXRlcmF0aW9uO1xuXG4gIGlmIChyZXBlYXREZWxheSAmJiB0d2Vlbi5fcmVwZWF0KSB7XG4gICAgLy8gaW4gY2FzZSB0aGVyZSdzIGEgemVyby1kdXJhdGlvbiB0d2VlbiB0aGF0IGhhcyBhIHJlcGVhdCB3aXRoIGEgcmVwZWF0RGVsYXlcbiAgICB0VGltZSA9IF9jbGFtcCgwLCB0d2Vlbi5fdER1ciwgdG90YWxUaW1lKTtcbiAgICBpdGVyYXRpb24gPSBfYW5pbWF0aW9uQ3ljbGUodFRpbWUsIHJlcGVhdERlbGF5KTtcbiAgICB0d2Vlbi5feW95byAmJiBpdGVyYXRpb24gJiAxICYmIChyYXRpbyA9IDEgLSByYXRpbyk7XG5cbiAgICBpZiAoaXRlcmF0aW9uICE9PSBfYW5pbWF0aW9uQ3ljbGUodHdlZW4uX3RUaW1lLCByZXBlYXREZWxheSkpIHtcbiAgICAgIC8vIGlmIGl0ZXJhdGlvbiBjaGFuZ2VkXG4gICAgICBwcmV2UmF0aW8gPSAxIC0gcmF0aW87XG4gICAgICB0d2Vlbi52YXJzLnJlcGVhdFJlZnJlc2ggJiYgdHdlZW4uX2luaXR0ZWQgJiYgdHdlZW4uaW52YWxpZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyYXRpbyAhPT0gcHJldlJhdGlvIHx8IF9yZXZlcnRpbmcgfHwgZm9yY2UgfHwgdHdlZW4uX3pUaW1lID09PSBfdGlueU51bSB8fCAhdG90YWxUaW1lICYmIHR3ZWVuLl96VGltZSkge1xuICAgIGlmICghdHdlZW4uX2luaXR0ZWQgJiYgX2F0dGVtcHRJbml0VHdlZW4odHdlZW4sIHRvdGFsVGltZSwgZm9yY2UsIHN1cHByZXNzRXZlbnRzLCB0VGltZSkpIHtcbiAgICAgIC8vIGlmIHdlIHJlbmRlciB0aGUgdmVyeSBiZWdpbm5pbmcgKHRpbWUgPT0gMCkgb2YgYSBmcm9tVG8oKSwgd2UgbXVzdCBmb3JjZSB0aGUgcmVuZGVyIChub3JtYWwgdHdlZW5zIHdvdWxkbid0IG5lZWQgdG8gcmVuZGVyIGF0IGEgdGltZSBvZiAwIHdoZW4gdGhlIHByZXZUaW1lIHdhcyBhbHNvIDApLiBUaGlzIGlzIGFsc28gbWFuZGF0b3J5IHRvIG1ha2Ugc3VyZSBvdmVyd3JpdGluZyBraWNrcyBpbiBpbW1lZGlhdGVseS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcmV2SXRlcmF0aW9uID0gdHdlZW4uX3pUaW1lO1xuICAgIHR3ZWVuLl96VGltZSA9IHRvdGFsVGltZSB8fCAoc3VwcHJlc3NFdmVudHMgPyBfdGlueU51bSA6IDApOyAvLyB3aGVuIHRoZSBwbGF5aGVhZCBhcnJpdmVzIGF0IEVYQUNUTFkgdGltZSAwIChyaWdodCBvbiB0b3ApIG9mIGEgemVyby1kdXJhdGlvbiB0d2Vlbiwgd2UgbmVlZCB0byBkaXNjZXJuIGlmIGV2ZW50cyBhcmUgc3VwcHJlc3NlZCBzbyB0aGF0IHdoZW4gdGhlIHBsYXloZWFkIG1vdmVzIGFnYWluIChuZXh0IHRpbWUpLCBpdCdsbCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4gSWYgZXZlbnRzIGFyZSBOT1Qgc3VwcHJlc3NlZCwgb2J2aW91c2x5IHRoZSBjYWxsYmFjayB3b3VsZCBiZSB0cmlnZ2VyZWQgaW4gdGhpcyByZW5kZXIuIEJhc2ljYWxseSwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlIGVpdGhlciB3aGVuIHRoZSBwbGF5aGVhZCBBUlJJVkVTIG9yIExFQVZFUyB0aGlzIGV4YWN0IHNwb3QsIG5vdCBib3RoLiBJbWFnaW5lIGRvaW5nIGEgdGltZWxpbmUuc2VlaygwKSBhbmQgdGhlcmUncyBhIGNhbGxiYWNrIHRoYXQgc2l0cyBhdCAwLiBTaW5jZSBldmVudHMgYXJlIHN1cHByZXNzZWQgb24gdGhhdCBzZWVrKCkgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGZpcmUsIGJ1dCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBvZmYgb2YgdGhhdCBwb3NpdGlvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlLiBUaGlzIGJlaGF2aW9yIGlzIHdoYXQgcGVvcGxlIGludHVpdGl2ZWx5IGV4cGVjdC5cblxuICAgIHN1cHByZXNzRXZlbnRzIHx8IChzdXBwcmVzc0V2ZW50cyA9IHRvdGFsVGltZSAmJiAhcHJldkl0ZXJhdGlvbik7IC8vIGlmIGl0IHdhcyByZW5kZXJlZCBwcmV2aW91c2x5IGF0IGV4YWN0bHkgMCAoX3pUaW1lKSBhbmQgbm93IHRoZSBwbGF5aGVhZCBpcyBtb3ZpbmcgYXdheSwgRE9OJ1QgZmlyZSBjYWxsYmFja3Mgb3RoZXJ3aXNlIHRoZXknbGwgc2VlbSBsaWtlIGR1cGxpY2F0ZXMuXG5cbiAgICB0d2Vlbi5yYXRpbyA9IHJhdGlvO1xuICAgIHR3ZWVuLl9mcm9tICYmIChyYXRpbyA9IDEgLSByYXRpbyk7XG4gICAgdHdlZW4uX3RpbWUgPSAwO1xuICAgIHR3ZWVuLl90VGltZSA9IHRUaW1lO1xuICAgIHB0ID0gdHdlZW4uX3B0O1xuXG4gICAgd2hpbGUgKHB0KSB7XG4gICAgICBwdC5yKHJhdGlvLCBwdC5kKTtcbiAgICAgIHB0ID0gcHQuX25leHQ7XG4gICAgfVxuXG4gICAgdG90YWxUaW1lIDwgMCAmJiBfcmV3aW5kU3RhcnRBdCh0d2VlbiwgdG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgdHJ1ZSk7XG4gICAgdHdlZW4uX29uVXBkYXRlICYmICFzdXBwcmVzc0V2ZW50cyAmJiBfY2FsbGJhY2sodHdlZW4sIFwib25VcGRhdGVcIik7XG4gICAgdFRpbWUgJiYgdHdlZW4uX3JlcGVhdCAmJiAhc3VwcHJlc3NFdmVudHMgJiYgdHdlZW4ucGFyZW50ICYmIF9jYWxsYmFjayh0d2VlbiwgXCJvblJlcGVhdFwiKTtcblxuICAgIGlmICgodG90YWxUaW1lID49IHR3ZWVuLl90RHVyIHx8IHRvdGFsVGltZSA8IDApICYmIHR3ZWVuLnJhdGlvID09PSByYXRpbykge1xuICAgICAgcmF0aW8gJiYgX3JlbW92ZUZyb21QYXJlbnQodHdlZW4sIDEpO1xuXG4gICAgICBpZiAoIXN1cHByZXNzRXZlbnRzICYmICFfcmV2ZXJ0aW5nKSB7XG4gICAgICAgIF9jYWxsYmFjayh0d2VlbiwgcmF0aW8gPyBcIm9uQ29tcGxldGVcIiA6IFwib25SZXZlcnNlQ29tcGxldGVcIiwgdHJ1ZSk7XG5cbiAgICAgICAgdHdlZW4uX3Byb20gJiYgdHdlZW4uX3Byb20oKTtcbiAgICAgIH1cbiAgICB9XG4gI
12666H0gZWxzZSBpZiAoIXR3ZWVuLl96VGltZSkge1xuICAgIHR3ZWVuLl96VGltZSA9IHRvdGFsVGltZTtcbiAgfVxufSxcbiAgICBfZmluZE5leHRQYXVzZVR3ZWVuID0gZnVuY3Rpb24gX2ZpbmROZXh0UGF1c2VUd2VlbihhbmltYXRpb24sIHByZXZUaW1lLCB0aW1lKSB7XG4gIHZhciBjaGlsZDtcblxuICBpZiAodGltZSA+IHByZXZUaW1lKSB7XG4gICAgY2hpbGQgPSBhbmltYXRpb24uX2ZpcnN0O1xuXG4gICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLl9zdGFydCA8PSB0aW1lKSB7XG4gICAgICBpZiAoY2hpbGQuZGF0YSA9PT0gXCJpc1BhdXNlXCIgJiYgY2hpbGQuX3N0YXJ0ID4gcHJldlRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLl9uZXh0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjaGlsZCA9IGFuaW1hdGlvbi5fbGFzdDtcblxuICAgIHdoaWxlIChjaGlsZCAmJiBjaGlsZC5fc3RhcnQgPj0gdGltZSkge1xuICAgICAgaWYgKGNoaWxkLmRhdGEgPT09IFwiaXNQYXVzZVwiICYmIGNoaWxkLl9zdGFydCA8IHByZXZUaW1lKSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5fcHJldjtcbiAgICB9XG4gIH1cbn0sXG4gICAgX3NldER1cmF0aW9uID0gZnVuY3Rpb24gX3NldER1cmF0aW9uKGFuaW1hdGlvbiwgZHVyYXRpb24sIHNraXBVbmNhY2hlLCBsZWF2ZVBsYXloZWFkKSB7XG4gIHZhciByZXBlYXQgPSBhbmltYXRpb24uX3JlcGVhdCxcbiAgICAgIGR1ciA9IF9yb3VuZFByZWNpc2UoZHVyYXRpb24pIHx8IDAsXG4gICAgICB0b3RhbFByb2dyZXNzID0gYW5pbWF0aW9uLl90VGltZSAvIGFuaW1hdGlvbi5fdER1cjtcbiAgdG90YWxQcm9ncmVzcyAmJiAhbGVhdmVQbGF5aGVhZCAmJiAoYW5pbWF0aW9uLl90aW1lICo9IGR1ciAvIGFuaW1hdGlvbi5fZHVyKTtcbiAgYW5pbWF0aW9uLl9kdXIgPSBkdXI7XG4gIGFuaW1hdGlvbi5fdER1ciA9ICFyZXBlYXQgPyBkdXIgOiByZXBlYXQgPCAwID8gMWUxMCA6IF9yb3VuZFByZWNpc2UoZHVyICogKHJlcGVhdCArIDEpICsgYW5pbWF0aW9uLl9yRGVsYXkgKiByZXBlYXQpO1xuICB0b3RhbFByb2dyZXNzID4gMCAmJiAhbGVhdmVQbGF5aGVhZCAmJiBfYWxpZ25QbGF5aGVhZChhbmltYXRpb24sIGFuaW1hdGlvbi5fdFRpbWUgPSBhbmltYXRpb24uX3REdXIgKiB0b3RhbFByb2dyZXNzKTtcbiAgYW5pbWF0aW9uLnBhcmVudCAmJiBfc2V0RW5kKGFuaW1hdGlvbik7XG4gIHNraXBVbmNhY2hlIHx8IF91bmNhY2hlKGFuaW1hdGlvbi5wYXJlbnQsIGFuaW1hdGlvbik7XG4gIHJldHVybiBhbmltYXRpb247XG59LFxuICAgIF9vblVwZGF0ZVRvdGFsRHVyYXRpb24gPSBmdW5jdGlvbiBfb25VcGRhdGVUb3RhbER1cmF0aW9uKGFuaW1hdGlvbikge1xuICByZXR1cm4gYW5pbWF0aW9uIGluc3RhbmNlb2YgVGltZWxpbmUgPyBfdW5jYWNoZShhbmltYXRpb24pIDogX3NldER1cmF0aW9uKGFuaW1hdGlvbiwgYW5pbWF0aW9uLl9kdXIpO1xufSxcbiAgICBfemVyb1Bvc2l0aW9uID0ge1xuICBfc3RhcnQ6IDAsXG4gIGVuZFRpbWU6IF9lbXB0eUZ1bmMsXG4gIHRvdGFsRHVyYXRpb246IF9lbXB0eUZ1bmNcbn0sXG4gICAgX3BhcnNlUG9zaXRpb24gPSBmdW5jdGlvbiBfcGFyc2VQb3NpdGlvbihhbmltYXRpb24sIHBvc2l0aW9uLCBwZXJjZW50QW5pbWF0aW9uKSB7XG4gIHZhciBsYWJlbHMgPSBhbmltYXRpb24ubGFiZWxzLFxuICAgICAgcmVjZW50ID0gYW5pbWF0aW9uLl9yZWNlbnQgfHwgX3plcm9Qb3NpdGlvbixcbiAgICAgIGNsaXBwZWREdXJhdGlvbiA9IGFuaW1hdGlvbi5kdXJhdGlvbigpID49IF9iaWdOdW0gPyByZWNlbnQuZW5kVGltZShmYWxzZSkgOiBhbmltYXRpb24uX2R1cixcbiAgICAgIC8vaW4gY2FzZSB0aGVyZSdzIGEgY2hpbGQgdGhhdCBpbmZpbml0ZWx5IHJlcGVhdHMsIHVzZXJzIGFsbW9zdCBuZXZlciBpbnRlbmQgZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQgb2YgYSBuZXcgY2hpbGQgdG8gYmUgYmFzZWQgb24gYSBTVVBFUiBsb25nIHZhbHVlIGxpa2UgdGhhdCBzbyB3ZSBjbGlwIGl0IGFuZCBhc3N1bWUgdGhlIG1vc3QgcmVjZW50bHktYWRkZWQgY2hpbGQncyBlbmRUaW1lIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gIGksXG4gICAgICBvZmZzZXQsXG4gICAgICBpc1BlcmNlbnQ7XG5cbiAgaWYgKF9pc1N0cmluZyhwb3NpdGlvbikgJiYgKGlzTmFOKHBvc2l0aW9uKSB8fCBwb3NpdGlvbiBpbiBsYWJlbHMpKSB7XG4gICAgLy9pZiB0aGUgc3RyaW5nIGlzIGEgbnVtYmVyIGxpa2UgXCIxXCIsIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGEgbGFiZWwgd2l0aCB0aGF0IG5hbWUsIG90aGVyd2lzZSBpbnRlcnByZXQgaXQgYXMgYSBudW1iZXIgKGFic29sdXRlIHZhbHVlKS5cbiAgICBvZmZzZXQgPSBwb3NpdGlvbi5jaGFyQXQoMCk7XG4gICAgaXNQZXJjZW50ID0gcG9zaXRpb24uc3Vic3RyKC0xKSA9PT0gXCIlXCI7XG4gICAgaSA9IHBvc2l0aW9uLmluZGV4T2YoXCI9XCIpO1xuXG4gICAgaWYgKG9mZnNldCA9PT0gXCI8XCIgfHwgb2Zmc2V0ID09PSBcIj5cIikge1xuICAgICAgaSA+PSAwICYmIChwb3NpdGlvbiA9IHBvc2l0aW9uLnJlcGxhY2UoLz0vLCBcIlwiKSk7XG4gICAgICByZXR1cm4gKG9mZnNldCA9PT0gXCI8XCIgPyByZWNlbnQuX3N0YXJ0IDogcmVjZW50LmVuZFRpbWUocmVjZW50Ll9yZXBlYXQgPj0gMCkpICsgKHBhcnNlRmxvYXQocG9zaXRpb24uc3Vic3RyKDEpKSB8fCAwKSAqIChpc1BlcmNlbnQgPyAoaSA8IDAgPyByZWNlbnQgOiBwZXJjZW50QW5pbWF0aW9uKS50b3RhbER1cmF0aW9uKCkgLyAxMDAgOiAxKTtcbiAgICB9XG5cbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHBvc2l0aW9uIGluIGxhYmVscyB8fCAobGFiZWxzW3Bvc2l0aW9uXSA9IGNsaXBwZWREdXJhdGlvbik7XG4gICAgICByZXR1cm4gbGFiZWxzW3Bvc2l0aW9uXTtcbiAgICB9XG5cbiAgICBvZmZzZXQgPSBwYXJzZUZsb2F0KHBvc2l0aW9uLmNoYXJBdChpIC0gMSkgKyBwb3NpdGlvbi5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChpc1BlcmNlbnQgJiYgcGVyY2VudEFuaW1hdGlvbikge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IC8gMTAwICogKF9pc0FycmF5KHBlcmNlbnRBbmltYXRpb24pID8gcGVyY2VudEFuaW1hdGlvblswXSA6
12666IHBlcmNlbnRBbmltYXRpb24pLnRvdGFsRHVyYXRpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaSA+IDEgPyBfcGFyc2VQb3NpdGlvbihhbmltYXRpb24sIHBvc2l0aW9uLnN1YnN0cigwLCBpIC0gMSksIHBlcmNlbnRBbmltYXRpb24pICsgb2Zmc2V0IDogY2xpcHBlZER1cmF0aW9uICsgb2Zmc2V0O1xuICB9XG5cbiAgcmV0dXJuIHBvc2l0aW9uID09IG51bGwgPyBjbGlwcGVkRHVyYXRpb24gOiArcG9zaXRpb247XG59LFxuICAgIF9jcmVhdGVUd2VlblR5cGUgPSBmdW5jdGlvbiBfY3JlYXRlVHdlZW5UeXBlKHR5cGUsIHBhcmFtcywgdGltZWxpbmUpIHtcbiAgdmFyIGlzTGVnYWN5ID0gX2lzTnVtYmVyKHBhcmFtc1sxXSksXG4gICAgICB2YXJzSW5kZXggPSAoaXNMZWdhY3kgPyAyIDogMSkgKyAodHlwZSA8IDIgPyAwIDogMSksXG4gICAgICB2YXJzID0gcGFyYW1zW3ZhcnNJbmRleF0sXG4gICAgICBpclZhcnMsXG4gICAgICBwYXJlbnQ7XG5cbiAgaXNMZWdhY3kgJiYgKHZhcnMuZHVyYXRpb24gPSBwYXJhbXNbMV0pO1xuICB2YXJzLnBhcmVudCA9IHRpbWVsaW5lO1xuXG4gIGlmICh0eXBlKSB7XG4gICAgaXJWYXJzID0gdmFycztcbiAgICBwYXJlbnQgPSB0aW1lbGluZTtcblxuICAgIHdoaWxlIChwYXJlbnQgJiYgIShcImltbWVkaWF0ZVJlbmRlclwiIGluIGlyVmFycykpIHtcbiAgICAgIC8vIGluaGVyaXRhbmNlIGhhc24ndCBoYXBwZW5lZCB5ZXQsIGJ1dCBzb21lb25lIG1heSBoYXZlIHNldCBhIGRlZmF1bHQgaW4gYW4gYW5jZXN0b3IgdGltZWxpbmUuIFdlIGNvdWxkIGRvIHZhcnMuaW1tZWRpYXRlUmVuZGVyID0gX2lzTm90RmFsc2UoX2luaGVyaXREZWZhdWx0cyh2YXJzKS5pbW1lZGlhdGVSZW5kZXIpIGJ1dCB0aGF0J2QgZXhhY3QgYSBzbGlnaHQgcGVyZm9ybWFuY2UgcGVuYWx0eSBiZWNhdXNlIF9pbmhlcml0RGVmYXVsdHMoKSBhbHNvIHJ1bnMgaW4gdGhlIFR3ZWVuIGNvbnN0cnVjdG9yLiBXZSdyZSBwYXlpbmcgYSBzbWFsbCBrYiBwcmljZSBoZXJlIHRvIGdhaW4gc3BlZWQuXG4gICAgICBpclZhcnMgPSBwYXJlbnQudmFycy5kZWZhdWx0cyB8fCB7fTtcbiAgICAgIHBhcmVudCA9IF9pc05vdEZhbHNlKHBhcmVudC52YXJzLmluaGVyaXQpICYmIHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgdmFycy5pbW1lZGlhdGVSZW5kZXIgPSBfaXNOb3RGYWxzZShpclZhcnMuaW1tZWRpYXRlUmVuZGVyKTtcbiAgICB0eXBlIDwgMiA/IHZhcnMucnVuQmFja3dhcmRzID0gMSA6
12666IHZhcnMuc3RhcnRBdCA9IHBhcmFtc1t2YXJzSW5kZXggLSAxXTsgLy8gXCJmcm9tXCIgdmFyc1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUd2VlbihwYXJhbXNbMF0sIHZhcnMsIHBhcmFtc1t2YXJzSW5kZXggKyAxXSk7XG59LFxuICAgIF9jb25kaXRpb25hbFJldHVybiA9IGZ1bmN0aW9uIF9jb25kaXRpb25hbFJldHVybih2YWx1ZSwgZnVuYykge1xuICByZXR1cm4gdmFsdWUgfHwgdmFsdWUgPT09IDAgPyBmdW5jKHZhbHVlKSA6IGZ1bmM7XG59LFxuICAgIF9jbGFtcCA9IGZ1bmN0aW9uIF9jbGFtcChtaW4sIG1heCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIDwgbWluID8gbWluIDogdmFsdWUgPiBtYXggPyBtYXggOiB2YWx1ZTtcbn0sXG4gICAgZ2V0VW5pdCA9IGZ1bmN0aW9uIGdldFVuaXQodmFsdWUsIHYpIHtcbiAgcmV0dXJuICFfaXNTdHJpbmcodmFsdWUpIHx8ICEodiA9IF91bml0RXhwLmV4ZWModmFsdWUpKSA/IFwiXCIgOiB2WzFdO1xufSxcbiAgICAvLyBub3RlOiBwcm90ZWN0IGFnYWluc3QgcGFkZGVkIG51bWJlcnMgYXMgc3RyaW5ncywgbGlrZSBcIjEwMC4xMDBcIi4gVGhhdCBzaG91bGRuJ3QgcmV0dXJuIFwiMDBcIiBhcyB0aGUgdW5pdC4gSWYgaXQncyBudW1lcmljLCByZXR1cm4gbm8gdW5pdC5cbmNsYW1wID0gZnVuY3Rpb24gY2xhbXAobWluLCBtYXgsIHZhbHVlKSB7XG4gIHJldHVybiBfY29uZGl0aW9uYWxSZXR1cm4odmFsdWUsIGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIF9jbGFtcChtaW4sIG1heCwgdik7XG4gIH0pO1xufSxcbiAgICBfc2xpY2UgPSBbXS5zbGljZSxcbiAgICBfaXNBcnJheUxpa2UgPSBmdW5jdGlvbiBfaXNBcnJheUxpa2UodmFsdWUsIG5vbkVtcHR5KSB7XG4gIHJldHVybiB2YWx1ZSAmJiBfaXNPYmplY3QodmFsdWUpICYmIFwibGVuZ3RoXCIgaW4gdmFsdWUgJiYgKCFub25FbXB0eSAmJiAhdmFsdWUubGVuZ3RoIHx8IHZhbHVlLmxlbmd0aCAtIDEgaW4gdmFsdWUgJiYgX2lzT2JqZWN0KHZhbHVlWzBdKSkgJiYgIXZhbHVlLm5vZGVUeXBlICYmIHZhbHVlICE9PSBfd2luO1xufSxcbiAgICBfZmxhdHRlbiA9IGZ1bmN0aW9uIF9mbGF0dGVuKGFyLCBsZWF2ZVN0cmluZ3MsIGFjY3VtdWxhdG9yKSB7XG4gIGlmIChhY2N1bXVsYXRvciA9PT0gdm9pZCAwKSB7XG4gICAgYWNjdW11bGF0b3IgPSBbXTtcbiAgfVxuXG4gIHJldHVybiBhci5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBfYWNjdW11bGF0b3I7XG5cbiAgICByZXR1cm4gX2lzU3RyaW5nKHZhbHVlKSAmJiAhbGVhdmVTdHJpbmdzIHx8IF9pc0FycmF5TGlrZSh2YWx1ZSwgMSkgPyAoX2FjY3VtdWxhdG9yID0gYWNjdW11bGF0b3IpLnB1c2guYXBwbHkoX2FjY3VtdWxhdG9yLCB0b0FycmF5KHZhbHVlKSkgOiBhY2N1bXVsYXRvci5wdXNoKHZhbHVlKTtcbiAgfSkgfHwgYWNjdW11bGF0b3I7XG59LFxuICAgIC8vIHRha2VzIGFueSB2YWx1ZSBhbmQgcmV0dXJucyBhbiBBcnJheS4gSWYgaXQncyBhIHN0cmluZyAoYW5kIGxlYXZlU3RyaW5ncyBpc24ndCB0cnVlKSwgaXQnbGwgdXNlIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoKSBhbmQgY29udmVydCB0aGF0IHRvIGFuIGFycmF5LiBJdCdsbCBhbHNvIGFjY2VwdCBpdGVyYWJsZXMgbGlrZSBqUXVlcnkgb2JqZWN0cy5cbnRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5KHZhbHVlLCBzY29wZSwgbGVhdmVTdHJpbmdzKSB7XG4gIHJldHVybiBfY29udGV4dCAmJiAhc2NvcGUgJiYgX2NvbnRleHQuc2VsZWN0b3IgPyBfY29udGV4dC5zZWxlY3Rvcih2YWx1ZSkgOiBfaXNTdHJpbmcodmFsdWUpICYmICFsZWF2ZVN0cmluZ3MgJiYgKF9jb3JlSW5pdHRlZCB8fCAhX3dha2UoKSkgPyBfc2xpY2UuY2FsbCgoc2NvcGUgfHwgX2RvYykucXVlcnlTZWxlY3RvckFsbCh2YWx1ZSksIDApIDogX2lzQXJyYXkodmFsdWUpID8gX2ZsYXR0ZW4odmFsdWUsIGxlYXZlU3RyaW5ncykgOiBfaXNBcnJheUxpa2UodmFsdWUpID8gX3NsaWNlLmNhbGwodmFsdWUsIDApIDogdmFsdWUgPyBbdmFsdWVdIDogW107XG59LFxuICAgIHNlbGVjdG9yID0gZnVuY3Rpb24gc2VsZWN0b3IodmFsdWUpIHtcbiAgdmFsdWUgPSB0b0FycmF5KHZhbHVlKVswXSB8fCBfd2FybihcIkludmFsaWQgc2NvcGVcIikgfHwge307XG4gIHJldHVybiBmdW5jdGlvbiAodikge1xuICAgIHZhciBlbCA9IHZhbHVlLmN1cnJlbnQgfHwgdmFsdWUubmF0aXZlRWxlbWVudCB8fCB2YWx1ZTtcbiAgICByZXR1cm4gdG9BcnJheSh2LCBlbC5xdWVyeVNlbGVjdG9yQWxsID8gZWwgOiBlbCA9PT0gdmFsdWUgPyBfd2FybihcIkludmFsaWQgc2NvcGVcIikgfHwgX2RvYy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpIDogdmFsdWUpO1xuICB9O1xufSxcbiAgICBzaHVmZmxlID0gZnVuY3Rpb24gc2h1ZmZsZShhKSB7XG4gIHJldHVybiBhLnNvcnQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAuNSAtIE1hdGgucmFuZG9tKCk7XG4gIH0pO1xufSxcbiAgICAvLyBhbHRlcm5hdGl2ZSB0aGF0J3MgYSBiaXQgZmFzdGVyIGFuZCBtb3JlIHJlbGlhYmx5IGRpdmVyc2UgYnV0IGJpZ2dlcjogICBmb3IgKGxldCBqLCB2LCBpID0gYS5sZW5ndGg7IGk7IGogPSAoTWF0aC5yYW5kb20oKSAqIGkpIHwgMCwgdiA9IGFbLS1pXSwgYVtpXSA9IGFbal0sIGFbal0gPSB2KTsgcmV0dXJuIGE7XG4vLyBmb3IgZGlzdHJpYnV0aW5nIHZhbHVlcyBhY3Jvc3MgYW4gQXJyYXkuIENhbiBhY2NlcHQgYSBudW1iZXIsIGEgZnVuY3Rpb24gb3IgKG1vc3QgY29tbW9ubHkpIGFuIG9iamVjdCB3aGljaCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6IHtiYXNlLCBhbW91bnQsIGZyb20sIGVhc2UsIGdyaWQsIGF4aXMsIGxlbmd0aCwgZWFjaH0uIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOiBpbmRleCwgdGFyZ2V0LCBhcnJheS5cbmRpc3RyaWJ1dGUgPSBmdW5jdGlvbiBkaXN0cmlidXRlKHYpIHtcbiAgaWYgKF9pc0Z1bmN0aW9uKHYpKSB7XG4gICAgcmV0dXJuIHY7XG4gIH1cblxuICB2YXIgdmFycyA9IF9pc09iamVjdCh2KSA/IHYgOiB7XG4gICAgZWFjaDogdlxuICB9LFxuICAgICAgLy9uOjEgaXMganVzdCB0byBpbmRpY2F0ZSB2IHdhcyBhIG51bWJlcjsgd2UgbGV2ZXJhZ2UgdGhhdCBsYXRlciB0byBzZXQgdiBhY2NvcmRpbmcgdG8gdGhlIGxlbmd0aCB3ZSBnZXQuIElmIGEgbnVtYmVyIGlzIHBhc3NlZCBpbiwgd2UgdHJlYXQgaXQgbGlrZSB0aGUgb2xkIHN0YWdn
12666ZXIgdmFsdWUgd2hlcmUgMC4xLCBmb3IgZXhhbXBsZSwgd291bGQgbWVhbiB0aGF0IHRoaW5ncyB3b3VsZCBiZSBkaXN0cmlidXRlZCB3aXRoIDAuMSBiZXR3ZWVuIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgcmF0aGVyIHRoYW4gYSB0b3RhbCBcImFtb3VudFwiIHRoYXQncyBjaHVua2VkIG91dCBhbW9uZyB0aGVtIGFsbC5cbiAgZWFzZSA9IF9wYXJzZUVhc2UodmFycy5lYXNlKSxcbiAgICAgIGZyb20gPSB2YXJzLmZyb20gfHwgMCxcbiAgICAgIGJhc2UgPSBwYXJzZUZsb2F0KHZhcnMuYmFzZSkgfHwgMCxcbiAgICAgIGNhY2hlID0ge30sXG4gICAgICBpc0RlY2ltYWwgPSBmcm9tID4gMCAmJiBmcm9tIDwgMSxcbiAgICAgIHJhdGlvcyA9IGlzTmFOKGZyb20pIHx8IGlzRGVjaW1hbCxcbiAgICAgIGF4aXMgPSB2YXJzLmF4aXMsXG4gICAgICByYXRpb1ggPSBmcm9tLFxuICAgICAgcmF0aW9ZID0gZnJvbTtcblxuICBpZiAoX2lzU3RyaW5nKGZyb20pKSB7XG4gICAgcmF0aW9YID0gcmF0aW9ZID0ge1xuICAgICAgY2VudGVyOiAuNSxcbiAgICAgIGVkZ2VzOiAuNSxcbiAgICAgIGVuZDogMVxuICAgIH1bZnJvbV0gfHwgMDtcbiAgfSBlbHNlIGlmICghaXNEZWNpbWFsICYmIHJhdGlvcykge1xuICAgIHJhdGlvWCA9IGZyb21bMF07XG4gICAgcmF0aW9ZID0gZnJvbVsxXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoaSwgdGFyZ2V0LCBhKSB7XG4gICAgdmFyIGwgPSAoYSB8fCB2YXJzKS5sZW5ndGgsXG4gICAgICAgIGRpc3RhbmNlcyA9IGNhY2hlW2xdLFxuICAgICAgICBvcmlnaW5YLFxuICAgICAgICBvcmlnaW5ZLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBkLFxuICAgICAgICBqLFxuICAgICAgICBtYXgsXG4gICAgICAgIG1pbixcbiAgICAgICAgd3JhcEF0O1xuXG4gICAgaWYgKCFkaXN0YW5jZXMpIHtcbiAgICAgIHdyYXBBdCA9IHZhcnMuZ3JpZCA9PT0gXCJhdXRvXCIgPyAwIDogKHZhcnMuZ3JpZCB8fCBbMSwgX2JpZ051bV0pWzFdO1xuXG4gICAgICBpZiAoIXdyYXBBdCkge1xuICAgICAgICBtYXggPSAtX2JpZ051bTtcblxuICAgICAgICB3aGlsZSAobWF4IDwgKG1heCA9IGFbd3JhcEF0KytdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpICYmIHdyYXBBdCA8IGwpIHt9XG5cbiAgICAgICAgd3JhcEF0IDwgbCAmJiB3cmFwQXQtLTtcbiAgICAgIH1cblxuICAgICAgZGlzdGFuY2VzID0gY2FjaGVbbF0gPSBbXTtcbiAgICAgIG9yaWdpblggPSByYXRpb3MgPyBNYXRoLm1pbih3cmFwQXQsIGwpICogcmF0aW9YIC0gLjUgOiBmcm9tICUgd3JhcEF0O1xuICAgICAgb3JpZ2luWSA9IHdyYXBBdCA9PT0gX2JpZ051bSA/IDAgOiByYXRpb3MgPyBsICogcmF0aW9ZIC8gd3JhcEF0IC0gLjUgOiBmcm9tIC8gd3JhcEF0IHwgMDtcbiAgICAgIG1heCA9IDA7XG4gICAgICBtaW4gPSBfYmlnTnVtO1xuXG4gICAgICBmb3IgKGogPSAwOyBqIDwgbDsgaisrKSB7XG4gICAgICAgIHggPSBqICUgd3JhcEF0IC0gb3JpZ2luWDtcbiAgICAgICAgeSA9IG9yaWdpblkgLSAoaiAvIHdyYXBBdCB8IDApO1xuICAgICAgICBkaXN0YW5jZXNbal0gPSBkID0gIWF4aXMgPyBfc3FydCh4ICogeCArIHkgKiB5KSA6IE1hdGguYWJzKGF4aXMgPT09IFwieVwiID8geSA6IHgpO1xuICAgICAgICBkID4gbWF4ICYmIChtYXggPSBkKTtcbiAgICAgICAgZCA8IG1pbiAmJiAobWluID0gZCk7XG4gICAgICB9XG5cbiAgICAgIGZyb20gPT09IFwicmFuZG9tXCIgJiYgc2h1ZmZsZShkaXN0YW5jZXMpO1xuICAgICAgZGlzdGFuY2VzLm1heCA9IG1heCAtIG1pbjtcbiAgICAgIGRpc3RhbmNlcy5taW4gPSBtaW47XG4gICAgICBkaXN0YW5jZXMudiA9IGwgPSAocGFyc2VGbG9hdCh2YXJzLmFtb3VudCkgfHwgcGFyc2VGbG9hdCh2YXJzLmVhY2gpICogKHdyYXBBdCA+IGwgPyBsIC0gMSA6ICFheGlzID8gTWF0aC5tYXgod3JhcEF0LCBsIC8gd3JhcEF0KSA6IGF4aXMgPT09IFwieVwiID8gbCAvIHdyYXBBdCA6IHdyYXBBdCkgfHwgMCkgKiAoZnJvbSA9PT0gXCJlZGdlc1wiID8gLTEgOiAxKTtcbiAgICAgIGRpc3RhbmNlcy5iID0gbCA8IDAgPyBiYXNlIC0gbCA6IGJhc2U7XG4gICAgICBkaXN0YW5jZXMudSA9IGdldFVuaXQodmFycy5hbW91bnQgfHwgdmFycy5lYWNoKSB8fCAwOyAvL3VuaXRcblxuICAgICAgZWFzZSA9IGVhc2UgJiYgbCA8IDAgPyBfaW52ZXJ0RWFzZShlYXNlKSA6IGVhc2U7XG4gICAgfVxuXG4gICAgbCA9IChkaXN0YW5jZXNbaV0gLSBkaXN0YW5jZXMubWluKSAvIGRpc3RhbmNlcy5tYXggfHwgMDtcbiAgICByZXR1cm4gX3JvdW5kUHJlY2lzZShkaXN0YW5jZXMuYiArIChlYXNlID8gZWFzZShsKSA6IGwpICogZGlzdGFuY2VzLnYpICsgZGlzdGFuY2VzLnU7IC8vcm91bmQgaW4gb3JkZXIgdG8gd29yayBhcm91bmQgZmxvYXRpbmcgcG9pbnQgZXJyb3JzXG4gIH07XG59LFxuICAgIF9yb3VuZE1vZGlmaWVyID0gZnVuY3Rpb24gX3JvdW5kTW9kaWZpZXIodikge1xuICAvL3Bhc3MgaW4gMC4xIGdldCBhIGZ1bmN0aW9uIHRoYXQnbGwgcm91bmQgdG8gdGhlIG5lYXJlc3QgdGVudGgsIG9yIDUgdG8gcm91bmQgdG8gdGhlIGNsb3Nlc3QgNSwgb3IgMC4wMDEgdG8gdGhlIGNsb3Nlc3QgMTAwMHRoLCBldGMuXG4gIHZhciBwID0gTWF0aC5wb3coMTAsICgodiArIFwiXCIpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGgpOyAvL3RvIGF2b2lkIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChsaWtlIDI0ICogMC4xID09IDIuNDAwMDAwMDAwMDAwMDAwNCksIHdlIGNob3Agb2ZmIGF0IGEgc3BlY2lmaWMgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIChtdWNoIGZhc3RlciB0aGFuIHRvRml4ZWQoKSlcblxuICByZXR1cm4gZnVuY3Rpb24gKHJhdykge1xuICAgIHZhciBuID0gX3JvdW5kUHJlY2lzZShNYXRoLnJvdW5kKHBhcnNlRmxvYXQocmF3KSAvIHYpICogdiAqIHApO1xuXG4gICAgcmV0dXJuIChuIC0gbiAlIDEpIC8gcCArIChfaXNOdW1iZXIocmF3KSA/IDAgOiBnZXRVbml0KHJhdykpOyAvLyBuIC0gbiAlIDEgcmVwbGFjZXMgTWF0aC5mbG9vcigpIGluIG9yZGVyIHRvIGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMgcHJvcGVybHkuIEZvciBleGFtcGxlLCBNYXRoLmZsb29yKC0xNTAuMDAwMDAwMDAwMDAwMDMpIGlzIDE1MS
12666FcbiAgfTtcbn0sXG4gICAgc25hcCA9IGZ1bmN0aW9uIHNuYXAoc25hcFRvLCB2YWx1ZSkge1xuICB2YXIgaXNBcnJheSA9IF9pc0FycmF5KHNuYXBUbyksXG4gICAgICByYWRpdXMsXG4gICAgICBpczJEO1xuXG4gIGlmICghaXNBcnJheSAmJiBfaXNPYmplY3Qoc25hcFRvKSkge1xuICAgIHJhZGl1cyA9IGlzQXJyYXkgPSBzbmFwVG8ucmFkaXVzIHx8IF9iaWdOdW07XG5cbiAgICBpZiAoc25hcFRvLnZhbHVlcykge1xuICAgICAgc25hcFRvID0gdG9BcnJheShzbmFwVG8udmFsdWVzKTtcblxuICAgICAgaWYgKGlzMkQgPSAhX2lzTnVtYmVyKHNuYXBUb1swXSkpIHtcbiAgICAgICAgcmFkaXVzICo9IHJhZGl1czsgLy9wZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gc28gd2UgZG9uJ3QgaGF2ZSB0byBNYXRoLnNxcnQoKSBpbiB0aGUgbG9vcC5cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc25hcFRvID0gX3JvdW5kTW9kaWZpZXIoc25hcFRvLmluY3JlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9jb25kaXRpb25hbFJldHVybih2YWx1ZSwgIWlzQXJyYXkgPyBfcm91bmRNb2RpZmllcihzbmFwVG8pIDogX2lzRnVuY3Rpb24oc25hcFRvKSA/IGZ1bmN0aW9uIChyYXcpIHtcbiAgICBpczJEID0gc25hcFRvKHJhdyk7XG4gICAgcmV0dXJuIE1hdGguYWJzKGlzMkQgLSByYXcpIDw9IHJhZGl1cyA/IGlzMkQgOiByYXc7XG4gIH0gOiBmdW5jdGlvbiAocmF3KSB7XG4gICAgdmFyIHggPSBwYXJzZUZsb2F0KGlzMkQgPyByYXcueCA6IHJhdyksXG4gICAgICAgIHkgPSBwYXJzZUZsb2F0KGlzMkQgPyByYXcueSA6IDApLFxuICAgICAgICBtaW4gPSBfYmlnTnVtLFxuICAgICAgICBjbG9zZXN0ID0gMCxcbiAgICAgICAgaSA9IHNuYXBUby5sZW5ndGgsXG4gICAgICAgIGR4LFxuICAgICAgICBkeTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmIChpczJEKSB7XG4gICAgICAgIGR4ID0gc25hcFRvW2ldLnggLSB4O1xuICAgICAgICBkeSA9IHNuYXBUb1tpXS55IC0geTtcbiAgICAgICAgZHggPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGR4ID0gTWF0aC5hYnMoc25hcFRvW2ldIC0geCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkeCA8IG1pbikge1xuICAgICAgICBtaW4gPSBkeDtcbiAgICAgICAgY2xvc2VzdCA9IGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xvc2VzdCA9ICFyYWRpdXMgfHwgbWluIDw9IHJhZGl1cyA/IHNuYXBUb1tjbG9zZXN0XSA6IHJhdztcbiAgICByZXR1cm4gaXMyRCB8fCBjbG9zZXN0ID09PSByYXcgfHwgX2lzTnVtYmVyKHJhdykgPyBjbG9zZXN0IDogY2xvc2VzdCArIGdldFVuaXQocmF3KTtcbiAgfSk7XG59LFxuICAgIHJhbmRvbSA9IGZ1bmN0aW9uIHJhbmRvbShtaW4sIG1heCwgcm91bmRpbmdJbmNyZW1lbnQsIHJldHVybkZ1bmN0aW9uKSB7XG4gIHJldHVybiBfY29uZGl0aW9uYWxSZXR1cm4oX2lzQXJyYXkobWluKSA/ICFtYXggOiByb3VuZGluZ0luY3JlbWVudCA9PT0gdHJ1ZSA/ICEhKHJvdW5kaW5nSW5jcmVtZW50ID0gMCkgOiAhcmV0dXJuRnVuY3Rpb24sIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2lzQXJyYXkobWluKSA/IG1pblt+fihNYXRoLnJhbmRvbSgpICogbWluLmxlbmd0aCldIDogKHJvdW5kaW5nSW5jcmVtZW50ID0gcm91bmRpbmdJbmNyZW1lbnQgfHwgMWUtNSkgJiYgKHJldHVybkZ1bmN0aW9uID0gcm91bmRpbmdJbmNyZW1lbnQgPCAxID8gTWF0aC5wb3coMTAsIChyb3VuZGluZ0luY3JlbWVudCArIFwiXCIpLmxlbmd0aCAtIDIpIDogMSkgJiYgTWF0aC5mbG9vcihNYXRoLnJvdW5kKChtaW4gLSByb3VuZGluZ0luY3JlbWVudCAvIDIgKyBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIHJvdW5kaW5nSW5jcmVtZW50ICogLjk5KSkgLyByb3VuZGluZ0luY3JlbWVudCkgKiByb3VuZGluZ0luY3JlbWVudCAqIHJldHVybkZ1bmN0aW9uKSAvIHJldHVybkZ1bmN0aW9uO1xuICB9KTtcbn0sXG4gICAgcGlwZSA9IGZ1bmN0aW9uIHBpcGUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jdGlvbnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3Rpb25zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbnMucmVkdWNlKGZ1bmN0aW9uICh2LCBmKSB7XG4gICAgICByZXR1cm4gZih2KTtcbiAgICB9LCB2YWx1ZSk7XG4gIH07XG59LFxuICAgIHVuaXRpemUgPSBmdW5jdGlvbiB1bml0aXplKGZ1bmMsIHVuaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHBhcnNlRmxvYXQodmFsdWUpKSArICh1bml0IHx8IGdldFVuaXQodmFsdWUpKTtcbiAgfTtcbn0sXG4gICAgbm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKG1pbiwgbWF4LCB2YWx1ZSkge1xuICByZXR1cm4gbWFwUmFuZ2UobWluLCBtYXgsIDAsIDEsIHZhbHVlKTtcbn0sXG4gICAgX3dyYXBBcnJheSA9IGZ1bmN0aW9uIF93cmFwQXJyYXkoYSwgd3JhcHBlciwgdmFsdWUpIHtcbiAgcmV0dXJuIF9jb25kaXRpb25hbFJldHVybih2YWx1ZSwgZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgcmV0dXJuIGFbfn53cmFwcGVyKGluZGV4KV07XG4gIH0pO1xufSxcbiAgICB3cmFwID0gZnVuY3Rpb24gd3JhcChtaW4sIG1heCwgdmFsdWUpIHtcbiAgLy8gTk9URTogd3JhcCgpIENBTk5PVCBiZSBhbiBhcnJvdyBmdW5jdGlvbiEgQSB2ZXJ5IG9kZCBjb21waWxpbmcgYnVnIGNhdXNlcyBwcm9ibGVtcyAodW5yZWxhdGVkIHRvIEdTQVApLlxuICB2YXIgcmFuZ2UgPSBtYXggLSBtaW47XG4gIHJldHVybiBfaXNBcnJheShtaW4pID8gX3dyYXBBcnJheShtaW4sIHdyYXAoMCwgbWluLmxlbmd0aCksIG1heCkgOiBfY29uZGl0aW9uYWxSZXR1cm4odmFsdWUsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiAocmFuZ2UgKyAodmFsdWUgLSBtaW4pICUgcmFuZ2UpICUgcmFuZ2UgKyBtaW47XG4gIH0pO1xufSxcbiAgICB3cmFwWW95byA9IGZ1bmN0aW9uIHdyYXBZb3lvKG1pbiwgbWF4LCB2YWx1ZSkge1xuICB2YXIgcmFuZ2UgPSBtYXggLSBtaW4sXG4gICAgICB0b3RhbCA9IHJhbmdlICogMjtcbiAgcmV0dXJuIF9pc0FycmF5KG1pbikgPyBfd3JhcEFycmF5KG1pbiwgd3JhcFlveW8oMCwgbWluLmxlbmd0aCAtIDEpLCBtYXgpIDogX2NvbmRpdGlvbmFsUmV0dXJuKHZhbHVlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YWx1ZSA9ICh0b3RhbCArICh2YWx1ZSAtIG1pbikgJSB0b3RhbCkgJSB0b3RhbCB8fCAwO1xuICAgIHJldHVybi
12666BtaW4gKyAodmFsdWUgPiByYW5nZSA/IHRvdGFsIC0gdmFsdWUgOiB2YWx1ZSk7XG4gIH0pO1xufSxcbiAgICBfcmVwbGFjZVJhbmRvbSA9IGZ1bmN0aW9uIF9yZXBsYWNlUmFuZG9tKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZShfcmFuZG9tRXhwLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAvL3JlcGxhY2VzIGFsbCBvY2N1cnJlbmNlcyBvZiByYW5kb20oLi4uKSBpbiBhIHN0cmluZyB3aXRoIHRoZSBjYWxjdWxhdGVkIHJhbmRvbSB2YWx1ZS4gY2FuIGJlIGEgcmFuZ2UgbGlrZSByYW5kb20oLTEwMCwgMTAwLCA1KSBvciBhbiBhcnJheSBsaWtlIHJhbmRvbShbMCwgMTAwLCA1MDBdKVxuICAgIHZhciBhckluZGV4ID0gbWF0Y2guaW5kZXhPZihcIltcIikgKyAxLFxuICAgICAgICB2YWx1ZXMgPSBtYXRjaC5zdWJzdHJpbmcoYXJJbmRleCB8fCA3LCBhckluZGV4ID8gbWF0Y2guaW5kZXhPZihcIl1cIikgOiBtYXRjaC5sZW5ndGggLSAxKS5zcGxpdChfY29tbWFEZWxpbUV4cCk7XG4gICAgcmV0dXJuIHJhbmRvbShhckluZGV4ID8gdmFsdWVzIDogK3ZhbHVlc1swXSwgYXJJbmRleCA/IDAgOiArdmFsdWVzWzFdLCArdmFsdWVzWzJdIHx8IDFlLTUpO1xuICB9KTtcbn0sXG4gICAgbWFwUmFuZ2UgPSBmdW5jdGlvbiBtYXBSYW5nZShpbk1pbiwgaW5NYXgsIG91dE1pbiwgb3V0TWF4LCB2YWx1ZSkge1xuICB2YXIgaW5SYW5nZSA9IGluTWF4IC0gaW5NaW4sXG4gICAgICBvdXRSYW5nZSA9IG91dE1heCAtIG91dE1pbjtcbiAgcmV0dXJuIF9jb25kaXRpb25hbFJldHVybih2YWx1ZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIG91dE1pbiArICgodmFsdWUgLSBpbk1pbikgLyBpblJhbmdlICogb3V0UmFuZ2UgfHwgMCk7XG4gIH0pO1xufSxcbiAgICBpbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uIGludGVycG9sYXRlKHN0YXJ0LCBlbmQsIHByb2dyZXNzLCBtdXRhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc05hTihzdGFydCArIGVuZCkgPyAwIDogZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gKDEgLSBwKSAqIHN0YXJ0ICsgcCAqIGVuZDtcbiAgfTtcblxuICBpZiAoIWZ1bmMpIHtcbiAgICB2YXIgaXNTdHJpbmcgPSBfaXNTdHJpbmcoc3RhcnQpLFxuICAgICAgICBtYXN0ZXIgPSB7fSxcbiAgICAgICAgcCxcbiAgICAgICAgaSxcbiAgICAgICAgaW50ZXJwb2xhdG9ycyxcbiAgICAgICAgbCxcbiAgICAgICAgaWw7XG5cbiAgICBwcm9ncmVzcyA9PT0gdHJ1ZSAmJiAobXV0YXRlID0gMSkgJiYgKHByb2dyZXNzID0gbnVsbCk7XG5cbiAgICBpZiAoaXNTdHJpbmcpIHtcbiAgICAgIHN0YXJ0ID0ge1xuICAgICAgICBwOiBzdGFydFxuICAgICAgfTtcbiAgICAgIGVuZCA9IHtcbiAgICAgICAgcDogZW5kXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoX2lzQXJyYXkoc3RhcnQpICYmICFfaXNBcnJheShlbmQpKSB7XG4gICAgICBpbnRlcnBvbGF0b3JzID0gW107XG4gICAgICBsID0gc3RhcnQubGVuZ3RoO1xuICAgICAgaWwgPSBsIC0gMjtcblxuICAgICAgZm9yIChpID0gMTsgaSA8IGw7IGkrKykge1xuICAgICAgICBpbnRlcnBvbGF0b3JzLnB1c2goaW50ZXJwb2xhdGUoc3RhcnRbaSAtIDFdLCBzdGFydFtpXSkpOyAvL2J1aWxkIHRoZSBpbnRlcnBvbGF0b3JzIHVwIGZyb250IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHNvIHRoYXQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIG1hbnkgdGltZXMsIGl0IGNhbiBqdXN0IHJldXNlIHRoZW0uXG4gICAgICB9XG5cbiAgICAgIGwtLTtcblxuICAgICAgZnVuYyA9IGZ1bmN0aW9uIGZ1bmMocCkge1xuICAgICAgICBwICo9IGw7XG4gICAgICAgIHZhciBpID0gTWF0aC5taW4oaWwsIH5+cCk7XG4gICAgICAgIHJldHVybiBpbnRlcnBvbGF0b3JzW2ldKHAgLSBpKTtcbiAgICAgIH07XG5cbiAgICAgIHByb2dyZXNzID0gZW5kO1xuICAgIH0gZWxzZSBpZiAoIW11dGF0ZSkge1xuICAgICAgc3RhcnQgPSBfbWVyZ2UoX2lzQXJyYXkoc3RhcnQpID8gW10gOiB7fSwgc3RhcnQpO1xuICAgIH1cblxuICAgIGlmICghaW50ZXJwb2xhdG9ycykge1xuICAgICAgZm9yIChwIGluIGVuZCkge1xuICAgICAgICBfYWRkUHJvcFR3ZWVuLmNhbGwobWFzdGVyLCBzdGFydCwgcCwgXCJnZXRcIiwgZW5kW3BdKTtcbiAgICAgIH1cblxuICAgICAgZnVuYyA9IGZ1bmN0aW9uIGZ1bmMocCkge1xuICAgICAgICByZXR1cm4gX3JlbmRlclByb3BUd2VlbnMocCwgbWFzdGVyKSB8fCAoaXNTdHJpbmcgPyBzdGFydC5wIDogc3RhcnQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2NvbmRpdGlvbmFsUmV0dXJuKHByb2dyZXNzLCBmdW5jKTtcbn0sXG4gICAgX2dldExhYmVsSW5EaXJlY3Rpb24gPSBmdW5jdGlvbiBfZ2V0TGFiZWxJbkRpcmVjdGlvbih0aW1lbGluZSwgZnJvbVRpbWUsIGJhY2t3YXJkKSB7XG4gIC8vdXNlZCBmb3IgbmV4dExhYmVsKCkgYW5kIHByZXZpb3VzTGFiZWwoKVxuICB2YXIgbGFiZWxzID0gdGltZWxpbmUubGFiZWxzLFxuICAgICAgbWluID0gX2JpZ051bSxcbiAgICAgIHAsXG4gICAgICBkaXN0YW5jZSxcbiAgICAgIGxhYmVsO1xuXG4gIGZvciAocCBpbiBsYWJlbHMpIHtcbiAgICBkaXN0YW5jZSA9IGxhYmVsc1twXSAtIGZyb21UaW1lO1xuXG4gICAgaWYgKGRpc3RhbmNlIDwgMCA9PT0gISFiYWNrd2FyZCAmJiBkaXN0YW5jZSAmJiBtaW4gPiAoZGlzdGFuY2UgPSBNYXRoLmFicyhkaXN0YW5jZSkpKSB7XG4gICAgICBsYWJlbCA9IHA7XG4gICAgICBtaW4gPSBkaXN0YW5jZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGFiZWw7XG59LFxuICAgIF9jYWxsYmFjayA9IGZ1bmN0aW9uIF9jYWxsYmFjayhhbmltYXRpb24sIHR5cGUsIGV4ZWN1dGVMYXp5Rmlyc3QpIHtcbiAgdmFyIHYgPSBhbmltYXRpb24udmFycyxcbiAgICAgIGNhbGxiYWNrID0gdlt0eXBlXSxcbiAgICAgIHByZXZDb250ZXh0ID0gX2NvbnRleHQsXG4gICAgICBjb250ZXh0ID0gYW5pbWF0aW9uLl9jdHgsXG4gICAgICBwYXJhbXMsXG4gICAgICBzY29wZSxcbiAgICAgIHJlc3VsdDtcblxuICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcGFyYW1zID0gdlt0eXBlICsgXCJQYXJhbXNcIl07XG4gIHNjb3BlID0gdi5jYWxsYmFja1Njb3BlIHx8IGFuaW1hdGlvbjtcbiAgZXhlY3V0ZUxhenlGaXJzdCAmJiBfbGF6eVR3ZWVucy5sZW5ndGggJiYgX2xhenlSZW5kZXIoKTsgLy9pbiBjYXNlIHJlbmRlcmluZyBjYXVzZWQgYW55IHR3ZWVucyB0byBsYXp5LWluaXQsIHdlIHNob3VsZCByZW5kZXIgdGhlbSBiZWNhdXNlIHR5cGljYWxseSB3aGVuIGEgdGltZWxpbmUgZmluaXNoZXMsIHVzZXJzIGV4cGVjdCB0aGluZ3MgdG8gaGF2ZSByZW5kZXJlZCBmdWxseS4gSW1hZ2luZSBhbiBvblVwZGF0ZSBvbiBhIHRpbWVsaW5lIHRoYXQgcmVwb3J0cy9jaGVja3MgdHdlZW5lZCB2YWx1ZXMuXG5cbiAgY29udGV4dCAmJiAoX2NvbnRleHQgPSBjb250ZXh0KTtcbiAgcmVzdWx0ID0gcGFyYW1zID8gY2FsbGJhY2suYXBwbHkoc2NvcGUsIH
12666BhcmFtcykgOiBjYWxsYmFjay5jYWxsKHNjb3BlKTtcbiAgX2NvbnRleHQgPSBwcmV2Q29udGV4dDtcbiAgcmV0dXJuIHJlc3VsdDtcbn0sXG4gICAgX2ludGVycnVwdCA9IGZ1bmN0aW9uIF9pbnRlcnJ1cHQoYW5pbWF0aW9uKSB7XG4gIF9yZW1vdmVGcm9tUGFyZW50KGFuaW1hdGlvbik7XG5cbiAgYW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIgJiYgYW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIua2lsbCghIV9yZXZlcnRpbmcpO1xuICBhbmltYXRpb24ucHJvZ3Jlc3MoKSA8IDEgJiYgX2NhbGxiYWNrKGFuaW1hdGlvbiwgXCJvbkludGVycnVwdFwiKTtcbiAgcmV0dXJuIGFuaW1hdGlvbjtcbn0sXG4gICAgX3F1aWNrVHdlZW4sXG4gICAgX3JlZ2lzdGVyUGx1Z2luUXVldWUgPSBbXSxcbiAgICBfY3JlYXRlUGx1Z2luID0gZnVuY3Rpb24gX2NyZWF0ZVBsdWdpbihjb25maWcpIHtcbiAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgY29uZmlnID0gIWNvbmZpZy5uYW1lICYmIGNvbmZpZ1tcImRlZmF1bHRcIl0gfHwgY29uZmlnOyAvLyBVTUQgcGFja2FnaW5nIHdyYXBzIHRoaW5ncyBvZGRseSwgc28gZm9yIGV4YW1wbGUgTW90aW9uUGF0aEhlbHBlciBiZWNvbWVzIHtNb3Rpb25QYXRoSGVscGVyOk1vdGlvblBhdGhIZWxwZXIsIGRlZmF1bHQ6TW90aW9uUGF0aEhlbHBlcn0uXG5cbiAgaWYgKF93aW5kb3dFeGlzdHMoKSB8fCBjb25maWcuaGVhZGxlc3MpIHtcbiAgICAvLyBlZGdlIGNhc2U6IHNvbWUgYnVpbGQgdG9vbHMgbWF5IHBhc3MgaW4gYSBudWxsL3VuZGVmaW5lZCB2YWx1ZVxuICAgIHZhciBuYW1lID0gY29uZmlnLm5hbWUsXG4gICAgICAgIGlzRnVuYyA9IF9pc0Z1bmN0aW9uKGNvbmZpZyksXG4gICAgICAgIFBsdWdpbiA9IG5hbWUgJiYgIWlzRnVuYyAmJiBjb25maWcuaW5pdCA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3Byb3BzID0gW107XG4gICAgfSA6IGNvbmZpZyxcbiAgICAgICAgLy9pbiBjYXNlIHNvbWVvbmUgcGFzc2VzIGluIGFuIG9iamVjdCB0aGF0J3Mgbm90IGEgcGx1Z2luLCBsaWtlIEN1c3RvbUVhc2VcbiAgICBpbnN0YW5jZURlZmF1bHRzID0ge1xuICAgICAgaW5pdDogX2VtcHR5RnVuYyxcbiAgICAgIHJlbmRlcjogX3JlbmRlclByb3BUd2VlbnMsXG4gICAgICBhZGQ6IF9hZGRQcm9wVHdlZW4sXG4gICAgICBraWxsOiBfa2lsbFByb3BUd2VlbnNPZixcbiAgICAgIG1vZGlmaWVyOiBfYWRkUGx1Z2luTW9kaWZpZXIsXG4gICAgICByYXdWYXJzOiAwXG4gICAgfSxcbiAgICAgICAgc3RhdGljcyA9IHtcbiAgICAgIHRhcmdldFRlc3Q6IDAsXG4gICAgICBnZXQ6IDAsXG4gICAgICBnZXRTZXR0ZXI6IF9nZXRTZXR0ZXIsXG4gICAgICBhbGlhc2VzOiB7fSxcbiAgICAgIHJlZ2lzdGVyOiAwXG4gICAgfTtcblxuICAgIF93YWtlKCk7XG5cbiAgICBpZiAoY29uZmlnICE9PSBQbHVnaW4pIHtcbiAgICAgIGlmIChfcGx1Z2luc1tuYW1lXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF9zZXREZWZhdWx0cyhQbHVnaW4sIF9zZXREZWZhdWx0cyhfY29weUV4Y2x1ZGluZyhjb25maWcsIGluc3RhbmNlRGVmYXVsdHMpLCBzdGF0aWNzKSk7IC8vc3RhdGljIG1ldGhvZHNcblxuXG4gICAgICBfbWVyZ2UoUGx1Z2luLnByb3RvdHlwZSwgX21lcmdlKGluc3RhbmNlRGVmYXVsdHMsIF9jb3B5RXhjbHVkaW5nKGNvbmZpZywgc3RhdGljcykpKTsgLy9pbnN0YW5jZSBtZXRob2RzXG5cblxuICAgICAgX3BsdWdpbnNbUGx1Z2luLnByb3AgPSBuYW1lXSA9IFBsdWdpbjtcblxuICAgICAgaWYgKGNvbmZpZy50YXJnZXRUZXN0KSB7XG4gICAgICAgIF9oYXJuZXNzUGx1Z2lucy5wdXNoKFBsdWdpbik7XG5cbiAgICAgICAgX3Jlc2VydmVkUHJvcHNbbmFtZV0gPSAxO1xuICAgICAgfVxuXG4gICAgICBuYW1lID0gKG5hbWUgPT09IFwiY3NzXCIgPyBcIkNTU1wiIDogbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyKDEpKSArIFwiUGx1Z2luXCI7IC8vZm9yIHRoZSBnbG9iYWwgbmFtZS4gXCJtb3Rpb25QYXRoXCIgc2hvdWxkIGJlY29tZSBNb3Rpb25QYXRoUGx1Z2luXG4gICAgfVxuXG4gICAgX2FkZEdsb2JhbChuYW1lLCBQbHVnaW4pO1xuXG4gICAgY29uZmlnLnJlZ2lzdGVyICYmIGNvbmZpZy5yZWdpc3Rlcihnc2FwLCBQbHVnaW4sIFByb3BUd2Vlbik7XG4gIH0gZWxzZSB7XG4gICAgX3JlZ2lzdGVyUGx1Z2luUXVldWUucHVzaChjb25maWcpO1xuICB9XG59LFxuXG4vKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENPTE9SU1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXzI1NSA9IDI1NSxcbiAgICBfY29sb3JMb29rdXAgPSB7XG4gIGFxdWE6IFswLCBfMjU1LCBfMjU1XSxcbiAgbGltZTogWzAsIF8yNTUsIDBdLFxuICBzaWx2ZXI6IFsxOTIsIDE5MiwgMTkyXSxcbiAgYmxhY2s6IFswLCAwLCAwXSxcbiAgbWFyb29uOiBbMTI4LCAwLCAwXSxcbiAgdGVhbDogWzAsIDEyOCwgMTI4XSxcbiAgYmx1ZTogWzAsIDAsIF8yNTVdLFxuICBuYXZ5OiBbMCwgMCwgMTI4XSxcbiAgd2hpdGU6IFtfMjU1LCBfMjU1LCBfMjU1XSxcbiAgb2xpdmU6IFsxMjgsIDEyOCwgMF0sXG4gIHllbGxvdzogW18yNTUsIF8yNTUsIDBdLFxuICBvcmFuZ2U6IFtfMjU1LCAxNjUsIDBdLFxuICBncmF5OiBbMTI4LCAxMjgsIDEyOF0sXG4gIHB1cnBsZTogWzEyOCwgMCwgMTI4XSxcbiAgZ3JlZW46IFswLCAxMjgsIDBdLFxuICByZWQ6IFtfMjU1LCAwLCAwXSxcbiAgcGluazogW18yNTUsIDE5MiwgMjAzXSxcbiAgY3lhbjogWzAsIF8yNTUsIF8yNTVdLFxuICB0cmFuc3BhcmVudDogW18yNTUsIF8yNTUsIF8yNTUsIDBdXG59LFxuICAgIC8vIHBvc3NpYmxlIGZ1dHVyZSBpZGVhIHRvIHJlcGxhY2UgdGhlIGhhcmQtY29kZWQgY29sb3IgbmFtZSB2YWx1ZXMgLSBwdXQgdGhpcyBpbiB0aGUgdGlja2VyLndha2UoKSB3aGVyZSB3ZSBzZXQgdGhlIF9kb2M6XG4vLyBsZXQgY3R4ID0gX2RvYy5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQoXCIyZFwiKTtcbi8vIF9mb3JFYWNoTmFtZShcImFxdWEsbGltZSxzaWx2ZXIsYmxhY2ssbWFyb29uLHRlYWwsYmx1ZSxuYXZ5LHdoaXRlLG9saXZlLHllbGxvdyxvcmFuZ2UsZ3JheSxwdXJwbGUsZ3JlZW4scmVkLHBpbmssY3lhblwiLCBjb2xvciA9PiB7Y3R4LmZpbGxTdHlsZSA9IGNvbG9yOyBfY29sb3JMb29rdXBbY29sb3JdID0gc3BsaXRDb2xvcihjdHguZmlsbFN0eWxlKX0pO1xuX2h1ZSA9IGZ1bmN0aW9uIF9odWUoaCwgbTEsIG0yKSB7XG4gIGggKz0gaCA8IDAgPyAxIDogaCA+IDEgPyAtMSA6IDA7XG4gIHJldHVybiAoaCAqIDYgPCAxID8gbTEgKyAobTIgLSBtMSkgKiBoICogNiA6IGggPCAuNSA/IG0yIDogaCAqIDMgPCAyID8gbTEgKyAobTIgLSBtMSkgKiAoMiAvIDMgLSBoKSAqIDYgOiBtMSkgKiBfMjU1ICsgLjUgfCAwO1xufSxcbiAgICBzcGxpdENvbG9yID0gZnVuY3Rpb24gc3BsaXRDb2xvcih2LCB0b0hTTCwgZm9yY2VBbHBoYSkge1xuICB2YXIgYSA9ICF2ID8gX2NvbG9yTG9va3VwLmJsYWNrIDogX2lzTnVtYmVyKHYpID8gW3YgPj4gMTYsIHYgPj4gOCAmIF8yNTUsIHYgJiBfMjU1XSA6
12666IDAsXG4gICAgICByLFxuICAgICAgZyxcbiAgICAgIGIsXG4gICAgICBoLFxuICAgICAgcyxcbiAgICAgIGwsXG4gICAgICBtYXgsXG4gICAgICBtaW4sXG4gICAgICBkLFxuICAgICAgd2FzSFNMO1xuXG4gIGlmICghYSkge1xuICAgIGlmICh2LnN1YnN0cigtMSkgPT09IFwiLFwiKSB7XG4gICAgICAvL3NvbWV0aW1lcyBhIHRyYWlsaW5nIGNvbW1hIGlzIGluY2x1ZGVkIGFuZCB3ZSBzaG91bGQgY2hvcCBpdCBvZmYgKHR5cGljYWxseSBmcm9tIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgdmFsdWVzIGxpa2UgYSB0ZXh0U2hhZG93OlwiMnB4IDJweCAycHggYmx1ZSwgNXB4IDVweCA1cHggcmdiKDI1NSwwLDApXCIgLSBpbiB0aGlzIGV4YW1wbGUgXCJibHVlLFwiIGhhcyBhIHRyYWlsaW5nIGNvbW1hLiBXZSBjb3VsZCBzdHJpcCBpdCBvdXQgaW5zaWRlIHBhcnNlQ29tcGxleCgpIGJ1dCB3ZSdkIG5lZWQgdG8gZG8gaXQgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIHZhbHVlcyBwbHVzIGl0IHdvdWxkbid0IHByb3ZpZGUgcHJvdGVjdGlvbiBmcm9tIG90aGVyIHBvdGVudGlhbCBzY2VuYXJpb3MgbGlrZSBpZiB0aGUgdXNlciBwYXNzZXMgaW4gYSBzaW1pbGFyIHZhbHVlLlxuICAgICAgdiA9IHYuc3Vic3RyKDAsIHYubGVuZ3RoIC0gMSk7XG4gICAgfVxuXG4gICAgaWYgKF9jb2xvckxvb2t1cFt2XSkge1xuICAgICAgYSA9IF9jb2xvckxvb2t1cFt2XTtcbiAgICB9IGVsc2UgaWYgKHYuY2hhckF0KDApID09PSBcIiNcIikge1xuICAgICAgaWYgKHYubGVuZ3RoIDwgNikge1xuICAgICAgICAvL2ZvciBzaG9ydGhhbmQgbGlrZSAjOUYwIG9yICM5RjBGIChjb3VsZCBoYXZlIGFscGhhKVxuICAgICAgICByID0gdi5jaGFyQXQoMSk7XG4gICAgICAgIGcgPSB2LmNoYXJBdCgyKTtcbiAgICAgICAgYiA9IHYuY2hhckF0KDMpO1xuICAgICAgICB2ID0gXCIjXCIgKyByICsgciArIGcgKyBnICsgYiArIGIgKyAodi5sZW5ndGggPT09IDUgPyB2LmNoYXJBdCg0KSArIHYuY2hhckF0KDQpIDogXCJcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh2Lmxlbmd0aCA9PT0gOSkge1xuICAgICAgICAvLyBoZXggd2l0aCBhbHBoYSwgbGlrZSAjZmQ1ZTUzZmZcbiAgICAgICAgYSA9IHBhcnNlSW50KHYuc3Vic3RyKDEsIDYpLCAxNik7XG4gICAgICAgIHJldHVybiBbYSA+PiAxNiwgYSA+PiA4ICYgXzI1NSwgYSAmIF8yNTUsIHBhcnNlSW50KHYuc3Vic3RyKDcpLCAxNikgLyAyNTVdO1xuICAgICAgfVxuXG4gICAgICB2ID0gcGFyc2VJbnQodi5zdWJzdHIoMSksIDE2KTtcbiAgICAgIGEgPSBbdiA+PiAxNiwgdiA+PiA4ICYgXzI1NSwgdiAmIF8yNTVdO1xuICAgIH0gZWxzZSBpZiAodi5zdWJzdHIoMCwgMykgPT09IFwiaHNsXCIpIHtcbiAgICAgIGEgPSB3YXNIU0wgPSB2Lm1hdGNoKF9zdHJpY3ROdW1FeHApO1xuXG4gICAgICBpZiAoIXRvSFNMKSB7XG4gICAgICAgIGggPSArYVswXSAlIDM2MCAvIDM2MDtcbiAgICAgICAgcyA9ICthWzFdIC8gMTAwO1xuICAgICAgICBsID0gK2FbMl0gLyAxMDA7XG4gICAgICAgIGcgPSBsIDw9IC41ID8gbCAqIChzICsgMSkgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICByID0gbCAqIDIgLSBnO1xuICAgICAgICBhLmxlbmd0aCA+IDMgJiYgKGFbM10gKj0gMSk7IC8vY2FzdCBhcyBudW1iZXJcblxuICAgICAgICBhWzBdID0gX2h1ZShoICsgMSAvIDMsIHIsIGcpO1xuICAgICAgICBhWzFdID0gX2h1ZShoLCByLCBnKTtcbiAgICAgICAgYVsyXSA9IF9odWUoaCAtIDEgLyAzLCByLCBnKTtcbiAgICAgIH0gZWxzZSBpZiAofnYuaW5kZXhPZihcIj1cIikpIHtcbiAgICAgICAgLy9pZiByZWxhdGl2ZSB2YWx1ZXMgYXJlIGZvdW5kLCBqdXN0IHJldHVybiB0aGUgcmF3IHN0cmluZ3Mgd2l0aCB0aGUgcmVsYXRpdmUgcHJlZml4ZXMgaW4gcGxhY2UuXG4gICAgICAgIGEgPSB2Lm1hdGNoKF9udW1FeHApO1xuICAgICAgICBmb3JjZUFscGhhICYmIGEubGVuZ3RoIDwgNCAmJiAoYVszXSA9IDEpO1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IHYubWF0Y2goX3N0cmljdE51bUV4cCkgfHwgX2NvbG9yTG9va3VwLnRyYW5zcGFyZW50O1xuICAgIH1cblxuICAgIGEgPSBhLm1hcChOdW1iZXIpO1xuICB9XG5cbiAgaWYgKHRvSFNMICYmICF3YXNIU0wpIHtcbiAgICByID0gYVswXSAvIF8yNTU7XG4gICAgZyA9IGFbMV0gLyBfMjU1O1xuICAgIGIgPSBhWzJdIC8gXzI1NTtcbiAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICBsID0gKG1heCArIG1pbikgLyAyO1xuXG4gICAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgICBoID0gcyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGQgPSBtYXggLSBtaW47XG4gICAgICBzID0gbCA+IDAuNSA/IGQgLyAoMiAtIG1heCAtIG1pbikgOiBkIC8gKG1heCArIG1pbik7XG4gICAgICBoID0gbWF4ID09PSByID8gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCkgOiBtYXggPT09IGcgPyAoYiAtIHIpIC8gZCArIDIgOiAociAtIGcpIC8gZCArIDQ7XG4gICAgICBoICo9IDYwO1xuICAgIH1cblxuICAgIGFbMF0gPSB+fihoICsgLjUpO1xuICAgIGFbMV0gPSB+fihzICogMTAwICsgLjUpO1xuICAgIGFbMl0gPSB+fihsICogMTAwICsgLjUpO1xuICB9XG5cbiAgZm9yY2VBbHBoYSAmJiBhLmxlbmd0aCA8IDQgJiYgKGFbM10gPSAxKTtcbiAgcmV0dXJuIGE7XG59LFxuICAgIF9jb2xvck9yZGVyRGF0YSA9IGZ1bmN0aW9uIF9jb2xvck9yZGVyRGF0YSh2KSB7XG4gIC8vIHN0cmlwcyBvdXQgdGhlIGNvbG9ycyBmcm9tIHRoZSBzdHJpbmcsIGZpbmRzIGFsbCB0aGUgbnVtZXJpYyBzbG90cyAod2l0aCB1bml0cykgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhvc2UuIFRoZSBBcnJheSBhbHNvIGhhcyBhIFwiY1wiIHByb3BlcnR5IHdoaWNoIGlzIGFuIEFycmF5IG9mIHRoZSBpbmRleCB2YWx1ZXMgd2hlcmUgdGhlIGNvbG9ycyBiZWxvbmcuIFRoaXMgaXMgdG8gaGVscCB3b3JrIGFyb3VuZCBpc3N1ZXMgd2hlcmUgdGhlcmUncyBhIG1pcy1tYXRjaGVkIG9yZGVyIG9mIGNvbG9yL251bWVyaWMgZGF0YSBsaWtlIGRyb3Atc2hhZG93KCNmMDAgMHB4IDFweCAycHgpIGFuZCBkcm9wLXNoYWRvdygweCAxcHggMnB4ICNmMDApLiBUaGlzIGlzIGJhc2ljYWxseSBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIGluIF9mb3JtYXRDb2xvcnMoKVxuICB2YXIgdmFsdWVzID0gW10sXG4gICAgICBjID0gW10sXG4gICAgICBpID0gLTE7XG4gIHYuc3BsaXQoX2NvbG9yRXhwKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIGEgPSB2Lm1hdGNoKF9udW1XaXRoVW5pdEV4cCkgfHwgW107XG4gICAgdmFsdWVzLnB1c2guYXBwbHkodmFsdWVzLCBhKTtcbiAgICBjLnB1c2goaSArPSBhLmxlbmd0aCArIDEpO1xuICB9KTtcbiAgdmFsdWVzLmMgPSBjO1xuICByZXR1cm4gdmFsdWVzO1xufSxcbiAgICBfZm9ybWF0Q29sb3JzID0gZnVuY3Rpb24gX2Zvcm1hdENvbG9ycyhzLCB0b0hTTCwgb3JkZXJNYXRjaERhdGEpIHtcbiAgdmFyIHJlc3VsdCA9IFwiXCIsXG4gICAgICBjb2xvcnMgPSAocyArIHJlc3VsdCkubWF0Y2goX2NvbG9yRXhwKSxcbiAgICAgIHR5cGUgPSB0b0hTTCA/IFwiaHNsYShcIiA6IFwicmdiYShcIixcbiAgICAgIGkgPSAwLFxuICAgICAgYyxcbiAgICAgIHNoZWxsLFxuICAgICAgZCxcbiAgICAgIGw7XG5cbiAgaWYgKCFjb2xvcnMpIHtcbiAgICByZXR1cm4gcztcbiAgfVxuXG4gIGNvbG9ycyA9IGNvbG9ycy5tYXAoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgcmV0dXJuIChjb2xvciA9IHNwbGl0Q29sb3IoY29sb3IsIHRvSFNMLCAxKSkgJiYgdHlwZSArICh0b0hTTCA/IGNvbG9yWzBdICsgXCIsXCIgKyBjb2xvclsxXSArIFwiJSxcIiArIGNvbG9yWzJdICsgXCIlLFwiICsgY29sb3JbM10gOiBjb2xvci5qb2luKFwiLFwiKSkgKyBcIilcIjtcbiAgfSk7XG5cbiAgaWYgKG9yZGVyTWF0Y2hEYXRhKSB7XG4gICAgZCA9IF9jb2xvck9yZGVyRGF0YShzKTtcbiAgICBjID0gb3JkZXJNYXRjaERhdGEuYztcblxuICAgIGlmIChjLmpvaW4ocmVzdWx0KSAhPT0gZC5jLmpvaW4ocmVzdWx0KSkge1xuICAgICAgc2hlbGwgPSBzLnJlcGxhY2UoX2NvbG9yRXhwLCBcIjFcIikuc3BsaXQoX251bVdpdGhVbml0RXhwKTtcbiAgICAgIGwgPSBzaGVsbC5sZW5ndGggLSAxO1xuXG4gICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZXN1bHQgKz0gc2hlbGxbaV0gKyAofmMuaW5kZXhPZihpKSA/IGNvbG9ycy5zaGlmdCgpIHx8IHR5cGUgKyBcIjA
12666sMCwwLDApXCIgOiAoZC5sZW5ndGggPyBkIDogY29sb3JzLmxlbmd0aCA/IGNvbG9ycyA6IG9yZGVyTWF0Y2hEYXRhKS5zaGlmdCgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIXNoZWxsKSB7XG4gICAgc2hlbGwgPSBzLnNwbGl0KF9jb2xvckV4cCk7XG4gICAgbCA9IHNoZWxsLmxlbmd0aCAtIDE7XG5cbiAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgcmVzdWx0ICs9IHNoZWxsW2ldICsgY29sb3JzW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgKyBzaGVsbFtsXTtcbn0sXG4gICAgX2NvbG9yRXhwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcyA9IFwiKD86XFxcXGIoPzooPzpyZ2J8cmdiYXxoc2x8aHNsYSlcXFxcKC4rP1xcXFwpKXxcXFxcQiMoPzpbMC05YS1mXXszLDR9KXsxLDJ9XFxcXGJcIixcbiAgICAgIC8vd2UnbGwgZHluYW1pY2FsbHkgYnVpbGQgdGhpcyBSZWd1bGFyIEV4cHJlc3Npb24gdG8gY29uc2VydmUgZmlsZSBzaXplLiBBZnRlciBidWlsZGluZyBpdCwgaXQgd2lsbCBiZSBhYmxlIHRvIGZpbmQgcmdiKCksIHJnYmEoKSwgIyAoaGV4YWRlY2ltYWwpLCBhbmQgbmFtZWQgY29sb3IgdmFsdWVzIGxpa2UgcmVkLCBibHVlLCBwdXJwbGUsIGV0Yy4sXG4gIHA7XG5cbiAgZm9yIChwIGluIF9jb2xvckxvb2t1cCkge1xuICAgIHMgKz0gXCJ8XCIgKyBwICsgXCJcXFxcYlwiO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAocyArIFwiKVwiLCBcImdpXCIpO1xufSgpLFxuICAgIF9oc2xFeHAgPSAvaHNsW2FdP1xcKC8sXG4gICAgX2NvbG9yU3RyaW5nRmlsdGVyID0gZnVuY3Rpb24gX2NvbG9yU3RyaW5nRmlsdGVyKGEpIHtcbiAgdmFyIGNvbWJpbmVkID0gYS5qb2luKFwiIFwiKSxcbiAgICAgIHRvSFNMO1xuICBfY29sb3JFeHAubGFzdEluZGV4ID0gMDtcblxuICBpZiAoX2NvbG9yRXhwLnRlc3QoY29tYmluZWQpKSB7XG4gICAgdG9IU0wgPSBfaHNsRXhwLnRlc3QoY29tYmluZWQpO1xuICAgIGFbMV0gPSBfZm9ybWF0Q29sb3JzKGFbMV0sIHRvSFNMKTtcbiAgICBhWzBdID0gX2Zvcm1hdENvbG9ycyhhWzBdLCB0b0hTTCwgX2NvbG9yT3JkZXJEYXRhKGFbMV0pKTsgLy8gbWFrZSBzdXJlIHRoZSBvcmRlciBvZiBudW1iZXJzL2NvbG9ycyBtYXRjaCB3aXRoIHRoZSBFTkQgdmFsdWUuXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufSxcblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBUSUNLRVJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cbl90aWNrZXJBY3RpdmUsXG4gICAgX3RpY2tlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9nZXRUaW1lID0gRGF0ZS5ub3csXG4gICAgICBfbGFnVGhyZXNob2xkID0gNTAwLFxuICAgICAgX2FkanVzdGVkTGFnID0gMzMsXG4gICAgICBfc3RhcnRUaW1lID0gX2dldFRpbWUoKSxcbiAgICAgIF9sYXN0VXBkYXRlID0gX3N0YXJ0VGltZSxcbiAgICAgIF9nYXAgPSAxMDAwIC8gMjQwLFxuICAgICAgX25leHRUaW1lID0gX2dhcCxcbiAgICAgIF9saXN0ZW5lcnMgPSBbXSxcbiAgICAgIF9pZCxcbiAgICAgIF9yZXEsXG4gICAgICBfcmFmLFxuICAgICAgX3NlbGYsXG4gICAgICBfZGVsdGEsXG4gICAgICBfaSxcbiAgICAgIF90aWNrID0gZnVuY3Rpb24gX3RpY2sodikge1xuICAgIHZhciBlbGFwc2VkID0gX2dldFRpbWUoKSAtIF9sYXN0VXBkYXRlLFxuICAgICAgICBtYW51YWwgPSB2ID09PSB0cnVlLFxuICAgICAgICBvdmVybGFwLFxuICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgdGltZSxcbiAgICAgICAgZnJhbWU7XG5cbiAgICAoZWxhcHNlZCA+IF9sYWdUaHJlc2hvbGQgfHwgZWxhcHNlZCA8IDApICYmIChfc3RhcnRUaW1lICs9IGVsYXBzZWQgLSBfYWRqdXN0ZWRMYWcpO1xuICAgIF9sYXN0VXBkYXRlICs9IGVsYXBzZWQ7XG4gICAgdGltZSA9IF9sYXN0VXBkYXRlIC0gX3N0YXJ0VGltZTtcbiAgICBvdmVybGFwID0gdGltZSAtIF9uZXh0VGltZTtcblxuICAgIGlmIChvdmVybGFwID4gMCB8fCBtYW51YWwpIHtcbiAgICAgIGZyYW1lID0gKytfc2VsZi5mcmFtZTtcbiAgICAgIF9kZWx0YSA9IHRpbWUgLSBfc2VsZi50aW1lICogMTAwMDtcbiAgICAgIF9zZWxmLnRpbWUgPSB0aW1lID0gdGltZSAvIDEwMDA7XG4gICAgICBfbmV4dFRpbWUgKz0gb3ZlcmxhcCArIChvdmVybGFwID49IF9nYXAgPyA0IDogX2dhcCAtIG92ZXJsYXApO1xuICAgICAgZGlzcGF0Y2ggPSAxO1xuICAgIH1cblxuICAgIG1hbnVhbCB8fCAoX2lkID0gX3JlcShfdGljaykpOyAvL21ha2Ugc3VyZSB0aGUgcmVxdWVzdCBpcyBtYWRlIGJlZm9yZSB3ZSBkaXNwYXRjaCB0aGUgXCJ0aWNrXCIgZXZlbnQgc28gdGhhdCB0aW1pbmcgaXMgbWFpbnRhaW5lZC4gT3RoZXJ3aXNlLCBpZiBwcm9jZXNzaW5nIHRoZSBcInRpY2tcIiByZXF1aXJlcyBhIGJ1bmNoIG9mIHRpbWUgKGxpa2UgMTVtcykgYW5kIHdlJ3JlIHVzaW5nIGEgc2V0VGltZW91dCgpIHRoYXQncyBiYXNlZCBvbiAxNi43bXMsIGl0J2QgdGVjaG5pY2FsbHkgdGFrZSAzMS43bXMgYmV0d2VlbiBmcmFtZXMgb3RoZXJ3aXNlLlxuXG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBmb3IgKF9pID0gMDsgX2kgPCBfbGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAvLyB1c2UgX2kgYW5kIGNoZWNrIF9saXN0ZW5lcnMubGVuZ3RoIGluc3RlYWQgb2YgYSB2YXJpYWJsZSBiZWNhdXNlIGEgbGlzdGVuZXIgY291bGQgZ2V0IHJlbW92ZWQgZHVyaW5nIHRoZSBsb29wLCBhbmQgaWYgdGhhdCBoYXBwZW5zIHRvIGFuIGVsZW1lbnQgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGluZGV4LCBpdCdkIHRocm93IHRoaW5ncyBvZmYgaW4gdGhlIGxvb3AuXG4gICAgICAgIF9saXN0ZW5lcnNbX2ldKHRpbWUsIF9kZWx0YSwgZnJhbWUsIHYpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfc2VsZiA9IHtcbiAgICB0aW1lOiAwLFxuICAgIGZyYW1lOiAwLFxuICAgIHRpY2s6IGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgICBfdGljayh0cnVlKTtcbiAgICB9LFxuICAgIGRlbHRhUmF0aW86IGZ1bmN0aW9uIGRlbHRhUmF0aW8oZnBzKSB7XG4gICAgICByZXR1cm4gX2RlbHRhIC8gKDEwMDAgLyAoZnBzIHx8IDYwKSk7XG4gICAgfSxcbiAgICB3YWtlOiBmdW5jdGlvbiB3YWtlKCkge1xuICAgICAgaWYgKF9jb3JlUmVhZHkpIHtcbiAgICAgICAgaWYgKCFfY29yZUluaXR0ZWQgJiYgX3dpbmRvd0V4aXN0cygpKSB7XG4gICAgICAgICAgX3dpbiA9IF9jb3JlSW5pdHRlZCA9IHdpbmRvdztcbiAgICAgICAgICBfZG9jID0gX3dpbi5kb2N1bWVudCB8fCB7fTtcbiAgICAgICAgICBfZ2xvYmFscy5nc2FwID0gZ3NhcDtcbiAgICAgICAgICAoX3dpbi5nc2FwVmVyc2lvbnMgfHwgKF93aW4uZ3NhcFZlcnNpb25zID0gW10pKS5wdXNoKGdzYXAudmVyc2lvbik7XG5cbiAgICAgICAgICBfaW5zdGFsbChfaW5zdGFsbFNjb3BlIHx8IF93aW4uR3JlZW5Tb2NrR2xvYmFscyB8fCAhX3dpbi5nc2FwICYmIF93aW4gfHwge30pO1xuXG4gICAgICAgICAgX3JlZ2lzdGVyUGx1Z2luUXVldWUuZm9yRWFjaChfY3JlYXRlUGx1Z2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9yYWYgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIHJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgICAgICAgX2lkICYmIF9zZWxmLnNsZWVwKCk7XG5cbiAgICAgICAgX3JlcSA9IF9yYWYgfHwgZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChmLCBfbmV4dFRpbWUgLSBfc2VsZi50aW1lICogMTAwMCArIDEgfCAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBfdGlja2VyQWN0aXZlID0gMTtcblxuICAgICAgICBfdGljaygyKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNsZWVwOiBmdW5jdGlvbiBzbGVlcCgpIHtcbiAgICAgIChfcmFmID8gY2FuY2VsQW5pbWF0aW9uRnJhbWUgOiBjbGVhclRpbWVvdXQpKF9pZCk7XG4gICAgICBfdGlja2VyQWN0aXZlID0gMDtcbiAgICAgIF9yZXEgPSBfZW1wdHlGdW5jO1xuICAgIH0sXG4gICAgbGFnU21vb3RoaW5nOiBmdW5jdGlvbiBsYWdTbW9vdGhpbmcodGhyZXNob2xkLCBhZGp1c3RlZExhZykge1xuICAgICAgX2xhZ1RocmVzaG9sZCA9IHRocmVzaG9sZCB8fCBJbmZpbml0eTsgLy8gemVybyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYmFzaWNhbGx5IHVubGltaXRlZFxuXG4gICAgICBfYWRqdXN0ZWRMYWcgPSBNYXRoLm1pbihhZGp1c3RlZExhZyB8fCAzMywgX2xhZ1RocmVzaG9sZCk7XG4gICAgfSxcbiAgICBmcHM6IGZ1bmN0aW9uIGZwcyhfZnBzKSB7XG4gICAgICBfZ2FwID0gMTAwMCAvIChfZnBzIHx8IDI0MCk7XG4gICAgICBfbmV4dFRpbWUgPSBfc2VsZi50aW1lICogMTAwMCArIF9nYXA7XG4gICAgfSxcbiAgICBhZGQ6IGZ1bmN0aW9uIGFkZChjYWxsYmFjaywgb25jZSwgcHJpb3JpdGl6ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBvbmNlID8gZnVuY3Rpb24gKHQsIGQsIGYsIHYpIHtcbiAgICAgICAgY2FsbGJhY2sodCwgZCwgZiwgdik7XG5cbiAgICAgICAgX3NlbGYucmVtb3ZlKGZ1bmMpO1xuICAgICAgfSA6IGNhbGxiYWNrO1xuXG4gICAgICBfc2VsZi5yZW1vdmUoY2FsbGJhY2spO1xuXG4gICAgICBfbGlzdGVuZXJzW3ByaW9yaXRpemUgPyBcInVuc2hpZnRcIiA6IFwicHVzaFwiXShmdW5jKTtcblxuICAgICAgX3dha2UoKTtcblxuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShjYWxsYmFjaywgaSkge1xuICAgICAgfihpID0gX2xpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKSkgJiYgX2xpc3RlbmVycy5zcGxpY2UoaSwgMSkgJiYgX2kgPj0gaSAmJi
12666BfaS0tO1xuICAgIH0sXG4gICAgX2xpc3RlbmVyczogX2xpc3RlbmVyc1xuICB9O1xuICByZXR1cm4gX3NlbGY7XG59KCksXG4gICAgX3dha2UgPSBmdW5jdGlvbiBfd2FrZSgpIHtcbiAgcmV0dXJuICFfdGlja2VyQWN0aXZlICYmIF90aWNrZXIud2FrZSgpO1xufSxcbiAgICAvL2Fsc28gZW5zdXJlcyB0aGUgY29yZSBjbGFzc2VzIGFyZSBpbml0aWFsaXplZC5cblxuLypcbiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKiBFQVNJTkdcbiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKi9cbl9lYXNlTWFwID0ge30sXG4gICAgX2N1c3RvbUVhc2VFeHAgPSAvXltcXGQuXFwtTV1bXFxkLlxcLSxcXHNdLyxcbiAgICBfcXVvdGVzRXhwID0gL1tcIiddL2csXG4gICAgX3BhcnNlT2JqZWN0SW5TdHJpbmcgPSBmdW5jdGlvbiBfcGFyc2VPYmplY3RJblN0cmluZyh2YWx1ZSkge1xuICAvL3Rha2VzIGEgc3RyaW5nIGxpa2UgXCJ7d2lnZ2xlczoxMCwgdHlwZTphbnRpY2lwYXRlfSlcIiBhbmQgdHVybnMgaXQgaW50byBhIHJlYWwgb2JqZWN0LiBOb3RpY2UgaXQgZW5kcyBpbiBcIilcIiBhbmQgaW5jbHVkZXMgdGhlIHt9IHdyYXBwZXJzLiBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgcGFyc2luZyBlYXNlIGNvbmZpZ3MgYW5kIHByaW9yaXRpemVkIG9wdGltaXphdGlvbiByYXRoZXIgdGhhbiByZXVzYWJpbGl0eS5cbiAgdmFyIG9iaiA9IHt9LFxuICAgICAgc3BsaXQgPSB2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMykuc3BsaXQoXCI6XCIpLFxuICAgICAga2V5ID0gc3BsaXRbMF0sXG4gICAgICBpID0gMSxcbiAgICAgIGwgPSBzcGxpdC5sZW5ndGgsXG4gICAgICBpbmRleCxcbiAgICAgIHZhbCxcbiAgICAgIHBhcnNlZFZhbDtcblxuICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgIHZhbCA9IHNwbGl0W2ldO1xuICAgIGluZGV4ID0gaSAhPT0gbCAtIDEgPyB2YWwubGFzdEluZGV4T2YoXCIsXCIpIDogdmFsLmxlbmd0aDtcbiAgICBwYXJzZWRWYWwgPSB2YWwuc3Vic3RyKDAsIGluZGV4KTtcbiAgICBvYmpba2V5XSA9IGlzTmFOKHBhcnNlZFZhbCkgPyBwYXJzZWRWYWwucmVwbGFjZShfcXVvdGVzRXhwLCBcIlwiKS50cmltKCkgOiArcGFyc2VkVmFsO1xuICAgIGtleSA9IHZhbC5zdWJzdHIoaW5kZXggKyAxKS50cmltKCk7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSxcbiAgICBfdmFsdWVJblBhcmVudGhlc2VzID0gZnVuY3Rpb24gX3ZhbHVlSW5QYXJlbnRoZXNlcyh2YWx1ZSkge1xuICB2YXIgb3BlbiA9IHZhbHVlLmluZGV4T2YoXCIoXCIpICsgMSxcbiAgICAgIGNsb3NlID0gdmFsdWUuaW5kZXhPZihcIilcIiksXG4gICAgICBuZXN0ZWQgPSB2YWx1ZS5pbmRleE9mKFwiKFwiLCBvcGVuKTtcbiAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyhvcGVuLCB+bmVzdGVkICYmIG5lc3RlZCA8IGNsb3NlID8gdmFsdWUuaW5kZXhPZihcIilcIiwgY2xvc2UgKyAxKSA6IGNsb3NlKTtcbn0sXG4gICAgX2NvbmZpZ0Vhc2VGcm9tU3RyaW5nID0gZnVuY3Rpb24gX2NvbmZpZ0Vhc2VGcm9tU3RyaW5nKG5hbWUpIHtcbiAgLy9uYW1lIGNhbiBiZSBhIHN0cmluZyBsaWtlIFwiZWxhc3RpYy5vdXQoMSwwLjUpXCIsIGFuZCBwYXNzIGluIF9lYXNlTWFwIGFzIG9iaiBhbmQgaXQnbGwgcGFyc2UgaXQgb3V0IGFuZCBjYWxsIHRoZSBhY3R1YWwgZnVuY3Rpb24gbGlrZSBfZWFzZU1hcC5FbGFzdGljLmVhc2VPdXQuY29uZmlnKDEsMC41KS4gSXQgd2lsbCBhbHNvIHBhcnNlIGN1c3RvbSBlYXNlIHN0cmluZ3MgYXMgbG9uZyBhcyBDdXN0b21FYXNlIGlzIGxvYWRlZCBhbmQgcmVnaXN0ZXJlZCAoaW50ZXJuYWxseSBhcyBfZWFzZU1hcC5fQ0UpLlxuICB2YXIgc3BsaXQgPSAobmFtZSArIFwiXCIpLnNwbGl0KFwiKFwiKSxcbiAgICAgIGVhc2UgPSBfZWFzZU1hcFtzcGxpdFswXV07XG4gIHJldHVybiBlYXNlICYmIHNwbGl0Lmxlbmd0aCA+IDEgJiYgZWFzZS5jb25maWcgPyBlYXNlLmNvbmZpZy5hcHBseShudWxsLCB+bmFtZS5pbmRleE9mKFwie1wiKSA/IFtfcGFyc2VPYmplY3RJblN0cmluZyhzcGxpdFsxXSldIDogX3ZhbHVlSW5QYXJlbnRoZXNlcyhuYW1lKS5zcGxpdChcIixcIikubWFwKF9udW1lcmljSWZQb3NzaWJsZSkpIDogX2Vhc2VNYXAuX0NFICYmIF9jdXN0b21FYXNlRXhwLnRlc3QobmFtZSkgPyBfZWFzZU1hcC5fQ0UoXCJcIiwgbmFtZSkgOiBlYXNlO1xufSxcbiAgICBfaW52ZXJ0RWFzZSA9IGZ1bmN0aW9uIF9pbnZlcnRFYXNlKGVhc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIDEgLSBlYXNlKDEgLSBwKTtcbiAgfTtcbn0sXG4gICAgX3BhcnNlRWFzZSA9IGZ1bmN0aW9uIF9wYXJzZUVhc2UoZWFzZSwgZGVmYXVsdEVhc2UpIHtcbiAgcmV0dXJuICFlYXNlID8gZGVmYXVsdEVhc2UgOiAoX2lzRnVuY3Rpb24oZWFzZSkgPyBlYXNlIDogX2Vhc2VNYXBbZWFzZV0gfHwgX2NvbmZpZ0Vhc2VGcm9tU3RyaW5nKGVhc2UpKSB8fCBkZWZhdWx0RWFzZTtcbn0sXG4gICAgX2luc2VydEVhc2UgPSBmdW5jdGlvbiBfaW5zZXJ0RWFzZShuYW1lcywgZWFzZUluLCBlYXNlT3V0LCBlYXNlSW5PdXQpIHtcbiAgaWYgKGVhc2VPdXQgPT09IHZvaWQgMCkge1xuICAgIGVhc2VPdXQgPSBmdW5jdGlvbiBlYXNlT3V0KHApIHtcbiAgICAgIHJldHVybiAxIC0gZWFzZUluKDEgLSBwKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVhc2VJbk91dCA9PT0gdm9pZCAwKSB7XG4gICAgZWFzZUluT3V0ID0gZnVuY3Rpb24gZWFzZUluT3V0KHApIHtcbiAgICAgIHJldHVybiBwIDwgLjUgPyBlYXNlSW4ocCAqIDIpIC8gMiA6IDEgLSBlYXNlSW4oKDEgLSBwKSAqIDIpIC8gMjtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGVhc2UgPSB7XG4gICAgZWFzZUluOiBlYXNlSW4sXG4gICAgZWFzZU91dDogZWFzZU91dCxcbiAgICBlYXNlSW5PdXQ6IGVhc2VJbk91dFxuICB9LFxuICAgICAgbG93ZXJjYXNlTmFtZTtcblxuICBfZm9yRWFjaE5hbWUobmFtZXMsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX2Vhc2VNYXBbbmFtZV0gPSBfZ2xvYmFsc1tuYW1lXSA9IGVhc2U7XG4gICAgX2Vhc2VNYXBbbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKV0gPSBlYXNlT3V0O1xuXG4gICAgZm9yICh2YXIgcCBpbiBlYXNlKSB7XG4gICAgICBfZWFzZU1hcFtsb3dlcmNhc2VOYW1lICsgKHAgPT09IFwiZWFzZUluXCIgPyBcIi5pblwiIDogcCA9PT0gXCJlYXNlT3V0XCIgPyBcIi5vdXRcIiA6IFwiLmluT3V0XCIpXSA9IF9lYXNlTWFwW25hbWUgKyBcIi5cIiArIHBdID0gZWFzZVtwXTtcbiAgICB9XG4gI
12666H0pO1xuXG4gIHJldHVybiBlYXNlO1xufSxcbiAgICBfZWFzZUluT3V0RnJvbU91dCA9IGZ1bmN0aW9uIF9lYXNlSW5PdXRGcm9tT3V0KGVhc2VPdXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHAgPCAuNSA/ICgxIC0gZWFzZU91dCgxIC0gcCAqIDIpKSAvIDIgOiAuNSArIGVhc2VPdXQoKHAgLSAuNSkgKiAyKSAvIDI7XG4gIH07XG59LFxuICAgIF9jb25maWdFbGFzdGljID0gZnVuY3Rpb24gX2NvbmZpZ0VsYXN0aWModHlwZSwgYW1wbGl0dWRlLCBwZXJpb2QpIHtcbiAgdmFyIHAxID0gYW1wbGl0dWRlID49IDEgPyBhbXBsaXR1ZGUgOiAxLFxuICAgICAgLy9ub3RlOiBpZiBhbXBsaXR1ZGUgaXMgPCAxLCB3ZSBzaW1wbHkgYWRqdXN0IHRoZSBwZXJpb2QgZm9yIGEgbW9yZSBuYXR1cmFsIGZlZWwuIE90aGVyd2lzZSB0aGUgbWF0aCBkb2Vzbid0IHdvcmsgcmlnaHQgYW5kIHRoZSBjdXJ2ZSBzdGFydHMgYXQgMS5cbiAgcDIgPSAocGVyaW9kIHx8ICh0eXBlID8gLjMgOiAuNDUpKSAvIChhbXBsaXR1ZGUgPCAxID8gYW1wbGl0dWRlIDogMSksXG4gICAgICBwMyA9IHAyIC8gXzJQSSAqIChNYXRoLmFzaW4oMSAvIHAxKSB8fCAwKSxcbiAgICAgIGVhc2VPdXQgPSBmdW5jdGlvbiBlYXNlT3V0KHApIHtcbiAgICByZXR1cm4gcCA9PT0gMSA/IDEgOiBwMSAqIE1hdGgucG93KDIsIC0xMCAqIHApICogX3NpbigocCAtIHAzKSAqIHAyKSArIDE7XG4gIH0sXG4gICAgICBlYXNlID0gdHlwZSA9PT0gXCJvdXRcIiA/IGVhc2VPdXQgOiB0eXBlID09PSBcImluXCIgPyBmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiAxIC0gZWFzZU91dCgxIC0gcCk7XG4gIH0gOiBfZWFzZUluT3V0RnJvbU91dChlYXNlT3V0KTtcblxuICBwMiA9IF8yUEkgLyBwMjsgLy9wcmVjYWxjdWxhdGUgdG8gb3B0aW1pemVcblxuICBlYXNlLmNvbmZpZyA9IGZ1bmN0aW9uIChhbXBsaXR1ZGUsIHBlcmlvZCkge1xuICAgIHJldHVybiBfY29uZmlnRWxhc3RpYyh0eXBlLCBhbXBsaXR1ZGUsIHBlcmlvZCk7XG4gIH07XG5cbiAgcmV0dXJuIGVhc2U7XG59LFxuICAgIF9jb25maWdCYWNrID0gZnVuY3Rpb24gX2NvbmZpZ0JhY2sodHlwZSwgb3ZlcnNob290KSB7XG4gIGlmIChvdmVyc2hvb3QgPT09IHZvaWQgMCkge1xuICAgIG92ZXJzaG9vdCA9IDEuNzAxNTg7XG4gIH1cblxuICB2YXIgZWFzZU91dCA9IGZ1bmN0aW9uIGVhc2VPdXQocCkge1xuICAgIHJldHVybiBwID8gLS1wICogcCAqICgob3ZlcnNob290ICsgMSkgKiBwICsgb3ZlcnNob290KSArIDEgOiAwO1xuICB9LFxuICAgICAgZWFzZSA9IHR5cGUgPT09IFwib3V0XCIgPyBlYXNlT3V0IDogdHlwZSA9PT0gXCJpblwiID8gZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gMSAtIGVhc2VPdXQoMSAtIHApO1xuICB9IDogX2Vhc2VJbk91dEZyb21PdXQoZWFzZU91dCk7XG5cbiAgZWFzZS5jb25maWcgPSBmdW5jdGlvbiAob3ZlcnNob290KSB7XG4gICAgcmV0dXJuIF9jb25maWdCYWNrKHR5cGUsIG92ZXJzaG9vdCk7XG4gIH07XG5cbiAgcmV0dXJuIGVhc2U7XG59OyAvLyBhIGNoZWFwZXIgKGtiIGFuZCBjcHUpIGJ1dCBtb3JlIG1pbGQgd2F5IHRvIGdldCBhIHBhcmFtZXRlcml6ZWQgd2VpZ2h0ZWQgZWFzZSBieSBmZWVkaW5nIGluIGEgdmFsdWUgYmV0d2VlbiAtMSAoZWFzZUluKSBhbmQgMSAoZWFzZU91dCkgd2hlcmUgMCBpcyBsaW5lYXIuXG4vLyBfd2VpZ2h0ZWRFYXNlID0gcmF0aW8gPT4ge1xuLy8gXHRsZXQgeSA9IDAuNSArIHJhdGlvIC8gMjtcbi8vIFx0cmV0dXJuIHAgPT4gKDIgKiAoMSAtIHApICogcCAqIHkgKyBwICogcCk7XG4vLyB9LFxuLy8gYSBzdHJvbmdlciAoYnV0IG1vcmUgZXhwZW5zaXZlIGtiL2NwdSkgcGFyYW1ldGVyaXplZCB3ZWlnaHRlZCBlYXNlIHRoYXQgbGV0cyB5b3UgZmVlZCBpbiBhIHZhbHVlIGJldHdlZW4gLTEgKGVhc2VJbikgYW5kIDEgKGVhc2VPdXQpIHdoZXJlIDAgaXMgbGluZWFyLlxuLy8gX3dlaWdodGVkRWFzZVN0cm9uZyA9IHJhdGlvID0+IHtcbi8vIFx0cmF0aW8gPSAuNSArIHJhdGlvIC8gMjtcbi8vIFx0bGV0IG8gPSAxIC8gMyAqIChyYXRpbyA8IC41ID8gcmF0aW8gOiAxIC0gcmF0aW8pLFxuLy8gXHRcdGIgPSByYXRpbyAtIG8sXG4vLyBcdFx0YyA9IHJhdGlvICsgbztcbi8vIFx0cmV0dXJuIHAgPT4gcCA9PT0gMSA/IHAgOiAzICogYiAqICgxIC0gcCkgKiAoMSAtIHApICogcCArIDMgKiBjICogKDEgLSBwKSAqIHAgKiBwICsgcCAqIHAgKiBwO1xuLy8gfTtcblxuXG5fZm9yRWFjaE5hbWUoXCJMaW5lYXIsUXVhZCxDdWJpYyxRdWFydCxRdWludCxTdHJvbmdcIiwgZnVuY3Rpb24gKG5hbWUsIGkpIHtcbiAgdmFyIHBvd2VyID0gaSA8IDUgPyBpICsgMSA6IGk7XG5cbiAgX2luc2VydEVhc2UobmFtZSArIFwiLFBvd2VyXCIgKyAocG93ZXIgLSAxKSwgaSA/IGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHAsIHBvd2VyKTtcbiAgfSA6IGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHA7XG4gIH0sIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIDEgLSBNYXRoLnBvdygxIC0gcCwgcG93ZXIpO1xuICB9LCBmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwIDwgLjUgPyBNYXRoLnBvdyhwICogMiwgcG93ZXIpIC8gMiA6IDEgLSBNYXRoLnBvdygoMSAtIHApICogMiwgcG93ZXIpIC8gMjtcbiAgfSk7XG59KTtcblxuX2Vhc2VNYXAuTGluZWFyLmVhc2VOb25lID0gX2Vhc2VNYXAubm9uZSA9IF9lYXNlTWFwLkxpbmVhci5lYXNlSW47XG5cbl9pbnNlcnRFYXNlKFwiRWxhc3RpY1wiLCBfY29uZmlnRWxhc3RpYyhcImluXCIpLCBfY29uZmlnRWxhc3RpYyhcIm91dFwiKSwgX2NvbmZpZ0VsYXN0aWMoKSk7XG5cbihmdW5jdGlvbiAobiwgYykge1xuICB2YXIgbjEgPSAxIC8gYyxcbiAgICAgIG4yID0gMiAqIG4xLFxuICAgICAgbjMgPSAyLjUgKiBuMSxcbiAgICAgIGVhc2VPdXQgPSBmdW5jdGlvbiBlYXNlT3V0KHApIHtcbiAgICByZXR1cm4gcCA8IG4xID8gbiAqIHAgKiBwIDogcCA8IG4yID8gbiAqIE1hdGgucG93KHAgLSAxLjUgLyBjLCAyKSArIC43NSA6IHAgPCBuMyA/IG4gKiAocCAtPSAyLjI1IC8gYykgKiBwICsgLjkzNzUgOiBuICogTWF0aC5wb3cocCAtIDIuNjI1IC8gYywgMikgKyAuOTg0Mzc1O1xuICB9O1xuXG4gIF9pbnNlcnRFYXNlKFwiQm91bmNlXCIsIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIDEgLSBlYXNlT3V0KDEgLSBwKTtcbiAgfSwgZWFzZU91dCk7XG59KSg3LjU2MjUsIDIuNzUpO1xuXG5faW5zZXJ0RWFzZShcIkV4cG9cIiwgZnVuY3Rpb24gKHApIHtcbiAgcmV0dXJuIE1hdGgucG93KDIsIDEwICogKHAgLSAxKSkgKiBwICsgcCAqIHAgKiBwICogcCAqIHAgKiBwICogKDEgLSBwKTtcbn0pOyAvLyBwcmV2aW91c2x5IDIgKiogKDEwICogKHAgLSAxKSkgYnV0IHRoYXQgZG9lc24ndCBlbmQgdXAgd2l0aCB0aGUgdmFsdWUgcXVpdGUgYXQgdGhlIHJpZ2h0IHNwb3Qgc28gd2UgZG8gYSBibGVuZGVkIGVhc2UgdG8gZW5zdXJlIGl0IGxhbmRzIHdoZXJlIGl0IHNob3VsZCBwZXJmZWN0bHkuXG5cblxuX2luc2VydEVhc2UoXCJDaXJjXCIsIGZ1bmN0aW9uIChwKSB7XG4gIHJldHVybiAtKF9zcXJ0KDEgLSBwICogcCkgLSAxKTtcbn0pO1xuXG5faW5zZXJ0RWFzZShcIlNpbmVcIiwgZnVuY3Rpb24gKHApIHtcbiAgcmV0dXJuIHAgPT09IDEgPyAxIDogLV9jb3MocCAqIF9IQUxGX1BJKSArIDE7XG59KTtcblxuX2luc2VydEVhc2UoXCJCYWNrXCIsIF9jb25maWdCYWNrKFwiaW5cIiksIF9jb25maWdCYWNrKFwib3V0XCIpLCBfY29uZmlnQmFjaygpKTtcblxuX2Vhc2VNYXAuU3RlcHBlZEVhc2UgPSBfZWFzZU1hcC5zdGVwcyA9IF9nbG9iYWxzLlN0ZXBwZWRFYXNlID0ge1xuICBjb25maWc6IGZ1bmN0aW9uIGNvbmZpZyhzdGVwcywgaW1tZWRpYXRlU3RhcnQpIHtcbiAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkge1xuICAgICAgc3RlcHMgPSAxO1xuICAgIH1cblxuICAgI
12666HZhciBwMSA9IDEgLyBzdGVwcyxcbiAgICAgICAgcDIgPSBzdGVwcyArIChpbW1lZGlhdGVTdGFydCA/IDAgOiAxKSxcbiAgICAgICAgcDMgPSBpbW1lZGlhdGVTdGFydCA/IDEgOiAwLFxuICAgICAgICBtYXggPSAxIC0gX3RpbnlOdW07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gKChwMiAqIF9jbGFtcCgwLCBtYXgsIHApIHwgMCkgKyBwMykgKiBwMTtcbiAgICB9O1xuICB9XG59O1xuX2RlZmF1bHRzLmVhc2UgPSBfZWFzZU1hcFtcInF1YWQub3V0XCJdO1xuXG5fZm9yRWFjaE5hbWUoXCJvbkNvbXBsZXRlLG9uVXBkYXRlLG9uU3RhcnQsb25SZXBlYXQsb25SZXZlcnNlQ29tcGxldGUsb25JbnRlcnJ1cHRcIiwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF9jYWxsYmFja05hbWVzICs9IG5hbWUgKyBcIixcIiArIG5hbWUgKyBcIlBhcmFtcyxcIjtcbn0pO1xuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDQUNIRVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbmV4cG9ydCB2YXIgR1NDYWNoZSA9IGZ1bmN0aW9uIEdTQ2FjaGUodGFyZ2V0LCBoYXJuZXNzKSB7XG4gIHRoaXMuaWQgPSBfZ3NJRCsrO1xuICB0YXJnZXQuX2dzYXAgPSB0aGlzO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgdGhpcy5oYXJuZXNzID0gaGFybmVzcztcbiAgdGhpcy5nZXQgPSBoYXJuZXNzID8gaGFybmVzcy5nZXQgOiBfZ2V0UHJvcGVydHk7XG4gIHRoaXMuc2V0ID0gaGFybmVzcyA/IGhhcm5lc3MuZ2V0U2V0dGVyIDogX2dldFNldHRlcjtcbn07XG4vKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFOSU1BVElPTlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5leHBvcnQgdmFyIEFuaW1hdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFuaW1hdGlvbih2YXJzKSB7XG4gICAgdGhpcy52YXJzID0gdmFycztcbiAgICB0aGlzLl9kZWxheSA9ICt2YXJzLmRlbGF5IHx8IDA7XG5cbiAgICBpZiAodGhpcy5fcmVwZWF0ID0gdmFycy5yZXBlYXQgPT09IEluZmluaXR5ID8gLTIgOiB2YXJzLnJlcGVhdCB8fCAwKSB7XG4gICAgICAvLyBUT0RPOiByZXBlYXQ6IEluZmluaXR5IG9uIGEgdGltZWxpbmUncyBjaGlsZHJlbiBtdXN0IGZsYWcgdGhhdCB0aW1lbGluZSBpbnRlcm5hbGx5IGFuZCBhZmZlY3QgaXRzIHRvdGFsRHVyYXRpb24sIG90aGVyd2lzZSBpdCdsbCBzdG9wIGluIHRoZSBuZWdhdGl2ZSBkaXJlY3Rpb24gd2hlbiByZWFjaGluZyB0aGUgc3RhcnQuXG4gICAgICB0aGlzLl9yRGVsYXkgPSB2YXJzLnJlcGVhdERlbGF5IHx8IDA7XG4gICAgICB0aGlzLl95b3lvID0gISF2YXJzLnlveW8gfHwgISF2YXJzLnlveW9FYXNlO1xuICAgIH1cblxuICAgIHRoaXMuX3RzID0gMTtcblxuICAgIF9zZXREdXJhdGlvbih0aGlzLCArdmFycy5kdXJhdGlvbiwgMSwgMSk7XG5cbiAgICB0aGlzLmRhdGEgPSB2YXJzLmRhdGE7XG5cbiAgICBpZiAoX2NvbnRleHQpIHtcbiAgICAgIHRoaXMuX2N0eCA9IF9jb250ZXh0O1xuXG4gICAgICBfY29udGV4dC5kYXRhLnB1c2godGhpcyk7XG4gICAgfVxuXG4gICAgX3RpY2tlckFjdGl2ZSB8fCBfdGlja2VyLndha2UoKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBBbmltYXRpb24ucHJvdG90eXBlO1xuXG4gIF9wcm90by5kZWxheSA9IGZ1bmN0aW9uIGRlbGF5KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIHx8IHZhbHVlID09PSAwKSB7XG4gICAgICB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5zbW9vdGhDaGlsZFRpbWluZyAmJiB0aGlzLnN0YXJ0VGltZSh0aGlzLl9zdGFydCArIHZhbHVlIC0gdGhpcy5fZGVsYXkpO1xuICAgICAgdGhpcy5fZGVsYXkgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9kZWxheTtcbiAgfTtcblxuICBfcHJvdG8uZHVyYXRpb24gPSBmdW5jdGlvbiBkdXJhdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy50b3RhbER1cmF0aW9uKHRoaXMuX3JlcGVhdCA+IDAgPyB2YWx1ZSArICh2YWx1ZSArIHRoaXMuX3JEZWxheSkgKiB0aGlzLl9yZXBlYXQgOiB2YWx1ZSkgOiB0aGlzLnRvdGFsRHVyYXRpb24oKSAmJiB0aGlzLl9kdXI7XG4gIH07XG5cbiAgX3Byb3RvLnRvdGFsRHVyYXRpb24gPSBmdW5jdGlvbiB0b3RhbER1cmF0aW9uKHZhbHVlKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdER1cjtcbiAgICB9XG5cbiAgICB0aGlzLl9kaXJ0eSA9IDA7XG4gICAgcmV0dXJuIF9zZXREdXJhdGlvbih0aGlzLCB0aGlzLl9yZXBlYXQgPCAwID8gdmFsdWUgOiAodmFsdWUgLSB0aGlzLl9yZXBlYXQgKiB0aGlzLl9yRGVsYXkpIC8gKHRoaXMuX3JlcGVhdCArIDEpKTtcbiAgfTtcblxuICBfcHJvdG8udG90YWxUaW1lID0gZnVuY3Rpb24gdG90YWxUaW1lKF90b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzKSB7XG4gICAgX3dha2UoKTtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RUaW1lO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnQgPSB0aGlzLl9kcDtcblxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LnNtb290aENoaWxkVGltaW5nICYmIHRoaXMuX3RzKSB7XG4gICAgICBfYWxpZ25QbGF5aGVhZCh0aGlzLCBfdG90YWxUaW1lKTtcblxuICAgICAgIXBhcmVudC5fZHAgfHwgcGFyZW50LnBhcmVudCB8fCBfcG9zdEFkZENoZWNrcyhwYXJlbnQsIHRoaXMpOyAvLyBlZGdlIGNhc2U6IGlmIHRoaXMgaXMgYSBjaGlsZCBvZiBhIHRpbWVsaW5lIHRoYXQgYWxyZWFkeSBjb21wbGV0ZWQsIGZvciBleGFtcGxlLCB3ZSBtdXN0IHJlLWFjdGl2YXRlIHRoZSBwYXJlbnQuXG4gICAgICAvL2luIGNhc2UgYW55IG9mIHRoZSBhbmNlc3RvciB0aW1lbGluZXMgaGFkIGNvbXBsZXRlZCBidXQgc2hvdWxkIG5vdyBiZSBlbmFibGVkLCB3ZSBzaG91bGQgcmVzZXQgdGhlaXIgdG90YWxUaW1lKCkgd2hpY2ggd2lsbCBhbHNvIGVuc3VyZSB0aGF0IHR
12666oZXkncmUgbGluZWQgdXAgcHJvcGVybHkgYW5kIGVuYWJsZWQuIFNraXAgZm9yIGFuaW1hdGlvbnMgdGhhdCBhcmUgb24gdGhlIHJvb3QgKHdhc3RlZnVsKS4gRXhhbXBsZTogYSBUaW1lbGluZUxpdGUuZXhwb3J0Um9vdCgpIGlzIHBlcmZvcm1lZCB3aGVuIHRoZXJlJ3MgYSBwYXVzZWQgdHdlZW4gb24gdGhlIHJvb3QsIHRoZSBleHBvcnQgd2lsbCBub3QgY29tcGxldGUgdW50aWwgdGhhdCB0d2VlbiBpcyB1bnBhdXNlZCwgYnV0IGltYWdpbmUgYSBjaGlsZCBnZXRzIHJlc3RhcnRlZCBsYXRlciwgYWZ0ZXIgYWxsIFt1bnBhdXNlZF0gdHdlZW5zIGhhdmUgY29tcGxldGVkLiBUaGUgc3RhcnQgb2YgdGhhdCBjaGlsZCB3b3VsZCBnZXQgcHVzaGVkIG91dCwgYnV0IG9uZSBvZiB0aGUgYW5jZXN0b3JzIG1heSBoYXZlIGNvbXBsZXRlZC5cblxuICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQucGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQucGFyZW50Ll90aW1lICE9PSBwYXJlbnQuX3N0YXJ0ICsgKHBhcmVudC5fdHMgPj0gMCA/IHBhcmVudC5fdFRpbWUgLyBwYXJlbnQuX3RzIDogKHBhcmVudC50b3RhbER1cmF0aW9uKCkgLSBwYXJlbnQuX3RUaW1lKSAvIC1wYXJlbnQuX3RzKSkge1xuICAgICAgICAgIHBhcmVudC50b3RhbFRpbWUocGFyZW50Ll90VGltZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMucGFyZW50ICYmIHRoaXMuX2RwLmF1dG9SZW1vdmVDaGlsZHJlbiAmJiAodGhpcy5fdHMgPiAwICYmIF90b3RhbFRpbWUgPCB0aGlzLl90RHVyIHx8IHRoaXMuX3RzIDwgMCAmJiBfdG90YWxUaW1lID4gMCB8fCAhdGhpcy5fdER1ciAmJiAhX3RvdGFsVGltZSkpIHtcbiAgICAgICAgLy9pZiB0aGUgYW5pbWF0aW9uIGRvZXNuJ3QgaGF2ZSBhIHBhcmVudCwgcHV0IGl0IGJhY2sgaW50byBpdHMgbGFzdCBwYXJlbnQgKHJlY29yZGVkIGFzIF9kcCBmb3IgZXhhY3RseSBjYXNlcyBsaWtlIHRoaXMpLiBMaW1pdCB0byBwYXJlbnRzIHdpdGggYXV0b1JlbW92ZUNoaWxkcmVuIChsaWtlIGdsb2JhbFRpbWVsaW5lKSBzbyB0aGF0IGlmIHRoZSB1c2VyIG1hbnVhbGx5IHJlbW92ZXMgYW4gYW5pbWF0aW9uIGZyb20gYSB0aW1lbGluZSBhbmQgdGhlbiBhbHRlcnMgaXRzIHBsYXloZWFkLCBpdCBkb2Vzbid0IGdldCBhZGRlZCBiYWNrIGluLlxuICAgICAgICBfYWRkVG9UaW1lbGluZSh0aGlzLl9kcCwgdGhpcywgdGhpcy5fc3RhcnQgLSB0aGlzLl9kZWxheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3RUaW1lICE9PSBfdG90YWxUaW1lIHx8ICF0aGlzLl9kdXIgJiYgIXN1cHByZXNzRXZlbnRzIHx8IHRoaXMuX2luaXR0ZWQgJiYgTWF0aC5hYnModGhpcy5felRpbWUpID09PSBfdGlueU51bSB8fCAhdGhpcy5faW5pdHRlZCAmJiB0aGlzLl9kdXIgJiYgX3RvdGFsVGltZSB8fCAhX3RvdGFsVGltZSAmJiAhdGhpcy5faW5pdHRlZCAmJiAodGhpcy5hZGQgfHwgdGhpcy5fcHRMb29rdXApKSB7XG4gICAgICAvLyBjaGVjayBmb3IgX3B0TG9va3VwIG9uIGEgVHdlZW4gaW5zdGFuY2UgdG8gZW5zdXJlIGl0IGhhcyBhY3R1YWxseSBmaW5pc2hlZCBiZWluZyBpbnN0YW50aWF0ZWQsIG90aGVyd2lzZSBpZiB0aGlzLnJldmVyc2UoKSBnZXRzIGNhbGxlZCBpbiB0aGUgQW5pbWF0aW9uIGNvbnN0cnVjdG9yLCBpdCBjb3VsZCB0cmlnZ2VyIGEgcmVuZGVyKCkgaGVyZSBldmVuIHRob3VnaCB0aGUgX3RhcmdldHMgd2VyZW4ndCBwb3B1bGF0ZWQsIHRodXMgd2hlbiBfaW5pdCgpIGlzIGNhbGxlZCB0aGVyZSB3b24ndCBiZSBhbnkgUHJvcFR3ZWVucyAoaXQnbGwgYWN0IGxpa2UgdGhlIHR3ZWVuIGlzIG5vbi1mdW5jdGlvbmFsKVxuICAgICAgdGhpcy5fdHMgfHwgKHRoaXMuX3BUaW1lID0gX3RvdGFsVGltZSk7IC8vIG90aGVyd2lzZSwgaWYgYW4gYW5pbWF0aW9uIGlzIHBhdXNlZCwgdGhlbiB0aGUgcGxheWhlYWQgaXMgbW92ZWQgYmFjayB0byB6ZXJvLCB0aGVuIHJlc3VtZWQsIGl0J2QgcmV2ZXJ0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHRpbWUgYXQgdGhlIHBhdXNlXG4gICAgICAvL2lmICghdGhpcy5fbG9jaykgeyAvLyBhdm9pZCBlbmRsZXNzIHJlY3Vyc2lvbiAobm90IHN1cmUgd2UgbmVlZCB0aGlzIHlldCBvciBpZiBpdCdzIHdvcnRoIHRoZSBwZXJmb3JtYW5jZSBoaXQpXG4gICAgICAvLyAgIHRoaXMuX2xvY2sgPSAxO1xuXG4gICAgICBfbGF6eVNhZmVSZW5kZXIodGhpcywgX3RvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMpOyAvLyAgIHRoaXMuX2xvY2sgPSAwO1xuICAgICAgLy99XG5cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8udGltZSA9IGZ1bmN0aW9uIHRpbWUodmFsdWUsIHN1cHByZXNzRXZlbnRzKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnRvdGFsVGltZShNYXRoLm1pbih0aGlzLnRvdGFsRHVyYXRpb24oKSwgdmFsdWUgKyBfZWxhcHNlZEN5Y2xlRHVyYXRpb24odGhpcykpICUgKHRoaXMuX2R1ciArIHRoaXMuX3JEZWxheSkgfHwgKHZhbHVlID8gdGhpcy5fZHVyIDogMCksIHN1cHByZXNzRXZlbnRzKSA6IHRoaXMuX3RpbWU7IC8vIG5vdGU6IGlmIHRoZSBtb2R1bHVzIHJlc3VsdHMgaW4gMCwgdGhlIHBsYXloZWFkIGNvdWxkIGJlIGV4YWN0bHkgYXQgdGhlIGVuZCBvciB0aGUgYmVnaW5uaW5nLCBhbmQgd2UgYWx3YXlzIGRlZmVyIHRvIHRoZSBFTkQgd2l0aCBhIG5vbi16ZXJvIHZhbHVlLCBvdGhlcndpc2UgaWYgeW91IHNldCB0aGUgdGltZSgpIHRvIHRoZSB2ZXJ5IGVuZCAoZHVyYXRpb24oKSksIGl0IHdvdWxkIHJlbmRlciBhdCB0aGUgU1RBUlQhXG4gIH07XG5cbiAgX3Byb3RvLnRvdGFsUHJvZ3Jlc3MgPSBmdW5jdGlvbiB0b3RhbFByb2dyZXNzKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy50b3RhbFRpbWUodGhpcy50b3RhbER1cmF0aW9uKCkgKiB2YWx1ZSwgc3VwcHJlc3NFdmVudHMpIDogdGhpcy50b3RhbER1cmF0aW9uKCkgPyBNYXRoLm1pbigxLCB0aGlzLl90VGltZSAvIHRoaXMuX3REdXIp
12666IDogdGhpcy5yYXdUaW1lKCkgPj0gMCAmJiB0aGlzLl9pbml0dGVkID8gMSA6IDA7XG4gIH07XG5cbiAgX3Byb3RvLnByb2dyZXNzID0gZnVuY3Rpb24gcHJvZ3Jlc3ModmFsdWUsIHN1cHByZXNzRXZlbnRzKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnRvdGFsVGltZSh0aGlzLmR1cmF0aW9uKCkgKiAodGhpcy5feW95byAmJiAhKHRoaXMuaXRlcmF0aW9uKCkgJiAxKSA/IDEgLSB2YWx1ZSA6IHZhbHVlKSArIF9lbGFwc2VkQ3ljbGVEdXJhdGlvbih0aGlzKSwgc3VwcHJlc3NFdmVudHMpIDogdGhpcy5kdXJhdGlvbigpID8gTWF0aC5taW4oMSwgdGhpcy5fdGltZSAvIHRoaXMuX2R1cikgOiB0aGlzLnJhd1RpbWUoKSA+IDAgPyAxIDogMDtcbiAgfTtcblxuICBfcHJvdG8uaXRlcmF0aW9uID0gZnVuY3Rpb24gaXRlcmF0aW9uKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIHZhciBjeWNsZUR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbigpICsgdGhpcy5fckRlbGF5O1xuXG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnRvdGFsVGltZSh0aGlzLl90aW1lICsgKHZhbHVlIC0gMSkgKiBjeWNsZUR1cmF0aW9uLCBzdXBwcmVzc0V2ZW50cykgOiB0aGlzLl9yZXBlYXQgPyBfYW5pbWF0aW9uQ3ljbGUodGhpcy5fdFRpbWUsIGN5Y2xlRHVyYXRpb24pICsgMSA6IDE7XG4gIH0gLy8gcG90ZW50aWFsIGZ1dHVyZSBhZGRpdGlvbjpcbiAgLy8gaXNQbGF5aW5nQmFja3dhcmRzKCkge1xuICAvLyBcdGxldCBhbmltYXRpb24gPSB0aGlzLFxuICAvLyBcdFx0b3JpZW50YXRpb24gPSAxOyAvLyAxID0gZm9yd2FyZCwgLTEgPSBiYWNrd2FyZFxuICAvLyBcdHdoaWxlIChhbmltYXRpb24pIHtcbiAgLy8gXHRcdG9yaWVudGF0aW9uICo9IGFuaW1hdGlvbi5yZXZlcnNlZCgpIHx8IChhbmltYXRpb24ucmVwZWF0KCkgJiYgIShhbmltYXRpb24uaXRlcmF0aW9uKCkgJiAxKSkgPyAtMSA6IDE7XG4gIC8vIFx0XHRhbmltYXRpb24gPSBhbmltYXRpb24ucGFyZW50O1xuICAvLyBcdH1cbiAgLy8gXHRyZXR1cm4gb3JpZW50YXRpb24gPCAwO1xuICAvLyB9XG4gIDtcblxuICBfcHJvdG8udGltZVNjYWxlID0gZnVuY3Rpb24gdGltZVNjYWxlKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J0cyA9PT0gLV90aW55TnVtID8gMCA6IHRoaXMuX3J0czsgLy8gcmVjb3JkZWQgdGltZVNjYWxlLiBTcGVjaWFsIGNhc2U6IGlmIHNvbWVvbmUgY2FsbHMgcmV2ZXJzZSgpIG9uIGFuIGFuaW1hdGlvbiB3aXRoIHRpbWVTY2FsZSBvZiAwLCB3ZSBhc3NpZ24gaXQgLV90aW55TnVtIHRvIHJlbWVtYmVyIGl0J3MgcmV2ZXJzZWQuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3J0cyA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciB0VGltZSA9IHRoaXMucGFyZW50ICYmIHRoaXMuX3RzID8gX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUodGhpcy5wYXJlbnQuX3RpbWUsIHRoaXMpIDogdGhpcy5fdFRpbWU7IC8vIG1ha2Ugc3VyZSB0byBkbyB0aGUgcGFyZW50VG9DaGlsZFRvdGFsVGltZSgpIEJFRk9SRSBzZXR0aW5nIHRoZSBuZXcgX3RzIGJlY2F1c2UgdGhlIG9sZCBvbmUgbXVzdCBiZSB1c2VkIGluIHRoYXQgY2FsY3VsYXRpb24uXG4gICAgLy8gZnV0dXJlIGFkZGl0aW9uPyBVcCBzaWRlOiBmYXN0IGFuZCBtaW5pbWFsIGZpbGUgc2l6ZS4gRG93biBzaWRlOiBvbmx5IHdvcmtzIG9uIHRoaXMgYW5pbWF0aW9uOyBpZiBhIHRpbWVsaW5lIGlzIHJldmVyc2VkLCBmb3IgZXhhbXBsZSwgaXRzIGNoaWxkcmVucycgb25SZXZlcnNlIHdvdWxkbid0IGdldCBjYWxsZWQuXG4gICAgLy8oK3ZhbHVlIDwgMCAmJiB0aGlzLl9ydHMgPj0gMCkgJiYgX2NhbGxiYWNrKHRoaXMsIFwib25SZXZlcnNlXCIsIHRydWUpO1xuICAgIC8vIHByaW9yaXRpemUgcmVuZGVyaW5nIHdoZXJlIHRoZSBwYXJlbnQncyBwbGF5aGVhZCBsaW5lcyB1cCBpbnN0ZWFkIG9mIHRoaXMuX3RUaW1lIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgYSB0d2VlbiB0aGF0J3MgYW5pbWF0aW5nIGFub3RoZXIgdHdlZW4ncyB0aW1lU2NhbGUgaW4gdGhlIHNhbWUgcmVuZGVyaW5nIGxvb3AgKHNhbWUgcGFyZW50KSwgdGh1cyBpZiB0aGUgdGltZVNjYWxlIHR3ZWVuIHJlbmRlcnMgZmlyc3QsIGl0IHdvdWxkIGFsdGVyIF9zdGFydCBCRUZPUkUgX3RUaW1lIHdhcyBzZXQgb24gdGhhdCB0aWNrIChpbiB0aGUgcmVuZGVyaW5nIGxvb3ApLCBlZmZlY3RpdmVseSBmcmVlemluZyBpdCB1bnRpbCB0aGUgdGltZVNjYWxlIHR3ZWVuIGZpbmlzaGVzLlxuXG4gICAgdGhpcy5fcnRzID0gK3ZhbHVlIHx8IDA7XG4gICAgdGhpcy5fdHMgPSB0aGlzLl9wcyB8fCB2YWx1ZSA9PT0gLV90aW55TnVtID8gMCA6IHRoaXMuX3J0czsgLy8gX3RzIGlzIHRoZSBmdW5jdGlvbmFsIHRpbWVTY2FsZSB3aGljaCB3b3VsZCBiZSAwIGlmIHRoZSBhbmltYXRpb24gaXMgcGF1c2VkLlxuXG4gICAgdGhpcy50b3RhbFRpbWUoX2NsYW1wKC1NYXRoLmFicyh0aGlzLl9kZWxheSksIHRoaXMudG90YWxEdXJhdGlvbigpLCB0VGltZSksIHN1cHByZXNzRXZlbnRzICE9PSBmYWxzZSk7XG5cbiAgICBfc2V0RW5kKHRoaXMpOyAvLyBpZiBwYXJlbnQuc21vb3RoQ2hpbGRUaW1pbmcgd2FzIGZhbHNlLCB0aGUgZW5kIHRpbWUgZGlkbid0IGdldCB1cGRhdGVkIGluIHRoZSBfYWxpZ25QbGF5aGVhZCgpIG1ldGhvZCwgc28gZG8gaXQgaGVyZS5cblxuXG4gICAgcmV0dXJuIF9yZWNhY2hlQW5jZXN0b3JzKHRoaXMpO1xuICB9O1xuXG4gIF9wcm90by5wYXVzZWQgPSBmdW5jdGlvbiBwYXVzZWQodmFsdWUpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcztcbiAgICB9IC8vIHBvc3NpYmxlIGZ1dHVyZSBhZGRpdGlvbiAtIGlmIGFuIGFuaW1hdGlvbiBpcyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBhbmQgdGhlbiAucmVzdGFydCgpIG9yIC5wbGF5KCkgb3IgLnJlc3VtZSgpIGlzIGNhbGxlZCwgcGVyaGFwcyB3ZSBzaG91bGQgZm9yY2UgaXQgYmFjayBpbnRvIHRoZSBnbG9iYWxUaW1lbGluZSBidXQgYmUgY2FyZWZ1bCBiZWNhdXNlIHdoYXQgaWYgaXQncyBhbHJlYWR5IGF0IGl0cyBlbmQ/IFdlIGRvbid0IHdhbnQgaXQgdG8ganVzdCBwZXJzaXN0IGZvcmV2ZXIgYW5kIG5vdCBnZXQgcmVsZWFzZWQgZm9yIEdDLlxuICAgIC8vICF0aGlzLnBhcmVudCAmJiAhdmFsdWUgJiYgdGhpcy5fdFRpbWUgPCB0aGlzLl90RHVyICYmIHRoaXMgIT09IF9nbG9iYWxUaW1lbGluZSAmJiBfZ2xvYmFsVGltZWxpbmUuYWRkKHRoaXMpO1xuXG5cbiAgICBpZiAodGhpcy5fcHMgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9wcyA9IHZhbHVlO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcFRpbWUgPSB0aGlzLl90VGltZSB8fCBNYXRoLm1heCgtdGhpcy5fZGVsYXksIHRoaXMucmF3VGltZSgpKTsgLy8gaWYgdGhlIHBhdXNlIG9jY3VycyBkdXJpbmcgdGhlIGRlbGF5IHBoYXNlLCBtYWtlIHN1cmUgdGhhdCdzIGZhY3RvcmVkIGluIHdoZW4gcmVzdW1pbmcuXG5cbiAgICAgICAgdGhpcy5fdHMgPSB0aGlzLl9hY3QgPSAwOyAvLyBfdHMgaXMgdGhlIGZ1bmN0aW9uYWwgdGltZVNjYWxlLCBzbyBhIHBhdXNlZCB0d2VlbiB3b3VsZCBlZmZlY3RpdmVseSBoYXZlIGEgdGltZVNjYWxlIG9mIDAuIF
12666dlIHJlY29yZCB0aGUgXCJyZWFsXCIgdGltZVNjYWxlIGFzIF9ydHMgKHJlY29yZGVkIHRpbWUgc2NhbGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfd2FrZSgpO1xuXG4gICAgICAgIHRoaXMuX3RzID0gdGhpcy5fcnRzOyAvL29ubHkgZGVmZXIgdG8gX3BUaW1lIChwYXVzZVRpbWUpIGlmIHRUaW1lIGlzIHplcm8uIFJlbWVtYmVyLCBzb21lb25lIGNvdWxkIHBhdXNlKCkgYW4gYW5pbWF0aW9uLCB0aGVuIHNjcnViIHRoZSBwbGF5aGVhZCBhbmQgcmVzdW1lKCkuIElmIHRoZSBwYXJlbnQgZG9lc24ndCBoYXZlIHNtb290aENoaWxkVGltaW5nLCB3ZSByZW5kZXIgYXQgdGhlIHJhd1RpbWUoKSBiZWNhdXNlIHRoZSBzdGFydFRpbWUgd29uJ3QgZ2V0IHVwZGF0ZWQuXG5cbiAgICAgICAgdGhpcy50b3RhbFRpbWUodGhpcy5wYXJlbnQgJiYgIXRoaXMucGFyZW50LnNtb290aENoaWxkVGltaW5nID8gdGhpcy5yYXdUaW1lKCkgOiB0aGlzLl90VGltZSB8fCB0aGlzLl9wVGltZSwgdGhpcy5wcm9ncmVzcygpID09PSAxICYmIE1hdGguYWJzKHRoaXMuX3pUaW1lKSAhPT0gX3RpbnlOdW0gJiYgKHRoaXMuX3RUaW1lIC09IF90aW55TnVtKSk7IC8vIGVkZ2UgY2FzZTogYW5pbWF0aW9uLnByb2dyZXNzKDEpLnBhdXNlKCkucGxheSgpIHdvdWxkbid0IHJlbmRlciBhZ2FpbiBiZWNhdXNlIHRoZSBwbGF5aGVhZCBpcyBhbHJlYWR5IGF0IHRoZSBlbmQsIGJ1dCB0aGUgY2FsbCB0byB0b3RhbFRpbWUoKSBiZWxvdyB3aWxsIGFkZCBpdCBiYWNrIHRvIGl0cyBwYXJlbnQuLi5hbmQgbm90IHJlbW92ZSBpdCBhZ2FpbiAoc2luY2UgcmVtb3Zpbmcgb25seSBoYXBwZW5zIHVwb24gcmVuZGVyaW5nIGF0IGEgbmV3IHRpbWUpLiBPZmZzZXR0aW5nIHRoZSBfdFRpbWUgc2xpZ2h0bHkgaXMgZG9uZSBzaW1wbHkgdG8gY2F1c2UgdGhlIGZpbmFsIHJlbmRlciBpbiB0b3RhbFRpbWUoKSB0aGF0J2xsIHBvcCBpdCBvZmYgaXRzIHRpbWVsaW5lIChpZiBhdXRvUmVtb3ZlQ2hpbGRyZW4gaXMgdHJ1ZSwgb2YgY291cnNlKS4gQ2hlY2sgdG8gbWFrZSBzdXJlIF96VGltZSBpc24ndCAtX3RpbnlOdW0gdG8gYXZvaWQgYW4gZWRnZSBjYXNlIHdoZXJlIHRoZSBwbGF5aGVhZCBpcyBwdXNoZWQgdG8gdGhlIGVuZCBidXQgSU5TSURFIGEgdHdlZW4vY2FsbGJhY2ssIHRoZSB0aW1lbGluZSBpdHNlbGYgaXMgcGF1c2VkIHRodXMgaGFsdGluZyByZW5kZXJpbmcgYW5kIGxlYXZpbmcgYSBmZXcgdW5yZW5kZXJlZC4gV2hlbiByZXN1bWluZywgaXQgd291bGRuJ3QgcmVuZGVyIHRob3NlIG90aGVyd2lzZS5cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8uc3RhcnRUaW1lID0gZnVuY3Rpb24gc3RhcnRUaW1lKHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3N0YXJ0ID0gX3JvdW5kUHJlY2lzZSh2YWx1ZSk7XG4gICAgICB2Y
12666XIgcGFyZW50ID0gdGhpcy5wYXJlbnQgfHwgdGhpcy5fZHA7XG4gICAgICBwYXJlbnQgJiYgKHBhcmVudC5fc29ydCB8fCAhdGhpcy5wYXJlbnQpICYmIF9hZGRUb1RpbWVsaW5lKHBhcmVudCwgdGhpcywgdGhpcy5fc3RhcnQgLSB0aGlzLl9kZWxheSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc3RhcnQ7XG4gIH07XG5cbiAgX3Byb3RvLmVuZFRpbWUgPSBmdW5jdGlvbiBlbmRUaW1lKGluY2x1ZGVSZXBlYXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0ICsgKF9pc05vdEZhbHNlKGluY2x1ZGVSZXBlYXRzKSA/IHRoaXMudG90YWxEdXJhdGlvbigpIDogdGhpcy5kdXJhdGlvbigpKSAvIE1hdGguYWJzKHRoaXMuX3RzIHx8IDEpO1xuICB9O1xuXG4gIF9wcm90by5yYXdUaW1lID0gZnVuY3Rpb24gcmF3VGltZSh3cmFwUmVwZWF0cykge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzLl9kcDsgLy8gX2RwID0gZGV0YWNoZWQgcGFyZW50XG5cbiAgICByZXR1cm4gIXBhcmVudCA/IHRoaXMuX3RUaW1lIDogd3JhcFJlcGVhdHMgJiYgKCF0aGlzLl90cyB8fCB0aGlzLl9yZXBlYXQgJiYgdGhpcy5fdGltZSAmJiB0aGlzLnRvdGFsUHJvZ3Jlc3MoKSA8IDEpID8gdGhpcy5fdFRpbWUgJSAodGhpcy5fZHVyICsgdGhpcy5fckRlbGF5KSA6ICF0aGlzLl90cyA/IHRoaXMuX3RUaW1lIDogX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUocGFyZW50LnJhd1RpbWUod3JhcFJlcGVhdHMpLCB0aGlzKTtcbiAgfTtcblxuICBfcHJvdG8ucmV2ZXJ0ID0gZnVuY3Rpb24gcmV2ZXJ0KGNvbmZpZykge1xuICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkge1xuICAgICAgY29uZmlnID0gX3JldmVydENvbmZpZztcbiAgICB9XG5cbiAgICB2YXIgcHJldklzUmV2ZXJ0aW5nID0gX3JldmVydGluZztcbiAgICBfcmV2ZXJ0aW5nID0gY29uZmlnO1xuXG4gICAgaWYgKF9pc1JldmVydFdvcnRoeSh0aGlzKSkge1xuICAgICAgdGhpcy50aW1lbGluZSAmJiB0aGlzLnRpbWVsaW5lLnJldmVydChjb25maWcpO1xuICAgICAgdGhpcy50b3RhbFRpbWUoLTAuMDEsIGNvbmZpZy5zdXBwcmVzc0V2ZW50cyk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhICE9PSBcIm5lc3RlZFwiICYmIGNvbmZpZy5raWxsICE9PSBmYWxzZSAmJiB0aGlzLmtpbGwoKTtcbiAgICBfcmV2ZXJ0aW5nID0gcHJldklzUmV2ZXJ0aW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5nbG9iYWxUaW1lID0gZnVuY3Rpb24gZ2xvYmFsVGltZShyYXdUaW1lKSB7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMsXG4gICAgICAgIHRpbWUgPSBhcmd1bWVudHMubGVuZ3RoID8gcmF3VGltZSA6IGFuaW1hdGlvbi5yYXdUaW1lKCk7XG5cbiAgICB3aGlsZSAoYW5pbWF0aW9uKSB7XG4gICAgICB0aW1lID0gYW5pbWF0aW9uLl9zdGFydCArIHRpbWUgLyAoTWF0aC5hYnMoYW5pbWF0aW9uLl90cykgfHwgMSk7XG4gICAgICBhbmltYXRpb24gPSBhbmltYXRpb24uX2RwO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5wYXJlbnQgJiYgdGhpcy5fc2F0ID8gdGhpcy5fc2F0Lmdsb2JhbFRpbWUocmF3VGltZSkgOiB0aW1lOyAvLyB0aGUgX3N0YXJ0QXQgdHdlZW5zIGZvciAuZnJvbVRvKCkgYW5kIC5mcm9tKCkgdGhhdCBoYXZlIGltbWVkaWF0ZVJlbmRlciBzaG91bGQgYWx3YXlzIGJlIEZJUlNUIGluIHRoZSB0aW1lbGluZSAoaW1wb3J0YW50IGZvciBjb250ZXh0LnJldmVydCgpKS4gXCJfc2F0XCIgc3RhbmRzIGZvciBfc3RhcnRBdFR3ZWVuLCByZWZlcnJpbmcgdG8gdGhlIHBhcmVudCB0d2VlbiB0aGF0IGNyZWF0ZWQgdGhlIF9zdGFydEF0LiBXZSBtdXN0IGRpc2Nlcm4gaWYgdGhhdCB0d2VlbiBoYWQgaW1tZWRpYXRlUmVuZGVyIHNvIHRoYXQgd2UgY2FuIGtub3cgd2hldGhlciBvciBub3QgdG8gcHJpb3JpdGl6ZSBpdCBpbiByZXZlcnQoKS5cbiAgfTtcblxuICBfcHJvdG8ucmVwZWF0ID0gZnVuY3Rpb24gcmVwZWF0KHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3JlcGVhdCA9IHZhbHVlID09PSBJbmZpbml0eSA/IC0yIDogdmFsdWU7XG4gICAgICByZXR1cm4gX29uVXBkYXRlVG90YWxEdXJhdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwZWF0ID09PSAtMiA/IEluZmluaXR5IDogdGhpcy5fcmVwZWF0O1xuICB9O1xuXG4gIF9wcm90by5yZXBlYXREZWxheSA9IGZ1bmN0aW9uIHJlcGVhdERlbGF5KHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZhciB0aW1lID0gdGhpcy5fdGltZTtcbiAgICAgIHRoaXMuX3JEZWxheSA9IHZhbHVlO1xuXG4gICAgICBfb25VcGRhdGVUb3RhbER1cmF0aW9uKHRoaXMpO1xuXG4gICAgICByZXR1cm4gdGltZSA/IHRoaXMudGltZSh0aW1lKSA6IHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JEZWxheTtcbiAgfTtcblxuICBfcHJvdG8ueW95byA9IGZ1bmN0aW9uIHlveW8odmFsdWUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5feW95byA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3lveW87XG4gIH07XG5cbiAgX3Byb3RvLnNlZWsgPSBmdW5jdGlvbiBzZWVrKHBvc2l0aW9uLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIHJldHVybiB0aGlzLnRvdGFsVGltZShfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbiksIF9pc05vdEZhbHNlKHN1cHByZXNzRXZlbnRzKSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KGluY2x1ZGVEZWxheSwgc3VwcHJlc3NFdmVudHMpIHtcbiAgICB0aGlzLnBsYXkoKS50b3RhbFRpbWUoaW5jbHVkZURlbGF5ID8gLXRoaXMuX2RlbGF5IDogMCwgX2lzTm90RmFsc2Uoc3VwcHJlc3NFdmVudHMpKTtcbiAgICB0aGlzLl9kdXIgfHwgKHRoaXMuX3pUaW1lID0gLV90aW55TnVtKTsgLy8gZW5zdXJlcyBvbkNvbXBsZXRlIGZpcmVzIG9uIGEgemVyby1kdXJhdGlvbiBhbmltYXRpb24gdGhhdCBnZXRzIHJlc3RhcnRlZC5cblxuICAgI
12666HJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5wbGF5ID0gZnVuY3Rpb24gcGxheShmcm9tLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIGZyb20gIT0gbnVsbCAmJiB0aGlzLnNlZWsoZnJvbSwgc3VwcHJlc3NFdmVudHMpO1xuICAgIHJldHVybiB0aGlzLnJldmVyc2VkKGZhbHNlKS5wYXVzZWQoZmFsc2UpO1xuICB9O1xuXG4gIF9wcm90by5yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZShmcm9tLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIGZyb20gIT0gbnVsbCAmJiB0aGlzLnNlZWsoZnJvbSB8fCB0aGlzLnRvdGFsRHVyYXRpb24oKSwgc3VwcHJlc3NFdmVudHMpO1xuICAgIHJldHVybiB0aGlzLnJldmVyc2VkKHRydWUpLnBhdXNlZChmYWxzZSk7XG4gIH07XG5cbiAgX3Byb3RvLnBhdXNlID0gZnVuY3Rpb24gcGF1c2UoYXRUaW1lLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIGF0VGltZSAhPSBudWxsICYmIHRoaXMuc2VlayhhdFRpbWUsIHN1cHByZXNzRXZlbnRzKTtcbiAgICByZXR1cm4gdGhpcy5wYXVzZWQodHJ1ZSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlc3VtZSA9IGZ1bmN0aW9uIHJlc3VtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXVzZWQoZmFsc2UpO1xuICB9O1xuXG4gIF9wcm90by5yZXZlcnNlZCA9IGZ1bmN0aW9uIHJldmVyc2VkKHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICEhdmFsdWUgIT09IHRoaXMucmV2ZXJzZWQoKSAmJiB0aGlzLnRpbWVTY2FsZSgtdGhpcy5fcnRzIHx8ICh2YWx1ZSA/IC1fdGlueU51bSA6IDApKTsgLy8gaW4gY2FzZSB0aW1lU2NhbGUgaXMgemVybywgcmV2ZXJzaW5nIHdvdWxkIGhhdmUgbm8gZWZmZWN0IHNvIHdlIHVzZSBfdGlueU51bS5cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3J0cyA8IDA7XG4gIH07XG5cbiAgX3Byb3RvLmludmFsaWRhdGUgPSBmdW5jdGlvbiBpbnZhbGlkYXRlKCkge1xuICAgIHRoaXMuX2luaXR0ZWQgPSB0aGlzLl9hY3QgPSAwO1xuICAgIHRoaXMuX3pUaW1lID0gLV90aW55TnVtO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5pc0FjdGl2ZSA9IGZ1bmN0aW9uIGlzQWN0aXZlKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzLl9kcCxcbiAgICAgICAgc3RhcnQgPSB0aGlzLl9zdGFydCxcbiAgICAgICAgcmF3VGltZTtcbiAgICByZXR1cm4gISEoIXBhcmVudCB8fCB0aGlzLl90cyAmJiB0aGlzLl9pbml0dGVkICYmIHBhcmVudC5pc0FjdGl2ZSgpICYmIChyYXdUaW1lID0gcGFyZW50LnJhd1RpbWUodHJ1ZSkpID49IHN0YXJ0ICYmIHJhd1RpbWUgPCB0aGlzLmVuZFRpbWUodHJ1ZSkgLSBfdGlueU51bSk7XG4gIH07XG5cbiAgX3Byb3RvLmV2ZW50Q2FsbGJhY2sgPSBmdW5jdGlvbiBldmVudENhbGxiYWNrKHR5cGUsIGNhbGxiYWNrLCBwYXJhbXMpIHtcbiAgICB2YXIgdmFycyA9IHRoaXMudmFycztcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICBkZWxldGUgdmFyc1t0eXBlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNbdHlwZV0gPSBjYWxsYmFjaztcbiAgICAgICAgcGFyYW1zICYmICh2YXJzW3R5cGUgKyBcIlBhcmFtc1wiXSA9IHBhcmFtcyk7XG4gICAgICAgIHR5cGUgPT09IFwib25VcGRhdGVcIiAmJiAodGhpcy5fb25VcGRhdGUgPSBjYWxsYmFjayk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiB2YXJzW3R5cGVdO1xuICB9O1xuXG4gIF9wcm90by50aGVuID0gZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgcHJldlByb20gPSBzZWxmLl9wcm9tO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZS
12666hmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgdmFyIGYgPSBfaXNGdW5jdGlvbihvbkZ1bGZpbGxlZCkgPyBvbkZ1bGZpbGxlZCA6IF9wYXNzVGhyb3VnaCxcbiAgICAgICAgICBfcmVzb2x2ZSA9IGZ1bmN0aW9uIF9yZXNvbHZlKCkge1xuICAgICAgICB2YXIgX3RoZW4gPSBzZWxmLnRoZW47XG4gICAgICAgIHNlbGYudGhlbiA9IG51bGw7IC8vIHRlbXBvcmFyaWx5IG51bGwgdGhlIHRoZW4oKSBtZXRob2QgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmVlbnNvY2svR1NBUC9pc3N1ZXMvMzIyKVxuXG4gICAgICAgIHByZXZQcm9tICYmIHByZXZQcm9tKCk7XG4gICAgICAgIF9pc0Z1bmN0aW9uKGYpICYmIChmID0gZihzZWxmKSkgJiYgKGYudGhlbiB8fCBmID09PSBzZWxmKSAmJiAoc2VsZi50aGVuID0gX3RoZW4pO1xuICAgICAgICByZXNvbHZlKGYpO1xuICAgICAgICBzZWxmLnRoZW4gPSBfdGhlbjtcbiAgICAgIH07XG5cbiAgICAgIGlmIChzZWxmLl9pbml0dGVkICYmIHNlbGYudG90YWxQcm9ncmVzcygpID09PSAxICYmIHNlbGYuX3RzID49IDAgfHwgIXNlbGYuX3RUaW1lICYmIHNlbGYuX3RzIDwgMCkge1xuICAgICAgICBfcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5fcHJvbSA9IF9yZXNvbHZlO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5raWxsID0gZnVuY3Rpb24ga2lsbCgpIHtcbiAgICBfaW50ZXJydXB0KHRoaXMpO1xuICB9O1xuXG4gIHJldHVybiBBbmltYXRpb247XG59KCk7XG5cbl9zZXREZWZhdWx0cyhBbmltYXRpb24ucHJvdG90eXBlLCB7XG4gIF90aW1lOiAwLFxuICBfc3RhcnQ6IDAsXG4gIF9lbmQ6IDAsXG4gIF90VGltZTogMCxcbiAgX3REdXI6IDAsXG4gIF9kaXJ0eTogMCxcbiAgX3JlcGVhdDogMCxcbiAgX3lveW86IGZhbHNlLFxuICBwYXJlbnQ6IG51bGwsXG4gIF9pbml0dGVkOiBmYWxzZSxcbiAgX3JEZWxheTogMCxcbiAgX3RzOiAxLFxuICBfZHA6IDAsXG4gIHJhdGlvOiAwLFxuICBfelRpbWU6IC1fdGlueU51bSxcbiAgX3Byb206IDAsXG4gIF9wczogZmFsc2UsXG4gIF9ydHM6IDFcbn0pO1xuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFRJTUVMSU5FXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG5leHBvcnQgdmFyIFRpbWVsaW5lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5pbWF0aW9uKSB7XG4gIF9pbmhlcml0c0xvb3NlKFRpbWVsaW5lLCBfQW5pbWF0aW9uKTtcblxuICBmdW5jdGlvbiBUaW1lbGluZSh2YXJzLCBwb3NpdGlvbikge1xuICAgIHZhciBfdGhpcztcblxuICAgIGlmICh2YXJzID09PSB2b2lkIDApIHtcbiAgICAgIHZhcnMgPSB7fTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9BbmltYXRpb24uY2FsbCh0aGlzLCB2YXJzKSB8fCB0aGlzO1xuICAgIF90aGlzLmxhYmVscyA9IHt9O1xuICAgIF90aGlzLnNtb290aENoaWxkVGltaW5nID0gISF2YXJzLnNtb290aENoaWxkVGltaW5nO1xuICAgIF90aGlzLmF1dG9SZW1vdmVDaGlsZHJlbiA9ICEhdmFycy5hdXRvUmVtb3ZlQ2hpbGRyZW47XG4gICAgX3RoaXMuX3NvcnQgPSBfaXNOb3RGYWxzZSh2YXJzLnNvcnRDaGlsZHJlbik7XG4gICAgX2dsb2JhbFRpbWVsaW5lICYmIF9hZGRUb1RpbWVsaW5lKHZhcnMucGFyZW50IHx8IF9nbG9iYWxUaW1lbGluZSwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIHBvc2l0aW9uKTtcbiAgICB2YXJzLnJldmVyc2VkICYmIF90aGlzLnJldmVyc2UoKTtcbiAgICB2YXJzLnBhdXNlZCAmJiBfdGhpcy5wYXVzZWQodHJ1ZSk7XG4gICAgdmFycy5zY3JvbGxUcmlnZ2VyICYmIF9zY3JvbGxUcmlnZ2VyKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCB2YXJzLnNjcm9sbFRyaWdnZXIpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gVGltZWxpbmUucHJvdG90eXBlO1xuXG4gIF9wcm90bzIudG8gPSBmdW5jdGlvbiB0byh0YXJnZXRzLCB2YXJzLCBwb3NpdGlvbikge1xuICAgIF9jcmVhdGVUd2VlblR5cGUoMCwgYXJndW1lbnRzLCB0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuZnJvbSA9IGZ1bmN0aW9uIGZyb20odGFyZ2V0cywgdmFycywgcG9zaXRpb24pIHtcbiAgICBfY3JlYXRlVHdlZW5UeXBlKDEsIGFyZ3VtZW50cywgdGhpcyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8yLmZyb21UbyA9IGZ1bmN0aW9uIGZyb21Ubyh0YXJnZXRzLCBmcm9tVmFycywgdG9WYXJzLCBwb3NpdGlvbikge1xuICAgIF9jcmVhdGVUd2VlblR5cGUoMiwgYXJndW1lbnRzLCB0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuc2V0ID0gZnVuY3Rpb24gc2V0KHRhcmdldHMsIHZhcnMsIHBvc2l0aW9uKSB7XG4gICAgdmFycy5kdXJhdGlvbiA9IDA7XG4gICAgdmFycy5wYXJlbnQgPSB0aGlzO1xuICAgIF9pbmhlcml0RGVmYXVsdHModmFycykucmVwZWF0RGVsYXkgfHwgKHZhcnMucmVwZWF0ID0gMCk7XG4gICAgdmFycy5pbW1lZGlhdGVSZW5kZXIgPSAhIXZhcnMuaW1tZWRpYXRlUmVuZGVyO1xuICAgIG5ldyBUd2Vlbih0YXJnZXRzLCB2YXJzLCBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbiksIDEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuY2FsbCA9IGZ1bmN0aW9uIGNhbGwoY2FsbGJhY2ssIHBhcmFtcywgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gX2FkZFRvVGltZWxpbmUodGhpcywgVHdlZW4uZGVsYXllZENhbGwoMCwgY2FsbGJhY2ssIHBhcmFtcyksIHBvc2l0aW9uKTtcbiAgfSAvL09OTFkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkhIE1heWJlIGRlbGV0ZT9cbiAgO1xuXG4gIF9wcm90bzIuc3RhZ2dlclRvID0gZnVuY3Rpb24gc3RhZ2dlclRvKHRhcmdldHMsIGR1cmF0aW9uLCB2YXJzLCBzdGFnZ2VyLCBwb3NpdGlvbiwgb25Db21wbGV0ZUFsbCwgb25Db21wbGV0ZUFsbFBhcmFtcykge1xuICAgIHZhcnMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICB2YXJzLnN0YWdnZXIgPSB2YXJzLnN0YWdnZXIgfHwgc3RhZ2dlcjtcbiAgICB2YXJzLm9uQ29tcGxldGUgPSBvbkNvbXBsZXRlQWxsO1xuICAgIHZhcnMub25Db21wbGV0ZVBhcmFtcyA9IG9uQ29tcGxldGVBbGxQYXJhbXM7XG4gICAgdmFycy5wYXJlbnQgPSB0aGlzO1xuICAgIG5ldyBUd2Vlbih0YXJnZXRzLCB2YXJzLCBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbikpO1xuICAgIHJldHVybi
12666B0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuc3RhZ2dlckZyb20gPSBmdW5jdGlvbiBzdGFnZ2VyRnJvbSh0YXJnZXRzLCBkdXJhdGlvbiwgdmFycywgc3RhZ2dlciwgcG9zaXRpb24sIG9uQ29tcGxldGVBbGwsIG9uQ29tcGxldGVBbGxQYXJhbXMpIHtcbiAgICB2YXJzLnJ1bkJhY2t3YXJkcyA9IDE7XG4gICAgX2luaGVyaXREZWZhdWx0cyh2YXJzKS5pbW1lZGlhdGVSZW5kZXIgPSBfaXNOb3RGYWxzZSh2YXJzLmltbWVkaWF0ZVJlbmRlcik7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2dlclRvKHRhcmdldHMsIGR1cmF0aW9uLCB2YXJzLCBzdGFnZ2VyLCBwb3NpdGlvbiwgb25Db21wbGV0ZUFsbCwgb25Db21wbGV0ZUFsbFBhcmFtcyk7XG4gIH07XG5cbiAgX3Byb3RvMi5zdGFnZ2VyRnJvbVRvID0gZnVuY3Rpb24gc3RhZ2dlckZyb21Ubyh0YXJnZXRzLCBkdXJhdGlvbiwgZnJvbVZhcnMsIHRvVmFycywgc3RhZ2dlciwgcG9zaXRpb24sIG9uQ29tcGxldGVBbGwsIG9uQ29tcGxldGVBbGxQYXJhbXMpIHtcbiAgICB0b1ZhcnMuc3RhcnRBdCA9IGZyb21WYXJzO1xuICAgIF9pbmhlcml0RGVmYXVsdHModG9WYXJzKS5pbW1lZGlhdGVSZW5kZXIgPSBfaXNOb3RGYWxzZSh0b1ZhcnMuaW1tZWRpYXRlUmVuZGVyKTtcbiAgICByZXR1cm4gdGhpcy5zdGFnZ2VyVG8odGFyZ2V0cywgZHVyYXRpb24sIHRvVmFycywgc3RhZ2dlciwgcG9zaXRpb24sIG9uQ29tcGxldGVBbGwsIG9uQ29tcGxldGVBbGxQYXJhbXMpO1xuICB9O1xuXG4gIF9wcm90bzIucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKSB7XG4gICAgdmFyIHByZXZUaW1lID0gdGhpcy5fdGltZSxcbiAgICAgICAgdER1ciA9IHRoaXMuX2RpcnR5ID8gdGhpcy50b3RhbER1cmF0aW9uKCkgOiB0aGlzLl90RHVyLFxuICAgICAgICBkdXIgPSB0aGlzLl9kdXIsXG4gICAgICAgIHRUaW1lID0gdG90YWxUaW1lIDw9IDAgPyAwIDogX3JvdW5kUHJlY2lzZSh0b3RhbFRpbWUpLFxuICAgICAgICAvLyBpZiBhIHBhdXNlZCB0aW1lbGluZSBpcyByZXN1bWVkIChvciBpdHMgX3N0YXJ0IGlzIHVwZGF0ZWQgZm9yIGFub3RoZXIgcmVhc29uLi4ud2hpY2ggcm91bmRzIGl0KSwgdGhhdCBjb3VsZCByZXN1bHQgaW4gdGhlIHBsYXloZWFkIHNoaWZ0aW5nIGEgKip0aW55KiogYW1vdW50IGFuZCBhIHplcm8tZHVyYXRpb24gY2hpbGQgYXQgdGhhdCBzcG90IG1heSBnZXQgcmVuZGVyZWQgYXQgYSBkaWZmZXJlbnQgcmF0aW8sIGxpa2UgaXRzIHRvdGFsVGltZSBpbiByZW5kZXIoKSBtYXkgYmUgMWUtMTcgaW5zdGVhZCBvZiAwLCBmb3IgZXhhbXBsZS5cbiAgICBjcm9zc2luZ1N0YXJ0ID0gdGhpcy5felRpbWUgPCAwICE9PSB0b3RhbFRpbWUgPCAwICYmICh0aGlzLl9pbml0dGVkIHx8ICFkdXIpLFxuICAgICAgICB0aW1lLFxuICAgICAgICBjaGlsZCxcbiAgICAgICAgbmV4dCxcbiAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgICBjeWNsZUR1cmF0aW9uLFxuICAgICAgICBwcmV2UGF1c2VkLFxuICAgICAgICBwYXVzZVR3ZWVuLFxuICAgICAgICB0aW1lU2NhbGUsXG4gICAgICAgIHByZXZTdGFydCxcbiAgICAgICAgcHJldkl0ZXJhdGlvbixcbiAgICAgICAgeW95byxcbiAgICAgICAgaXNZb3lvO1xuICAgIHRoaXMgIT09IF9nbG9iYWxUaW1lbGluZSAmJiB0VGltZSA+IHREdXIgJiYgdG90YWxUaW1lID49IDAgJiYgKHRUaW1lID0gdER1cik7XG5cbiAgICBpZiAodFRpbWUgIT09IHRoaXMuX3RUaW1lIHx8IGZvcmNlIHx8IGNyb3NzaW5nU3RhcnQpIHtcbiAgICAgIGlmIChwcmV2VGltZSAhPT0gdGhpcy5fdGltZSAmJiBkdXIpIHtcbiAgICAgICAgLy9pZiB0b3RhbER1cmF0aW9uKCkgZmluZHMgYSBjaGlsZCB3aXRoIGEgbmVnYXRpdmUgc3RhcnRUaW1lIGFuZCBzbW9vdGhDaGlsZFRpbWluZyBpcyB0cnVlLCB0aGluZ3MgZ2V0IHNoaWZ0ZWQgYXJvdW5kIGludGVybmFsbHkgc28gd2UgbmVlZCB0byBhZGp1c3QgdGhlIHRpbWUgYWNjb3JkaW5nbHkuIEZvciBleGFtcGxlLCBpZiBhIHR3ZWVuIHN0YXJ0cyBhdCAtMzAgd2UgbXVzdCBzaGlmdCBFVkVSWVRISU5HIGZvcndhcmQgMzAgc2Vjb25kcyBhbmQgbW92ZSB0aGlzIHRpbWVsaW5lJ3Mgc3RhcnRUaW1lIGJhY2t3YXJkIGJ5IDMwIHNlY29uZHMgc28gdGhhdCB0aGluZ3MgYWxpZ24gd2l0aCB0aGUgcGxheWhlYWQgKG5vIGp1bXApLlxuICAgICAgICB0VGltZSArPSB0aGlzLl90aW1lIC0gcHJldlRpbW
12666U7XG4gICAgICAgIHRvdGFsVGltZSArPSB0aGlzLl90aW1lIC0gcHJldlRpbWU7XG4gICAgICB9XG5cbiAgICAgIHRpbWUgPSB0VGltZTtcbiAgICAgIHByZXZTdGFydCA9IHRoaXMuX3N0YXJ0O1xuICAgICAgdGltZVNjYWxlID0gdGhpcy5fdHM7XG4gICAgICBwcmV2UGF1c2VkID0gIXRpbWVTY2FsZTtcblxuICAgICAgaWYgKGNyb3NzaW5nU3RhcnQpIHtcbiAgICAgICAgZHVyIHx8IChwcmV2VGltZSA9IHRoaXMuX3pUaW1lKTsgLy93aGVuIHRoZSBwbGF5aGVhZCBhcnJpdmVzIGF0IEVYQUNUTFkgdGltZSAwIChyaWdodCBvbiB0b3ApIG9mIGEgemVyby1kdXJhdGlvbiB0aW1lbGluZSwgd2UgbmVlZCB0byBkaXNjZXJuIGlmIGV2ZW50cyBhcmUgc3VwcHJlc3NlZCBzbyB0aGF0IHdoZW4gdGhlIHBsYXloZWFkIG1vdmVzIGFnYWluIChuZXh0IHRpbWUpLCBpdCdsbCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4gSWYgZXZlbnRzIGFyZSBOT1Qgc3VwcHJlc3NlZCwgb2J2aW91c2x5IHRoZSBjYWxsYmFjayB3b3VsZCBiZSB0cmlnZ2VyZWQgaW4gdGhpcyByZW5kZXIuIEJhc2ljYWxseSwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlIGVpdGhlciB3aGVuIHRoZSBwbGF5aGVhZCBBUlJJVkVTIG9yIExFQVZFUyB0aGlzIGV4YWN0IHNwb3QsIG5vdCBib3RoLiBJbWFnaW5lIGRvaW5nIGEgdGltZWxpbmUuc2VlaygwKSBhbmQgdGhlcmUncyBhIGNhbGxiYWNrIHRoYXQgc2l0cyBhdCAwLiBTaW5jZSBldmVudHMgYXJlIHN1cHByZXNzZWQgb24gdGhhdCBzZWVrKCkgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGZpcmUsIGJ1dCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBvZmYgb2YgdGhhdCBwb3NpdGlvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlLiBUaGlzIGJlaGF2aW9yIGlzIHdoYXQgcGVvcGxlIGludHVpdGl2ZWx5IGV4cGVjdC5cblxuICAgICAgICAodG90YWxUaW1lIHx8ICFzdXBwcmVzc0V2ZW50cykgJiYgKHRoaXMuX3pUaW1lID0gdG90YWxUaW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3JlcGVhdCkge1xuICAgICAgICAvL2FkanVzdCB0aGUgdGltZSBmb3IgcmVwZWF0cyBhbmQgeW95b3NcbiAgICAgICAgeW95byA9IHRoaXMuX3lveW87XG4gICAgICAgIGN5Y2xlRHVyYXRpb24gPSBkdXIgKyB0aGlzLl9yRGVsYXk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JlcGVhdCA8IC0xICYmIHRvdGFsVGltZSA8IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50b3RhbFRpbWUoY3ljbGVEdXJhdGlvbiAqIDEwMCArIHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWUgPSBfcm91bmRQcmVjaXNlKHRUaW1lICUgY3ljbGVEdXJhdGlvbik7IC8vcm91bmQgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgZXJyb3JzLiAoNCAlIDAuOCBzaG91bGQgYmUgMCBidXQgc29tZSBicm93c2VycyByZXBvcnQgaXQgYXMgMC43OTk5OTk5OSEpXG5cbiAgICAgICAgaWYgKHRUaW1lID09PSB0RHVyKSB7XG4gICAgICAgICAgLy8gdGhlIHREdXIgPT09IHRUaW1lIGlzIGZvciBlZGdlIGNhc2VzIHdoZXJlIHRoZXJlJ3MgYSBsZW5ndGh5IGRlY2ltYWwgb24gdGhlIGR1cmF0aW9uIGFuZCBpdCBtYXkgcmVhY2ggdGhlIHZlcnkgZW5kIGJ1dCB0aGUgdGltZSBpcyByZW5kZXJlZCBhcyBub3QtcXVpdGUtdGhlcmUgKHJlbWVtYmVyLCB0RHVyIGlzIHJvdW5kZWQgdG8gNCBkZWNpbWFscyB3aGVyZWFzIGR1ciBpc24ndClcbiAgICAgICAgICBpdGVyYXRpb24gPSB0aGlzLl9yZXBlYXQ7XG4gICAgICAgICAgdGltZSA9IGR1cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2SXRlcmF0aW9uID0gX3JvdW5kUHJlY2lzZSh0VGltZSAvIGN5Y2xlRHVyYXRpb24pOyAvLyBmdWxsIGRlY2ltYWwgdmVyc2lvbiBvZiBpdGVyYXRpb25zLCBub3QgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiAod2UncmUgcmV1c2luZyBwcmV2SXRlcmF0aW9uIHZhcmlhYmxlIGZvciBlZmZpY2llbmN5KVxuXG4gICAgICAgICAgaXRlcmF0aW9uID0gfn5wcmV2SXRlcmF0aW9uO1xuXG4gICAgICAgICAgaWYgKGl0ZXJhdGlvbiAmJiBpdGVyYXRpb24gPT09IHByZXZJdGVyYXRpb24pIHtcbiAgICAgICAgICAgIHRpbWUgPSBkdXI7XG4gICAgICAgICAgICBpdGVyYXRpb24tLTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aW1lID4gZHVyICYmICh0aW1lID0gZHVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZJdGVyYXRpb24gPSBfYW5pbWF0aW9uQ3ljbGUodGhpcy5fdFRpbWUsIGN5Y2xlRHVyYXRpb24pO1xuICAgICAgICAhcHJldlRpbWUgJiYgdGhpcy5fdFRpbWUgJiYgcHJldkl0ZXJhdGlvbiAhPT0gaXRlcmF0aW9uICYmIHRoaXMuX3RUaW1lIC0gcHJldkl0ZXJhdGlvbiAqIGN5Y2xlRHVyYXRpb24gLSB0aGlzLl9kdXIgPD0gMCAmJiAocHJldkl0ZXJhdGlvbiA9IGl0ZXJhdGlvbik7IC8vIGVkZ2UgY2FzZSAtIGlmIHNvbWVvbmUgZG9lcyBhZGRQYXVzZSgpIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBhIHJlcGVhdGluZyB0aW1lbGluZSwgdGhhdCBwYXVzZSBpcyB0ZWNobmljYWxseSBhdCB0aGUgc2FtZSBzcG90IGFzIHRoZSBlbmQgd2hpY2ggY2F1c2VzIHRoaXMuX3RpbWUgdG8gZ2V0IHNldCB0byAwIHdoZW4gdGhlIHRvdGFsVGltZSB3b3VsZCBub3JtYWxseSBwbGFjZSB0aGUgcGxheWhlYWQgYXQgdGhlIGVuZC4gU2VlIGh0dHBzOi8vZ3NhcC5jb20vZm9ydW1zL3RvcGljLzIzODIzLWNsb3NpbmctbmF2LWFuaW1hdGlvbi1ub3Qtd29ya2luZy1vbi1pZS1hbmQtaXBob25lLTYtbWF5YmUtb3RoZXItb2xkZXItYnJvd3Nlci8/dGFiPWNvbW1lbnRzI2NvbW1lbnQtMTEzMDA1IGFsc28sIHRoaXMuX3RUaW1lIC0gcHJldkl0ZXJhdGlvbiAqIGN5Y2xlRHVyYXRpb24gLSB0aGlzLl9kdXIgPD0gMCBqdXN0IGNoZWNrcyB0byBtYWtlIHN1cmUgaXQgd2Fzbid0IHByZXZpb3VzbHkgaW4gdGhlIFwicmVwZWF0RGVsYXlcIiBwb3J0aW9uXG5cbiAgICAgICAgaWYgKHlveW8gJiYgaXRlcmF0aW9uICYgMSkge1xuICAgICAgICAgIHRpbWUgPSBkdXIgLSB0aW1lO1xuICAgICAgICAgIGlzWW95byA9IDE7XG4gICAgICAgI
12666H1cbiAgICAgICAgLypcbiAgICAgICAgbWFrZSBzdXJlIGNoaWxkcmVuIGF0IHRoZSBlbmQvYmVnaW5uaW5nIG9mIHRoZSB0aW1lbGluZSBhcmUgcmVuZGVyZWQgcHJvcGVybHkuIElmLCBmb3IgZXhhbXBsZSxcbiAgICAgICAgYSAzLXNlY29uZCBsb25nIHRpbWVsaW5lIHJlbmRlcmVkIGF0IDIuOSBzZWNvbmRzIHByZXZpb3VzbHksIGFuZCBub3cgcmVuZGVycyBhdCAzLjIgc2Vjb25kcyAod2hpY2hcbiAgICAgICAgd291bGQgZ2V0IHRyYW5zbGF0ZWQgdG8gMi44IHNlY29uZHMgaWYgdGhlIHRpbWVsaW5lIHlveW9zIG9yIDAuMiBzZWNvbmRzIGlmIGl0IGp1c3QgcmVwZWF0cyksIHRoZXJlXG4gICAgICAgIGNvdWxkIGJlIGEgY2FsbGJhY2sgb3IgYSBzaG9ydCB0d2VlbiB0aGF0J3MgYXQgMi45NSBvciAzIHNlY29uZHMgaW4gd2hpY2ggd291bGRuJ3QgcmVuZGVyLiBTb1xuICAgICAgICB3ZSBuZWVkIHRvIHB1c2ggdGhlIHRpbWVsaW5lIHRvIHRoZSBlbmQgKGFuZC9vciBiZWdpbm5pbmcgZGVwZW5kaW5nIG9uIGl0cyB5b3lvIHZhbHVlKS4gQWxzbyB3ZSBtdXN0XG4gICAgICAgIGVuc3VyZSB0aGF0IHplcm8tZHVyYXRpb24gdHdlZW5zIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIFRpbWVsaW5lIHdvcmsuXG4gICAgICAgICovXG5cblxuICAgICAgICBpZiAoaXRlcmF0aW9uICE9PSBwcmV2SXRlcmF0aW9uICYmICF0aGlzLl9sb2NrKSB7XG4gICAgICAgICAgdmFyIHJld2luZGluZyA9IHlveW8gJiYgcHJldkl0ZXJhdGlvbiAmIDEsXG4gICAgICAgICAgICAgIGRvZXNXcmFwID0gcmV3aW5kaW5nID09PSAoeW95byAmJiBpdGVyYXRpb24gJiAxKTtcbiAgICAgICAgICBpdGVyYXRpb24gPCBwcmV2SXRlcmF0aW9uICYmIChyZXdpbmRpbmcgPSAhcmV3aW5kaW5nKTtcbiAgICAgICAgICBwcmV2VGltZSA9IHJld2luZGluZyA/IDAgOiB0VGltZSAlIGR1ciA/IGR1ciA6IHRUaW1lOyAvLyBpZiB0aGUgcGxheWhlYWQgaXMgbGFuZGluZyBleGFjdGx5IGF0IHRoZSBlbmQgb2YgYW4gaXRlcmF0aW9uLCB1c2UgdGhhdCB0b3RhbFRpbWUgcmF0aGVyIHRoYW4gb25seSB0aGUgZHVyYXRpb24sIG90aGVyd2lzZSBpdCdsbCBza2lwIHRoZSAybmQgcmVuZGVyIHNpbmNlIGl0J3MgZWZmZWN0aXZlbHkgYXQgdGhlIHNhbWUgdGltZS5cblxuICAgICAgICAgIHRoaXMuX2xvY2sgPSAxO1xuICAgICAgICAgIHRoaXMucmVuZGVyKHByZXZUaW1lIHx8IChpc1lveW8gPyAwIDogX3JvdW5kUHJlY2lzZShpdGVyYXRpb24gKiBjeWNsZUR1cmF0aW9uKSksIHN1cHByZXNzRXZlbnRzLCAhZHVyKS5fbG9jayA9IDA7XG4gICAgICAgICAgdGhpcy5fdFRpbWUgPSB0VGltZTsgLy8gaWYgYSB1c2VyIGdldHMgdGhlIGl0ZXJhdGlvbigpIGluc2lkZSB0aGUgb25SZXBlYXQsIGZvciBleGFtcGxlLCBpdCBzaG91bGQgYmUgYWNjdXJhdGUuXG5cbiAgICAgICAgICAhc3VwcHJlc3NFdmVudHMgJiYgdGhpcy5wYXJlbnQgJiYgX2NhbGxiYWNrKHRoaXMsIFwib25SZXBlYXRcIik7XG5cbiAgICAgICAgICBpZiAodGhpcy52YXJzLnJlcGVhdFJlZnJlc2ggJiYgIWlzWW95bykge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCkuX2xvY2sgPSAxO1xuICAgICAgICAgICAgcHJldkl0ZXJhdGlvbiA9IGl0ZXJhdGlvbjsgLy8gb3RoZXJ3aXNlLCB0aGUgb25TdGFydCgpIG1heSBmaXJlIG9uIHRoZSAybmQgaXRlcmF0aW9uLlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcmV2VGltZSAmJiBwcmV2VGltZSAhPT0gdGhpcy5fdGltZSB8fCBwcmV2UGF1c2VkICE9PSAhdGhpcy5fdHMgfHwgdGhpcy52YXJzLm9uUmVwZWF0ICYmICF0aGlzLnBhcmVudCAmJiAhdGhpcy5fYWN0KSB7XG4gICAgICAgICAgICAvLyBpZiBwcmV2VGltZSBpcyAwIGFuZCB3ZSByZW5kZXIgYXQgdGhlIHZlcnkgZW5kLCBfdGltZSB3aWxsIGJlIHRoZSBlbmQsIHRodXMgd29uJ3QgbWF0Y2guIFNvIGluIHRoaXMgZWRnZSBjYXNlLCBwcmV2VGltZSB3b24ndCBtYXRjaCBfdGltZSBidXQgdGhhdCdzIG9rYXkuIElmIGl0IGdldHMga2lsbGVkIGluIHRoZSBvblJlcGVhdCwgZWplY3QgYXMgd2VsbC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGR1ciA9IHRoaXMuX2R1cjsgLy8gaW4gY2FzZSB0aGUgZHVyYXRpb24gY2hhbmdlZCBpbiB0aGUgb25SZXBlYXRcblxuICAgICAgICAgIHREdXIgPSB0aGlzLl90RHVyO1xuXG4gICAgICAgICAgaWYgKGRvZXNXcmFwKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NrID0gMjtcbiAgICAgICAgICAgIHByZXZUaW1lID0gcmV3aW5kaW5nID8gZHVyIDogLTAuMDAwMTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKHByZXZUaW1lLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMudmFycy5yZXBlYXRSZWZyZXNoICYmICFpc1lveW8gJiYgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fbG9jayA9IDA7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuX3RzICYmICFwcmV2UGF1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2hhc1BhdXNlICYmICF0aGlzLl9mb3JjaW5nICYmIHRoaXMuX2xvY2sgPCAyKSB7XG4gICAgICAgIHBhdXNlVHdlZW4gPSBfZmluZE5leHRQYXVzZVR3ZWVuKHRoaXMsIF9yb3VuZFByZWNpc2UocHJldlRpbWUpLCBfcm91bmRQcmVjaXNlKHRpbWUpKTtcblxuICAgICAgICBpZiAocGF1c2VUd2Vlbikge1xuICAgICAgICAgIHRUaW1lIC09IHRpbWUgLSAodGltZSA9IHBhdXNlVHdlZW4uX3N0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl90VGltZSA9IHRUaW1lO1xuICAgICAgdGhpcy5fdGltZSA9IHRpbWU7XG4gICAgICB0aGlzLl9hY3QgPSAhIXRpbWVTY2FsZTsgLy8gYXMgbG9uZyBhcyBpdCdzIG5vdCBwYXVzZWQsIGZvcmNlIGl0IHRvIGJlIGFjdGl2ZSBzbyB0aGF0IGlmIHRoZSB1c2VyIHJlbmRlcnMgaW5kZXBlbmRlbnQgb2YgdGhlIHBhcmVudCB0aW1lbGluZSwgaXQnbGwgYmUgZm9yY2VkIHRvIHJlLXJlbmRlciBvbiB0aGUgbmV4dCB0aWNrLlxuXG4gICAgICBpZiAoIXRoaXMuX2luaXR0ZWQpIHtcbiAgICAgICAgdGhpcy5fb25VcGRhdGUgPSB0aGlzLnZhcnMub25VcGRhdGU7XG4gICAgICAgI
12666HRoaXMuX2luaXR0ZWQgPSAxO1xuICAgICAgICB0aGlzLl96VGltZSA9IHRvdGFsVGltZTtcbiAgICAgICAgcHJldlRpbWUgPSAwOyAvLyB1cG9uIGluaXQsIHRoZSBwbGF5aGVhZCBzaG91bGQgYWx3YXlzIGdvIGZvcndhcmQ7IHNvbWVvbmUgY291bGQgaW52YWxpZGF0ZSgpIGEgY29tcGxldGVkIHRpbWVsaW5lIGFuZCB0aGVuIGlmIHRoZXkgcmVzdGFydCgpLCB0aGF0IHdvdWxkIG1ha2UgY2hpbGQgdHdlZW5zIHJlbmRlciBpbiByZXZlcnNlIG9yZGVyIHdoaWNoIGNvdWxkIGxvY2sgaW4gdGhlIHdyb25nIHN0YXJ0aW5nIHZhbHVlcyBpZiB0aGV5IGJ1aWxkIG9uIGVhY2ggb3RoZXIsIGxpa2UgdGwudG8ob2JqLCB7eDogMTAwfSkudG8ob2JqLCB7eDogMH0pLlxuICAgICAgfVxuXG4gICAgICBpZiAoIXByZXZUaW1lICYmIHRUaW1lICYmIGR1ciAmJiAhc3VwcHJlc3NFdmVudHMgJiYgIXByZXZJdGVyYXRpb24pIHtcbiAgICAgICAgX2NhbGxiYWNrKHRoaXMsIFwib25TdGFydFwiKTtcblxuICAgICAgICBpZiAodGhpcy5fdFRpbWUgIT09IHRUaW1lKSB7XG4gICAgICAgICAgLy8gaW4gY2FzZSB0aGUgb25TdGFydCB0cmlnZ2VyZWQgYSByZW5kZXIgYXQgYSBkaWZmZXJlbnQgc3BvdCwgZWplY3QuIExpa2UgaWYgc29tZW9uZSBkaWQgYW5pbWF0aW9uLnBhdXNlKDAuNSkgb3Igc29tZXRoaW5nIGluc2lkZSB0aGUgb25TdGFydC5cbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGltZSA+PSBwcmV2VGltZSAmJiB0b3RhbFRpbWUgPj0gMCkge1xuICAgICAgICBjaGlsZCA9IHRoaXMuX2ZpcnN0O1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICAgIG5leHQgPSBjaGlsZC5fbmV4dDtcblxuICAgICAgICAgIGlmICgoY2hpbGQuX2FjdCB8fCB0aW1lID49IGNoaWxkLl9zdGFydCkgJiYgY2hpbGQuX3RzICYmIHBhdXNlVHdlZW4gIT09IGNoaWxkKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ICE9PSB0aGlzKSB7XG4gICAgICAgICAgICAgIC8vIGFuIGV4dHJlbWUgZWRnZSBjYXNlIC0gdGhlIGNoaWxkJ3MgcmVuZGVyIGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIGtpbGwoKSB0aGUgXCJuZXh0XCIgb25lIGluIHRoZSBsaW5rZWQgbGlzdCwgb3IgcmVwYXJlbnQgaXQuIEluIHRoYXQgY2FzZSB3ZSBtdXN0IHJlLWluaXRpYXRlIHRoZSB3aG9sZSByZW5kZXIgdG8gYmUgc2FmZS5cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2hpbGQucmVuZGVyKGNoaWxkLl90cyA+IDAgPyAodGltZSAtIGNoaWxkLl9zdGFydCkgKiBjaGlsZC5fdHMgOiAoY2hpbGQuX2RpcnR5ID8gY2hpbGQudG90YWxEdXJhdGlvbigpIDogY2hpbGQuX3REdXIpICsgKHRpbWUgLSBjaGlsZC5fc3RhcnQpICogY2hpbGQuX3RzLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xuXG4gICAgICAgICAgICBpZiAodGltZSAhPT0gdGhpcy5fdGltZSB8fCAhdGhpcy5fdHMgJiYgIXByZXZQYXVzZWQpIHtcbiAgICAgICAgICAgICAgLy9pbiBjYXNlIGEgdHdlZW4gcGF1c2VzIG9yIHNlZWtzIHRoZSB0aW1lbGluZSB3aGVuIHJlbmRlcmluZywgbGlrZSBpbnNpZGUgb2YgYW4gb25VcGRhdGUvb25Db21wbGV0ZVxuICAgICAgICAgICAgICBwYXVzZVR3ZWVuID0gMDtcbiAgICAgICAgICAgICAgbmV4dCAmJiAodFRpbWUgKz0gdGhpcy5felRpbWUgPSAtX3RpbnlOdW0pOyAvLyBpdCBkaWRuJ3QgZmluaXNoIHJlbmRlcmluZywgc28gZmxhZyB6VGltZSBhcyBuZWdhdGl2ZSBzbyB0aGF0IHRoZSBuZXh0IHRpbWUgcmVuZGVyKCkgaXMgY2FsbGVkIGl0J2xsIGJlIGZvcmNlZCAodG8gcmVuZGVyIGFueSByZW1haW5pbmcgY2hpbGRyZW4pXG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hpbGQgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZCA9IHRoaXMuX2xhc3Q7XG4gICAgICAgIHZhciBhZGp1c3RlZFRpbWUgPSB0b3RhbFRpbWUgPCAwID8gdG90YWxUaW1lIDogdGltZTsgLy93aGVuIHRoZSBwbGF5aGVhZCBnb2VzIGJhY2t3YXJkIGJleW9uZCB0aGUgc3RhcnQgb2YgdGhpcyB0aW1lbGluZSwgd2UgbXVzdCBwYXNzIHRoYXQgaW5mb3JtYXRpb24gZG93biB0byB0aGUgY2hpbGQgYW5pbWF0aW9ucyBzbyB0aGF0IHplcm8tZHVyYXRpb24gdHdlZW5zIGtub3cgd2hldGhlciB0byByZW5kZXIgdGhlaXIgc3RhcnRpbmcgb3IgZW5kaW5nIHZhbHVlcy5cblxuICAgICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgICBuZXh0ID0gY2hpbGQuX3ByZXY7XG5cbiAgICAgICAgICBpZiAoKGNoaWxkLl9hY3QgfHwgYWRqdXN0ZWRUaW1lIDw9IGNoaWxkLl9lbmQpICYmIGNoaWxkLl90cyAmJiBwYXVzZVR3ZWVuICE9PSBjaGlsZCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkLnBhcmVudCAhPT0gdGhpcykge1xuICAgICAgICAgICAgICAvLyBhbiBleHRyZW1lIGVkZ2UgY2FzZSAtIHRoZSBjaGlsZCdzIHJlbmRlciBjb3VsZCBkbyBzb21ldGhpbmcgbGlrZSBraWxsKCkgdGhlIFwibmV4dFwiIG9uZSBpbiB0aGUgbGlua2VkIGxpc3QsIG9yIHJlcGFyZW50IGl0LiBJbiB0aGF0IGNhc2Ugd2UgbXVzdCByZS1pbml0aWF0ZSB0aGUgd2hvbGUgcmVuZGVyIHRvIGJlIHNhZmUuXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlcih0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoaWxkLnJlbmRlcihjaGlsZC5fdHMgPiAwID8gKGFkanVzdGVkVGltZSAtIGNoaWxkLl9zdGFydCkgKiBjaGlsZC5fdHMgOiAoY2hpbGQuX2RpcnR5ID8gY2hpbGQudG90YWxEdXJhdGlvbigpIDogY2hpbGQuX3REdXIpICsgKGFkanVzdGVkVGltZSAtIGNoaWxkLl9zdGFydCkgKiBjaGlsZC5fdHMsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSB8fCBfcmV2ZXJ0aW5nICYmIF9pc1JldmVydFdvcnRoeShjaGlsZCkpOyAvLyBpZiByZX
12666ZlcnRpbmcsIHdlIHNob3VsZCBhbHdheXMgZm9yY2UgcmVuZGVycyBvZiBpbml0dGVkIHR3ZWVucyAoYnV0IHJlbWVtYmVyIHRoYXQgLmZyb21UbygpIG9yIC5mcm9tKCkgbWF5IGhhdmUgYSBfc3RhcnRBdCBidXQgbm90IF9pbml0dGVkIHlldCkuIElmLCBmb3IgZXhhbXBsZSwgYSAuZnJvbVRvKCkgdHdlZW4gd2l0aCBhIHN0YWdnZXIgKHdoaWNoIGNyZWF0ZXMgYW4gaW50ZXJuYWwgdGltZWxpbmUpIGdldHMgcmV2ZXJ0ZWQgQkVGT1JFIHNvbWUgb2YgaXRzIGNoaWxkIHR3ZWVucyByZW5kZXIgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCBtYXkgbm90IHByb3Blcmx5IHRyaWdnZXIgdGhlbSB0byByZXZlcnQuXG5cbiAgICAgICAgICAgIGlmICh0aW1lICE9PSB0aGlzLl90aW1lIHx8ICF0aGlzLl90cyAmJiAhcHJldlBhdXNlZCkge1xuICAgICAgICAgICAgICAvL2luIGNhc2UgYSB0d2VlbiBwYXVzZXMgb3Igc2Vla3MgdGhlIHRpbWVsaW5lIHdoZW4gcmVuZGVyaW5nLCBsaWtlIGluc2lkZSBvZiBhbiBvblVwZGF0ZS9vbkNvbXBsZXRlXG4gICAgICAgICAgICAgIHBhdXNlVHdlZW4gPSAwO1xuICAgICAgICAgICAgICBuZXh0ICYmICh0VGltZSArPSB0aGlzLl96VGltZSA9IGFkanVzdGVkVGltZSA/IC1fdGlueU51bSA6IF90aW55TnVtKTsgLy8gaXQgZGlkbid0IGZpbmlzaCByZW5kZXJpbmcsIHNvIGFkanVzdCB6VGltZSBzbyB0aGF0IHNvIHRoYXQgdGhlIG5leHQgdGltZSByZW5kZXIoKSBpcyBjYWxsZWQgaXQnbGwgYmUgZm9yY2VkICh0byByZW5kZXIgYW55IHJlbWFpbmluZyBjaGlsZHJlbilcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGlsZCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBhdXNlVHdlZW4gJiYgIXN1cHByZXNzRXZlbnRzKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgICAgcGF1c2VUd2Vlbi5yZW5kZXIodGltZSA+PSBwcmV2VGltZSA/IDAgOiAtX3RpbnlOdW0pLl96VGltZSA9IHRpbWUgPj0gcHJldlRpbW
12666UgPyAxIDogLTE7XG5cbiAgICAgICAgaWYgKHRoaXMuX3RzKSB7XG4gICAgICAgICAgLy90aGUgY2FsbGJhY2sgcmVzdW1lZCBwbGF5YmFjayEgU28gc2luY2Ugd2UgbWF5IGhhdmUgaGVsZCBiYWNrIHRoZSBwbGF5aGVhZCBkdWUgdG8gd2hlcmUgdGhlIHBhdXNlIGlzIHBvc2l0aW9uZWQsIGdvIGFoZWFkIGFuZCBqdW1wIHRvIHdoZXJlIGl0J3MgU1VQUE9TRUQgdG8gYmUgKGlmIG5vIHBhdXNlIGhhcHBlbmVkKS5cbiAgICAgICAgICB0aGlzLl9zdGFydCA9IHByZXZTdGFydDsgLy9pZiB0aGUgcGF1c2Ugd2FzIGF0IGFuIGVhcmxpZXIgdGltZSBhbmQgdGhlIHVzZXIgcmVzdW1lZCBpbiB0aGUgY2FsbGJhY2ssIGl0IGNvdWxkIHJlcG9zaXRpb24gdGhlIHRpbWVsaW5lIChjaGFuZ2luZyBpdHMgc3RhcnRUaW1lKSwgdGhyb3dpbmcgdGhpbmdzIG9mZiBzbGlnaHRseSwgc28gd2UgbWFrZSBzdXJlIHRoZSBfc3RhcnQgZG9lc24ndCBzaGlmdC5cblxuICAgICAgICAgIF9zZXRFbmQodGhpcyk7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIodG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uVXBkYXRlICYmICFzdXBwcmVzc0V2ZW50cyAmJiBfY2FsbGJhY2sodGhpcywgXCJvblVwZGF0ZVwiLCB0cnVlKTtcbiAgICAgIGlmICh0VGltZSA9PT0gdER1ciAmJiB0aGlzLl90VGltZSA+PSB0aGlzLnRvdGFsRHVyYXRpb24oKSB8fCAhdFRpbWUgJiYgcHJldlRpbWUpIGlmIChwcmV2U3RhcnQgPT09IHRoaXMuX3N0YXJ0IHx8IE1hdGguYWJzKHRpbWVTY2FsZSkgIT09IE1hdGguYWJzKHRoaXMuX3RzKSkgaWYgKCF0aGlzLl9sb2NrKSB7XG4gICAgICAgIC8vIHJlbWVtYmVyLCBhIGNoaWxkJ3MgY2FsbGJhY2sgbWF5IGFsdGVyIHRoaXMgdGltZWxpbmUncyBwbGF5aGVhZCBvciB0aW1lU2NhbGUgd2hpY2ggaXMgd2h5IHdlIG5lZWQgdG8gYWRkIHNvbWUgb2YgdGhlc2UgY2hlY2tzLlxuICAgICAgICAodG90YWxUaW1lIHx8ICFkdXIpICYmICh0VGltZSA9PT0gdER1ciAmJiB0aGlzLl90cyA+IDAgfHwgIXRUaW1lICYmIHRoaXMuX3RzIDwgMCkgJiYgX3JlbW92ZUZyb21QYXJlbnQodGhpcywgMSk7IC8vIGRvbid0IHJlbW92ZSBpZiB0aGUgdGltZWxpbmUgaXMgcmV2ZXJzZWQgYW5kIHRoZSBwbGF5aGVhZCBpc24ndCBhdCAwLCBvdGhlcndpc2UgdGwucHJvZ3Jlc3MoMSkucmV2ZXJzZSgpIHdvbid0IHdvcmsuIE9ubHkgcmVtb3ZlIGlmIHRoZSBwbGF5aGVhZCBpcyBhdCB0aGUgZW5kIGFuZCB0aW1lU2NhbGUgaXMgcG9zaXRpdmUsIG9yIGlmIHRoZSBwbGF5aGVhZCBpcyBhdCAwIGFuZCB0aGUgdGltZVNjYWxlIGlzIG5lZ2F0aXZlLlxuXG4gICAgICAgIGlmICghc3VwcHJlc3NFdmVudHMgJiYgISh0b3RhbFRpbWUgPCAwICYmICFwcmV2VGltZSkgJiYgKHRUaW1lIHx8IHByZXZUaW1lIHx8ICF0RHVyKSkge1xuICAgICAgICAgIF9jYWxsYmFjayh0aGlzLCB0VGltZSA9PT0gdER1ciAmJiB0b3RhbFRpbWUgPj0gMCA/IFwib25Db21wbGV0ZVwiIDogXCJvblJldmVyc2VDb21wbGV0ZVwiLCB0cnVlKTtcblxuICAgICAgICAgIHRoaXMuX3Byb20gJiYgISh0VGltZSA8IHREdXIgJiYgdGhpcy50aW1lU2NhbGUoKSA+IDApICYmIHRoaXMuX3Byb20oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuYWRkID0gZnVuY3Rpb24gYWRkKGNoaWxkLCBwb3NpdGlvbikge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgX2lzTnVtYmVyKHBvc2l0aW9uKSB8fCAocG9zaXRpb24gPSBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbiwgY2hpbGQpKTtcblxuICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgQW5pbWF0aW9uKSkge1xuICAgICAgaWYgKF9pc0FycmF5KGNoaWxkKSkge1xuICAgICAgICBjaGlsZC5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLmFkZChvYmosIHBvc2l0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2lzU3RyaW5nKGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRMYWJlbChjaGlsZCwgcG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2lzRnVuY3Rpb24oY2hpbGQpKSB7XG4gICAgICAgIGNoaWxkID0gVHdlZW4uZGVsYXllZENhbGwoMCwgY2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMgIT09IGNoaWxkID8gX2FkZFRvVGltZWxpbmUodGhpcywgY2hpbGQsIHBvc2l0aW9uKSA6IHRoaXM7IC8vZG9uJ3QgYWxsb3cgYSB0aW1lbGluZSB0byBiZSBhZGRlZCB0byBpdHNlbGYgYXMgYSBjaGlsZCFcbiAgfTtcblxuICBfcHJvdG8yLmdldENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obmVzdGVkLCB0d2VlbnMsIHRpbWVsaW5lcywgaWdub3JlQmVmb3JlVGltZSkge1xuICAgIGlmIChuZXN0ZWQgPT09IHZvaWQgMCkge1xuICAgICAgbmVzdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHdlZW5zID09PSB2b2lkIDApIHtcbiAgICAgIHR3ZWVucyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRpbWVsaW5lcyA9PT0gdm9pZCAwKSB7XG4gICAgICB0aW1lbGluZXMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpZ25vcmVCZWZvcmVUaW1lID09PSB2b2lkIDApIHtcbiAgICAgIGlnbm9yZUJlZm9yZVRpbWUgPSAtX2JpZ051bTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IFtdLFxuICAgICAgICBjaGlsZCA9IHRoaXMuX2ZpcnN0O1xuXG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuX3N0YXJ0ID49IGlnbm9yZUJlZm9yZVRpbWUpIHtcbiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVHdlZW4pIHtcbiAgICAgICAgICB0d2VlbnMgJiYgYS5wdXNoKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aW1lbGluZXMgJiYgYS5wdXNoKGNoaWxkKTtcbiAgICAgICAgICBuZXN0ZWQgJiYgYS5wdXNoLmFwcGx5KGEsIGNoaWxkLmdldENoaWxkcmVuKHRydWUsIHR3ZWVucywgdGltZWxpbmVzKSk7XG4gICAgICAgI
12666H1cbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcblxuICBfcHJvdG8yLmdldEJ5SWQgPSBmdW5jdGlvbiBnZXRCeUlkKGlkKSB7XG4gICAgdmFyIGFuaW1hdGlvbnMgPSB0aGlzLmdldENoaWxkcmVuKDEsIDEsIDEpLFxuICAgICAgICBpID0gYW5pbWF0aW9ucy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZiAoYW5pbWF0aW9uc1tpXS52YXJzLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gYW5pbWF0aW9uc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvMi5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoY2hpbGQpIHtcbiAgICBpZiAoX2lzU3RyaW5nKGNoaWxkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlTGFiZWwoY2hpbGQpO1xuICAgIH1cblxuICAgIGlmIChfaXNGdW5jdGlvbihjaGlsZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmtpbGxUd2VlbnNPZihjaGlsZCk7XG4gICAgfVxuXG4gICAgY2hpbGQucGFyZW50ID09PSB0aGlzICYmIF9yZW1vdmVMaW5rZWRMaXN0SXRlbSh0aGlzLCBjaGlsZCk7XG5cbiAgICBpZiAoY2hpbGQgPT09IHRoaXMuX3JlY2VudCkge1xuICAgICAgdGhpcy5fcmVjZW50ID0gdGhpcy5fbGFzdDtcbiAgICB9XG5cbiAgICByZXR1cm4gX3VuY2FjaGUodGhpcyk7XG4gIH07XG5cbiAgX3Byb3RvMi50b3RhbFRpbWUgPSBmdW5jdGlvbiB0b3RhbFRpbWUoX3RvdGFsVGltZTIsIHN1cHByZXNzRXZlbnRzKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdFRpbWU7XG4gICAgfVxuXG4gICAgdGhpcy5fZm9yY2luZyA9IDE7XG5cbiAgICBpZiAoIXRoaXMuX2RwICYmIHRoaXMuX3RzKSB7XG4gICAgICAvL3NwZWNpYWwgY2FzZSBmb3IgdGhlIGdsb2JhbCB0aW1lbGluZSAob3IgYW55IG90aGVyIHRoYXQgaGFzIG5vIHBhcmVudCBvciBkZXRhY2hlZCBwYXJlbnQpLlxuICAgICAgdGhpcy5fc3RhcnQgPSBfcm91bmRQcmVjaXNlKF90aWNrZXIudGltZSAtICh0aGlzLl90cyA+IDAgPyBfdG90YWxUaW1lMiAvIHRoaXMuX3RzIDogKHRoaXMudG90YWxEdXJhdGlvbigpIC0gX3RvdGFsVGltZTIpIC8gLXRoaXMuX3RzKSk7XG4gICAgfVxuXG4gICAgX0FuaW1hdGlvbi5wcm90b3R5cGUudG90YWxUaW1lLmNhbGwodGhpcywgX3RvdGFsVGltZTIsIHN1cHByZXNzRXZlbnRzKTtcblxuICAgIHRoaXMuX2ZvcmNpbmcgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuYWRkTGFiZWwgPSBmdW5jdGlvbiBhZGRMYWJlbChsYWJlbCwgcG9zaXRpb24pIHtcbiAgICB0aGlzLmxhYmVsc1tsYWJlbF0gPSBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvMi5yZW1vdmVMYWJlbCA9IGZ1bmN0aW9uIHJlbW92ZUxhYmVsKGxhYmVsKSB7XG4gICAgZGVsZXRlIHRoaXMubGFiZWxzW2xhYmVsXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8yLmFkZFBhdXNlID0gZnVuY3Rpb24gYWRkUGF1c2UocG9zaXRpb24sIGNhbGxiYWNrLCBwYXJhbXMpIHtcbiAgICB2YXIgdCA9IFR3ZWVuLmRlbGF5ZWRDYWxsKDAsIGNhbGxiYWNrIHx8IF9lbXB0eUZ1bmMsIHBhcmFtcyk7XG4gICAgdC5kYXRhID0gXCJpc1BhdXNlXCI7XG4gICAgdGhpcy5faGFzUGF1c2UgPSAxO1xuICAgIHJldHVybiBfYWRkVG9UaW1lbGluZSh0aGlzLCB0LCBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbikpO1xuICB9O1xuXG4gIF9wcm90bzIucmVtb3ZlUGF1c2UgPSBmdW5jdGlvbiByZW1vdmVQYXVzZShwb3NpdGlvbikge1xuICAgIHZhciBjaGlsZCA9IHRoaXMuX2ZpcnN0O1xuICAgIHBvc2l0aW9uID0gX3BhcnNlUG9zaXRpb24odGhpcywgcG9zaXRpb24pO1xuXG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuX3N0YXJ0ID09PSBwb3NpdGlvbiAmJiBjaGlsZC5kYXRhID09PSBcImlzUGF1c2VcIikge1xuICAgICAgICBfcmVtb3ZlRnJvbVBhcmVudChjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuX25leHQ7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzIua2lsbFR3ZWVuc09mID0gZnVuY3Rpb24ga2lsbFR3ZWVuc09mKHRhcmdldHMsIHByb3BzLCBvbmx5QWN0aXZlKSB7XG4gICAgdmFyIHR3ZWVucyA9IHRoaXMuZ2V0VHdlZW5zT2YodGFyZ2V0cywgb25seUFjdGl2ZSksXG4gICAgICAgIGkgPSB0d2VlbnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgX292ZXJ3cml0aW5nVHdlZW4gIT09IHR3ZWVuc1tpXSAmJiB0d2VlbnNbaV0ua2lsbCh0YXJnZXRzLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvMi5nZXRUd2VlbnNPZiA9IGZ1bmN0aW9uIGdldFR3ZWVuc09mKHRhcmdldHMsIG9ubHlBY3RpdmUpIHtcbiAgICB2YXIgYSA9IFtdLFxuICAgICAgICBwYXJzZWRUYXJnZXRzID0gdG9BcnJheSh0YXJnZXRzKSxcbiAgICAgICAgY2hpbGQgPSB0aGlzLl9maXJzdCxcbiAgICAgICAgaXNHbG9iYWxUaW1lID0gX2lzTnVtYmVyKG9ubHlBY3RpdmUpLFxuICAgICAgICAvLyBhIG51bWJlciBpcyBpbnRlcnByZXRlZCBhcyBhIGdsb2JhbCB0aW1lLiBJZiB0aGUgYW5pbWF0aW9uIHNwYW5zXG4gICAgY2hpbGRyZW47XG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFR3ZWVuKSB7XG4gICAgICAgIGlmIChfYXJyYXlDb250YWluc0FueShjaGlsZC5fdGFyZ2V0cywgcGFyc2VkVGFyZ2V0cykgJiYgKGlzR2xvYmFsVGltZSA/ICghX292ZXJ3cml0aW5nVHdlZW4gfHwgY2hpbGQuX2luaXR0ZWQgJiYgY2hpbGQuX3RzKSAmJiBjaGlsZC5nbG9iYWxUaW1lKDApIDw9IG9ubHlBY3RpdmUgJiYgY2hpbGQuZ2xvYmFsVGltZShjaGlsZC50b3RhbER1cmF0aW9uKCkpID4gb25seUFjdGl2ZSA6ICFvbmx5QWN0aXZlIHx8IGNoaWxkLmlzQWN0aXZlKCkpKSB7XG4gICAgICAgICAgLy8gbm90ZTogaWYgdGhpcyBpcyBmb3Igb3ZlcndyaXRpbmcsIGl0IHNob3VsZCBvbmx5IGJlIGZvciB0d2VlbnMgdGhhdCBhcmVuJ3QgcGF1c2VkIGFuZCBhcmUgaW5pdHRlZC5cbiAgICAgICAgICBhLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChjaGlsZHJlbiA9IGNoaWxkLmdldFR3ZWVuc09mKHBhcnNlZFRhcmdldHMsIG9ubHlBY3RpdmUpKS5sZW5ndGgpIHtcbiAgICAgICAgYS5wdXNoLmFwcGx5KGEsIGNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfSAvLyBwb3RlbnRpYWwgZnV0dXJlIGZlYXR1cmUgLSB0YXJnZXRzKCkgb24gdGltZWxpbmVzXG4gIC8vIHRhcmdldHMoKSB7XG4gIC8vIFx0bGV0IHJlc3VsdCA9IFtdO1xuICAvLyBcdHRoaXMuZ2V0Q2hpbGRyZW4odHJ1ZSwgdHJ1ZSwgZmFsc2UpLmZvckVhY2godCA9PiByZXN1bHQucHVzaCguLi50LnRhcmdldHMoKSkpO1xuICAvLyBcdHJldHVybi
12666ByZXN1bHQuZmlsdGVyKCh2LCBpKSA9PiByZXN1bHQuaW5kZXhPZih2KSA9PT0gaSk7XG4gIC8vIH1cbiAgO1xuXG4gIF9wcm90bzIudHdlZW5UbyA9IGZ1bmN0aW9uIHR3ZWVuVG8ocG9zaXRpb24sIHZhcnMpIHtcbiAgICB2YXJzID0gdmFycyB8fCB7fTtcblxuICAgIHZhciB0bCA9IHRoaXMsXG4gICAgICAgIGVuZFRpbWUgPSBfcGFyc2VQb3NpdGlvbih0bCwgcG9zaXRpb24pLFxuICAgICAgICBfdmFycyA9IHZhcnMsXG4gICAgICAgIHN0YXJ0QXQgPSBfdmFycy5zdGFydEF0LFxuICAgICAgICBfb25TdGFydCA9IF92YXJzLm9uU3RhcnQsXG4gICAgICAgIG9uU3RhcnRQYXJhbXMgPSBfdmFycy5vblN0YXJ0UGFyYW1zLFxuICAgICAgICBpbW1lZGlhdGVSZW5kZXIgPSBfdmFycy5pbW1lZGlhdGVSZW5kZXIsXG4gICAgICAgIGluaXR0ZWQsXG4gICAgICAgIHR3ZWVuID0gVHdlZW4udG8odGwsIF9zZXREZWZhdWx0cyh7XG4gICAgICBlYXNlOiB2YXJzLmVhc2UgfHwgXCJub25lXCIsXG4gICAgICBsYXp5OiBmYWxzZSxcbiAgICAgIGltbWVkaWF0ZVJlbmRlcjogZmFsc2UsXG4gICAgICB0aW1lOiBlbmRUaW1lLFxuICAgICAgb3ZlcndyaXRlOiBcImF1dG9cIixcbiAgICAgIGR1cmF0aW9uOiB2YXJzLmR1cmF0aW9uIHx8IE1hdGguYWJzKChlbmRUaW1lIC0gKHN0YXJ0QXQgJiYgXCJ0aW1lXCIgaW4gc3RhcnRBdCA/IHN0YXJ0QXQudGltZSA6IHRsLl90aW1lKSkgLyB0bC50aW1lU2NhbGUoKSkgfHwgX3RpbnlOdW0sXG4gICAgICBvblN0YXJ0OiBmdW5jdGlvbiBvblN0YXJ0KCkge1xuICAgICAgICB0bC5wYXVzZSgpO1xuXG4gICAgICAgIGlmICghaW5pdHRlZCkge1xuICAgICAgICAgIHZhciBkdXJhdGlvbiA9IHZhcnMuZHVyYXRpb24gfHwgTWF0aC5hYnMoKGVuZFRpbWUgLSAoc3RhcnRBdCAmJiBcInRpbWVcIiBpbiBzdGFydEF0ID8gc3RhcnRBdC50aW1lIDogdGwuX3RpbWUpKSAvIHRsLnRpbWVTY2FsZSgpKTtcbiAgICAgICAgICB0d2Vlbi5fZHVyICE9PSBkdXJhdGlvbiAmJiBfc2V0RHVyYXRpb24odHdlZW4sIGR1cmF0aW9uLCAwLCAxKS5yZW5kZXIodHdlZW4uX3RpbWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgIGluaXR0ZWQgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgX29uU3RhcnQgJiYgX29uU3RhcnQuYXBwbHkodHdlZW4sIG9uU3RhcnRQYXJhbXMgfHwgW10pOyAvL2luIGNhc2UgdGhlIHVzZXIgaGFkIGFuIG9uU3RhcnQgaW4gdGhlIHZhcnMgLSB3ZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSBpdC5cbiAgICAgIH1cbiAgICB9LCB2YXJzKSk7XG5cbiAgICByZXR1cm4gaW1tZWRpYXRlUmVuZGVyID8gdHdlZW4ucmVuZGVyKDApIDogdHdlZW47XG4gIH07XG5cbiAgX3Byb3RvMi50d2VlbkZyb21UbyA9IGZ1bmN0aW9uIHR3ZWVuRnJvbVRvKGZyb21Qb3NpdGlvbiwgdG9Qb3NpdGlvbiwgdmFycykge1xuICAgIHJldHVybiB0aGlzLnR3ZWVuVG8odG9Qb3NpdGlvbiwgX3NldERlZmF1bHRzKHtcbiAgICAgIHN0YXJ0QXQ6IHtcbiAgICAgICAgdGltZTogX3BhcnNlUG9zaXRpb24odGhpcywgZnJvbVBvc2l0aW9uKVxuICAgICAgfVxuICAgIH0sIHZhcnMpKTtcbiAgfTtcblxuICBfcHJvdG8yLnJlY2VudCA9IGZ1bmN0aW9uIHJlY2VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjZW50O1xuICB9O1xuXG4gIF9wcm90bzIubmV4dExhYmVsID0gZnVuY3Rpb24gbmV4dExhYmVsKGFmdGVyVGltZSkge1xuICAgIGlmIChhZnRlclRpbWUgPT09IHZvaWQgMCkge1xuICAgICAgYWZ0ZXJUaW1lID0gdGhpcy5fdGltZTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2dldExhYmVsSW5EaXJlY3Rpb24odGhpcywgX3BhcnNlUG9zaXRpb24odGhpcywgYWZ0ZXJUaW1lKSk7XG4gIH07XG5cbiAgX3Byb3RvMi5wcmV2aW91c0xhYmVsID0gZnVuY3Rpb24gcHJldmlvdXNMYWJlbChiZWZvcmVUaW1lKSB7XG4gICAgaWYgKGJlZm9yZVRpbWUgPT09IHZvaWQgMCkge1xuICAgICAgYmVmb3JlVGltZSA9IHRoaXMuX3RpbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9nZXRMYWJlbEluRGlyZWN0aW9uKHRoaXMsIF9wYXJzZVBvc2l0aW9uKHRoaXMsIGJlZm9yZVRpbWUpLCAxKTtcbiAgfTtcblxuICBfcHJvdG8yLmN1cnJlbnRMYWJlbCA9IGZ1bmN0aW9uIGN1cnJlbnRMYWJlbCh2YWx1ZSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy5zZWVrKHZhbHVlLCB0cnVlKSA6IHRoaXMucHJldmlvdXNMYWJlbCh0aGlzLl90aW1lICsgX3RpbnlOdW0pO1xuICB9O1xuXG4gIF9wcm90bzIuc2hpZnRDaGlsZHJlbiA9IGZ1bmN0aW9uIHNoaWZ0Q2hpbGRyZW4oYW1vdW50LCBhZGp1c3RMYWJlbHMsIGlnbm9yZUJlZm9yZVRpbWUpIHtcbiAgICBpZiAoaWdub3JlQmVmb3JlVGltZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZ25vcmVCZWZvcmVUaW1lID0gMDtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSB0aGlzLl9maXJzdCxcbiAgICAgICAgbGFiZWxzID0gdGhpcy5sYWJlbHMsXG4gICAgICAgIHA7XG4gICAgYW1vdW50ID0gX3JvdW5kUHJlY2lzZShhbW91bnQpO1xuXG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuX3N0YXJ0ID49IGlnbm9yZUJlZm9yZVRpbWUpIHtcbiAgICAgICAgY2hpbGQuX3N0YXJ0ICs9IGFtb3VudDtcbiAgICAgICAgY2hpbGQuX2VuZCArPSBhbW91bnQ7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuX25leHQ7XG4gICAgfVxuXG4gICAgaWYgKGFkanVzdExhYmVscykge1xuICAgICAgZm9yIChwIGluIGxhYmVscykge1xuICAgICAgICBpZiAobGFiZWxzW3BdID49IGlnbm9yZUJlZm9yZVRpbWUpIHtcbiAgICAgICAgICBsYWJlbHNbcF0gKz0gYW1vdW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF91bmNhY2hlKHRoaXMpO1xuICB9O1xuXG4gIF9wcm90bzIuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uIGludmFsaWRhdGUoc29mdCkge1xuICAgIHZhciBjaGlsZCA9IHRoaXMuX2ZpcnN0O1xuICAgIHRoaXMuX2xvY2sgPSAwO1xuXG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBjaGlsZC5pbnZhbGlkYXRlKHNvZnQpO1xuICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gX0FuaW1hdGlvbi5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMsIHNvZnQpO1xuICB9O1xuXG4gIF9wcm90bzIuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcihpbmNsdWRlTGFiZWxzKSB7XG4gICAgaWYgKGluY2x1ZGVMYWJlbHMgPT09IHZvaWQgMCkge1xuICAgICAgaW5jbHVkZUxhYmVscyA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gdGhpcy5fZmlyc3QsXG4gICAgICAgIG5leHQ7XG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIG5leHQgPSBjaGlsZC5fbmV4dDtcbiAgICAgIHRoaXMucmVtb3ZlKGNoaWxkKTtcbiAgICAgIGNoaWxkID0gbmV4dDtcbiAgICB9XG5cbiAgICB0aGlzLl9kcCAmJiAodGhpcy5fdGltZSA9IHRoaXMuX3RUaW1lID0gdGhpcy5fcFRpbWUgPSAwKTtcbiAgICBpbmNsdWRlTGFiZWxzICYmICh0aGlzLmxhYmVscyA9IHt9KTtcbiAgICByZXR1cm4gX3VuY2FjaGUodGhpcyk7XG4gIH07XG5cbiAgX3Byb3RvMi50b3RhbER1cmF0aW9uID0gZnVuY3Rpb24gdG90YWxEdXJhdGlvbih2YWx1ZSkge1xuICAgIHZhciBtYXggPSAwLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgY2hpbGQgPSBzZWxmLl9sYXN0LFxuICAgICAgICBwcmV2U3RhcnQgPSBfYmlnTnVtLFxuICAgICAgICBwcmV2LFxuICAgICAgICBzdGFydCxcbiAgICAgICAgcGFyZW50O1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybi
12666BzZWxmLnRpbWVTY2FsZSgoc2VsZi5fcmVwZWF0IDwgMCA/IHNlbGYuZHVyYXRpb24oKSA6IHNlbGYudG90YWxEdXJhdGlvbigpKSAvIChzZWxmLnJldmVyc2VkKCkgPyAtdmFsdWUgOiB2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChzZWxmLl9kaXJ0eSkge1xuICAgICAgcGFyZW50ID0gc2VsZi5wYXJlbnQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBwcmV2ID0gY2hpbGQuX3ByZXY7IC8vcmVjb3JkIGl0IGhlcmUgaW4gY2FzZSB0aGUgdHdlZW4gY2hhbmdlcyBwb3NpdGlvbiBpbiB0aGUgc2VxdWVuY2UuLi5cblxuICAgICAgICBjaGlsZC5fZGlydHkgJiYgY2hpbGQudG90YWxEdXJhdGlvbigpOyAvL2NvdWxkIGNoYW5nZSB0aGUgdHdlZW4uX3N0YXJ0VGltZSwgc28gbWFrZSBzdXJlIHRoZSBhbmltYXRpb24ncyBjYWNoZSBpcyBjbGVhbiBiZWZvcmUgYW5hbHl6aW5nIGl0LlxuXG4gICAgICAgIHN0YXJ0ID0gY2hpbGQuX3N0YXJ0O1xuXG4gICAgICAgIGlmIChzdGFydCA+IHByZXZTdGFydCAmJiBzZWxmLl9zb3J0ICYmIGNoaWxkLl90cyAmJiAhc2VsZi5fbG9jaykge1xuICAgICAgICAgIC8vaW4gY2FzZSBvbmUgb2YgdGhlIHR3ZWVucyBzaGlmdGVkIG91dCBvZiBvcmRlciwgaXQgbmVlZHMgdG8gYmUgcmUtaW5zZXJ0ZWQgaW50byB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgc2VxdWVuY2VcbiAgICAgICAgICBzZWxmLl9sb2NrID0gMTsgLy9wcmV2ZW50IGVuZGxlc3MgcmVjdXJzaXZlIGNhbGxzIC0gdGhlcmUgYXJlIG1ldGhvZHMgdGhhdCBnZXQgdHJpZ2dlcmVkIHRoYXQgY2hlY2sgZHVyYXRpb24vdG90YWxEdXJhdGlvbiB3aGVuIHdlIGFkZCgpLlxuXG4gICAgICAgICAgX2FkZFRvVGltZWxpbmUoc2VsZiwgY2hpbGQsIHN0YXJ0IC0gY2hpbGQuX2RlbGF5LCAxKS5fbG9jayA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldlN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnQgPCAwICYmIGNoaWxkLl90cykge1xuICAgICAgICAgIC8vY2hpbGRyZW4gYXJlbid0IGFsbG93ZWQgdG8gaGF2ZSBuZWdhdGl2ZSBzdGFydFRpbWVzIHVubGVzcyBzbW9vdGhDaGlsZFRpbWluZyBpcyB0cnVlLCBzbyBhZGp1c3QgaGVyZSBpZiBvbmUgaXMgZm91bmQuXG4gICAgICAgICAgbWF4IC09IHN0YXJ0O1xuXG4gICAgICAgICAgaWYgKCFwYXJlbnQgJiYgIXNlbGYuX2RwIHx8IHBhcmVudCAmJiBwYXJlbnQuc21vb3RoQ2hpbGRUaW1pbmcpIHtcbiAgICAgICAgICAgIHNlbGYuX3N0YXJ0ICs9IF9yb3VuZFByZWNpc2Uoc3RhcnQgLyBzZWxmLl90cyk7XG4gICAgICAgICAgICBzZWxmLl90aW1lIC09IHN0YXJ0O1xuICAgICAgICAgICAgc2VsZi5fdFRpbWUgLT0gc3RhcnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5zaGlmdENoaWxkcmVuKC1zdGFydCwgZmFsc2UsIC0xZTk5OSk7XG4gICAgICAgICAgcHJldlN0YXJ0ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkLl9lbmQgPiBtYXggJiYgY2hpbGQuX3RzICYmIChtYXggPSBjaGlsZC5fZW5kKTtcbiAgICAgICAgY2hpbGQgPSBwcmV2O1xuICAgICAgfVxuXG4gICAgICBfc2V0RHVyYXRpb24oc2VsZiwgc2VsZiA9PT0gX2dsb2JhbFRpbWVsaW5lICYmIHNlbGYuX3RpbWUgPiBtYXggPyBzZWxmLl90aW1lIDogbWF4LCAxLCAxKTtcblxuICAgICAgc2VsZi5fZGlydHkgPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLl90RHVyO1xuICB9O1xuXG4gIFRpbWVsaW5lLnVwZGF0ZVJvb3QgPSBmdW5jdGlvbiB1cGRhdGVSb290KHRpbWUpIHtcbiAgICBpZiAoX2dsb2JhbFRpbWVsaW5lLl90cykge1xuICAgICAgX2xhenlTYWZlUmVuZGVyKF9nbG9iYWxUaW1lbGluZSwgX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUodGltZSwgX2dsb2JhbFRpbWVsaW5lKSk7XG5cbiAgICAgIF9sYXN0UmVuZGVyZWRGcmFtZSA9IF90aWNrZXIuZnJhbWU7XG4gICAgfVxuXG4gICAgaWYgKF90aWNrZXIuZnJhbWUgPj0gX25leHRHQ0ZyYW1lKSB7XG4gICAgICBfbmV4dEdDRnJhbWUgKz0gX2NvbmZpZy5hdXRvU2xlZXAgfHwgMTIwO1xuICAgICAgdmFyIGNoaWxkID0gX2dsb2JhbFRpbWVsaW5lLl9maXJzdDtcbiAgICAgIGlmICghY2hpbGQgfHwgIWNoaWxkLl90cykgaWYgKF9jb25maWcuYXV0b1NsZWVwICYmIF90aWNrZXIuX2xpc3RlbmVycy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHdoaWxlIChjaGlsZCAmJiAhY2hpbGQuX3RzKSB7XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkIHx8IF90aWNrZXIuc2xlZXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFRpbWVsaW5lO1xufShBbmltYXRpb24pO1xuXG5fc2V0RGVmYXVsdHMoVGltZWxpbmUucHJvdG90eXBlLCB7XG4gIF9sb2NrOiAwLFxuICBfaGFzUGF1c2U6IDAsXG4gIF9mb3JjaW5nOiAwXG59KTtcblxudmFyIF9hZGRDb21wbGV4U3RyaW5nUHJvcFR3ZWVuID0gZnVuY3Rpb24gX2FkZENvbXBsZXhTdHJpbmdQcm9wVHdlZW4odGFyZ2V0LCBwcm9wLCBzdGFydCwgZW5kLCBzZXR0ZXIsIHN0cmluZ0ZpbHRlciwgZnVuY1BhcmFtKSB7XG4gIC8vbm90ZTogd2UgY2FsbCBfYWRkQ29tcGxleFN0cmluZ1Byb3BUd2Vlbi5jYWxsKHR3ZWVuSW5zdGFuY2UuLi4pIHRvIGVuc3VyZSB0aGF0IGl0J3Mgc2NvcGVkIHByb3Blcmx5LiBXZSBtYXkgY2FsbCBpdCBmcm9tIHdpdGhpbiBhIHBsdWdpbiB0b28sIHRodXMgXCJ0aGlzXCIgd291bGQgcmVmZXIgdG8gdGhlIHBsdWdpbi5cbiAgdmFyIHB0ID0gbmV3IFByb3BUd2Vlbih0aGlzLl9wdCwgdGFyZ2V0LCBwcm9wLCAwLCAxLCBfcmVuZGVyQ29tcGxleFN0cmluZywgbnVsbCwgc2V0dGVyKSxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIG1hdGNoSW5kZXggPSAwLFxuICAgICAgcmVzdWx0LFxuICAgICAgc3RhcnROdW1zLFxuICAgICAgY29sb3IsXG4gICAgICBlbmROdW0sXG4gICAgICBjaHVuayxcbiAgICAgIHN0YXJ0TnVtLFxuICAgICAgaGFzUmFuZG9tLFxuICAgICAgYTtcbiAgcHQuYiA9IHN0YXJ0O1xuICBwdC5lID0gZW5kO1xuICBzdGFydCArPSBcIlwiOyAvL2Vuc3VyZSB2YWx1ZXMgYXJlIHN0cmluZ3NcblxuICBlbmQgKz0gXCJcIjtcblxuICBpZiAoaGFzUmFuZG9tID0gfmVuZC5pbmRleE9mKFwicmFuZG9tKFwiKSkge1xuICAgIGVuZCA9IF9yZXBsYWNlUmFuZG9tKGVuZCk7XG4gIH1cblxuICBpZiAoc3RyaW5nRmlsdGVyKSB7XG4gICAgYSA9IFtzdGFydCwgZW5kXTtcbiAgICBzdHJpbmdGaWx0ZXIoYSwgdGFyZ2V0LCBwcm9wKTsgLy9wYXNzIGFuIGFycmF5IHdpdGggdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdmFsdWVzIGFuZCBsZXQgdGhlIGZpbHRlciBkbyB3aGF0ZXZlciBpdCBuZWVkcyB0byB0aGUgdmFsdWVzLlxuXG4gICAgc3RhcnQgPSBhWzBdO1xuICAgIGVuZCA9IGFbMV07XG4gIH1cblxuICBzdGFydE51bXMgPSBzdGFydC5tYXRjaChfY29tcGxleFN0cmluZ051bUV4cCkgfHwgW107XG5cbiAgd2hpbGUgKHJlc3VsdCA9IF9jb21wbGV4U3RyaW5nTnVtRXhwLmV4ZWMoZW5kKSkge1xuICAgIGVuZE51bSA9IHJlc3VsdFswXTtcbiAgICBjaHVuayA9IGVuZC5zdWJzdHJpbmcoaW5kZXgsIHJlc3VsdC5pbmRleCk7XG5cbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIGNvbG9yID0gKGNvbG9yICsgMSkgJSA1O1xuICAgIH0gZWxzZSBpZiAoY2h1bmsuc3Vic3RyKC01KSA9PT0gXCJyZ2JhKFwiKSB7XG4gICAgICBjb2xvciA9IDE7XG4gICAgfVxuXG4gICAgaWYgKGVuZE51bSAhPT0gc3RhcnROdW1zW21hdGNoSW5kZXgrK10pIHtcbiAgICAgIHN0YXJ0TnVtID0gcGFyc2VGbG9hdChzdGFydE51bXNbbWF0Y2hJbmRleCAtIDFdKSB8fCAwOyAvL3RoZXNlIG5lc3RlZCBQcm9wVHdlZW5zIGFyZSBoYW5kbGVkIGluIGEgc3BlY2lhbCB3YXkgLSB3ZSdsb
12666CBuZXZlciBhY3R1YWxseSBjYWxsIGEgcmVuZGVyIG9yIHNldHRlciBtZXRob2Qgb24gdGhlbS4gV2UnbGwganVzdCBsb29wIHRocm91Z2ggdGhlbSBpbiB0aGUgcGFyZW50IGNvbXBsZXggc3RyaW5nIFByb3BUd2VlbidzIHJlbmRlciBtZXRob2QuXG5cbiAgICAgIHB0Ll9wdCA9IHtcbiAgICAgICAgX25leHQ6IHB0Ll9wdCxcbiAgICAgICAgcDogY2h1bmsgfHwgbWF0Y2hJbmRleCA9PT0gMSA/IGNodW5rIDogXCIsXCIsXG4gICAgICAgIC8vbm90ZTogU1ZHIHNwZWMgYWxsb3dzIG9taXNzaW9uIG9mIGNvbW1hL3NwYWNlIHdoZW4gYSBuZWdhdGl2ZSBzaWduIGlzIHdlZGdlZCBiZXR3ZWVuIHR3byBudW1iZXJzLCBsaWtlIDIuNS01LjMgaW5zdGVhZCBvZiAyLjUsLTUuMyBidXQgd2hlbiB0d2VlbmluZywgdGhlIG5lZ2F0aXZlIHZhbHVlIG1heSBzd2l0Y2ggdG8gcG9zaXRpdmUsIHNvIHdlIGluc2VydCB0aGUgY29tbWEganVzdCBpbiBjYXNlLlxuICAgICAgICBzOiBzdGFydE51bSxcbiAgICAgICAgYzogZW5kTnVtLmNoYXJBdCgxKSA9PT0gXCI9XCIgPyBfcGFyc2VSZWxhdGl2ZShzdGFydE51bSwgZW5kTnVtKSAtIHN0YXJ0TnVtIDogcGFyc2VGbG9hdChlbmROdW0pIC0gc3RhcnROdW0sXG4gICAgICAgIG06IGNvbG9yICYmIGNvbG9yIDwgNCA/IE1hdGgucm91bmQgOiAwXG4gICAgICB9O1xuICAgICAgaW5kZXggPSBfY29tcGxleFN0cmluZ051bUV4cC5sYXN0SW5kZXg7XG4gICAgfVxuICB9XG5cbiAgcHQuYyA9IGluZGV4IDwgZW5kLmxlbmd0aCA/IGVuZC5zdWJzdHJpbmcoaW5kZXgsIGVuZC5sZW5ndGgpIDogXCJcIjsgLy93ZSB1c2UgdGhlIFwiY1wiIG9mIHRoZSBQcm9wVHdlZW4gdG8gc3RvcmUgdGhlIGZpbmFsIHBhcnQgb2YgdGhlIHN0cmluZyAoYWZ0ZXIgdGhlIGxhc3QgbnVtYmVyKVxuXG4gIHB0LmZwID0gZnVuY1BhcmFtO1xuXG4gIGlmIChfcmVsRXhwLnRlc3QoZW5kKSB8fCBoYXNSYW5kb20pIHtcbiAgICBwdC5lID0gMDsgLy9pZiB0aGUgZW5kIHN0cmluZyBjb250YWlucyByZWxhdGl2ZSB2YWx1ZXMgb3IgZHluYW1pYyByYW5kb20oLi4uKSB2YWx1ZXMsIGRlbGV0ZSB0aGUgZW5kIGl0IHNvIHRoYXQgb24gdGhlIGZpbmFsIHJlbmRlciB3ZSBkb24ndCBhY3R1YWxseSBzZXQgaXQgdG8gdGhlIHN0cmluZyB3aXRoICs9IG9yIC09IGNoYXJhY3RlcnMgKGZvcmNlcyBpdCB0byB1c2UgdGhlIGNhbGN1bGF0ZWQgdmFsdWUpLlxuICB9XG5cbiAgdGhpcy5fcHQgPSBwdDsgLy9zdGFydCB0aGUgbGlua2VkIGxpc3Qgd2l0aCB0aGlzIG5ldyBQcm9wVHdlZW4uIFJlbWVtYmVyLCB3ZSBjYWxsIF9hZGRDb21wbGV4U3RyaW5nUHJvcFR3ZWVuLmNhbGwodHdlZW5JbnN0YW5jZS4uLikgdG8gZW5zdXJlIHRoYXQgaXQncyBzY29wZWQgcHJvcGVybHkuIFdlIG1heSBjYWxsIGl0IGZyb20gd2l0aGluIGEgcGx1Z2luIHRvbywgdGh1cyBcInRoaXNcIiB3b3VsZCByZWZlciB0byB0aGUgcGx1Z2luLlxuXG4gIHJldHVybiBwdDtcbn0sXG4gICAgX2FkZFByb3BUd2VlbiA9IGZ1bmN0aW9uIF9hZGRQcm9wVHdlZW4odGFyZ2V0LCBwcm9wLCBzdGFydCwgZW5kLCBpbmRleCwgdGFyZ2V0cywgbW9kaWZpZXIsIHN0cmluZ0ZpbHRlciwgZnVuY1BhcmFtLCBvcHRpb25hbCkge1xuICBfaXNGdW5jdGlvbihlbmQpICYmIChlbmQgPSBlbmQoaW5kZXggfHwgMCwgdGFyZ2V0LCB0YXJnZXRzKSk7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB0YXJnZXRbcHJvcF0sXG4gICAgICBwYXJzZWRTdGFydCA9IHN0YXJ0ICE9PSBcImdldFwiID8gc3RhcnQgOiAhX2lzRnVuY3Rpb24oY3VycmVudFZhbHVlKSA/IGN1cnJlbnRWYWx1ZSA6IGZ1bmNQYXJhbSA/IHRhcmdldFtwcm9wLmluZGV4T2YoXCJzZXRcIikgfHwgIV9pc0Z1bmN0aW9uKHRhcmdldFtcImdldFwiICsgcHJvcC5zdWJzdHIoMyldKSA/IHByb3AgOiBcImdldFwiICsgcHJvcC5zdWJzdHIoMyldKGZ1bmNQYXJhbSkgOiB0YXJnZXRbcHJvcF0oKSxcbiAgICAgIHNldHRlciA9ICFfaXNGdW5jdGlvbihjdXJyZW50VmFsdWUpID8gX3NldHRlclBsYWluIDogZnVuY1BhcmFtID8gX3NldHRlckZ1bmNXaXRoUGFyYW0gOiBfc2V0dGVyRnVuYyxcbiAgICAgIHB0O1xuXG4gIGlmIChfaXNTdHJpbmcoZW5kKSkge1xuICAgIGlmICh+ZW5kLmluZGV4T2YoXCJyYW5kb20oXCIpKSB7XG4gICAgICBlbmQgPSBfcmVwbGFjZVJhbmRvbShlbmQpO1xuICAgIH1cblxuICAgIGlmIChlbmQuY2hhckF0KDEpID09PSBcIj1cIikge1xuICAgICAgcHQgPSBfcGFyc2VSZWxhdGl2ZShwYXJzZWRTdGFydCwgZW5kKSArIChnZXRVbml0KHBhcnNlZFN0YXJ0KSB8fCAwKTtcblxuICAgICAgaWYgKHB0IHx8IHB0ID09PSAwKSB7XG4gICAgICAgIC8vIHRvIGF2b2lkIGlzTmFOLCBsaWtlIGlmIHNvbWVvbmUgcGFzc2VzIGluIGEgdmFsdWUgbGlrZSBcIiE9IHdoYXRldmVyXCJcbiAgICAgICAgZW5kID0gcHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRpb25hbCB8fCBwYXJzZWRTdGFydCAhPT0gZW5kIHx8IF9mb3JjZUFsbFByb3BUd2VlbnMpIHtcbiAgICBpZiAoIWlzTmFOKHBhcnNlZFN0YXJ0ICogZW5kKSAmJiBlbmQgIT09IFwiXCIpIHtcbiAgICAgIC8vIGZ1biBmYWN0OiBhbnkgbnVtYmVyIG11bHRpcGxpZWQgYnkgXCJcIiBpcyBldmFsdWF0ZWQgYXMgdGhlIG51bWJlciAwIVxuICAgICAgcHQgPSBuZXcgUHJvcFR3ZWVuKHRoaXMuX3B0LCB0YXJnZXQsIHByb3AsICtwYXJzZWRTdGFydCB8fCAwLCBlbmQgLSAocGFyc2VkU3RhcnQgfHwgMCksIHR5cGVvZiBjdXJyZW50VmFsdWUgPT09IFwiYm9vbGVhblwiID8gX3JlbmRlckJvb2xlYW4gOiBfcmVuZGVyUGxhaW4sIDAsIHNldHRlcik7XG4gICAgICBmdW5jUGFyYW0gJiYgKHB0LmZwID0gZnVuY1BhcmFtKTtcbiAgICAgIG1vZGlmaWVyICYmIHB0Lm1vZGlmaWVyKG1vZGlmaWVyLCB0aGlzLCB0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRoaXMuX3B0ID0gcHQ7XG4gICAgfVxuXG4gICAgIWN1cnJlbnRWYWx1ZSAmJiAhKHByb3AgaW4gdGFyZ2V0KSAmJiBfbWlzc2luZ1BsdWdpbihwcm9wLCBlbmQpO1xuICAgIHJldHVybiBfYWRkQ29tcGxleFN0cmluZ1Byb3BUd2Vlbi5jYWxsKHRoaXMsIHRhcmdldCwgcHJvcCwgcGFyc2VkU3RhcnQsIGVuZCwgc2V0dGVyLCBzdHJpbmdGaWx0ZXIgfHwgX2NvbmZpZy5zdHJpbmdGaWx0ZXIsIGZ1bmNQYXJhbSk7XG4gIH1cbn0sXG4gICAgLy9jcmVhdGVzIGEgY29weSBvZiB0aGUgdmFycyBvYmplY3QgYW5kIHByb2Nlc3NlcyBhbnkgZnVuY3Rpb24tYmFzZWQgdmFsdWVzIChwdXR0aW5nIHRoZSByZXN1bHRpbmcgdmFsdWVzIGRpcmVjdGx5IGludG8gdGhlIGNvcHkpIGFzIHdlbGwgYXMgc3RyaW5ncyB3aXRoIFwicmFuZG9tKClcIiBpbiB0aG
12666VtLiBJdCBkb2VzIE5PVCBwcm9jZXNzIHJlbGF0aXZlIHZhbHVlcy5cbl9wcm9jZXNzVmFycyA9IGZ1bmN0aW9uIF9wcm9jZXNzVmFycyh2YXJzLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzLCB0d2Vlbikge1xuICBfaXNGdW5jdGlvbih2YXJzKSAmJiAodmFycyA9IF9wYXJzZUZ1bmNPclN0cmluZyh2YXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldCwgdGFyZ2V0cykpO1xuXG4gIGlmICghX2lzT2JqZWN0KHZhcnMpIHx8IHZhcnMuc3R5bGUgJiYgdmFycy5ub2RlVHlwZSB8fCBfaXNBcnJheSh2YXJzKSB8fCBfaXNUeXBlZEFycmF5KHZhcnMpKSB7XG4gICAgcmV0dXJuIF9pc1N0cmluZyh2YXJzKSA/IF9wYXJzZUZ1bmNPclN0cmluZyh2YXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldCwgdGFyZ2V0cykgOiB2YXJzO1xuICB9XG5cbiAgdmFyIGNvcHkgPSB7fSxcbiAgICAgIHA7XG5cbiAgZm9yIChwIGluIHZhcnMpIHtcbiAgICBjb3B5W3BdID0gX3BhcnNlRnVuY09yU3RyaW5nKHZhcnNbcF0sIHR3ZWVuLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzKTtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufSxcbiAgICBfY2hlY2tQbHVnaW4gPSBmdW5jdGlvbiBfY2hlY2tQbHVnaW4ocHJvcGVydHksIHZhcnMsIHR3ZWVuLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzKSB7XG4gIHZhciBwbHVnaW4sIHB0LCBwdExvb2t1cCwgaTtcblxuICBpZiAoX3BsdWdpbnNbcHJvcGVydHldICYmIChwbHVnaW4gPSBuZXcgX3BsdWdpbnNbcHJvcGVydHldKCkpLmluaXQodGFyZ2V0LCBwbHVnaW4ucmF3VmFycyA/IHZhcnNbcHJvcGVydHldIDogX3Byb2Nlc3NWYXJzKHZhcnNbcHJvcGVydHldLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzLCB0d2VlbiksIHR3ZWVuLCBpbmRleCwgdGFyZ2V0cykgIT09IGZhbHNlKSB7XG4gICAgdHdlZW4uX3B0ID0gcHQgPSBuZXcgUHJvcFR3ZWVuKHR3ZWVuLl9wdCwgdGFyZ2V0LCBwcm9wZXJ0eSwgMCwgMSwgcGx1Z2luLnJlbmRlciwgcGx1Z2luLCAwLCBwbHVnaW4ucHJpb3JpdHkpO1xuXG4gICAgaWYgKHR3ZWVuICE9PSBfcXVpY2tUd2Vlbikge1xuICAgICAgcHRMb29rdXAgPSB0d2Vlbi5fcHRMb29rdXBbdHdlZW4uX3RhcmdldHMuaW5kZXhPZih0YXJnZXQpXTsgLy9ub3RlOiB3ZSBjYW4ndCB1c2UgdHdlZW4uX3B0TG9va3VwW2luZGV4XSBiZWNhdXNlIGZvciBzdGFnZ2VyZWQgdHdlZW5zLCB0aGUgaW5kZXggZnJvbSB0aGUgZnVsbFRhcmdldHMgYXJyYXkgd29uJ3QgbWF0Y2ggd2hhdCBpdCBpcyBpbiBlYWNoIGluZGl2aWR1YWwgdHdlZW4gdGhhdCBzcGF3bnMgZnJvbSB0aGUgc3RhZ2dlci5cblxuICAgICAgaSA9IHBsdWdpbi5fcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHB0TG9va3VwW3BsdWdpbi5fcHJvcHNbaV1dID0gcHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBsdWdpbjtcbn0sXG4gICAgX292ZXJ3cml0aW5nVHdlZW4sXG4gICAgLy9zdG9yZSBhIHJlZmVyZW5jZSB0ZW1wb3JhcmlseSBzbyB3ZSBjYW4gYXZvaWQgb3ZlcndyaXRpbmcgaXRzZWxmLlxuX2ZvcmNlQWxsUHJvcFR3ZWVucyxcbiAgICBfaW5pdFR3ZWVuID0gZnVuY3Rpb24gX2luaXRUd2Vlbih0d2VlbiwgdGltZSwgdFRpbWUpIHtcbiAgdmFyIHZhcnMgPSB0d2Vlbi52YXJzLFxuICAgICAgZWFzZSA9IHZhcnMuZWFzZSxcbiAgICAgIHN0YXJ0QXQgPSB2YXJzLnN0YXJ0QXQsXG4gICAgICBpbW1lZGlhdGVSZW5kZXIgPSB2YXJzLmltbWVkaWF0ZVJlbmRlcixcbiAgICAgIGxhenkgPSB2YXJzLmxhenksXG4gICAgICBvblVwZGF0ZSA9IHZhcnMub25VcGRhdGUsXG4gICAgICBydW5CYWNrd2FyZHMgPSB2YXJzLnJ1bkJhY2t3YXJkcyxcbiAgICAgIHlveW9FYXNlID0gdmFycy55b3lvRWFzZSxcbiAgICAgIGtleWZyYW1lcyA9IHZhcnMua2V5ZnJhbWVzLFxuICAgICAgYXV0b1JldmVydCA9IHZhcnMuYXV0b1JldmVydCxcbiAgICAgIGR1ciA9IHR3ZWVuLl9kdXIsXG4gICAgICBwcmV2U3RhcnRBdCA9IHR3ZWVuLl9zdGFydEF0LFxuICAgICAgdGFyZ2V0cyA9IHR3ZWVuLl90YXJnZXRzLFxuICAgICAgcGFyZW50ID0gdHdlZW4ucGFyZW50LFxuICAgICAgZnVsbFRhcmdldHMgPSBwYXJlbnQgJiYgcGFyZW50LmRhdGEgPT09IFwibmVzdGVkXCIgPyBwYXJlbnQudmFycy50YXJnZXRzIDogdGFyZ2V0cyxcbiAgICAgIGF1dG9PdmVyd3JpdGUgPSB0d2Vlbi5fb3ZlcndyaXRlID09PSBcImF1dG9cIiAmJiAhX3N1cHByZXNzT3ZlcndyaXRlcyxcbiAgICAgIHRsID0gdHdlZW4udGltZWxpbmUsXG4gICAgICByZXZlcnNlRWFzZSA9IHZhcnMuZWFzZVJldmVyc2UgfHwgeW95b0Vhc2UsXG4gICAgICBjbGVhblZhcnMsXG4gICAgICBpLFxuICAgICAgcCxcbiAgICAgIHB0LFxuICAgICAgdGFyZ2V0LFxuICAgICAgaGFzUHJpb3JpdHksXG4gICAgICBnc0RhdGEsXG4gICAgICBoYXJuZXNzLFxuICAgICAgcGx1Z2luLFxuICAgICAgcHRMb29rdXAsXG4gICAgICBpbmRleCxcbiAgICAgIGhhcm5lc3NWYXJzLFxuICAgICAgb3ZlcndyaXR0ZW47XG4gIHRsICYmICgha2V5ZnJhbWVzIHx8ICFlYXNlKSAmJiAoZWFzZSA9IFwibm9uZVwiKTtcbiAgdHdlZW4uX2Vhc2UgPSBfcGFyc2VFYXNlKGVhc2UsIF9kZWZhdWx0cy5lYXNlKTtcbiAgdHdlZW4uX3JFYXNlID0gcmV2ZXJzZUVhc2UgJiYgKF9wYXJzZUVhc2UocmV2ZXJzZUVhc2UpIHx8IHR3ZWVuLl9lYXNlKTtcbiAgdHdlZW4uX2Zyb20gPSAhdGwgJiYgISF2YXJzLnJ1bkJhY2t3YXJkczsgLy9uZXN0ZWQgdGltZWxpbmVzIHNob3VsZCBuZXZlciBydW4gYmFja3dhcmRzIC0gdGhlIGJhY2t3YXJkcy1uZXNzIGlzIGluIHRoZSBjaGlsZCB0d2VlbnMuXG5cbiAgaWYgKHR3ZWVuLl9mcm9tKSB0d2Vlbi5yYXRpbyA9IDE7XG5cbiAgaWYgKCF0bCB8fCBrZXlmcmFtZXMgJiYgIXZhcnMuc3RhZ2dlcikge1xuICAgIC8vaWYgdGhlcmUncyBhbiBpbnRlcm5hbCB0aW1lbGluZSwgc2tpcCBhbGwgdGhlIHBhcnNpbmcgYmVjYXVzZSB3ZSBwYXNzZWQgdGhhdCB0YXNrIGRvd24gdGhlIGNoYWluLlxuICAgIGhhcm5lc3MgPSB0YXJnZXRzWzBdID8gX2dldENhY2hlKHRhcmdldHNbMF0pLmhhcm5lc3MgOiAwO1xuICAgIGhhcm5lc3NWYXJzID0gaGFybmVzcyAmJiB2YXJzW2hhcm5lc3MucHJvcF07IC8vc29tZW9uZSBtYXkgbmVlZCB0byBzcGVjaWZ5IENTUy1zcGVjaWZpYyB2YWx1ZXMgQU5EIG5vbi1DU1MgdmFsdWVzLCBsaWtlIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBcInhcIiBwcm9wZXJ0eSBwbHVzIGl0J3MgYSBzdGFuZGFyZCBET00gZWxlbWVudC4gV2UgYWxsb3cgcGVvcGxlIHRvIGRpc3Rpbmd1aXNoIGJ5IHdyYXBwaW5nIHBsdWdpbi1zcGVjaWZpYyBzdHVmZiBpbiBhIGNzczp7fSBvYmplY3QgZm9yIGV4YW1wbGUuXG5cbiAgICBjbGVhblZhcnMgPSBfY29weUV4Y2x1ZGluZyh2YXJzLCBfcmVzZXJ2ZWRQcm9wcyk7XG5cbiAgICBpZiAocHJldlN0YXJ0QXQpIHtcbiAgICAgIHByZXZTdGFydEF0Ll96VGltZSA8IDAgJiYgcHJldlN0YXJ0QXQucHJvZ3Jlc3MoMSk7IC8vIGluIGNhc2UgaXQncyBhIGxhenkgc3RhcnRBdCB0aGF0IGhhc24ndCByZW5kZXJlZCB5ZXQuXG5cbiAgICAgIHRpbWUgPCAwICYmIHJ1bkJhY2t3YXJkcyAmJiBpbW1lZGlhdGVSZW5kZXIgJiYgIWF1dG9SZXZlcnQgPyBwcmV2U3RhcnRBdC5yZW5kZXIoLTEsIHRydWUpIDogcHJldlN0YXJ0QXQucmV2ZXJ0KHJ1bkJhY2t3YXJkcyAmJiBkdXIgPyBfcmV2ZXJ0Q29uZmlnTm9LaWxsIDogX3N0YXJ0QXRSZXZlcnRDb25maWcpOyAvLyBpZiBpdCdzIGEgXCJzdGFydEF0XCIgKG5vdCBcImZyb20oKVwiIG9yIHJ1bkJhY2t3YXJkczogdHJ1ZSksIHdlIG9ubHkgbmVlZCB0byBkbyBhIHNoYWxsb3cgcmV2ZXJ0IChrZWVwIHRyYW5zZm9ybXMgY2FjaGVkIGluIENTU1BsdWdpbilcbiAgICAgIC8vIGRvbid0IGp1c3QgX3JlbW92ZUZyb21QYXJlbnQocHJldlN0YXJ0QXQucmVuZGVyKC0xLCB0cnVlKSkgYmVjYXVzZSB0aGF0J2xsIGxlYXZlIGlubGluZSBzdHlsZXMuIFdlJ3JlIGNyZWF0aW5nIGEgbmV3IF9zdGFydEF0IGZvciBcInN0YXJ0QXRcIiB0d2VlbnMgdGhhdCByZS1jYXB0dXJlIHRoaW5ncyB0byBlbnN1cmUgdGhhdCBpZiB0aGUgcHJlLXR3ZWVuIHZhbHVlcyBjaGFuZ2VkIHNpbmNlIHRoZSB0d2VlbiB3YXMgY3JlYXRlZCwgdGhleSdyZSByZWNvcmRlZC5cblxuICAgICAgcHJldlN0YXJ0QXQuX2xhenkgPSAwO1xuICAgIH1cblxuICAgIGlmIChzdGFydEF0KSB7XG4gICAgICBfcmVtb3ZlRnJvbVBhcmVudCh0d2Vlbi5fc3RhcnRBdCA9IFR3ZWVuLnNldCh0YXJnZXRzLCBfc2V0RGVmYXVsdHMoe1xuICAgICAgICBkYXRhOiBcImlzU3RhcnRcIixcbiAgICAgICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIGltbWVkaWF0ZVJlbmRlcjogdHJ1ZSxcbiAgICAgICAgbGF6eTogIXByZXZTdGFydEF0ICYmIF9pc05vdEZhbHNlKGxhenkpLFxuICAgICAgICBzdGFydEF0OiBudWxsLFxuICAgICAgICBkZWxheTogMCxcbiAgICAgICAgb25VcGRhdGU6IG9uVXBkYXRlICYmIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX2NhbGxiYWNrKHR3ZWVuLCBcIm9uVXBkYXRlXCIpO1xuICAgICAgICB9LFxuICAgICAgICBzdGFnZ2VyOiAwXG4gICAgICB9LCBzdGFydEF0KSkpOyAvL2NvcHkgdGhlI
12666HByb3BlcnRpZXMvdmFsdWVzIGludG8gYSBuZXcgb2JqZWN0IHRvIGF2b2lkIGNvbGxpc2lvbnMsIGxpa2UgdmFyIHRvID0ge3g6MH0sIGZyb20gPSB7eDo1MDB9OyB0aW1lbGluZS5mcm9tVG8oZSwgZnJvbSwgdG8pLmZyb21UbyhlLCB0bywgZnJvbSk7XG5cblxuICAgICAgdHdlZW4uX3N0YXJ0QXQuX2RwID0gMDsgLy8gZG9uJ3QgYWxsb3cgaXQgdG8gZ2V0IHB1dCBiYWNrIGludG8gcm9vdCB0aW1lbGluZSEgTGlrZSB3aGVuIHJldmVydCgpIGlzIGNhbGxlZCBhbmQgdG90YWxUaW1lKCkgZ2V0cyBzZXQuXG5cbiAgICAgIHR3ZWVuLl9zdGFydEF0Ll9zYXQgPSB0d2VlbjsgLy8gdXNlZCBpbiBnbG9iYWxUaW1lKCkuIF9zYXQgc3RhbmRzIGZvciBfc3RhcnRBdFR3ZWVuXG5cbiAgICAgIHRpbWUgPCAwICYmIChfcmV2ZXJ0aW5nIHx8ICFpbW1lZGlhdGVSZW5kZXIgJiYgIWF1dG9SZXZlcnQpICYmIHR3ZWVuLl9zdGFydEF0LnJldmVydChfcmV2ZXJ0Q29uZmlnTm9LaWxsKTsgLy8gcmFyZSBlZGdlIGNhc2UsIGxpa2UgaWYgYSByZW5kZXIgaXMgZm9yY2VkIGluIHRoZSBuZWdhdGl2ZSBkaXJlY3Rpb24gb2YgYSBub24taW5pdHRlZCB0d2Vlbi5cblxuICAgICAgaWYgKGltbWVkaWF0ZVJlbmRlcikge1xuICAgICAgICBpZiAoZHVyICYmIHRpbWUgPD0gMCAmJiB0VGltZSA8PSAwKSB7XG4gICAgICAgICAgLy8gY2hlY2sgdFRpbWUgaGVyZSBiZWNhdXNlIGluIHRoZSBjYXNlIG9mIGEgeW95byB0d2VlbiB3aG9zZSBwbGF5aGVhZCBnZXRzIHB1c2hlZCB0byB0aGUgZW5kIGxpa2UgdHdlZW4ucHJvZ3Jlc3MoMSksIHdlIHNob3VsZCBhbGxvdyBpdCB0aHJvdWdoIHNvIHRoYXQgdGhlIG9uQ29tcGxldGUgZ2V0cyBmaXJlZCBwcm9wZXJseS5cbiAgICAgICAgICB0aW1lICYmICh0d2Vlbi5felRpbWUgPSB0aW1lKTtcbiAgICAgICAgICByZXR1cm47IC8vd2Ugc2tpcCBpbml0aWFsaXphdGlvbiBoZXJlIHNvIHRoYXQgb3ZlcndyaXRpbmcgZG9lc24ndCBvY2N1ciB1bnRpbCB0aGUgdHdlZW4gYWN0dWFsbHkgYmVnaW5zLiBPdGhlcndpc2UsIGlmIHlvdSBjcmVhdGUgc2V2ZXJhbCBpbW1lZGlhdGVSZW5kZXI6dHJ1ZSB0d2VlbnMgb2YgdGhlIHNhbWUgdGFyZ2V0L3Byb3BlcnRpZXMgdG8gZHJvcCBpbnRvIGEgVGltZWxpbmUsIHRoZSBsYXN0IG9uZSBjcmVhdGVkIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZmlyc3Qgb25lcyBiZWNhdXNlIHRoZXkgZGlkbid0IGdldCBwbGFjZWQgaW50byB0aGUgdGltZWxpbmUgeWV0IGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyIG9jY3VycyBhbmQga2lja3MgaW4gb3ZlcndyaXRpbmcuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJ1bkJhY2t3YXJkcyAmJiBkdXIpIHtcbiAgICAgIC8vIGZyb20oKSB0d2VlbnMgbXVzdCBiZSBoYW5kbGVkIHVuaXF1ZWx5OiB0aGVpciBiZWdpbm5pbmcgdmFsdWVzIG11c3QgYmUgcmVuZGVyZWQgYnV0IHdlIGRvbid0IHdhbnQgb3ZlcndyaXRpbmcgdG8gb2NjdXIgeWV0ICh3aGVuIHRpbWUgaXMgc3RpbGwgMCkuIFdhaXQgdW50aWwgdGhlIHR3ZWVuIGFjdHVhbGx5IGJlZ2lucyBiZWZvcmUgZG9pbmcgYWxsIHRoZSByb3V0aW5lcyBsaWtlIG92ZXJ3cml0aW5nLiBBdCB0aGF0IHRpbWUsIHdlIHNob3VsZCByZW5kZXIgYXQgdGhlIEVORCBvZiB0aGUgdHdlZW4gdG8gZW5zdXJlIHRoYXQgdGhpbmdzIGluaXRpYWxpemUgY29ycmVjdGx5IChyZW1lbWJlciwgZnJvbSgpIHR3ZWVucyBnbyBiYWNrd2FyZHMpXG4gICAgICBpZiAoIXByZXZTdGFydEF0KSB7XG4gICAgICAgIHRpbWUgJiYgKGltbWVkaWF0ZVJlbmRlciA9IGZhbHNlKTsgLy9pbiByYXJlIGNhc2VzIChsaWtlIGlmIGEgZnJvbSgpIHR3ZWVuIHJ1bnMgYW5kIHRoZW4gaXMgaW52YWxpZGF0ZSgpLWVkKSwgaW1tZWRpYXRlUmVuZGVyIGNvdWxkIGJlIHRydWUgYnV0IHRoZSBpbml0aWFsIGZvcmNlZC1yZW5kZXIgZ2V0cyBza2lwcGVkLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gZm9yY2UgdGhlIHJlbmRlciBpbiB0aGlzIGNvbnRleHQgd2hlbiB0aGUgX3RpbWUgaXMgZ3JlYXRlciB0aGFuIDBcblxuICAgICAgICBwID0gX3NldERlZmF1bHRzKHtcbiAgICAgICAgICBvdmVyd3JpdGU6IGZhbHNlLFxuICAgICAgICAgIGRhdGE6IFwiaXNGcm9tU3RhcnRcIixcbiAgICAgICAgICAvL3dlIHRhZyB0aGUgdHdlZW4gd2l0aCBhcyBcImlzRnJvbVN0YXJ0XCIgc28gdGhhdCBpZiBbaW5zaWRlIGEgcGx1Z2luXSB3ZSBuZWVkIHRvIG9ubHkgZG8gc29tZXRoaW5nIGF0IHRoZSB2ZXJ5IEVORCBvZiBhIHR3ZWVuLCB3ZSBoYXZlIGEgd2F5IG9mIGlkZW50aWZ5aW5nIHRoaXMgdHdlZW4gYXMgbWVyZWx5IHRoZSBvbmUgdGhhdCdzIHNldHRpbmcgdGhlIGJlZ2lubmluZyB2YWx1ZXMgZm9yIGEgXCJmcm9tKClcIiB0d2Vlbi4gRm9yIGV4YW1wbGUsIGNsZWFyUHJvcHMgaW4gQ1NTUGx1Z2luIHNob3VsZCBvbmx5IGdldCBhcHBsaWVkIGF0IHRoZSB2ZXJ5IEVORCBvZiBhIHR3ZWVuIGFuZCB3aXRob3V0IHRoaXMgdGFnLCBmcm9tKC4uLntoZWlnaHQ6MTAwLCBjbGVhclByb3BzOlwiaGVpZ2h0XCIsIGRlbGF5OjF9KSB3b3VsZCB3aXBlIHRoZSBoZWlnaHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdHdlZW4gYW5kIGFmdGVyIDEgc2Vjb25kLCBpdCdkIGtpY2sgYmFjayBpbi5cbiAgICAgICAgICBsYXp5OiBpbW1lZGlhdGVSZW5kZXIgJiYgIXByZXZTdGFydEF0ICYmIF9pc05vdEZhbHNlKGxhenkpLFxuICAgICAgICAgIGltbWVkaWF0ZVJlbmRlcjogaW1tZWRpYXRlUmVuZGVyLFxuICAgICAgICAgIC8vemVyby1kdXJhdGlvbiB0d2VlbnMgcmVuZGVyIGltbWVkaWF0ZWx5IGJ5IGRlZmF1bHQsIGJ1dCBpZiB3ZSdyZSBub3Qgc3BlY2lmaWNhbGx5IGluc3RydWN0ZWQgdG8gcmVuZGVyIHRoaXMgdHdlZW4gaW1tZWRpYXRlbHksIHdlIHNob3VsZCBza2lwIHRoaXMgYW5kIG1lcmVseSBfaW5pdCgpIHRvIHJlY29yZCB0aGUgc3RhcnRpbmcgdmFsdWVzIChyZW5kZXJpbmcgdGhlbSBpbW1lZGlhdGVseSB3b3VsZCBwdXNoIHRoZW0gdG8gY29tcGxldGlvbiB3aGljaCBpcyB3YXN0ZWZ1bCBpbiB0aGF0IGNhc2UgLSB3ZSdkIGhhdmUgdG8gcmVuZGVyKC0xKSBpbW1lZGlhdGVseSBhZnRlcilcbiAgICAgICAgICBzdGFnZ2VyOiAwLFxuICAgICAgICAgI
12666HBhcmVudDogcGFyZW50IC8vZW5zdXJlcyB0aGF0IG5lc3RlZCB0d2VlbnMgdGhhdCBoYWQgYSBzdGFnZ2VyIGFyZSBoYW5kbGVkIHByb3Blcmx5LCBsaWtlIGdzYXAuZnJvbShcIi5jbGFzc1wiLCB7eTogZ3NhcC51dGlscy53cmFwKFstMTAwLDEwMF0pLCBzdGFnZ2VyOiAwLjV9KVxuXG4gICAgICAgIH0sIGNsZWFuVmFycyk7XG4gICAgICAgIGhhcm5lc3NWYXJzICYmIChwW2hhcm5lc3MucHJvcF0gPSBoYXJuZXNzVmFycyk7IC8vIGluIGNhc2Ugc29tZW9uZSBkb2VzIHNvbWV0aGluZyBsaWtlIC5mcm9tKC4uLiwge2Nzczp7fX0pXG5cbiAgICAgICAgX3JlbW92ZUZyb21QYXJlbnQodHdlZW4uX3N0YXJ0QXQgPSBUd2Vlbi5zZXQodGFyZ2V0cywgcCkpO1xuXG4gICAgICAgIHR3ZWVuLl9zdGFydEF0Ll9kcCA9IDA7IC8vIGRvbid0IGFsbG93IGl0IHRvIGdldCBwdXQgYmFjayBpbnRvIHJvb3QgdGltZWxpbmUhXG5cbiAgICAgICAgdHdlZW4uX3N0YXJ0QXQuX3NhdCA9IHR3ZWVuOyAvLyB1c2VkIGluIGdsb2JhbFRpbWUoKVxuXG4gICAgICAgIHRpbWUgPCAwICYmIChfcmV2ZXJ0aW5nID8gdHdlZW4uX3N0YXJ0QXQucmV2ZXJ0KF9yZXZlcnRDb25maWdOb0tpbGwpIDogdHdlZW4uX3N0YXJ0QXQucmVuZGVyKC0xLCB0cnVlKSk7XG4gICAgICAgIHR3ZWVuLl96VGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKCFpbW1lZGlhdGVSZW5kZXIpIHtcbiAgICAgICAgICBfaW5pdFR3ZWVuKHR3ZWVuLl9zdGFydEF0LCBfdGlueU51bSwgX3RpbnlOdW0pOyAvL2Vuc3VyZXMgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZXMgYXJlIHJlY29yZGVkXG5cbiAgICAgICAgfSBlbHNlIGlmICghdGltZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHR3ZWVuLl9wdCA9IHR3ZWVuLl9wdENhY2hlID0gMDtcbiAgICBsYXp5ID0gZHVyICYmIF9pc05vdEZhbHNlKGxhenkpIHx8IGxhenkgJiYgIWR1cjtcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0YXJnZXQgPSB0YXJnZXRzW2ldO1xuICAgICAgZ3NEYXRhID0gdGFyZ2V0Ll9nc2FwIHx8IF9oYXJuZXNzKHRhcmdldHMpW2ldLl9nc2FwO1xuICAgICAgdHdlZW4uX3B0TG9va3VwW2ldID0gcHRMb29rdXAgPSB7fTtcbiAgICAgIF9sYXp5TG9va3VwW2dzRGF0YS5pZF0gJiYgX2xhenlUd2VlbnMubGVuZ3RoICYmIF9sYXp5UmVuZGVyKCk7IC8vaWYgb3RoZXIgdHdlZW5zIG9mIHRoZSBzYW1lIHRhcmdldCBoYXZlIHJlY2VudGx5IGluaXR0ZWQgYnV0IGhhdmVuJ3QgcmVuZGVyZWQgeWV0LCB3ZSd2ZSBnb3QgdG8gZm9yY2UgdGhlIHJlbmRlciBzbyB0aGF0IHRoZSBzdGFydGluZyB2YWx1ZXMgYXJlIGNvcnJlY3QgKGltYWdpbmUgcG9wdWxhdGluZyBhIHRpbWVsaW5lIHdpdGggYSBidW5jaCBvZiBzZXF1ZW50aWFsIHR3ZWVucyBhbmQgdGhlbiBqdW1waW5nIHRvIHRoZSBlbmQpXG5cbiAgICAgIGluZGV4ID0gZnVsbFRhcmdldHMgPT09IHRhcmdldHMgPyBpIDogZnVsbFRhcmdldHMuaW5kZXhPZih0YXJnZXQpO1xuXG4gICAgICBpZiAoaGFybmVzcyAmJiAocGx1Z2luID0gbmV3IGhhcm5lc3MoKSkuaW5pdCh0YXJnZXQsIGhhcm5lc3NWYXJzIHx8IGNsZWFuVmFycywgdHdlZW4sIGluZGV4LCBmdWxsVGFyZ2V0cykgIT09IGZhbHNlKSB7XG4gICAgICAgIHR3ZWVuLl9wdCA9IHB0ID0gbmV3IFByb3BUd2Vlbih0d2Vlbi5fcHQsIHRhcmdldCwgcGx1Z2luLm5hbWUsIDAsIDEsIHBsdWdpbi5yZW5kZXIsIHBsdWdpbiwgMCwgcGx1Z2luLnByaW9yaXR5KTtcblxuICAgICAgICBwbHVnaW4uX3Byb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICBwdExvb2t1cFtuYW1lXSA9IHB0O1xuICAgICAgICB9KTtcblxuICAgICAgICBwbHVnaW4ucHJpb3JpdHkgJiYgKGhhc1ByaW9yaXR5ID0gMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghaGFybmVzcyB8fCBoYXJuZXNzVmFycykge1xuICAgICAgICBmb3IgKHAgaW4gY2xlYW5WYXJzKSB7XG4gICAgICAgICAgaWYgKF9wbHVnaW5zW3BdICYmIChwbHVnaW4gPSBfY2hlY2tQbHVnaW4ocCwgY2xlYW5WYXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldCwgZnVsbFRhcmdldHMpKSkge1xuICAgICAgICAgICAgcGx1Z2luLnByaW9yaXR5ICYmIChoYXNQcmlvcml0eSA9IDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwdExvb2t1cFtwXSA9IHB0ID0gX2FkZFByb3BUd2Vlbi5jYWxsKHR3ZWVuLCB0YXJnZXQsIHAsIFwiZ2V0XCIsIGNsZWFuVmFyc1twXSwgaW5kZXgsIGZ1bGxUYXJnZXRzLCAwLCB2YXJzLnN0cmluZ0ZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHR3ZWVuLl9vcCAmJiB0d2Vlbi5fb3BbaV0gJiYgdHdlZW4ua2lsbCh0YXJnZXQsIHR3ZWVuLl9vcFtpXSk7XG5cbiAgICAgIGlmIChhdXRvT3ZlcndyaXRlICYmIHR3ZWVuLl9wdCkge1xuICAgICAgICBfb3ZlcndyaXRpbmdUd2VlbiA9IHR3ZWVuO1xuXG4gICAgICAgIF9nbG9iYWxUaW1lbGluZS5raWxsVHdlZW5zT2YodGFyZ2V0LCBwdExvb2t1cCwgdHdlZW4uZ2xvYmFsVGltZSh0aW1lKSk7IC8vIG1ha2Ugc3VyZSB0aGUgb3ZlcndyaXRpbmcgZG9lc24ndCBvdmVyd3JpdGUgVEhJUyB0d2VlbiEhIVxuXG5cbiAgICAgICAgb3ZlcndyaXR0ZW4gPSAhdHdlZW4ucGFyZW50O1xuICAgICAgICBfb3ZlcndyaXRpbmdUd2VlbiA9IDA7XG4gICAgICB9XG5cbiAgICAgIHR3ZWVuLl9wdCAmJiBsYXp5ICYmIChfbGF6eUxvb2t1cFtnc0RhdGEuaWRdID0gMSk7XG4gICAgfVxuXG4gICAgaGFzUHJpb3JpdHkgJiYgX3NvcnRQcm9wVHdlZW5zQnlQcmlvcml0eSh0d2Vlbik7XG4gICAgdHdlZW4uX29uSW5pdCAmJiB0d2Vlbi5fb25Jbml0KHR3ZWVuKTsgLy9wbHVnaW5zIGxpa2UgUm91bmRQcm9wcyBtdXN0IHdhaXQgdW50aWwgQUxMIG9mIHRoZSBQcm9wVHdlZW5zIGFyZSBpbnN0YW50aWF0ZWQuIEluIHRoZSBwbHVnaW4ncyBpbml0KCkgZnVuY3Rpb24sIGl0IHNldHMgdGhlIF9vbkluaXQgb24gdGhlIHR3ZWVuIGluc3RhbmNlLiBNYXkgbm90IGJlIHByZXR0eS9pbnR1aXRpdmUsIGJ1dCBpdCdzIGZhc3QgYW5kIGtlZXBzIGZpbGUgc2l6ZSBkb3duLlxuICB9XG5cbiAgdHdlZW4uX29uVXBkYXRlID0gb25VcGRhdGU7XG4gIHR3ZWVuLl9pbml0dGVkID0gKCF0d2Vlbi5fb3AgfHwgdHdlZW4uX3B0KSAmJiAhb3ZlcndyaXR0ZW47IC8vIGlmIG92ZXJ3cml0dGVuUHJvcHMgcmVzdWx0ZWQgaW4gdGhlIGVudGlyZSB0d2VlbiBiZWluZyBraWxsZWQsIGRvIE5PVCBmbGFnIGl0IGFzIGluaXR0ZWQgb3IgZWxzZSBpdCBtYXkgcmVuZGVyIGZvciBvbmUgdGljay5cblxuICBrZXlmcmFtZXMgJiYgdGltZSA8PSAwICYmIHRsLnJlbmRlcihfYmlnTnVtLCB0cnVlLCB0cnVlKTsgLy8gaWYgdGhlcmUncyBhIDAlIGtleWZyYW1lLCBpdCdsbCByZW5kZXIgaW4gdGhlIFwiYmVmb3JlXCIg
12666c3RhdGUgZm9yIGFueSBzdGFnZ2VyZWQvZGVsYXllZCBhbmltYXRpb25zIHRodXMgd2hlbiB0aGUgZm9sbG93aW5nIHR3ZWVuIGluaXRpYWxpemVzLCBpdCdsbCB1c2UgdGhlIFwiYmVmb3JlXCIgc3RhdGUgaW5zdGVhZCBvZiB0aGUgXCJhZnRlclwiIHN0YXRlIGFzIHRoZSBpbml0aWFsIHZhbHVlcy5cbn0sXG4gICAgX3VwZGF0ZVByb3BUd2VlbnMgPSBmdW5jdGlvbiBfdXBkYXRlUHJvcFR3ZWVucyh0d2VlbiwgcHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlLCByYXRpbywgdGltZSwgc2tpcFJlY3Vyc2lvbikge1xuICB2YXIgcHRDYWNoZSA9ICh0d2Vlbi5fcHQgJiYgdHdlZW4uX3B0Q2FjaGUgfHwgKHR3ZWVuLl9wdENhY2hlID0ge30pKVtwcm9wZXJ0eV0sXG4gICAgICBwdCxcbiAgICAgIHJvb3RQVCxcbiAgICAgIGxvb2t1cCxcbiAgICAgIGk7XG5cbiAgaWYgKCFwdENhY2hlKSB7XG4gICAgcHRDYWNoZSA9IHR3ZWVuLl9wdENhY2hlW3Byb3BlcnR5XSA9IFtdO1xuICAgIGxvb2t1cCA9IHR3ZWVuLl9wdExvb2t1cDtcbiAgICBpID0gdHdlZW4uX3RhcmdldHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgcHQgPSBsb29rdXBbaV1bcHJvcGVydHldO1xuXG4gICAgICBpZiAocHQgJiYgcHQuZCAmJiBwdC5kLl9wdCkge1xuICAgICAgICAvLyBpdCdzIGEgcGx1Z2luLCBzbyBmaW5kIHRoZSBuZXN0ZWQgUHJvcFR3ZWVuXG4gICAgICAgIHB0ID0gcHQuZC5fcHQ7XG5cbiAgICAgICAgd2hpbGUgKHB0ICYmIHB0LnAgIT09IHByb3BlcnR5ICYmIHB0LmZwICE9PSBwcm9wZXJ0eSkge1xuICAgICAgICAgIC8vIFwiZnBcIiBpcyBmdW5jdGlvblBhcmFtIGZvciB0aGluZ3MgbGlrZSBzZXR0aW5nIENTUyB2YXJpYWJsZXMgd2hpY2ggcmVxdWlyZSAuc2V0UHJvcGVydHkoXCItLXZhci1uYW1lXCIsIHZhbHVlKVxuICAgICAgICAgIHB0ID0gcHQuX25leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFwdCkge1xuICAgICAgICAvLyB0aGVyZSBpcyBubyBQcm9wVHdlZW4gYXNzb2NpYXRlZCB3aXRoIHRoYXQgcHJvcGVydHksIHNvIHdlIG11c3QgRk9SQ0Ugb25lIHRvIGJlIGNyZWF0ZWQgYW5kIGRpdGNoIG91dCBvZiB0aGlzXG4gICAgICAgIC8vIGlmIHRoZSB0d2VlbiBoYXMgb3RoZXIgcHJvcGVydGllcyB0aGF0IGFscmVhZHkgcmVuZGVyZWQgYXQgbmV3IHBvc2l0aW9ucywgd2UnZCBub3JtYWxseSBoYXZlIHRvIHJld2luZCB0byBwdXQgdGhlbSBiYWNrIGxpa2UgdHdlZW4ucmVuZGVyKDAsIHRydWUpIGJlZm9yZSBmb3JjaW5nIGFuIF9pbml0VHdlZW4oKSwgYnV0IHRoYXQgY2FuIGNyZWF0ZSBhbm90aGVyIGVkZ2UgY2FzZSBsaWtlIHR3ZWVuaW5nIGEgdGltZWxpbmUncyBwcm9ncmVzcyB3b3VsZCB0cmlnZ2VyIG9uVXBkYXRlcyB0byBmaXJlIHdoaWNoIGNvdWxkIG1vdmUgb3RoZXIgdGhpbmdzIGFyb3VuZC4gSXQncyBiZXR0ZXIgdG8ganVzdCBpbmZvcm0gdXNlcnMgdGhhdCAucmVzZXRUbygpIHNob3VsZCBPTkxZIGJlIHVzZWQgZm9yIHR3ZWVucyB0aGF0IGFscmVhZHkgaGF2ZSB0aGF0IHByb3BlcnR5LiBGb3IgZXhhbXBsZSwgeW91IGNhbid0IGdzYXAudG8oLi4ueyB5OiAwIH0pIGFuZCB0aGVuIHR3ZWVuLnJlc3RUbyhcInhcIiwgMjAwKSBmb3IgZXhhbXBsZS5cbiAgICAgICAgX2ZvcmNlQWxsUHJvcFR3ZWVucyA9IDE7IC8vIG90aGVyd2lzZSwgd2hlbiB3ZSBfYWRkUHJvcFR3ZWVuKCkgYW5kIGl0IGZpbmRzIG5vIGNoYW5nZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgaXQgc2tpcHMgY3JlYXRpbmcgYSBQcm9wVHdlZW4gKGZvciBlZmZpY2llbmN5Li4ud2h5IHR3ZWVuIHdoZW4gdGhlcmUncyBubyBkaWZmZXJlbmNlPykgYnV0IGluIHRoaXMgY2FzZSB3ZSBORUVEIHRoYXQgUHJvcFR3ZWVuIGNyZWF0ZWQgc28gd2UgY2FuIGVkaXQgaXQuXG5cbiAgICAgICAgdHdlZW4udmFyc1twcm9wZXJ0eV0gPSBcIis9MFwiO1xuXG4gICAgICAgIF9pbml0VHdlZW4odHdlZW4sIHRpbWUpO1xuXG4gICAgICAgIF9mb3JjZUFsbFByb3BUd2VlbnMgPSAwO1xuICAgICAgICByZXR1cm4gc2tpcFJlY3Vyc2lvbiA/IF93YXJuKHByb3BlcnR5ICsgXCIgbm90IGVsaWdpYmxlIGZvciByZXNldC4gVHJ5IHNwbGl0dGluZyBpbnRvIGluZGl2aWR1YWwgcHJvcGVydGllc1wiKSA6IDE7IC8vIGlmIHNvbWVvbmUgdHJpZXMgdG8gZG8gYSBxdWlja1RvKCkgb24gYSBzcGVjaWFsIHByb3BlcnR5IGxpa2UgYm9yZGVyUmFkaXVzIHdoaWNoIG11c3QgZ2V0IHNwbGl0IGludG8gNCBkaWZmZXJlbnQgcHJvcGVydGllcywgdGhhdCdzIG5vdCBlbGlnaWJsZSBmb3IgLnJlc2V0VG8oKS5cbiAgICAgIH1cblxuICAgICAgcHRDYWNoZS5wdXNoKHB0KTtcbiAgICB9XG4gIH1cblxuICBpID0gcHRDYWNoZS5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHJvb3RQVCA9IHB0Q2FjaGVbaV07XG4gICAgcHQgPSByb290UFQuX3B0IHx8IHJvb3RQVDsgLy8gY29tcGxleCB2YWx1ZXMgbWF5IGhhdmUgbmVzdGVkIFByb3BUd2VlbnMuIFdlIG9ubHkgYWNjb21tb2RhdGUgdGhlIEZJUlNUIHZhbHVlLlxuXG4gICAgcHQucyA9IChzdGFydCB8fCBzdGFydCA9PT0gMCkgJiYgIXN0YXJ0SXNSZWxhdGl2ZSA/IHN0YXJ0IDogcHQucyArIChzdGFydCB8fCAwKSArIHJhdGlvICogcHQuYztcbiAgICBwdC5jID0gdmFsdWUgLSBwdC5zO1xuICAgIHJvb3RQVC5lICYmIChyb290UFQuZSA9IF9yb3VuZCh2YWx1ZSkgKyBnZXRVbml0KHJvb3RQVC5lKSk7IC8vIG1haW5seSBmb3IgQ1NTUGx1Z2luIChlbmQgdmFsdWUpXG5cbiAgICByb290UFQuYiAmJiAocm9vdFBULmIgPSBwdC5zICsgZ2V0VW5pdChyb290UFQuYikpOyAvLyAoYmVnaW5uaW5nIHZhbHVlKVxuICB9XG59LFxuICAgIF9hZGRBbGlhc2VzVG9WYXJzID0gZnVuY3Rpb24gX2FkZEFsaWFzZXNUb1ZhcnModGFyZ2V0cywgdmFycykge1xuICB2YXIgaGFybmVzcyA9IHRhcmdldHNbMF0gPyBfZ2V0Q2FjaGUodGFyZ2V0c1swXSkuaGFybmVzcyA6IDAsXG4gICAgICBwcm9wZXJ0eUFsaWFzZXMgPSBoYXJuZXNzICYmIGhhcm5lc3MuYWxpYXNlcyxcbiAgICAgIGNvcHksXG4gICAgICBwLFxuICAgICAgaSxcbiAgICAgIGFsaWFzZXM7XG5cbiAgaWYgKCFwcm9wZXJ0eUFsaWFzZXMpIHtcbiAgICByZXR1cm4gdmFycztcbiAgfVxuXG4gIGNvcHkgPSBfbWVyZ2Uoe30sIHZhcnMpO1xuXG4gIGZvciAocCBpbiBwcm9wZXJ0eUFsaWFzZXMpIHtcbiAgICBpZiAocCBpbiBjb3B5KSB7XG4gICAgICBhbGlhc2VzID0gcHJvcGVydHlBbGlhc2VzW3BdLnNwbGl0KFwiLFwiKTtcbiAgICAgIGkgPSBhbGlhc2VzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBjb3B5W2FsaWFzZXNbaV1dID0gY29weVtwXTtcbiAgICAgIH1cbiAgICB9XG4gI
12666H1cblxuICByZXR1cm4gY29weTtcbn0sXG4gICAgLy8gcGFyc2VzIG11bHRpcGxlIGZvcm1hdHMsIGxpa2Uge1wiMCVcIjoge3g6IDEwMH0sIHtcIjUwJVwiOiB7eDogLTIwfX0gYW5kIHsgeDoge1wiMCVcIjogMTAwLCBcIjUwJVwiOiAtMjB9IH0sIGFuZCBhbiBcImVhc2VcIiBjYW4gYmUgc2V0IG9uIGFueSBvYmplY3QuIFdlIHBvcHVsYXRlIGFuIFwiYWxsUHJvcHNcIiBvYmplY3Qgd2l0aCBhbiBBcnJheSBmb3IgZWFjaCBwcm9wZXJ0eSwgbGlrZSB7eDogW3t9LCB7fV0sIHk6W3t9LCB7fV19IHdpdGggZGF0YSBmb3IgZWFjaCBwcm9wZXJ0eSB0d2Vlbi4gVGhlIG9iamVjdHMgaGF2ZSBhIFwidFwiICh0aW1lKSwgXCJ2XCIsICh2YWx1ZSksIGFuZCBcImVcIiAoZWFzZSkgcHJvcGVydHkuIFRoaXMgYWxsb3dzIHVzIHRvIHBpZWNlIHRvZ2V0aGVyIGEgdGltZWxpbmUgbGF0ZXIuXG5fcGFyc2VLZXlmcmFtZSA9IGZ1bmN0aW9uIF9wYXJzZUtleWZyYW1lKHByb3AsIG9iaiwgYWxsUHJvcHMsIGVhc2VFYWNoKSB7XG4gIHZhciBlYXNlID0gb2JqLmVhc2UgfHwgZWFzZUVhY2ggfHwgXCJwb3dlcjEuaW5PdXRcIixcbiAgICAgIHAsXG4gICAgICBhO1xuXG4gIGlmIChfaXNBcnJheShvYmopKSB7XG4gICAgYSA9IGFsbFByb3BzW3Byb3BdIHx8IChhbGxQcm9wc1twcm9wXSA9IFtdKTsgLy8gdCA9IHRpbWUgKG91dCBvZiAxMDApLCB2ID0gdmFsdWUsIGUgPSBlYXNlXG5cbiAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgIHJldHVybiBhLnB1c2goe1xuICAgICAgICB0OiBpIC8gKG9iai5sZW5ndGggLSAxKSAqIDEwMCxcbiAgICAgICAgdjogdmFsdWUsXG4gICAgICAgIGU6IGVhc2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZvciAocCBpbiBvYmopIHtcbiAgICAgIGEgPSBhbGxQcm9wc1twXSB8fCAoYWxsUHJvcHNbcF0gPSBbXSk7XG4gICAgICBwID09PSBcImVhc2VcIiB8fCBhLnB1c2goe1xuICAgICAgICB0OiBwYXJzZUZsb2F0KHByb3ApLFxuICAgICAgICB2OiBvYmpbcF0sXG4gICAgICAgIGU6IGVhc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSxcbiAgICBfcGFyc2VGdW5jT3JTdHJpbmcgPSBmdW5jdGlvbiBfcGFyc2VGdW5jT3JTdHJpbmcodmFsdWUsIHR3ZWVuLCBpLCB0YXJnZXQsIHRhcmdldHMpIHtcbiAgcmV0dXJuIF9pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwodHdlZW4sIGksIHRhcmdldCwgdGFyZ2V0cykgOiBfaXNTdHJpbmcodmFsdWUpICYmIH52YWx1ZS5pbmRleE9mKFwicmFuZG9tKFwiKSA/IF9yZXBsYWNlUmFuZG9tKHZhbHVlKSA6IHZhbHVlO1xufSxcbiAgICBfc3RhZ2dlclR3ZWVuUHJvcHMgPSBfY2FsbGJhY2tOYW1lcyArIFwicmVwZWF0LHJlcGVhdERlbGF5LHlveW8scmVwZWF0UmVmcmVzaCx5b3lvRWFzZSxlYXNlUmV2ZXJzZSxhdXRvUmV2ZXJ0XCIsXG4gICAgX3N0YWdnZXJQcm9wc1RvU2tpcCA9IHt9O1xuXG5fZm9yRWFjaE5hbWUoX3N0YWdnZXJUd2VlblByb3BzICsgXCIsaWQsc3RhZ2dlcixkZWxheSxkdXJhdGlvbixwYXVzZWQsc2Nyb2xsVHJpZ2dlclwiLCBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gX3N0YWdnZXJQcm9wc1RvU2tpcFtuYW1lXSA9IDE7XG59KTtcbi8qXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVFdFRU5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG5leHBvcnQgdmFyIFR3ZWVuID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5pbWF0aW9uMikge1xuICBfaW5oZXJpdHNMb29zZShUd2VlbiwgX0FuaW1hdGlvbjIpO1xuXG4gIGZ1bmN0aW9uIFR3ZWVuKHRhcmdldHMsIHZhcnMsIHBvc2l0aW9uLCBza2lwSW5oZXJpdCkge1xuICAgIHZhciBfdGhpczM7XG5cbiAgICBpZiAodHlwZW9mIHZhcnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHBvc2l0aW9uLmR1cmF0aW9uID0gdmFycztcbiAgICAgIHZhcnMgPSBwb3NpdGlvbjtcbiAgICAgIHBvc2l0aW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICBfdGhpczMgPSBfQW5pbWF0aW9uMi5jYWxsKHRoaXMsIHNraXBJbmhlcml0ID8gdmFycyA6IF9pbmhlcml0RGVmYXVsdHModmFycykpIHx8IHRoaXM7XG4gICAgdmFyIF90aGlzMyR2YXJzID0gX3RoaXMzLnZhcnMsXG4gICAgICAgIGR1cmF0aW9uID0gX3RoaXMzJHZhcnMuZHVyYXRpb24sXG4gICAgICAgIGRlbGF5ID0gX3RoaXMzJHZhcnMuZGVsYXksXG4gICAgICAgIGltbWVkaWF0ZVJlbmRlciA9IF90aGlzMyR2YXJzLmltbWVkaWF0ZVJlbmRlcixcbiAgICAgICAgc3RhZ2dlciA9IF90aGlzMyR2YXJzLnN0YWdnZXIsXG4gICAgICAgIG92ZXJ3cml0ZSA9IF90aGlzMyR2YXJzLm92ZXJ3cml0ZSxcbiAgICAgICAga2V5ZnJhbWVzID0gX3RoaXMzJHZhcnMua2V5ZnJhbWVzLFxuICAgICAgICBkZWZhdWx0cyA9IF90aGlzMyR2YXJzLmRlZmF1bHRzLFxuICAgICAgICBzY3JvbGxUcmlnZ2VyID0gX3RoaXMzJHZhcnMuc2Nyb2xsVHJpZ2dlcixcbiAgICAgICAgcGFyZW50ID0gdmFycy5wYXJlbnQgfHwgX2dsb2JhbFRpbWVsaW5lLFxuICAgICAgICBwYXJzZWRUYXJnZXRzID0gKF9pc0FycmF5KHRhcmdldHMpIHx8IF9pc1R5cGVkQXJyYXkodGFyZ2V0cykgPyBfaXNOdW1iZXIodGFyZ2V0c1swXSkgOiBcImxlbmd0aFwiIGluIHZhcnMpID8gW3RhcmdldHNdIDogdG9BcnJheSh0YXJnZXRzKSxcbiAgICAgICAgdGwsXG4gICAgICAgIGksXG4gICAgICAgIGNvcHksXG4gICAgICAgIGwsXG4gICAgICAgIHAsXG4gICAgICAgIGN1clRhcmdldCxcbiAgICAgICAgc3RhZ2dlckZ1bmMsXG4gICAgICAgIHN0YWdnZXJWYXJzVG9NZXJnZTtcbiAgICBfdGhpczMuX3RhcmdldHMgPSBwYXJzZWRUYXJnZXRzLmxlbmd0aCA/IF9oYXJuZXNzKHBhcnNlZFRhcmdldHMpIDogX3dhcm4oXCJHU0FQIHRhcmdldCBcIiArIHRhcmdldHMgKyBcIiBub3QgZm91bmQuIGh0dHBzOi8vZ3NhcC5jb21cIiwgIV9jb25maWcubnVsbFRhcmdldFdhcm4pIHx8IFtdO1xuICAgIF90aGlzMy5fcHRMb29rdXAgPSBbXTsgLy9Qcm9wVHdlZW4gbG9va3VwLiBBbiBhcnJheSBjb250YWluaW5nIGFuIG9iamVjdCBmb3IgZWFjaCB0YXJnZXQsIGhhdmluZyBrZXlzIGZvciBlYWNoIHR3ZWVuaW5nIHByb3BlcnR5XG5cbiAgICBfdGhpczMuX292ZXJ3cml0ZSA9IG92ZXJ3cml0ZTtcblxuICAgIGlmIChrZXlmcmFtZXMgfHwgc3RhZ2dlciB8fCBfaXNGdW5jT3JTdHJpbmc
12666oZHVyYXRpb24pIHx8IF9pc0Z1bmNPclN0cmluZyhkZWxheSkpIHtcbiAgICAgIHZhcnMgPSBfdGhpczMudmFycztcbiAgICAgIHZhciBlYXNlUmV2ZXJzZSA9IHZhcnMuZWFzZVJldmVyc2UgfHwgdmFycy55b3lvRWFzZTtcbiAgICAgIHRsID0gX3RoaXMzLnRpbWVsaW5lID0gbmV3IFRpbWVsaW5lKHtcbiAgICAgICAgZGF0YTogXCJuZXN0ZWRcIixcbiAgICAgICAgZGVmYXVsdHM6IGRlZmF1bHRzIHx8IHt9LFxuICAgICAgICB0YXJnZXRzOiBwYXJlbnQgJiYgcGFyZW50LmRhdGEgPT09IFwibmVzdGVkXCIgPyBwYXJlbnQudmFycy50YXJnZXRzIDogcGFyc2VkVGFyZ2V0c1xuICAgICAgfSk7IC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIHRhcmdldHMgYmVjYXVzZSBmb3Igc3RhZ2dlcnMgYW5kIGtleWZyYW1lcywgd2UgZW5kIHVwIGNyZWF0aW5nIGFuIGluZGl2aWR1YWwgdHdlZW4gZm9yIGVhY2ggYnV0IGZ1bmN0aW9uLWJhc2VkIHZhbHVlcyBuZWVkIHRvIGtub3cgdGhlIGluZGV4IGFuZCB0aGUgd2hvbGUgQXJyYXkgb2YgdGFyZ2V0cy5cblxuICAgICAgdGwua2lsbCgpO1xuICAgICAgdGwucGFyZW50ID0gdGwuX2RwID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpO1xuICAgICAgdGwuX3N0YXJ0ID0gMDtcblxuICAgICAgaWYgKHN0YWdnZXIgfHwgX2lzRnVuY09yU3RyaW5nKGR1cmF0aW9uKSB8fCBfaXNGdW5jT3JTdHJpbmcoZGVsYXkpKSB7XG4gICAgICAgIGwgPSBwYXJzZWRUYXJnZXRzLmxlbmd0aDtcbiAgICAgICAgc3RhZ2dlckZ1bmMgPSBzdGFnZ2VyICYmIGRpc3RyaWJ1dGUoc3RhZ2dlcik7XG5cbiAgICAgICAgaWYgKF9pc09iamVjdChzdGFnZ2VyKSkge1xuICAgICAgICAgIC8vdXNlcnMgY2FuIHBhc3MgaW4gY2FsbGJhY2tzIGxpa2Ugb25TdGFydC9vbkNvbXBsZXRlIGluIHRoZSBzdGFnZ2VyIG9iamVjdC4gVGhlc2Ugc2hvdWxkIGZpcmUgd2l0aCBlYWNoIGluZGl2aWR1YWwgdHdlZW4uXG4gICAgICAgICAgZm9yIChwIGluIHN0YWdnZXIpIHtcbiAgICAgICAgICAgIGlmICh+X3N0YWdnZXJUd2VlblByb3BzLmluZGV4T2YocCkpIHtcbiAgICAgICAgICAgICAgc3RhZ2dlclZhcnNUb01lcmdlIHx8IChzdGFnZ2VyVmFyc1RvTWVyZ2UgPSB7fSk7XG4gICAgICAgICAgICAgIHN0YWdnZXJWYXJzVG9NZXJnZVtwXSA9IHN0YWdnZXJbcF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGNvcHkgPSBfY29weUV4Y2x1ZGluZyh2YXJzLCBfc3RhZ2dlclByb3BzVG9Ta2lwKTtcbiAgICAgICAgICBjb3B5LnN0YWdnZXIgPSAwO1xuICAgICAgICAgIGVhc2VSZXZlcnNlICYmIChjb3B5LmVhc2VSZXZlcnNlID0gZWFzZVJldmVyc2UpO1xuICAgICAgICAgIHN0YWdnZXJWYXJzVG9NZXJnZSAmJiBfbWVyZ2UoY29weSwgc3RhZ2dlclZhcnNUb01lcmdlKTtcbiAgICAgICAgICBjdXJUYXJnZXQgPSBwYXJzZWRUYXJnZXRzW2ldOyAvL2Rvbid0IGp1c3QgY29weSBkdXJhdGlvbiBvciBkZWxheSBiZWNhdXNlIGlmIHRoZXkncmUgYSBzdHJpbmcgb3IgZnVuY3Rpb24sIHdlJ2QgZW5kIHVwIGluIGFuIGluZmluaXRlIGxvb3AgYmVjYXVzZSBfaXNGdW5jT3JTdHJpbmcoKSB3b3VsZCBldmFsdWF0ZSBhcyB0cnVlIGluIHRoZSBjaGlsZCB0d2VlbnMsIGVudGVyaW5nIHRoaXMgbG9vcCwgZXRjLiBTbyB3ZSBwYXJzZSB0aGUgdmFsdWUgc3RyYWlnaHQgZnJvbSB2YXJzIGFuZCBkZWZhdWx0IHRvIDAuXG5cbiAgICAgICAgICBjb3B5LmR1cmF0aW9uID0gK19wYXJzZUZ1bmNPclN0cmluZyhkdXJhdGlvbiwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpLCBpLCBjdXJUYXJnZXQsIHBhcnNlZFRhcmdldHMpO1xuICAgICAgICAgIGNvcHkuZGVsYXkgPSAoK19wYXJzZUZ1bmNPclN0cmluZyhkZWxheSwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpLCBpLCBjdXJUYXJnZXQsIHBhcnNlZFRhcmdldHMpIHx8IDApIC0gX3RoaXMzLl9kZWxheTtcblxuICAgICAgICAgIGlmICghc3RhZ2dlciAmJiBsID09PSAxICYmIGNvcHkuZGVsYXkpIHtcbiAgICAgICAgICAgIC8vIGlmIHNvbWVvbmUgZG9lcyBkZWxheTpcInJhbmRvbSgxLCA1KVwiLCByZXBlYXQ6LTEsIGZvciBleGFtcGxlLCB0aGUgZGVsYXkgc2hvdWxkbid0IGJlIGluc2lkZSB0aGUgcmVwZWF0LlxuICAgICAgICAgICAgX3RoaXMzLl9kZWxheSA9IGRlbGF5ID0gY29weS5kZWxheTtcbiAgICAgICAgICAgIF90aGlzMy5fc3RhcnQgKz0gZGVsYXk7XG4gICAgICAgICAgICBjb3B5LmRlbGF5ID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0bC50byhjdXJUYXJnZXQsIGNvcHksIHN0YWdnZXJGdW5jID8gc3RhZ2dlckZ1bmMoaSwgY3VyVGFyZ2V0LCBwYXJzZWRUYXJnZXRzKSA6IDApO1xuICAgICAgICAgIHRsLl9lYXNlID0gX2Vhc2VNYXAubm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRsLmR1cmF0aW9uKCkgPyBkdXJhdGlvbiA9IGRlbGF5ID0gMCA6IF90aGlzMy50aW1lbGluZSA9IDA7IC8vIGlmIHRoZSB0aW1lbGluZSdzIGR1cmF0aW9uIGlzIDAsIHdlIGRvbid0IG5lZWQgYSB0aW1lbGluZSBpbnRlcm5hbGx5IVxuICAgICAgfSBlbHNlIGlmIChrZXlmcmFtZXMpIHtcbiAgICAgICAgX2luaGVyaXREZWZhdWx0cyhfc2V0RGVmYXVsdHModGwudmFycy5kZWZhdWx0cywge1xuICAgICAgICAgIGVhc2U6IFwibm9uZVwiXG4gICAgICAgIH0pKTtcblxuICAgICAgICB0bC5fZWFzZSA9IF9wYXJzZUVhc2Uoa2V5ZnJhbWVzLmVhc2UgfHwgdmFycy5lYXNlIHx8IFwibm9uZVwiKTtcbiAgICAgICAgdmFyIHRpbWUgPSAwLFxuICAgICAgICAgICAgYSxcbiAgICAgICAgICAgIGtmLFxuICAgICAgICAgICAgdjtcblxuICAgICAgICBpZiAoX2lzQXJyYXkoa2V5ZnJhbWVzKSkge1xuICAgICAgICAgIGtleWZyYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChmcmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRsLnRvKHBhcnNlZFRhcmdldHMsIGZyYW1lLCBcIj5cIik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGwuZHVyYXRpb24oKTsgLy8gdG8gZW5zdXJlIHRsLl9kdXIgaXMgY2FjaGVkIGJlY2F1c2Ugd2UgdGFwIGludG8gaXQgZm9yIHBlcmZvcm1hbmNlIHB1cnBvc2VzIGluIHRoZSByZW5kZXIoKSBtZXRob2QuXG4gICAgICAgI
12666H0gZWxzZSB7XG4gICAgICAgICAgY29weSA9IHt9O1xuXG4gICAgICAgICAgZm9yIChwIGluIGtleWZyYW1lcykge1xuICAgICAgICAgICAgcCA9PT0gXCJlYXNlXCIgfHwgcCA9PT0gXCJlYXNlRWFjaFwiIHx8IF9wYXJzZUtleWZyYW1lKHAsIGtleWZyYW1lc1twXSwgY29weSwga2V5ZnJhbWVzLmVhc2VFYWNoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHAgaW4gY29weSkge1xuICAgICAgICAgICAgYSA9IGNvcHlbcF0uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICByZXR1cm4gYS50IC0gYi50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aW1lID0gMDtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAga2YgPSBhW2ldO1xuICAgICAgICAgICAgICB2ID0ge1xuICAgICAgICAgICAgICAgIGVhc2U6IGtmLmUsXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IChrZi50IC0gKGkgPyBhW2kgLSAxXS50IDogMCkpIC8gMTAwICogZHVyYXRpb25cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdltwXSA9IGtmLnY7XG4gICAgICAgICAgICAgIHRsLnRvKHBhcnNlZFRhcmdldHMsIHYsIHRpbWUpO1xuICAgICAgICAgICAgICB0aW1lICs9IHYuZHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGwuZHVyYXRpb24oKSA8IGR1cmF0aW9uICYmIHRsLnRvKHt9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gLSB0bC5kdXJhdGlvbigpXG4gICAgICAgICAgfSk7IC8vIGluIGNhc2Uga2V5ZnJhbWVzIGRpZG4ndCBnbyB0byAxMDAlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHVyYXRpb24gfHwgX3RoaXMzLmR1cmF0aW9uKGR1cmF0aW9uID0gdGwuZHVyYXRpb24oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMy50aW1lbGluZSA9IDA7IC8vc3BlZWQgb3B0aW1pemF0aW9uLCBmYXN0ZXIgbG9va3VwcyAobm8gZ29pbmcgdXAgdGhlIHByb3RvdHlwZSBjaGFpbilcbiAgICB9XG5cbiAgICBpZiAob3ZlcndyaXRlID09PSB0cnVlICYmICFfc3VwcHJlc3NPdmVyd3JpdGVzKSB7XG4gICAgICBfb3ZlcndyaXRpbmdUd2VlbiA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMzKTtcblxuICAgICAgX2dsb2JhbFRpbWVsaW5lLmtpbGxUd2VlbnNPZihwYXJzZWRUYXJnZXRzKTtcblxuICAgICAgX292ZXJ3cml0aW5nVHdlZW4gPSAwO1xuICAgIH1cblxuICAgIF9hZGRUb1RpbWVsaW5lKHBhcmVudCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpLCBwb3NpdGlvbik7XG5cbiAgICB2YXJzLnJldmVyc2VkICYmIF90aGlzMy5yZXZlcnNlKCk7XG4gICAgdmFycy5wYXVzZWQgJiYgX3RoaXMzLnBhdXNlZCh0cnVlKTtcblxuICAgIGlmIChpbW1lZGlhdGVSZW5kZXIgfHwgIWR1cmF0aW9uICYmICFrZXlmcmFtZXMgJiYgX3RoaXMzLl9zdGFydCA9PT0gX3JvdW5kUHJlY2lzZShwYXJlbnQuX3RpbWUpICYmIF9pc05vdEZhbHNlKGltbWVkaWF0ZVJlbmRlcikgJiYgX2hhc05vUGF1c2VkQW5jZXN0b3JzKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMzKSkgJiYgcGFyZW50LmRhdGEgIT09IFwibmVzdGVkXCIpIHtcbiAgICAgIF90aGlzMy5fdFRpbWUgPSAtX3RpbnlOdW07IC8vZm9yY2VzIGEgcmVuZGVyIHdpdGhvdXQgaGF2aW5nIHRvIHNldCB0aGUgcmVuZGVyKCkgXCJmb3JjZVwiIHBhcmFtZXRlciB0byB0cnVlIGJlY2F1c2Ugd2Ugd2FudCB0byBhbGxvdyBsYXp5aW5nIGJ5IGRlZmF1bHQgKHVzaW5nIHRoZSBcImZvcmNlXCIgcGFyYW1ldGVyIGFsd2F5cyBmb3JjZXMgYW4gaW1tZWRpYXRlIGZ1bGwgcmVuZGVyKVxuXG4gICAgICBfdGhpczMucmVuZGVyKE1hdGgubWF4KDAsIC1kZWxheSkgfHwgMCk7IC8vaW4gY2FzZSBkZWxheSBpcyBuZWdhdGl2ZVxuXG4gICAgfVxuXG4gICAgc2Nyb2xsVHJpZ2dlciAmJiBfc2Nyb2xsVHJpZ2dlcihfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzMyksIHNjcm9sbFRyaWdnZXIpO1xuICAgIHJldHVybiBfdGhpczM7XG4gIH1cblxuICB2YXIgX3Byb3RvMyA9IFR3ZWVuLnByb3RvdHlwZTtcblxuICBfcHJvdG8zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcih0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkge1xuICAgIHZhciBwcmV2VGltZSA9IHRoaXMuX3RpbWUsXG4gICAgICAgIHREdXIgPSB0aGlzLl90RHVyLFxuICAgICAgICBkdXIgPSB0aGlzLl9kdXIsXG4gICAgICAgIGlzTmVnYXRpdmUgPSB0b3RhbFRpbWUgPCAwLFxuICAgICAgICB0VGltZSA9IHRvdGFsVGltZSA+IHREdXIgLSBfdGlueU51bSAmJiAhaXNOZWdhdGl2ZSA/IHREdXIgOiB0b3RhbFRpbWUgPCBfdGlueU51bSA/IDAgOiB0b3RhbFRpbWUsXG4gICAgICAgIHRpbWUsXG4gICAgICAgIHB0LFxuICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgIGN5Y2xlRHVyYXRpb24sXG4gICAgICAgIHByZXZJdGVyYXRpb24sXG4gICAgICAgIGlzWW95byxcbiAgICAgICAgcmF0aW8sXG4gICAgICAgIHRpbWVsaW5lO1xuXG4gICAgaWYgKCFkdXIpIHtcbiAgICAgIF9yZW5kZXJaZXJvRHVyYXRpb25Ud2Vlbih0aGlzLCB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG4gICAgfSBlbHNlIGlmICh0VGltZSAhPT0gdGhpcy5fdFRpbWUgfHwgIXRvdGFsVGltZSB8fCBmb3JjZSB8fCAhdGhpcy5faW5pdHRlZCAmJiB0aGlzLl90VGltZSB8fCB0aGlzLl9zdGFydEF0ICYmIHRoaXMuX3pUaW1lIDwgMCAhPT0gaXNOZWdhdGl2ZSB8fCB0aGlzLl9sYXp5KSB7XG4gICAgICAvLyB0aGlzIHNlbnNlcyBpZiB3ZSdyZSBjcm9zc2luZyBvdmVyIHRoZSBzdGFydCB0aW1lLCBpbiB3aGljaCBjYXNlIHdlIG11c3QgcmVjb3JkIF96VGltZSBhbmQgZm9yY2UgdGhlIHJlbmRlciwgYnV0IHdlIGRvIGl0IGluIHRoaXMgbGVuZ3RoeSBjb25kaXRpb25hbCB3YXkgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKHVzdWFsbHkgd2UgY2FuIHNraXAgdGhlIGNhbGN1bGF0aW9ucyk6IHRoaXMuX2luaXR0ZWQgJiYgKHRoaXMuX3pUaW1lIDwgMCkgIT09ICh0b3RhbFRpbWUgPCAwKVxuICAgICAgdGltZSA9IHRUaW1lO1xuICAgICAgdGltZWxpbmUgPSB0aGlzLnRpbWVsaW5lO1xuXG4gICAgICBpZiAodGhpcy5fcmVwZWF0KSB7XG4gICAgICAgIC8vYWRqdXN0IHRoZSB0aW1lIGZvciByZXBlYXRzIGFuZCB5b3lvc1xuICAgICAgICBjeWNsZUR1cmF0aW9uID0gZHVyICsgdGh
12666pcy5fckRlbGF5O1xuXG4gICAgICAgIGlmICh0aGlzLl9yZXBlYXQgPCAtMSAmJiBpc05lZ2F0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxUaW1lKGN5Y2xlRHVyYXRpb24gKiAxMDAgKyB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lID0gX3JvdW5kUHJlY2lzZSh0VGltZSAlIGN5Y2xlRHVyYXRpb24pOyAvL3JvdW5kIHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IGVycm9ycy4gKDQgJSAwLjggc2hvdWxkIGJlIDAgYnV0IHNvbWUgYnJvd3NlcnMgcmVwb3J0IGl0IGFzIDAuNzk5OTk5OTkhKVxuXG4gICAgICAgIGlmICh0VGltZSA9PT0gdER1cikge1xuICAgICAgICAgIC8vIHRoZSB0RHVyID09PSB0VGltZSBpcyBmb3IgZWRnZSBjYXNlcyB3aGVyZSB0aGVyZSdzIGEgbGVuZ3RoeSBkZWNpbWFsIG9uIHRoZSBkdXJhdGlvbiBhbmQgaXQgbWF5IHJlYWNoIHRoZSB2ZXJ5IGVuZCBidXQgdGhlIHRpbWUgaXMgcmVuZGVyZWQgYXMgbm90LXF1aXRlLXRoZXJlIChyZW1lbWJlciwgdER1ciBpcyByb3VuZGVkIHRvIDQgZGVjaW1hbHMgd2hlcmVhcyBkdXIgaXNuJ3QpXG4gICAgICAgICAgaXRlcmF0aW9uID0gdGhpcy5fcmVwZWF0O1xuICAgICAgICAgIHRpbWUgPSBkdXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldkl0ZXJhdGlvbiA9IF9yb3VuZFByZWNpc2UodFRpbWUgLyBjeWNsZUR1cmF0aW9uKTsgLy8gZnVsbCBkZWNpbWFsIHZlcnNpb24gb2YgaXRlcmF0aW9ucywgbm90IHRoZSBwcmV2aW91cyBpdGVyYXRpb24gKHdlJ3JlIHJldXN
12666pbmcgcHJldkl0ZXJhdGlvbiB2YXJpYWJsZSBmb3IgZWZmaWNpZW5jeSlcblxuICAgICAgICAgIGl0ZXJhdGlvbiA9IH5+cHJldkl0ZXJhdGlvbjtcblxuICAgICAgICAgIGlmIChpdGVyYXRpb24gJiYgaXRlcmF0aW9uID09PSBwcmV2SXRlcmF0aW9uKSB7XG4gICAgICAgICAgICB0aW1lID0gZHVyO1xuICAgICAgICAgICAgaXRlcmF0aW9uLS07XG4gICAgICAgICAgfSBlbHNlIGlmICh0aW1lID4gZHVyKSB7XG4gICAgICAgICAgICB0aW1lID0gZHVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlzWW95byA9IHRoaXMuX3lveW8gJiYgaXRlcmF0aW9uICYgMTtcbiAgICAgICAgaWYgKGlzWW95bykgdGltZSA9IGR1ciAtIHRpbWU7XG4gICAgICAgIHByZXZJdGVyYXRpb24gPSBfYW5pbWF0aW9uQ3ljbGUodGhpcy5fdFRpbWUsIGN5Y2xlRHVyYXRpb24pO1xuXG4gICAgICAgIGlmICh0aW1lID09PSBwcmV2VGltZSAmJiAhZm9yY2UgJiYgdGhpcy5faW5pdHRlZCAmJiBpdGVyYXRpb24gPT09IHByZXZJdGVyYXRpb24pIHtcbiAgICAgICAgICAvL2NvdWxkIGJlIGR1cmluZyB0aGUgcmVwZWF0RGVsYXkgcGFydC4gTm8gbmVlZCB0byByZW5kZXIgYW5kIGZpcmUgY2FsbGJhY2tzLlxuICAgICAgICAgIHRoaXMuX3RUaW1lID0gdFRpbWU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlcmF0aW9uICE9PSBwcmV2SXRlcmF0aW9uKSB7XG4gICAgICAgICAgLy9yZXBlYXRSZWZyZXNoIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgICBpZiAodGhpcy52YXJzLnJlcGVhdFJlZnJlc2ggJiYgIWlzWW95byAmJiAhdGhpcy5fbG9jayAmJiB0aW1lICE9PSBjeWNsZUR1cmF0aW9uICYmIHRoaXMuX2luaXR0ZWQpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuX3RpbWUgd2lsbCA9PT0gY3ljbGVEdXJhdGlvbiB3aGVuIHdlIHJlbmRlciBhdCBFWEFDVExZIHRoZSBlbmQgb2YgYW4gaXRlcmF0aW9uLiBXaXRob3V0IHRoaXMgY29uZGl0aW9uLCBpdCdkIG9mdGVuIGRvIHRoZSByZXBlYXRSZWZyZXNoIHJlbmRlciBUV0lDRSAoYWdhaW4gb24gdGhlIHZlcnkgbmV4dCB0aWNrKS5cbiAgICAgICAgICAgIHRoaXMuX2xvY2sgPSBmb3JjZSA9IDE7IC8vZm9yY2UsIG90aGVyd2lzZSBpZiBsYXp5IGlzIHRydWUsIHRoZSBfYXR0ZW1wdEluaXRUd2VlbigpIHdpbGwgcmV0dXJuIGFuZCB3ZSdsbCBqdW1wIG91dCBhbmQgZ2V0IGNhdWdodCBib3VuY2luZyBvbiBlYWNoIHRpY2suXG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyKF9yb3VuZFByZWNpc2UoY3ljbGVEdXJhdGlvbiAqIGl0ZXJhdGlvbiksIHRydWUpLmludmFsaWRhdGUoKS5fbG9jayA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faW5pdHRlZCkge1xuICAgICAgICBpZiAoX2F0dGVtcHRJbml0VHdlZW4odGhpcywgaXNOZWdhdGl2ZSA/IHRvdGFsVGltZSA6IHRpbWUsIGZvcmNlLCBzdXBwcmVzc0V2ZW50cywgdFRpbWUpKSB7XG4gICAgICAgICAgdGhpcy5fdFRpbWUgPSAwOyAvLyBpbiBjb25zdHJ1Y3RvciBpZiBpbW1lZGlhdGVSZW5kZXIgaXMgdHJ1ZSwgd2Ugc2V0IF90VGltZSB0byAtX3RpbnlOdW0gdG8gaGF2ZSB0aGUgcGxheWhlYWQgY3Jvc3MgdGhlIHN0YXJ0aW5nIHBvaW50IGJ1dCB3ZSBjYW4ndCBsZWF2ZSBfdFRpbWUgYXMgYSBuZWdhdGl2ZSBudW1iZXIuXG5cbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2VGltZSAhPT0gdGhpcy5fdGltZSAmJiAhKGZvcmNlICYmIHRoaXMudmFycy5yZXBlYXRSZWZyZXNoICYmIGl0ZXJhdGlvbiAhPT0gcHJldkl0ZXJhdGlvbikpIHtcbiAgICAgICAgICAvLyByYXJlIGVkZ2UgY2FzZSAtIGR1cmluZyBpbml0aWFsaXphdGlvbiwgYW4gb25VcGRhdGUgaW4gdGhlIF9zdGFydEF0ICguZnJvbVRvKCkpIG1pZ2h0IGZvcmNlIHRoaXMgdHdlZW4gdG8gcmVuZGVyIGF0IGEgZGlmZmVyZW50IHNwb3QgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgZGl0Y2ggdGhpcyByZW5kZXIoKSBjYWxsIHNvIHRoYXQgaXQgZG9lc24ndCByZXZlcnQgdGhlIHZhbHVlcy4gQnV0IHdlIGFsc28gZG9uJ3Qgd2FudCB0byBkdW1wIGlmIHdlJ3JlIGRvaW5nIGEgcmVwZWF0UmVmcmVzaCByZW5kZXIhXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHVyICE9PSB0aGlzLl9kdXIpIHtcbiAgICAgICAgICAvLyB3aGlsZSBpbml0dGluZywgYSBwbHVnaW4gbGlrZSBJbmVydGlhUGx1Z2luIG1pZ2h0IGFsdGVyIHRoZSBkdXJhdGlvbiwgc28gcmVydW4gZnJvbSB0aGUgc3RhcnQgdG8gZW5zdXJlIGV2ZXJ5dGhpbmcgcmVuZGVycyBhcyBpdCBzaG91bGQuXG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fckVhc2UpIHtcbiAgICAgICAgdmFyIGludiA9IHRpbWUgPCBwcmV2VGltZTtcblxuICAgICAgICBpZiAoaW52ICE9PSB0aGlzLl9pbnYpIHtcbiAgICAgICAgICB2Y
12666XIgc2VnRHVyID0gaW52ID8gcHJldlRpbWUgOiBkdXIgLSBwcmV2VGltZTtcbiAgICAgICAgICB0aGlzLl9pbnYgPSBpbnY7XG4gICAgICAgICAgaWYgKHRoaXMuX2Zyb20pIHRoaXMucmF0aW8gPSAxIC0gdGhpcy5yYXRpbztcbiAgICAgICAgICB0aGlzLl9pbnZSYXRpbyA9IHRoaXMucmF0aW87XG4gICAgICAgICAgdGhpcy5faW52VGltZSA9IHByZXZUaW1lO1xuICAgICAgICAgIHRoaXMuX2ludlJlY2lwID0gc2VnRHVyID8gKGludiA/IC0xIDogMSkgLyBzZWdEdXIgOiAwO1xuICAgICAgICAgIHRoaXMuX2ludlNjYWxlID0gaW52ID8gLXRoaXMucmF0aW8gOiAxIC0gdGhpcy5yYXRpbztcbiAgICAgICAgICB0aGlzLl9pbnZFYXNlID0gaW52ID8gdGhpcy5fckVhc2UgOiB0aGlzLl9lYXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yYXRpbyA9IHJhdGlvID0gdGhpcy5faW52UmF0aW8gKyB0aGlzLl9pbnZTY2FsZSAqIHRoaXMuX2ludkVhc2UoKHRpbWUgLSB0aGlzLl9pbnZUaW1lKSAqIHRoaXMuX2ludlJlY2lwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmF0aW8gPSByYXRpbyA9IHRoaXMuX2Vhc2UodGltZSAvIGR1cik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9mcm9tKSB0aGlzLnJhdGlvID0gcmF0aW8gPSAxIC0gcmF0aW87XG4gICAgICB0aGlzLl90VGltZSA9IHRUaW1lO1xuICAgICAgdGhpcy5fdGltZSA9IHRpbWU7XG5cbiAgICAgIGlmICghdGhpcy5fYWN0ICYmIHRoaXMuX3RzKSB7XG4gICAgICAgIHRoaXMuX2FjdCA9IDE7IC8vYXMgbG9uZyBhcyBpdCdzIG5vdCBwYXVzZWQsIGZvcmNlIGl0IHRvIGJlIGFjdGl2ZSBzbyB0aGF0IGlmIHRoZSB1c2VyIHJlbmRlcnMgaW5kZXBlbmRlbnQgb2YgdGhlIHBhcmVudCB0aW1lbGluZSwgaXQnbGwgYmUgZm9yY2VkIHRvIHJlLXJlbmRlciBvbiB0aGUgbmV4dCB0aWNrLlxuXG4gICAgICAgIHRoaXMuX2xhenkgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByZXZUaW1lICYmIHRUaW1lICYmICFzdXBwcmVzc0V2ZW50cyAmJiAhcHJldkl0ZXJhdGlvbikge1xuICAgICAgICBfY2FsbGJhY2sodGhpcywgXCJvblN0YXJ0XCIpO1xuXG4gICAgICAgIGlmICh0aGlzLl90VGltZSAhPT0gdFRpbWUpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIHRoZSBvblN0YXJ0IHRyaWdnZXJlZCBhIHJlbmRlciBhdCBhIGRpZmZlcmVudCBzcG90LCBlamVjdC4gTGlrZSBpZiBzb21lb25lIGRpZCBhbmltYXRpb24ucGF1c2UoMC41KSBvciBzb21ldGhpbmcgaW5zaWRlIHRoZSBvblN0YXJ0LlxuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB0ID0gdGhpcy5fcHQ7XG5cbiAgICAgIHdoaWxlIChwdCkge1xuICAgICAgICBwdC5yKHJhdGlvLCBwdC5kKTtcbiAgICAgICAgcHQgPSBwdC5fbmV4dDtcbiAgICAgIH1cblxuICAgICAgdGltZWxpbmUgJiYgdGltZWxpbmUucmVuZGVyKHRvdGFsVGltZSA8IDAgPyB0b3RhbFRpbWUgOiB0aW1lbGluZS5fZHVyICogdGltZWxpbmUuX2Vhc2UodGltZSAvIHRoaXMuX2R1ciksIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkgfHwgdGhpcy5fc3RhcnRBdCAmJiAodGhpcy5felRpbWUgPSB0b3RhbFRpbWUpO1xuXG4gICAgICBpZiAodGhpcy5fb25VcGRhdGUgJiYgIXN1cHByZXNzRXZlbnRzKSB7XG4gICAgICAgIGlzTmVnYXRpdmUgJiYgX3Jld2luZFN0YXJ0QXQodGhpcywgdG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpOyAvL25vdGU6IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSB0dWNrIHRoaXMgY29uZGl0aW9uYWwgbG9naWMgaW5zaWRlIGxlc3MgdHJhdmVsZWQgYXJlYXMgKG1vc3QgdHdlZW5zIGRvbid0IGhhdmUgYW4gb25VcGRhdGUpLiBXZSdkIGp1c3QgaGF2ZSBpdCBhdCB0aGUgZW5kIGJlZm9yZSB0aGUgb25Db21wbGV0ZSwgYnV0IHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHVwZGF0ZWQgYmVmb3JlIGFueSBvblVwZGF0ZSBpcyBjYWxsZWQsIHNvIHdlIEFMU08gcHV0IGl0IGhlcmUgYW5kIHRoZW4gaWYgaXQncyBub3QgY2FsbGVkLCB3ZSBkbyBzbyBsYXRlciBuZWFyIHRoZSBvbkNvbXBsZXRlLlxuXG4gICAgICAgIF9jYWxsYmFjayh0aGlzLCBcIm9uVXBkYXRlXCIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZXBlYXQgJiYgaXRlcmF0aW9uICE9PSBwcmV2SXRlcmF0aW9uICYmIHRoaXMudmFycy5vblJlcGVhdCAmJiAhc3VwcHJlc3NFdmVudHMgJiYgdGhpcy5wYXJlbnQgJiYgX2NhbGxiYWNrKHRoaXMsIFwib25SZXBlYXRcIik7XG5cbiAgICAgIGlmICgodFRpbWUgPT09IHRoaXMuX3REdXIgfHwgIXRUaW1lKSAmJiB0aGlzLl90VGltZSA9PT0gdFRpbWUpIHtcbiAgICAgICAgaXNOZWdhdGl2ZSAmJiAhdGhpcy5fb25VcGRhdGUgJiYgX3Jld2luZFN0YXJ0QXQodGhpcywgdG90YWxUaW1lLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgKHRvdGFsVGltZSB8fCAhZHVyKSAmJiAodFRpbWUgPT09IHRoaXMuX3REdXIgJiYgdGhpcy5fdHMgPiAwIHx8ICF0VGltZSAmJiB0aGlzLl90cyA8IDApICYmIF9yZW1vdmVGcm9tUGFyZW50KHRoaXMsIDEpOyAvLyBkb24ndCByZW1vdmUgaWYgd2UncmUgcmVuZGVyaW5nIGF0IGV4YWN0bHkgYSB0aW1lIG9mIDAsIGFzIHRoZXJlIGNvdWxkIGJlIGF1dG9SZXZlcnQgdmFsdWVzIHRoYXQgc2hvdWxkIGdldCBzZXQgb24gdGhlIG5leHQgdGljayAoaWYgdGhlIHBsYXloZWFkIGdvZXMgYmFja3dhcmQgYmV5b25kIHRoZSBzdGFydFRpbWUsIG5lZ2F0aXZlIHRvdGFsVGltZSkuIERvbid0IHJlbW92ZSBpZiB0aGUgdGltZWxpbmUgaXMgcmV2ZXJzZWQgYW5kIHRoZSBwbGF5aGVhZCBpc24ndCBhdCAwLCBvdGhlcndpc2UgdGwucHJvZ3Jlc3MoMSkucmV2ZXJzZSgpIHdvbid0IHdvcmsuIE9ubHkgcmVtb3ZlIGlmIHRoZSBwbGF5aGVhZCBpcyBhdCB0aGUgZW5kIGFuZCB0aW1lU2NhbGUgaXMgcG9zaXRpdmUsIG9yIGlmIHRoZSBwbGF5aGVhZCBpcyBhdCAwIGFuZCB0aGUgdGltZVNjYWxlIGlzIG5lZ2F0aXZlLlxuXG4gICAgICAgIGlmICghc3VwcHJlc3NFdmVudHMgJiYgIShpc05lZ2F0aXZlICYmICFwcmV2VGltZSkgJiYgKHRUaW1lIHx8IHByZXZUaW1lIHx8IGlzWW95bykpIHtcbiAgICAgICAgICAvLyBpZiBwcmV2VGltZSBhbmQgdFRpbWUgYXJlIHplcm8sIHdlIHNob3VsZG4ndCBmaXJlIHRoZSBvblJldmVyc2VDb21wbGV0ZS4gVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91IGdzYXAudG8oLi4uIHtwYXVzZWQ6dHJ1ZX0pLnBsYXkoKTtcbiAgICAgICAgICBfY2FsbGJhY2sodGhpcywgdFRpbWUgPT09IHREdXIgPyBcIm9uQ29tcGxldGVcIiA6IFwib25SZXZlcnNlQ29tcGxldGVcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICB0aGlzLl9wcm9tICYmICEodFRpbWUgPCB0RHVyICYmIHRoaXMudGltZVNjYWxlKCkgPiAwKSAmJi
12666B0aGlzLl9wcm9tKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8zLnRhcmdldHMgPSBmdW5jdGlvbiB0YXJnZXRzKCkge1xuICAgIHJldHVybiB0aGlzLl90YXJnZXRzO1xuICB9O1xuXG4gIF9wcm90bzMuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uIGludmFsaWRhdGUoc29mdCkge1xuICAgIC8vIFwic29mdFwiIGdpdmVzIHVzIGEgd2F5IHRvIGNsZWFyIG91dCBldmVyeXRoaW5nIEVYQ0VQVCB0aGUgcmVjb3JkZWQgcHJlLVwiZnJvbVwiIHBvcnRpb24gb2YgZnJvbSgpIHR3ZWVucy4gT3RoZXJ3aXNlLCBmb3IgZXhhbXBsZSwgaWYgeW91IHR3ZWVuLnByb2dyZXNzKDEpLnJlbmRlcigwLCB0cnVlIHRydWUpLmludmFsaWRhdGUoKSwgdGhlIFwiZnJvbVwiIHZhbHVlcyB3b3VsZCBwZXJzaXN0IGFuZCB0aGVuIG9uIHRoZSBuZXh0IHJlbmRlciwgdGhlIGZyb20oKSB0d2VlbnMgd291bGQgaW5pdGlhbGl6ZSBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgd291bGQgbWF0Y2ggdGhlIFwiZnJvbVwiIHZhbHVlcywgdGh1cyBhbmltYXRlIGZyb20gdGhlIHNhbWUgdmFsdWUgdG8gdGhlIHNhbWUgdmFsdWUgKG5vIGFuaW1hdGlvbikuIFdlIHRhcCBpbnRvIHRoaXMgaW4gU2Nyb2xsVHJpZ2dlcidzIHJlZnJlc2goKSB3aGVyZSB3ZSBtdXN0IHB1c2ggYSB0d2VlbiB0byBjb21wbGV0aW9uIGFuZCB0aGVuIGJhY2sgYWdhaW4gYnV0IGhvbm9yIGl0cyBpbml0IHN0YXRlIGluIGNhc2UgdGhlIHR3ZWVuIGlzIGRlcGVuZGVudCBvbiBhbm90aGVyIHR3ZWVuIGZ1cnRoZXIgdXAgb24gdGhlIHBhZ2UuXG4gICAgKCFzb2Z0IHx8ICF0aGlzLnZhcnMucnVuQmFja3dhcmRzKSAmJiAodGhpcy5fc3RhcnRBdCA9IDApO1xuICAgIHRoaXMuX3B0ID0gdGhpcy5fb3AgPSB0aGlzLl9vblVwZGF0ZSA9IHRoaXMuX2xhenkgPSB0aGlzLnJhdGlvID0gMDtcbiAgICB0aGlzLl9wdExvb2t1cCA9IFtdO1xuICAgIHRoaXMudGltZWxpbmUgJiYgdGhpcy50aW1lbGluZS5pbnZhbGlkYXRlKHNvZnQpO1xuICAgIHJldHVybiBfQW5pbWF0aW9uMi5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMsIHNvZnQpO1xuICB9O1xuXG4gIF9wcm90bzMucmVzZXRUbyA9IGZ1bmN0aW9uIHJlc2V0VG8ocHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlLCBza2lwUmVjdXJzaW9uKSB7XG4gICAgX3RpY2tlckFjdGl2ZSB8fCBfdGlja2VyLndha2UoKTtcbiAgICB0aGlzLl90cyB8fCB0aGlzLnBsYXkoKTtcbiAgICB2YXIgdGltZSA9IE1hdGgubWluKHRoaXMuX2R1ciwgKHRoaXMuX2RwLl90aW1lIC0gdGhpcy5fc3RhcnQpICogdGhpcy5fdHMpLFxuICAgICAgICByYXRpbztcbiAgICB0aGlzLl9pbml0dGVkIHx8IF9pbml0VHdlZW4odGhpcywgdGltZSk7XG4gICAgcmF0aW8gPSB0aGlzLl9lYXNlKHRpbWUgLyB0aGlzLl9kdXIpOyAvLyBkb24ndCBqdXN0IGdldCB0d2Vlbi5yYXRpbyBiZWNhdXNlIGl0IG1heSBub3QgaGF2ZSByZW5kZXJlZCB5ZXQuXG4gICAgLy8gcG9zc2libGUgZnV0dXJlIGFkZGl0aW9uIHRvIGFsbG93IGFuIG9iamVjdCB3aXRoIG11bHRpcGxlIHZhbHVlcyB0byB1cGRhdGUsIGxpa2UgdHdlZW4ucmVzZXRUbyh7eDogMTAwLCB5OiAyMDB9KTsgQXQgdGhpcyBwb2ludCwgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHRoZSBhZGRlZCBrYiBnaXZlbiB0aGUgZmFjdCB0aGF0IG1vc3QgdXNlcnMgd2lsbCBsaWtlbHkgb3B0IGZvciB0aGUgY29udmVuaWVudCBnc2FwLnF1aWNrVG8oKSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCB0aGlzIG1ldGhvZC5cbiAgICAvLyBpZiAoX2lzT2JqZWN0KHByb3BlcnR5KSkgeyAvLyBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICAvLyBcdGZvciAocCBpbiBwcm9wZXJ0eSkge1xuICAgIC8vIFx0XHRpZiAoX3VwZGF0ZVByb3BUd2VlbnModGhpcywgcCwgcHJvcGVydHlbcF0sIHZhbHVlID8gdmFsdWVbcF0gOiBudWxsLCBzdGFydCwgcmF0aW8sIHRpbWUpKSB7XG4gICAgLy8gXHRcdFx0cmV0dXJuIHRoaXMucmVzZXRUbyhwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0LCBzdGFydElzUmVsYXRpdmUpOyAvLyBpZiBhIFByb3BUd2VlbiB3YXNuJ3QgZm91bmQgZm9yIHRoZSBwcm9wZXJ0eSwgaXQnbGwgZ2V0IGZvcmNlZCB3aXRoIGEgcmUtaW5pdGlhbGl6YXRpb24gc28gd2UgbmVlZCB0byBqdW1wIG91dCBhbmQgc3RhcnQgb3ZlciBhZ2Fpbi5cbiAgICAvLyBcdFx0fVxuICAgIC8vIFx0fVxuICAgIC8vIH0gZWxzZSB7XG5cbiAgICBpZiAoX3VwZGF0ZVByb3BUd2VlbnModGhpcywgcHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlLCByYXRpbywgdGltZSwgc2tpcFJlY3Vyc2lvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VG8ocHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlLCAxKTsgLy8gaWYgYSBQcm9wVHdlZW4gd2Fzbid0IGZvdW5kIGZvciB0aGUgcHJvcGVydHksIGl0J2xsIGdldCBmb3JjZWQgd2l0aCBhIHJlLWluaXRpYWxpemF0aW9uIHNvIHdlIG5lZWQgdG8ganVtcCBvdXQgYW5kIHN0YXJ0IG92ZXIgYWdhaW4uXG4gICAgfSAvL31cblxuXG4gICAgX2FsaWduUGxheWhlYWQodGhpcywgMCk7XG5cbiAgICB0aGlzLnBhcmVudCB8fCBfYWRkTGlua2VkTGlzdEl0ZW0odGhpcy5fZHAsIHRoaXMsIFwiX2ZpcnN0XCIsIFwiX2xhc3RcIiwgdGhpcy5fZHAuX3NvcnQgPyBcIl9zdGFydFwiIDogMCk7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyKDApO1xuICB9O1xuXG4gIF9wcm90bzMua2lsbCA9IGZ1bmN0aW9uIGtpbGwodGFyZ2V0cywgdmFycykge1xuICAgIGlmICh2YXJzID09PSB2b2lkIDApIHtcbiAgICAgIHZhcnMgPSBcImFsbFwiO1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0cyAmJiAoIXZhcnMgfHwgdmFycyA9PT0gXCJhbGxcIikpIHtcbiAgICAgIHRoaXMuX2xhenkgPSB0aGlzLl9wdCA9IDA7XG4gICAgICB0aGlzLnBhcmVudCA/IF9pbnRlcnJ1cHQodGhpcykgOiB0aGlzLnNjcm9sbFRyaWdnZXIgJiYgdGhpcy5zY3JvbGxUcmlnZ2VyLmtpbGwoISFfcmV2ZXJ0aW5nKTtcbiAgICAgIHJldHVybi
12666B0aGlzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRpbWVsaW5lKSB7XG4gICAgICB2YXIgdER1ciA9IHRoaXMudGltZWxpbmUudG90YWxEdXJhdGlvbigpO1xuICAgICAgdGhpcy50aW1lbGluZS5raWxsVHdlZW5zT2YodGFyZ2V0cywgdmFycywgX292ZXJ3cml0aW5nVHdlZW4gJiYgX292ZXJ3cml0aW5nVHdlZW4udmFycy5vdmVyd3JpdGUgIT09IHRydWUpLl9maXJzdCB8fCBfaW50ZXJydXB0KHRoaXMpOyAvLyBpZiBub3RoaW5nIGlzIGxlZnQgdHdlZW5pbmcsIGludGVycnVwdC5cblxuICAgICAgdGhpcy5wYXJlbnQgJiYgdER1ciAhPT0gdGhpcy50aW1lbGluZS50b3RhbER1cmF0aW9uKCkgJiYgX3NldER1cmF0aW9uKHRoaXMsIHRoaXMuX2R1ciAqIHRoaXMudGltZWxpbmUuX3REdXIgLyB0RHVyLCAwLCAxKTsgLy8gaWYgYSBuZXN0ZWQgdHdlZW4gaXMga2lsbGVkIHRoYXQgY2hhbmdlcyB0aGUgZHVyYXRpb24sIGl0IHNob3VsZCBhZmZlY3QgdGhpcyB0d2VlbidzIGR1cmF0aW9uLiBXZSBtdXN0IHVzZSB0aGUgcmF0aW8sIHRob3VnaCwgYmVjYXVzZSBzb21ldGltZXMgdGhlIGludGVybmFsIHRpbWVsaW5lIGlzIHN0cmV0Y2hlZCBsaWtlIGZvciBrZXlmcmFtZXMgd2hlcmUgdGhleSBkb24ndCBhbGwgYWRkIHVwIHRvIHdoYXRldmVyIHRoZSBwYXJlbnQgdHdlZW4ncyBkdXJhdGlvbiB3YXMgc2V0IHRvLlxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgcGFyc2VkVGFyZ2V0cyA9IHRoaXMuX3RhcmdldHMsXG4gICAgICAgIGtpbGxpbmdUYXJnZXRzID0gdGFyZ2V0cyA/IHRvQXJyYXkodGFyZ2V0cykgOiBwYXJzZWRUYXJnZXRzLFxuICAgICAgICBwcm9wVHdlZW5Mb29rdXAgPSB0aGlzLl9wdExvb2t1cCxcbiAgICAgICAgZmlyc3RQVCA9IHRoaXMuX3B0LFxuICAgICAgICBvdmVyd3JpdHRlblByb3BzLFxuICAgICAgICBjdXJMb29rdXAsXG4gICAgICAgIGN1ck92ZXJ3cml0ZVByb3BzLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgcCxcbiAgICAgICAgcHQsXG4gICAgICAgIGk7XG5cbiAgICBpZiAoKCF2YXJzIHx8IHZhcnMgPT09IFwiYWxsXCIpICYmIF9hcnJheXNNYXRjaChwYXJzZWRUYXJnZXRzLCBraWxsaW5nVGFyZ2V0cykpIHtcbiAgICAgIHZhcnMgPT09IFwiYWxsXCIgJiYgKHRoaXMuX3B0ID0gMCk7XG4gICAgICByZXR1cm4gX2ludGVycnVwdCh0aGlzKTtcbiAgICB9XG5cbiAgICBvdmVyd3JpdHRlblByb3BzID0gdGhpcy5fb3AgPSB0aGlzLl9vcCB8fCBbXTtcblxuICAgIGlmICh2YXJzICE9PSBcImFsbFwiKSB7XG4gICAgICAvL3NvIHBlb3BsZSBjYW4gcGFzcyBpbiBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHByb3BlcnR5IG5hbWVzXG4gICAgICBpZiAoX2lzU3RyaW5nKHZhcnMpKSB7XG4gICAgICAgIHAgPSB7fTtcblxuICAgICAgICBfZm9yRWFjaE5hbWUodmFycywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gcFtuYW1lXSA9IDE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhcnMgPSBwO1xuICAgICAgfVxuXG4gICAgICB2Y
12666XJzID0gX2FkZEFsaWFzZXNUb1ZhcnMocGFyc2VkVGFyZ2V0cywgdmFycyk7XG4gICAgfVxuXG4gICAgaSA9IHBhcnNlZFRhcmdldHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgaWYgKH5raWxsaW5nVGFyZ2V0cy5pbmRleE9mKHBhcnNlZFRhcmdldHNbaV0pKSB7XG4gICAgICAgIGN1ckxvb2t1cCA9IHByb3BUd2Vlbkxvb2t1cFtpXTtcblxuICAgICAgICBpZiAodmFycyA9PT0gXCJhbGxcIikge1xuICAgICAgICAgIG92ZXJ3cml0dGVuUHJvcHNbaV0gPSB2YXJzO1xuICAgICAgICAgIHByb3BzID0gY3VyTG9va3VwO1xuICAgICAgICAgIGN1ck92ZXJ3cml0ZVByb3BzID0ge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VyT3ZlcndyaXRlUHJvcHMgPSBvdmVyd3JpdHRlblByb3BzW2ldID0gb3ZlcndyaXR0ZW5Qcm9wc1tpXSB8fCB7fTtcbiAgICAgICAgICBwcm9wcyA9IHZhcnM7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHAgaW4gcHJvcHMpIHtcbiAgICAgICAgICBwdCA9IGN1ckxvb2t1cCAmJiBjdXJMb29rdXBbcF07XG5cbiAgICAgICAgICBpZiAocHQpIHtcbiAgICAgICAgICAgIGlmICghKFwia2lsbFwiIGluIHB0LmQpIHx8IHB0LmQua2lsbChwKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBfcmVtb3ZlTGlua2VkTGlzdEl0ZW0odGhpcywgcHQsIFwiX3B0XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgY3VyTG9va3VwW3BdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjdXJPdmVyd3JpdGVQcm9wcyAhPT0gXCJhbGxcIikge1xuICAgICAgICAgICAgY3VyT3ZlcndyaXRlUHJvcHNbcF0gPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2luaXR0ZWQgJiYgIXRoaXMuX3B0ICYmIGZpcnN0UFQgJiYgX2ludGVycnVwdCh0aGlzKTsgLy9pZiBhbGwgdHdlZW5pbmcgcHJvcGVydGllcyBhcmUga2lsbGVkLCBraWxsIHRoZSB0d2Vlbi4gV2l0aG91dCB0aGlzIGxpbmUsIGlmIHRoZXJlJ3MgYSB0d2VlbiB3aXRoIG11bHRpcGxlIHRhcmdldHMgYW5kIHRoZW4geW91IGtpbGxUd2VlbnNPZigpIGVhY2ggdGFyZ2V0IGluZGl2aWR1YWxseSwgdGhlIHR3ZWVuIHdvdWxkIHRlY2huaWNhbGx5IHN0aWxsIHJlbWFpbiBhY3RpdmUgYW5kIGZpcmUgaXRzIG9uQ29tcGxldGUgZXZlbiB0aG91Z2ggdGhlcmUgYXJlbid0IGFueSBtb3JlIHByb3BlcnRpZXMgdHdlZW5pbmcuXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBUd2Vlbi50byA9IGZ1bmN0aW9uIHRvKHRhcmdldHMsIHZhcnMpIHtcbiAgICByZXR1cm4gbmV3IFR3ZWVuKHRhcmdldHMsIHZhcnMsIGFyZ3VtZW50c1syXSk7XG4gIH07XG5cbiAgVHdlZW4uZnJvbSA9IGZ1bmN0aW9uIGZyb20odGFyZ2V0cywgdmFycykge1xuICAgIHJldHVybiBfY3JlYXRlVHdlZW5UeXBlKDEsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgVHdlZW4uZGVsYXllZENhbGwgPSBmdW5jdGlvbiBkZWxheWVkQ2FsbChkZWxheSwgY2FsbGJhY2ssIHBhcmFtcywgc2NvcGUpIHtcbiAgICByZXR1cm4gbmV3IFR3ZWVuKGNhbGxiYWNrLCAwLCB7XG4gICAgICBpbW1lZGlhdGVSZW5kZXI6IGZhbHNlLFxuICAgICAgbGF6eTogZmFsc2UsXG4gICAgICBvdmVyd3JpdGU6IGZhbHNlLFxuICAgICAgZGVsYXk6IGRlbGF5LFxuICAgICAgb25Db21wbGV0ZTogY2FsbGJhY2ssXG4gICAgICBvblJldmVyc2VDb21wbGV0ZTogY2FsbGJhY2ssXG4gICAgICBvbkNvbXBsZXRlUGFyYW1zOiBwYXJhbXMsXG4gICAgICBvblJldmVyc2VDb21wbGV0ZVBhcmFtczogcGFyYW1zLFxuICAgICAgY2FsbGJhY2tTY29wZTogc2NvcGVcbiAgICB9KTsgLy8gd2UgbXVzdCB1c2Ugb25SZXZlcnNlQ29tcGxldGUgdG9vIGZvciB0aGluZ3MgbGlrZSB0aW1lbGluZS5hZGQoKCkgPT4gey4uLn0pIHdoaWNoIHNob3VsZCBiZSB0cmlnZ2VyZWQgaW4gQk9USCBkaXJlY3Rpb25zIChmb3J3YXJkIGFuZCByZXZlcnNlKVxuICB9O1xuXG4gIFR3ZWVuLmZyb21UbyA9IGZ1bmN0aW9uIGZyb21Ubyh0YXJnZXRzLCBmcm9tVmFycywgdG9WYXJzKSB7XG4gICAgcmV0dXJuIF9jcmVhdGVUd2VlblR5cGUoMiwgYXJndW1lbnRzKTtcbiAgfTtcblxuICBUd2Vlbi5zZXQgPSBmdW5jdGlvbiBzZXQodGFyZ2V0cywgdmFycykge1xuICAgIHZhcnMuZHVyYXRpb24gPSAwO1xuICAgIHZhcnMucmVwZWF0RGVsYXkgfHwgKHZhcnMucmVwZWF0ID0gMCk7XG4gICAgcmV0dXJuIG5ldyBUd2Vlbih0YXJnZXRzLCB2YXJzKTtcbiAgfTtcblxuICBUd2Vlbi5raWxsVHdlZW5zT2YgPSBmdW5jdGlvbiBraWxsVHdlZW5zT2YodGFyZ2V0cywgcHJvcHMsIG9ubHlBY3RpdmUpIHtcbiAgICByZXR1cm4gX2dsb2JhbFRpbWVsaW5lLmtpbGxUd2VlbnNPZih0YXJnZXRzLCBwcm9wcywgb25seUFjdGl2ZSk7XG4gIH07XG5cbiAgcmV0dXJuIFR3ZWVuO1xufShBbmltYXRpb24pO1xuXG5fc2V0RGVmYXVsdHMoVHdlZW4ucHJvdG90eXBlLCB7XG4gIF90YXJnZXRzOiBbXSxcbiAgX2xhenk6IDAsXG4gIF9zdGFydEF0OiAwLFxuICBfb3A6IDAsXG4gIF9vbkluaXQ6IDBcbn0pOyAvL2FkZCB0aGUgcGVydGluZW50IHRpbWVsaW5lIG1ldGhvZHMgdG8gVHdlZW4gaW5zdGFuY2VzIHNvIHRoYXQgdXNlcnMgY2FuIGNoYWluIGNvbnZlbmllbnRseSBhbmQgY3JlYXRlIGEgdGltZWxpbmUgYXV0b21hdGljYWxseS4gKHJlbW92ZWQgZHVlIHRvIGNvbmNlcm5zIHRoYXQgaXQnZCB1bHRpbWF0ZWx5IGFkZCB0byBtb3JlIGNvbmZ1c2lvbiBlc3BlY2lhbGx5IGZvciBiZWdpbm5lcnMpXG4vLyBfZm9yRWFjaE5hbWUoXCJ0byxmcm9tLGZyb21UbyxzZXQsY2FsbCxhZGQsYWRkTGFiZWwsYWRkUGF1c2VcIiwgbmFtZSA9PiB7XG4vLyBcdFR3ZWVuLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuLy8gXHRcdGxldCB0bCA9IG5ldyBUaW1lbGluZSgpO1xuLy8gXHRcdHJldHVybiBfYWRkVG9UaW1lbGluZSh0bCwgdGhpcylbbmFtZV0uYXBwbHkodGwsIHRvQXJyYXkoYXJndW1lbnRzKSk7XG4vLyBcdH1cbi8vIH0pO1xuLy9mb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gTGV2ZXJhZ2UgdGhlIHRpbWVsaW5lIGNhbGxzLlxuXG5cbl9mb3JFYWNoTmFtZShcInN0YWdnZXJUbyxzdGFnZ2VyRnJvbSxzdGFnZ2VyRnJvbVRvXCIsIGZ1bmN0aW9uIChuYW1lKSB7XG4gIFR3ZWVuW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0bCA9IG5ldyBUaW1lbGluZSgpLFxuICAgICAgICBwYXJhbXMgPSBfc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgcGFyYW1zLnNwbGljZShuYW1lID09PSBcInN0YWdnZXJGcm9tVG9cIiA/IDUgOiA0LCAwLCAwKTtcbiAgICByZXR1cm4gdGxbbmFtZV0uYXBwbHkodGwsIHBhcmFtcyk7XG4gIH07XG59
12666KTtcbi8qXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogUFJPUFRXRUVOXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxudmFyIF9zZXR0ZXJQbGFpbiA9IGZ1bmN0aW9uIF9zZXR0ZXJQbGFpbih0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSkge1xuICByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XSA9IHZhbHVlO1xufSxcbiAgICBfc2V0dGVyRnVuYyA9IGZ1bmN0aW9uIF9zZXR0ZXJGdW5jKHRhcmdldCwgcHJvcGVydHksIHZhbHVlKSB7XG4gIHJldHVybiB0YXJnZXRbcHJvcGVydHldKHZhbHVlKTtcbn0sXG4gICAgX3NldHRlckZ1bmNXaXRoUGFyYW0gPSBmdW5jdGlvbiBfc2V0dGVyRnVuY1dpdGhQYXJhbSh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgZGF0YSkge1xuICByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XShkYXRhLmZwLCB2YWx1ZSk7XG59LFxuICAgIF9zZXR0ZXJBdHRyaWJ1dGUgPSBmdW5jdGlvbiBfc2V0dGVyQXR0cmlidXRlKHRhcmdldCwgcHJvcGVydHksIHZhbHVlKSB7XG4gIHJldHVybiB0YXJnZXQuc2V0QXR0cmlidXRlKHByb3BlcnR5LCB2YWx1ZSk7XG59LFxuICAgIF9nZXRTZXR0ZXIgPSBmdW5jdGlvbiBfZ2V0U2V0dGVyKHRhcmdldCwgcHJvcGVydHkpIHtcbiAgcmV0dXJuIF9pc0Z1bmN0aW9uKHRhcmdldFtwcm9wZXJ0eV0pID8gX3NldHRlckZ1bmMgOiBfaXNVbmRlZmluZWQodGFyZ2V0W3Byb3BlcnR5XSkgJiYgdGFyZ2V0LnNldEF0dHJpYnV0ZSA/IF9zZXR0ZXJBdHRyaWJ1dGUgOiBfc2V0dGVyUGxhaW47XG59LFxuICAgIF9yZW5kZXJQbGFpbiA9IGZ1bmN0aW9uIF9yZW5kZXJQbGFpbihyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIE1hdGgucm91bmQoKGRhdGEucyArIGRhdGEuYyAqIHJhdGlvKSAqIDEwMDAwMDApIC8gMTAwMDAwMCwgZGF0YSk7XG59LFxuICAgIF9yZW5kZXJCb29sZWFuID0gZnVuY3Rpb24gX3JlbmRlckJvb2xlYW4ocmF0aW8sIGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCAhIShkYXRhLnMgKyBkYXRhLmMgKiByYXRpbyksIGRhdGEpO1xufSxcbiAgICBfcmVuZGVyQ29tcGxleFN0cmluZyA9IGZ1bmN0aW9uIF9yZW5kZXJDb21wbGV4U3RyaW5nKHJhdGlvLCBkYXRhKSB7XG4gIHZhciBwdCA9IGRhdGEuX3B0LFxuICAgICAgcyA9IFwiXCI7XG5cbiAgaWYgKCFyYXRpbyAmJiBkYXRhLmIpIHtcbiAgICAvL2IgPSBiZWdpbm5pbmcgc3RyaW5nXG4gICAgcyA9IGRhdGEuYjtcbiAgfSBlbHNlIGlmIChyYXRpbyA9PT0gMSAmJiBkYXRhLmUpIHtcbiAgICAvL2UgPSBlbmRpbmcgc3RyaW5nXG4gICAgcyA9IGRhdGEuZTtcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAocHQpIHtcbiAgICAgIHMgPSBwdC5wICsgKHB0Lm0gPyBwdC5tKHB0LnMgKyBwdC5jICogcmF0aW8pIDogTWF0aC5yb3VuZCgocHQucyArIHB0LmMgKiByYXRpbykgKiAxMDAwMCkgLyAxMDAwMCkgKyBzOyAvL3dlIHVzZSB0aGUgXCJwXCIgcHJvcGVydHkgZm9yIHRoZSB0ZXh0IGluYmV0d2VlbiAobGlrZSBhIHN1ZmZpeCkuIEFuZCBpbiB0aGUgY29udGV4dCBvZiBhIGNvbXBsZXggc3RyaW5nLCB0aGUgbW9kaWZpZXIgKG0pIGlzIHR5cGljYWxseSBqdXN0IE1hdGgucm91bmQoKSwgbGlrZSBmb3IgUkdCIGNvbG9ycy5cblxuICAgICAgcHQgPSBwdC5fbmV4dDtcbiAgICB9XG5cbiAgICBzICs9IGRhdGEuYzsgLy93ZSB1c2UgdGhlIFwiY1wiIG9mIHRoZSBQcm9wVHdlZW4gdG8gc3RvcmUgdGhlIGZpbmFsIGNodW5rIG9mIG5vbi1udW1lcmljIHRleHQuXG4gIH1cblxuICBkYXRhLnNldChkYXRhLnQsIGRhdGEucCwgcywgZGF0YSk7XG59LFxuICAgIF9yZW5kZXJQcm9wVHdlZW5zID0gZnVuY3Rpb24gX3JlbmRlclByb3BUd2VlbnMocmF0aW8sIGRhdGEpIHtcbiAgdmFyIHB0ID0gZGF0YS5fcHQ7XG5cbiAgd2hpbGUgKHB0KSB7XG4gICAgcHQucihyYXRpbywgcHQuZCk7XG4gICAgcHQgPSBwdC5fbmV4dDtcbiAgfVxufSxcbiAgICBfYWRkUGx1Z2luTW9kaWZpZXIgPSBmdW5jdGlvbiBfYWRkUGx1Z2luTW9kaWZpZXIobW9kaWZpZXIsIHR3ZWVuLCB0YXJnZXQsIHByb3BlcnR5KSB7XG4gIHZhciBwdCA9IHRoaXMuX3B0LFxuICAgICAgbmV4dDtcblxuICB3aGlsZSAocHQpIHtcbiAgICBuZXh0ID0gcHQuX25leHQ7XG4gICAgcHQucCA9PT0gcHJvcGVydHkgJiYgcHQubW9kaWZpZXIobW9kaWZpZXIsIHR3ZWVuLCB0YXJnZXQpO1xuICAgIHB0ID0gbmV4dDtcbiAgfVxufSxcbiAgICBfa2lsbFByb3BUd2VlbnNPZiA9IGZ1bmN0aW9uIF9raWxsUHJvcFR3ZWVuc09mKHByb3BlcnR5KSB7XG4gIHZhciBwdCA9IHRoaXMuX3B0LFxuICAgICAgaGFzTm9uRGVwZW5kZW50UmVtYWluaW5nLFxuICAgICAgbmV4dDtcblxuICB3aGlsZSAocHQpIHtcbiAgICBuZXh0ID0gcHQuX25leHQ7XG5cbiAgICBpZiAocHQucCA9PT0gcHJvcGVydHkgJiYgIXB0Lm9wIHx8IHB0Lm9wID09PSBwcm9wZXJ0eSkge1xuICAgICAgX3JlbW92ZUxpbmtlZExpc3RJdGVtKHRoaXMsIHB0LCBcIl9wdFwiKTtcbiAgICB9IGVsc2UgaWYgKCFwdC5kZXApIHtcbiAgICAgIGhhc05vbkRlcGVuZGVudFJlbWFpbmluZyA9IDE7XG4gICAgfVxuXG4gICAgcHQgPSBuZXh0O1xuICB9XG5cbiAgcmV0dXJuICFoYXNOb25EZXBlbmRlbnRSZW1haW5pbmc7XG59LFxuICAgIF9zZXR0ZXJXaXRoTW9kaWZpZXIgPSBmdW5jdGlvbiBfc2V0dGVyV2l0aE1vZGlmaWVyKHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCBkYXRhKSB7XG4gIGRhdGEubVNldCh0YXJnZXQsIHByb3BlcnR5LCBkYXRhLm0uY2FsbChkYXRhLnR3ZWVuLCB2YWx1ZSwgZGF0YS5tdCksIGRhdGEpO1xufSxcbiAgICBfc29ydFByb3BUd2VlbnNCeVByaW9yaXR5ID0gZnVuY3Rpb24gX3NvcnRQcm9wVHdlZW5zQnlQcmlvcml0eShwYXJlbnQpIHtcbiAgdmFyIHB0ID0gcGFyZW50Ll9wdCxcbiAgICAgIG5leHQsXG4gICAgICBwdDIsXG4gICAgICBmaXJzdCxcbiAgICAgIGxhc3Q7IC8vc29ydHMgdGhlIFByb3BUd2VlbiBsaW5rZWQgbGlzdCBpbiBvcmRlciBvZiBwcmlvcml0eSBiZWNhdXNlIHNvbWUgcGx1Z2lucyBuZWVkIHRvIGRvIHRoZWlyIHdvcmsgYWZ0ZXIgQUxMIG9mIHRoZSBQcm9wVHdlZW5zIHdlcmUgY3JlYXRlZCAobGlrZSBSb3VuZFByb3BzUGx1Z2luIGFuZCBNb2RpZmllcnNQbHVnaW4pXG5cbiAgd2hpbGUgKHB0KSB7XG4gICAgbmV4dCA9IHB0Ll9uZXh0O1xuICAgIHB0MiA9IGZpcnN0O1xuXG4gICAgd2hpbGUgKHB0MiAmJiBwdDIucHIgPiBwdC5wcikge1xuICAgICAgcHQyID0gcHQyLl9uZXh0O1xuICAgIH1cblxuICAgIGlmIChwdC5fcHJldiA9IHB0MiA/IHB0Mi5fcHJldiA6IGxhc3QpIHtcbiAgICAgIHB0Ll9wcmV2Ll9uZXh0ID0gcHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpcnN0ID0gcHQ7XG4gICAgfVxuXG4gICAgaWYgKHB0Ll9uZXh0ID0gcHQyKSB7XG4gICAgICBwdDIuX3ByZXYgPSBwdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdCA9IHB0O1xuICAgIH1cblxuICAgI
12666HB0ID0gbmV4dDtcbiAgfVxuXG4gIHBhcmVudC5fcHQgPSBmaXJzdDtcbn07IC8vUHJvcFR3ZWVuIGtleTogdCA9IHRhcmdldCwgcCA9IHByb3AsIHIgPSByZW5kZXJlciwgZCA9IGRhdGEsIHMgPSBzdGFydCwgYyA9IGNoYW5nZSwgb3AgPSBvdmVyd3JpdGVQcm9wZXJ0eSAoT05MWSBwb3B1bGF0ZWQgd2hlbiBpdCdzIGRpZmZlcmVudCB0aGFuIHApLCBwciA9IHByaW9yaXR5LCBfbmV4dC9fcHJldiBmb3IgdGhlIGxpbmtlZCBsaXN0IHNpYmxpbmdzLCBzZXQgPSBzZXR0ZXIsIG0gPSBtb2RpZmllciwgbVNldCA9IG1vZGlmaWVyU2V0dGVyICh0aGUgb3JpZ2luYWwgc2V0dGVyLCBiZWZvcmUgYSBtb2RpZmllciB3YXMgYWRkZWQpXG5cblxuZXhwb3J0IHZhciBQcm9wVHdlZW4gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQcm9wVHdlZW4obmV4dCwgdGFyZ2V0LCBwcm9wLCBzdGFydCwgY2hhbmdlLCByZW5kZXJlciwgZGF0YSwgc2V0dGVyLCBwcmlvcml0eSkge1xuICAgIHRoaXMudCA9IHRhcmdldDtcbiAgICB0aGlzLnMgPSBzdGFydDtcbiAgICB0aGlzLmMgPSBjaGFuZ2U7XG4gICAgdGhpcy5wID0gcHJvcDtcbiAgICB0aGlzLnIgPSByZW5kZXJlciB8fCBfcmVuZGVyUGxhaW47XG4gICAgdGhpcy5kID0gZGF0YSB8fCB0aGlzO1xuICAgIHRoaXMuc2V0ID0gc2V0dGVyIHx8IF9zZXR0ZXJQbGFpbjtcbiAgICB0aGlzLnByID0gcHJpb3JpdHkgfHwgMDtcbiAgICB0aGlzLl9uZXh0ID0gbmV4dDtcblxuICAgIGlmIChuZXh0KSB7XG4gICAgICBuZXh0Ll9wcmV2ID0gdGhpcztcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvNCA9IFByb3BUd2Vlbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvNC5tb2RpZmllciA9IGZ1bmN0aW9uIG1vZGlmaWVyKGZ1bmMsIHR3ZWVuLCB0YXJnZXQpIHtcbiAgICB0aGlzLm1TZXQgPSB0aGlzLm1TZXQgfHwgdGhpcy5zZXQ7IC8vaW4gY2FzZSBpdCB3YXMgYWxyZWFkeSBzZXQgKGEgUHJvcFR3ZWVuIGNhbiBvbmx5IGhhdmUgb25lIG1vZGlmaWVyKVxuXG4gICAgdGhpcy5zZXQgPSBfc2V0dGVyV2l0aE1vZGlmaWVyO1xuICAgIHRoaXMubSA9IGZ1bmM7XG4gICAgdGhpcy5tdCA9IHRhcmdldDsgLy9tb2RpZmllciB0YXJnZXRcblxuICAgI
12666HRoaXMudHdlZW4gPSB0d2VlbjtcbiAgfTtcblxuICByZXR1cm4gUHJvcFR3ZWVuO1xufSgpOyAvL0luaXRpYWxpemF0aW9uIHRhc2tzXG5cbl9mb3JFYWNoTmFtZShfY2FsbGJhY2tOYW1lcyArIFwicGFyZW50LGR1cmF0aW9uLGVhc2UsZGVsYXksb3ZlcndyaXRlLHJ1bkJhY2t3YXJkcyxzdGFydEF0LHlveW8saW1tZWRpYXRlUmVuZGVyLHJlcGVhdCxyZXBlYXREZWxheSxkYXRhLHBhdXNlZCxyZXZlcnNlZCxsYXp5LGNhbGxiYWNrU2NvcGUsc3RyaW5nRmlsdGVyLGlkLHlveW9FYXNlLHN0YWdnZXIsaW5oZXJpdCxyZXBlYXRSZWZyZXNoLGtleWZyYW1lcyxhdXRvUmV2ZXJ0LHNjcm9sbFRyaWdnZXIsZWFzZVJldmVyc2VcIiwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF9yZXNlcnZlZFByb3BzW25hbWVdID0gMTtcbn0pO1xuXG5fZ2xvYmFscy5Ud2Vlbk1heCA9IF9nbG9iYWxzLlR3ZWVuTGl0ZSA9IFR3ZWVuO1xuX2dsb2JhbHMuVGltZWxpbmVMaXRlID0gX2dsb2JhbHMuVGltZWxpbmVNYXggPSBUaW1lbGluZTtcbl9nbG9iYWxUaW1lbGluZSA9IG5ldyBUaW1lbGluZSh7XG4gIHNvcnRDaGlsZHJlbjogZmFsc2UsXG4gIGRlZmF1bHRzOiBfZGVmYXVsdHMsXG4gIGF1dG9SZW1vdmVDaGlsZHJlbjogdHJ1ZSxcbiAgaWQ6IFwicm9vdFwiLFxuICBzbW9vdGhDaGlsZFRpbWluZzogdHJ1ZVxufSk7XG5fY29uZmlnLnN0cmluZ0ZpbHRlciA9IF9jb2xvclN0cmluZ0ZpbHRlcjtcblxudmFyIF9tZWRpYSA9IFtdLFxuICAgIF9saXN0ZW5lcnMgPSB7fSxcbiAgICBfZW1wdHlBcnJheSA9IFtdLFxuICAgIF9sYXN0TWVkaWFUaW1lID0gMCxcbiAgICBfY29udGV4dElEID0gMCxcbiAgICBfZGlzcGF0Y2ggPSBmdW5jdGlvbiBfZGlzcGF0Y2godHlwZSkge1xuICByZXR1cm4gKF9saXN0ZW5lcnNbdHlwZV0gfHwgX2VtcHR5QXJyYXkpLm1hcChmdW5jdGlvbiAoZikge1xuICAgIHJldHVybiBmKCk7XG4gIH0pO1xufSxcbiAgICBfb25NZWRpYUNoYW5nZSA9IGZ1bmN0aW9uIF9vbk1lZGlhQ2hhbmdlKCkge1xuICB2YXIgdGltZSA9IERhdGUubm93KCksXG4gICAgICBtYXRjaGVzID0gW107XG5cbiAgaWYgKHRpbWUgLSBfbGFzdE1lZGlhVGltZSA+IDIpIHtcbiAgICBfZGlzcGF0Y2goXCJtYXRjaE1lZGlhSW5pdFwiKTtcblxuICAgIF9tZWRpYS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICB2Y
12666XIgcXVlcmllcyA9IGMucXVlcmllcyxcbiAgICAgICAgICBjb25kaXRpb25zID0gYy5jb25kaXRpb25zLFxuICAgICAgICAgIG1hdGNoLFxuICAgICAgICAgIHAsXG4gICAgICAgICAgYW55TWF0Y2gsXG4gICAgICAgICAgdG9nZ2xlZDtcblxuICAgICAgZm9yIChwIGluIHF1ZXJpZXMpIHtcbiAgICAgICAgbWF0Y2ggPSBfd2luLm1hdGNoTWVkaWEocXVlcmllc1twXSkubWF0Y2hlczsgLy8gRmlyZWZveCBkb2Vzbid0IHVwZGF0ZSB0aGUgXCJtYXRjaGVzXCIgcHJvcGVydHkgb2YgdGhlIE1lZGlhUXVlcnlMaXN0IG9iamVjdCBjb3JyZWN0bHkgLSBpdCBvbmx5IGRvZXMgc28gYXMgaXQgY2FsbHMgaXRzIGNoYW5nZSBoYW5kbGVyIC0gc28gd2UgbXVzdCByZS1jcmVhdGUgYSBtZWRpYSBxdWVyeSBoZXJlIHRvIGVuc3VyZSBpdCdzIGFjY3VyYXRlLlxuXG4gICAgICAgIG1hdGNoICYmIChhbnlNYXRjaCA9IDEpO1xuXG4gICAgICAgIGlmIChtYXRjaCAhPT0gY29uZGl0aW9uc1twXSkge1xuICAgICAgICAgIGNvbmRpdGlvbnNbcF0gPSBtYXRjaDtcbiAgICAgICAgICB0b2dnbGVkID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodG9nZ2xlZCkge1xuICAgICAgICBjLnJldmVydCgpO1xuICAgICAgICBhbnlNYXRjaCAmJiBtYXRjaGVzLnB1c2goYyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGlzcGF0Y2goXCJtYXRjaE1lZGlhUmV2ZXJ0XCIpO1xuXG4gICAgbWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYy5vbk1hdGNoKGMsIGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgIHJldHVybiBjLmFkZChudWxsLCBmdW5jKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9sYXN0TWVkaWFUaW1lID0gdGltZTtcblxuICAgIF9kaXNwYXRjaChcIm1hdGNoTWVkaWFcIik7XG4gIH1cbn07XG5cbnZhciBDb250ZXh0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ29udGV4dChmdW5jLCBzY29wZSkge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzY29wZSAmJiBzZWxlY3RvcihzY29wZSk7XG4gICAgdGhpcy5kYXRhID0gW107XG4gICAgdGhpcy5fciA9IFtdOyAvLyByZXR1cm5lZC9jbGVhbnVwIGZ1bmN0aW9uc1xuXG4gICAgdGhpcy5pc1JldmVydGVkID0gZmFsc2U7XG4gICAgdGhpcy5pZCA9IF9jb250ZXh0SUQrKzsgLy8gdG8gd29yayBhcm91bmQgaXNzdWVzIHRoYXQgZnJhbWV3b3JrcyBsaWtlIFZ1ZSBjYXVzZSBieSBtYWtpbmcgdGhpbmdzIGludG8gUHJveGllcyB3aGljaCBtYWtlIGl0IGltcG9zc2libGUgdG8gZG8gc29tZXRoaW5nIGxpa2UgX21lZGlhLmluZGV4T2YodGhpcykgYmVjYXVzZSBcInRoaXNcIiB3b3VsZCBubyBsb25nZXIgcmVmZXIgdG8gdGhlIENvbnRleHQgaW5zdGFuY2UgaXRzZWxmIC0gaXQnZCByZWZlciB0byBhIFByb3h5ISBXZSBuZWVkZWQgYSB3YXkgdG8gaWRlbnRpZnkgdGhlIGNvbnRleHQgdW5pcXVlbHlcblxuICAgIGZ1bmMgJiYgdGhpcy5hZGQoZnVuYyk7XG4gIH1cblxuICB2YXIgX3Byb3RvNSA9IENvbnRleHQucHJvdG90eXBlO1xuXG4gIF9wcm90bzUuYWRkID0gZnVuY3Rpb24gYWRkKG5hbWUsIGZ1bmMsIHNjb3BlKSB7XG4gICAgLy8gcG9zc2libGUgZnV0dXJlIGFkZGl0aW9uIGlmIHdlIG5lZWQgdGhlIGFiaWxpdHkgdG8gYWRkKCkgYW4gYW5pbWF0aW9uIHRvIGEgY29udGV4dCBhbmQgZm9yIHdoYXRldmVyIHJlYXNvbiBjYW5ub3QgY3JlYXRlIHRoYXQgYW5pbWF0aW9uIGluc2lkZSBvZiBhIGNvbnRleHQuYWRkKCgpID0+IHsuLi59KSBmdW5jdGlvbi5cbiAgICAvLyBpZiAobmFtZSAmJiBfaXNGdW5jdGlvbihuYW1lLnJldmVydCkpIHtcbiAgICAvLyBcdHRoaXMuZGF0YS5wdXNoKG5hbWUpO1xuICAgIC8vIFx0cmV0dXJuIChuYW1lLl9jdHggPSB0aGlzKTtcbiAgICAvLyB9XG4gICAgaWYgKF9pc0Z1bmN0aW9uKG5hbWUpKSB7XG4gICAgICBzY29wZSA9IGZ1bmM7XG4gICAgICBmdW5jID0gbmFtZTtcbiAgICAgIG5hbWUgPSBfaXNGdW5jdGlvbjtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGYgPSBmdW5jdGlvbiBmKCkge1xuICAgICAgdmFyIHByZXYgPSBfY29udGV4dCxcbiAgICAgICAgICBwcmV2U2VsZWN0b3IgPSBzZWxmLnNlbGVjdG9yLFxuICAgICAgICAgIHJlc3VsdDtcbiAgICAgIHByZXYgJiYgcHJldiAhPT0gc2VsZiAmJiBwcmV2LmRhdGEucHVzaChzZWxmKTtcbiAgICAgIHNjb3BlICYmIChzZWxmLnNlbGVjdG9yID0gc2VsZWN0b3Ioc2NvcGUpKTtcbiAgICAgIF9jb250ZXh0ID0gc2VsZjtcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcbiAgICAgIF9pc0Z1bmN0aW9uKHJlc3VsdCkgJiYgc2VsZi5fci5wdXNoKHJlc3VsdCk7XG4gICAgICBfY29udGV4dCA9IHByZXY7XG4gICAgICBzZWxmLnNlbGVjdG9yID0gcHJldlNlbGVjdG9yO1xuICAgICAgc2VsZi5pc1JldmVydGVkID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBzZWxmLmxhc3QgPSBmO1xuICAgIHJldHVybiBuYW1lID09PSBfaXNGdW5jdGlvbiA/IGYoc2VsZiwgZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgIHJldHVybiBzZWxmLmFkZChudWxsLCBmdW5jKTtcbiAgICB9KSA6IG5hbWUgPyBzZWxmW25hbWVdID0gZiA6IGY7XG4gIH07XG5cbiAgX3Byb3RvNS5pZ25vcmUgPSBmdW5jdGlvbiBpZ25vcmUoZnVuYykge1xuICAgIHZhciBwcmV2ID0gX2NvbnRleHQ7XG4gICAgX2NvbnRleHQgPSBudWxsO1xuICAgIGZ1bmModGhpcyk7XG4gICAgX2NvbnRleHQgPSBwcmV2O1xuICB9O1xuXG4gIF9wcm90bzUuZ2V0VHdlZW5zID0gZnVuY3Rpb24gZ2V0VHdlZW5zKCkge1xuICAgIHZhciBhID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgQ29udGV4dCA/IGEucHVzaC5hcHBseShhLCBlLmdldFR3ZWVucygpKSA6IGUgaW5zdGFuY2VvZiBUd2VlbiAmJiAhKGUucGFyZW50ICYmIGUucGFyZW50LmRhdGEgPT09IFwibmVzdGVkXCIpICYmIGEucHVzaChlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYTtcbiAgfTtcblxuICBfcHJvdG81LmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgdGhpcy5fci5sZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoID0gMDtcbiAgfTtcblxuICBfcHJvdG81LmtpbGwgPSBmdW5jdGlvbiBraWxsKHJldmVydCwgbWF0Y2hNZWRpYSkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgaWYgKHJldmVydCkge1xuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHR3ZWVucyA9IF90aGlzNC5nZXRUd2VlbnMoKSxcbiAgICAgICAgICAgIGkgPSBfdGhpczQuZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICB0O1xuXG4gICAgICAgI
12666HdoaWxlIChpLS0pIHtcbiAgICAgICAgICAvLyBGbGlwIHBsdWdpbiB0d2VlbnMgYXJlIHZlcnkgZGlmZmVyZW50IGluIHRoYXQgdGhleSBzaG91bGQgYWN0dWFsbHkgYmUgcHVzaGVkIHRvIHRoZWlyIGVuZC4gVGhlIHBsdWdpbiByZXBsYWNlcyB0aGUgdGltZWxpbmUncyAucmV2ZXJ0KCkgbWV0aG9kIHRvIGRvIGV4YWN0bHkgdGhhdC4gQnV0IHdlIGFsc28gbmVlZCB0byByZW1vdmUgYW55IG9mIHRob3NlIG5lc3RlZCB0d2VlbnMgaW5zaWRlIHRoZSBmbGlwIHRpbWVsaW5lIHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5kaXZpZHVhbGx5IHJldmVydGVkLlxuICAgICAgICAgIHQgPSBfdGhpczQuZGF0YVtpXTtcblxuICAgICAgICAgIGlmICh0LmRhdGEgPT09IFwiaXNGbGlwXCIpIHtcbiAgICAgICAgICAgIHQucmV2ZXJ0KCk7XG4gICAgICAgICAgICB0LmdldENoaWxkcmVuKHRydWUsIHRydWUsIGZhbHNlKS5mb3JFYWNoKGZ1bmN0aW9uICh0d2Vlbikge1xuICAgICAgICAgICAgICByZXR1cm4gdHdlZW5zLnNwbGljZSh0d2VlbnMuaW5kZXhPZih0d2VlbiksIDEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIHNhdmUgYXMgYW4gb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGNhY2hlIHRoZSBnbG9iYWxUaW1lIGZvciBlYWNoIHR3ZWVuIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlIGR1cmluZyB0aGUgc29ydFxuXG5cbiAgICAgICAgdHdlZW5zLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnOiB0Ll9kdXIgfHwgdC5fZGVsYXkgfHwgdC5fc2F0ICYmICF0Ll9zYXQudmFycy5pbW1lZGlhdGVSZW5kZXIgPyB0Lmdsb2JhbFRpbWUoMCkgOiAtSW5maW5pdHksXG4gICAgICAgICAgICB0OiB0XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHJldHVybiBiLmcgLSBhLmcgfHwgLUluZmluaXR5O1xuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG8udC5yZXZlcnQocmV2ZXJ0KTtcbiAgICAgICAgfSk7IC8vIG5vdGU6IGFsbCBvZiB0aGUgX3N0YXJ0QXQgdHdlZW5zIHNob3VsZCBiZSByZXZlcnRlZCBpbiByZXZlcnNlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGNyZWF0ZWQsIGFuZCB0aGV5J2xsIGFsbCBoYXZlIHRoZSBzYW1lIGdsb2JhbFRpbWUgKC0xKSBzbyB0aGUgXCIgfHwgLTFcIiBpbiB0aGUgc29ydCBrZWVwcyB0aGUgb3JkZXIgcHJvcGVybHkuXG5cbiAgICAgICAgaSA9IF90aGlzNC5kYXRhLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGxvb3AgYmFja3dhcmRzIHNvIHRoYXQsIGZvciBleGFtcGxlLCBTcGxpdFRleHRzIHRoYXQgd2VyZSBjcmVhdGVkIGxhdGVyIG9uIHRoZSBzYW1lIGVsZW1lbnQgZ2V0IHJldmVydGVkIGZpcnN0XG4gICAgICAgICAgdCA9IF90aGlzNC5kYXRhW2ldO1xuXG4gICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBUaW1lbGluZSkge1xuICAgICAgICAgICAgaWYgKHQuZGF0YSAhPT0gXCJuZXN0ZWRcIikge1xuICAgICAgICAgICAgICB0LnNjcm9sbFRyaWdnZXIgJiYgdC5zY3JvbGxUcmlnZ2VyLnJldmVydCgpO1xuICAgICAgICAgICAgICB0LmtpbGwoKTsgLy8gZG9uJ3QgcmV2ZXJ0KCkgdGhlIHRpbWVsaW5lIGJlY2F1c2UgdGhhdCdzIGR1cGxpY2F0aW5nIGVmZm9ydHMgc2luY2Ugd2UgYWxyZWFkeSByZXZlcnRlZCBhbGwgdGhlIHR3ZWVuc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAhKHQgaW5zdGFuY2VvZiBUd2VlbikgJiYgdC5yZXZlcnQgJiYgdC5yZXZlcnQocmV2ZXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczQuX3IuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgICAgIHJldHVybiBmKHJldmVydCwgX3RoaXM0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXM0LmlzUmV2ZXJ0ZWQgPSB0cnVlO1xuICAgICAgfSkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUua2lsbCAmJiBlLmtpbGwoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXIoKTtcblxuICAgIGlmIChtYXRjaE1lZGlhKSB7XG4gICAgICB2Y
12666XIgaSA9IF9tZWRpYS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgLy8gcHJldmlvdXNseSwgd2UgY2hlY2tlZCBfbWVkaWEuaW5kZXhPZih0aGlzKSwgYnV0IHNvbWUgZnJhbWV3b3JrcyBsaWtlIFZ1ZSBlbmZvcmNlIFByb3h5IG9iamVjdHMgdGhhdCBtYWtlIGl0IGltcG9zc2libGUgdG8gZ2V0IHRoZSBwcm9wZXIgcmVzdWx0IHRoYXQgd2F5LCBzbyB3ZSBtdXN0IHVzZSBhIHVuaXF1ZSBJRCBudW1iZXIgaW5zdGVhZC5cbiAgICAgICAgX21lZGlhW2ldLmlkID09PSB0aGlzLmlkICYmIF9tZWRpYS5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIGtpbGxXaXRoQ2xlYW51cCgpIHtcbiAgLy8gXHR0aGlzLmtpbGwoKTtcbiAgLy8gXHR0aGlzLl9yLmZvckVhY2goZiA9PiBmKGZhbHNlLCB0aGlzKSk7XG4gIC8vIH1cbiAgO1xuXG4gIF9wcm90bzUucmV2ZXJ0ID0gZnVuY3Rpb24gcmV2ZXJ0KGNvbmZpZykge1xuICAgIHRoaXMua2lsbChjb25maWcgfHwge30pO1xuICB9O1xuXG4gIHJldHVybiBDb250ZXh0O1xufSgpO1xuXG52YXIgTWF0Y2hNZWRpYSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hdGNoTWVkaWEoc2NvcGUpIHtcbiAgICB0aGlzLmNvbnRleHRzID0gW107XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIF9jb250ZXh0ICYmIF9jb250ZXh0LmRhdGEucHVzaCh0aGlzKTtcbiAgfVxuXG4gIHZhciBfcHJvdG82ID0gTWF0Y2hNZWRpYS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvNi5hZGQgPSBmdW5jdGlvbiBhZGQoY29uZGl0aW9ucywgZnVuYywgc2NvcGUpIHtcbiAgICBfaXNPYmplY3QoY29uZGl0aW9ucykgfHwgKGNvbmRpdGlvbnMgPSB7XG4gICAgICBtYXRjaGVzOiBjb25kaXRpb25zXG4gICAgfSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCgwLCBzY29wZSB8fCB0aGlzLnNjb3BlKSxcbiAgICAgICAgY29uZCA9IGNvbnRleHQuY29uZGl0aW9ucyA9IHt9LFxuICAgICAgICBtcSxcbiAgICAgICAgcCxcbiAgICAgICAgYWN0aXZlO1xuICAgIF9jb250ZXh0ICYmICFjb250ZXh0LnNlbGVjdG9yICYmIChjb250ZXh0LnNlbGVjdG9yID0gX2NvbnRleHQuc2VsZWN0b3IpOyAvLyBpbiBjYXNlIGEgY29udGV4dCBpcyBjcmVhdGVkIGluc2lkZSBhIGNvbnRleHQuIExpa2UgYSBnc2FwLm1hdGNoTWVkaWEoKSB0aGF0J3MgaW5zaWRlIGEgc2NvcGVkIGdzYXAuY29udGV4dCgpXG5cbiAgICB0aGlzLmNvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgZnVuYyA9IGNvbnRleHQuYWRkKFwib25NYXRjaFwiLCBmdW5jKTtcbiAgICBjb250ZXh0LnF1
12666ZXJpZXMgPSBjb25kaXRpb25zO1xuXG4gICAgZm9yIChwIGluIGNvbmRpdGlvbnMpIHtcbiAgICAgIGlmIChwID09PSBcImFsbFwiKSB7XG4gICAgICAgIGFjdGl2ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtcSA9IF93aW4ubWF0Y2hNZWRpYShjb25kaXRpb25zW3BdKTtcblxuICAgICAgICBpZiAobXEpIHtcbiAgICAgICAgICBfbWVkaWEuaW5kZXhPZihjb250ZXh0KSA8IDAgJiYgX21lZGlhLnB1c2goY29udGV4dCk7XG4gICAgICAgICAgKGNvbmRbcF0gPSBtcS5tYXRjaGVzKSAmJiAoYWN0aXZlID0gMSk7XG4gICAgICAgICAgbXEuYWRkTGlzdGVuZXIgPyBtcS5hZGRMaXN0ZW5lcihfb25NZWRpYUNoYW5nZSkgOiBtcS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIF9vbk1lZGlhQ2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGFjdGl2ZSAmJiBmdW5jKGNvbnRleHQsIGZ1bmN0aW9uIChmKSB7XG4gICAgICByZXR1cm4gY29udGV4dC5hZGQobnVsbCwgZik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gLy8gcmVmcmVzaCgpIHtcbiAgLy8gXHRsZXQgdGltZSA9IF9sYXN0TWVkaWFUaW1lLFxuICAvLyBcdFx0bWVkaWEgPSBfbWVkaWE7XG4gIC8vIFx0X2xhc3RNZWRpYVRpbWUgPSAtMTtcbiAgLy8gXHRfbWVkaWEgPSB0aGlzLmNvbnRleHRzO1xuICAvLyBcdF9vbk1lZGlhQ2hhbmdlKCk7XG4gIC8vIFx0X2xhc3RNZWRpYVRpbWUgPSB0aW1lO1xuICAvLyBcdF9tZWRpYSA9IG1lZGlhO1xuICAvLyB9XG4gIDtcblxuICBfcHJvdG82LnJldmVydCA9IGZ1bmN0aW9uIHJldmVydChjb25maWcpIHtcbiAgICB0aGlzLmtpbGwoY29uZmlnIHx8IHt9KTtcbiAgfTtcblxuICBfcHJvdG82LmtpbGwgPSBmdW5jdGlvbiBraWxsKHJldmVydCkge1xuICAgIHRoaXMuY29udGV4dHMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIGMua2lsbChyZXZlcnQsIHRydWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBNYXRjaE1lZGlhO1xufSgpO1xuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBHU0FQXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxudmFyIF9nc2FwID0ge1xuICByZWdpc3RlclBsdWdpbjogZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW4oKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIHJldHVybiBfY3JlYXRlUGx1Z2luKGNvbmZpZyk7XG4gICAgfSk7XG4gIH0sXG4gIHRpbWVsaW5lOiBmdW5jdGlvbiB0aW1lbGluZSh2YXJzKSB7XG4gICAgcmV0dXJuIG5ldyBUaW1lbGluZSh2YXJzKTtcbiAgfSxcbiAgZ2V0VHdlZW5zT2Y6IGZ1bmN0aW9uIGdldFR3ZWVuc09mKHRhcmdldHMsIG9ubHlBY3RpdmUpIHtcbiAgICByZXR1cm4gX2dsb2JhbFRpbWVsaW5lLmdldFR3ZWVuc09mKHRhcmdldHMsIG9ubHlBY3RpdmUpO1xuICB9LFxuICBnZXRQcm9wZXJ0eTogZnVuY3Rpb24gZ2V0UHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCwgdW5jYWNoZSkge1xuICAgIF9pc1N0cmluZyh0YXJnZXQpICYmICh0YXJnZXQgPSB0b0FycmF5KHRhcmdldClbMF0pOyAvL2luIGNhc2Ugc2VsZWN0b3IgdGV4dCBvciBhbiBhcnJheSBpcyBwYXNzZWQgaW5cblxuICAgIHZhciBnZXR0ZXIgPSBfZ2V0Q2FjaGUodGFyZ2V0IHx8IHt9KS5nZXQsXG4gICAgICAgIGZvcm1hdCA9IHVuaXQgPyBfcGFzc1Rocm91Z2ggOiBfbnVtZXJpY0lmUG9zc2libGU7XG5cbiAgICB1bml0ID09PSBcIm5hdGl2ZVwiICYmICh1bml0ID0gXCJcIik7XG4gICAgcmV0dXJuICF0YXJnZXQgPyB0YXJnZXQgOiAhcHJvcGVydHkgPyBmdW5jdGlvbiAocHJvcGVydHksIHVuaXQsIHVuY2FjaGUpIHtcbiAgICAgIHJldHVybiBmb3JtYXQoKF9wbHVnaW5zW3Byb3BlcnR5XSAmJiBfcGx1Z2luc1twcm9wZXJ0eV0uZ2V0IHx8IGdldHRlcikodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCwgdW5jYWNoZSkpO1xuICAgIH0gOiBmb3JtYXQoKF9wbHVnaW5zW3Byb3BlcnR5XSAmJiBfcGx1Z2luc1twcm9wZXJ0eV0uZ2V0IHx8IGdldHRlcikodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCwgdW5jYWNoZSkpO1xuICB9LFxuICBxdWlja1NldHRlcjogZnVuY3Rpb24gcXVpY2tTZXR0ZXIodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCkge1xuICAgIHRhcmdldCA9IHRvQXJyYXkodGFyZ2V0KTtcblxuICAgIGlmICh0YXJnZXQubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIHNldHRlcnMgPSB0YXJnZXQubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBnc2FwLnF1aWNrU2V0dGVyKHQsIHByb3BlcnR5LCB1bml0KTtcbiAgICAgIH0pLFxuICAgICAgICAgIGwgPSBzZXR0ZXJzLmxlbmd0aDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGkgPSBsO1xuXG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICBzZXR0ZXJzW2ldKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSB0YXJnZXRbMF0gfHwge307XG5cbiAgICB2YXIgUGx1Z2luID0gX3BsdWdpbnNbcHJvcGVydHldLFxuICAgICAgICBjYWNoZSA9IF9nZXRDYWNoZSh0YXJnZXQpLFxuICAgICAgICBwID0gY2FjaGUuaGFybmVzcyAmJiAoY2FjaGUuaGFybmVzcy5hbGlhc2VzIHx8IHt9KVtwcm9wZXJ0eV0gfHwgcHJvcGVydHksXG4gICAgICAgIC8vIGluIGNhc2UgaXQncyBhbiBhbGlhcywgbGlrZSBcInJvdGF0ZVwiIGZvciBcInJvdGF0aW9uXCIuXG4gICAgc2V0dGVyID0gUGx1Z2luID8gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB2Y
12666XIgcCA9IG5ldyBQbHVnaW4oKTtcbiAgICAgIF9xdWlja1R3ZWVuLl9wdCA9IDA7XG4gICAgICBwLmluaXQodGFyZ2V0LCB1bml0ID8gdmFsdWUgKyB1bml0IDogdmFsdWUsIF9xdWlja1R3ZWVuLCAwLCBbdGFyZ2V0XSk7XG4gICAgICBwLnJlbmRlcigxLCBwKTtcbiAgICAgIF9xdWlja1R3ZWVuLl9wdCAmJiBfcmVuZGVyUHJvcFR3ZWVucygxLCBfcXVpY2tUd2Vlbik7XG4gICAgfSA6IGNhY2hlLnNldCh0YXJnZXQsIHApO1xuXG4gICAgcmV0dXJuIFBsdWdpbiA/IHNldHRlciA6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHNldHRlcih0YXJnZXQsIHAsIHVuaXQgPyB2YWx1ZSArIHVuaXQgOiB2YWx1ZSwgY2FjaGUsIDEpO1xuICAgIH07XG4gIH0sXG4gIHF1aWNrVG86IGZ1bmN0aW9uIHF1aWNrVG8odGFyZ2V0LCBwcm9wZXJ0eSwgdmFycykge1xuICAgIHZhciBfc2V0RGVmYXVsdHMyO1xuXG4gICAgdmFyIHR3ZWVuID0gZ3NhcC50byh0YXJnZXQsIF9zZXREZWZhdWx0cygoX3NldERlZmF1bHRzMiA9IHt9LCBfc2V0RGVmYXVsdHMyW3Byb3BlcnR5XSA9IFwiKz0wLjFcIiwgX3NldERlZmF1bHRzMi5wYXVzZWQgPSB0cnVlLCBfc2V0RGVmYXVsdHMyLnN0YWdnZXIgPSAwLCBfc2V0RGVmYXVsdHMyKSwgdmFycyB8fCB7fSkpLFxuICAgICAgICBmdW5jID0gZnVuY3Rpb24gZnVuYyh2YWx1ZSwgc3RhcnQsIHN0YXJ0SXNSZWxhdGl2ZSkge1xuICAgICAgcmV0dXJuIHR3ZWVuLnJlc2V0VG8ocHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlKTtcbiAgICB9O1xuXG4gICAgZnVuYy50d2VlbiA9IHR3ZWVuO1xuICAgIHJldHVybiBmdW5jO1xuICB9LFxuICBpc1R3ZWVuaW5nOiBmdW5jdGlvbiBpc1R3ZWVuaW5nKHRhcmdldHMpIHtcbiAgICByZXR1cm4gX2dsb2JhbFRpbWVsaW5lLmdldFR3ZWVuc09mKHRhcmdldHMsIHRydWUpLmxlbmd0aCA+IDA7XG4gIH0sXG4gIGRlZmF1bHRzOiBmdW5jdGlvbiBkZWZhdWx0cyh2YWx1ZSkge1xuICAgIHZhbHVlICYmIHZhbHVlLmVhc2UgJiYgKHZhbHVlLmVhc2UgPSBfcGFyc2VFYXNlKHZhbHVlLmVhc2UsIF9kZWZhdWx0cy5lYXNlKSk7XG4gICAgcmV0dXJuIF9tZXJnZURlZXAoX2RlZmF1bHRzLCB2YWx1ZSB8fCB7fSk7XG4gIH0sXG4gIGNvbmZpZzogZnVuY3Rpb24gY29uZmlnKHZhbHVlKSB7XG4gICAgcmV0dXJuIF9tZXJnZURlZXAoX2NvbmZpZywgdmFsdWUgfHwge30pO1xuICB9LFxuICByZWdpc3RlckVmZmVjdDogZnVuY3Rpb24gcmVnaXN0ZXJFZmZlY3QoX3JlZjMpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXG4gICAgICAgIGVmZmVjdCA9IF9yZWYzLmVmZmVjdCxcbiAgICAgICAgcGx1Z2lucyA9IF9yZWYzLnBsdWdpbnMsXG4gICAgICAgIGRlZmF1bHRzID0gX3JlZjMuZGVmYXVsdHMsXG4gICAgICAgIGV4dGVuZFRpbWVsaW5lID0gX3JlZjMuZXh0ZW5kVGltZWxpbmU7XG4gICAgKHBsdWdpbnMgfHwgXCJcIikuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbk5hbWUpIHtcbiAgICAgIHJldHVybiBwbHVnaW5OYW1lICYmICFfcGx1Z2luc1twbHVnaW5OYW1lXSAmJiAhX2dsb2JhbHNbcGx1Z2luTmFtZV0gJiYgX3dhcm4obmFtZSArIFwiIGVmZmVjdCByZXF1aXJlcyBcIiArIHBsdWdpbk5hbWUgKyBcIiBwbHVnaW4uXCIpO1xuICAgIH0pO1xuXG4gICAgX2VmZmVjdHNbbmFtZV0gPSBmdW5jdGlvbiAodGFyZ2V0cywgdmFycywgdGwpIHtcbiAgICAgIHJldHVybiBlZmZlY3QodG9BcnJheSh0YXJnZXRzKSwgX3NldERlZmF1bHRzKHZhcnMgfHwge30sIGRlZmF1bHRzKSwgdGwpO1xuICAgIH07XG5cbiAgICBpZiAoZXh0ZW5kVGltZWxpbmUpIHtcbiAgICAgIFRpbWVsaW5lLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uICh0YXJnZXRzLCB2YXJzLCBwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGQoX2VmZmVjdHNbbmFtZV0odGFyZ2V0cywgX2lzT2JqZWN0KHZhcnMpID8gdmFycyA6IChwb3NpdGlvbiA9IHZhcnMpICYmIHt9LCB0aGlzKSwgcG9zaXRpb24pO1xuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIHJlZ2lzdGVyRWFzZTogZnVuY3Rpb24gcmVnaXN0ZXJFYXNlKG5hbWUsIGVhc2UpIHtcbiAgICBfZWFzZU1hcFtuYW1lXSA9IF9wYXJzZUVhc2UoZWFzZSk7XG4gIH0sXG4gIHBhcnNlRWFzZTogZnVuY3Rpb24gcGFyc2VFYXNlKGVhc2UsIGRlZmF1bHRFYXNlKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBfcGFyc2VFYXNlKGVhc2UsIGRlZmF1bHRFYXNlKSA6IF9lYXNlTWFwO1xuICB9LFxuICBnZXRCeUlkOiBmdW5jdGlvbiBnZXRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIF9nbG9iYWxUaW1lbGluZS5nZXRCeUlkKGlkKTtcbiAgfSxcbiAgZXhwb3J0Um9vdDogZnVuY3Rpb24gZXhwb3J0Um9vdCh2YXJzLCBpbmNsdWRlRGVsYXllZENhbGxzKSB7XG4gICAgaWYgKHZhcnMgPT09IHZvaWQgMCkge1xuICAgICAgdmFycyA9IHt9O1xuICAgIH1cblxuICAgIHZhciB0bCA9IG5ldyBUaW1lbGluZSh2YXJzKSxcbiAgICAgICAgY2hpbGQsXG4gICAgICAgIG5leHQ7XG4gICAgdGwuc21vb3RoQ2hpbGRUaW1pbmcgPSBfaXNOb3RGYWxzZSh2YXJzLnNtb290aENoaWxkVGltaW5nKTtcblxuICAgIF9nbG9iYWxUaW1lbGluZS5yZW1vdmUodGwpO1xuXG4gICAgdGwuX2RwID0gMDsgLy9vdGhlcndpc2UgaXQnbGwgZ2V0IHJlLWFjdGl2YXRlZCB3aGVuIGFkZGluZyBjaGlsZHJlbiBhbmQgYmUgcmUtaW50cm9kdWNlZCBpbnRvIF9nbG9iYWxUaW1lbGluZSdzIGxpbmtlZCBsaXN0ICh0aGVuIGFkZGVkIHRvIGl0c2VsZikuXG5cbiAgICB0bC5fdGltZSA9IHRsLl90VGltZSA9IF9nbG9iYWxUaW1lbGluZS5fdGltZTtcbiAgICBjaGlsZCA9IF9nbG9iYWxUaW1lbGluZS5fZmlyc3Q7XG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIG5leHQgPSBjaGlsZC5fbmV4dDtcblxuICAgICAgaWYgKGluY2x1ZGVEZWxheWVkQ2FsbHMgfHwgISghY2hpbGQuX2R1ciAmJiBjaGlsZCBpbnN0YW5jZW9mIFR3ZWVuICYmIGNoaWxkLnZhcnMub25Db21wbGV0ZSA9PT0gY2hpbGQuX3RhcmdldHNbMF0pKSB7XG4gICAgICAgIF9hZGRUb1RpbWVsaW5lKHRsLCBjaGlsZCwgY2hpbGQuX3N0YXJ0IC0gY2hpbGQuX2RlbGF5KTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBuZXh0O1xuICAgIH1cblxuICAgIF9hZGRUb1RpbWVsaW5lKF9nbG9iYWxUaW1lbGluZSwgdGwsIDApO1xuXG4gICAgcmV0dXJuIHRsO1xuICB9LFxuICBjb250ZXh0OiBmdW5jdGlvbiBjb250ZXh0KGZ1bmMsIHNjb3BlKSB7XG4gICAgcmV0dXJuIGZ1bmMgPyBuZXcgQ29udGV4dChmdW5jLCBzY29wZSkgOiBfY29udGV4dDtcbiAgfSxcbiAgbWF0Y2hNZWRpYTogZnVuY3Rpb24gbWF0Y2hNZWRpYShzY29wZSkge1xuICAgIHJldHVybi
12666BuZXcgTWF0Y2hNZWRpYShzY29wZSk7XG4gIH0sXG4gIG1hdGNoTWVkaWFSZWZyZXNoOiBmdW5jdGlvbiBtYXRjaE1lZGlhUmVmcmVzaCgpIHtcbiAgICByZXR1cm4gX21lZGlhLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgIHZhciBjb25kID0gYy5jb25kaXRpb25zLFxuICAgICAgICAgIGZvdW5kLFxuICAgICAgICAgIHA7XG5cbiAgICAgIGZvciAocCBpbiBjb25kKSB7XG4gICAgICAgIGlmIChjb25kW3BdKSB7XG4gICAgICAgICAgY29uZFtwXSA9IGZhbHNlO1xuICAgICAgICAgIGZvdW5kID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3VuZCAmJiBjLnJldmVydCgpO1xuICAgIH0pIHx8IF9vbk1lZGlhQ2hhbmdlKCk7XG4gIH0sXG4gIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgYSA9IF9saXN0ZW5lcnNbdHlwZV0gfHwgKF9saXN0ZW5lcnNbdHlwZV0gPSBbXSk7XG4gICAgfmEuaW5kZXhPZihjYWxsYmFjaykgfHwgYS5wdXNoKGNhbGxiYWNrKTtcbiAgfSxcbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaykge1xuICAgIHZhciBhID0gX2xpc3RlbmVyc1t0eXBlXSxcbiAgICAgICAgaSA9IGEgJiYgYS5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICBpID49IDAgJiYgYS5zcGxpY2UoaSwgMSk7XG4gIH0sXG4gIHV0aWxzOiB7XG4gICAgd3JhcDogd3JhcCxcbiAgICB3cmFwWW95bzogd3JhcFlveW8sXG4gICAgZGlzdHJpYnV0ZTogZGlzdHJpYnV0ZSxcbiAgICByYW5kb206IHJhbmRvbSxcbiAgICBzbmFwOiBzbmFwLFxuICAgIG5vcm1hbGl6ZTogbm9ybWFsaXplLFxuICAgIGdldFVuaXQ6IGdldFVuaXQsXG4gICAgY2xhbXA6IGNsYW1wLFxuICAgIHNwbGl0Q29sb3I6IHNwbGl0Q29sb3IsXG4gICAgdG9BcnJheTogdG9BcnJheSxcbiAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgbWFwUmFuZ2U6IG1hcFJhbmdlLFxuICAgIHBpcGU6IHBpcGUsXG4gICAgdW5pdGl6ZTogdW5pdGl6ZSxcbiAgICBpbnRlcnBvbGF0ZTogaW50ZXJwb2xhdGUsXG4gICAgc2h1ZmZsZTogc2h1ZmZsZVxuICB9LFxuICBpbnN0YWxsOiBfaW5zdGFsbCxcbiAgZWZmZWN0czogX2VmZmVjdHMsXG4gIHRpY2tlcjogX3RpY2tlcixcbiAgdXBkYXRlUm9vdDogVGltZWxpbmUudXBkYXRlUm9vdCxcbiAgcGx1Z2luczogX3BsdWdpbnMsXG4gIGdsb2JhbFRpbWVsaW5lOiBfZ2xvYmFsVGltZWxpbmUsXG4gIGNvcmU6IHtcbiAgICBQcm9wVHdlZW46IFByb3BUd2VlbixcbiAgICBnbG9iYWxzOiBfYWRkR2xvYmFsLFxuICAgIFR3ZWVuOiBUd2VlbixcbiAgICBUaW1lbGluZTogVGltZWxpbmUsXG4gICAgQW5pbWF0aW9uOiBBbmltYXRpb24sXG4gICAgZ2V0Q2FjaGU6IF9nZXRDYWNoZSxcbiAgICBfcmVtb3ZlTGlua2VkTGlzdEl0ZW06IF9yZW1vdmVMaW5rZWRMaXN0SXRlbSxcbiAgICByZXZlcnRpbmc6IGZ1bmN0aW9uIHJldmVydGluZygpIHtcbiAgICAgIHJldHVybiBfcmV2ZXJ0aW5nO1xuICAgIH0sXG4gICAgY29udGV4dDogZnVuY3Rpb24gY29udGV4dCh0b0FkZCkge1xuICAgICAgaWYgKHRvQWRkICYmIF9jb250ZXh0KSB7XG4gICAgICAgIF9jb250ZXh0LmRhdGEucHVzaCh0b0FkZCk7XG5cbiAgICAgICAgdG9BZGQuX2N0eCA9IF9jb250ZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2NvbnRleHQ7XG4gICAgfSxcbiAgICBzdXBwcmVzc092ZXJ3cml0ZXM6IGZ1bmN0aW9uIHN1cHByZXNzT3ZlcndyaXRlcyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIF9zdXBwcmVzc092ZXJ3cml0ZXMgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn07XG5cbl9mb3JFYWNoTmFtZShcInRvLGZyb20sZnJvbVRvLGRlbGF5ZWRDYWxsLHNldCxraWxsVHdlZW5zT2ZcIiwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF9nc2FwW25hbWVdID0gVHdlZW5bbmFtZV07XG59KTtcblxuX3RpY2tlci5hZGQoVGltZWxpbmUudXBkYXRlUm9vdCk7XG5cbl9xdWlja1R3ZWVuID0gX2dzYXAudG8oe30sIHtcbiAgZHVyYXRpb246IDBcbn0pOyAvLyAtLS0tIEVYVFJBIFBMVUdJTlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIF9nZXRQbHVnaW5Qcm9wVHdlZW4gPSBmdW5jdGlvbiBfZ2V0UGx1Z2luUHJvcFR3ZWVuKHBsdWdpbiwgcHJvcCkge1xuICB2YXIgcHQgPSBwbHVnaW4uX3B0O1xuXG4gIHdoaWxlIChwdCAmJiBwdC5wICE9PSBwcm9wICYmIHB0Lm9wICE9PSBwcm9wICYmIHB0LmZwICE9PSBwcm9wKSB7XG4gICAgcHQgPSBwdC5fbmV4dDtcbiAgfVxuXG4gIHJldHVybiBwdDtcbn0sXG4gICAgX2FkZE1vZGlmaWVycyA9IGZ1bmN0aW9uIF9hZGRNb2RpZmllcnModHdlZW4sIG1vZGlmaWVycykge1xuICB2YXIgdGFyZ2V0cyA9IHR3ZWVuLl90YXJnZXRzLFxuICAgICAgcCxcbiAgICAgIGksXG4gICAgICBwdDtcblxuICBmb3IgKHAgaW4gbW9kaWZpZXJzKSB7XG4gICAgaSA9IHRhcmdldHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgcHQgPSB0d2Vlbi5fcHRMb29rdXBbaV1bcF07XG5cbiAgICAgIGlmIChwdCAmJiAocHQgPSBwdC5kKSkge1xuICAgICAgICBpZiAocHQuX3B0KSB7XG4gICAgICAgICAgLy8gaXMgYSBwbHVnaW5cbiAgICAgICAgICBwdCA9IF9nZXRQbHVnaW5Qcm9wVHdlZW4ocHQsIHApO1xuICAgICAgICB9XG5cbiAgICAgICAgcHQgJiYgcHQubW9kaWZpZXIgJiYgcHQubW9kaWZpZXIobW9kaWZpZXJzW3BdLCB0d2VlbiwgdGFyZ2V0c1tpXSwgcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59LFxuICAgIF9idWlsZE1vZGlmaWVyUGx1Z2luID0gZnVuY3Rpb24gX2J1aWxkTW9kaWZpZXJQbHVnaW4obmFtZSwgbW9kaWZpZXIpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGhlYWRsZXNzOiAxLFxuICAgIHJhd1ZhcnM6IDEsXG4gICAgLy9kb24ndCBwcmUtcHJvY2VzcyBmdW5jdGlvbi1iYXNlZCB2YWx1ZXMgb3IgXCJyYW5kb20oKVwiIHN0cmluZ3MuXG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdCh0YXJnZXQsIHZhcnMsIHR3ZWVuKSB7XG4gICAgICB0d2Vlbi5fb25Jbml0ID0gZnVuY3Rpb24gKHR3ZWVuKSB7XG4gICAgICAgI
12666HZhciB0ZW1wLCBwO1xuXG4gICAgICAgIGlmIChfaXNTdHJpbmcodmFycykpIHtcbiAgICAgICAgICB0ZW1wID0ge307XG5cbiAgICAgICAgICBfZm9yRWFjaE5hbWUodmFycywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wW25hbWVdID0gMTtcbiAgICAgICAgICB9KTsgLy9pZiB0aGUgdXNlciBwYXNzZXMgaW4gYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB0byByb3VuZFByb3BzLCBsaWtlIFwieCx5XCIsIHdlIHJvdW5kIHRvIHdob2xlIG51bWJlcnMuXG5cblxuICAgICAgICAgIHZhcnMgPSB0ZW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGlmaWVyKSB7XG4gICAgICAgICAgdGVtcCA9IHt9O1xuXG4gICAgICAgICAgZm9yIChwIGluIHZhcnMpIHtcbiAgICAgICAgICAgIHRlbXBbcF0gPSBtb2RpZmllcih2YXJzW3BdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXJzID0gdGVtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIF9hZGRNb2RpZmllcnModHdlZW4sIHZhcnMpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59OyAvL3JlZ2lzdGVyIGNvcmUgcGx1Z2luc1xuXG5cbmV4cG9ydCB2YXIgZ3NhcCA9IF9nc2FwLnJlZ2lzdGVyUGx1Z2luKHtcbiAgbmFtZTogXCJhdHRyXCIsXG4gIGluaXQ6IGZ1bmN0aW9uIGluaXQodGFyZ2V0LCB2YXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldHMpIHtcbiAgICB2YXIgcCwgcHQsIHY7XG4gICAgdGhpcy50d2VlbiA9IHR3ZWVuO1xuXG4gICAgZm9yIChwIGluIHZhcnMpIHtcbiAgICAgIHYgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHApIHx8IFwiXCI7XG4gICAgICBwdCA9IHRoaXMuYWRkKHRhcmdldCwgXCJzZXRBdHRyaWJ1dGVcIiwgKHYgfHwgMCkgKyBcIlwiLCB2YXJzW3BdLCBpbmRleCwgdGFyZ2V0cywgMCwgMCwgcCk7XG4gICAgICBwdC5vcCA9IHA7XG4gICAgICBwdC5iID0gdjsgLy8gcmVjb3JkIHRoZSBiZWdpbm5pbmcgdmFsdWUgc28gd2UgY2FuIHJldmVydCgpXG5cbiAgICAgIHRoaXMuX3Byb3BzLnB1c2gocCk7XG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihyYXRpbywgZGF0YSkge1xuICAgIHZhciBwdCA9IGRhdGEuX3B0O1xuXG4gICAgd2hpbGUgKHB0KSB7XG4gICAgICBfcmV2ZXJ0aW5nID8gcHQuc2V0KHB0LnQsIHB0LnAsIHB0LmIsIHB0KSA6IHB0LnIocmF0aW8sIHB0LmQpOyAvLyBpZiByZXZlcnRpbmcsIGdvIGJhY2sgdG8gdGhlIG9yaWdpbmFsIChwdC5iKVxuXG4gICAgICBwdCA9IHB0Ll9uZXh0O1xuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiBcImVuZEFycmF5XCIsXG4gIGhlYWRsZXNzOiAxLFxuICBpbml0OiBmdW5jdGlvbiBpbml0KHRhcmdldCwgdmFsdWUpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMuYWRkKHRhcmdldCwgaSwgdGFyZ2V0W2ldIHx8IDAsIHZhbHVlW2ldLCAwLCAwLCAwLCAwLCAwLCAxKTtcbiAgICB9XG4gIH1cbn0sIF9idWlsZE1vZGlmaWVyUGx1Z2luKFwicm91bmRQcm9wc1wiLCBfcm91bmRNb2RpZmllciksIF9idWlsZE1vZGlmaWVyUGx1Z2luKFwibW9kaWZpZXJzXCIpLCBfYnVpbGRNb2RpZmllclBsdWdpbihcInNuYXBcIiwgc25hcCkpIHx8IF9nc2FwOyAvL3RvIHByZXZlbnQgdGhlIGNvcmUgcGx1Z2lucyBmcm9tIGJlaW5nIGRyb3BwZWQgdmlhIGFnZ3Jlc3NpdmUgdHJlZSBzaGFraW5nLCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaW4gdGhpcyB3YXkuXG5cblR3ZWVuLnZlcnNpb24gPSBUaW1lbGluZS52ZXJzaW9uID0gZ3NhcC52ZXJzaW9uID0gXCIzLjE1LjBcIjtcbl9jb3JlUmVhZHkgPSAxO1xuX3dpbmRvd0V4aXN0cygpICYmIF93YWtlKCk7XG52YXIgUG93ZXIwID0gX2Vhc2VNYXAuUG93ZXIwLFxuICAgIFBvd2VyMSA9IF9lYXNlTWFwLlBvd2VyMSxcbiAgICBQb3dlcjIgPSBfZWFzZU1hcC5Qb3dlcjIsXG4gICAgUG93ZXIzID0gX2Vhc2VNYXAuUG93ZXIzLFxuICAgIFBvd2VyNCA9IF9lYXNlTWFwLlBvd2VyNCxcbiAgICBMaW5lYXIgPSBfZWFzZU1hcC5MaW5lYXIsXG4gICAgUXVhZCA9IF9lYXNlTWFwLlF1YWQsXG4gICAgQ3ViaWMgPSBfZWFzZU1hcC5DdWJpYyxcbiAgICBRdWFydCA9IF9lYXNlTWFwLlF1YXJ0LFxuICAgIFF1aW50ID0gX2Vhc2VNYXAuUXVpbnQsXG4gICAgU3Ryb25nID0gX2Vhc2VNYXAuU3Ryb25nLFxuICAgIEVsYXN0aWMgPSBfZWFzZU1hcC5FbGFzdGljLFxuICAgIEJhY2sgPSBfZWFzZU1hcC5CYWNrLFxuICAgIFN0ZXBwZWRFYXNlID0gX2Vhc2VNYXAuU3RlcHBlZEVhc2UsXG4gICAgQm91bmNlID0gX2Vhc2VNYXAuQm91bmNlLFxuICAgIFNpbmUgPSBfZWFzZU1hcC5TaW5lLFxuICAgIEV4cG8gPSBfZWFzZU1hcC5FeHBvLFxuICAgIENpcmMgPSBfZWFzZU1hcC5DaXJjO1xuZXhwb3J0IHsgUG93ZXIwLCBQb3dlcjEsIFBvd2VyMiwgUG93ZXIzLCBQb3dlcjQsIExpbmVhciwgUXVhZCwgQ3ViaWMsIFF1YXJ0LCBRdWludCwgU3Ryb25nLCBFbGFzdGljLCBCYWNrLCBTdGVwcGVkRWFzZSwgQm91bmNlLCBTaW5lLCBFeHBvLCBDaXJjIH07XG5leHBvcnQgeyBUd2VlbiBhcyBUd2Vlbk1heCwgVHdlZW4gYXMgVHdlZW5MaXRlLCBUaW1lbGluZSBhcyBUaW1lbGluZU1heCwgVGltZWxpbmUgYXMgVGltZWxpbmVMaXRlLCBnc2FwIGFzIGRlZmF1bHQsIHdyYXAsIHdyYXBZb3lvLCBkaXN0cmlidXRlLCByYW5kb20sIHNuYXAsIG5vcm1hbGl6ZSwgZ2V0VW5pdCwgY2xhbXAsIHNwbGl0Q29sb3IsIHRvQXJyYXksIHNlbGVjdG9yLCBtYXBSYW5nZSwgcGlwZSwgdW5pdGl6ZSwgaW50ZXJwb2xhdGUsIHNodWZmbGUgfTsgLy9leHBvcnQgc29tZSBpbnRlcm5hbCBtZXRob2RzL29yb2plY3RzIGZvciB1c2UgaW4gQ1NTUGx1Z2luIHNvIHRoYXQgd2UgY2FuIGV4dGVybmFsaXplIHRoYXQgZmlsZSBhbmQgYWxsb3cgY3VzdG9tIGJ1aWxkcyB0aGF0IGV4Y2x1ZGUgaXQuXG5cbmV4cG9ydCB7IF9nZXRQcm9wZXJ0eSwgX251bUV4cCwgX251bVdpdGhVbml0RXhwLCBfaXNTdHJpbmcsIF9pc1VuZGVmaW5lZCwgX3JlbmRlckNvbXBsZXhTdHJpbmcsIF9yZWxFeHAsIF9zZXREZWZhdWx0cywgX3JlbW92ZUxpbmtlZExpc3RJdGVtLCBfZm9yRWFjaE5hbWUsIF9zb3J0UHJvcFR3ZWVuc0J5UHJpb3JpdHksIF9jb2xvclN0cmluZ0ZpbHRlciwgX3JlcGxhY2VSYW5kb20sIF9jaGVja1BsdWdpbiwgX3BsdWdpbnMsIF90aWNrZXIsIF9jb25maWcsIF9yb3VuZE1vZGlmaWVyLCBfcm91bmQsIF9taXNzaW5nUGx1Z2luLCBfZ2V0U2V0dGVyLCBfZ2V0Q2FjaGUsIF9jb2xvckV4cCwgX3BhcnNlUmVsYXRpdmUgfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
12667//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/gsap-core.js
12668
12669}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
12670/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12671/* harmony export */   Back: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Back),
12672/* harmony export */   Bounce: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Bounce),
12673/* harmony export */   CSSPlugin: () => (/* reexport safe */ _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__.CSSPlugin),
12674/* harmony export */   Circ: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Circ),
12675/* harmony export */   Cubic: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Cubic),
12676/* harmony export */   Elastic: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Elastic),
12677/* harmony export */   Expo: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Expo),
12678/* harmony export */   Linear: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Linear),
12679/* harmony export */   Power0: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power0),
12680/* harmony export */   Power1: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power1),
12681/* harmony export */   Power2: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power2),
12682/* harmony export */   Power3: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power3),
12683/* harmony export */   Power4: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power4),
12684/* harmony export */   Quad: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Quad),
12685/* harmony export */   Quart: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Quart),
12686/* harmony export */   Quint: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Quint),
12687/* harmony export */   Sine: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Sine),
12688/* harmony export */   SteppedEase: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.SteppedEase),
12689/* harmony export */   Strong: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Strong),
12690/* harmony export */   TimelineLite: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.TimelineLite),
12691/* harmony export */   TimelineMax: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.TimelineMax),
12692/* harmony export */   TweenLite: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.TweenLite),
12693/* harmony export */   TweenMax: () => (/* binding */ TweenMaxWithCSS),
12694/* harmony export */   "default": () => (/* binding */ gsapWithCSS),
12695/* harmony export */   gsap: () => (/* binding */ gsapWithCSS)
12696/* harmony export */ });
12697/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/gsap-core.js");
12698/* harmony import */ var _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CSSPlugin.js */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/CSSPlugin.js");
12699
12700
12701var gsapWithCSS = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.registerPlugin(_CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__.CSSPlugin) || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap,
12702    // to protect from tree shaking
12703TweenMaxWithCSS = gsapWithCSS.core.Tween;
12704//# sourceURL=[module]
12705//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXFOO0FBQzFLO0FBQzNDLGtCQUFrQiwrQ0FBSSxnQkFBZ0Isb0RBQVMsS0FBSywrQ0FBSTtBQUN4RDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vbm9kZV9tb2R1bGVzLy5wbnBtL2dzYXBAMy4xNS4wL25vZGVfbW9kdWxlcy9nc2FwL2luZGV4LmpzPzE4ZjkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ3NhcCwgUG93ZXIwLCBQb3dlcjEsIFBvd2VyMiwgUG93ZXIzLCBQb3dlcjQsIExpbmVhciwgUXVhZCwgQ3ViaWMsIFF1YXJ0LCBRdWludCwgU3Ryb25nLCBFbGFzdGljLCBCYWNrLCBTdGVwcGVkRWFzZSwgQm91bmNlLCBTaW5lLCBFeHBvLCBDaXJjLCBUd2VlbkxpdGUsIFRpbWVsaW5lTGl
127050ZSwgVGltZWxpbmVNYXggfSBmcm9tIFwiLi9nc2FwLWNvcmUuanNcIjtcbmltcG9ydCB7IENTU1BsdWdpbiB9IGZyb20gXCIuL0NTU1BsdWdpbi5qc1wiO1xudmFyIGdzYXBXaXRoQ1NTID0gZ3NhcC5yZWdpc3RlclBsdWdpbihDU1NQbHVnaW4pIHx8IGdzYXAsXG4gICAgLy8gdG8gcHJvdGVjdCBmcm9tIHRyZWUgc2hha2luZ1xuVHdlZW5NYXhXaXRoQ1NTID0gZ3NhcFdpdGhDU1MuY29yZS5Ud2VlbjtcbmV4cG9ydCB7IGdzYXBXaXRoQ1NTIGFzIGdzYXAsIGdzYXBXaXRoQ1NTIGFzIGRlZmF1bHQsIENTU1BsdWdpbiwgVHdlZW5NYXhXaXRoQ1NTIGFzIFR3ZWVuTWF4LCBUd2VlbkxpdGUsIFRpbWVsaW5lTWF4LCBUaW1lbGluZUxpdGUsIFBvd2VyMCwgUG93ZXIxLCBQb3dlcjIsIFBvd2VyMywgUG93ZXI0LCBMaW5lYXIsIFF1YWQsIEN1YmljLCBRdWFydCwgUXVpbnQsIFN0cm9uZywgRWxhc3RpYywgQmFjaywgU3RlcHBlZEVhc2UsIEJvdW5jZSwgU2luZSwgRXhwbywgQ2lyYyB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
12706//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js
12707
12708}`)},"./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
12709/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12710/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
12711/* harmony export */ });
12712/**
12713 * keen-slider 5.5.1
12714 * The HTML touch slider carousel with the most native feeling you will get.
12715 * https://keen-slider.io
12716 * Copyright 2020-2021 Eric Beyer <[email protected]>
12717 * License: MIT
12718 * Released on: 2021-06-10
12719 */
12720
12721function t(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function n(t,n){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),e.push.apply(e,r)}return e}function e(e){for(var r=1;r<arguments.length;r++){var i=null!=arguments[r]?arguments[r]:{};r%2?n(Object(i),!0).forEach((function(n){t(e,n,i[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function r(t){return function(t){if(Array.isArray(t))return i(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||function(t,n){if(!t)return;if("string"==typeof t)return i(t,n);var e=Object.prototype.toString.call(t).slice(8,-1);"Object"===e&&t.constructor&&(e=t.constructor.name);if("Map"===e||"Set"===e)return Array.from(t);if("Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e))return i(t,n)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(t,n){(null==n||n>t.length)&&(n=t.length);for(var e=0,r=new Array(n);e<n;e++)r[e]=t[e];return r}function o(t){var n,i,o,a,f,s,l,d,h,v,p,m,b,g,w,y,M,O,S,A,j,k,x,P,E,T,D,C,L,V,X,Y,z,H,I=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},q="data-keen-slider-moves",F="data-keen-slider-v",W=[],_=null,N=!1,R=!1,U=0,$=[];function B(t,n,e){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};t.addEventListener(n,e,r),W.push([t,n,e,r])}function G(t){if(O&&S===Z(t)&&ft()){var e=nt(t).x;if(!rt(t)&&P)return K(t);P&&(Nt(),A=e,P=!1),t.cancelable&&t.preventDefault();var r=A-e;E+=Math.abs(r),!T&&E>5&&(T=!0,n.setAttribute(q,!0)),Yt(x(r,Jt)*(lt()?-1:1),t.timeStamp),A=e}}function J(t){O||!ft()||et(t.target)||(O=!0,P=!0,S=Z(t),T=!1,E=0,rt(t),pt(),M=v,A=nt(t).x,Yt(0,t.timeStamp),ut("dragStart"))}function K(t){O&&S===Z(t,!0)&&ft()&&(n.removeAttribute(q),O=!1,gt(),ut("dragEnd"))}function Q(t){return t.changedTouches}function Z(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=n?Q(t):tt(t);return e?e[0]?e[0].identifier:"error":"default"}function tt(t){return t.targetTouches}function nt(t){var n=tt(t);return{x:ht()?n?n[0].screenY:t.pageY:n?n[0].screenX:t.pageX,timestamp:t.timeStamp}}function et(t){return t.hasAttribute(y.preventEvent)}function rt(t){var n=tt(t);if(!n)return!0;var e=n[0],r=ht()?e.clientY:e.clientX,i=ht()?e.clientX:e.clientY,o=void 0!==j&&void 0!==k&&Math.abs(k-i)<=Math.abs(j-r);return j=r,k=i,o}function it(t){ft()&&O&&t.preventDefault()}function ot(){B(window,"orientationchange",Dt),B(window,"resize",(function(){return Tt()})),B(n,"dragstart",(function(t){ft()&&t.preventDefault()})),B(n,"mousedown",J),B(y.cancelOnLeave?n:window,"mousemove",G),y.cancelOnLeave&&B(n,"mouseleave",K),B(window,"mouseup",K),B(n,"touchstart",J,{passive:!0}),B(n,"touchmove",G,{passive:!1}),B(n,"touchend",K,{passive:!0}),B(n,"touchcancel",K,{passive:!0}),B(window,"wheel",it,{passive:!1})}function at(){W.forEach((function(t){t[0].removeEventListener(t[1],t[2],t[3])})),W=[]}function ut(t){y[t]&&y[t](Jt)}function ct(){return y.centered}function ft(){return void 0!==i?i:y.controls}function st(){return y.loop&&o>1}function lt(){return y.rtl}function dt(){return!y.loop&&y.rubberband}function ht(){return!!y.vertical}function vt(){D=window.requestAnimationFrame(mt)}function pt(){D&&(window.cancelAnimationFrame(D),D=null),C=null}function mt(t){C||(C=t);var n=t-C,e=bt(n);if(n>=V)return Yt(L-Y,!1),H?H():void ut("afterChange");var r=zt(e);if(0===r||st()||dt()||z){if(0!==r&&dt()&&!z)return St();Y+=e,Yt(e,!1),vt()}else Yt(e-r,!1)}function bt(t){return L*X(t/V)-Y}function gt(){switch(ut("beforeChange"),y.mode){case"free":Mt();break;case"free-snap":Ot();break;case"snap":default:wt()}}function wt(){yt((1===l&&0!==p?M:v)+Math.sign(p))}function yt(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:y.duration,r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4],o=function(t){return 1+--t*t*t*t*t};At(Ft(t=qt(t,r,i)),e,o,n)}function Mt(){if(0===b)return!(!zt(0)||st())&&yt(v);var t=y.friction/Math.pow(Math.abs(b),-.5);At(Math.pow(b,2)/t*Math.sign(b),6*Math.abs(b/t),(function(t){return 1-Math.pow(1-t,5)}))}function Ot(){if(0===b)return yt(v);var t=y.friction/Math.pow(Math.abs(b),-.5),n=Math.pow(b,2)/t*Math.sign(b),e=6*Math.abs(b/t),r=(U+n)/(s/l);At((-1===p?Math.floor(r):Math.ceil(r))*(s/l)-U,e,(function(t){return 1-Math.pow(1-t,5)}))}function St(){if(pt(),0===b)return yt(v,!0);var t=.04/Math.pow(Math.abs(b),-.5),n=Math.pow(b,2)/t*Math.sign(b),e=function(t){return--t*t*t+1},r=b;At(n,3*Math.abs(r/t),e,!0,(function(){At(Ft(qt(v)),500,e,!0)}))}function At(t,n,e,r,i){pt(),L=t,Y=0,V=n,X=e,z=r,H=i,C=null,vt()}function jt(e){var r=u(t);r.length&&(n=r[0],Tt(e),ot(),ut("mounted"))}function kt(){var t,n=I.breakpoints||[];for(var r in n)window.matchMedia(r).matches&&(t=r);if(t===_)return!0;var i=(_=t)?n[_]:I;i.breakpoints&&_&&delete i.breakpoints,y=e(e(e({},Gt),I),i),N=!0,h=null,ut("optionsChanged"),Et()}function xt(t){if("function"==typeof t)return t();var n=y.autoAdjustSlidesPerView;n||(o=Math.max(t,o));var e=st()&&n?o-1:o;return c(t,1,Math.max(e,1))}function Pt(){kt(),R=!0,ut("created")}function Et(t,n){t&&(I=t),n&&(_=null),Ct(),jt(n)}function Tt(t){var e=window.innerWidth;if(kt()&&(e!==h||t)){h=e;var r=y.slides;"number"==typeof r?(f=null,o=r):(f=u(r,n),o=f?f.length:0);var i=y.dragSpeed;x="function"==typeof i?i:function(t){return t*i},s=ht()?n.offsetHeight:n.offsetWidth,l=xt(y.slidesPerView),d=c(y.spacing,0,s/(l-1)-1),s+=d,a=ct()?(s/2-s/l/2)/s:0,Vt();var p=!R||N&&y.resetSlide?y.initial:v;Bt(st()?p:Ht(p)),ht()&&n.setAttribute(F,!0),N=!1}}function Dt(t){Tt(),setTimeout(Tt,500),setTimeout(Tt,2e3)}function Ct(){at(),Xt(),n&&n.hasAttribute(F)&&n.removeAttribute(F),ut("destroyed")}function Lt(){f&&f.forEach((function(t,n){var e=g[n].distance*s-n*(s/l-d/l-d/l*(l-1)),r=ht()?0:e,i=ht()?e:0,o="translate3d(".concat(r,"px, ").concat(i,"px, 0)");t.style.transform=o,t.style["-webkit-transform"]=o}))}function Vt(){f&&f.forEach((function(t){var n="calc(".concat(100/l,"% - ").concat(d/l*(l-1),"px)");ht()?(t.style["min-height"]=n,t.style["max-height"]=n):(t.style["min-width"]=n,t.style["max-width"]=n)}))}function Xt(){if(f){var t=["transform","-webkit-transform"];t=[].concat(r(t),ht?["min-height","max-height"]:["min-width","max-width"]),f.forEach((function(n){t.forEach((function(t){n.style.removeProperty(t)}))}))}}function Yt(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now();_t(t,e),n&&(t=Ut(t)),U+=t,Rt()}function zt(t){var n=s*(o-1*(ct()?1:l))/l,e=U+t;return e>n?e-n:e<0?e:0}function Ht(t){return c(t,0,o-1-(ct()?0:l-1))}function It(){var t=Math.abs(w),n=U<0?1-t:t;return{direction:p,progressTrack:n,progressSlides:n*o/(o-1),positions:g,position:U,speed:b,relativeSlide:(v%o+o)%o,absoluteSlide:v,size:o,slidesPerView:l,widthOrHeight:s}}function qt(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return st()?n?Wt(t,e):t:Ht(t)}function Ft(t){return-(-s/l*t+U)}function Wt(t,n){var e=(v%o+o)%o,r=e<(t=(t%o+o)%o)?-e-o+t:-(e-t),i=e>t?o-e+t:t-e,a=n?Math.abs(r)<=i?r:i:t<e?r:i;return v+a}function _t(t,n){clearTimeout(m);var e=Math.sign(t);if(e!==p&&Nt(),p=e,$.push({distance:t,time:n}),m=setTimeout((function(){$=[],b=0}),50),($=$.slice(-6)).length<=1||0===p)return b=0;var r=$.slice(0,-1).reduce((function(t,n){return t+n.distance}),0),i=$[$.length-1].time,o=$[0].time;b=c(r/(i-o),-10,10)}function Nt(){$=[]}function Rt(){w=st()?U%(s*o/l)/(s*o/l):U/(s*o/l),$t();for(var t=[],n=0;n<o;n++){var e=(1/o*n-(w<0&&st()?w+1:w))*o/l+a;st()&&(e+=e>(o-1)/l?-o/l:e<-o/l+1?o/l:0);var r=1/l,i=e+r,u=i<r?i/r:i>1?1-(i-1)*l/1:1;t.push({portion:u<0||u>1?0:u,distance:lt()?-1*e+1-r:e})}g=t,Lt(),ut("move")}function Ut(t){if(st())return t;var n=zt(t);if(!dt())return t-n;if(0===n)return t;var e;return t*(e=n/s,(1-Math.abs(e))*(1-Math.abs(e)))}function $t(){var t=Math.round(U/(s/l));t!==v&&(!st()&&(t<0||t>o-1)||(v=t,ut("slideChanged")))}function Bt(t){ut("beforeChange"),Yt(Ft(t),!1),ut("afterChange")}var Gt={autoAdjustSlidesPerView:!0,centered:!1,breakpoints:null,controls:!0,dragSpeed:1,friction:.0025,loop:!1,initial:0,duration:500,preventEvent:"data-keen-slider-pe",slides:".keen-slider__slide",vertical:!1,resetSlide:!1,slidesPerView:1,spacing:0,mode:"snap",rtl:!1,rubberband:!0,cancelOnLeave:!0},Jt={controls:function(t){i=t},destroy:Ct,refresh:function(t){Et(t,!0)},next:function(){yt(v+1,!0)},prev:function(){yt(v-1,!0)},moveToSlide:function(t,n){yt(t,!0,n)},moveToSlideRelative:function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=arguments.length>2?arguments[2]:void 0;yt(t,!0,e,!0,n)},resize:function(){Tt(!0)},details:function(){return It()},options:function(){var t=e({},y);return delete t.breakpoints,t}};return Pt(),Jt}function a(t){return Array.prototype.slice.call(t)}function u(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return"function"==typeof t?a(t()):"string"==typeof t?a(n.querySelectorAll(t)):t instanceof HTMLElement!=!1?[t]:t instanceof NodeList!=!1?t:[]}function c(t,n,e){return Math.min(Math.max(t,n),e)}Math.sign||(Math.sign=function(t){return(t>0)-(t<0)||+t});/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (o);
12722//# sourceMappingURL=keen-slider.esm.js.map
12723//# sourceURL=[module]
12724//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0va2Vlbi1zbGlkZXJANS41LjEvbm9kZV9tb2R1bGVzL2tlZW4tc2xpZGVyL2tlZW4tc2xpZGVyLmVzbS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IseUNBQXlDLGtEQUFrRCxXQUFXLGdCQUFnQixxQkFBcUIsaUNBQWlDLHNDQUFzQyw0QkFBNEIsdURBQXVELHNCQUFzQixTQUFTLGNBQWMsWUFBWSxtQkFBbUIsS0FBSyx5Q0FBeUMseUNBQXlDLFlBQVkscUlBQXFJLGdFQUFnRSxHQUFHLFNBQVMsY0FBYyxtQkFBbUIsZ0NBQWdDLGlCQUFpQixpRkFBaUYsbUJBQW1CLGFBQWEsb0NBQW9DLG9EQUFvRCxvREFBb0QsNkNBQTZDLHFGQUFxRixnQkFBZ0IsNEpBQTRKLEdBQUcsZ0JBQWdCLG9DQUFvQywyQkFBMkIsSUFBSSxjQUFjLFNBQVMsY0FBYyxtSUFBbUksa0ZBQWtG
12724LGtCQUFrQixnRUFBZ0UsNENBQTRDLGNBQWMsc0JBQXNCLGNBQWMseUJBQXlCLG9EQUFvRCxVQUFVLDZGQUE2RixjQUFjLCtHQUErRyxjQUFjLHFFQUFxRSxjQUFjLHdCQUF3QixjQUFjLDZFQUE2RSxnREFBZ0QsZUFBZSx1QkFBdUIsZUFBZSxZQUFZLE9BQU8sNEVBQTRFLGVBQWUsc0NBQXNDLGVBQWUsWUFBWSxlQUFlLHdIQUF3SCxpQkFBaUIsZUFBZSw0QkFBNEIsY0FBYywrREFBK0QsWUFBWSxnQ0FBZ0MseUJBQXlCLCtJQUErSSxXQUFXLHFCQUFxQixXQUFXLG9CQUFvQixXQUFXLHVCQUF1QixXQUFXLHVCQUF1QixXQUFXLEVBQUUsY0FBYyx1QkFBdUIseUNBQXlDLFFBQVEsZUFBZSxlQUFlLGNBQWMsa0JBQWtCLGNBQWMsK0JBQStCLGNBQWMsbUJBQW1CLGNBQWMsYUFBYSxjQUFjLDRCQUE0QixjQUFjLG1CQUFtQixjQUFjLG1DQUFtQyxjQUFjLGtEQUFrRCxlQUFlLFNBQVMsa0JBQWtCLHVEQUF1RCxZQUFZLHlCQUF5QiwrQkFBK0IsbUJBQW1CLGdCQUFnQixlQUFlLGtCQUFrQixjQUFjLGtDQUFrQyxnQkFBZ0IsTUFBTSxxQkFBcUIsTUFBTSx5QkFBeUIsY0FBYyxvQ0FBb0MsaUJBQWlCLDBNQUEwTSxzQkFBc0IsMEJBQTBCLGNBQWMsc0NBQXNDLDJDQUEyQyw2REFBNkQseUJBQXlCLEdBQUcsY0FBYyxzQkFBc0IsMEdBQTBHLDhEQUE4RCx5QkFBeUIsR0FBRyxjQUFjLDhCQUE4QixpRkFBaUYsZ0JBQWdCLEtBQUssc0NBQXNDLHVCQUF1QixHQUFHLHVCQUF1Qix5Q0FBeUMsZUFBZSxXQUFXLDRDQUE0QyxjQUFjLDBCQUEwQixtREFBbUQsa0JBQWtCLG1CQUFtQixpREFBaUQsaURBQWlELGVBQWUsbUNBQW1DLGdDQUFnQyxxQkFBcUIsb0JBQW9CLDRCQUE0QixjQUFjLHdCQUF3QixpQkFBaUIsZ0NBQWdDLGVBQWUsd0JBQXdCLHFCQUFxQixJQUFJLGVBQWUsMERBQTBELGtCQUFrQixxQ0FBcUMsV0FBVyx1SEFBdUgsc0NBQXNDLGtEQUFrRCxlQUFlLDJDQUEyQyxjQUFjLHFFQUFxRSxjQUFjLDRCQUE0Qix1SEFBdUgsbURBQW1ELEdBQUcsY0FBYywwQkFBMEIsMkRBQTJELHVHQUF1RyxHQUFHLGNBQWMsTUFBTSx3Q0FBd0Msa0dBQWtHLHVCQUF1QiwwQkFBMEIsR0FBRyxJQUFJLGVBQWUscUlBQXFJLCtCQUErQixlQUFlLGlDQUFpQyx1QkFBdUIsZUFBZSwrQkFBK0IsY0FBYyw4QkFBOEIsT0FBTyxvS0FBb0ssZUFBZSx3SEFBd0gsOEJBQThCLGVBQWUsa0JBQWtCLGlCQUFpQiwrRkFBK0YsV0FBVyxpQkFBaUIsZ0JBQWdCLG1CQUFtQiwyQkFBMkIsa0JBQWtCLDJCQUEyQixTQUFTLGtEQUFrRCwwQ0FBMEMsb0JBQW9CLHNDQUFzQyxvQkFBb0IsY0FBYyxLQUFLLGNBQWMsd0NBQXdDLGlCQUFpQixJQUFJLEtBQUssc0NBQXNDLHlDQUF5Qyw0Q0FBNEMsUUFBUSw4Q0FBOEMsRUFBRSxvQkFBb0IsZUFBZSxpQkFBaUIsWUFBWSxvQkFBb0Isa0JBQWtCLE1BQU0saURBQWlELGNBQWMsMEJBQTBCLHVEQUF1RCxlQUFlLGtEQUFrRCxRQUFRLG9TQUFvUyxLQUFLLHFCQUFxQixJQUFJLGdDQUFnQyxTQUFTLGlCQUFpQixXQUFXLGlCQUFpQixXQUFXLDJCQUEyQixXQUFXLGlDQUFpQyx1R0FBdUcsZ0JBQWdCLG1CQUFtQixPQUFPLG9CQUFvQixZQUFZLG9CQUFvQixVQUFVLElBQUksZ0NBQWdDLGVBQWUsY0FBYyxxQ0FBcUMsY0FBYyxzRUFBc0UsOElBQThJLGtCQUFrQixpQ0FBaUMsa0NBQWtDLHNCQUFzQixFQUFFLGlFQUFlLENBQUMsRUFBQztBQUM1OFMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9ub2RlX21vZHVsZXMvLnBucG0va2Vlbi1zbGlkZXJANS41LjEvbm9kZV9tb2R1bGVzL2tlZW4tc2xpZGVyL2tlZW4tc2xpZGVyLmVzbS5qcz8xNGRkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICoga2Vlbi1zbGlkZXIgNS41LjFcbiAqIFRoZSBIVE1MIHRvdWNoIHNsaWRlciBjYXJvdXNlbCB3aXRoIHRoZSBtb3N0IG5hdGl2ZSBmZWVsaW5nIHlvdSB3aWxsIGdldC5cbiAqIGh0dHBzOi8va2Vlbi1zbGlkZXIuaW9cbiAqIENvcHlyaWdodCAyMDIwLTIwMjEgRXJpYyBCZXllciA8Y29udGFjdEBlcmljYmV5ZXIuZGU+XG4gKiBMaWNlbnNlOiBNSVRcbiAqIFJlbGVhc2VkIG9uOiAyMDIxLTA2LTEwXG4gKi9cblxuZnVuY3Rpb24gdCh0LG4sZSl7cmV0dXJuIG4gaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHt2YWx1ZTplLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtuXT1lLHR9ZnVuY3Rpb24gbih0LG4pe3ZhciBlPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7biYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKG4pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikuZW51bWVyYWJsZX0pKSksZS5wdXNoLmFwcGx5KGUscil9cmV0dXJuIGV9ZnVuY3Rpb24gZShlKXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgaT1udWxsIT1hcmd1bWVudHNbcl0/YXJndW1lbnRzW3JdOnt9O3IlMj9uKE9iamVjdChpKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24obil7dChlLG4saVtuXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhpKSk6bihPYmplY3QoaSkpLmZvckVhY2goKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLHQpKX0pKX1yZXR1cm4gZX1mdW5jdGlvbiByKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBpKHQpfSh0KXx8ZnVuY3Rpb24odCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh0KSlyZXR1cm4gQXJyYXkuZnJvbSh0KX0odCl8fGZ1bmN0aW9uKHQsbil7aWYoIXQpcmV0dXJuO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXJldHVybiBpKHQsbik7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO1wiT2JqZWN0XCI9PT1lJiZ0LmNvbnN0cnVjdG9yJiYoZT10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKFwiTWFwXCI9PT1lfHxcIlNldFwiPT09ZSlyZXR1cm4gQXJyYXkuZnJvbSh0KTtpZihcIkFyZ3VtZW50c1wiPT09ZXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoZSkpcmV0dXJuIGkodCxuKX0odCl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhh
12724dmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gaSh0LG4peyhudWxsPT1ufHxuPnQubGVuZ3RoKSYmKG49dC5sZW5ndGgpO2Zvcih2YXIgZT0wLHI9bmV3IEFycmF5KG4pO2U8bjtlKyspcltlXT10W2VdO3JldHVybiByfWZ1bmN0aW9uIG8odCl7dmFyIG4saSxvLGEsZixzLGwsZCxoLHYscCxtLGIsZyx3LHksTSxPLFMsQSxqLGsseCxQLEUsVCxELEMsTCxWLFgsWSx6LEgsST1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30scT1cImRhdGEta2Vlbi1zbGlkZXItbW92ZXNcIixGPVwiZGF0YS1rZWVuLXNsaWRlci12XCIsVz1bXSxfPW51bGwsTj0hMSxSPSExLFU9MCwkPVtdO2Z1bmN0aW9uIEIodCxuLGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTt0LmFkZEV2ZW50TGlzdGVuZXIobixlLHIpLFcucHVzaChbdCxuLGUscl0pfWZ1bmN0aW9uIEcodCl7aWYoTyYmUz09PVoodCkmJmZ0KCkpe3ZhciBlPW50KHQpLng7aWYoIXJ0KHQpJiZQKXJldHVybiBLKHQpO1AmJihOdCgpLEE9ZSxQPSExKSx0LmNhbmNlbGFibGUmJnQucHJldmVudERlZmF1bHQoKTt2YXIgcj1BLWU7RSs9TWF0aC5hYnMociksIVQmJkU+NSYmKFQ9ITAsbi5zZXRBdHRyaWJ1dGUocSwhMCkpLFl0KHgocixKdCkqKGx0KCk/LTE6MSksdC50aW1lU3RhbXApLEE9ZX19ZnVuY3Rpb24gSih0KXtPfHwhZnQoKXx8ZXQodC50YXJnZXQpfHwoTz0hMCxQPSEwLFM9Wih0KSxUPSExLEU9MCxydCh0KSxwdCgpLE09dixBPW50KHQpLngsWXQoMCx0LnRpbWVTdGFtcCksdXQoXCJkcmFnU3RhcnRcIikpfWZ1bmN0aW9uIEsodCl7TyYmUz09PVoodCwhMCkmJmZ0KCkmJihuLnJlbW92ZUF0dHJpYnV0ZShxKSxPPSExLGd0KCksdXQoXCJkcmFnRW5kXCIpKX1mdW5jdGlvbiBRKHQpe3JldHVybiB0LmNoYW5nZWRUb3VjaGVzfWZ1bmN0aW9uIFoodCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxlPW4/USh0KTp0dCh0KTtyZXR1cm4gZT9lWzBdP2VbMF0uaWRlbnRpZmllcjpcImVycm9yXCI6XCJkZWZhdWx0XCJ9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQudGFyZ2V0VG91Y2hlc31mdW5jdGlvbiBudCh0KXt2YXIgbj10dCh0KTtyZXR1cm57eDpodCgpP24/blswXS5zY3JlZW5ZOnQucGFnZVk6bj9uWzBdLnNjcmVlblg6dC5wYWdlWCx0aW1lc3RhbXA6dC50aW1lU3RhbXB9fWZ1bmN0aW9uIGV0KHQpe3JldHVybiB0Lmhhc0F0dHJpYnV0ZSh5LnByZXZlbnRFdmVudCl9ZnVuY3Rpb24gcnQodCl7dmFyIG49dHQodCk7aWYoIW4pcmV0dXJuITA7dmFyIGU9blswXSxyPWh0KCk/ZS5jbGllbnRZOmUuY2xpZW50WCxpPWh0KCk/ZS5jbGllbnRYOmUuY2xpZW50WSxvPXZvaWQgMCE9PWomJnZvaWQgMCE9PWsmJk1hdGguYWJzKGstaSk8PU1hdGguYWJzKGotcik7cmV0dXJuIGo9cixrPWksb31mdW5jdGlvbiBpdCh0KXtmdCgpJiZPJiZ0LnByZXZlbn
12724REZWZhdWx0KCl9ZnVuY3Rpb24gb3QoKXtCKHdpbmRvdyxcIm9yaWVudGF0aW9uY2hhbmdlXCIsRHQpLEIod2luZG93LFwicmVzaXplXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFR0KCl9KSksQihuLFwiZHJhZ3N0YXJ0XCIsKGZ1bmN0aW9uKHQpe2Z0KCkmJnQucHJldmVudERlZmF1bHQoKX0pKSxCKG4sXCJtb3VzZWRvd25cIixKKSxCKHkuY2FuY2VsT25MZWF2ZT9uOndpbmRvdyxcIm1vdXNlbW92ZVwiLEcpLHkuY2FuY2VsT25MZWF2ZSYmQihuLFwibW91c2VsZWF2ZVwiLEspLEIod2luZG93LFwibW91c2V1cFwiLEspLEIobixcInRvdWNoc3RhcnRcIixKLHtwYXNzaXZlOiEwfSksQihuLFwidG91Y2htb3ZlXCIsRyx7cGFzc2l2ZTohMX0pLEIobixcInRvdWNoZW5kXCIsSyx7cGFzc2l2ZTohMH0pLEIobixcInRvdWNoY2FuY2VsXCIsSyx7cGFzc2l2ZTohMH0pLEIod2luZG93LFwid2hlZWxcIixpdCx7cGFzc2l2ZTohMX0pfWZ1bmN0aW9uIGF0KCl7Vy5mb3JFYWNoKChmdW5jdGlvbih0KXt0WzBdLnJlbW92ZUV2ZW50TGlzdGVuZXIodFsxXSx0WzJdLHRbM10pfSkpLFc9W119ZnVuY3Rpb24gdXQodCl7eVt0XSYmeVt0XShKdCl9ZnVuY3Rpb24gY3QoKXtyZXR1cm4geS5jZW50ZXJlZH1mdW5jdGlvbiBmdCgpe3JldHVybiB2b2lkIDAhPT1pP2k6eS5jb250cm9sc31mdW5jdGlvbiBzdCgpe3JldHVybiB5Lmxvb3AmJm8+MX1mdW5jdGlvbiBsdCgpe3JldHVybiB5LnJ0bH1mdW5jdGlvbiBkdCgpe3JldHVybiF5Lmxvb3AmJnkucnViYmVyYmFuZH1mdW5jdGlvbiBodCgpe3JldHVybiEheS52ZXJ0aWNhbH1mdW5jdGlvbiB2dCgpe0Q9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShtdCl9ZnVuY3Rpb24gcHQoKXtEJiYod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKEQpLEQ9bnVsbCksQz1udWxsfWZ1bmN0aW9uIG10KHQpe0N8fChDPXQpO3ZhciBuPXQtQyxlPWJ0KG4pO2lmKG4+PVYpcmV0dXJuIFl0KEwtWSwhMSksSD9IKCk6dm9pZCB1dChcImFmdGVyQ2hhbmdlXCIpO3ZhciByPXp0KGUpO2lmKDA9PT1yfHxzdCgpfHxkdCgpfHx6KXtpZigwIT09ciYmZHQoKSYmIXopcmV0dXJuIFN0KCk7WSs9ZSxZdChlLCExKSx2dCgpfWVsc2UgWXQoZS1yLCExKX1mdW5jdGlvbiBidCh0KXtyZXR1cm4gTCpYKHQvViktWX1mdW5jdGlvbiBndCgpe3N3aXRjaCh1dChcImJlZm9yZUNoYW5nZVwiKSx5Lm1vZGUpe2Nhc2VcImZyZWVcIjpNdCgpO2JyZWFrO2Nhc2VcImZyZWUtc25hcFwiOk90KCk7YnJlYWs7Y2FzZVwic25hcFwiOmRlZmF1bHQ6d3QoKX19ZnVuY3Rpb24gd3QoKXt5dCgoMT09PWwmJjAhPT1wP006dikrTWF0aC5zaWduKHApKX1mdW5jdGlvbiB5dCh0LG4pe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp5LmR1cmF0aW9uLHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXSxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdJiZhcmd1bWVudHNbNF0sbz1mdW5jdGlvbih0KXtyZXR1cm4gMSstLXQqdCp0KnQqdH07QXQoRnQodD1xdCh0LHIsaSkpLGUsbyxuKX1mdW5jdGlvbiBNdCgpe2lmKDA9PT1iKXJldHVybiEoIXp0KDApfHxzdCgpKSYmeXQodik7dmFyIHQ9eS5mcmljdGlvbi9NYXRoLnBvdyhNYXRoLmFicyhiKSwtLjUpO0F0KE1hdGgucG93KGIsMikvdCpNYXRoLnNpZ24oYiksNipNYXRoLmFicyhiL3QpLChmdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsNSl9KSl9ZnVuY3Rpb24gT3QoKXtpZigwPT09YilyZXR1cm4geXQodik7dmFyIHQ9eS5mcmljdGlvbi9NYXRoLnBvdyhNYXRoLmFicyhiKSwtLjUpLG49TWF0aC5wb3coYiwyKS90Kk1hdGguc2lnbihiKSxlPTYqTWF0aC5hYnMoYi90KSxyPShVK24pLyhzL2wpO0F0KCgtMT09PXA/TWF0aC5mbG9vcihyKTpNYXRoLmNlaWwocikpKihzL2wpLVUsZSwoZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LDUpfSkpfWZ1bmN0aW9uIFN0KCl7aWYocHQoKSwwPT09YilyZXR1cm4geXQodiwhMCk7dmFyIHQ9LjA0L01hdGgucG93KE1hdGguYWJzKGIpLC0uNSksbj1NYXRoLnBvdyhiLDIpL3QqTWF0aC5zaWduKGIpLGU9ZnVuY3Rpb24odCl7cmV0dXJuLS10KnQqdCsxfSxyPWI7QXQobiwzKk1hdGguYWJzKHIvdCksZSwhMCwoZnVuY3Rpb24oKXtBdChGdChxdCh2KSksNTAwLGUsITApfSkpfWZ1bmN0aW9uIEF0KHQsbixlLHIsaSl7cHQoKSxMPXQsWT0wLFY9bixYPWUsej1yLEg9aSxDPW51bGwsdnQoKX1mdW5jdGlvbiBqdChl
12724KXt2YXIgcj11KHQpO3IubGVuZ3RoJiYobj1yWzBdLFR0KGUpLG90KCksdXQoXCJtb3VudGVkXCIpKX1mdW5jdGlvbiBrdCgpe3ZhciB0LG49SS5icmVha3BvaW50c3x8W107Zm9yKHZhciByIGluIG4pd2luZG93Lm1hdGNoTWVkaWEocikubWF0Y2hlcyYmKHQ9cik7aWYodD09PV8pcmV0dXJuITA7dmFyIGk9KF89dCk/bltfXTpJO2kuYnJlYWtwb2ludHMmJl8mJmRlbGV0ZSBpLmJyZWFrcG9pbnRzLHk9ZShlKGUoe30sR3QpLEkpLGkpLE49ITAsaD1udWxsLHV0KFwib3B0aW9uc0NoYW5nZWRcIiksRXQoKX1mdW5jdGlvbiB4dCh0KXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0KXJldHVybiB0KCk7dmFyIG49eS5hdXRvQWRqdXN0U2xpZGVzUGVyVmlldztufHwobz1NYXRoLm1heCh0LG8pKTt2YXIgZT1zdCgpJiZuP28tMTpvO3JldHVybiBjKHQsMSxNYXRoLm1heChlLDEpKX1mdW5jdGlvbiBQdCgpe2t0KCksUj0hMCx1dChcImNyZWF0ZWRcIil9ZnVuY3Rpb24gRXQodCxuKXt0JiYoST10KSxuJiYoXz1udWxsKSxDdCgpLGp0KG4pfWZ1bmN0aW9uIFR0KHQpe3ZhciBlPXdpbmRvdy5pbm5lcldpZHRoO2lmKGt0KCkmJihlIT09aHx8dCkpe2g9ZTt2YXIgcj15LnNsaWRlcztcIm51bWJlclwiPT10eXBlb2Ygcj8oZj1udWxsLG89cik6KGY9dShyLG4pLG89Zj9mLmxlbmd0aDowKTt2YXIgaT15LmRyYWdTcGVlZDt4PVwiZnVuY3Rpb25cIj09dHlwZW9mIGk/aTpmdW5jdGlvbih0KXtyZXR1cm4gdCppfSxzPWh0KCk/bi5vZmZzZXRIZWlnaHQ6bi5vZmZzZXRXaWR0aCxsPXh0KHkuc2xpZGVzUGVyVmlldyksZD1jKHkuc3BhY2luZywwLHMvKGwtMSktMSkscys9ZCxhPWN0KCk/KHMvMi1zL2wvMikvczowLFZ0KCk7dmFyIHA9IVJ8fE4mJnkucmVzZXRTbGlkZT95LmluaXRpYWw6djtCdChzdCgpP3A6SHQocCkpLGh0KCkmJm4uc2V0QXR0cmlidXRlKEYsITApLE49ITF9fWZ1bmN0aW9uIER0KHQpe1R0KCksc2V0VGltZW91dChUdCw1MDApLHNldFRpbWVvdXQoVHQsMmUzKX1mdW5jdGlvbiBDdCgpe2F0KCksWHQoKSxuJiZuLmhhc0F0dHJpYnV0ZShGKSYmbi5yZW1vdmVBdHRyaWJ1dGUoRiksdXQoXCJkZXN0cm95ZWRcIil9ZnVuY3Rpb24gTHQoKXtmJiZmLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7dmFyIGU9Z1tuXS5kaXN0YW5jZSpzLW4qKHMvbC1kL2wtZC9sKihsLTEpKSxyPWh0KCk/MDplLGk9aHQoKT9lOjAsbz1cInRyYW5zbGF0ZTNkKFwiLmNvbmNhdChyLFwicHgsIFwiKS5jb25jYXQoaSxcInB4LCAwKVwiKTt0LnN0eWxlLnRyYW5zZm9ybT1vLHQuc3R5bGVbXCItd2Via2l0LXRyYW5zZm9ybVwiXT1vfSkpfWZ1bmN0aW9uIFZ0KCl7ZiYmZi5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj1cImNhbGMoXCIuY29uY2F0KDEwMC9sLFwiJSAtIFwiKS5jb25jYXQoZC9sKihsLTEpLFwicHgpXCIpO2h0KCk/KHQuc3R5bGVbXCJtaW4taGVpZ2h0XCJdPW4sdC5zdHlsZVtcIm1heC1oZWlnaHRcIl09bik6KHQuc3R5bGVbXCJtaW4td2lkdGhcIl09bix0LnN0eWxlW1wibWF4LXdpZHRoXCJdPW4pfSkpfWZ1bmN0aW9uIFh0KCl7aWYoZil7dmFyIHQ9W1widHJhbnNmb3JtXCIsXCItd2Via2l0LXRyYW5zZm9ybVwiXTt0PVtdLmNvbmNhdChyKHQpLGh0P1tcIm1pbi1oZWlnaHRcIixcIm1heC1oZWlnaHRcIl06W1wibWluLXdpZHRoXCIsXCJtYXgtd2lkdGhcIl0pLGYuZm9yRWFjaCgoZnVuY3Rpb24obil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtuLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfSkpfSkpfX1mdW5jdGlvbiBZdCh0KXt2YXIgbj0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdLGU9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOkRhdGUubm93KCk7X3QodCxlKSxuJiYodD1VdCh0KSksVSs9dCxSdCgpfWZ1bmN0aW9uIHp0KHQpe3ZhciBuPXMqKG8tMSooY3QoKT8xOmwpKS9sLGU9VSt0O3JldHVybiBlPm4/ZS1uOmU8MD9lOjB9ZnVuY3Rpb24gSHQodCl7cmV0dXJuIGModCwwLG8tMS0oY3QoKT8wOmwtMSkpfWZ1bmN0aW9uIEl0KCl7dmFyIHQ9TWF0aC5hYnModyksbj1VPDA/MS10OnQ7cmV0dXJue2RpcmVjdGlvbjpwLHByb2dyZXNzVHJhY2s6bixwcm9ncmVzc1NsaWRlczpuKm8vKG8tMSkscG9zaXRpb25zOmcscG9zaXRpb246VSxzcGVlZDpiLHJlbGF0aXZlU2xpZGU6KHYlbytvKSVvLGFic29sdXRlU2xpZGU6dixzaXplOm8sc2xpZGVzUGVyVmlldzpsLHdpZHRoT3JIZWlnaHQ6c319ZnVuY3Rpb24gcXQodCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07cmV0dXJuIHN0KCk/bj9XdCh0LGUpOnQ6SHQodCl9ZnVuY3Rpb24gRnQodCl7cmV0dXJuLSgtcy9sKnQrVSl9ZnVuY3Rpb24gV3QodCxuKXt2YXIgZT0odiVvK28pJW8scj1lPCh0PSh0JW8rbyklbyk/LWUtbyt0Oi0oZS10KSxpPWU+dD9vLWUrdDp0LWUsYT1uP01hdGguYWJzKHIpPD1pP3I6aTp0PGU/cjppO3JldHVybiB2K2F9ZnVuY3Rpb24gX3QodCxuKXtjbGVhclRpbWVvdXQobSk7dmFyIGU9TWF0aC5zaWduKHQpO2lmKGUhPT1wJiZOdCgpLHA9ZSwkLnB1c2goe2Rpc3RhbmNlOnQsdGltZTpufSksbT1zZXRUaW1lb3V0KChmdW5jdGlvbigpeyQ9W10sYj0wfSksNTApLCgkPSQuc2xpY2UoLTYpKS5sZW5ndGg8PTF8fDA9PT1wKXJldHVybiBiPTA7dmFyIHI9JC5zbGljZSgwLC0xKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQrbi5kaXN0YW5jZX0pLDApLGk9JFskLmxlbmd0aC0xXS50aW1lLG89JFswXS50aW1lO2I9YyhyLyhpLW8pLC0xMCwxMCl9ZnVuY3Rpb24gTnQoKXskPVtdfWZ1bmN0aW9uIFJ0KCl7dz1zdCgpP1UlKHMqby9sKS8ocypvL2wpOlUvKHMqby9sKSwkdCgpO2Zvcih2YXIgdD1bXSxuPTA7bjxvO24rKyl7dmFyIGU9KDEvbypuLSh3PDAmJnN0KCk/dysxOncpKSpvL2wrYTtzdCgpJiYoZSs9ZT4oby0xKS9sPy1vL2w6ZTwtby9sKzE/by9sOjApO3ZhciByPTEvbCxpPWUrcix1PWk8cj9pL3I6aT4xPzEtKGktMSkqbC8xOjE7dC5wdXNoKHtwb3J0aW9uOnU8MHx8dT4xPzA6dSxkaXN0YW5jZTpsdCgpPy0xKmUrMS1yOmV9KX1nPXQsTHQoKSx1dChcIm1vdmVcIil9ZnVuY3Rpb24gVXQodCl7aWYoc3QoKSlyZXR1cm4gdDt2YXIgbj16dCh0KTtpZighZHQoKSlyZXR1cm4gdC1uO2lmKDA9PT1uKXJldHVybi
12724B0O3ZhciBlO3JldHVybiB0KihlPW4vcywoMS1NYXRoLmFicyhlKSkqKDEtTWF0aC5hYnMoZSkpKX1mdW5jdGlvbiAkdCgpe3ZhciB0PU1hdGgucm91bmQoVS8ocy9sKSk7dCE9PXYmJighc3QoKSYmKHQ8MHx8dD5vLTEpfHwodj10LHV0KFwic2xpZGVDaGFuZ2VkXCIpKSl9ZnVuY3Rpb24gQnQodCl7dXQoXCJiZWZvcmVDaGFuZ2VcIiksWXQoRnQodCksITEpLHV0KFwiYWZ0ZXJDaGFuZ2VcIil9dmFyIEd0PXthdXRvQWRqdXN0U2xpZGVzUGVyVmlldzohMCxjZW50ZXJlZDohMSxicmVha3BvaW50czpudWxsLGNvbnRyb2xzOiEwLGRyYWdTcGVlZDoxLGZyaWN0aW9uOi4wMDI1LGxvb3A6ITEsaW5pdGlhbDowLGR1cmF0aW9uOjUwMCxwcmV2ZW50RXZlbnQ6XCJkYXRhLWtlZW4tc2xpZGVyLXBlXCIsc2xpZGVzOlwiLmtlZW4tc2xpZGVyX19zbGlkZVwiLHZlcnRpY2FsOiExLHJlc2V0U2xpZGU6ITEsc2xpZGVzUGVyVmlldzoxLHNwYWNpbmc6MCxtb2RlOlwic25hcFwiLHJ0bDohMSxydWJiZXJiYW5kOiEwLGNhbmNlbE9uTGVhdmU6ITB9LEp0PXtjb250cm9sczpmdW5jdGlvbih0KXtpPXR9LGRlc3Ryb3k6Q3QscmVmcmVzaDpmdW5jdGlvbih0KXtFdCh0LCEwKX0sbmV4dDpmdW5jdGlvbigpe3l0KHYrMSwhMCl9LHByZXY6ZnVuY3Rpb24oKXt5dCh2LTEsITApfSxtb3ZlVG9TbGlkZTpmdW5jdGlvbih0LG4pe3l0KHQsITAsbil9LG1vdmVUb1NsaWRlUmVsYXRpdmU6ZnVuY3Rpb24odCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO3l0KHQsITAsZSwhMCxuKX0scmVzaXplOmZ1bmN0aW9uKCl7VHQoITApfSxkZXRhaWxzOmZ1bmN0aW9uKCl7cmV0dXJuIEl0KCl9LG9wdGlvbnM6ZnVuY3Rpb24oKXt2YXIgdD1lKHt9LHkpO3JldHVybiBkZWxldGUgdC5icmVha3BvaW50cyx0fX07cmV0dXJuIFB0KCksSnR9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCl9ZnVuY3Rpb24gdSh0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ZG9jdW1lbnQ7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdD9hKHQoKSk6XCJzdHJpbmdcIj09dHlwZW9mIHQ/YShuLnF1ZXJ5U2VsZWN0b3JBbGwodCkpOnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCE9ITE/W3RdOnQgaW5zdGFuY2VvZiBOb2RlTGlzdCE9ITE/dDpbXX1mdW5jdGlvbiBjKHQsbixlKXtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodCxuKSxlKX1NYXRoLnNpZ258fChNYXRoLnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuKHQ+MCktKHQ8MCl8fCt0fSk7ZXhwb3J0IGRlZmF1bHQgbztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWtlZW4tc2xpZGVyLmVzbS5qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
12725//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js
12726
12727}`)},"./src/styles/templates/blog/blog.scss"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
12728// extracted by mini-css-extract-plugin
12729//# sourceURL=[module]
12730//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3R5bGVzL3RlbXBsYXRlcy9ibG9nL2Jsb2cuc2NzcyIsIm1hcHBpbmdzIjoiO0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc3R5bGVzL3RlbXBsYXRlcy9ibG9nL2Jsb2cuc2Nzcz82M2MwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
12731//# sourceURL=webpack-internal:///./src/styles/templates/blog/blog.scss
12732
12733}`)},"./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
12734/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12735/* harmony export */   component: () => (/* binding */ u),
12736/* harmony export */   picoapp: () => (/* binding */ c)
12737/* harmony export */ });
12738var n=function(n){if("object"!=typeof(t=n)||Array.isArray(t))throw"state should be an object";var t},t=function(n,t,r,e){return(o=n,o.reduce(function(n,t,r){return n.indexOf(t)>-1?n:n.concat(t)},[])).reduce(function(n,r){return n.concat(t[r]||[])},[]).map(function(n){return n(r,e)});// removed by dead control flow
12739 var o; };function r(r){void 0===r&&(r={});var e={};return{getState:function(){return Object.assign({},r)},hydrate:function(o){return n(o),Object.assign(r,o),function(){var n=["*"].concat(Object.keys(o));t(n,e,r)}},on:function(n,t){return(n=[].concat(n)).map(function(n){return e[n]=(e[n]||[]).concat(t)}),function(){return n.map(function(n){return e[n].splice(e[n].indexOf(t),1)})}},emit:function(o,u,c){var i=("*"===o?[]:["*"]).concat(o);(u="function"==typeof u?u(r):u)&&(n(u),Object.assign(r,u),i=i.concat(Object.keys(u))),t(i,e,r,c)}}}r();var e=function(n){return"object"==typeof n&&!Array.isArray(n)},o=function(n){return"function"==typeof n};function u(n){return function(t,r){var e=[];return{subs:e,unmount:n(t,Object.assign({},r,{on:function(n,t){var o=r.on(n,t);return e.push(o),o}})),node:t}}}function c(n,t,u){void 0===n&&(n={}),void 0===t&&(t={}),void 0===u&&(u=[]);var c=r(t),i=[];return{on:c.on,emit:c.emit,getState:function(){return c.getState()},add:function(t){if(!e(t))throw"components should be an object";Object.assign(n,t)},use:function(n){if(!o(n))throw"plugins should be a function";u.push(n)},hydrate:function(n){return c.hydrate(n)},mount:function(t){void 0===t&&(t="data-component"),t=[].concat(t);for(var r=0;r<t.length;r++){for(var a=t[r],f=[].slice.call(document.querySelectorAll("["+a+"]")),s=function(){for(var t=f.pop(),r=t.getAttribute(a).split(/\\s
12739/),s=0;s<r.length;s++){var v=n[r[s]];if(v){t.removeAttribute(a);try{var d=u.reduce(function(n,r){var o=r(t,c);return e(o)?Object.assign(n,o):n},{}),m=v(t,Object.assign({},d,c));o(m.unmount)&&i.push(m)}catch(n){console.error(n),c.emit("error",{error:n}),c.hydrate({error:void 0})}}}};f.length;)s();c.emit("mount")}},unmount:function(){for(var n=i.length-1;n>-1;n--){var t=i[n],r=t.subs;(0,t.unmount)(t.node),r.map(function(n){return n()}),i.splice(n,1)}c.emit("unmount")}}}
12740//# sourceMappingURL=picoapp.es.js.map
12741//# sourceURL=[module]
12742//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vcGljb2FwcEAzLjYuMi9ub2RlX21vZHVsZXMvcGljb2FwcC9kaXN0L3BpY29hcHAuZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrQkFBa0IsNEVBQTRFLE1BQU0scUJBQXFCLG9DQUFvQyxxQ0FBcUMsMkJBQTJCLDBCQUEwQixxQkFBcUIsY0FBYyxFQUFFO0FBQUEsUUFBSyxFQUFFLGNBQWMsaUJBQWlCLEVBQUUsU0FBUyxPQUFPLG9CQUFvQix1QkFBdUIsSUFBSSxxQkFBcUIsMENBQTBDLG1DQUFtQyxVQUFVLGtCQUFrQix1Q0FBdUMsaUNBQWlDLGFBQWEseUJBQXlCLHNDQUFzQyxHQUFHLHNCQUFzQixtQ0FBbUMsbUdBQW1HLElBQUksa0JBQWtCLDRDQUE0QyxlQUFlLDRCQUE0QixjQUFjLHFCQUFxQixTQUFTLE9BQU8sbUNBQW1DLElBQUksaUJBQWlCLGdCQUFnQixvQkFBb0IsWUFBWSxrQkFBa0IsaUJBQWlCLG1CQUFtQixxQkFBcUIsZ0JBQWdCLE9BQU8sd0NBQXdDLG9CQUFvQixpQkFBaUIsK0NBQStDLG1CQUFtQixpQkFBaUIsNkNBQTZDLFVBQVUscUJBQXFCLG9CQUFvQixtQkFBbUIsZ0RBQWdELFlBQVksV0FBVyxLQUFLLGtGQUFrRixzREFBc0QsV0FBVyxLQUFLLGNBQWMsTUFBTSxxQkFBcUIsSUFBSSw2QkFBNkIsYUFBYSxpQ0FBaUMsR0FBRyx3QkFBd0IsT0FBTyx3QkFBd0IsU0FBUyxpQ0FBaUMsUUFBUSxhQUFhLGFBQWEsTUFBTSxTQUFTLEtBQUssaUJBQWlCLG9CQUFvQixxQkFBcUIsS0FBSyxLQUFLLG9CQUFvQix3Q0FBd0MsV0FBVyxnQkFBZ0Isb0JBQXdEO0FBQzFuRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS9waWNvYXBwQDMuNi4yL25vZGVfbW9kdWxlcy9waWNvYXBwL2Rpc3QvcGljb2FwcC5lcy5qcz9hYTliIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBuPWZ1bmN0aW9uKG4pe2lmKFwib2JqZWN0XCIhPXR5cGVvZih0PW4pfHxBcnJheS5pc0FycmF5KHQpKXRocm93XCJzdGF0ZSBzaG91bGQgYmUgYW4gb2JqZWN0XCI7dmFyIHR9LHQ9ZnVuY3Rpb24obix0LHIsZSl7cmV0dXJuKG89bixvLnJlZHVjZShmdW5jdGlvbihuLHQscil7cmV0dXJuIG4uaW5kZXhPZih0KT4tMT9uOm4uY29uY2F0KHQpfSxbXSkpLnJlZHVjZShmdW5jdGlvbihuLHIpe3JldHVybiBuLmNvbmNhdCh0W3JdfHxbXSl9LFtdKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4ocixlKX0pO3ZhciBvfTtmdW5jdGlvbiByKHIpe3ZvaWQgMD09PXImJihyPXt9KTt2YXIgZT17fTtyZXR1cm57Z2V0U3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyKX0saHlkcmF0ZTpmdW5jdGlvbihvKXtyZXR1cm4gbihvKSxPYmplY3QuYXNzaWduKHIsbyksZnVuY3Rpb24oKXt2YXIgbj1bXCIqXCJdLmNvbmNhdChPYmplY3Qua2V5cyhvKSk7dChuLGUscil9fSxvbjpmdW5jdGlvbihuLHQpe3JldHVybihuPVtdLmNvbmNhdChuKSkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBlW25dPShlW25dfHxbXSkuY29uY2F0KHQpfSksZnVuY3Rpb24oKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGVbbl0uc3BsaWNlKGVbbl0uaW5kZXhPZih0KSwxKX0pfX0sZW1pdDpmdW5jdGlvbihvLHUsYyl7dmFyIGk9KFwiKlwiPT09bz9bXTpbXCIqXCJdKS5jb25jYXQobyk7KHU9XCJmdW5jdGlvblwiPT10eXBlb2YgdT91KHIpOnUpJiYobih1KSxPYmplY3QuYXNzaWduKHIsdSksaT1pLmNvbmNhdChPYmplY3Qua2V5cyh1KSkpLHQoaSxlLHIsYyl9fX1yKCk7dmFyIGU9ZnVuY3Rpb24obil7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIG4mJiFBcnJheS5pc0FycmF5KG4pfSxvPWZ1bmN0aW9uKG4pe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIG59O2Z1bmN0aW9uIHUobil7cmV0dXJuIGZ1bmN0aW9uKHQscil7dmFyIGU9W107cmV0dXJue3N1YnM6ZSx1bm1vdW50Om4odCxPYmplY3QuYXNzaWduKHt9LHIse29uOmZ1bmN0aW9uKG4sdCl7dmFyIG89ci5vbihuLHQpO3JldHVybiBlLnB1c2gobyksb319KSksbm9kZTp0fX19ZnVuY3Rpb24gYyhuLHQsdSl7dm9pZCAwPT09biYmKG49e30pLHZvaWQgMD09PXQmJih0PXt9KSx2b2lkIDA9PT11JiYodT1bXSk7dmFyIGM9cih0KSxpPVtdO3JldHVybntvbjpjLm9uLGVtaXQ6Yy5lbWl0LGdldFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGMuZ2V0U3RhdGUoKX0sYWRkOmZ1bmN0aW9uKHQpe2lmKCFlKHQpKXRocm93XCJjb21wb25lbnRzIHNob3VsZCBiZSBhbiBvYmplY3RcIjtPYmplY3QuYXNzaWduKG4sdCl9LHVzZTpmdW5jdGlvbihuKXtpZighbyhuKSl0aHJvd1wicGx1Z2lucyBzaG91bGQgYmUgYSBmdW5jdGlvblwiO3UucHVzaChuKX0saHlkcmF0ZTpmdW5jdGlvbihuKXtyZXR1cm4gYy5oeWRyYXRlKG4pfSxtb3VudDpmdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD1cImRhdGEtY29tcG9uZW50XCIpLHQ9W10uY29uY2F0KHQpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXtmb3IodmFyIGE9dFtyXSxmPVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltcIithK1wiXVwiKSkscz1mdW5jdGlvbigpe2Zvcih2YXIgdD1mLnBvcCgpLHI9dC5nZXRBdHRyaWJ1dGUoYSkuc3BsaXQoL1xccy8pLHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIHY9bltyW3NdXTtpZih2KXt0LnJlbW92ZUF0dHJpYnV0ZShhKTt0cnl7dmFyIGQ9dS5yZWR1Y2UoZnVuY3Rpb24obixyKXt2YXIgbz1yKHQsYyk7cmV0dXJuIGUobyk/T2JqZWN0LmFzc2lnbihuLG8pOm59LHt9KSxtPXYodCxPYmplY3QuYXNzaWduKHt9LGQsYykpO28obS51bm1vdW50KSYmaS5wdXNoKG0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IobiksYy5lbWl0KFwiZXJyb3JcIix7ZXJyb3I6bn0pLGMuaHlkcmF0ZSh7ZXJyb3I6dm9pZCAwfSl9fX19O2YubGVuZ3RoOylzKCk7Yy5lbWl0KFwibW91bnRcIil9fSx1bm1vdW50OmZ1bmN0aW9uKCl7Zm9yKHZhciBuPWkubGVuZ3RoLTE7bj4tMTtuLS0pe3ZhciB0PWlbbl0scj10LnN1YnM7KDAsdC51bm1vdW50KSh0Lm5vZGUpLHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuKCl9KSxpLnNwbGljZShuLDEpfWMuZW1pdChcInVubW91bnRcIil9fX1leHBvcnR7dSBhcyBjb21wb25lbnQsYyBhcyBwaWNvYXBwfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpY29hcHAuZXMuanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
12743//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js
12744
12745}`)},"./node_modules/.pnpm/[email protected]/node_modules/tinkerbell/dist/tinkerbell.es.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__);
12746/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12747/* harmony export */   "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__)
12748/* harmony export */ });
12749Object.defineProperty(__WEBPACK_DEFAULT_EXPORT__, "name", { value: "default", configurable: true });
12750/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(n,t,r,u){return function(e,i){var o,a,c,f;return c=function m(d){return requestAnimationFrame(function(l){a||(a=l),o=l-a,f=Math.round(u(o,n,t-n,r)),(t>n?f<t&&d<=t:f>t&&d>=t)&&o<=r?(c=m(f),e(f)):(e(t),i&&i())})}(n),function(){cancelAnimationFrame(c)}}};
12751//# sourceMappingURL=tinkerbell.es.js.map
12752//# sourceURL=[module]
12753//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vdGlua2VyYmVsbEAwLjIuMC9ub2RlX21vZHVsZXMvdGlua2VyYmVsbC9kaXN0L3R
12753pbmtlcmJlbGwuZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBZSxvQ0FBUyxTQUFTLHFCQUFxQixZQUFZLHVCQUF1Qix5Q0FBeUMsc0dBQXNHLEVBQUUsZUFBZTtBQUN6UCIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS90aW5rZXJiZWxsQDAuMi4wL25vZGVfbW9kdWxlcy90aW5rZXJiZWxsL2Rpc3QvdGlua2VyYmVsbC5lcy5qcz8wMGM5Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG4sdCxyLHUpe3JldHVybiBmdW5jdGlvbihlLGkpe3ZhciBvLGEsYyxmO3JldHVybiBjPWZ1bmN0aW9uIG0oZCl7cmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbihsKXthfHwoYT1sKSxvPWwtYSxmPU1hdGgucm91bmQodShvLG4sdC1uLHIpKSwodD5uP2Y8dCYmZDw9dDpmPnQmJmQ+PXQpJiZvPD1yPyhjPW0oZiksZShmKSk6KGUodCksaSYmaSgpKX0pfShuKSxmdW5jdGlvbigpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKGMpfX19O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGlua2VyYmVsbC5lcy5qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
12754//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/tinkerbell/dist/tinkerbell.es.js
12755
12756}`)}},__webpack_module_cache__={};function __webpack_require__(moduleId){var cachedModule=__webpack_module_cache__[moduleId];if(cachedModule!==void 0)return cachedModule.exports;var module=__webpack_module_cache__[moduleId]={exports:{}};if(!(moduleId in __webpack_modules__)){delete __webpack_module_cache__[moduleId];var e=new Error("Cannot find module '"+moduleId+"'");throw e.code="MODULE_NOT_FOUND",e}return __webpack_modules__[moduleId](module,module.exports,__webpack_require__),module.exports}__webpack_require__.d=(exports,definition)=>{for(var key in definition)__webpack_require__.o(definition,key)&&!__webpack_require__.o(exports,key)&&Object.defineProperty(exports,key,{enumerable:!0,get:definition[key]})},__webpack_require__.o=(obj,prop)=>Object.prototype.hasOwnProperty.call(obj,prop),__webpack_require__.r=exports=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/scripts/components/blog.js")})();
12757//# sourceMappingURL=/cdn/shop/t/98/assets/blog.js.map?v=163347683708985164161788850462

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.