PageSourceSearch

https://www.nationaloutages.com/assets/javascripts/spia-81fbc95d7054865df01c70afbd662302.js

js nationaloutages.com collected 2026-10-05 19:43:56 UTC 108,612 bytes, 3,178 lines download raw bytes

1/*!
2 * Webflow: Front-end site library
3 * @license MIT
4 * Inline scripts may access the api using an async handler:
5 *   var Webflow = Webflow || [];
6 *   Webflow.push(readyFunction);
7 */
8/******/ (function(modules) { // webpackBootstrap
9/******/ 	// The module cache
10/******/ 	var installedModules = {};
11/******/
12/******/ 	// The require function
13/******/ 	function __webpack_require__(moduleId) {
14/******/
15/******/ 		// Check if module is in cache
16/******/ 		if(installedModules[moduleId]) {
17/******/ 			return installedModules[moduleId].exports;
18/******/ 		}
19/******/ 		// Create a new module (and put it into the cache)
20/******/ 		var module = installedModules[moduleId] = {
21/******/ 			i: moduleId,
22/******/ 			l: false,
23/******/ 			exports: {}
24/******/ 		};
25/******/
26/******/ 		// Execute the module function
27/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
28/******/
29/******/ 		// Flag the module as loaded
30/******/ 		module.l = true;
31/******/
32/******/ 		// Return the exports of the module
33/******/ 		return module.exports;
34/******/ 	}
35/******/
36/******/
37/******/ 	// expose the modules object (__webpack_modules__)
38/******/ 	__webpack_require__.m = modules;
39/******/
40/******/ 	// expose the module cache
41/******/ 	__webpack_require__.c = installedModules;
42/******/
43/******/ 	// define getter function for harmony exports
44/******/ 	__webpack_require__.d = function(exports, name, getter) {
45/******/ 		if(!__webpack_require__.o(exports, name)) {
46/******/ 			Object.defineProperty(exports, name, {
47/******/ 				configurable: false,
48/******/ 				enumerable: true,
49/******/ 				get: getter
50/******/ 			});
51/******/ 		}
52/******/ 	};
53/******/
54/******/ 	// getDefaultExport function for compatibility with non-harmony modules
55/******/ 	__webpack_require__.n = function(module) {
56/******/ 		var getter = module && module.__esModule ?
57/******/ 			function getDefault() { return module['default']; } :
58/******/ 			function getModuleExports() { return module; };
59/******/ 		__webpack_require__.d(getter, 'a', getter);
60/******/ 		return getter;
61/******/ 	};
62/******/
63/******/ 	// Object.prototype.hasOwnProperty.call
64/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
65/******/
66/******/ 	// __webpack_public_path__
67/******/ 	__webpack_require__.p = "";
68/******/
69/******/ 	// Load entry module and return exports
70/******/ 	return __webpack_require__(__webpack_require__.s = 4);
71/******/ })
72/************************************************************************/
73/******/ ([
74/* 0 */
75/***/ (function(module, exports, __webpack_require__) {
76
77/**
78 * Webflow: Core site library
79 */
80
81var Webflow = {};
82var modules = {};
83var primary = [];
84var secondary = window.Webflow || [];
85var $ = window.jQuery;
86var $win = $(window);
87var $doc = $(document);
88var isFunction = $.isFunction;
89var _ = Webflow._ = __webpack_require__(6);
90var tram = __webpack_require__(1) && $.tram;
91var domready = false;
92var destroyed = false;
93tram.config.hideBackface = false;
94tram.config.keepInherited = true;
95
96/**
97 * Webflow.define - Define a named module
98 * @param  {string} name
99 * @param  {function} factory
100 * @param  {object} options
101 * @return {object}
102 */
103Webflow.define = function (name, factory, options) {
104  if (modules[name]) unbindModule(modules[name]);
105  var instance = modules[name] = factory($, _, options) || {};
106  bindModule(instance);
107  return instance;
108};
109
110/**
111 * Webflow.require - Require a named module
112 * @param  {string} name
113 * @return {object}
114 */
115Webflow.require = function (name) {
116  return modules[name];
117};
118
119function bindModule(module) {
120  // If running in Webflow app, subscribe to design/preview events
121  if (Webflow.env()) {
122    isFunction(module.design) && $win.on('__wf_design', module.design);
123    isFunction(module.preview) && $win.on('__wf_preview', module.preview);
124  }
125  // Subscribe to front-end destroy event
126  isFunction(module.destroy) && $win.on('__wf_destroy', module.destroy);
127  // Look for ready method on module
128  if (module.ready && isFunction(module.ready)) {
129    addReady(module);
130  }
131}
132
133function addReady(module) {
134  // If domready has already happened, run ready method
135  if (domready) {
136    module.ready();
137    return;
138  }
139  // Otherwise add ready method to the primary queue (only once)
140  if (_.contains(primary, module.ready)) return;
141  primary.push(module.ready);
142}
143
144function unbindModule(module) {
145  // Unsubscribe module from window events
146  isFunction(module.design) && $win.off('__wf_design', module.design);
147  isFunction(module.preview) && $win.off('__wf_preview', module.preview);
148  isFunction(module.destroy) && $win.off('__wf_destroy', module.destroy);
149  // Remove ready method from primary queue
150  if (module.ready && isFunction(module.ready)) {
151    removeReady(module);
152  }
153}
154
155function removeReady(module) {
156  primary = _.filter(primary, function (readyFn) {
157    return readyFn !== module.ready;
158  });
159}
160
161/**
162 * Webflow.push - Add a ready handler into secondary queue
163 * @param {function} ready  Callback to invoke on domready
164 */
165Webflow.push = function (ready) {
166  // If domready has already happened, invoke handler
167  if (domready) {
168    isFunction(ready) && ready();
169    return;
170  }
171  // Otherwise push into secondary queue
172  secondary.push(ready);
173};
174
175/**
176 * Webflow.env - Get the state of the Webflow app
177 * @param {string} mode [optional]
178 * @return {boolean}
179 */
180Webflow.env = function (mode) {
181  var designFlag = window.__wf_design;
182  var inApp = typeof designFlag !== 'undefined';
183  if (!mode) return inApp;
184  if (mode === 'design') return inApp && designFlag;
185  if (mode === 'preview') return inApp && !designFlag;
186  if (mode === 'slug') return inApp && window.__wf_slug;
187  if (mode === 'editor') return window.WebflowEditor;
188  if (mode === 'test') return false || window.__wf_test;
189  if (mode === 'frame') return window !== window.top;
190};
191
192// Feature detects + browser sniffs  ಠ_ಠ
193var userAgent = navigator.userAgent.toLowerCase();
194var touch = Webflow.env.touch = 'ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch;
195var chrome = Webflow.env.chrome = /chrome/.test(userAgent) && /Google/.test(navigator.vendor) && parseInt(userAgent.match(/chrome\/(\d+)\./)[1], 10);
196var ios = Webflow.env.ios = /(ipod|iphone|ipad)/.test(userAgent);
197Webflow.env.safari = /safari/.test(userAgent) && !chrome && !ios;
198
199// Maintain current touch target to prevent late clicks on touch devices
200var touchTarget;
201// Listen for both events to support touch/mouse hybrid devices
202touch && $doc.on('touchstart mousedown', function (evt) {
203  touchTarget = evt.target;
204});
205
206/**
207 * Webflow.validClick - validate click target against current touch target
208 * @param  {HTMLElement} clickTarget  Element being clicked
209 * @return {Boolean}  True if click target is valid (always true on non-touch)
210 */
211Webflow.validClick = touch ? function (clickTarget) {
212  return clickTarget === touchTarget || $.contains(clickTarget, touchTarget);
213} : function () {
214  return true;
215};
216
217/**
218 * Webflow.resize, Webflow.scroll - throttled event proxies
219 */
220var resizeEvents = 'resize.webflow orientationchange.webflow load.webflow';
221var scrollEvents = 'scroll.webflow ' + resizeEvents;
222Webflow.resize = eventProxy($win, resizeEvents);
223Webflow.scroll = eventProxy($win, scrollEvents);
224Webflow.redraw = eventProxy();
225
226// Create a proxy instance for throttled events
227function eventProxy(target, types) {
228
229  // Set up throttled method (using custom frame-based _.throttle)
230  var handlers = [];
231  var proxy = {};
232  proxy.up = _.throttle(function (evt) {
233    _.each(handlers, function (h) {
234      h(evt);
235    });
236  });
237
238  // Bind events to target
239  if (target && types) target.on(types, proxy.up);
240
241  /**
242   * Add an event handler
243   * @param  {function} handler
244   */
245  proxy.on = function (handler) {
246    if (typeof handler !== 'function') return;
247    if (_.contains(handlers, handler)) return;
248    handlers.push(handler);
249  };
250
251  /**
252   * Remove an event handler
253   * @param  {function} handler
254   */
255  proxy.off = function (handler) {
256    // If no arguments supplied, clear all handlers
257    if (!arguments.length) {
258      handlers = [];
259      return;
260    }
261    // Otherwise, remove handler from the list
262    handlers = _.filter(handlers, function (h) {
263      return h !== handler;
264    });
265  };
266
267  return proxy;
268}
269
270// Webflow.location - Wrap window.location in api
271Webflow.location = function (url) {
272  window.location = url;
273};
274
275if (Webflow.env()) {
276  // Ignore redirects inside a Webflow design/edit environment
277  Webflow.location = function () {};
278}
279
280// Webflow.ready - Call primary and secondary handlers
281Webflow.ready = function () {
282  domready = true;
283
284  // Restore modules after destroy
285  if (destroyed) {
286    restoreModules();
287
288    // Otherwise run primary ready methods
289  } else {
290    _.each(primary, callReady);
291  }
292
293  // Run secondary ready methods
294  _.each(secondary, callReady);
295
296  // Trigger resize
297  Webflow.resize.up();
298};
299
300function callReady(readyFn) {
301  isFunction(readyFn) && readyFn();
302}
303
304function restoreModules() {
305  destroyed = false;
306  _.each(modules, bindModule);
307}
308
309/**
310 * Webflow.load - Add a window load handler that will run even if load event has already happened
311 * @param  {function} handler
312 */
313var deferLoad;
314Webflow.load = function (handler) {
315  deferLoad.then(handler);
316};
317
318function bindLoad() {
319  // Reject any previous deferred (to support destroy)
320  if (deferLoad) {
321    deferLoad.reject();
322    $win.off('load', deferLoad.resolve);
323  }
324  // Create deferred and bind window load event
325  deferLoad = new $.Deferred();
326  $win.on('load', deferLoad.resolve);
327}
328
329// Webflow.destroy - Trigger a destroy event for all modules
330Webflow.destroy = function (options) {
331  options = options || {};
332  destroyed = true;
333  $win.triggerHandler('__wf_destroy');
334
335  // Allow domready reset for tests
336  if (options.domready != null) {
337    domready = options.domready;
338  }
339
340  // Unbind modules
341  _.each(modules, unbindModule);
342
343  // Clear any proxy event handlers
344  Webflow.resize.off();
345  Webflow.scroll.off();
346  Webflow.redraw.off();
347
348  // Clear any queued ready methods
349  primary = [];
350  secondary = [];
351
352  // If load event has not yet fired, replace the deferred
353  if (deferLoad.state() === 'pending') bindLoad();
354};
355
356// Listen for domready
357$(Webflow.ready);
358
359// Listen for window.onload and resolve deferred
360bindLoad();
361
362// Export commonjs module
363module.exports = window.Webflow = Webflow;
364
365/***/ }),
366/* 1 */
367/***/ (function(module, exports) {
368
369var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
370
371/*!
372 * tram.js v0.8.2-global
373 * Cross-browser CSS3 transitions in JavaScript
374 * https://github.com/bkwld/tram
375 * MIT License
376 */
377window.tram = function (a) {
378  function b(a, b) {
379    var c = new M.Bare();return c.init(a, b);
380  }function c(a) {
381    return a.replace(/[A-Z]/g, function (a) {
382      return "-" + a.toLowerCase();
383    });
384  }function d(a) {
385    var b = parseInt(a.slice(1), 16),
386        c = b >> 16 & 255,
387        d = b >> 8 & 255,
388        e = 255 & b;return [c, d, e];
389  }function e(a, b, c) {
390    return "#" + (1 << 24 | a << 16 | b << 8 | c).toString(16).slice(1);
391  }function f() {}function g(a, b) {
392    j("Type warning: Expected: [" + a + "] Got: [" + (typeof b === "undefined" ? "undefined" : _typeof(b)) + "] " + b);
393  }function h(a, b, c) {
394    j("Units do not match [" + a + "]: " + b + ", " + c);
395  }function i(a, b, c) {
396    if (void 0 !== b && (c = b), void 0 === a) return c;var d = c;return $.test(a) || !_.test(a) ? d = parseInt(a, 10) : _.test(a) && (d = 1e3 * parseFloat(a)), 0 > d && (d = 0), d === d ? d : c;
397  }function j(a) {
398    U.debug && window && window.console.warn(a);
399  }function k(a) {
400    for (var b = -1, c = a ? a.length : 0, d = []; ++b < c;) {
401      var e = a[b];e && d.push(e);
402    }return d;
403  }var l = function (a, b, c) {
404    function d(a) {
405      return "object" == (typeof a === "undefined" ? "undefined" : _typeof(a));
406    }function e(a) {
407      return "function" == typeof a;
408    }function f() {}function g(h, i) {
409      function j() {
410        var a = new k();return e(a.init) && a.init.apply(a, arguments), a;
411      }function k() {}i === c && (i = h, h = Object), j.Bare = k;var l,
412          m = f[a] = h[a],
413          n = k[a] = j[a] = new f();return n.constructor = j, j.mixin = function (b) {
414        return k[a] = j[a] = g(j, b)[a], j;
415      }, j.open = function (a) {
416        if (l = {}, e(a) ? l = a.call(j, n, m, j, h) : d(a) && (l = a), d(l)) for (var c in l) {
417          b.call(l, c) && (n[c] = l[c]);
418        }return e(n.init) || (n.init = h), j;
419      }, j.open(i);
420    }return g;
421  }("prototype", {}.hasOwnProperty),
422      m = { ease: ["ease", function (a, b, c, d) {
423      var e = (a /= d) * a,
424          f = e * a;return b + c * (-2.75 * f * e + 11 * e * e + -15.5 * f + 8 * e + .25 * a);
425    }], "ease-in": ["ease-in", function (a, b, c, d) {
426      var e = (a /= d) * a,
427          f = e * a;return b + c * (-1 * f * e + 3 * e * e + -3 * f + 2 * e);
428    }], "ease-out": ["ease-out", function (a, b, c, d) {
429      var e = (a /= d) * a,
430          f = e * a;return b + c * (.3 * f * e + -1.6 * e * e + 2.2 * f + -1.8 * e + 1.9 * a);
431    }], "ease-in-out": ["ease-in-out", function (a, b, c, d) {
432      var e = (a /= d) * a,
433          f = e * a;return b + c * (2 * f * e + -5 * e * e + 2 * f + 2 * e);
434    }], linear: ["linear", function (a, b, c, d) {
435      return c * a / d + b;
436    }], "ease-in-quad": ["cubic-bezier(0.550, 0.085, 0.680, 0.530)", function (a, b, c, d) {
437      return c * (a /= d) * a + b;
438    }], "ease-out-quad": ["cubic-bezier(0.250, 0.460, 0.450, 0.940)", function (a, b, c, d) {
439      return -c * (a /= d) * (a - 2) + b;
440    }], "ease-in-out-quad": ["cubic-bezier(0.455, 0.030, 0.515, 0.955)", function (a, b, c, d) {
441      return (a /= d / 2) < 1 ? c / 2 * a * a + b : -c / 2 * (--a * (a - 2) - 1) + b;
442    }], "ease-in-cubic": ["cubic-bezier(0.550, 0.055, 0.675, 0.190)", function (a, b, c, d) {
443      return c * (a /= d) * a * a + b;
444    }], "ease-out-cubic": ["cubic-bezier(0.215, 0.610, 0.355, 1)", function (a, b, c, d) {
445      return c * ((a = a / d - 1) * a * a + 1) + b;
446    }], "ease-in-out-cubic": ["cubic-bezier(0.645, 0.045, 0.355, 1)", function (a, b, c, d) {
447      return (a /= d / 2) < 1 ? c / 2 * a * a * a + b : c / 2 * ((a -= 2) * a * a + 2) + b;
448    }], "ease-in-quart": ["cubic-bezier(0.895, 0.030, 0.685, 0.220)", function (a, b, c, d) {
449      return c * (a /= d) * a * a * a + b;
450    }], "ease-out-quart": ["cubic-bezier(0.165, 0.840, 0.440, 1)", function (a, b, c, d) {
451      return -c * ((a = a / d - 1) * a * a * a - 1) + b;
452    }], "ease-in-out-quart": ["cubic-bezier(0.770, 0, 0.175, 1)", function (a, b, c, d) {
453      return (a /= d / 2) < 1 ? c / 2 * a * a * a * a + b : -c / 2 * ((a -= 2) * a * a * a - 2) + b;
454    }], "ease-in-quint": ["cubic-bezier(0.755, 0.050, 0.855, 0.060)", function (a, b, c, d) {
455      return c * (a /= d) * a * a * a * a + b;
456    }], "ease-out-quint": ["cubic-bezier(0.230, 1, 0.320, 1)", function (a, b, c, d) {
457      return c * ((a = a / d - 1) * a * a * a * a + 1) + b;
458    }], "ease-in-out-quint": ["cubic-bezier(0.860, 0, 0.070, 1)", function (a, b, c, d) {
459      return (a /= d / 2) < 1 ? c / 2 * a * a * a * a * a + b : c / 2 * ((a -= 2) * a * a * a * a + 2) + b;
460    }], "ease-in-sine": ["cubic-bezier(0.470, 0, 0.745, 0.715)", function (a, b, c, d) {
461      return -c * Math.cos(a / d * (Math.PI / 2)) + c + b;
462    }], "ease-out-sine": ["cubic-bezier(0.390, 0.575, 0.565, 1)", function (a, b, c, d) {
463      return c * Math.sin(a / d * (Math.PI / 2)) + b;
464    }], "ease-in-out-sine": ["cubic-bezier(0.445, 0.050, 0.550, 0.950)", function (a, b, c, d) {
465      return -c / 2 * (Math.cos(Math.PI * a / d) - 1) + b;
466    }], "ease-in-expo": ["cubic-bezier(0.950, 0.050, 0.795, 0.035)", function (a, b, c, d) {
467      return 0 === a ? b : c * Math.pow(2, 10 * (a / d - 1)) + b;
468    }], "ease-out-expo": ["cubic-bezier(0.190, 1, 0.220, 1)", function (a, b, c, d) {
469      return a === d ? b + c : c * (-Math.pow(2, -10 * a / d) + 1) + b;
470    }], "ease-in-out-expo": ["cubic-bezier(1, 0, 0, 1)", function (a, b, c, d) {
471      return 0 === a ? b : a === d ? b + c : (a /= d / 2) < 1 ? c / 2 * Math.pow(2, 10 * (a - 1)) + b : c / 2 * (-Math.pow(2, -10 * --a) + 2) + b;
472    }], "ease-in-circ": ["cubic-bezier(0.600, 0.040, 0.980, 0.335)", function (a, b, c, d) {
473      return -c * (Math.sqrt(1 - (a /= d) * a) - 1) + b;
474    }], "ease-out-circ": ["cubic-bezier(0.075, 0.820, 0.165, 1)", function (a, b, c, d) {
475      return c * Math.sqrt(1 - (a = a / d - 1) * a) + b;
476    }], "ease-in-out-circ": ["cubic-bezier(0.785, 0.135, 0.150, 0.860)", function (a, b, c, d) {
477      return (a /= d / 2) < 1 ? -c / 2 * (Math.sqrt(1 - a * a) - 1) + b : c / 2 * (Math.sqrt(1 - (a -= 2) * a) + 1) + b;
478    }], "ease-in-back": ["cubic-bezier(0.600, -0.280, 0.735, 0.045)", function (a, b, c, d, e) {
479      return void 0 === e && (e = 1.70158), c * (a /= d) * a * ((e + 1) * a - e) + b;
480    }], "ease-out-back": ["cubic-bezier(0.175, 0.885, 0.320, 1.275)", function (a, b, c, d, e) {
481      return void 0 === e && (e = 1.70158), c * ((a = a / d - 1) * a * ((e + 1) * a + e) + 1) + b;
482    }], "ease-in-out-back": ["cubic-bezier(0.680, -0.550, 0.265, 1.550)", function (a, b, c, d, e) {
483      return void 0 === e && (e = 1.70158), (a /= d / 2) < 1 ? c / 2 * a * a * (((e *= 1.525) + 1) * a - e) + b : c / 2 * ((a -= 2) * a * (((e *= 1.525) + 1) * a + e) + 2) + b;
484    }] },
485      n = { "ease-in-back": "cubic-bezier(0.600, 0, 0.735, 0.045)", "ease-out-back": "cubic-bezier(0.175, 0.885, 0.320, 1)", "ease-in-out-back": "cubic-bezier(0.680, 0, 0.265, 1)" },
486      o = document,
487      p = window,
488      q = "bkwld-tram",
489      r = /[\-\.0-9]/g,
490      s = /[A-Z]/,
491      t = "number",
492      u = /^(rgb|#)/,
493      v = /(em|cm|mm|in|pt|pc|px)$/,
494      w = /(em|cm|mm|in|pt|pc|px|%)$/,
495      x = /(deg|rad|turn)$/,
496      y = "unitless",
497      z = /(all|none) 0s ease 0s/,
498      A = /^(width|height)$/,
499      B = " ",
500      C = o.createElement("a"),
501      D = ["Webkit", "Moz", "O", "ms"],
502      E = ["-webkit-", "-moz-", "-o-", "-ms-"],
503      F = function F(a) {
504    if (a in C.style) return { dom: a, css: a };var b,
505        c,
506        d = "",
507        e = a.split("-");for (b = 0; b < e.length; b++) {
508      d += e[b].charAt(0).toUpperCase() + e[b].slice(1);
509    }for (b = 0; b < D.length; b++) {
510      if (c = D[b] + d, c in C.style) return { dom: c, css: E[b] + a };
511    }
512  },
513      G = b.support = { bind: Function.prototype.bind, transform: F("transform"), transition: F("transition"), backface: F("backface-visibility"), timing: F("transition-timing-function") };if (G.transition) {
514    var H = G.timing.dom;if (C.style[H] = m["ease-in-back"][0], !C.style[H]) for (var I in n) {
515      m[I][0] = n[I];
516    }
517  }var J = b.frame = function () {
518    var a = p.requestAnimationFrame || p.webkitRequestAnimationFrame || p.mozRequestAnimationFrame || p.oRequestAnimationFrame || p.msRequestAnimationFrame;return a && G.bind ? a.bind(p) : function (a) {
519      p.setTimeout(a, 16);
520    };
521  }(),
522      K = b.now = function () {
523    var a = p.performance,
524        b = a && (a.now || a.webkitNow || a.msNow || a.mozNow);return b && G.bind ? b.bind(a) : Date.now || function () {
525      return +new Date();
526    };
527  }(),
528      L = l(function (b) {
529    function d(a, b) {
530      var c = k(("" + a).split(B)),
531          d = c[0];b = b || {};var e = Y[d];if (!e) return j("Unsupported property: " + d);if (!b.weak || !this.props[d]) {
532        var f = e[0],
533            g = this.props[d];return g || (g = this.props[d] = new f.Bare()), g.init(this.$el, c, e, b), g;
534      }
535    }function e(a, b, c) {
536      if (a) {
537        var e = typeof a === "undefined" ? "undefined" : _typeof(a);if (b || (this.timer && this.timer.destroy(), this.queue = [], this.active = !1), "number" == e && b) return this.timer = new S({ duration: a, context: this, c
537omplete: h }), void (this.active = !0);if ("string" == e && b) {
538          switch (a) {case "hide":
539              o.call(this);break;case "stop":
540              l.call(this);break;case "redraw":
541              p.call(this);break;default:
542              d.call(this, a, c && c[1]);}return h.call(this);
543        }if ("function" == e) return void a.call(this, this);if ("object" == e) {
544          var f = 0;u.call(this, a, function (a, b) {
545            a.span > f && (f = a.span), a.stop(), a.animate(b);
546          }, function (a) {
547            "wait" in a && (f = i(a.wait, 0));
548          }), t.call(this), f > 0 && (this.timer = new S({ duration: f, context: this }), this.active = !0, b && (this.timer.complete = h));var g = this,
549              j = !1,
550              k = {};J(function () {
551            u.call(g, a, function (a) {
552              a.active && (j = !0, k[a.name] = a.nextStyle);
553            }), j && g.$el.css(k);
554          });
555        }
556      }
557    }function f(a) {
558      a = i(a, 0), this.active ? this.queue.push({ options: a }) : (this.timer = new S({ duration: a, context: this, complete: h }), this.active = !0);
559    }function g(a) {
560      return this.active ? (this.queue.push({ options: a, args: arguments }), void (this.timer.complete = h)) : j("No active transition timer. Use start() or wait() before then().");
561    }function h() {
562      if (this.timer && this.timer.destroy(), this.active = !1, this.queue.length) {
563        var a = this.queue.shift();e.call(this, a.options, !0, a.args);
564      }
565    }function l(a) {
566      this.timer && this.timer.destroy(), this.queue = [], this.active = !1;var b;"string" == typeof a ? (b = {}, b[a] = 1) : b = "object" == (typeof a === "undefined" ? "undefined" : _typeof(a)) && null != a ? a : this.props, u.call(this, b, v), t.call(this);
567    }function m(a) {
568      l.call(this, a), u.call(this, a, w, x);
569    }function n(a) {
570      "string" != typeof a && (a = "block"), this.el.style.display = a;
571    }function o() {
572      l.call(this), this.el.style.display = "none";
573    }function p() {
574      this.el.offsetHeight;
575    }function r() {
576      l.call(this), a.removeData(this.el, q), this.$el = this.el = null;
577    }function t() {
578      var a,
579          b,
580          c = [];this.upstream && c.push(this.upstream);for (a in this.props) {
581        b = this.props[a], b.active && c.push(b.string);
582      }c = c.join(","), this.style !== c && (this.style = c, this.el.style[G.transition.dom] = c);
583    }function u(a, b, e) {
584      var f,
585          g,
586          h,
587          i,
588          j = b !== v,
589          k = {};for (f in a) {
590        h = a[f], f in Z ? (k.transform || (k.transform = {}), k.transform[f] = h) : (s.test(f) && (f = c(f)), f in Y ? k[f] = h : (i || (i = {}), i[f] = h));
591      }for (f in k) {
592        if (h = k[f], g = this.props[f], !g) {
593          if (!j) continue;g = d.call(this, f);
594        }b.call(this, g, h);
595      }e && i && e.call(this, i);
596    }function v(a) {
597      a.stop();
598    }function w(a, b) {
599      a.set(b);
600    }function x(a) {
601      this.$el.css(a);
602    }function y(a, c) {
603      b[a] = function () {
604        return this.children ? A.call(this, c, arguments) : (this.el && c.apply(this, arguments), this);
605      };
606    }function A(a, b) {
607      var c,
608          d = this.children.length;for (c = 0; d > c; c++) {
609        a.apply(this.children[c], b);
610      }return this;
611    }b.init = function (b) {
612      if (this.$el = a(b), this.el = this.$el[0], this.props = {}, this.queue = [], this.style = "", this.active = !1, U.keepInherited && !U.fallback) {
613        var c = W(this.el, "transition");c && !z.test(c) && (this.upstream = c);
614      }G.backface && U.hideBackface && V(this.el, G.backface.css, "hidden");
615    }, y("add", d), y("start", e), y("wait", f), y("then", g), y("next", h), y("stop", l), y("set", m), y("show", n), y("hide", o), y("redraw", p), y("destroy", r);
616  }),
617      M = l(L, function (b) {
618    function c(b, c) {
619      var d = a.data(b, q) || a.data(b, q, new L.Bare());return d.el || d.init(b), c ? d.start(c) : d;
620    }b.init = function (b, d) {
621      var e = a(b);if (!e.length) return this;if (1 === e.length) return c(e[0], d);var f = [];return e.each(function (a, b) {
622        f.push(c(b, d));
623      }), this.children = f, this;
624    };
625  }),
626      N = l(function (a) {
627    function b() {
628      var a = this.get();this.update("auto");var b = this.get();return this.update(a), b;
629    }function c(a, b, c) {
630      return void 0 !== b && (c = b), a in m ? a : c;
631    }function d(a) {
632      var b = /rgba?\((\d+),\s*(\d+),\s*(\d+)/.exec(a);return (b ? e(b[1], b[2], b[3]) : a).replace(/#(\w)(\w)(\w)$/, "#$1$1$2$2$3$3");
633    }var f = { duration: 500, ease: "ease", delay: 0 };a.init = function (a, b, d, e) {
634      this.$el = a, this.el = a[0];var g = b[0];d[2] && (g = d[2]), X[g] && (g = X[g]), this.name = g, this.type = d[1], this.duration = i(b[1], this.duration, f.duration), this.ease = c(b[2], this.ease, f.ease), this.delay = i(b[3], this.delay, f.delay), this.span = this.duration + this.delay, this.active = !1, this.nextStyle = null, this.auto = A.test(this.name), this.unit = e.unit || this.unit || U.defaultUnit, this.angle = e.angle || this.angle || U.defaultAngle, U.fallback || e.fallback ? this.animate = this.fallback : (this.animate = this.transition, this.string = this.name + B + this.duration + "ms" + ("ease" != this.ease ? B + m[this.ease][0] : "") + (this.delay ? B + this.delay + "ms" : ""));
635    }, a.set = function (a) {
636      a = this.convert(a, this.type), this.update(a), this.redraw();
637    }, a.transition = function (a) {
638      this.active = !0, a = this.convert(a, this.type), this.auto && ("auto" == this.el.style[this.name] && (this.update(this.get()), this.redraw()), "auto" == a && (a = b.call(this))), this.nextStyle = a;
639    }, a.fallback = function (a) {
640      var c = this.el.style[this.name] || this.convert(this.get(), this.type);a = this.convert(a, this.type), this.auto && ("auto" == c && (c = this.convert(this.get(), this.type)), "auto" == a && (a = b.call(this))), this.tween = new R({ from: c, to: a, duration: this.duration, delay: this.delay, ease: this.ease, update: this.update, context: this });
641    }, a.get = function () {
642      return W(this.el, this.name);
643    }, a.update = function (a) {
644      V(this.el, this.name, a);
645    }, a.stop = function () {
646      (this.active || this.nextStyle) && (this.active = !1, this.nextStyle = null, V(this.el, this.name, this.get()));var a = this.tween;a && a.context && a.destroy();
647    }, a.convert = function (a, b) {
648      if ("auto" == a && this.auto) return a;var c,
649          e = "number" == typeof a,
650          f = "string" == typeof a;switch (b) {case t:
651          if (e) return a;if (f && "" === a.replace(r, "")) return +a;c = "number(unitless)";break;case u:
652          if (f) {
653            if ("" === a && this.original) return this.original;if (b.test(a)) return "#" == a.charAt(0) && 7 == a.length ? a : d(a);
654          }c = "hex or rgb string";break;case v:
655          if (e) return a + this.unit;if (f && b.test(a)) return a;c = "number(px) or string(unit)";break;case w:
656          if (e) return a + this.unit;if (f && b.test(a)) return a;c = "number(px) or string(unit or %)";break;case x:
657          if (e) return a + this.angle;if (f && b.test(a)) return a;c = "number(deg) or string(angle)";break;case y:
658          if (e) return a;if (f && w.test(a)) return a;c = "number(unitless) or string(unit or %)";}return g(c, a), a;
659    }, a.redraw = function () {
660      this.el.offsetHeight;
661    };
662  }),
663      O = l(N, function (a, b) {
664    a.init = function () {
665      b.init.apply(this, arguments), this.original || (this.original = this.convert(this.get(), u));
666    };
667  }),
668      P = l(N, function (a, b) {
669    a.init = function () {
670      b.init.apply(this, arguments), this.animate = this.fallback;
671    }, a.get = function () {
672      return this.$el[this.name]();
673    }, a.update = function (a) {
674      this.$el[this.name](a);
675    };
676  }),
677      Q = l(N, function (a, b) {
678    function c(a, b) {
679      var c, d, e, f, g;for (c in a) {
680        f = Z[c], e = f[0], d = f[1] || c, g = this.convert(a[c], e), b.call(this, d, g, e);
681      }
682    }a.init = function () {
683      b.init.apply(this, arguments), this.current || (this.current = {}, Z.perspective && U.perspective && (this.current.perspective = U.perspective, V(this.el, this.name, this.style(this.current)), this.redraw()));
684    }, a.set = function (a) {
685      c.call(this, a, function (a, b) {
686        this.current[a] = b;
687      }), V(this.el, this.name, this.style(this.current)), this.redraw();
688    }, a.transition = function (a) {
689      var b = this.values(a);this.tween = new T({ current: this.current, values: b, duration: this.duration, delay: this.delay, ease: this.ease });var c,
690          d = {};for (c in this.current) {
691        d[c] = c in b ? b[c] : this.current[c];
692      }this.active = !0, this.nextStyle = this.style(d);
693    }, a.fallback = function (a) {
694      var b = this.values(a);this.tween = new T({ current: this.current, values: b, duration: this.duration, delay: this.delay, ease: this.ease, update: this.update, context: this });
695    }, a.update = function () {
696      V(this.el, this.name, this.style(this.current));
697    }, a.style = function (a) {
698      var b,
699          c = "";for (b in a) {
700        c += b + "(" + a[b] + ") ";
701      }return c;
702    }, a.values = function (a) {
703      var b,
704          d = {};return c.call(this, a, function (a, c, e) {
705        d[a] = c, void 0 === this.current[a] && (b = 0, ~a.indexOf("scale") && (b = 1), this.current[a] = this.convert(b, e));
706      }), d;
707    };
708  }),
709      R = l(function (b) {
710    function c(a) {
711      1 === n.push(a) && J(g);
712    }function g() {
713      var a,
714          b,
715          c,
716          d = n.length;if (d) for (J(g), b = K(), a = d; a--;) {
717        c = n[a], c && c.render(b);
718      }
719    }function i(b) {
720      var c,
721          d = a.inArray(b, n);d >= 0 && (c = n.slice(d + 1), n.length = d, c.length && (n = n.concat(c)));
722    }function j(a) {
723      return Math.round(a * o) / o;
724    }function k(a, b, c) {
725      return e(a[0] + c * (b[0] - a[0]), a[1] + c * (b[1] - a[1]), a[2] + c * (b[2] - a[2]));
726    }var l = { ease: m.ease[1], from: 0, to: 1 };b.init = function (a) {
727      this.duration = a.duration || 0, this.delay = a.delay || 0;var b = a.ease || l.ease;m[b] && (b = m[b][1]), "function" != typeof b && (b = l.ease), this.ease = b, this.update = a.update || f, this.complete = a.complete || f, this.context = a.context || this, this.name = a.name;var c = a.from,
728          d = a.to;void 0 === c && (c = l.from), void 0 === d && (d = l.to), this.unit = a.unit || "", "number" == typeof c && "number" == typeof d ? (this.begin = c, this.change = d - c) : this.format(d, c), this.value = this.begin + this.unit, this.start = K(), a.autoplay !== !1 && this.play();
729    }, b.play = function () {
730      this.active || (this.start || (this.start = K()), this.active = !0, c(this));
731    }, b.stop = function () {
732      this.active && (this.active = !1, i(this));
733    }, b.render = function (a) {
734      var b,
735          c = a - this.start;if (this.delay) {
736        if (c <= this.delay) return;c -= this.delay;
737      }if (c < this.duration) {
738        var d = this.ease(c, 0, 1, this.duration);return b = this.startRGB ? k(this.startRGB, this.endRGB, d) : j(this.begin + d * this.change), this.value = b + this.unit, void this.update.call(this.context, this.value);
739      }b = this.endHex || this.begin + this.change, this.value = b + this.unit, this.update.call(this.context, this.value), this.complete.call(this.context), this.destroy();
740    }, b.format = function (a, b) {
741      if (b += "", a += "", "#" == a.charAt(0)) return this.startRGB = d(b), this.endRGB = d(a), this.endHex = a, this.begin = 0, void (this.change = 1);if (!this.unit) {
742        var c = b.replace(r, ""),
743            e = a.replace(r, "");c !== e && h("tween", b, a), this.unit = c;
744      }b = parseFloat(b), a = parseFloat(a), this.begin = this.value = b, this.change = a - b;
745    }, b.destroy = function () {
746      this.stop(), this.context = null, this.ease = this.update = this.complete = f;
747    };var n = [],
748        o = 1e3;
749  }),
750      S = l(R, function (a) {
751    a.init = function (a) {
752      this.duration = a.duration || 0, this.complete = a.complete || f, this.context = a.context, this.play();
753    }, a.render = function (a) {
754      var b = a - this.start;b < this.duration || (this.complete.call(this.context), this.destroy());
755    };
756  }),
757      T = l(R, function (a, b) {
758    a.init = function (a) {
759      this.context = a.context, this.update = a.update, this.tweens = [], this.current = a.current;var b, c;for (b in a.values) {
760        c = a.values[b], this.current[b] !== c && this.tweens.push(new R({ name: b, from: this.current[b], to: c, duration: a.duration, delay: a.delay, ease: a.ease, autoplay: !1 }));
761      }this.play();
762    }, a.render = function (a) {
763      var b,
764          c,
765          d = this.tweens.length,
766          e = !1;for (b = d; b--;) {
767        c = this.tweens[b], c.context && (c.render(a), this.current[c.name] = c.value, e = !0);
768      }return e ? void (this.update && this.update.call(this.context)) : this.destroy();
769    }, a.destroy = function () {
770      if (b.destroy.call(this), this.tweens) {
771        var a,
772            c = this.tweens.length;for (a = c; a--;) {
773          this.tweens[a].destroy();
774        }this.tweens = null, this.current = null;
775      }
776    };
777  }),
778      U = b.config = { debug: !1, defaultUnit: "px", defaultAngle: "deg", keepInherited: !1, hideBackface: !1, perspective: "", fallback: !G.transition, agentTests: [] };b.fallback = function (a) {
779    if (!G.transition) return U.fallback = !0;U.agentTests.push("(" + a + ")");var b = new RegExp(U.agentTests.join("|"), "i");U.fallback = b.test(navigator.userAgent);
780  }, b.fallback("6.0.[2-5] Safari"), b.tween = function (a) {
781    return new R(a);
782  }, b.delay = function (a, b, c) {
783    return new S({ complete: b, duration: a, context: c });
784  }, a.fn.tram = function (a) {
785    return b.call(null, this, a);
786  };var V = a.style,
787      W = a.css,
788      X = { transform: G.transform && G.transform.css },
789      Y = { color: [O, u], background: [O, u, "background-color"], "outline-color": [O, u], "border-color": [O, u], "border-top-color": [O, u], "border-right-color": [O, u], "border-bottom-color": [O, u], "border-left-color": [O, u], "border-width": [N, v], "border-top-width": [N, v], "border-right-width": [N, v], "border-bottom-width": [N, v], "border-left-width": [N, v], "border-spacing": [N, v], "letter-spacing": [N, v], margin: [N, v], "margin-top": [N, v], "margin-right": [N, v], "margin-bottom": [N, v], "margin-left": [N, v], padding: [N, v], "padding-top": [N, v], "padding-right": [N, v], "padding-bottom": [N, v], "padding-left": [N, v], "outline-width": [N, v], opacity: [N, t], top: [N, w], right: [N, w], bottom: [N, w], left: [N, w], "font-size": [N, w], "text-indent": [N, w], "word-spacing": [N, w], width: [N, w], "min-width": [N, w], "max-width": [N, w], height: [N, w], "min-height": [N, w], "max-height": [N, w], "line-height": [N, y], "scroll-top": [P, t, "scrollTop"], "scroll-left": [P, t, "scrollLeft"] },
790      Z = {};G.transform && (Y.transform = [Q], Z = { x: [w, "translateX"], y: [w, "translateY"], rotate: [x], rotateX: [x], rotateY: [x], scale: [t], scaleX: [t], scaleY: [t], skew: [x], skewX: [x], skewY: [x] }), G.transform && G.backface && (Z.z = [w, "translateZ"], Z.rotateZ = [x], Z.scaleZ = [t], Z.perspective = [v]);var $ = /ms/,
791      _ = /s|\./;return a.tram = b;
792}(window.jQuery);
793
794/***/ }),
795/* 2 */
796/***/ (function(module, exports, __webpack_require__) {
797
798"use strict";
799
800
801/**
802 * Webflow: IX Event triggers for other modules
803 */
804
805var $ = window.jQuery;
806var api = {};
807var eventQueue = [];
808var namespace = '.w-ix';
809
810var eventTriggers = {
811  reset: function reset(i, el) {
812    el.__wf_intro = null;
813  },
814  intro: function intro(i, el) {
815    if (el.__wf_intro) return;
816    el.__wf_intro = true;
817    $(el).triggerHandler(api.types.INTRO);
818  },
819  outro: function outro(i, el) {
820    if (!el.__wf_intro) return;
821    el.__wf_intro = null;
822    $(el).triggerHandler(api.types.OUTRO);
823  }
824};
825
826api.triggers = {};
827
828api.types = {
829  INTRO: 'w-ix-intro' + namespace,
830  OUTRO: 'w-ix-outro' + namespace
831};
832
833// Trigger any events in queue + restore trigger methods
834api.init = function () {
835  var count = eventQueue.length;
836  for (var i = 0; i < count; i++) {
837    var memo = eventQueue[i];
838    memo[0](0, memo[1]);
839  }
840  eventQueue = [];
841  $.extend(api.triggers, eventTriggers);
842};
843
844// Replace all triggers with async wrapper to queue events until init
845api.async = function () {
846  for (var key in eventTriggers) {
847    var func = eventTriggers[key];
848    if (!eventTriggers.hasOwnProperty(key)) continue;
849
850    // Replace trigger method with async wrapper
851    api.triggers[key] = function (i, el) {
852      eventQueue.push([func, el]);
853    };
854  }
855};
856
857// Default triggers to async queue
858api.async();
859
860module.exports = api;
861
862/***/ }),
863/* 3 */
864/***/ (function(module, exports, __webpack_require__) {
865
866"use strict";
867
868
869var IXEvents = __webpack_require__(2);
870
871function dispatchCustomEvent(element, eventName) {
872  var event = document.createEvent('CustomEvent');
873  event.initCustomEvent(eventName, true, true, null);
874  element.dispatchEvent(event);
875}
876
877/**
878 * Webflow: IX Event triggers for other modules
879 */
880
881var $ = window.jQuery;
882var api = {};
883var namespace = '.w-ix';
884
885var eventTriggers = {
886  reset: function reset(i, el) {
887    IXEvents.triggers.reset(i, el);
888  },
889  intro: function intro(i, el) {
890    IXEvents.triggers.intro(i, el);
891    dispatchCustomEvent(el, 'COMPONENT_ACTIVE');
892  },
893  outro: function outro(i, el) {
894    IXEvents.triggers.outro(i, el);
895    dispatchCustomEvent(el, 'COMPONENT_INACTIVE');
896  }
897};
898
899api.triggers = {};
900
901api.types = {
902  INTRO: 'w-ix-intro' + namespace,
903  OUTRO: 'w-ix-outro' + namespace
904};
905
906$.extend(api.triggers, eventTriggers);
907
908module.exports = api;
909
910/***/ }),
911/* 4 */
912/***/ (function(module, exports, __webpack_require__) {
913
914__webpack_require__(5);
915__webpack_require__(7);
916__webpack_require__(9);
917__webpack_require__(10);
918__webpack_require__(11);
919__webpack_require__(12);
920__webpack_require__(13);
921module.exports = __webpack_require__(14);
922
923
924/***/ }),
925/* 5 */
926/***/ (function(module, exports, __webpack_require__) {
927
928/**
929 * Webflow: Brand pages on the subdomain
930 */
931
932var Webflow = __webpack_require__(0);
933
934Webflow.define('brand', module.exports = function ($) {
935  var api = {};
936  var $html = $('html');
937  var $body = $('body');
938  var namespace = '.w-webflow-badge';
939  var location = window.location;
940  var isPhantom = /PhantomJS/i.test(navigator.userAgent);
941  var brandElement;
942
943  // -----------------------------------
944  // Module methods
945
946  api.ready = function () {
947    var shouldBrand = $html.attr('data-wf-status');
948    var publishedDomain = $html.attr('data-wf-domain') || '';
949    if (/\.webflow\.io$/i.test(publishedDomain) && location.hostname !== publishedDomain) {
950      shouldBrand = true;
951    }
952    if (shouldBrand && !isPhantom) {
953      brandElement = brandElement || createBadge();
954      ensureBrand();
955      setTimeout(ensureBrand, 500);
956    }
957  };
958
959  function createBadge() {
960    var $brand = $('<a class="w-webflow-badge"></a>').attr('href', 'https://webflow.com?utm_campaign=brandjs');
961
962    var $logoArt = $('<img>').attr('src', 'https://d1otoma47x30pg.cloudfront.net/img/webflow-badge-icon.60efbf6ec9.svg').css({
963      marginRight: '8px',
964      width: '16px'
965    });
966
967    var $logoText = $('<img>').attr('src', 'https://d1otoma47x30pg.cloudfront.net/img/webflow-badge-text.6faa6a38cd.svg');
968
969    $brand.append($logoArt, $logoText);
970    return $brand[0];
971  }
972
973  function ensureBrand() {
974    var found = $body.children(namespace);
975    var match = found.length && found.get(0) === brandElement;
976    var inEditor = Webflow.env('editor');
977    if (match) {
978      // Remove brand when Editor is active
979      if (inEditor) {
980        found.remove();
981      }
982      // Exit early, brand is in place
983      return;
984    }
985    // Remove any invalid brand elements
986    if (found.length) {
987      found.remove();
988    }
989    // Append the brand (unless Editor is active)
990    if (!inEditor) {
991      $body.append(brandElement);
992    }
993  }
994
995  // Export module
996  return api;
997});
998
999/***/ }),
1000/* 6 */
1001/***/ (function(module, exports, __webpack_require__) {
1002
1003// Include tram for frame-throttling
1004var $ = window.$;
1005var tram = __webpack_require__(1) && $.tram;
1006
1007/*eslint-disable */
1008
1009/*!
1010 * Webflow._ (aka) Underscore.js 1.6.0 (custom build)
1011 * _.each
1012 * _.map
1013 * _.find
1014 * _.filter
1015 * _.any
1016 * _.contains
1017 * _.delay
1018 * _.defer
1019 * _.throttle (webflow)
1020 * _.debounce
1021 * _.keys
1022 * _.has
1023 * _.now
1024 *
1025 * http://underscorejs.org
1026 * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
1027 * Underscore may be freely distributed under the MIT license.
1028 * @license MIT
1029 */
1030module.exports = function () {
1031  var _ = {};
1032
1033  // Current version.
1034  _.VERSION = '1.6.0-Webflow';
1035
1036  // Establish the object that gets returned to break out of a loop iteration.
1037  var breaker = {};
1038
1039  // Save bytes in the minified (but not gzipped) version:
1040  var ArrayProto = Array.prototype,
1041      ObjProto = Object.prototype,
1042      FuncProto = Function.prototype;
1043
1044  // Create quick reference variables for speed access to core prototypes.
1045  var push = ArrayProto.push,
1046      slice = ArrayProto.slice,
1047      concat = ArrayProto.concat,
1048      toString = ObjProto.toString,
1049      hasOwnProperty = ObjProto.hasOwnProperty;
1050
1051  // All **ECMAScript 5** native function implementations that we hope to use
1052  // are declared here.
1053  var nativeForEach = ArrayProto.forEach,
1054      nativeMap = ArrayProto.map,
1055      nativeReduce = ArrayProto.reduce,
1056      nativeReduceRight = ArrayProto.reduceRight,
1057      nativeFilter = ArrayProto.filter,
1058      nativeEvery = ArrayProto.every,
1059      nativeSome = ArrayProto.some,
1060      nativeIndexOf = ArrayProto.indexOf,
1061      nativeLastIndexOf = ArrayProto.lastIndexOf,
1062      nativeIsArray = Array.isArray,
1063      nativeKeys = Object.keys,
1064      nativeBind = FuncProto.bind;
1065
1066  // Collection Functions
1067  // --------------------
1068
1069  // The cornerstone, an `each` implementation, aka `forEach`.
1070  // Handles objects with the built-in `forEach`, arrays, and raw objects.
1071  // Delegates to **ECMAScript 5**'s native `forEach` if available.
1072  var each = _.each = _.forEach = function (obj, iterator, context) {
1073    /* jshint shadow:true */
1074    if (obj == null) return obj;
1075    if (nativeForEach && obj.forEach === nativeForEach) {
1076      obj.forEach(iterator, context);
1077    } else if (obj.length === +obj.length) {
1078      for (var i = 0, length = obj.length; i < length; i++) {
1079        if (iterator.call(context, obj[i], i, obj) === breaker) return;
1080      }
1081    } else {
1082      var keys = _.keys(obj);
1083      for (var i = 0, length = keys.length; i < length; i++) {
1084        if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
1085      }
1086    }
1087    return obj;
1088  };
1089
1090  // Return the results of applying the iterator to each element.
1091  // Delegates to **ECMAScript 5**'s native `map` if available.
1092  _.map = _.collect = function (obj, iterator, context) {
1093    var results = [];
1094    if (obj == null) return results;
1095    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
1096    each(obj, function (value, index, list) {
1097      results.push(iterator.call(context, value, index, list));
1098    });
1099    return results;
1100  };
1101
1102  // Return the first value which passes a truth test. Aliased as `detect`.
1103  _.find = _.detect = function (obj, predicate, context) {
1104    var result;
1105    any(obj, function (value, index, list) {
1106      if (predicate.call(context, value, index, list)) {
1107        result = value;
1108        return true;
1109      }
1110    });
1111    return result;
1112  };
1113
1114  // Return all the elements that pass a truth test.
1115  // Delegates to **ECMAScript 5**'s native `filter` if available.
1116  // Aliased as `select`.
1117  _.filter = _.select = function (obj, predicate, context) {
1118    var results = [];
1119    if (obj == null) return results;
1120    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
1121    each(obj, function (value, index, list) {
1122      if (predicate.call(context, value, index, list)) results.push(value);
1123    });
1124    return results;
1125  };
1126
1127  // Determine if at least one element in the object matches a truth test.
1128  // Delegates to **ECMAScript 5**'s native `some` if available.
1129  // Aliased as `any`.
1130  var any = _.some = _.any = function (obj, predicate, context) {
1131    predicate || (predicate = _.identity);
1132    var result = false;
1133    if (obj == null) return result;
1134    if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
1135    each(obj, function (value, index, list) {
1136      if (result || (result = predicate.call(context, value, index, list))) return breaker;
1137    });
1138    return !!result;
1139  };
1140
1141  // Determine if the array or object contains a given value (using `===`).
1142  // Aliased as `include`.
1143  _.contains = _.include = function (obj, target) {
1144    if (obj == null) return false;
1145    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
1146    return any(obj, function (value) {
1147      return value === target;
1148    });
1149  };
1150
1151  // Function (ahem) Functions
1152  // --------------------
1153
1154  // Delays a function for the given number of milliseconds, and then calls
1155  // it with the arguments supplied.
1156  _.delay = function (func, wait) {
1157    var args = slice.call(arguments, 2);
1158    return setTimeout(function () {
1159      return func.apply(null, args);
1160    }, wait);
1161  };
1162
1163  // Defers a function, scheduling it to run after the current call stack has
1164  // cleared.
1165  _.defer = function (func) {
1166    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
1167  };
1168
1169  // Returns a function, that, when invoked, will only be triggered once every
1170  // browser animation frame - using tram's requestAnimationFrame polyfill.
1171  _.throttle = function (func) {
1172    var wait, args, context;
1173    return function () {
1174      if (wait) return;
1175      wait = true;
1176      args = arguments;
1177      context = this;
1178      tram.frame(function () {
1179        wait = false;
1180        func.apply(context, args);
1181      });
1182    };
1183  };
1184
1185  // Returns a function, that, as long as it continues to be invoked, will not
1186  // be triggered. The function will be called after it stops being called for
1187  // N milliseconds. If `immediate` is passed, trigger the function on the
1188  // leading edge, instead of the trailing.
1189  _.debounce = function (func, wait, immediate) {
1190    var timeout, args, context, timestamp, result;
1191
1192    var later = function later() {
1193      var last = _.now() - timestamp;
1194      if (last < wait) {
1195        timeout = setTimeout(later, wait - last);
1196      } else {
1197        timeout = null;
1198        if (!immediate) {
1199          result = func.apply(context, args);
1200          context = args = null;
1201        }
1202      }
1203    };
1204
1205    return function () {
1206      context = this;
1207      args = arguments;
1208      timestamp = _.now();
1209      var callNow = immediate && !timeout;
1210      if (!timeout) {
1211        timeout = setTimeout(later, wait);
1212      }
1213      if (callNow) {
1214        result = func.apply(context, args);
1215        context = args = null;
1216      }
1217
1218      return result;
1219    };
1220  };
1221
1222  // Object Functions
1223  // ----------------
1224
1225  // Fill in a given object with default properties.
1226  _.defaults = function (obj) {
1227    if (!_.isObject(obj)) return obj;
1228    for (var i = 1, length = arguments.length; i < length; i++) {
1229      var source = arguments[i];
1230      for (var prop in source) {
1231        if (obj[prop] === void 0) obj[prop] = source[prop];
1232      }
1233    }
1234    return obj;
1235  };
1236
1237  // Retrieve the names of an object's properties.
1238  // Delegates to **ECMAScript 5**'s native `Object.keys`
1239  _.keys = function (obj) {
1240    if (!_.isObject(obj)) return [];
1241    if (nativeKeys) return nativeKeys(obj);
1242    var keys = [];
1243    for (var key in obj) {
1244      if (_.has(obj, key)) keys.push(key);
1245    }return keys;
1246  };
1247
1248  // Shortcut function for checking if an object has a given property directly
1249  // on itself (in other words, not on a prototype).
1250  _.has = function (obj, key) {
1251    return hasOwnProperty.call(obj, key);
1252  };
1253
1254  // Is a given variable an object?
1255  _.isObject = function (obj) {
1256    return obj === Object(obj);
1257  };
1258
1259  // Utility Functions
1260  // -----------------
1261
1262  // A (possibly faster) way to get the current timestamp as an integer.
1263  _.now = Date.now || function () {
1264    return new Date().getTime();
1265  };
1266
1267  // By default, Underscore uses ERB-style template delimiters, change the
1268  // following template settings to use alternative delimiters.
1269  _.templateSettings = {
1270    evaluate: /<%([\s\S]+?)%>/g,
1271    interpolate: /<%=([\s\S]+?)%>/g,
1272    escape: /<%-([\s\S]+?)%>/g
1273  };
1274
1275  // When customizing `templateSettings`, if you don't want to define an
1276  // interpolation, evaluation or escaping regex, we need one that is
1277  // guaranteed not to match.
1278  var noMatch = /(.)^/;
1279
1280  // Certain characters need to be escaped so that they can be put into a
1281  // string literal.
1282  var escapes = {
1283    "'": "'",
1284    '\\': '\\',
1285    '\r': 'r',
1286    '\n': 'n',
1287    '\u2028': 'u2028',
1288    '\u2029': 'u2029'
1289  };
1290
1291  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
1292
1293  var escapeChar = function escapeChar(match) {
1294    return '\\' + escapes[match];
1295  };
1296
1297  // JavaScript micro-templating, similar to John Resig's implementation.
1298  // Underscore templating handles arbitrary delimiters, preserves whitespace,
1299  // and correctly escapes quotes within interpolated code.
1300  // NB: `oldSettings` only exists for backwards compatibility.
1301  _.template = function (text, settings, oldSettings) {
1302    if (!settings && oldSettings) settings = oldSettings;
1303    settings = _.defaults({}, settings, _.templateSettings);
1304
1305    // Combine delimiters into one regular expression via alternation.
1306    var matcher = RegExp([(settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source].join('|') + '|$', 'g');
1307
1308    // Compile the template source, escaping string literals appropriately.
1309    var index = 0;
1310    var source = "__p+='";
1311    text.replace(matcher, function (match, escape, interpolate, evaluate, offset) {
1312      source += text.slice(index, offset).replace(escaper, escapeChar);
1313      index = offset + match.length;
1314
1315      if (escape) {
1316        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
1317      } else if (interpolate) {
1318        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1319      } else if (evaluate) {
1320        source += "';\n" + evaluate + "\n__p+='";
1321      }
1322
1323      // Adobe VMs need the match returned to produce the correct offest.
1324      return match;
1325    });
1326    source += "';\n";
1327
1328    // If a variable is not specified, place data values in local scope.
1329    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
1330
1331    source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + source + 'return __p;\n';
1332
1333    try {
1334      var render = new Function(settings.variable || 'obj', '_', source);
1335    } catch (e) {
1336      e.source = source;
1337      throw e;
1338    }
1339
1340    var template = function template(data) {
1341      return render.call(this, data, _);
1342    };
1343
1344    // Provide the compiled source as a convenience for precompilation.
1345    var argument = settings.variable || 'obj';
1346    template.source = 'function(' + argument + '){\n' + source + '}';
1347
1348    return template;
1349  };
1350
1351  // Export underscore
1352  return _;
1353}();
1354
1355/* eslint-enable */
1356
1357/***/ }),
1358/* 7 */
1359/***/ (function(module, exports, __webpack_require__) {
1360
1361/**
1362 * Webflow: Forms
1363 */
1364
1365var Webflow = __webpack_require__(0);
1366
1367Webflow.define('forms', module.exports = function ($, _) {
1368  var api = {};
1369
1370  // Cross-Domain AJAX for IE8
1371  __webpack_require__(8);
1372
1373  var $doc = $(document);
1374  var $forms;
1375  var loc = window.location;
1376  var retro = window.XDomainRequest && !window.atob;
1377  var namespace = '.w-form';
1378  var siteId;
1379  var emailField = /e(-)?mail/i;
1380  var emailValue = /^\S+@\S+$/;
1381  var alert = window.alert;
1382  var inApp = Webflow.env();
1383  var listening;
1384
1385  // MailChimp domains: list-manage.com + mirrors
1386  var chimpRegex = /list-manage[1-9]?.com/i;
1387
1388  var disconnected = _.debounce(function () {
1389    alert('Oops! This page has improperly configured forms. Please contact your website administrator to fix this issue.');
1390  }, 100);
1391
1392  api.ready = api.design = api.preview = function () {
1393    // Init forms
1394    init();
1395
1396    // Wire document events on published site only once
1397    if (!inApp && !listening) {
1398      addListeners();
1399    }
1400  };
1401
1402  function init() {
1403    siteId = $('html').attr('data-wf-site');
1404
1405    $forms = $(namespace + ' form');
1406    if (!$forms.length) return;
1407    $forms.each(build);
1408  }
1409
1410  function build(i, el) {
1411    // Store form state using namespace
1412    var $el = $(el);
1413    var data = $.data(el, namespace);
1414    if (!data) data = $.data(el, namespace, { form: $el }); // data.form
1415
1416    reset(data);
1417    var wrap = $el.closest('div.w-form');
1418    data.done = wrap.find('> .w-form-done');
1419    data.fail = wrap.find('> .w-form-fail');
1420
1421    var action = data.action = $el.attr('action');
1422    data.handler = null;
1423    data.redirect = $el.attr('data-redirect');
1424
1425    // MailChimp form
1426    if (chimpRegex.test(action)) {
1427      data.handler = submitMailChimp;return;
1428    }
1429
1430    // Custom form action
1431    if (action) return;
1432
1433    // Webflow form
1434    if (siteId) {
1435      data.handler = submitWebflow;return;
1436    }
1437
1438    // Alert for disconnected Webflow forms
1439    disconnected();
1440  }
1441
1442  function addListeners() {
1443    listening = true;
1444
1445    // Handle form submission for Webflow forms
1446    $doc.on('submit', namespace + ' form', function (evt) {
1447      var data = $.data(this, namespace);
1448      if (data.handler) {
1449        data.evt = evt;
1450        data.handler(data);
1451      }
1452    });
1453  }
1454
1455  // Reset data common to all submit handlers
1456  function reset(data) {
1457    var btn = data.btn = data.form.find(':input[type="submit"]');
1458    data.wait = data.btn.attr('data-wait') || null;
1459    data.success = false;
1460    btn.prop('disabled', false);
1461    data.label && btn.val(data.label);
1462  }
1463
1464  // Disable submit button
1465  function disableBtn(data) {
1466    var btn = data.btn;
1467    var wait = data.wait;
1468    btn.prop('disabled', true);
1469    // Show wait text and store previous label
1470    if (wait) {
1471      data.label = btn.val();
1472      btn.val(wait);
1473    }
1474  }
1475
1476  // Find form fields, validate, and set value pairs
1477  function findFields(form, result) {
1478    var status = null;
1479    result = result || {};
1480
1481    // The ":input" selector is a jQuery shortcut to select all inputs, selects, textareas
1482    form.find(':input:not([type="submit"])').each(function (i, el) {
1483      var field = $(el);
1484      var type = field.attr('type');
1485      var name = field.attr('data-name') || field.attr('name') || 'Field ' + (i + 1);
1486      var value = field.val();
1487
1488      if (type === 'checkbox') {
1489        value = field.is(':checked');
1490      }if (type === 'radio') {
1491        // Radio group value already processed
1492        if (result[name] === null || typeof result[name] === 'string') {
1493          return;
1494        }
1495
1496        value = form.find('input[name="' + field.attr('name') + '"]:checked').val() || null;
1497      }
1498
1499      if (typeof value === 'string') value = $.trim(value);
1500      result[name] = value;
1501      status = status || getStatus(field, type, name, value);
1502    });
1503
1504    return status;
1505  }
1506
1507  function getStatus(field, type, name, value) {
1508    var status = null;
1509
1510    if (type === 'password') {
1511      status = 'Passwords cannot be submitted.';
1512    } else if (field.attr('required')) {
1513      if (!value) {
1514        status = 'Please fill out the required field: ' + name;
1515      } else if (emailField.test(name) || emailField.test(field.attr('type'))) {
1516        if (!emailValue.test(value)) status = 'Please enter a valid email address for: ' + name;
1517      }
1518    }
1519
1520    return status;
1521  }
1522
1523  // Submit form to Webflow
1524  function submitWebflow(data) {
1525    reset(data);
1526
1527    var form = data.form;
1528    var payload = {
1529      name: form.attr('data-name') || form.attr('name') || 'Untitled Form',
1530      source: loc.href,
1531      test: Webflow.env(),
1532      fields: {},
1533      dolphin: /pass[\s-_]?(word|code)|secret|login|credentials/i.test(form.html())
1534    };
1535
1536    preventDefault(data);
1537
1538    // Find & populate all fields
1539    var status = findFields(form, payload.fields);
1540    if (status) return alert(status);
1541
1542    // Disable submit button
1543    disableBtn(data);
1544
1545    // Read site ID
1546    // NOTE: If this site is exported, the HTML tag must retain the data-wf-site attribute for forms to work
1547    if (!siteId) {
1548      afterSubmit(data);return;
1549    }
1550    var url = "https://webflow.com" + '/api/v1/form/' + siteId;
1551
1552    // Work around same-protocol IE XDR limitation - without this IE9 and below forms won't submit
1553    if (retro && url.indexOf("https://webflow.com") >= 0) {
1554      url = url.replace("https://webflow.com", "http://formdata.webflow.com");
1555    }
1556
1557    $.ajax({
1558      url: url,
1559      type: 'POST',
1560      data: payload,
1561      dataType: 'json',
1562      crossDomain: true
1563    }).done(function () {
1564      data.success = true;
1565      afterSubmit(data);
1566    }).fail(function () {
1567      afterSubmit(data);
1568    });
1569  }
1570
1571  // Submit form to MailChimp
1572  function submitMailChimp(data) {
1573    reset(data);
1574
1575    var form = data.form;
1576    var payload = {};
1577
1578    // Skip Ajax submission if http/s mismatch, fallback to POST instead
1579    if (/^https/.test(loc.href) && !/^https/.test(data.action)) {
1580      form.attr('method', 'post');
1581      return;
1582    }
1583
1584    preventDefault(data);
1585
1586    // Find & populate all fields
1587    var status = findFields(form, payload);
1588    if (status) return alert(status);
1589
1590    // Disable submit button
1591    disableBtn(data);
1592
1593    // Use special format for MailChimp params
1594    var fullName;
1595    _.each(payload, function (value, key) {
1596      if (emailField.test(key)) payload.EMAIL = value;
1597      if (/^((full[ _-]?)?name)$/i.test(key)) fullName = value;
1598      if (/^(first[ _-]?name)$/i.test(key)) payload.FNAME = value;
1599      if (/^(last[ _-]?name)$/i.test(key)) payload.LNAME = value;
1600    });
1601
1602    if (fullName && !payload.FNAME) {
1603      fullName = fullName.split(' ');
1604      payload.FNAME = fullName[0];
1605      payload.LNAME = payload.LNAME || fullName[1];
1606    }
1607
1608    // Use the (undocumented) MailChimp jsonp api
1609    var url = data.action.replace('/post?', '/post-json?') + '&c=?';
1610    // Add special param to prevent bot signups
1611    var userId = url.indexOf('u=') + 2;
1612    userId = url.substring(userId, url.indexOf('&', userId));
1613    var listId = url.indexOf('id=') + 3;
1614    listId = url.substring(listId, url.indexOf('&', listId));
1615    payload['b_' + userId + '_' + listId] = '';
1616
1617    $.ajax({
1618      url: url,
1619      data: payload,
1620      dataType: 'jsonp'
1621    }).done(function (resp) {
1622      data.success = resp.result === 'success' || /already/.test(resp.msg);
1623      if (!data.success) console.info('MailChimp error: ' + resp.msg);
1624      afterSubmit(data);
1625    }).fail(function () {
1626      afterSubmit(data);
1627    });
1628  }
1629
1630  // Common callback which runs after all Ajax submissions
1631  function afterSubmit(data) {
1632    var form = data.form;
1633    var redirect = data.redirect;
1634    var success = data.success;
1635
1636    // Redirect to a success url if defined
1637    if (success && redirect) {
1638      Webflow.location(redirect);
1639      return;
1640    }
1641
1642    // Show or hide status divs
1643    data.done.toggle(success);
1644    data.fail.toggle(!success);
1645
1646    // Hide form on success
1647    form.toggle(!success);
1648
1649    // Reset data and enable submit button
1650    reset(data);
1651  }
1652
1653  function preventDefault(data) {
1654    data.evt && data.evt.preventDefault();
1655    data.evt = null;
1656  }
1657
1658  // Export module
1659  return api;
1660});
1661
1662/***/ }),
1663/* 8 */
1664/***/ (function(module, exports) {
1665
1666/*!
1667 * jQuery-ajaxTransport-XDomainRequest - v1.0.3
1668 * 2014-12-16 WEBFLOW - Removed UMD wrapper
1669 * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
1670 * Copyright (c) 2014 Jason Moon (@JSONMOON)
1671 * @license MIT (/blob/master/LICENSE.txt)
1672 */
1673module.exports = function ($) {
1674  if ($.support.cors || !$.ajaxTransport || !window.XDomainRequest) {
1675    return;
1676  }var httpRegEx = /^https?:\/\//i;var getOrPostRegEx = /^get|post$/i;var sameSchemeRegEx = new RegExp("^" + location.protocol, "i");$.ajaxTransport("* text html xml json", function (options, userOptions, jqXHR) {
1677    if (!options.crossDomain || !options.async || !getOrPostRegEx.test(options.type) || !httpRegEx.test(options.url) || !sameSchemeRegEx.test(options.url)) {
1678      return;
1679    }var xdr = null;return { send: function send(headers, complete) {
1680        var postData = "";var userType = (userOptions.dataType || "").toLowerCase();xdr = new XDomainRequest();if (/^\d+$/.test(userOptions.timeout)) {
1681          xdr.timeout = userOptions.timeout;
1682        }xdr.ontimeout = function () {
1683          complete(500, "timeout");
1684        };xdr.onload = function () {
1685          var allResponseHeaders = "Content-Length: " + xdr.responseText.length + "\r\nContent-Type: " + xdr.contentType;var status = { code: 200, message: "success" };var responses = { text: xdr.responseText };try {
1686            if (userType === "html" || /text\/html/i.test(xdr.contentType)) {
1687              responses.html = xdr.responseText;
1688            } else if (userType === "json" || userType !== "text" && /\/json/i.test(xdr.contentType)) {
1689              try {
1690                responses.json = JSON.parse(xdr.responseText);
1691              } catch (e) {
1692                status.code = 500;status.message = "parseerror";
1693              }
1694            } else if (userType === "xml" || userType !== "text" && /\/xml/i.test(xdr.contentType)) {
1695              var doc = new ActiveXObject("Microsoft.XMLDOM");doc.async = false;try {
1696                doc.loadXML(xdr.responseText);
1697              } catch (e) {
1698                doc = undefined;
1699              }if (!doc || !doc.documentElement || doc.getElementsByTagName("parsererror").length) {
1700                status.code = 500;status.message = "parseerror";throw "Invalid XML: " + xdr.responseText;
1701              }responses.xml = doc;
1702            }
1703          } catch (parseMessage) {
1704            throw parseMessage;
1705          } finally {
1706            complete(status.code, status.message, responses, allResponseHeaders);
1707          }
1708        };xdr.onprogress = function () {};xdr.onerror = function () {
1709          complete(500, "error", { text: xdr.responseText });
1710        };if (userOptions.data) {
1711          postData = $.type(userOptions.data) === "string" ? userOptions.data : $.param(userOptions.data);
1712        }xdr.open(options.type, options.url);xdr.send(postData);
1713      }, abort: function abort() {
1714        if (xdr) {
1715          xdr.abort();
1716        }
1717      } };
1718  });
1719}(window.jQuery);
1720
1721/***/ }),
1722/* 9 */
1723/***/ (function(module, exports, __webpack_require__) {
1724
1725/**
1726 * Webflow: Interactions
1727 */
1728
1729var Webflow = __webpack_require__(0);
1730var IXEvents = __webpack_require__(2);
1731
1732Webflow.define('ix', module.exports = function ($, _) {
1733  var api = {};
1734  var designer;
1735  var $win = $(window);
1736  var namespace = '.w-ix';
1737  var tram = $.tram;
1738  var env = Webflow.env;
1739  var inApp = env();
1740  var emptyFix = env.chrome && env.chrome < 35;
1741  var transNone = 'none 0s ease 0s';
1742  var $subs = $();
1743  var config = {};
1744  var anchors = [];
1745  var loads = [];
1746  var readys = [];
1747  var destroyed;
1748  var readyDelay = 1;
1749
1750  // Component types and proxy selectors
1751  var components = {
1752    tabs: '.w-tab-link, .w-tab-pane',
1753    dropdown: '.w-dropdown',
1754    slider: '.w-slide',
1755    navbar: '.w-nav'
1756  };
1757
1758  // -----------------------------------
1759  // Module methods
1760
1761  api.init = function (list) {
1762    setTimeout(function () {
1763      configure(list);
1764    }, 1);
1765  };
1766
1767  api.preview = function () {
1768    designer = false;
1769    readyDelay = 100;
1770    setTimeout(function () {
1771      configure(window.__wf_ix);
1772    }, 1);
1773  };
1774
1775  api.design = function () {
1776    designer = true;
1777    api.destroy();
1778  };
1779
1780  api.destroy = function () {
1781    destroyed = true;
1782    $subs.each(teardown);
1783    Webflow.scroll.off(scroll);
1784    IXEvents.async();
1785    anchors = [];
1786    loads = [];
1787    readys = [];
1788  };
1789
1790  api.ready = function () {
1791    // Redirect IX init while in design/preview modes
1792    if (inApp) return env('design') ? api.design() : api.preview();
1793
1794    // Ready should only be used after destroy, as a way to re-init
1795    if (config && destroyed) {
1796      destroyed = false;
1797      init();
1798    }
1799  };
1800
1801  api.run = run;
1802  api.style = inApp ? styleApp : stylePub;
1803
1804  // -----------------------------------
1805  // Private methods
1806
1807  function configure(list) {
1808    if (!list) return;
1809
1810    // Map all interactions by slug
1811    config = {};
1812    _.each(list, function (item) {
1813      config[item.slug] = item.value;
1814    });
1815
1816    // Init ix after config
1817    init();
1818  }
1819
1820  function init() {
1821
1822    initIX1Engine();
1823
1824    // Need init IXEvents regardless if IX1 events exist since
1825    // IXEvents _also_ dispatch IX2 events.
1826
1827    // Trigger queued events, must happen after init
1828    IXEvents.init();
1829
1830    // Trigger a redraw to ensure all IX intros play
1831    Webflow.redraw.up();
1832  }
1833
1834  function initIX1Engine() {
1835    // Build each element's interaction keying from data attribute
1836    var els = $('[data-ix]');
1837    if (!els.length) {
1838      return;
1839    }
1840
1841    els.each(teardown);
1842    els.each(build);
1843
1844    // Listen for scroll events if any anchors exist
1845    if (anchors.length) {
1846      Webflow.scroll.on(scroll);
1847      setTimeout(scroll, 1);
1848    }
1849
1850    // Handle loads or readys if they exist
1851    if (loads.length) Webflow.load(runLoads);
1852    if (readys.length) setTimeout(runReadys, readyDelay);
1853  }
1854
1855  function build(i, el) {
1856    var $el = $(el);
1857    var id = $el.attr('data-ix');
1858    var ix = config[id];
1859    if (!ix) return;
1860    var triggers = ix.triggers;
1861    if (!triggers) return;
1862
1863    // Set styles immediately to provide tram with starting transform values
1864    api.style($el, ix.style);
1865
1866    _.each(triggers, function (trigger) {
1867      var state = {};
1868      var type = trigger.type;
1869      var stepsB = trigger.stepsB && trigger.stepsB.length;
1870
1871      function runA() {
1872        run(trigger, $el, { group: 'A' });
1873      }
1874      function runB() {
1875        run(trigger, $el, { group: 'B' });
1876      }
1877
1878      if (type === 'load') {
1879        trigger.preload && !inApp ? loads.push(runA) : readys.push(runA);
1880        return;
1881      }
1882
1883      if (type === 'click') {
1884        $el.on('click' + namespace, function (evt) {
1885          // Avoid late clicks on touch devices
1886          if (!Webflow.validClick(evt.currentTarget)) return;
1887
1888          // Prevent default on empty hash urls
1889          if ($el.attr('href') === '#') evt.preventDefault();
1890
1891          run(trigger, $el, { group: state.clicked ? 'B' : 'A' });
1892          if (stepsB) state.clicked = !state.clicked;
1893        });
1894        $subs = $subs.add($el);
1895        return;
1896      }
1897
1898      if (type === 'hover') {
1899        $el.on('mouseenter' + namespace, runA);
1900        $el.on('mouseleave' + namespace, runB);
1901        $subs = $subs.add($el);
1902        return;
1903      }
1904
1905      if (type === 'scroll') {
1906        anchors.push({
1907          el: $el, trigger: trigger, state: { active: false },
1908          offsetTop: convert(trigger.offsetTop),
1909          offsetBot: convert(trigger.offsetBot)
1910        });
1911        return;
1912      }
1913
1914      // Check for a proxy component selector
1915      // type == [tabs, dropdown, slider, navbar]
1916      var proxy = components[type];
1917      if (proxy) {
1918        var $proxy = $el.closest(proxy);
1919        $proxy.on(IXEvents.types.INTRO, runA).on(IXEvents.types.OUTRO, runB);
1920        $subs = $subs.add($proxy);
1921        return;
1922      }
1923    });
1924  }
1925
1926  function convert(offset) {
1927    if (!offset) return 0;
1928    offset = String(offset);
1929    var result = parseInt(offset, 10);
1930    if (result !== result) return 0;
1931    if (offset.indexOf('%') > 0) {
1932      result /= 100;
1933      if (result >= 1) result = 0.999;
1934    }
1935    return result;
1936  }
1937
1938  function teardown(i, el) {
1939    $(el).off(namespace);
1940  }
1941
1942  function scroll() {
1943    var viewTop = $win.scrollTop();
1944    var viewHeight = $win.height();
1945
1946    // Check each anchor for a valid scroll trigger
1947    var count = anchors.length;
1948    for (var i = 0; i < count; i++) {
1949      var anchor = anchors[i];
1950      var $el = anchor.el;
1951      var trigger = anchor.trigger;
1952      var stepsB = trigger.stepsB && trigger.stepsB.length;
1953      var state = anchor.state;
1954      var top = $el.offset().top;
1955      var height = $el.outerHeight();
1956      var offsetTop = anchor.offsetTop;
1957      var offsetBot = anchor.offsetBot;
1958      if (offsetTop < 1 && offsetTop > 0) offsetTop *= viewHeight;
1959      if (offsetBot < 1 && offsetBot > 0) offsetBot *= viewHeight;
1960      var active = top + height - offsetTop >= viewTop && top + offsetBot <= viewTop + viewHeight;
1961      if (active === state.active) continue;
1962      if (active === false && !stepsB) continue;
1963      state.active = active;
1964      run(trigger, $el, { group: active ? 'A' : 'B' });
1965    }
1966  }
1967
1968  function runLoads() {
1969    var count = loads.length;
1970    for (var i = 0; i < count; i++) {
1971      loads[i]();
1972    }
1973  }
1974
1975  function runReadys() {
1976    var count = readys.length;
1977    for (var i = 0; i < count; i++) {
1978      readys[i]();
1979    }
1980  }
1981
1982  function run(trigger, $el, opts, replay) {
1983    opts = opts || {};
1984    var done = opts.done;
1985    var preserve3d = trigger.preserve3d;
1986
1987    // Do not run in designer unless forced
1988    if (designer && !opts.force) return;
1989
1990    // Operate on a set of grouped steps
1991    var group = opts.group || 'A';
1992    var loop = trigger['loop' + group];
1993    var steps = trigger['steps' + group];
1994    if (!steps || !steps.length) return;
1995    if (steps.length < 2) loop = false;
1996
1997    // One-time init before any loops
1998    if (!replay) {
1999
2000      // Find selector within element descendants, siblings, or query whole document
2001      var selector = trigger.selector;
2002      if (selector) {
2003        if (trigger.descend) {
2004          $el = $el.find(selector);
2005        } else if (trigger.siblings) {
2006          $el = $el.siblings(selector);
2007        } else {
2008          $el = $(selector);
2009        }
2010        if (inApp) $el.attr('data-ix-affect', 1);
2011      }
2012
2013      // Apply empty fix for certain Chrome versions
2014      if (emptyFix) $el.addClass('w-ix-emptyfix');
2015
2016      // Set preserve3d for triggers with 3d transforms
2017      if (preserve3d) $el.css('transform-style', 'preserve-3d');
2018    }
2019
2020    var _tram = tram($el);
2021
2022    // Add steps
2023    var meta = { omit3d: !preserve3d };
2024    for (var i = 0; i < steps.length; i++) {
2025      addStep(_tram, steps[i], meta);
2026    }
2027
2028    function fin() {
2029      // Run trigger again if looped
2030      if (loop) return run(trigger, $el, opts, true);
2031
2032      // Reset any 'auto' values
2033      if (meta.width === 'auto') _tram.set({ width: 'auto' });
2034      if (meta.height === 'auto') _tram.set({ height: 'auto' });
2035
2036      // Run callback
2037      done && done();
2038    }
2039
2040    // Add final step to queue if tram has started
2041    meta.start ? _tram.then(fin) : fin();
2042  }
2043
2044  function addStep(_tram, step, meta) {
2045    var addMethod = 'add';
2046    var startMethod = 'start';
2047
2048    // Once the transition has started, we will always use then() to add to the queue.
2049    if (meta.start) addMethod = startMethod = 'then';
2050
2051    // Parse transitions string on the current step
2052    var transitions = step.transition;
2053    if (transitions) {
2054      transitions = transitions.split(',');
2055      for (var i = 0; i < transitions.length; i++) {
2056        var transition = transitions[i];
2057        _tram[addMethod](transition);
2058      }
2059    }
2060
2061    // Build a clean object to pass to the tram method
2062    var clean = tramify(step, meta) || {};
2063
2064    // Store last width and height values
2065    if (clean.width != null) meta.width = clean.width;
2066    if (clean.height != null) meta.height = clean.height;
2067
2068    // When transitions are not present, set values immediately and continue queue.
2069    if (transitions == null) {
2070
2071      // If we have started, wrap set() in then() and reset queue
2072      if (meta.start) {
2073        _tram.then(function () {
2074          var queue = this.queue;
2075          this.set(clean);
2076          if (clean.display) {
2077            _tram.redraw();
2078            Webflow.redraw.up();
2079          }
2080          this.queue = queue;
2081          this.next();
2082        });
2083      } else {
2084        _tram.set(clean);
2085
2086        // Always redraw after setting display
2087        if (clean.display) {
2088          _tram.redraw();
2089          Webflow.redraw.up();
2090        }
2091      }
2092
2093      // Use the wait() method to kick off queue in absence of transitions.
2094      var wait = clean.wait;
2095      if (wait != null) {
2096        _tram.wait(wait);
2097        meta.start = true;
2098      }
2099
2100      // Otherwise, when transitions are present
2101    } else {
2102
2103      // If display is present, handle it separately
2104      if (clean.display) {
2105        var display = clean.display;
2106        delete clean.display;
2107
2108        // If we've already started, we need to wrap it in a then()
2109        if (meta.start) {
2110          _tram.then(function () {
2111            var queue = this.queue;
2112            this.set({ display: display }).redraw();
2113            Webflow.redraw.up();
2114            this.queue = queue;
2115            this.next();
2116          });
2117        } else {
2118          _tram.set({ display: display }).redraw();
2119          Webflow.redraw.up();
2120        }
2121      }
2122
2123      // Otherwise, start a transition using the current start method.
2124      _tram[startMethod](clean);
2125      meta.start = true;
2126    }
2127  }
2128
2129  // (In app) Set styles immediately and manage upstream transition
2130  function styleApp(el, data) {
2131    var _tram = tram(el);
2132
2133    // Exit early when data is empty to avoid clearing upstream
2134    if ($.isEmptyObject(data)) return;
2135
2136    // Get computed transition value
2137    el.css('transition', '');
2138    var computed = el.css('transition');
2139
2140    // If computed is set to none, clear upstream
2141    if (computed === transNone) computed = _tram.upstream = null;
2142
2143    // Set upstream transition to none temporarily
2144    _tram.upstream = transNone;
2145
2146    // Set values immediately
2147    _tram.set(tramify(data));
2148
2149    // Only restore upstream in preview mode
2150    _tram.upstream = computed;
2151  }
2152
2153  // (Published) Set styles immediately on specified jquery element
2154  function stylePub(el, data) {
2155    tram(el).set(tramify(data));
2156  }
2157
2158  // Build a clean object for tram
2159  function tramify(obj, meta) {
2160    var omit3d = meta && meta.omit3d;
2161    var result = {};
2162    var found = false;
2163    for (var key in obj) {
2164      if (key === 'transition') continue;
2165      if (key === 'keysort') continue;
2166      if (omit3d) {
2167        if (key === 'z' || key === 'rotateX' || key === 'rotateY' || key === 'scaleZ') {
2168          continue;
2169        }
2170      }
2171      result[key] = obj[key];
2172      found = true;
2173    }
2174    // If empty, return null for tram.set/stop compliance
2175    return found ? result : null;
2176  }
2177
2178  // Export module
2179  return api;
2180});
2181
2182/***/ }),
2183/* 10 */
2184/***/ (function(module, exports, __webpack_require__) {
2185
2186/**
2187 * Webflow: Auto-select links to current page or section
2188 */
2189
2190var Webflow = __webpack_require__(0);
2191
2192Webflow.define('links', module.exports = function ($, _) {
2193  var api = {};
2194  var $win = $(window);
2195  var designer;
2196  var inApp = Webflow.env();
2197  var location = window.location;
2198  var tempLink = document.createElement('a');
2199  var linkCurrent = 'w--current';
2200  var validHash = /^#[\w:.-]+$/;
2201  var indexPage = /index\.(html|php)$/;
2202  var dirList = /\/$/;
2203  var anchors;
2204  var slug;
2205
2206  // -----------------------------------
2207  // Module methods
2208
2209  api.ready = api.design = api.preview = init;
2210
2211  // -----------------------------------
2212  // Private methods
2213
2214  function init() {
2215    designer = inApp && Webflow.env('design');
2216    slug = Webflow.env('slug') || location.pathname || '';
2217
2218    // Reset scroll listener, init anchors
2219    Webflow.scroll.off(scroll);
2220    anchors = [];
2221
2222    // Test all links for a selectable href
2223    var links = document.links;
2224    for (var i = 0; i < links.length; ++i) {
2225      select(links[i]);
2226    }
2227
2228    // Listen for scroll if any anchors exist
2229    if (anchors.length) {
2230      Webflow.scroll.on(scroll);
2231      scroll();
2232    }
2233  }
2234
2235  function select(link) {
2236    var href = designer && link.getAttribute('href-disabled') || link.getAttribute('href');
2237    tempLink.href = href;
2238
2239    // Ignore any hrefs with a colon to safely avoid all uri schemes
2240    if (href.indexOf(':') >= 0) return;
2241
2242    var $link = $(link);
2243
2244    // Check for valid hash links w/ sections and use scroll anchor
2245    if (href.indexOf('#') === 0 && validHash.test(href)) {
2246      var $section = $(href);
2247      $section.length && anchors.push({ link: $link, sec: $section, active: false });
2248      return;
2249    }
2250
2251    // Ignore empty # links
2252    if (href === '#') return;
2253
2254    // Determine whether the link should be selected
2255    var match = tempLink.href === location.href || href === slug || indexPage.test(href) && dirList.test(slug);
2256    setClass($link, linkCurrent, match);
2257  }
2258
2259  function scroll() {
2260    var viewTop = $win.scrollTop();
2261    var viewHeight = $win.height();
2262
2263    // Check each anchor for a section in view
2264    _.each(anchors, function (anchor) {
2265      var $link = anchor.link;
2266      var $section = anchor.sec;
2267      var top = $section.offset().top;
2268      var height = $section.outerHeight();
2269      var offset = viewHeight * 0.5;
2270      var active = $section.is(':visible') && top + height - offset >= viewTop && top + offset <= viewTop + viewHeight;
2271      if (anchor.active === active) return;
2272      anchor.active = active;
2273      setClass($link, linkCurrent, active);
2274    });
2275  }
2276
2277  function setClass($elem, className, add) {
2278    var exists = $elem.hasClass(className);
2279    if (add && exists) return;
2280    if (!add && !exists) return;
2281    add ? $elem.addClass(className) : $elem.removeClass(className);
2282  }
2283
2284  // Export module
2285  return api;
2286});
2287
2288/***/ }),
2289/* 11 */
2290/***/ (function(module, exports, __webpack_require__) {
2291
2292/**
2293 * Webflow: Navbar component
2294 */
2295
2296var Webflow = __webpack_require__(0);
2297var IXEvents = __webpack_require__(3);
2298
2299Webflow.define('navbar', module.exports = function ($, _) {
2300  var api = {};
2301  var tram = $.tram;
2302  var $win = $(window);
2303  var $doc = $(document);
2304  var $body;
2305  var $navbars;
2306  var designer;
2307  var inApp = Webflow.env();
2308  var overlay = '<div class="w-nav-overlay" data-wf-ignore />';
2309  var namespace = '.w-nav';
2310  var buttonOpen = 'w--open';
2311  var menuOpen = 'w--nav-menu-open';
2312  var linkOpen = 'w--nav-link-open';
2313  var ix = IXEvents.triggers;
2314  var menuSibling = $();
2315
2316  // -----------------------------------
2317  // Module methods
2318
2319  api.ready = api.design = api.preview = init;
2320
2321  api.destroy = function () {
2322    menuSibling = $();
2323    removeListeners();
2324    if ($navbars && $navbars.length) {
2325      $navbars.each(teardown);
2326    }
2327  };
2328
2329  // -----------------------------------
2330  // Private methods
2331
2332  function init() {
2333    designer = inApp && Webflow.env('design');
2334    $body = $(document.body);
2335
2336    // Find all instances on the page
2337    $navbars = $doc.find(namespace);
2338    if (!$navbars.length) return;
2339    $navbars.each(build);
2340
2341    // Wire events
2342    removeListeners();
2343    addListeners();
2344  }
2345
2346  function removeListeners() {
2347    Webflow.resize.off(resizeAll);
2348  }
2349
2350  function addListeners() {
2351    Webflow.resize.on(resizeAll);
2352  }
2353
2354  function resizeAll() {
2355    $navbars.each(resize);
2356  }
2357
2358  function build(i, el) {
2359    var $el = $(el);
2360
2361    // Store state in data
2362    var data = $.data(el, namespace);
2363    if (!data) data = $.data(el, namespace, { open: false, el: $el, config: {} });
2364    data.menu = $el.find('.w-nav-menu');
2365    data.links = data.menu.find('.w-nav-link');
2366    data.dropdowns = data.menu.find('.w-dropdown');
2367    data.button = $el.find('.w-nav-button');
2368    data.container = $el.find('.w-container');
2369    data.outside = outside(data);
2370
2371    // Remove old events
2372    data.el.off(namespace);
2373    data.button.off(namespace);
2374    data.menu.off(namespace);
2375
2376    // Set config from data attributes
2377    configure(data);
2378
2379    // Add events based on mode
2380    if (designer) {
2381      removeOverlay(data);
2382      data.el.on('setting' + namespace, handler(data));
2383    } else {
2384      addOverlay(data);
2385      data.button.on('tap' + namespace, toggle(data));
2386      data.menu.on('click' + namespace, 'a', navigate(data));
2387    }
2388
2389    // Trigger initial resize
2390    resize(i, el);
2391  }
2392
2393  function teardown(i, el) {
2394    var data = $.data(el, namespace);
2395    if (data) {
2396      removeOverlay(data);
2397      $.removeData(el, namespace);
2398    }
2399  }
2400
2401  function removeOverlay(data) {
2402    if (!data.overlay) return;
2403    close(data, true);
2404    data.overlay.remove();
2405    data.overlay = null;
2406  }
2407
2408  function addOverlay(data) {
2409    if (data.overlay) return;
2410    data.overlay = $(overlay).appendTo(data.el);
2411    data.parent = data.menu.parent();
2412    close(data, true);
2413  }
2414
2415  function configure(data) {
2416    var config = {};
2417    var old = data.config || {};
2418
2419    // Set config options from data attributes
2420    var animation = config.animation = data.el.attr('data-animation') || 'default';
2421    config.animOver = /^over/.test(animation);
2422    config.animDirect = /left$/.test(animation) ? -1 : 1;
2423
2424    // Re-open menu if the animation type changed
2425    if (old.animation !== animation) {
2426      data.open && _.defer(reopen, data);
2427    }
2428
2429    config.easing = data.el.attr('data-easing') || 'ease';
2430    config.easing2 = data.el.attr('data-easing2') || 'ease';
2431
2432    var duration = data.el.attr('data-duration');
2433    config.duration = duration != null ? Number(duration) : 400;
2434
2435    config.docHeight = data.el.attr('data-doc-height');
2436
2437    // Store config in data
2438    data.config = config;
2439  }
2440
2441  function handler(data) {
2442    return function (evt, options) {
2443      options = options || {};
2444      var winWidth = $win.width();
2445      configure(data);
2446      options.open === true && open(data, true);
2447      options.open === false && close(data, true);
2448      // Reopen if media query changed after setting
2449      data.open && _.defer(function () {
2450        if (winWidth !== $win.width()) reopen(data);
2451      });
2452    };
2453  }
2454
2455  function reopen(data) {
2456    if (!data.open) return;
2457    close(data, true);
2458    open(data, true);
2459  }
2460
2461  function toggle(data) {
2462    // Debounce toggle to wait for accurate open state
2463    return _.debounce(function () {
2464      data.open ? close(data) : open(data);
2465    });
2466  }
2467
2468  function navigate(data) {
2469    return function (evt) {
2470      var link = $(this);
2471      var href = link.attr('href');
2472
2473      // Avoid late clicks on touch devices
2474      if (!Webflow.validClick(evt.currentTarget)) {
2475        evt.preventDefault();
2476        return;
2477      }
2478
2479      // Close when navigating to an in-page anchor
2480      if (href && href.indexOf('#') === 0 && data.open) {
2481        close(data);
2482      }
2483    };
2484  }
2485
2486  function outside(data) {
2487    // Unbind previous tap handler if it exists
2488    if (data.outside) $doc.off('tap' + namespace, data.outside);
2489
2490    // Close menu when tapped outside, debounced to wait for state
2491    return _.debounce(function (evt) {
2492      if (!data.open) return;
2493      var menu = $(evt.target).closest('.w-nav-menu');
2494      if (!data.menu.is(menu)) {
2495        close(data);
2496      }
2497    });
2498  }
2499
2500  function resize(i, el) {
2501    var data = $.data(el, namespace);
2502    // Check for collapsed state based on button display
2503    var collapsed = data.collapsed = data.button.css('display') !== 'none';
2504    // Close menu if button is no longer visible (and not in designer)
2505    if (data.open && !collapsed && !designer) close(data, true);
2506    // Set max-width of links + dropdowns to match container
2507    if (data.container.length) {
2508      var updateEachMax = updateMax(data);
2509      data.links.each(updateEachMax);
2510      data.dropdowns.each(updateEachMax);
2511    }
2512    // If currently open, update height to match body
2513    if (data.open) {
2514      setOverlayHeight(data);
2515    }
2516  }
2517
2518  var maxWidth = 'max-width';
2519  function updateMax(data) {
2520    // Set max-width of each element to match container
2521    var containMax = data.container.css(maxWidth);
2522    if (containMax === 'none') containMax = '';
2523    return function (i, link) {
2524      link = $(link);
2525      link.css(maxWidth, '');
2526      // Don't set the max-width if an upstream value exists
2527      if (link.css(maxWidth) === 'none') link.css(maxWidth, containMax);
2528    };
2529  }
2530
2531  function open(data, immediate) {
2532    if (data.open) return;
2533    data.open = true;
2534    data.menu.addClass(menuOpen);
2535    data.links.addClass(linkOpen);
2536    data.button.addClass(buttonOpen);
2537    var config = data.config;
2538    var animation = config.animation;
2539    if (animation === 'none' || !tram.support.transform) immediate = true;
2540    var bodyHeight = setOverlayHeight(data);
2541    var menuHeight = data.menu.outerHeight(true);
2542    var menuWidth = data.menu.outerWidth(true);
2543    var navHeight = data.el.height();
2544    var navbarEl = data.el[0];
2545    resize(0, navbarEl);
2546    ix.intro(0, navbarEl);
2547    Webflow.redraw.up();
2548
2549    // Listen for tap outside events
2550    if (!designer) $doc.on('tap' + namespace, data.outside);
2551
2552    // No transition for immediate
2553    if (immediate) return;
2554
2555    var transConfig = 'transform ' + config.duration + 'ms ' + config.easing;
2556
2557    // Add menu to overlay
2558    if (data.overlay) {
2559      menuSibling = data.menu.prev();
2560      data.overlay.show().append(data.menu);
2561    }
2562
2563    // Over left/right
2564    if (config.animOver) {
2565      tram(data.menu).add(transConfig).set({ x: config.animDirect * menuWidth, height: bodyHeight }).start({ x: 0 });
2566      data.overlay && data.overlay.width(menuWidth);
2567      return;
2568    }
2569
2570    // Drop Down
2571    var offsetY = navHeight + menuHeight;
2572    tram(data.menu).add(transConfig).set({ y: -offsetY }).start({ y: 0 });
2573  }
2574
2575  function setOverlayHeight(data) {
2576    var config = data.config;
2577    var bodyHeight = config.docHeight ? $doc.height() : $body.height();
2578    if (config.animOver) {
2579      data.menu.height(bodyHeight);
2580    } else if (data.el.css('position') !== 'fixed') {
2581      bodyHeight -= data.el.height();
2582    }
2583    data.overlay && data.overlay.height(bodyHeight);
2584    return bodyHeight;
2585  }
2586
2587  function close(data, immediate) {
2588    if (!data.open) return;
2589    data.open = false;
2590    data.button.removeClass(buttonOpen);
2591    var config = data.config;
2592    if (config.animation === 'none' || !tram.support.transform || config.duration <= 0) immediate = true;
2593    ix.outro(0, data.el[0]);
2594
2595    // Stop listening for tap outside events
2596    $doc.off('tap' + namespace, data.outside);
2597
2598    if (immediate) {
2599      tram(data.menu).stop();
2600      complete();
2601      return;
2602    }
2603
2604    var transConfig = 'transform ' + config.duration + 'ms ' + config.easing2;
2605    var menuHeight = data.menu.outerHeight(true);
2606    var menuWidth = data.menu.outerWidth(true);
2607    var navHeight = data.el.height();
2608
2609    // Over left/right
2610    if (config.animOver) {
2611      tram(data.menu).add(transConfig).start({ x: menuWidth * config.animDirect }).then(complete);
2612      return;
2613    }
2614
2615    // Drop Down
2616    var offsetY = navHeight + menuHeight;
2617    tram(data.menu).add(transConfig).start({ y: -offsetY }).then(complete);
2618
2619    function complete() {
2620      data.menu.height('');
2621      tram(data.menu).set({ x: 0, y: 0 });
2622      data.menu.removeClass(menuOpen);
2623      data.links.removeClass(linkOpen);
2624      if (data.overlay && data.overlay.children().length) {
2625        // Move menu back to parent at the original location
2626        menuSibling.length ? data.menu.insertAfter(menuSibling) : data.menu.prependTo(data.parent);
2627        data.overlay.attr('style', '').hide();
2628      }
2629
2630      // Trigger event so other components can hook in (dropdown)
2631      data.el.triggerHandler('w-close');
2632    }
2633  }
2634
2635  // Export module
2636  return api;
2637});
2638
2639/***/ }),
2640/* 12 */
2641/***/ (function(module, exports, __webpack_require__) {
2642
2643/**
2644 * Webflow: Smooth scroll
2645 */
2646
2647var Webflow = __webpack_require__(0);
2648
2649Webflow.define('scroll', module.exports = function ($) {
2650  var $doc = $(document);
2651  var win = window;
2652  var loc = win.location;
2653  var history = inIframe() ? null : win.history;
2654  var validHash = /^[a-zA-Z0-9][\w:.-]*$/;
2655
2656  function inIframe() {
2657    try {
2658      return Boolean(win.frameElement);
2659    } catch (e) {
2660      return true;
2661    }
2662  }
2663
2664  function ready() {
2665    // If hash is already present on page load, scroll to it right away
2666    if (loc.hash) {
2667      findEl(loc.hash.substring(1));
2668    }
2669
2670    // The current page url without the hash part.
2671    var locHref = loc.href.split('#')[0];
2672
2673    // When clicking on a link, check if it links to another part of the page
2674    $doc.on('click', 'a', function (e) {
2675      if (Webflow.env('design')) {
2676        return;
2677      }
2678
2679      // Ignore links being used by jQuery mobile
2680      if (window.$.mobile && $(e.currentTarget).hasClass('ui-link')) return;
2681
2682      // Ignore empty # links
2683      if (this.getAttribute('href') === '#') {
2684        e.preventDefault();
2685        return;
2686      }
2687
2688      // The href property always contains the full url so we can compare
2689      // with the document’s location to only target links on this page.
2690      var parts = this.href.split('#');
2691      var hash = parts[0] === locHref ? parts[1] : null;
2692      if (hash) {
2693        findEl(hash, e);
2694      }
2695    });
2696  }
2697
2698  function findEl(hash, e) {
2699    if (!validHash.test(hash)) return;
2700
2701    var el = $('#' + hash);
2702    if (!el.length) {
2703      return;
2704    }
2705
2706    if (e) {
2707      e.preventDefault();
2708      e.stopPropagation();
2709    }
2710
2711    // Push new history state
2712    if (loc.hash !== hash && history && history.pushState &&
2713    // Navigation breaks Chrome when the protocol is `file:`.
2714    !(Webflow.env.chrome && loc.protocol === 'file:')) {
2715      var oldHash = history.state && history.state.hash;
2716      if (oldHash !== hash) {
2717        history.pushState({ hash: hash }, '', '#' + hash);
2718      }
2719    }
2720
2721     // If a fixed header exists, offset for the height
2722    var rootTag = Webflow.env('editor') ? '.w-editor-body' : 'body';
2723    var header = $('header, ' + rootTag + ' > .header, ' + rootTag + ' > .w-nav:not([data-no-scroll])');
2724    var offset = header.css('position') === 'fixed' ? header.outerHeight() : 0;
2725
2726    win.setTimeout(function () {
2727      scroll(el, offset);
2728    }, e ? 0 : 300);
2729  }
2730
2731  function scroll(el, offset) {
2732    var start = $(win).scrollTop();
2733    var end = el.offset().top - offset;
2734
2735    // If specified, scroll so that the element ends up in the middle of the viewport
2736    if (el.data('scroll') === 'mid') {
2737      var available = $(win).height() - offset;
2738      var elHeight = el.outerHeight();
2739      if (elHeight < available) {
2740        end -= Math.round((available - elHeight) / 2);
2741      }
2742    }
2743
2744    var mult = 1;
2745
2746    // Check for custom time multiplier on the body and the element
2747    $('body').add(el).each(function () {
2748      var time = parseFloat($(this).attr('data-scroll-time'), 10);
2749      if (!isNaN(time) && (time === 0 || time > 0)) {
2750        mult = time;
2751      }
2752    });
2753
2754    // Shim for IE8 and below
2755    if (!Date.now) {
2756      Date.now = function () {
2757        return new Date().getTime();
2758      };
2759    }
2760
2761    var clock = Date.now();
2762    var animate = win.requestAnimationFrame || win.mozRequestAnimationFrame || win.webkitRequestAnimationFrame || function (fn) {
2763      win.setTimeout(fn, 15);
2764    };
2765    var duration = (472.143 * Math.log(Math.abs(start - end) + 125) - 2000) * mult;
2766
2767    var step = function step() {
2768      var elapsed = Date.now() - clock;
2769      win.scroll(0, getY(start, end, elapsed, duration));
2770
2771      if (elapsed <= duration) {
2772        animate(step);
2773      }
2774    };
2775
2776    step();
2777  }
2778
2779  function getY(start, end, elapsed, duration) {
2780    if (elapsed > duration) {
2781      return end;
2782    }
2783
2784    return start + (end - start) * ease(elapsed / duration);
2785  }
2786
2787  function ease(t) {
2788    return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
2789  }
2790
2791  // Export module
2792  return { ready: ready };
2793});
2794
2795/***/ }),
2796/* 13 */
2797/***/ (function(module, exports, __webpack_require__) {
2798
2799/**
2800 * Webflow: Tabs component
2801 */
2802
2803var Webflow = __webpack_require__(0);
2804var IXEvents = __webpack_require__(3);
2805
2806Webflow.define('tabs', module.exports = function ($) {
2807  var api = {};
2808  var tram = $.tram;
2809  var $doc = $(document);
2810  var $tabs;
2811  var design;
2812  var env = Webflow.env;
2813  var safari = env.safari;
2814  var inApp = env();
2815  var tabAttr = 'data-w-tab';
2816  var namespace = '.w-tabs';
2817  var linkCurrent = 'w--current';
2818  var tabActive = 'w--tab-active';
2819  var ix = IXEvents.triggers;
2820
2821  var inRedraw = false;
2822
2823  // -----------------------------------
2824  // Module methods
2825
2826  api.ready = api.design = api.preview = init;
2827
2828  api.redraw = function () {
2829    inRedraw = true;
2830    init();
2831    inRedraw = false;
2832  };
2833
2834  api.destroy = function () {
2835    $tabs = $doc.find(namespace);
2836    if (!$tabs.length) return;
2837    $tabs.each(resetIX);
2838    removeListeners();
2839  };
2840
2841  // -----------------------------------
2842  // Private methods
2843
2844  function init() {
2845    design = inApp && Webflow.env('design');
2846
2847    // Find all instances on the page
2848    $tabs = $doc.find(namespace);
2849    if (!$tabs.length) return;
2850    $tabs.each(build);
2851    if (Webflow.env('preview') && !inRedraw) {
2852      $tabs.each(resetIX);
2853    }
2854
2855    removeListeners();
2856    addListeners();
2857  }
2858
2859  function removeListeners() {
2860    Webflow.redraw.off(api.redraw);
2861  }
2862
2863  function addListeners() {
2864    Webflow.redraw.on(api.redraw);
2865  }
2866
2867  function resetIX(i, el) {
2868    var data = $.data(el, namespace);
2869    if (!data) return;
2870    data.links && data.links.each(ix.reset);
2871    data.panes && data.panes.each(ix.reset);
2872  }
2873
2874  function build(i, el) {
2875    var $el = $(el);
2876
2877    // Store state in data
2878    var data = $.data(el, namespace);
2879    if (!data) data = $.data(el, namespace, { el: $el, config: {} });
2880    data.current = null;
2881    data.menu = $el.children('.w-tab-menu');
2882    data.links = data.menu.children('.w-tab-link');
2883    data.content = $el.children('.w-tab-content');
2884    data.panes = data.content.children('.w-tab-pane');
2885
2886    // Remove old events
2887    data.el.off(namespace);
2888    data.links.off(namespace);
2889
2890    // Set config from data attributes
2891    configure(data);
2892
2893    // Wire up events when not in design mode
2894    if (!design) {
2895      data.links.on('click' + namespace, linkSelect(data));
2896
2897      // Trigger first intro event from current tab
2898      var $link = data.links.filter('.' + linkCurrent);
2899      var tab = $link.attr(tabAttr);
2900      tab && changeTab(data, { tab: tab, immediate: true });
2901    }
2902  }
2903
2904  function configure(data) {
2905    var config = {};
2906
2907    // Set config options from data attributes
2908    config.easing = data.el.attr('data-easing') || 'ease';
2909
2910    var intro = parseInt(data.el.attr('data-duration-in'), 10);
2911    intro = config.intro = intro === intro ? intro : 0;
2912
2913    var outro = parseInt(data.el.attr('data-duration-out'), 10);
2914    outro = config.outro = outro === outro ? outro : 0;
2915
2916    config.immediate = !intro && !outro;
2917
2918    // Store config in data
2919    data.config = config;
2920  }
2921
2922  function linkSelect(data) {
2923    return function (evt) {
2924      var tab = evt.currentTarget.getAttribute(tabAttr);
2925      tab && changeTab(data, { tab: tab });
2926    };
2927  }
2928
2929  function changeTab(data, options) {
2930    options = options || {};
2931
2932    var config = data.config;
2933    var easing = config.easing;
2934    var tab = options.tab;
2935
2936    // Don't select the same tab twice
2937    if (tab === data.current) return;
2938    data.current = tab;
2939
2940    // Select the current link
2941    data.links.each(function (i, el) {
2942      var $el = $(el);
2943      if (el.getAttribute(tabAttr) === tab) $el.addClass(linkCurrent).each(ix.intro);else if ($el.hasClass(linkCurrent)) $el.removeClass(linkCurrent).each(ix.outro);
2944    });
2945
2946    // Find the new tab panes and keep track of previous
2947    var targets = [];
2948    var previous = [];
2949    data.panes.each(function (i, el) {
2950      var $el = $(el);
2951      if (el.getAttribute(tabAttr) === tab) {
2952        targets.push(el);
2953      } else if ($el.hasClass(tabActive)) {
2954        previous.push(el);
2955      }
2956    });
2957
2958    var $targets = $(targets);
2959    var $previous = $(previous);
2960
2961    // Switch tabs immediately and bypass transitions
2962    if (options.immediate || config.immediate) {
2963      $targets.addClass(tabActive).each(ix.intro);
2964      $previous.removeClass(tabActive);
2965      // Redraw to benefit components in the hidden tab pane
2966      // But only if not currently in the middle of a redraw
2967      if (!inRedraw) Webflow.redraw.up();
2968      return;
2969    }
2970
2971    // Fade out the currently active tab before intro
2972    if ($previous.length && config.outro) {
2973      $previous.each(ix.outro);
2974      tram($previous).add('opacity ' + config.outro + 'ms ' + easing, { fallback: safari }).start({ opacity: 0 }).then(intro);
2975    } else {
2976      // Skip the outro and play intro
2977      intro();
2978    }
2979
2980    // Fade in the new target
2981    function intro() {
2982      // Clear previous active class + styles touched by tram
2983      // We cannot remove the whole inline style because it could be dynamically bound
2984      $previous.removeClass(tabActive).css({
2985        opacity: '',
2986        transition: '',
2987        transform: '',
2988        width: '',
2989        height: ''
2990      });
2991
2992      // Add active class to new target
2993      $targets.addClass(tabActive).each(ix.intro);
2994      Webflow.redraw.up();
2995
2996      // Set opacity immediately if intro is zero
2997      if (!config.intro) return tram($targets).set({ opacity: 1 });
2998
2999      // Otherwise fade in opacity
3000      tram($targets).set({ opacity: 0 }).redraw().add('opacity ' + config.intro + 'ms ' + easing, { fallback: safari }).start({ opacity: 1 });
3001    }
3002  }
3003
3004  // Export module
3005  return api;
3006});
3007
3008/***/ }),
3009/* 14 */
3010/***/ (function(module, exports, __webpack_require__) {
3011
3012/**
3013 * Webflow: Touch events
3014 */
3015
3016var Webflow = __webpack_require__(0);
3017
3018Webflow.define('touch', module.exports = function ($) {
3019  var api = {};
3020  var fallback = !document.addEventListener;
3021  var getSelection = window.getSelection;
3022
3023  // Fallback to click events in old IE
3024  if (fallback) {
3025    $.event.special.tap = { bindType: 'click', delegateType: 'click' };
3026  }
3027
3028  api.init = function (el) {
3029    if (fallback) return null;
3030    el = typeof el === 'string' ? $(el).get(0) : el;
3031    return el ? new Touch(el) : null;
3032  };
3033
3034  function Touch(el) {
3035    var active = false;
3036    var dirty = false;
3037    var useTouch = false;
3038    var thresholdX = Math.min(Math.round(window.innerWidth * 0.04), 40);
3039    var startX;
3040    var startY;
3041    var lastX;
3042
3043    el.addEventListener('touchstart', start, false);
3044    el.addEventListener('touchmove', move, false);
3045    el.addEventListener('touchend', end, false);
3046    el.addEventListener('touchcancel', cancel, false);
3047    el.addEventListener('mousedown', start, false);
3048    el.addEventListener('mousemove', move, false);
3049    el.addEventListener('mouseup', end, false);
3050    el.addEventListener('mouseout', cancel, false);
3051
3052    function start(evt) {
3053      // We don’t handle multi-touch events yet.
3054      var touches = evt.touches;
3055      if (touches && touches.length > 1) {
3056        return;
3057      }
3058
3059      active = true;
3060      dirty = false;
3061
3062      if (touches) {
3063        useTouch = true;
3064        startX = touches[0].clientX;
3065        startY = touches[0].clientY;
3066      } else {
3067        startX = evt.clientX;
3068        startY = evt.clientY;
3069      }
3070
3071      lastX = startX;
3072    }
3073
3074    function move(evt) {
3075      if (!active) return;
3076
3077      if (useTouch && evt.type === 'mousemove') {
3078        evt.preventDefault();
3079        evt.stopPropagation();
3080        return;
3081      }
3082
3083      var touches = evt.touches;
3084      var x = touches ? touches[0].clientX : evt.clientX;
3085      var y = touches ? touches[0].clientY : evt.clientY;
3086
3087      var velocityX = x - lastX;
3088      lastX = x;
3089
3090      // Allow swipes while pointer is down, but prevent them during text selection
3091      if (Math.abs(velocityX) > thresholdX && getSelection && String(getSelection()) === '') {
3092        triggerEvent('swipe', evt, { direction: velocityX > 0 ? 'right' : 'left' });
3093        cancel();
3094      }
3095
3096      // If pointer moves more than 10px flag to cancel tap
3097      if (Math.abs(x - startX) > 10 || Math.abs(y - startY) > 10) {
3098        dirty = true;
3099      }
3100    }
3101
3102    function end(evt) {
3103      if (!active) return;
3104      active = false;
3105
3106      if (useTouch && evt.type === 'mouseup') {
3107        evt.preventDefault();
3108        evt.stopPropagation();
3109        useTouch = false;
3110        return;
3111      }
3112
3113      if (!dirty) triggerEvent('tap', evt);
3114    }
3115
3116    function cancel() {
3117      active = false;
3118    }
3119
3120    function destroy() {
3121      el.removeEventListener('touchstart', start, false);
3122      el.removeEventListener('touchmove', move, false);
3123      el.removeEventListener('touchend', end, false);
3124      el.removeEventListener('touchcancel', cancel, false);
3125      el.removeEventListener('mousedown', start, false);
3126      el.removeEventListener('mousemove', move, false);
3127      el.removeEventListener('mouseup', end, false);
3128      el.removeEventListener('mouseout', cancel, false);
3129      el = null;
3130    }
3131
3132    // Public instance methods
3133    this.destroy = destroy;
3134  }
3135
3136  // Wrap native event to supoprt preventdefault + stopPropagation
3137  function triggerEvent(type, evt, data) {
3138    var newEvent = $.Event(type, { originalEvent: evt });
3139    $(evt.target).trigger(newEvent, data);
3140  }
3141
3142  // Listen for touch events on all nodes by default.
3143  api.instance = api.init(document);
3144
3145  // Export module
3146  return api;
3147});
3148
3149/***/ })
3150/******/ ]);/**
3151 * ----------------------------------------------------------------------
3152 * Webflow: Interactions: Init
3153 */
3154Webflow.require('ix').init([
3155  {"slug":"dropdown-hover","name":"Dropdown Hover","value":{"style":{},"triggers":[{"type":"hover","selector":".dropdown-list","descend":true,"stepsA":[{"height":"auto","transition":"height 300ms ease-in-out 0ms"}],"stepsB":[{"height":"0px","transition":"height 300ms ease-in-out 0ms"}]}]}},
3156  {"slug":"account-dd-action","name":"Account DD Action","value":{"style":{},"triggers":[{"type":"hover","selector":".account-dd-list","descend":true,"stepsA":[{"display":"block","opacity":1,"height":"auto","transition":"height 300ms ease-in-out 0, opacity 300ms ease 0"}
3156],"stepsB":[{"display":"none","height":"0px","transition":"height 300ms ease-in-out 0ms"}]}]}},
3157  {"slug":"pickerdd-state","name":"PickerDD-State","value":{"style":{},"triggers":[{"type":"hover","selector":".picker-dd-list","descend":true,"stepsA":[{"display":"block","opacity":1,"height":"220px","transition":"height 300ms ease-in-out 0, opacity 300ms ease 0"}],"stepsB":[{"display":"none","height":"0px","transition":"height 300ms ease-in-out 0ms"}]}]}},
3158  {"slug":"pickerdd-region","name":"PickerDD-Region","value":{"style":{},"triggers":[{"type":"hover","selector":".picker-dd-list","descend":true,"stepsA":[{"display":"block","opacity":1,"height":"auto","transition":"opacity 300ms ease 0, height 200 ease 0"}],"stepsB":[{"display":"none","height":"0px","transition":"height 300ms ease-in-out 0ms"}]}]}},
3159  {"slug":"search-open","name":"Search Open","value":{"style":{},"triggers":[{"type":"click","selector":".zip-search-form","stepsA":[{"width":"auto","transition":"width 500ms ease 0ms"}],"stepsB":[{"width":"30px","transition":"width 500ms ease 0ms"}]}]}},
3160  {"slug":"mini-menu-open","name":"Mini Menu Open","value":{"style":{},"triggers":[{"type":"click","selector":".mini-menu-dropdown-list","siblings":true,"preserve3d":true,"stepsA":[{"opacity":1,"height":"auto","transition":"opacity 400ms ease 0ms, height 500ms ease 0ms"}],"stepsB":[{"opacity":0,"height":"0px","transition":"transform 400ms ease 0ms, opacity 400ms ease 0ms, height 500ms ease 0ms","x":"0px","y":"0px","z":"0px"}]}]}},
3161  {"slug":"search-open-2","name":"Search Open 2","value":{"style":{},"triggers":[{"type":"click","selector":".search-field","stepsA":[{"opacity":1,"transition":"opacity 500ms ease 0ms"}],"stepsB":[{"opacity":0,"transition":"opacity 500ms ease 0ms"}]}]}},
3162  {"slug":"hero-text-fade-in-out","name":"Hero Text Fade In-Out","value":{"style":{"opacity":0,"x":"0px","y":"-75px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":"850ms"},{"opacity":1,"transition":"transform 1000ms ease 0, opacity 500ms ease 0","x":"0px","y":"0px","z":"0px"},{"wait":"1000ms"},{"opacity":0,"transition":"transform 200 ease 0, opacity 1000ms ease-out 0"}],"stepsB":[]}]}},
3163  {"slug":"map-legend-appear","name":"Map Legend Appear","value":{"style":{"opacity":0,"x":"0px","y":"125px","z":"0px"},"triggers":[{"type":"load","preload":true,"stepsA":[{"wait":"2000ms"},{"opacity":1,"transition":"transform 1000ms ease 0, opacity 1000ms ease 0","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
3164  {"slug":"headline-scroll-appear","name":"Headline Scroll Appear","value":{"style":{"opacity":0,"x":"0px","y":"40px","z":"0px"},"triggers":[{"type":"scroll","offsetTop":"0%","offsetBot":"25%","stepsA":[{"opacity":1,"transition":"transform 500ms ease 0, opacity 500ms ease 0","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
3165  {"slug":"about-scroll-appear","name":"About Scroll Appear","value":{"style":{"opacity":0,"x":"0px","y":"100px","z":"0px"},"triggers":[{"type":"scroll","offsetTop":"0%","offsetBot":"15%","stepsA":[{"wait":"150ms"},{"opacity":1,"transition":"transform 600ms ease 0, opacity 400ms ease 0","x":"0px","y":"0px","z":"0px"}],"stepsB":[]}]}},
3166  {"slug":"close-legend","name":"Close Legend","value":{"style":{},"triggers":[{"type":"click","selector":".legend-wrapper","preserve3d":true,"stepsA":[{"transition":"transform 500ms ease 0","x":"0px","y":"83%","z":"0px"}],"stepsB":[{"transition":"transform 500ms ease 0","x":"0px","y":"0px","z":"0px"}]}]}},
3167  {"slug":"login-reveal","name":"Login Reveal","value":{"style":{},"triggers":[{"type":"click","stepsA":[{"display":"none"}],"stepsB":[]},{"type":"click","selector":".logged-in","stepsA":[{"display":"inline-block","opacity":1,"width":"auto","transition":"opacity 400ms ease 0, width 200 ease 0"}],"stepsB":[]},{"type":"click","selector":".account-dropdown","stepsA":[{"display":"block","opacity":1,"width":"auto","transition":"width 200 ease 0, opacity 200 ease 0"}],"stepsB":[]}]}},
3168  {"slug":"log-out","name":"Log Out","value":{"style":{},"triggers":[{"type":"click","selector":".login","stepsA":[{"display":"inline-block","opacity":1,"width":"100%","transition":"width 500ms ease 0, opacity 400ms ease 0"}],"stepsB":[]}
3168,{"type":"click","selector":".logged-in","stepsA":[{"display":"none","opacity":0,"width":"0px","transition":"opacity 200 ease 0, width 200 ease 0"}],"stepsB":[]}]}},
3169  {"slug":"modal-close","name":"Modal Close","value":{"style":{},"triggers":[{"type":"click","selector":".ice-index-modal-bkgd","stepsA":[{"display":"none","opacity":0,"transition":"opacity 200 ease 0"}],"stepsB":[]}]}},
3170  {"slug":"close-wind-speed-modal","name":"Close Wind Speed Modal","value":{"style":{},"triggers":[{"type":"click","selector":".wind-speed-modal-bkgd","stepsA":[{"display":"none","opacity":0,"transition":"opacity 200 ease 0"}],"stepsB":[]}]}},
3171  {"slug":"view-spia-key-modal","name":"View SPIA Key Modal","value":{"style":{},"triggers":[{"type":"click","selector":".ice-index-modal-bkgd","stepsA":[{"display":"block","opacity":1,"transition":"opacity 500ms ease 0"}],"stepsB":[]}]}},
3172  {"slug":"view-wind-speed-modal","name":"View Wind Speed Modal","value":{"style":{},"triggers":[{"type":"click","selector":".wind-speed-modal-bkgd","stepsA":[{"display":"block","opacity":1,"transition":"opacity 500ms ease 0"}],"stepsB":[]}]}},
3173  {"slug":"show-maps","name":"Show Maps","value":{"style":{},"triggers":[{"type":"click","selector":".accordion-container","stepsA":[{"display":"block","opacity":1,"height":"auto","transition":"height 200 ease 0, opacity 200 ease 0"}],"stepsB":[]}]}},
3174  {"slug":"new-interaction","name":"New Interaction","value":{"style":{},"triggers":[]}},
3175  {"slug":"new-interaction-2","name":"New Interaction 2","value":{"style":{},"triggers":[{"type":"click","selector":".text-details-wrap","descend":true,"stepsA":[{"opacity":1,"height":"auto","transition":"height 200 ease 0, opacity 200 ease 0"}],"stepsB":[]}]}},
3176  {"slug":"text-details-reveal","name":"Text Details Reveal","value":{"style":{},"triggers":[{"type":"click","selector":".text-details-wrap","stepsA":[{"display":"block","opacity":1,"transition":"opacity 500ms ease 0"}],"stepsB":[{"display":"none","opacity":0,"transition":"opacity 500ms ease 0"}]}]}},
3177  {"slug":"email-details-reveal","name":"Email Details Reveal","value":{"style":{},"triggers":[{"type":"click","selector":".email-details-wrap","stepsA":[{"display":"block","opacity":1,"transition":"opacity 500ms ease 0"}],"stepsB":[{"display":"none","opacity":0,"transition":"opacity 500ms ease 0"}]}]}}
3178]);

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.