From var, 1 Week ago, written in JavaScript.
- go back
Embed
Viewing differences between and StripeCheckout
  1. (function () {
  2.   var namespace = 'StripeCheckout.require'.split('.'),
  3.   name = namespace[namespace.length - 1],
  4.   base = this,
  5.   i;
  6.   for (i = 0; i < namespace.length - 1; i++) {
  7.     base = base[namespace[i]] = base[namespace[i]] || {
  8.     }
  9.   }
  10.   if (base[name] === undefined) {
  11.     base[name] = function () {
  12.       var modules = {
  13.       },
  14.       cache = {
  15.       };
  16.       var requireRelative = function (name, root) {
  17.         var path = expand(root, name),
  18.         indexPath = expand(path, './index'),
  19.         module,
  20.         fn;
  21.         module = cache[path] || cache[indexPath];
  22.         if (module) {
  23.           return module
  24.         } else if (fn = modules[path] || modules[path = indexPath]) {
  25.           module = {
  26.             id: path,
  27.             exports: {
  28.             }
  29.           };
  30.           cache[path] = module.exports;
  31.           fn(module.exports, function (name) {
  32.             return require(name, dirname(path))
  33.           }, module);
  34.           return cache[path] = module.exports
  35.         } else {
  36.           throw 'module ' + name + ' not found'
  37.         }
  38.       };
  39.       var expand = function (root, name) {
  40.         var results = [
  41.         ],
  42.         parts,
  43.         part;
  44.         if (/^\.\.?(\/|$)/.test(name)) {
  45.           parts = [
  46.             root,
  47.             name
  48.           ].join('/').split('/')
  49.         } else {
  50.           parts = name.split('/')
  51.         }
  52.         for (var i = 0, length = parts.length; i < length; i++) {
  53.           part = parts[i];
  54.           if (part == '..') {
  55.             results.pop()
  56.           } else if (part != '.' && part != '') {
  57.             results.push(part)
  58.           }
  59.         }
  60.         return results.join('/')
  61.       };
  62.       var dirname = function (path) {
  63.         return path.split('/').slice(0, - 1).join('/')
  64.       };
  65.       var require = function (name) {
  66.         return requireRelative(name, '')
  67.       };
  68.       require.define = function (bundle) {
  69.         for (var key in bundle) {
  70.           modules[key] = bundle[key]
  71.         }
  72.       };
  73.       require.modules = modules;
  74.       require.cache = cache;
  75.       return require
  76.     }.call()
  77.   }
  78. }) ();
  79. StripeCheckout.require.define({
  80.   'vendor/ready': function (exports, require, module) {
  81.     !function (name, definition) {
  82.       if (typeof module != 'undefined') module.exports = definition();
  83.        else if (typeof define == 'function' && typeof define.amd == 'object') define(definition);
  84.        else this[name] = definition()
  85.     }('domready', function (ready) {
  86.       var fns = [
  87.       ],
  88.       fn,
  89.       f = false,
  90.       doc = document,
  91.       testEl = doc.documentElement,
  92.       hack = testEl.doScroll,
  93.       domContentLoaded = 'DOMContentLoaded',
  94.       addEventListener = 'addEventListener',
  95.       onreadystatechange = 'onreadystatechange',
  96.       readyState = 'readyState',
  97.       loadedRgx = hack ? /^loaded|^c/ : /^loaded|c/,
  98.       loaded = loadedRgx.test(doc[readyState]);
  99.       function flush(f) {
  100.         loaded = 1;
  101.         while (f = fns.shift()) f()
  102.       }
  103.       doc[addEventListener] && doc[addEventListener](domContentLoaded, fn = function () {
  104.         doc.removeEventListener(domContentLoaded, fn, f);
  105.         flush()
  106.       }, f);
  107.       hack && doc.attachEvent(onreadystatechange, fn = function () {
  108.         if (/^c/.test(doc[readyState])) {
  109.           doc.detachEvent(onreadystatechange, fn);
  110.           flush()
  111.         }
  112.       });
  113.       return ready = hack ? function (fn) {
  114.         self != top ? loaded ? fn() : fns.push(fn) : function () {
  115.           try {
  116.             testEl.doScroll('left')
  117.           } catch (e) {
  118.             return setTimeout(function () {
  119.               ready(fn)
  120.             }, 50)
  121.           }
  122.           fn()
  123.         }()
  124.       }
  125.        : function (fn) {
  126.         loaded ? fn() : fns.push(fn)
  127.       }
  128.     })
  129.   }
  130. });
  131. (function () {
  132.   if (!Array.prototype.indexOf) {
  133.     Array.prototype.indexOf = function (obj, start) {
  134.       var f,
  135.       i,
  136.       j,
  137.       k,
  138.       ref,
  139.       ref1;
  140.       j = this.length;
  141.       f = start ? start : 0;
  142.       for (i = k = ref = f, ref1 = j; ref <= ref1 ? k < ref1 : k > ref1; i = ref <= ref1 ? ++k : --k) {
  143.         if (this[i] === obj) {
  144.           return i
  145.         }
  146.       }
  147.       return - 1
  148.     }
  149.   }
  150. }).call(this);
  151. StripeCheckout.require.define({
  152.   'lib/helpers': function (exports, require, module) {
  153.     (function () {
  154.       var delurkWinPhone,
  155.       helpers,
  156.       uaVersionFn;
  157.       uaVersionFn = function (re) {
  158.         return function () {
  159.           var uaMatch;
  160.           uaMatch = helpers.userAgent.match(re);
  161.           return uaMatch && parseInt(uaMatch[1])
  162.         }
  163.       };
  164.       delurkWinPhone = function (fn) {
  165.         return function () {
  166.           return fn() && !helpers.isWindowsPhone()
  167.         }
  168.       };
  169.       helpers = {
  170.         userAgent: window.navigator.userAgent,
  171.         escape: function (value) {
  172.           return value && ('' + value).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')
  173.         },
  174.         trim: function (value) {
  175.           return value.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
  176.         },
  177.         sanitizeURL: function (value) {
  178.           var SCHEME_WHITELIST,
  179.           allowed,
  180.           j,
  181.           len,
  182.           scheme;
  183.           if (!value) {
  184.             return
  185.           }
  186.           value = helpers.trim(value);
  187.           SCHEME_WHITELIST = [
  188.             'data:',
  189.             'http:',
  190.             'https:'
  191.           ];
  192.           allowed = false;
  193.           for (j = 0, len = SCHEME_WHITELIST.length; j < len; j++) {
  194.             scheme = SCHEME_WHITELIST[j];
  195.             if (value.indexOf(scheme) === 0) {
  196.               allowed = true;
  197.               break
  198.             }
  199.           }
  200.           if (!allowed) {
  201.             return null
  202.           }
  203.           return encodeURI(value)
  204.         },
  205.         iOSVersion: uaVersionFn(/(?:iPhone OS |iPad; CPU OS )(\d+)_\d+/),
  206.         iOSMinorVersion: uaVersionFn(/(?:iPhone OS |iPad; CPU OS )\d+_(\d+)/),
  207.         iOSBuildVersion: uaVersionFn(/(?:iPhone OS |iPad; CPU OS )\d+_\d+_(\d+)/),
  208.         androidWebkitVersion: uaVersionFn(/Mozilla\/5\.0.*Android.*AppleWebKit\/([\d]+)/),
  209.         androidVersion: uaVersionFn(/Android (\d+)\.\d+/),
  210.         firefoxVersion: uaVersionFn(/Firefox\/(\d+)\.\d+/),
  211.         chromeVersion: uaVersionFn(/Chrome\/(\d+)\.\d+/),
  212.         safariVersion: uaVersionFn(/Version\/(\d+)\.\d+ Safari/),
  213.         iOSChromeVersion: uaVersionFn(/CriOS\/(\d+)\.\d+/),
  214.         iOSNativeVersion: uaVersionFn(/Stripe\/(\d+)\.\d+/),
  215.         ieVersion: uaVersionFn(/(?:MSIE |Trident\/.*rv:)(\d{1,2})\./),
  216.         isiOSChrome: function () {
  217.           return /CriOS/.test(helpers.userAgent)
  218.         },
  219.         isiOSFirefox: function () {
  220.           return helpers.isiOS() && /FxiOS\//.test(helpers.userAgent)
  221.         },
  222.         isiOSWebView: function () {
  223.           return /(iPhone|iPod|iPad).*AppleWebKit((?!.*Safari)|(.*\([^)]*like[^)]*Safari[^)]*\)))/i.test(helpers.userAgent)
  224.         },
  225.         getiOSWebViewType: function () {
  226.           if (helpers.isiOSWebView()) {
  227.             if (window.indexedDB) {
  228.               return 'WKWebView'
  229.             } else {
  230.               return 'UIWebView'
  231.             }
  232.           }
  233.         },
  234.         isiOS: delurkWinPhone(function () {
  235.           return /(iPhone|iPad|iPod)/i.test(helpers.userAgent)
  236.         }),
  237.         isiOSNative: function () {
  238.           return this.isiOS() && this.iOSNativeVersion() >= 3
  239.         },
  240.         isiPad: function () {
  241.           return /(iPad)/i.test(helpers.userAgent)
  242.         },
  243.         isMac: delurkWinPhone(function () {
  244.           return /mac/i.test(helpers.userAgent)
  245.         }),
  246.         isWindowsPhone: function () {
  247.           return /(Windows\sPhone|IEMobile)/i.test(helpers.userAgent)
  248.         },
  249.         isWindowsOS: function () {
  250.           return /(Windows NT \d\.\d)/i.test(helpers.userAgent)
  251.         },
  252.         isIE: function () {
  253.           return /(MSIE ([0-9]{1,}[\.0-9]{0,})|Trident\/)/i.test(helpers.userAgent)
  254.         },
  255.         isChrome: function () {
  256.           return 'chrome' in window
  257.         },
  258.         isSafari: delurkWinPhone(function () {
  259.           var userAgent;
  260.           userAgent = helpers.userAgent;
  261.           return /Safari/i.test(userAgent) && !/Chrome/i.test(userAgent)
  262.         }),
  263.         isFirefox: delurkWinPhone(function () {
  264.           return helpers.firefoxVersion() != null
  265.         }),
  266.         isAndroidBrowser: function () {
  267.           var version;
  268.           version = helpers.androidWebkitVersion();
  269.           return version && version < 537
  270.         },
  271.         isAndroidChrome: function () {
  272.           var version;
  273.           version = helpers.androidWebkitVersion();
  274.           return version && version >= 537
  275.         },
  276.         isAndroidDevice: delurkWinPhone(function () {
  277.           return /Android/.test(helpers.userAgent)
  278.         }),
  279.         isAndroidWebView: function () {
  280.           return helpers.isAndroidChrome() && /Version\/\d+\.\d+/.test(helpers.userAgent)
  281.         },
  282.         isAndroidFacebookApp: function () {
  283.           return helpers.isAndroidChrome() && /FBAV\/\d+\.\d+/.test(helpers.userAgent)
  284.         },
  285.         isNativeWebContainer: function () {
  286.           return window.cordova != null || /GSA\/\d+\.\d+/.test(helpers.userAgent)
  287.         },
  288.         isSupportedMobileOS: function () {
  289.           return helpers.isiOS() || helpers.isAndroidDevice()
  290.         },
  291.         isAndroidWebapp: function () {
  292.           var metaTag;
  293.           if (!helpers.isAndroidChrome()) {
  294.             return false
  295.           }
  296.           metaTag = document.getElementsByName('apple-mobile-web-app-capable') [0] || document.getElementsByName('mobile-web-app-capable') [0];
  297.           return metaTag && metaTag.content === 'yes'
  298.         },
  299.         isiOSBroken: function () {
  300.           var chromeVersion;
  301.           chromeVersion = helpers.iOSChromeVersion();
  302.           if (helpers.iOSVersion() === 9 && helpers.iOSMinorVersion() >= 2 && chromeVersion && chromeVersion <= 47) {
  303.             return true
  304.           }
  305.           if (helpers.isiPad() && helpers.iOSVersion() === 8) {
  306.             switch (helpers.iOSMinorVersion()) {
  307.               case 0:
  308.                 return true;
  309.               case 1:
  310.                 return helpers.iOSBuildVersion() < 1
  311.             }
  312.           }
  313.           if (helpers.isiOSFirefox()) {
  314.             return true
  315.           }
  316.           return false
  317.         },
  318.         couldBeBrokenSFSVC: function () {
  319.           var iOSVersion;
  320.           iOSVersion = helpers.iOSVersion();
  321.           return (iOSVersion === 9 || iOSVersion === 10) && !helpers.isiOSWebView() && !helpers.isiOSChrome() && !helpers.isiOSFirefox() && !helpers.isNativeWebContainer() && !helpers.isiPad()
  322.         },
  323.         isSafariStandaloneMode: function () {
  324.           return window.navigator && window.navigator.standalone
  325.         },
  326.         getViewportTags: function () {
  327.           var j,
  328.           keyval,
  329.           keyvalSplit,
  330.           len,
  331.           metaTags,
  332.           ref,
  333.           viewport,
  334.           viewportContent;
  335.           metaTags = Array.prototype.slice.call(document.getElementsByTagName('meta')).filter(function (tag) {
  336.             return tag.name === 'viewport' && tag.getAttribute('content') != null
  337.           });
  338.           if (!metaTags.length) {
  339.             return {
  340.             }
  341.           }
  342.           viewportContent = metaTags[metaTags.length - 1].content;
  343.           viewport = {
  344.           };
  345.           ref = viewportContent.split(',');
  346.           for (j = 0, len = ref.length; j < len; j++) {
  347.             keyval = ref[j];
  348.             keyvalSplit = keyval.split('=');
  349.             if (keyvalSplit.length === 2) {
  350.               viewport[keyvalSplit[0].trim()] = keyvalSplit[1].trim()
  351.             }
  352.           }
  353.           return viewport
  354.         },
  355.         isFullscreenMobileCapableViewport: function () {
  356.           var heightIsOK,
  357.           initialScaleIsOK,
  358.           viewportTags,
  359.           widthIsOK;
  360.           viewportTags = this.getViewportTags();
  361.           initialScaleIsOK = !!viewportTags['initial-scale'] && parseInt(viewportTags['initial-scale'], 10) === 1;
  362.           widthIsOK = !viewportTags['width'] || viewportTags['width'] === 'device-width';
  363.           heightIsOK = !viewportTags['height'] || viewportTags['height'] === 'device-height';
  364.           return initialScaleIsOK && widthIsOK && heightIsOK
  365.         },
  366.         iOSChromeTabViewWillFail: function () {
  367.           var isUserGesture,
  368.           ref,
  369.           ref1;
  370.           isUserGesture = (ref = (ref1 = window.event) != null ? ref1.type : void 0) === 'click' || ref === 'touchstart' || ref === 'touchend';
  371.           return helpers.iOSChromeVersion() < 48 && !isUserGesture
  372.         },
  373.         isInsideFrame: function () {
  374.           return window.top !== window.self
  375.         },
  376.         isSmallScreen: function () {
  377.           return Math.min(window.screen.availHeight, window.screen.availWidth) <= 640 || /FakeCheckoutMobile/.test(helpers.userAgent)
  378.         },
  379.         pad: function (number, width, padding) {
  380.           var leading;
  381.           if (width == null) {
  382.             width = 2
  383.           }
  384.           if (padding == null) {
  385.             padding = '0'
  386.           }
  387.           number = number + '';
  388.           if (number.length > width) {
  389.             return number
  390.           }
  391.           leading = new Array(width - number.length + 1).join(padding);
  392.           return leading + number
  393.         },
  394.         requestAnimationFrame: function (callback) {
  395.           return (typeof window.requestAnimationFrame === 'function' ? window.requestAnimationFrame(callback) : void 0) || (typeof window.webkitRequestAnimationFrame === 'function' ? window.webkitRequestAnimationFrame(callback) : void 0) || window.setTimeout(callback, 100)
  396.         },
  397.         requestAnimationInterval: function (func, interval) {
  398.           var callback,
  399.           previous;
  400.           previous = new Date;
  401.           callback = function () {
  402.             var frame,
  403.             now,
  404.             remaining;
  405.             frame = helpers.requestAnimationFrame(callback);
  406.             now = new Date;
  407.             remaining = interval - (now - previous);
  408.             if (remaining <= 0) {
  409.               previous = now;
  410.               func()
  411.             }
  412.             return frame
  413.           };
  414.           return callback()
  415.         },
  416.         getQueryParameterByName: function (name) {
  417.           var match;
  418.           match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
  419.           return match && decodeURIComponent(match[1].replace(/\+/g, ' '))
  420.         },
  421.         addQueryParameter: function (url, name, value) {
  422.           var hashParts,
  423.           query;
  424.           query = encodeURIComponent(name) + '=' + encodeURIComponent(value);
  425.           hashParts = new String(url).split('#');
  426.           hashParts[0] += hashParts[0].indexOf('?') !== - 1 ? '&' : '?';
  427.           hashParts[0] += query;
  428.           return hashParts.join('#')
  429.         },
  430.         bind: function (element, name, callback) {
  431.           if (element.addEventListener) {
  432.             return element.addEventListener(name, callback, false)
  433.           } else {
  434.             return element.attachEvent('on' + name, callback)
  435.           }
  436.         },
  437.         unbind: function (element, name, callback) {
  438.           if (element.removeEventListener) {
  439.             return element.removeEventListener(name, callback, false)
  440.           } else {
  441.             return element.detachEvent('on' + name, callback)
  442.           }
  443.         },
  444.         host: function (url) {
  445.           var parent,
  446.           parser;
  447.           parent = document.createElement('div');
  448.           parent.innerHTML = '<a href="' + this.escape(url) + '">x</a>';
  449.           parser = parent.firstChild;
  450.           return parser.protocol + '//' + parser.host
  451.         },
  452.         strip: function (html) {
  453.           var ref,
  454.           ref1,
  455.           tmp;
  456.           tmp = document.createElement('div');
  457.           tmp.innerHTML = html;
  458.           return (ref = (ref1 = tmp.textContent) != null ? ref1 : tmp.innerText) != null ? ref : ''
  459.         },
  460.         replaceFullWidthNumbers: function (el) {
  461.           var char,
  462.           fullWidth,
  463.           halfWidth,
  464.           idx,
  465.           j,
  466.           len,
  467.           original,
  468.           ref,
  469.           replaced;
  470.           fullWidth = '0123456789';
  471.           halfWidth = '0123456789';
  472.           original = el.value;
  473.           replaced = '';
  474.           ref = original.split('');
  475.           for (j = 0, len = ref.length; j < len; j++) {
  476.             char = ref[j];
  477.             idx = fullWidth.indexOf(char);
  478.             if (idx > - 1) {
  479.               char = halfWidth[idx]
  480.             }
  481.             replaced += char
  482.           }
  483.           if (original !== replaced) {
  484.             return el.value = replaced
  485.           }
  486.         },
  487.         setAutocomplete: function (el, type) {
  488.           var secureCCFill;
  489.           secureCCFill = helpers.chromeVersion() > 14 || helpers.safariVersion() > 7;
  490.           if (type !== 'cc-csc' && (!/^cc-/.test(type) || secureCCFill)) {
  491.             el.setAttribute('x-autocompletetype', type);
  492.             el.setAttribute('autocompletetype', type)
  493.           } else {
  494.             el.setAttribute('autocomplete', 'off')
  495.           }
  496.           if (!(type === 'country-name' || type === 'language' || type === 'sex' || type === 'gender-identity')) {
  497.             el.setAttribute('autocorrect', 'off');
  498.             el.setAttribute('spellcheck', 'off')
  499.           }
  500.           if (!(/name|honorific/.test(type) || (type === 'locality' || type === 'city' || type === 'adminstrative-area' || type === 'state' || type === 'province' || type === 'region' || type === 'language' || type === 'org' || type === 'organization-title' || type === 'sex' || type === 'gender-identity'))) {
  501.             return el.setAttribute('autocapitalize', 'off')
  502.           }
  503.         },
  504.         hashCode: function (str) {
  505.           var hash,
  506.           i,
  507.           j,
  508.           ref;
  509.           hash = 5381;
  510.           for (i = j = 0, ref = str.length; j < ref; i = j += 1) {
  511.             hash = (hash << 5) + hash + str.charCodeAt(i)
  512.           }
  513.           return (hash >>> 0) % 65535
  514.         },
  515.         clientLocale: function () {
  516.           return (window.navigator.languages || [
  517.           ]) [0] || window.navigator.userLanguage || window.navigator.language
  518.         },
  519.         dashToCamelCase: function (dashed) {
  520.           return dashed.replace(/-(\w)/g, function (match, char) {
  521.             return char.toUpperCase()
  522.           })
  523.         },
  524.         camelToDashCase: function (cameled) {
  525.           return cameled.replace(/([A-Z])/g, function (g) {
  526.             return '-' + g.toLowerCase()
  527.           })
  528.         },
  529.         isArray: Array.isArray || function (val) {
  530.           return {
  531.           }.toString.call(val) === '[object Array]'
  532.         },
  533.         extractBrowserFamily: function (userAgent) {
  534.           if (/SamsungBrowser/.test(userAgent)) {
  535.             return 'SamsungBrowser'
  536.           }
  537.           if (/\bInstagram\b/i.test(userAgent)) {
  538.             return 'Instagram'
  539.           }
  540.           if (/\bFirefox\b/i.test(userAgent)) {
  541.             return 'Firefox'
  542.           }
  543.           if (/Edge\//i.test(userAgent) || /Edg\//i.test(userAgent)) {
  544.             return 'IE Edge'
  545.           }
  546.           if (/(MSIE ([0-9]{1,}[.0-9]{0,})|Trident\/)/i.test(userAgent)) {
  547.             return 'IE'
  548.           }
  549.           if (/\bFB_IAB\b/.test(userAgent)) {
  550.             return 'Facebook'
  551.           }
  552.           if (/\bChrome\b/i.test(userAgent)) {
  553.             return 'Chrome'
  554.           }
  555.           if (/\bSafari\b/i.test(userAgent)) {
  556.             return 'Safari'
  557.           }
  558.           return 'Other'
  559.         }
  560.       };
  561.       module.exports = helpers
  562.     }).call(this)
  563.   }
  564. });
  565. StripeCheckout.require.define({
  566.   'lib/spellChecker': function (exports, require, module) {
  567.     (function () {
  568.       var levenshtein;
  569.       module.exports = {
  570.         levenshtein: levenshtein = function (str1, str2) {
  571.           var d,
  572.           i,
  573.           j,
  574.           k,
  575.           l,
  576.           m,
  577.           n,
  578.           o,
  579.           p,
  580.           ref,
  581.           ref1,
  582.           ref2,
  583.           ref3;
  584.           m = str1.length;
  585.           n = str2.length;
  586.           d = [
  587.           ];
  588.           if (!m) {
  589.             return n
  590.           }
  591.           if (!n) {
  592.             return m
  593.           }
  594.           for (i = k = 0, ref = m; 0 <= ref ? k <= ref : k >= ref; i = 0 <= ref ? ++k : --k) {
  595.             d[i] = [
  596.               i
  597.             ]
  598.           }
  599.           for (j = l = 1, ref1 = n; 1 <= ref1 ? l <= ref1 : l >= ref1; j = 1 <= ref1 ? ++l : --l) {
  600.             d[0][j] = j
  601.           }
  602.           for (i = o = 1, ref2 = m; 1 <= ref2 ? o <= ref2 : o >= ref2; i = 1 <= ref2 ? ++o : --o) {
  603.             for (j = p = 1, ref3 = n; 1 <= ref3 ? p <= ref3 : p >= ref3; j = 1 <= ref3 ? ++p : --p) {
  604.               if (str1[i - 1] === str2[j - 1]) {
  605.                 d[i][j] = d[i - 1][j - 1]
  606.               } else {
  607.                 d[i][j] = Math.min(d[i - 1][j], d[i][j - 1], d[i - 1][j - 1]) + 1
  608.               }
  609.             }
  610.           }
  611.           return d[m][n]
  612.         },
  613.         suggest: function (dictionary, badword, threshold) {
  614.           var dist,
  615.           k,
  616.           len,
  617.           maxDist,
  618.           suggestion,
  619.           word;
  620.           if (threshold == null) {
  621.             threshold = Infinity
  622.           }
  623.           maxDist = Infinity;
  624.           suggestion = null;
  625.           for (k = 0, len = dictionary.length; k < len; k++) {
  626.             word = dictionary[k];
  627.             dist = levenshtein(word, badword);
  628.             if (dist < maxDist) {
  629.               maxDist = dist;
  630.               suggestion = word
  631.             }
  632.           }
  633.           if (maxDist < threshold) {
  634.             return suggestion
  635.           } else {
  636.             return null
  637.           }
  638.         }
  639.       }
  640.     }).call(this)
  641.   }
  642. });
  643. StripeCheckout.require.define({
  644.   'lib/optionHelpers': function (exports, require, module) {
  645.     (function () {
  646.       var dumpObject,
  647.       flatten,
  648.       helpers,
  649.       identity,
  650.       prettyPrint,
  651.       repr,
  652.       toBoolean,
  653.       toNumber,
  654.       toString,
  655.       truncate;
  656.       helpers = require('lib/helpers');
  657.       flatten = function (obj) {
  658.         var flattened,
  659.         key,
  660.         ref,
  661.         val;
  662.         flattened = {
  663.         };
  664.         for (key in obj) {
  665.           val = obj[key];
  666.           if ((ref = typeof val) === 'function' || ref === 'object') {
  667.             flattened[key] = '' + val
  668.           } else {
  669.             flattened[key] = val
  670.           }
  671.         }
  672.         return JSON.stringify(flattened)
  673.       };
  674.       repr = function (val) {
  675.         switch (typeof val) {
  676.           case 'function':
  677.             return '"' + val + '"';
  678.           case 'object':
  679.             return flatten(val);
  680.           default:
  681.             return '' + JSON.stringify(val)
  682.         }
  683.       };
  684.       truncate = function (val, cap) {
  685.         if (val.length - 3 > cap) {
  686.           return val.slice(0, cap - 3) + '...'
  687.         } else {
  688.           return val
  689.         }
  690.       };
  691.       dumpObject = function (obj) {
  692.         return truncate(repr(obj), 50)
  693.       };
  694.       prettyPrint = function (key, rawOptions) {
  695.         var original,
  696.         ref;
  697.         original = (ref = rawOptions.__originals) != null ? ref[key] : void 0;
  698.         if (original) {
  699.           return original
  700.         } else if (rawOptions.buttonIntegration) {
  701.           return 'data-' + helpers.camelToDashCase(key)
  702.         } else {
  703.           return key
  704.         }
  705.       };
  706.       toBoolean = function (val) {
  707.         return val !== 'false' && val !== false && val != null
  708.       };
  709.       toNumber = function (val) {
  710.         if (typeof val === 'number') {
  711.           return val
  712.         } else if (typeof val === 'string') {
  713.           return parseInt(val)
  714.         }
  715.       };
  716.       toString = function (val) {
  717.         if (val == null) {
  718.           return ''
  719.         } else {
  720.           return '' + val
  721.         }
  722.       };
  723.       identity = function (val) {
  724.         return val
  725.       };
  726.       module.exports = {
  727.         prettyPrint: prettyPrint,
  728.         flatten: flatten,
  729.         repr: repr,
  730.         truncate: truncate,
  731.         dumpObject: dumpObject,
  732.         toBoolean: toBoolean,
  733.         toNumber: toNumber,
  734.         toString: toString,
  735.         identity: identity
  736.       }
  737.     }).call(this)
  738.   }
  739. });
  740. StripeCheckout.require.define({
  741.   'lib/paymentMethods': function (exports, require, module) {
  742.     (function () {
  743.       var ERROR,
  744.       METHODS,
  745.       OPTIONAL,
  746.       PRETTY_METHODS,
  747.       PRIVATE,
  748.       REQUIRED,
  749.       WARNING,
  750.       _exports,
  751.       alipayEnabled,
  752.       alipayToCanonical,
  753.       canonicalize,
  754.       checkContext,
  755.       checkNoDuplicates,
  756.       checkNoOldAPI,
  757.       coerceDefaults,
  758.       deepMethodTypeCheck,
  759.       helpers,
  760.       isValidMethod,
  761.       methodName,
  762.       methodsArrayToDict,
  763.       optionHelpers,
  764.       optionValidator,
  765.       ref,
  766.       ref1,
  767.       simpleMethodTypeCheck,
  768.       simpleToCanonical,
  769.       singleMethodTypeCheck,
  770.       spec,
  771.       transformMethods,
  772.       hasProp = {
  773.       }.hasOwnProperty,
  774.       indexOf = [
  775.       ].indexOf || function (item) {
  776.         for (var i = 0, l = this.length; i < l; i++) {
  777.           if (i in this && this[i] === item) return i
  778.         }
  779.         return - 1
  780.       };
  781.       helpers = require('lib/helpers');
  782.       optionHelpers = require('lib/optionHelpers');
  783.       optionValidator = require('lib/optionValidator');
  784.       ref = optionValidator.severities,
  785.       ERROR = ref.ERROR,
  786.       WARNING = ref.WARNING;
  787.       ref1 = optionValidator.importances,
  788.       OPTIONAL = ref1.OPTIONAL,
  789.       REQUIRED = ref1.REQUIRED,
  790.       PRIVATE = ref1.PRIVATE;
  791.       alipayEnabled = function (key, val, options) {
  792.         var prettyAlipay,
  793.         type;
  794.         type = typeof val;
  795.         if (type !== 'boolean' && val !== 'auto') {
  796.           prettyAlipay = optionHelpers.prettyPrint('alipay', options);
  797.           return {
  798.             type: WARNING,
  799.             message: 'The \'' + prettyAlipay + '\' option can be true, false, or \'auto\', but instead we found ' + optionHelpers.dumpObject(val) + '.'
  800.           }
  801.         } else {
  802.           return null
  803.         }
  804.       };
  805.       METHODS = {
  806.         alipay: {
  807.           method: {
  808.             importance: REQUIRED,
  809.             spec: optionValidator.ignore,
  810.             checkContext: optionValidator.ignore
  811.           },
  812.           enabled: {
  813.             importance: REQUIRED,
  814.             spec: alipayEnabled,
  815.             checkContext: optionValidator.ignore,
  816.             'default': false
  817.           },
  818.           reusable: {
  819.             importance: OPTIONAL,
  820.             spec: optionValidator.isNullableBoolean,
  821.             checkContext: optionValidator.ignore,
  822.             'default': false
  823.           }
  824.         },
  825.         card: {
  826.           method: {
  827.             importance: REQUIRED,
  828.             spec: optionValidator.ignore,
  829.             checkContext: optionValidator.ignore
  830.           },
  831.           enabled: {
  832.             importance: OPTIONAL,
  833.             spec: optionValidator.isBoolean,
  834.             checkContext: optionValidator.ignore,
  835.             'default': true
  836.           }
  837.         },
  838.         bitcoin: {
  839.           method: {
  840.             importance: REQUIRED,
  841.             spec: optionValidator.ignore,
  842.             checkContext: optionValidator.ignore
  843.           },
  844.           enabled: {
  845.             importance: OPTIONAL,
  846.             spec: optionValidator.isBoolean,
  847.             checkContext: optionValidator.ignore,
  848.             'default': false
  849.           }
  850.         }
  851.       };
  852.       isValidMethod = function (method) {
  853.         return method in METHODS
  854.       };
  855.       PRETTY_METHODS = function () {
  856.         var method,
  857.         methods,
  858.         n;
  859.         methods = function () {
  860.           var results;
  861.           results = [
  862.           ];
  863.           for (method in METHODS) {
  864.             results.push('\'' + method + '\'')
  865.           }
  866.           return results
  867.         }();
  868.         n = methods.length;
  869.         methods[n - 1] = 'or ' + methods[n - 1];
  870.         return methods.join(', ')
  871.       }();
  872.       simpleMethodTypeCheck = function (method) {
  873.         var prettyMethod;
  874.         if (!isValidMethod(method)) {
  875.           prettyMethod = optionHelpers.dumpObject(methodSettings.method);
  876.           return {
  877.             type: ERROR,
  878.             message: '\'' + method + '\' is not a valid payment method. It must be one of ' + PRETTY_METHODS
  879.           }
  880.         } else {
  881.           return null
  882.         }
  883.       };
  884.       deepMethodTypeCheck = function (methodSettings) {
  885.         var error,
  886.         errors,
  887.         optionSpec,
  888.         ref2,
  889.         warnings;
  890.         error = simpleMethodTypeCheck(methodSettings.method);
  891.         if (error != null) {
  892.           return error
  893.         }
  894.         optionSpec = METHODS[methodSettings.method];
  895.         ref2 = optionValidator.validate(optionSpec, methodSettings),
  896.         errors = ref2.errors,
  897.         warnings = ref2.warnings;
  898.         errors = errors.concat(warnings);
  899.         if (errors.length > 0) {
  900.           return {
  901.             type: ERROR,
  902.             message: 'Error when checking the \'' + methodSettings.method + '\' method:\n' + errors[0].toString()
  903.           }
  904.         } else {
  905.           return null
  906.         }
  907.       };
  908.       singleMethodTypeCheck = function (method, idx) {
  909.         var methodSettings,
  910.         pretty;
  911.         if (typeof method === 'string') {
  912.           return simpleMethodTypeCheck(method)
  913.         } else if ((method != null ? method.method : void 0) != null) {
  914.           methodSettings = method;
  915.           return deepMethodTypeCheck(methodSettings)
  916.         } else {
  917.           pretty = optionHelpers.dumpObject(methodSettings);
  918.           return {
  919.             type: ERROR,
  920.             message: 'All elements of paymentMethods need to be either an object with a \'method\' property or one of these strings: ' + PRETTY_METHODS + '.\n At index ' + idx + ' we found \'' + pretty + '\' which was neither.'
  921.           }
  922.         }
  923.       };
  924.       spec = function (key, val, options) {
  925.         var actualType,
  926.         error,
  927.         i,
  928.         idx,
  929.         len,
  930.         method;
  931.         if (val === null) {
  932.           return null
  933.         }
  934.         if (!helpers.isArray(val)) {
  935.           actualType = val === null ? 'null' : typeof val;
  936.           return {
  937.             type: ERROR,
  938.             message: 'Looking for an Array, but instead we found \'' + actualType + '\'.'
  939.           }
  940.         }
  941.         for (idx = i = 0, len = val.length; i < len; idx = ++i) {
  942.           method = val[idx];
  943.           error = singleMethodTypeCheck(method, idx);
  944.           if (error != null) {
  945.             return error
  946.           }
  947.         }
  948.         return null
  949.       };
  950.       checkNoDuplicates = function (val) {
  951.         var i,
  952.         idx,
  953.         len,
  954.         method,
  955.         ref2,
  956.         sortedMethods,
  957.         usedMethods;
  958.         usedMethods = function () {
  959.           var i,
  960.           len,
  961.           results;
  962.           results = [
  963.           ];
  964.           for (i = 0, len = val.length; i < len; i++) {
  965.             method = val[i];
  966.             if (typeof method === 'string') {
  967.               results.push(method)
  968.             } else if ((method != null ? method.method : void 0) != null) {
  969.               results.push(method.method)
  970.             } else {
  971.               results.push(null)
  972.             }
  973.           }
  974.           return results
  975.         }();
  976.         sortedMethods = usedMethods.concat().sort();
  977.         ref2 = sortedMethods.slice(1);
  978.         for (idx = i = 0, len = ref2.length; i < len; idx = ++i) {
  979.           method = ref2[idx];
  980.           if (method === sortedMethods[idx]) {
  981.             return {
  982.               type: ERROR,
  983.               message: 'You\'ve configured the payment method \'' + method + '\' multiple times.'
  984.             }
  985.           }
  986.         }
  987.         return null
  988.       };
  989.       checkNoOldAPI = function (options) {
  990.         var alipay,
  991.         alipayReusable,
  992.         bitcoin,
  993.         paymentMethods;
  994.         if (options.alipay != null || options.bitcoin != null || options.alipayReusable != null) {
  995.           alipay = optionHelpers.prettyPrint('alipay', options);
  996.           alipayReusable = optionHelpers.prettyPrint('alipayReusable', options);
  997.           bitcoin = optionHelpers.prettyPrint('bitcoin', options);
  998.           paymentMethods = optionHelpers.prettyPrint('paymentMethods', options);
  999.           return {
  1000.             type: ERROR,
  1001.             message: 'Setting any of the the \'' + alipay + '\', \'' + alipayReusable + '\', or \'' + bitcoin + '\' options is disallowed if you are using \'' + paymentMethods + '\'.'
  1002.           }
  1003.         } else {
  1004.           return null
  1005.         }
  1006.       };
  1007.       checkContext = function (key, val, options) {
  1008.         var error;
  1009.         error = checkNoOldAPI(options);
  1010.         if (error != null) {
  1011.           return error
  1012.         }
  1013.         if (val == null) {
  1014.           return
  1015.         }
  1016.         return checkNoDuplicates(val)
  1017.       };
  1018.       coerceDefaults = function (methodSpec, methodSettings) {
  1019.         var results,
  1020.         setting;
  1021.         results = [
  1022.         ];
  1023.         for (setting in methodSpec) {
  1024.           if (methodSettings[setting] == null) {
  1025.             results.push(methodSettings[setting] = methodSpec[setting]['default'])
  1026.           } else {
  1027.             results.push(void 0)
  1028.           }
  1029.         }
  1030.         return results
  1031.       };
  1032.       simpleToCanonical = function (method, enabled) {
  1033.         var methodSettings;
  1034.         methodSettings = {
  1035.           method: method,
  1036.           enabled: enabled
  1037.         };
  1038.         coerceDefaults(METHODS[method], methodSettings);
  1039.         return methodSettings
  1040.       };
  1041.       alipayToCanonical = function (enabled, reusable) {
  1042.         var methodSettings;
  1043.         methodSettings = {
  1044.           method: 'alipay',
  1045.           enabled: enabled,
  1046.           reusable: reusable
  1047.         };
  1048.         coerceDefaults(METHODS.alipay, methodSettings);
  1049.         return methodSettings
  1050.       };
  1051.       transformMethods = function (paymentMethods) {
  1052.         var has,
  1053.         hasMethod,
  1054.         i,
  1055.         len,
  1056.         method,
  1057.         methodSettings,
  1058.         result;
  1059.         result = [
  1060.         ];
  1061.         has = {
  1062.         };
  1063.         for (method in METHODS) {
  1064.           has[method] = false
  1065.         }
  1066.         for (i = 0, len = paymentMethods.length; i < len; i++) {
  1067.           method = paymentMethods[i];
  1068.           if (typeof method === 'string') {
  1069.             result.push(simpleToCanonical(method, true));
  1070.             has[method] = true
  1071.           } else {
  1072.             methodSettings = method;
  1073.             if (methodSettings['enabled'] == null) {
  1074.               methodSettings['enabled'] = true
  1075.             }
  1076.             coerceDefaults(METHODS[methodSettings.method], methodSettings);
  1077.             has[methodSettings.method] = true;
  1078.             result.push(methodSettings)
  1079.           }
  1080.         }
  1081.         for (method in has) {
  1082.           hasMethod = has[method];
  1083.           if (!hasMethod) {
  1084.             result.push(simpleToCanonical(method, false))
  1085.           }
  1086.         }
  1087.         return result
  1088.       };
  1089.       methodsArrayToDict = function (paymentMethods) {
  1090.         var enabled,
  1091.         i,
  1092.         len,
  1093.         methodSettings,
  1094.         settings;
  1095.         settings = {
  1096.         };
  1097.         enabled = [
  1098.         ];
  1099.         for (i = 0, len = paymentMethods.length; i < len; i++) {
  1100.           methodSettings = paymentMethods[i];
  1101.           settings[methodSettings.method] = methodSettings;
  1102.           if (methodSettings.enabled !== false) {
  1103.             enabled.push(methodSettings.method)
  1104.           }
  1105.         }
  1106.         return {
  1107.           settings: settings,
  1108.           enabled: enabled
  1109.         }
  1110.       };
  1111.       canonicalize = function (rawOptions) {
  1112.         var blacklist,
  1113.         hasAlipay,
  1114.         option,
  1115.         result,
  1116.         val;
  1117.         result = {
  1118.         };
  1119.         blacklist = [
  1120.           'bitcoin',
  1121.           'alipay',
  1122.           'alipayReusable'
  1123.         ];
  1124.         for (option in rawOptions) {
  1125.           if (!hasProp.call(rawOptions, option)) continue;
  1126.           val = rawOptions[option];
  1127.           if (indexOf.call(blacklist, option) < 0) {
  1128.             result[option] = val
  1129.           }
  1130.         }
  1131.         if (rawOptions.paymentMethods != null) {
  1132.           result.paymentMethods = methodsArrayToDict(transformMethods(rawOptions.paymentMethods))
  1133.         } else {
  1134.           hasAlipay = rawOptions.alipay || rawOptions.alipayReusable || false;
  1135.           result.paymentMethods = methodsArrayToDict([simpleToCanonical('card', true),
  1136.           simpleToCanonical('bitcoin', rawOptions.bitcoin || false),
  1137.           alipayToCanonical(hasAlipay, rawOptions.alipayReusable)])
  1138.         }
  1139.         return result
  1140.       };
  1141.       _exports = {
  1142.         alipayEnabled: alipayEnabled,
  1143.         spec: spec,
  1144.         checkContext: checkContext,
  1145.         canonicalize: canonicalize,
  1146.         methods: function () {
  1147.           var results;
  1148.           results = [
  1149.           ];
  1150.           for (methodName in METHODS) {
  1151.             results.push(methodName)
  1152.           }
  1153.           return results
  1154.         }()
  1155.       };
  1156.       for (methodName in METHODS) {
  1157.         _exports[methodName] = methodName
  1158.       }
  1159.       module.exports = _exports
  1160.     }).call(this)
  1161.   }
  1162. });
  1163. StripeCheckout.require.define({
  1164.   'lib/optionSpecs': function (exports, require, module) {
  1165.     (function () {
  1166.       var BOOLEAN,
  1167.       BUTTON,
  1168.       BUTTON_CONFIGURE_OPTIONS,
  1169.       BUTTON_OPEN_OPTIONS,
  1170.       CUSTOM,
  1171.       CUSTOM_CONFIGURE_OPTIONS,
  1172.       CUSTOM_OPEN_OPTIONS,
  1173.       ERROR,
  1174.       NULLABLE_BOOLEAN,
  1175.       NULLABLE_NUMBER,
  1176.       NULLABLE_STRING,
  1177.       NULLABLE_URL,
  1178.       NUMBER,
  1179.       OPTIONAL,
  1180.       OPTIONS,
  1181.       OTHER,
  1182.       PRIVATE,
  1183.       REQUIRED,
  1184.       STRING,
  1185.       URL,
  1186.       WARNING,
  1187.       generateOptions,
  1188.       helpers,
  1189.       option,
  1190.       optionHelpers,
  1191.       optionValidator,
  1192.       optsettings,
  1193.       paymentMethods,
  1194.       ref,
  1195.       ref1;
  1196.       helpers = require('lib/helpers');
  1197.       optionHelpers = require('lib/optionHelpers');
  1198.       paymentMethods = require('lib/paymentMethods');
  1199.       optionValidator = require('lib/optionValidator');
  1200.       ref = optionValidator.severities,
  1201.       ERROR = ref.ERROR,
  1202.       WARNING = ref.WARNING;
  1203.       ref1 = optionValidator.importances,
  1204.       OPTIONAL = ref1.OPTIONAL,
  1205.       REQUIRED = ref1.REQUIRED,
  1206.       PRIVATE = ref1.PRIVATE;
  1207.       BUTTON = 'button';
  1208.       CUSTOM = 'custom';
  1209.       STRING = 'string';
  1210.       URL = 'url';
  1211.       BOOLEAN = 'boolean';
  1212.       NUMBER = 'number';
  1213.       NULLABLE_STRING = 'null-string';
  1214.       NULLABLE_URL = 'null-url';
  1215.       NULLABLE_BOOLEAN = 'null-boolean';
  1216.       NULLABLE_NUMBER = 'null-number';
  1217.       OTHER = 'other';
  1218.       OPTIONS = {
  1219.         address: {
  1220.           importance: PRIVATE,
  1221.           type: OTHER,
  1222.           checkContext: function (key, val, options) {
  1223.             var prettyAddress,
  1224.             prettyBilling;
  1225.             prettyAddress = optionHelpers.prettyPrint('address', options);
  1226.             prettyBilling = optionHelpers.prettyPrint('billingAddress', options);
  1227.             return {
  1228.               type: WARNING,
  1229.               message: '\'' + prettyAddress + '\' is deprecated.  Use \'' + prettyBilling + '\' instead.'
  1230.             }
  1231.           }
  1232.         },
  1233.         alipay: {
  1234.           importance: OPTIONAL,
  1235.           type: OTHER,
  1236.           coerceTo: function (val) {
  1237.             if (val === 'auto') {
  1238.               return val
  1239.             }
  1240.             return optionHelpers.toBoolean(val)
  1241.           },
  1242.           spec: function (key, val, options) {
  1243.             if (val === null) {
  1244.               return null
  1245.             } else {
  1246.               return paymentMethods.alipayEnabled(key, val, options)
  1247.             }
  1248.           }
  1249.         },
  1250.         alipayReusable: {
  1251.           importance: OPTIONAL,
  1252.           type: NULLABLE_BOOLEAN,
  1253.           checkContext: optionValidator.xRequiresY('alipayReusable', 'alipay')
  1254.         },
  1255.         allowRememberMe: {
  1256.           importance: OPTIONAL,
  1257.           type: NULLABLE_BOOLEAN,
  1258.           'default': true
  1259.         },
  1260.         amount: {
  1261.           importance: OPTIONAL,
  1262.           type: NULLABLE_NUMBER
  1263.         },
  1264.         billingAddress: {
  1265.           importance: OPTIONAL,
  1266.           type: NULLABLE_BOOLEAN
  1267.         },
  1268.         bitcoin: {
  1269.           importance: OPTIONAL,
  1270.           type: NULLABLE_BOOLEAN
  1271.         },
  1272.         buttonIntegration: {
  1273.           importance: PRIVATE,
  1274.           type: BOOLEAN,
  1275.           'default': false
  1276.         },
  1277.         closed: {
  1278.           only: CUSTOM,
  1279.           importance: OPTIONAL,
  1280.           type: OTHER
  1281.         },
  1282.         color: {
  1283.           importance: PRIVATE,
  1284.           type: STRING
  1285.         },
  1286.         createSource: {
  1287.           importance: PRIVATE,
  1288.           type: BOOLEAN
  1289.         },
  1290.         currency: {
  1291.           importance: OPTIONAL,
  1292.           type: NULLABLE_STRING,
  1293.           'default': 'usd'
  1294.         },
  1295.         description: {
  1296.           importance: OPTIONAL,
  1297.           type: NULLABLE_STRING
  1298.         },
  1299.         email: {
  1300.           importance: OPTIONAL,
  1301.           type: NULLABLE_STRING
  1302.         },
  1303.         image: {
  1304.           importance: OPTIONAL,
  1305.           type: NULLABLE_URL
  1306.         },
  1307.         key: {
  1308.           importance: REQUIRED,
  1309.           type: STRING
  1310.         },
  1311.         label: {
  1312.           only: BUTTON,
  1313.           importance: OPTIONAL,
  1314.           type: NULLABLE_STRING
  1315.         },
  1316.         locale: {
  1317.           importance: OPTIONAL,
  1318.           type: NULLABLE_STRING
  1319.         },
  1320.         name: {
  1321.           importance: OPTIONAL,
  1322.           type: NULLABLE_STRING
  1323.         },
  1324.         nostyle: {
  1325.           importance: PRIVATE,
  1326.           type: BOOLEAN
  1327.         },
  1328.         notrack: {
  1329.           importance: PRIVATE,
  1330.           type: BOOLEAN
  1331.         },
  1332.         opened: {
  1333.           only: CUSTOM,
  1334.           importance: OPTIONAL,
  1335.           type: OTHER
  1336.         },
  1337.         panelLabel: {
  1338.           importance: OPTIONAL,
  1339.           type: NULLABLE_STRING
  1340.         },
  1341.         paymentMethods: {
  1342.           only: CUSTOM,
  1343.           importance: OPTIONAL,
  1344.           type: OTHER,
  1345.           spec: paymentMethods.spec,
  1346.           checkContext: paymentMethods.checkContext
  1347.         },
  1348.         referrer: {
  1349.           importance: PRIVATE,
  1350.           type: URL
  1351.         },
  1352.         shippingAddress: {
  1353.           importance: OPTIONAL,
  1354.           type: NULLABLE_BOOLEAN,
  1355.           checkContext: optionValidator.xRequiresY('shippingAddress', 'billingAddress')
  1356.         },
  1357.         source: {
  1358.           importance: OPTIONAL,
  1359.           type: OTHER,
  1360.           only: CUSTOM,
  1361.           checkContext: optionValidator.xPrecludesY('source', 'token')
  1362.         },
  1363.         supportsTokenCallback: {
  1364.           importance: PRIVATE,
  1365.           type: BOOLEAN
  1366.         },
  1367.         timeLoaded: {
  1368.           importance: PRIVATE,
  1369.           type: OTHER
  1370.         },
  1371.         token: {
  1372.           importance: function (integrationType, isConfigure) {
  1373.             if (isConfigure) {
  1374.               return OPTIONAL
  1375.             } else {
  1376.               if (integrationType === BUTTON) {
  1377.                 return REQUIRED
  1378.               } else {
  1379.                 return function (option, val, rawOptions) {
  1380.                   if (!val && !rawOptions['source']) {
  1381.                     return new optionValidator.ErrorMissingOneOfRequired(rawOptions, option, 'source')
  1382.                   } else {
  1383.                     return null
  1384.                   }
  1385.                 }
  1386.               }
  1387.             }
  1388.           },
  1389.           type: OTHER
  1390.         },
  1391.         trace: {
  1392.           importance: PRIVATE,
  1393.           type: BOOLEAN
  1394.         },
  1395.         url: {
  1396.           importance: PRIVATE,
  1397.           type: URL
  1398.         },
  1399.         zipCode: {
  1400.           importance: OPTIONAL,
  1401.           type: NULLABLE_BOOLEAN
  1402.         },
  1403.         __originals: {
  1404.           importance: PRIVATE,
  1405.           type: OTHER
  1406.         }
  1407.       };
  1408.       for (option in OPTIONS) {
  1409.         optsettings = OPTIONS[option];
  1410.         if (optsettings.coerceTo == null) {
  1411.           optsettings.coerceTo = function () {
  1412.             switch (optsettings.type) {
  1413.               case STRING:
  1414.               case NULLABLE_STRING:
  1415.                 return optionHelpers.toString;
  1416.               case BOOLEAN:
  1417.               case NULLABLE_BOOLEAN:
  1418.                 return optionHelpers.toBoolean;
  1419.               case NUMBER:
  1420.               case NULLABLE_NUMBER:
  1421.                 return optionHelpers.toNumber;
  1422.               case URL:
  1423.               case NULLABLE_URL:
  1424.                 return helpers.sanitizeURL;
  1425.               case OTHER:
  1426.                 return optionHelpers.identity
  1427.             }
  1428.           }()
  1429.         }
  1430.         if (optsettings.spec == null) {
  1431.           optsettings.spec = function () {
  1432.             switch (optsettings.type) {
  1433.               case STRING:
  1434.               case URL:
  1435.                 return optionValidator.isString;
  1436.               case BOOLEAN:
  1437.                 return optionValidator.isBoolean;
  1438.               case NUMBER:
  1439.                 return optionValidator.isNumber;
  1440.               case NULLABLE_STRING:
  1441.               case NULLABLE_URL:
  1442.                 return optionValidator.isNullableString;
  1443.               case NULLABLE_BOOLEAN:
  1444.                 return optionValidator.isNullableBoolean;
  1445.               case NULLABLE_NUMBER:
  1446.                 return optionValidator.isNullableNumber;
  1447.               case OTHER:
  1448.                 return optionValidator.ignore
  1449.             }
  1450.           }()
  1451.         }
  1452.         if (optsettings.checkContext == null) {
  1453.           optsettings.checkContext = optionValidator.ignore
  1454.         }
  1455.       }
  1456.       generateOptions = function (arg) {
  1457.         var _optsettings,
  1458.         isConfigure,
  1459.         only,
  1460.         result,
  1461.         setting,
  1462.         val;
  1463.         only = arg.only,
  1464.         isConfigure = arg.isConfigure;
  1465.         result = {
  1466.         };
  1467.         for (option in OPTIONS) {
  1468.           _optsettings = OPTIONS[option];
  1469.           if (_optsettings.only != null && _optsettings.only !== only) {
  1470.             continue
  1471.           }
  1472.           optsettings = {
  1473.           };
  1474.           for (setting in _optsettings) {
  1475.             val = _optsettings[setting];
  1476.             if (setting === 'importance') {
  1477.               if (typeof val === 'string') {
  1478.                 optsettings[setting] = val
  1479.               } else {
  1480.                 optsettings[setting] = val(only, isConfigure)
  1481.               }
  1482.             } else {
  1483.               optsettings[setting] = val
  1484.             }
  1485.           }
  1486.           result[option] = optsettings
  1487.         }
  1488.         return result
  1489.       };
  1490.       BUTTON_CONFIGURE_OPTIONS = generateOptions({
  1491.         only: BUTTON,
  1492.         isConfigure: true
  1493.       });
  1494.       BUTTON_OPEN_OPTIONS = generateOptions({
  1495.         only: BUTTON,
  1496.         isConfigure: false
  1497.       });
  1498.       CUSTOM_CONFIGURE_OPTIONS = generateOptions({
  1499.         only: CUSTOM,
  1500.         isConfigure: true
  1501.       });
  1502.       CUSTOM_OPEN_OPTIONS = generateOptions({
  1503.         only: CUSTOM,
  1504.         isConfigure: false
  1505.       });
  1506.       module.exports = {
  1507.         _OPTIONS: OPTIONS,
  1508.         types: {
  1509.           STRING: STRING,
  1510.           BOOLEAN: BOOLEAN,
  1511.           NUMBER: NUMBER,
  1512.           NULLABLE_STRING: NULLABLE_STRING,
  1513.           NULLABLE_URL: NULLABLE_URL,
  1514.           NULLABLE_BOOLEAN: NULLABLE_BOOLEAN,
  1515.           NULLABLE_NUMBER: NULLABLE_NUMBER,
  1516.           URL: URL,
  1517.           OTHER: OTHER
  1518.         },
  1519.         buttonConfigureOptions: BUTTON_CONFIGURE_OPTIONS,
  1520.         buttonOpenOptions: BUTTON_OPEN_OPTIONS,
  1521.         customConfigureOptions: CUSTOM_CONFIGURE_OPTIONS,
  1522.         customOpenOptions: CUSTOM_OPEN_OPTIONS,
  1523.         all: [
  1524.           BUTTON_CONFIGURE_OPTIONS,
  1525.           BUTTON_OPEN_OPTIONS,
  1526.           CUSTOM_CONFIGURE_OPTIONS,
  1527.           CUSTOM_OPEN_OPTIONS
  1528.         ]
  1529.       }
  1530.     }).call(this)
  1531.   }
  1532. });
  1533. StripeCheckout.require.define({
  1534.   'lib/optionValidator': function (exports, require, module) {
  1535.     (function () {
  1536.       var ERROR,
  1537.       ErrorMissingOneOfRequired,
  1538.       ErrorMissingRequired,
  1539.       ErrorMisspelledRequired,
  1540.       OPTIONAL,
  1541.       PRIVATE,
  1542.       REQUIRED,
  1543.       WARNING,
  1544.       WarnBadContext,
  1545.       WarnMisspelledOptional,
  1546.       WarnOptionTypeError,
  1547.       WarnUnrecognized,
  1548.       checkConditionallyRequiredOptions,
  1549.       checkOptionContexts,
  1550.       checkOptionTypes,
  1551.       checkRequiredOptions,
  1552.       checkUnrecognizedOptions,
  1553.       coerceOption,
  1554.       fromSpec,
  1555.       ignore,
  1556.       isBoolean,
  1557.       isNullableBoolean,
  1558.       isNullableNumber,
  1559.       isNullableString,
  1560.       isNumber,
  1561.       isRequired,
  1562.       isString,
  1563.       optionHelpers,
  1564.       simpleNullableTypeCheck,
  1565.       simpleTypeCheck,
  1566.       spellChecker,
  1567.       validate,
  1568.       xPrecludesY,
  1569.       xRequiresY,
  1570.       indexOf = [
  1571.       ].indexOf || function (item) {
  1572.         for (var i = 0, l = this.length; i < l; i++) {
  1573.           if (i in this && this[i] === item) return i
  1574.         }
  1575.         return - 1
  1576.       };
  1577.       spellChecker = require('lib/spellChecker');
  1578.       optionHelpers = require('lib/optionHelpers');
  1579.       ERROR = 'error';
  1580.       WARNING = 'warning';
  1581.       OPTIONAL = 'optional';
  1582.       REQUIRED = 'required';
  1583.       PRIVATE = 'private';
  1584.       isRequired = function (importance) {
  1585.         return importance === REQUIRED
  1586.       };
  1587.       fromSpec = function (optionSpec) {
  1588.         var opt,
  1589.         val;
  1590.         return {
  1591.           all: optionSpec,
  1592.           required: function () {
  1593.             var results;
  1594.             results = [
  1595.             ];
  1596.             for (opt in optionSpec) {
  1597.               val = optionSpec[opt];
  1598.               if (isRequired(val.importance)) {
  1599.                 results.push(opt)
  1600.               }
  1601.             }
  1602.             return results
  1603.           }(),
  1604.           conditionallyRequired: function () {
  1605.             var results;
  1606.             results = [
  1607.             ];
  1608.             for (opt in optionSpec) {
  1609.               val = optionSpec[opt];
  1610.               if (typeof val.importance === 'function') {
  1611.                 results.push(opt)
  1612.               }
  1613.             }
  1614.             return results
  1615.           }(),
  1616.           suggestable: function () {
  1617.             var results;
  1618.             results = [
  1619.             ];
  1620.             for (opt in optionSpec) {
  1621.               val = optionSpec[opt];
  1622.               if (val.importance !== PRIVATE) {
  1623.                 results.push(opt)
  1624.               }
  1625.             }
  1626.             return results
  1627.           }()
  1628.         }
  1629.       };
  1630.       simpleTypeCheck = function (expectedType, val) {
  1631.         var actualType;
  1632.         actualType = typeof val;
  1633.         if (actualType !== expectedType) {
  1634.           if (val === null) {
  1635.             actualType = 'null'
  1636.           }
  1637.           return {
  1638.             type: WARNING,
  1639.             message: 'Looking for type \'' + expectedType + '\', but instead we found \'' + actualType + '\'.'
  1640.           }
  1641.         } else {
  1642.           return null
  1643.         }
  1644.       };
  1645.       simpleNullableTypeCheck = function (expectedType, val) {
  1646.         if (val === null) {
  1647.           return null
  1648.         }
  1649.         return simpleTypeCheck(expectedType, val)
  1650.       };
  1651.       isString = function (key, val, options) {
  1652.         return simpleTypeCheck('string', val)
  1653.       };
  1654.       isBoolean = function (key, val, options) {
  1655.         return simpleTypeCheck('boolean', val)
  1656.       };
  1657.       isNumber = function (key, val, options) {
  1658.         return simpleTypeCheck('number', val)
  1659.       };
  1660.       isNullableString = function (key, val, options) {
  1661.         return simpleNullableTypeCheck('string', val)
  1662.       };
  1663.       isNullableBoolean = function (key, val, options) {
  1664.         return simpleNullableTypeCheck('boolean', val)
  1665.       };
  1666.       isNullableNumber = function (key, val, options) {
  1667.         return simpleNullableTypeCheck('number', val)
  1668.       };
  1669.       ignore = function () {
  1670.         return null
  1671.       };
  1672.       xRequiresY = function (requiring, required) {
  1673.         return function (key, val, options) {
  1674.           var prettyRequired,
  1675.           prettyRequiring;
  1676.           if (!options[required]) {
  1677.             prettyRequired = optionHelpers.prettyPrint(required, options);
  1678.             prettyRequiring = optionHelpers.prettyPrint(requiring, options);
  1679.             return {
  1680.               type: WARNING,
  1681.               message: '\'' + prettyRequired + '\' must be enabled whenever \'' + prettyRequiring + '\' is.'
  1682.             }
  1683.           }
  1684.         }
  1685.       };
  1686.       xPrecludesY = function (x, y) {
  1687.         return function (key, val, options) {
  1688.           var prettyX,
  1689.           prettyY;
  1690.           if (options[x] && options[y]) {
  1691.             prettyX = optionHelpers.prettyPrint(x, options);
  1692.             prettyY = optionHelpers.prettyPrint(y, options);
  1693.             return {
  1694.               type: ERROR,
  1695.               message: 'The options \'' + prettyX + '\' and \'' + prettyY + '\' can not be used at the same time.'
  1696.             }
  1697.           }
  1698.         }
  1699.       };
  1700.       ErrorMissingRequired = function () {
  1701.         function ErrorMissingRequired(rawOptions1, key1) {
  1702.           this.rawOptions = rawOptions1;
  1703.           this.key = key1
  1704.         }
  1705.         ErrorMissingRequired.prototype.toString = function () {
  1706.           var key;
  1707.           key = optionHelpers.prettyPrint(this.key, this.rawOptions);
  1708.           return '\'' + key + '\' is a required option, but was not found.'
  1709.         };
  1710.         ErrorMissingRequired.prototype.trackedInfo = function () {
  1711.           return {
  1712.             result: 'ErrorMissingRequired',
  1713.             key: this.key
  1714.           }
  1715.         };
  1716.         return ErrorMissingRequired
  1717.       }();
  1718.       ErrorMissingOneOfRequired = function () {
  1719.         function ErrorMissingOneOfRequired(rawOptions1, keyA1, keyB1) {
  1720.           this.rawOptions = rawOptions1;
  1721.           this.keyA = keyA1;
  1722.           this.keyB = keyB1
  1723.         }
  1724.         ErrorMissingOneOfRequired.prototype.toString = function () {
  1725.           var keyA,
  1726.           keyB;
  1727.           keyA = optionHelpers.prettyPrint(this.keyA, this.rawOptions);
  1728.           keyB = optionHelpers.prettyPrint(this.keyB, this.rawOptions);
  1729.           return 'Either \'' + keyA + '\' or \'' + keyB + '\' is a required option, but neither was found.'
  1730.         };
  1731.         ErrorMissingOneOfRequired.prototype.trackedInfo = function () {
  1732.           return {
  1733.             result: 'ErrorMissingOneOfRequired',
  1734.             key: this.keyA
  1735.           }
  1736.         };
  1737.         return ErrorMissingOneOfRequired
  1738.       }();
  1739.       ErrorMisspelledRequired = function () {
  1740.         function ErrorMisspelledRequired(rawOptions1, expected1, actual1) {
  1741.           this.rawOptions = rawOptions1;
  1742.           this.expected = expected1;
  1743.           this.actual = actual1
  1744.         }
  1745.         ErrorMisspelledRequired.prototype.toString = function () {
  1746.           var actual,
  1747.           expected;
  1748.           expected = optionHelpers.prettyPrint(this.expected, this.rawOptions);
  1749.           actual = optionHelpers.prettyPrint(this.actual, this.rawOptions);
  1750.           return 'Unrecognized option \'' + actual + '\'. Did you mean \'' + expected + '\'? (\'' + expected + '\' is required)'
  1751.         };
  1752.         ErrorMisspelledRequired.prototype.trackedInfo = function () {
  1753.           return {
  1754.             result: 'ErrorMisspelledRequired',
  1755.             expected: this.expected,
  1756.             actual: this.actual
  1757.           }
  1758.         };
  1759.         return ErrorMisspelledRequired
  1760.       }();
  1761.       WarnMisspelledOptional = function () {
  1762.         function WarnMisspelledOptional(rawOptions1, expected1, actual1) {
  1763.           this.rawOptions = rawOptions1;
  1764.           this.expected = expected1;
  1765.           this.actual = actual1
  1766.         }
  1767.         WarnMisspelledOptional.prototype.toString = function () {
  1768.           var actual,
  1769.           expected;
  1770.           expected = optionHelpers.prettyPrint(this.expected, this.rawOptions);
  1771.           actual = optionHelpers.prettyPrint(this.actual, this.rawOptions);
  1772.           return 'Unrecognized option \'' + actual + '\'. Did you mean \'' + expected + '\'?'
  1773.         };
  1774.         WarnMisspelledOptional.prototype.trackedInfo = function () {
  1775.           return {
  1776.             result: 'WarnMisspelledOptional',
  1777.             expected: this.expected,
  1778.             actual: this.actual
  1779.           }
  1780.         };
  1781.         return WarnMisspelledOptional
  1782.       }();
  1783.       WarnUnrecognized = function () {
  1784.         function WarnUnrecognized(rawOptions1, key1) {
  1785.           this.rawOptions = rawOptions1;
  1786.           this.key = key1
  1787.         }
  1788.         WarnUnrecognized.prototype.toString = function () {
  1789.           var key;
  1790.           key = optionHelpers.prettyPrint(this.key, this.rawOptions);
  1791.           return 'Unrecognized option \'' + key + '\'.'
  1792.         };
  1793.         WarnUnrecognized.prototype.trackedInfo = function () {
  1794.           return {
  1795.             result: 'WarnUnrecognized',
  1796.             key: this.key
  1797.           }
  1798.         };
  1799.         return WarnUnrecognized
  1800.       }();
  1801.       WarnOptionTypeError = function () {
  1802.         function WarnOptionTypeError(rawOptions1, key1, message1) {
  1803.           this.rawOptions = rawOptions1;
  1804.           this.key = key1;
  1805.           this.message = message1
  1806.         }
  1807.         WarnOptionTypeError.prototype.toString = function () {
  1808.           var key;
  1809.           key = optionHelpers.prettyPrint(this.key, this.rawOptions);
  1810.           return 'Type mismatch for option \'' + key + '\':\n' + this.message
  1811.         };
  1812.         WarnOptionTypeError.prototype.trackedInfo = function () {
  1813.           return {
  1814.             result: 'WarnOptionTypeError',
  1815.             key: this.key,
  1816.             message: this.message
  1817.           }
  1818.         };
  1819.         return WarnOptionTypeError
  1820.       }();
  1821.       WarnBadContext = function () {
  1822.         function WarnBadContext(rawOptions1, key1, message1) {
  1823.           this.rawOptions = rawOptions1;
  1824.           this.key = key1;
  1825.           this.message = message1
  1826.         }
  1827.         WarnBadContext.prototype.toString = function () {
  1828.           return this.message
  1829.         };
  1830.         WarnBadContext.prototype.trackedInfo = function () {
  1831.           return {
  1832.             result: 'WarnBadContext',
  1833.             key: this.key,
  1834.             message: this.message
  1835.           }
  1836.         };
  1837.         return WarnBadContext
  1838.       }();
  1839.       coerceOption = function (optionSpec, option, val) {
  1840.         var OPTIONS;
  1841.         OPTIONS = fromSpec(optionSpec);
  1842.         if (val != null && OPTIONS.all[option] != null) {
  1843.           return OPTIONS.all[option].coerceTo(val)
  1844.         } else {
  1845.           return val
  1846.         }
  1847.       };
  1848.       checkRequiredOptions = function (OPTIONS, arg, rawOptions) {
  1849.         var errors,
  1850.         i,
  1851.         len,
  1852.         ref,
  1853.         reqOpt,
  1854.         warnings;
  1855.         errors = arg.errors,
  1856.         warnings = arg.warnings;
  1857.         ref = OPTIONS.required;
  1858.         for (i = 0, len = ref.length; i < len; i++) {
  1859.           reqOpt = ref[i];
  1860.           if (!(reqOpt in rawOptions)) {
  1861.             errors.push(new ErrorMissingRequired(rawOptions, reqOpt))
  1862.           }
  1863.         }
  1864.       };
  1865.       checkConditionallyRequiredOptions = function (OPTIONS, arg, rawOptions) {
  1866.         var error,
  1867.         errors,
  1868.         i,
  1869.         len,
  1870.         option,
  1871.         ref,
  1872.         val,
  1873.         warnings;
  1874.         errors = arg.errors,
  1875.         warnings = arg.warnings;
  1876.         ref = OPTIONS.conditionallyRequired;
  1877.         for (i = 0, len = ref.length; i < len; i++) {
  1878.           option = ref[i];
  1879.           val = rawOptions[option];
  1880.           error = OPTIONS.all[option].importance(option, val, rawOptions);
  1881.           if (!error) {
  1882.             continue
  1883.           }
  1884.           errors.push(error)
  1885.         }
  1886.       };
  1887.       checkUnrecognizedOptions = function (OPTIONS, arg, rawOptions) {
  1888.         var THRESHOLD,
  1889.         err,
  1890.         errors,
  1891.         idx,
  1892.         missingRequiredErrors,
  1893.         option,
  1894.         suggestion,
  1895.         warnings;
  1896.         errors = arg.errors,
  1897.         warnings = arg.warnings;
  1898.         THRESHOLD = 4;
  1899.         for (option in rawOptions) {
  1900.           if (!(option in OPTIONS.all)) {
  1901.             suggestion = spellChecker.suggest(OPTIONS.suggestable, option, THRESHOLD);
  1902.             if (indexOf.call(OPTIONS.required, suggestion) >= 0 || indexOf.call(OPTIONS.conditionallyRequired, suggestion) >= 0) {
  1903.               missingRequiredErrors = function () {
  1904.                 var i,
  1905.                 len,
  1906.                 results;
  1907.                 results = [
  1908.                 ];
  1909.                 for (idx = i = 0, len = errors.length; i < len; idx = ++i) {
  1910.                   err = errors[idx];
  1911.                   if (err instanceof ErrorMissingRequired && err.key === suggestion || err instanceof ErrorMissingOneOfRequired && err.keyA === suggestion) {
  1912.                     results.push(idx)
  1913.                   }
  1914.                 }
  1915.                 return results
  1916.               }();
  1917.               if (missingRequiredErrors.length > 0) {
  1918.                 idx = missingRequiredErrors[0];
  1919.                 errors[idx] = new ErrorMisspelledRequired(rawOptions, suggestion, option)
  1920.               } else {
  1921.                 warnings.push(new WarnUnrecognized(rawOptions, option))
  1922.               }
  1923.             } else if (suggestion != null) {
  1924.               warnings.push(new WarnMisspelledOptional(rawOptions, suggestion, option))
  1925.             } else {
  1926.               warnings.push(new WarnUnrecognized(rawOptions, option))
  1927.             }
  1928.           }
  1929.         }
  1930.       };
  1931.       checkOptionTypes = function (OPTIONS, arg, rawOptions) {
  1932.         var error,
  1933.         errors,
  1934.         filtered,
  1935.         message,
  1936.         option,
  1937.         type,
  1938.         val,
  1939.         warnings;
  1940.         errors = arg.errors,
  1941.         warnings = arg.warnings;
  1942.         filtered = {
  1943.         };
  1944.         for (option in rawOptions) {
  1945.           val = rawOptions[option];
  1946.           if (option in OPTIONS.all) {
  1947.             filtered[option] = val
  1948.           }
  1949.         }
  1950.         for (option in filtered) {
  1951.           val = filtered[option];
  1952.           error = OPTIONS.all[option].spec(option, val, rawOptions);
  1953.           if (!error) {
  1954.             continue
  1955.           }
  1956.           type = error.type,
  1957.           message = error.message;
  1958.           if (type === ERROR) {
  1959.             errors.push(new WarnOptionTypeError(rawOptions, option, message))
  1960.           } else {
  1961.             warnings.push(new WarnOptionTypeError(rawOptions, option, message))
  1962.           }
  1963.         }
  1964.       };
  1965.       checkOptionContexts = function (OPTIONS, arg, rawOptions) {
  1966.         var error,
  1967.         errors,
  1968.         filtered,
  1969.         message,
  1970.         option,
  1971.         type,
  1972.         val,
  1973.         warnings;
  1974.         errors = arg.errors,
  1975.         warnings = arg.warnings;
  1976.         filtered = {
  1977.         };
  1978.         for (option in rawOptions) {
  1979.           val = rawOptions[option];
  1980.           if (option in OPTIONS.all) {
  1981.             filtered[option] = val
  1982.           }
  1983.         }
  1984.         for (option in filtered) {
  1985.           val = filtered[option];
  1986.           error = OPTIONS.all[option].checkContext(option, val, rawOptions);
  1987.           if (!error) {
  1988.             continue
  1989.           }
  1990.           type = error.type,
  1991.           message = error.message;
  1992.           if (type === ERROR) {
  1993.             errors.push(new WarnBadContext(rawOptions, option, message))
  1994.           } else {
  1995.             warnings.push(new WarnBadContext(rawOptions, option, message))
  1996.           }
  1997.         }
  1998.       };
  1999.       validate = function (optionSpec, rawOptions) {
  2000.         var OPTIONS,
  2001.         errors,
  2002.         warnings;
  2003.         OPTIONS = fromSpec(optionSpec);
  2004.         errors = [
  2005.         ];
  2006.         warnings = [
  2007.         ];
  2008.         checkRequiredOptions(OPTIONS, {
  2009.           errors: errors,
  2010.           warnings: warnings
  2011.         }, rawOptions);
  2012.         checkConditionallyRequiredOptions(OPTIONS, {
  2013.           errors: errors,
  2014.           warnings: warnings
  2015.         }, rawOptions);
  2016.         checkUnrecognizedOptions(OPTIONS, {
  2017.           errors: errors,
  2018.           warnings: warnings
  2019.         }, rawOptions);
  2020.         checkOptionTypes(OPTIONS, {
  2021.           errors: errors,
  2022.           warnings: warnings
  2023.         }, rawOptions);
  2024.         checkOptionContexts(OPTIONS, {
  2025.           errors: errors,
  2026.           warnings: warnings
  2027.         }, rawOptions);
  2028.         return {
  2029.           errors: errors,
  2030.           warnings: warnings
  2031.         }
  2032.       };
  2033.       module.exports = {
  2034.         ErrorMissingRequired: ErrorMissingRequired,
  2035.         ErrorMissingOneOfRequired: ErrorMissingOneOfRequired,
  2036.         ErrorMisspelledRequired: ErrorMisspelledRequired,
  2037.         WarnMisspelledOptional: WarnMisspelledOptional,
  2038.         WarnUnrecognized: WarnUnrecognized,
  2039.         WarnOptionTypeError: WarnOptionTypeError,
  2040.         WarnBadContext: WarnBadContext,
  2041.         severities: {
  2042.           ERROR: ERROR,
  2043.           WARNING: WARNING
  2044.         },
  2045.         importances: {
  2046.           OPTIONAL: OPTIONAL,
  2047.           REQUIRED: REQUIRED,
  2048.           PRIVATE: PRIVATE
  2049.         },
  2050.         simpleTypeCheck: simpleTypeCheck,
  2051.         simpleNullableTypeCheck: simpleNullableTypeCheck,
  2052.         isString: isString,
  2053.         isBoolean: isBoolean,
  2054.         isNumber: isNumber,
  2055.         isNullableString: isNullableString,
  2056.         isNullableBoolean: isNullableBoolean,
  2057.         isNullableNumber: isNullableNumber,
  2058.         ignore: ignore,
  2059.         xRequiresY: xRequiresY,
  2060.         xPrecludesY: xPrecludesY,
  2061.         coerceOption: coerceOption,
  2062.         validate: validate
  2063.       }
  2064.     }).call(this)
  2065.   }
  2066. });
  2067. StripeCheckout.require.define({
  2068.   'lib/optionParser': function (exports, require, module) {
  2069.     (function () {
  2070.       var CHECKOUT_DOCS_URL,
  2071.       _trackIndividual,
  2072.       extractValue,
  2073.       formatMessage,
  2074.       helpers,
  2075.       keymode,
  2076.       optionSpecs,
  2077.       optionValidator,
  2078.       trackError,
  2079.       trackSummary,
  2080.       trackWarning,
  2081.       tracker;
  2082.       tracker = require('lib/tracker');
  2083.       helpers = require('lib/helpers');
  2084.       optionValidator = require('lib/optionValidator');
  2085.       optionSpecs = require('lib/optionSpecs');
  2086.       keymode = require('lib/keymode');
  2087.       CHECKOUT_DOCS_URL = 'https://stripe.com/docs/checkout';
  2088.       extractValue = function (rawOptions, key) {
  2089.         var dashed,
  2090.         downcased;
  2091.         if (rawOptions[key] != null) {
  2092.           return rawOptions[key]
  2093.         }
  2094.         downcased = key.toLowerCase();
  2095.         if (rawOptions[downcased] != null) {
  2096.           return rawOptions[downcased]
  2097.         }
  2098.         dashed = helpers.camelToDashCase(key);
  2099.         if (rawOptions[dashed] != null) {
  2100.           return rawOptions[dashed]
  2101.         }
  2102.       };
  2103.       formatMessage = function (origin, message) {
  2104.         return 'StripeCheckout.' + origin + ': ' + message + '\nYou can learn about the available configuration options in the Checkout docs:\n' + CHECKOUT_DOCS_URL
  2105.       };
  2106.       _trackIndividual = function (level, origin, rawOptions, error) {
  2107.         var k,
  2108.         parameters,
  2109.         ref,
  2110.         v;
  2111.         parameters = {
  2112.           'optchecker-origin': origin
  2113.         };
  2114.         ref = error.trackedInfo();
  2115.         for (k in ref) {
  2116.           v = ref[k];
  2117.           parameters['optchecker-' + k] = v
  2118.         }
  2119.         switch (level) {
  2120.           case 'error':
  2121.             tracker.track.configError(parameters, rawOptions);
  2122.             break;
  2123.           case 'warning':
  2124.             tracker.track.configWarning(parameters, rawOptions)
  2125.         }
  2126.       };
  2127.       trackSummary = function (parameters, rawOptions) {
  2128.         var k,
  2129.         prefixedParams,
  2130.         v;
  2131.         prefixedParams = {
  2132.         };
  2133.         for (k in parameters) {
  2134.           v = parameters[k];
  2135.           prefixedParams['optchecker-' + k] = v
  2136.         }
  2137.         return tracker.track.configSummary(prefixedParams, rawOptions)
  2138.       };
  2139.       trackError = function (origin, rawOptions, error) {
  2140.         return _trackIndividual('error', origin, rawOptions, error)
  2141.       };
  2142.       trackWarning = function (origin, rawOptions, error) {
  2143.         return _trackIndividual('warning', origin, rawOptions, error)
  2144.       };
  2145.       module.exports = {
  2146.         coerceButtonOption: function (option, val) {
  2147.           return optionValidator.coerceOption(optionSpecs.buttonConfigureOptions, option, val)
  2148.         },
  2149.         parse: function (rawOptions) {
  2150.           var OPTIONS,
  2151.           opt,
  2152.           optsettings,
  2153.           parsed,
  2154.           val;
  2155.           if (rawOptions == null) {
  2156.             rawOptions = {
  2157.             }
  2158.           }
  2159.           parsed = {
  2160.           };
  2161.           if (rawOptions.buttonIntegration) {
  2162.             OPTIONS = optionSpecs.buttonOpenOptions
  2163.           } else {
  2164.             OPTIONS = optionSpecs.customOpenOptions
  2165.           }
  2166.           for (opt in OPTIONS) {
  2167.             optsettings = OPTIONS[opt];
  2168.             val = extractValue(rawOptions, opt);
  2169.             if (val == null && optsettings['default'] != null) {
  2170.               val = optsettings['default']
  2171.             }
  2172.             parsed[opt] = optionValidator.coerceOption(OPTIONS, opt, val)
  2173.           }
  2174.           if (parsed.shippingAddress) {
  2175.             parsed.billingAddress = true
  2176.           }
  2177.           if (rawOptions.address != null && rawOptions.address !== 'false' && rawOptions.address !== false) {
  2178.             parsed.billingAddress = true
  2179.           }
  2180.           if (parsed.billingAddress) {
  2181.             parsed.zipCode = false
  2182.           }
  2183.           return parsed
  2184.         },
  2185.         checkUsage: function (origin, rawOptions, isDarkMode) {
  2186.           var OPTIONS,
  2187.           error,
  2188.           errors,
  2189.           i,
  2190.           isConfigure,
  2191.           isNotTestmode,
  2192.           j,
  2193.           len,
  2194.           len1,
  2195.           mode,
  2196.           numErrors,
  2197.           numWarnings,
  2198.           quiet,
  2199.           ref,
  2200.           warning,
  2201.           warnings;
  2202.           if (isDarkMode == null) {
  2203.             isDarkMode = false
  2204.           }
  2205.           mode = keymode.fromKey(rawOptions.key);
  2206.           isNotTestmode = mode !== keymode.KEY_MODES.test;
  2207.           quiet = isNotTestmode || isDarkMode;
  2208.           isConfigure = origin === 'configure';
  2209.           if (rawOptions.buttonIntegration) {
  2210.             if (isConfigure) {
  2211.               OPTIONS = optionSpecs.buttonConfigureOptions
  2212.             } else {
  2213.               OPTIONS = optionSpecs.buttonOpenOptions
  2214.             }
  2215.           } else {
  2216.             if (isConfigure) {
  2217.               OPTIONS = optionSpecs.customConfigureOptions
  2218.             } else {
  2219.               OPTIONS = optionSpecs.customOpenOptions
  2220.             }
  2221.           }
  2222.           ref = optionValidator.validate(OPTIONS, rawOptions),
  2223.           errors = ref.errors,
  2224.           warnings = ref.warnings;
  2225.           numErrors = errors.length;
  2226.           numWarnings = warnings.length;
  2227.           trackSummary({
  2228.             origin: origin,
  2229.             numErrors: numErrors,
  2230.             numWarnings: numWarnings
  2231.           }, rawOptions);
  2232.           for (i = 0, len = errors.length; i < len; i++) {
  2233.             error = errors[i];
  2234.             if (!quiet) {
  2235.               if (typeof console !== 'undefined' && console !== null) {
  2236.                 console.error(formatMessage(origin, error.toString()))
  2237.               }
  2238.             }
  2239.             trackError(origin, rawOptions, error)
  2240.           }
  2241.           quiet || (quiet = numErrors > 0);
  2242.           for (j = 0, len1 = warnings.length; j < len1; j++) {
  2243.             warning = warnings[j];
  2244.             if (!quiet) {
  2245.               if (typeof console !== 'undefined' && console !== null) {
  2246.                 console.warn(formatMessage(origin, warning.toString()))
  2247.               }
  2248.             }
  2249.             trackWarning(origin, rawOptions, warning)
  2250.           }
  2251.         }
  2252.       }
  2253.     }).call(this)
  2254.   }
  2255. });
  2256. StripeCheckout.require.define({
  2257.   'lib/keymode': function (exports, require, module) {
  2258.     (function () {
  2259.       var KEY_MODES,
  2260.       fromKey;
  2261.       KEY_MODES = {
  2262.         live: 'live',
  2263.         test: 'test',
  2264.         unknown: 'unknown'
  2265.       };
  2266.       fromKey = function (key) {
  2267.         if (typeof key === 'string' || key instanceof String) {
  2268.           if (/^pk_test_.*$/.test(key)) {
  2269.             return KEY_MODES.test
  2270.           }
  2271.           if (/^pk_live_.*$/.test(key)) {
  2272.             return KEY_MODES.live
  2273.           }
  2274.         }
  2275.         return KEY_MODES.unknown
  2276.       };
  2277.       module.exports = {
  2278.         fromKey: fromKey,
  2279.         KEY_MODES: KEY_MODES
  2280.       }
  2281.     }).call(this)
  2282.   }
  2283. });
  2284. StripeCheckout.require.define({
  2285.   'lib/rpc': function (exports, require, module) {
  2286.     (function () {
  2287.       var RPC,
  2288.       helpers,
  2289.       tracker,
  2290.       bind = function (fn, me) {
  2291.         return function () {
  2292.           return fn.apply(me, arguments)
  2293.         }
  2294.       },
  2295.       slice = [
  2296.       ].slice;
  2297.       helpers = require('lib/helpers');
  2298.       tracker = require('lib/tracker');
  2299.       RPC = function () {
  2300.         function RPC(target, options) {
  2301.           if (options == null) {
  2302.             options = {
  2303.             }
  2304.           }
  2305.           this.processMessage = bind(this.processMessage, this);
  2306.           this.sendMessage = bind(this.sendMessage, this);
  2307.           this.invoke = bind(this.invoke, this);
  2308.           this.startSession = bind(this.startSession, this);
  2309.           this.rpcID = 0;
  2310.           this.target = target;
  2311.           this.callbacks = {
  2312.           };
  2313.           this.readyQueue = [
  2314.           ];
  2315.           this.readyStatus = false;
  2316.           this.methods = {
  2317.           };
  2318.           helpers.bind(window, 'message', function (_this) {
  2319.             return function () {
  2320.               var args;
  2321.               args = 1 <= arguments.length ? slice.call(arguments, 0) : [
  2322.               ];
  2323.               return _this.message.apply(_this, args)
  2324.             }
  2325.           }(this))
  2326.         }
  2327.         RPC.prototype.startSession = function () {
  2328.           this.sendMessage('frameReady');
  2329.           return this.frameReady()
  2330.         };
  2331.         RPC.prototype.invoke = function () {
  2332.           var args,
  2333.           method;
  2334.           method = arguments[0],
  2335.           args = 2 <= arguments.length ? slice.call(arguments, 1) : [
  2336.           ];
  2337.           tracker.trace.rpcInvoke(method);
  2338.           return this.ready(function (_this) {
  2339.             return function () {
  2340.               return _this.sendMessage(method, args)
  2341.             }
  2342.           }(this))
  2343.         };
  2344.         RPC.prototype.message = function (e) {
  2345.           var error,
  2346.           shouldProcess;
  2347.           shouldProcess = false;
  2348.           try {
  2349.             shouldProcess = e.source === this.target
  2350.           } catch (error) {
  2351.           }
  2352.           if (shouldProcess) {
  2353.             return this.processMessage(e.data)
  2354.           }
  2355.         };
  2356.         RPC.prototype.ready = function (fn) {
  2357.           if (this.readyStatus) {
  2358.             return fn()
  2359.           } else {
  2360.             return this.readyQueue.push(fn)
  2361.           }
  2362.         };
  2363.         RPC.prototype.frameCallback = function (id, result) {
  2364.           var base;
  2365.           if (typeof (base = this.callbacks) [id] === 'function') {
  2366.             base[id](result)
  2367.           }
  2368.           delete this.callbacks[id];
  2369.           return true
  2370.         };
  2371.         RPC.prototype.frameReady = function () {
  2372.           var callbacks,
  2373.           cb,
  2374.           i,
  2375.           len;
  2376.           this.readyStatus = true;
  2377.           callbacks = this.readyQueue.slice(0);
  2378.           for (i = 0, len = callbacks.length; i < len; i++) {
  2379.             cb = callbacks[i];
  2380.             cb()
  2381.           }
  2382.           return false
  2383.         };
  2384.         RPC.prototype.isAlive = function () {
  2385.           return true
  2386.         };
  2387.         RPC.prototype.sendMessage = function (method, args) {
  2388.           var err,
  2389.           id,
  2390.           message,
  2391.           ref;
  2392.           if (args == null) {
  2393.             args = [
  2394.             ]
  2395.           }
  2396.           id = ++this.rpcID;
  2397.           if (typeof args[args.length - 1] === 'function') {
  2398.             this.callbacks[id] = args.pop()
  2399.           }
  2400.           message = JSON.stringify({
  2401.             method: method,
  2402.             args: args,
  2403.             id: id
  2404.           });
  2405.           if (((ref = this.target) != null ? ref.postMessage : void 0) == null) {
  2406.             err = new Error('Unable to communicate with Checkout. Please contact support@stripe.com if the problem persists.');
  2407.             if (this.methods.rpcError != null) {
  2408.               this.methods.rpcError(err)
  2409.             } else {
  2410.               throw err
  2411.             }
  2412.             return
  2413.           }
  2414.           this.target.postMessage(message, '*');
  2415.           return tracker.trace.rpcPostMessage(method, args, id)
  2416.         };
  2417.         RPC.prototype.processMessage = function (data) {
  2418.           var base,
  2419.           error,
  2420.           method,
  2421.           name,
  2422.           result;
  2423.           try {
  2424.             data = JSON.parse(data)
  2425.           } catch (error) {
  2426.             return
  2427.           }
  2428.           if (['frameReady',
  2429.           'frameCallback',
  2430.           'isAlive'].indexOf(data.method) !== - 1) {
  2431.             result = null;
  2432.             method = this[data.method];
  2433.             if (method != null) {
  2434.               result = method.apply(this, data.args)
  2435.             }
  2436.           } else {
  2437.             result = typeof (base = this.methods) [name = data.method] === 'function' ? base[name].apply(base, data.args) : void 0
  2438.           }
  2439.           if (data.method !== 'frameCallback') {
  2440.             return this.invoke('frameCallback', data.id, result)
  2441.           }
  2442.         };
  2443.         return RPC
  2444.       }();
  2445.       module.exports = RPC
  2446.     }).call(this)
  2447.   }
  2448. });
  2449. StripeCheckout.require.define({
  2450.   'lib/uuid': function (exports, require, module) {
  2451.     (function () {
  2452.       var S4;
  2453.       S4 = function () {
  2454.         return ((1 + Math.random()) * 65536 | 0).toString(16).substring(1)
  2455.       };
  2456.       module.exports.generate = function () {
  2457.         var delim;
  2458.         delim = '-';
  2459.         return S4() + S4() + delim + S4() + delim + S4() + delim + S4() + delim + S4() + S4() + S4()
  2460.       }
  2461.     }).call(this)
  2462.   }
  2463. });
  2464. StripeCheckout.require.define({
  2465.   'lib/pixel': function (exports, require, module) {
  2466.     (function () {
  2467.       var canTrack,
  2468.       encode,
  2469.       generateID,
  2470.       getCookie,
  2471.       getCookieID,
  2472.       getLocalStorageID,
  2473.       redactSensitiveParams,
  2474.       request,
  2475.       setCookie,
  2476.       track;
  2477.       redactSensitiveParams = function (value) {
  2478.         var str;
  2479.         str = '';
  2480.         if (typeof value === 'string' || typeof value === 'boolean' || typeof value === 'number') {
  2481.           str = String(value)
  2482.         }
  2483.         return str.replace(/((?:password|pass|pwd)[^=]*=)[^&]*/gi, '$1<sanitized>')
  2484.       };
  2485.       generateID = function () {
  2486.         return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
  2487.           var r,
  2488.           v;
  2489.           r = Math.random() * 16 | 0;
  2490.           v = c === 'x' ? r : r & 3 | 8;
  2491.           return v.toString(16)
  2492.         })
  2493.       };
  2494.       setCookie = function (name, value, options) {
  2495.         var cookie,
  2496.         expires;
  2497.         if (options == null) {
  2498.           options = {
  2499.           }
  2500.         }
  2501.         if (options.expires === true) {
  2502.           options.expires = - 1
  2503.         }
  2504.         if (typeof options.expires === 'number') {
  2505.           expires = new Date;
  2506.           expires.setTime(expires.getTime() + options.expires * 24 * 60 * 60 * 1000);
  2507.           options.expires = expires
  2508.         }
  2509.         if (options.path == null) {
  2510.           options.path = '/'
  2511.         }
  2512.         value = (value + '').replace(/[^!#-+\--:<-\[\]-~]/g, encodeURIComponent);
  2513.         cookie = encodeURIComponent(name) + '=' + value;
  2514.         if (options.expires) {
  2515.           cookie += ';expires=' + options.expires.toGMTString()
  2516.         }
  2517.         if (options.path) {
  2518.           cookie += ';path=' + options.path
  2519.         }
  2520.         if (options.domain) {
  2521.           cookie += ';domain=' + options.domain
  2522.         }
  2523.         return document.cookie = cookie
  2524.       };
  2525.       getCookie = function (name) {
  2526.         var cookie,
  2527.         cookies,
  2528.         i,
  2529.         index,
  2530.         key,
  2531.         len,
  2532.         value;
  2533.         cookies = document.cookie.split('; ');
  2534.         for (i = 0, len = cookies.length; i < len; i++) {
  2535.           cookie = cookies[i];
  2536.           index = cookie.indexOf('=');
  2537.           key = decodeURIComponent(cookie.substr(0, index));
  2538.           value = decodeURIComponent(cookie.substr(index + 1));
  2539.           if (key === name) {
  2540.             return value
  2541.           }
  2542.         }
  2543.         return null
  2544.       };
  2545.       encode = function (param) {
  2546.         if (typeof param === 'string') {
  2547.           return encodeURIComponent(param)
  2548.         } else {
  2549.           return encodeURIComponent(JSON.stringify(param))
  2550.         }
  2551.       };
  2552.       request = function (url, params, callback) {
  2553.         var image,
  2554.         k,
  2555.         v;
  2556.         if (params == null) {
  2557.           params = {
  2558.           }
  2559.         }
  2560.         params.i = (new Date).getTime();
  2561.         params = function () {
  2562.           var results;
  2563.           results = [
  2564.           ];
  2565.           for (k in params) {
  2566.             v = params[k];
  2567.             results.push(k + '=' + encode(v))
  2568.           }
  2569.           return results
  2570.         }().join('&');
  2571.         image = new Image;
  2572.         if (callback) {
  2573.           image.onload = callback
  2574.         }
  2575.         image.src = url + '?' + params;
  2576.         return true
  2577.       };
  2578.       canTrack = function () {
  2579.         var dnt,
  2580.         ref;
  2581.         dnt = (ref = window.navigator.doNotTrack) != null ? ref.toString().toLowerCase() : void 0;
  2582.         switch (dnt) {
  2583.           case '1':
  2584.           case 'yes':
  2585.           case 'true':
  2586.             return false;
  2587.           default:
  2588.             return true
  2589.         }
  2590.       };
  2591.       getLocalStorageID = function () {
  2592.         var err,
  2593.         error,
  2594.         lsid;
  2595.         if (!canTrack()) {
  2596.           return 'DNT'
  2597.         }
  2598.         try {
  2599.           lsid = generateID();
  2600.           return lsid
  2601.         } catch (error) {
  2602.           err = error;
  2603.           return 'NA'
  2604.         }
  2605.       };
  2606.       getCookieID = function () {
  2607.         var err,
  2608.         error,
  2609.         id;
  2610.         if (!canTrack()) {
  2611.           return 'DNT'
  2612.         }
  2613.         try {
  2614.           id = generateID();
  2615.           return id
  2616.         } catch (error) {
  2617.           err = error;
  2618.           return 'NA'
  2619.         }
  2620.       };
  2621.       track = function (event, params, callback) {
  2622.         var k,
  2623.         request_params,
  2624.         v;
  2625.         if (params == null) {
  2626.           params = {
  2627.           }
  2628.         }
  2629.         request_params = {
  2630.           event: event,
  2631.           rf: window.location.host
  2632.         };
  2633.         for (k in params) {
  2634.           v = params[k];
  2635.           request_params[k] = redactSensitiveParams(v)
  2636.         }
  2637.         request_params.lsid || (request_params.lsid = getLocalStorageID());
  2638.         request_params.cid || (request_params.cid = getCookieID());
  2639.         return request('https://q.stripe.com', request_params, callback)
  2640.       };
  2641.       module.exports.track = track;
  2642.       module.exports.getLocalStorageID = getLocalStorageID;
  2643.       module.exports.getCookieID = getCookieID;
  2644.       module.exports.generateID = generateID;
  2645.       module.exports.redactSensitiveParams = redactSensitiveParams
  2646.     }).call(this)
  2647.   }
  2648. });
  2649. StripeCheckout.require.define({
  2650.   'lib/tracker': function (exports, require, module) {
  2651.     (function () {
  2652.       var config,
  2653.       helpers,
  2654.       isEventNameExisting,
  2655.       pixel,
  2656.       setOptions,
  2657.       stateParameters,
  2658.       trace,
  2659.       traceSerialize,
  2660.       track,
  2661.       tracker,
  2662.       uuid,
  2663.       indexOf = [
  2664.       ].indexOf || function (item) {
  2665.         for (var i = 0, l = this.length; i < l; i++) {
  2666.           if (i in this && this[i] === item) return i
  2667.         }
  2668.         return - 1
  2669.       };
  2670.       uuid = require('lib/uuid');
  2671.       pixel = require('lib/pixel');
  2672.       helpers = require('lib/helpers');
  2673.       config = {
  2674.         enabled: false,
  2675.         tracingEnabled: false,
  2676.         eventNamePrefix: 'checkout.',
  2677.         distinctId: uuid.generate()
  2678.       };
  2679.       stateParameters = {
  2680.       };
  2681.       tracker = {
  2682.       };
  2683.       tracker.setEnabled = function (enabled) {
  2684.         return config.enabled = enabled
  2685.       };
  2686.       tracker.setTracingEnabled = function (enabled) {
  2687.         return config.tracingEnabled = enabled
  2688.       };
  2689.       tracker.setDistinctID = function (value) {
  2690.         if (value) {
  2691.           return config.distinctId = value
  2692.         }
  2693.       };
  2694.       tracker.getDistinctID = function () {
  2695.         return config.distinctId
  2696.       };
  2697.       tracker.track = {
  2698.         outerOpen: function (parameters) {
  2699.           var requiredKeys;
  2700.           requiredKeys = [
  2701.             'key'
  2702.           ];
  2703.           return track('outer.open', parameters, requiredKeys, {
  2704.             appendStateParameters: false
  2705.           })
  2706.         },
  2707.         selfHostedError: function () {
  2708.           return track('outer.selfHosted')
  2709.         },
  2710.         tabOpeningError: function () {
  2711.           return track('outer.tabOpeningError')
  2712.         },
  2713.         viewport: function (viewport) {
  2714.           return track('outer.viewport', {
  2715.             viewport: viewport
  2716.           })
  2717.         },
  2718.         iOSWebViewType: function () {
  2719.           var type;
  2720.           type = helpers.getiOSWebViewType();
  2721.           if (type) {
  2722.             return track('inner.iOSWebViewType', {
  2723.               type: type
  2724.             })
  2725.           }
  2726.         },
  2727.         open: function (options) {
  2728.           setOptions(options);
  2729.           return track('open')
  2730.         },
  2731.         close: function (parameters) {
  2732.           return track('close', parameters, [
  2733.             'withToken'
  2734.           ])
  2735.         },
  2736.         configSummary: function (parameters, options) {
  2737.           setOptions(options);
  2738.           return track('config.summary', parameters, [
  2739.             'optchecker-origin',
  2740.             'optchecker-numErrors',
  2741.             'optchecker-numWarnings'
  2742.           ])
  2743.         },
  2744.         configError: function (parameters, options) {
  2745.           setOptions(options);
  2746.           return track('config.error', parameters, [
  2747.             'optchecker-origin',
  2748.             'optchecker-result'
  2749.           ])
  2750.         },
  2751.         configWarning: function (parameters, options) {
  2752.           setOptions(options);
  2753.           return track('config.warning', parameters, [
  2754.             'optchecker-origin',
  2755.             'optchecker-result'
  2756.           ])
  2757.         },
  2758.         keyOverride: function (values) {
  2759.           return track('config.keyOverride', values, [
  2760.             'configure',
  2761.             'open'
  2762.           ])
  2763.         },
  2764.         localeOverride: function (values) {
  2765.           return track('config.localeOverride', values, [
  2766.             'configure',
  2767.             'open'
  2768.           ])
  2769.         },
  2770.         imageOverride: function (values) {
  2771.           return track('config.imageOverride', values, [
  2772.             'configure',
  2773.             'open'
  2774.           ])
  2775.         },
  2776.         submit: function () {
  2777.           return track('submit')
  2778.         },
  2779.         invalid: function (parameters) {
  2780.           if (parameters['err'] == null && parameters['fields'] == null) {
  2781.             throw new Error('Cannot track invalid because err or fields should be provided')
  2782.           }
  2783.           return track('invalid', parameters)
  2784.         },
  2785.         tokenError: function (msg) {
  2786.           return track('token.error', {
  2787.             message: msg,
  2788.             type: 'exception'
  2789.           })
  2790.         },
  2791.         sourceError: function (msg) {
  2792.           return track('source.error', {
  2793.             message: msg,
  2794.             type: 'exception'
  2795.           })
  2796.         },
  2797.         back: function (parameters) {
  2798.           return track('back', parameters, [
  2799.             'from_step',
  2800.             'to_step'
  2801.           ])
  2802.         },
  2803.         token: function (parameters) {
  2804.           return track('token', parameters, [
  2805.             'stripe_token'
  2806.           ])
  2807.         },
  2808.         source: function (parameters) {
  2809.           return track('source', parameters, [
  2810.             'stripe_source'
  2811.           ])
  2812.         },
  2813.         i18nLocKeyMissing: function (key) {
  2814.           return track('i18n.loc.missingKey', {
  2815.             template_key: key
  2816.           })
  2817.         },
  2818.         i18nLocPartiallyReplacedTemplate: function (key, value) {
  2819.           return track('i18n.loc.partiallyReplacedTemplate', {
  2820.             template_key: key,
  2821.             template_value: value
  2822.           })
  2823.         },
  2824.         i18nFormatLocaleMissing: function (locale) {
  2825.           return track('i18n.format.localeMissing', {
  2826.             locale: locale
  2827.           })
  2828.         },
  2829.         alert: function (parameters) {
  2830.           return track('alert', parameters)
  2831.         }
  2832.       };
  2833.       tracker.trace = {
  2834.         trigger: function (eventName, args) {
  2835.           var EXCLUDED_EVENTS;
  2836.           EXCLUDED_EVENTS = [
  2837.             'didResize',
  2838.             'viewAddedToDOM',
  2839.             'valueDidChange',
  2840.             'checkedDidChange',
  2841.             'keyUp',
  2842.             'keyDown',
  2843.             'keyPress',
  2844.             'keyInput',
  2845.             'click',
  2846.             'blur'
  2847.           ];
  2848.           eventName = eventName.split('.');
  2849.           if (eventName[eventName.length - 1] === 'checkout') {
  2850.             eventName.pop()
  2851.           }
  2852.           eventName = eventName.join('.');
  2853.           if (indexOf.call(EXCLUDED_EVENTS, eventName) < 0) {
  2854.             if (this._triggerQueue == null) {
  2855.               this._triggerQueue = {
  2856.               }
  2857.             }
  2858.             this._triggerQueue[eventName] = traceSerialize(args);
  2859.             return this._triggerTimeout != null ? this._triggerTimeout : this._triggerTimeout = setTimeout(function (_this) {
  2860.               return function () {
  2861.                 var ref;
  2862.                 ref = _this._triggerQueue;
  2863.                 for (eventName in ref) {
  2864.                   args = ref[eventName];
  2865.                   trace('trigger.' + eventName, {
  2866.                     args: args
  2867.                   })
  2868.                 }
  2869.                 _this._triggerQueue = {
  2870.                 };
  2871.                 return _this._triggerTimeout = null
  2872.               }
  2873.             }(this), 0)
  2874.           }
  2875.         },
  2876.         rpcInvoke: function (method) {
  2877.           return trace('rpc.invoke.' + method)
  2878.         },
  2879.         rpcPostMessage: function (method, args, id) {
  2880.           return trace('rpc.postMessage.' + method, {
  2881.             id: id,
  2882.             args: traceSerialize(args)
  2883.           })
  2884.         }
  2885.       };
  2886.       tracker.state = {
  2887.         setUIType: function (type) {
  2888.           return stateParameters['st-ui-type'] = type
  2889.         },
  2890.         setUIIntegration: function (integration) {
  2891.           return stateParameters['st-ui-integration'] = integration
  2892.         },
  2893.         setVariants: function (variants) {
  2894.           var k,
  2895.           results,
  2896.           v;
  2897.           results = [
  2898.           ];
  2899.           for (k in variants) {
  2900.             v = variants[k];
  2901.             results.push(stateParameters['st-variant-' + k] = v)
  2902.           }
  2903.           return results
  2904.         },
  2905.         setFeature: function (name, variant, selector) {
  2906.           stateParameters['st-variant-' + name] = variant;
  2907.           return stateParameters['st-selector-' + name] = selector
  2908.         },
  2909.         setRequestedLocale: function (locale) {
  2910.           return stateParameters['st-locale'] = locale
  2911.         }
  2912.       };
  2913.       tracker.dontTrack = function (fn) {
  2914.         var enabled;
  2915.         enabled = config.enabled;
  2916.         config.enabled = false;
  2917.         fn();
  2918.         return config.enabled = enabled
  2919.       };
  2920.       setOptions = function (options) {
  2921.         var k,
  2922.         results,
  2923.         trackerOptionsAllowList,
  2924.         v;
  2925.         trackerOptionsAllowList = [
  2926.           'logoUrl',
  2927.           'companyName',
  2928.           'zipCode',
  2929.           'panelLabel',
  2930.           'currency',
  2931.           'purchaseDescription',
  2932.           'key'
  2933.         ];
  2934.         results = [
  2935.         ];
  2936.         for (k in options) {
  2937.           v = options[k];
  2938.           if (trackerOptionsAllowList.indexOf(k) !== - 1) {
  2939.             results.push(stateParameters['option-' + k] = v)
  2940.           } else {
  2941.             results.push(void 0)
  2942.           }
  2943.         }
  2944.         return results
  2945.       };
  2946.       isEventNameExisting = function (eventName) {
  2947.         var exists,
  2948.         k,
  2949.         ref,
  2950.         v;
  2951.         exists = false;
  2952.         ref = tracker.events;
  2953.         for (k in ref) {
  2954.           v = ref[k];
  2955.           if (v === eventName) {
  2956.             exists = true;
  2957.             break
  2958.           }
  2959.         }
  2960.         return exists
  2961.       };
  2962.       trace = function (eventName, parameters, requiredKeys, options) {
  2963.         if (parameters == null) {
  2964.           parameters = {
  2965.           }
  2966.         }
  2967.         if (requiredKeys == null) {
  2968.           requiredKeys = [
  2969.           ]
  2970.         }
  2971.         if (options == null) {
  2972.           options = {
  2973.           }
  2974.         }
  2975.         if (!config.tracingEnabled) {
  2976.           return
  2977.         }
  2978.         eventName = 'trace.' + eventName;
  2979.         return track.apply(this, arguments)
  2980.       };
  2981.       track = function (eventName, parameters, requiredKeys, options) {
  2982.         var fullEventName,
  2983.         i,
  2984.         k,
  2985.         key,
  2986.         len,
  2987.         missingKeys,
  2988.         v;
  2989.         if (parameters == null) {
  2990.           parameters = {
  2991.           }
  2992.         }
  2993.         if (requiredKeys == null) {
  2994.           requiredKeys = [
  2995.           ]
  2996.         }
  2997.         if (options == null) {
  2998.           options = {
  2999.           }
  3000.         }
  3001.         if (!config.enabled) {
  3002.           return
  3003.         }
  3004.         missingKeys = function () {
  3005.           var i,
  3006.           len,
  3007.           results;
  3008.           results = [
  3009.           ];
  3010.           for (i = 0, len = requiredKeys.length; i < len; i++) {
  3011.             key = requiredKeys[i];
  3012.             if (!(key in parameters)) {
  3013.               results.push(key)
  3014.             }
  3015.           }
  3016.           return results
  3017.         }();
  3018.         if (missingKeys.length > 0) {
  3019.           throw new Error('Missing required data (' + missingKeys.join(', ') + ') for tracking ' + eventName + '.')
  3020.         }
  3021.         parameters.distinct_id = config.distinctId;
  3022.         parameters.eventId = uuid.generate();
  3023.         if (options.appendStateParameters == null) {
  3024.           options.appendStateParameters = true
  3025.         }
  3026.         if (options.appendStateParameters) {
  3027.           for (k in stateParameters) {
  3028.             v = stateParameters[k];
  3029.             parameters[k] = v
  3030.           }
  3031.         }
  3032.         parameters.h = screen.height;
  3033.         parameters.w = screen.width;
  3034.         for (v = i = 0, len = parameters.length; i < len; v = ++i) {
  3035.           k = parameters[v];
  3036.           if (v instanceof Array) {
  3037.             v.sort()
  3038.           }
  3039.         }
  3040.         fullEventName = '' + config.eventNamePrefix + eventName;
  3041.         return pixel.track(fullEventName, parameters)
  3042.       };
  3043.       traceSerialize = function (value) {
  3044.         var k,
  3045.         obj,
  3046.         v;
  3047.         if (value instanceof Array) {
  3048.           return JSON.stringify(function () {
  3049.             var i,
  3050.             len,
  3051.             results;
  3052.             results = [
  3053.             ];
  3054.             for (i = 0, len = value.length; i < len; i++) {
  3055.               v = value[i];
  3056.               results.push(traceSerialize(v))
  3057.             }
  3058.             return results
  3059.           }())
  3060.         } else if (value != null && value.target != null && value.type != null) {
  3061.           return traceSerialize({
  3062.             type: value.type,
  3063.             target_id: value.target.id
  3064.           })
  3065.         } else if (value instanceof Object) {
  3066.           if (value.constructor === Object) {
  3067.             obj = {
  3068.             };
  3069.             for (k in value) {
  3070.               v = value[k];
  3071.               obj[k] = traceSerialize(v)
  3072.             }
  3073.             return JSON.stringify(obj)
  3074.           } else {
  3075.             return value.toString()
  3076.           }
  3077.         } else {
  3078.           return value
  3079.         }
  3080.       };
  3081.       module.exports = tracker
  3082.     }).call(this)
  3083.   }
  3084. });
  3085. StripeCheckout.require.define({
  3086.   'outer/lib/origins': function (exports, require, module) {
  3087.     (function () {
  3088.       var isLocalhost,
  3089.       isStripeHosted;
  3090.       isStripeHosted = function (src) {
  3091.         return src.match(/checkout\.stripe\.com/)
  3092.       };
  3093.       isLocalhost = function (src) {
  3094.         return src.match(/localhost/)
  3095.       };
  3096.       module.exports = {
  3097.         isStripeHosted: isStripeHosted,
  3098.         isLocalhost: isLocalhost
  3099.       }
  3100.     }).call(this)
  3101.   }
  3102. });
  3103. StripeCheckout.require.define({
  3104.   'outer/lib/utils': function (exports, require, module) {
  3105.     (function () {
  3106.       var $,
  3107.       $$,
  3108.       addClass,
  3109.       append,
  3110.       css,
  3111.       hasAttr,
  3112.       hasClass,
  3113.       insertAfter,
  3114.       insertBefore,
  3115.       parents,
  3116.       remove,
  3117.       resolve,
  3118.       text,
  3119.       trigger,
  3120.       indexOf = [
  3121.       ].indexOf || function (item) {
  3122.         for (var i = 0, l = this.length; i < l; i++) {
  3123.           if (i in this && this[i] === item) return i
  3124.         }
  3125.         return - 1
  3126.       };
  3127.       $ = function (sel) {
  3128.         return document.querySelectorAll(sel)
  3129.       };
  3130.       $$ = function (cls) {
  3131.         var el,
  3132.         i,
  3133.         len,
  3134.         ref,
  3135.         reg,
  3136.         results;
  3137.         if (typeof document.getElementsByClassName === 'function') {
  3138.           return document.getElementsByClassName(cls)
  3139.         } else if (typeof document.querySelectorAll === 'function') {
  3140.           return document.querySelectorAll('.' + cls)
  3141.         } else {
  3142.           reg = new RegExp('(^|\\s)' + cls + '(\\s|$)');
  3143.           ref = document.getElementsByTagName('*');
  3144.           results = [
  3145.           ];
  3146.           for (i = 0, len = ref.length; i < len; i++) {
  3147.             el = ref[i];
  3148.             if (reg.test(el.className)) {
  3149.               results.push(el)
  3150.             }
  3151.           }
  3152.           return results
  3153.         }
  3154.       };
  3155.       hasAttr = function (element, attr) {
  3156.         var node;
  3157.         if (typeof element.hasAttribute === 'function') {
  3158.           return element.hasAttribute(attr)
  3159.         } else {
  3160.           node = element.getAttributeNode(attr);
  3161.           return !!(node && (node.specified || node.nodeValue))
  3162.         }
  3163.       };
  3164.       trigger = function (element, name, data, bubble) {
  3165.         if (data == null) {
  3166.           data = {
  3167.           }
  3168.         }
  3169.         if (bubble == null) {
  3170.           bubble = true
  3171.         }
  3172.         if (window.jQuery) {
  3173.           return jQuery(element).trigger(name, data)
  3174.         }
  3175.       };
  3176.       addClass = function (element, name) {
  3177.         return element.className += ' ' + name
  3178.       };
  3179.       hasClass = function (element, name) {
  3180.         return indexOf.call(element.className.split(' '), name) >= 0
  3181.       };
  3182.       css = function (element, css) {
  3183.         return element.style.cssText += ';' + css
  3184.       };
  3185.       insertBefore = function (element, child) {
  3186.         return element.parentNode.insertBefore(child, element)
  3187.       };
  3188.       insertAfter = function (element, child) {
  3189.         return element.parentNode.insertBefore(child, element.nextSibling)
  3190.       };
  3191.       append = function (element, child) {
  3192.         return element.appendChild(child)
  3193.       };
  3194.       remove = function (element) {
  3195.         var ref;
  3196.         return (ref = element.parentNode) != null ? ref.removeChild(element) : void 0
  3197.       };
  3198.       parents = function (node) {
  3199.         var ancestors;
  3200.         ancestors = [
  3201.         ];
  3202.         while ((node = node.parentNode) && node !== document && indexOf.call(ancestors, node) < 0) {
  3203.           ancestors.push(node)
  3204.         }
  3205.         return ancestors
  3206.       };
  3207.       resolve = function (url) {
  3208.         var parser;
  3209.         parser = document.createElement('a');
  3210.         parser.href = url;
  3211.         return '' + parser.href
  3212.       };
  3213.       text = function (element, value) {
  3214.         if ('innerText' in element) {
  3215.           element.innerText = value
  3216.         } else {
  3217.           element.textContent = value
  3218.         }
  3219.         return value
  3220.       };
  3221.       module.exports = {
  3222.         $: $,
  3223.         $$: $$,
  3224.         hasAttr: hasAttr,
  3225.         trigger: trigger,
  3226.         addClass: addClass,
  3227.         hasClass: hasClass,
  3228.         css: css,
  3229.         insertBefore: insertBefore,
  3230.         insertAfter: insertAfter,
  3231.         append: append,
  3232.         remove: remove,
  3233.         parents: parents,
  3234.         resolve: resolve,
  3235.         text: text
  3236.       }
  3237.     }).call(this)
  3238.   }
  3239. });
  3240. StripeCheckout.require.define({
  3241.   'outer/controllers/app': function (exports, require, module) {
  3242.     (function () {
  3243.       var App,
  3244.       Checkout,
  3245.       RPC,
  3246.       TokenCallback,
  3247.       keymode,
  3248.       optionParser,
  3249.       origins,
  3250.       tracker,
  3251.       utils,
  3252.       bind = function (fn, me) {
  3253.         return function () {
  3254.           return fn.apply(me, arguments)
  3255.         }
  3256.       };
  3257.       Checkout = require('outer/controllers/checkout');
  3258.       TokenCallback = require('outer/controllers/tokenCallback');
  3259.       RPC = require('lib/rpc');
  3260.       optionParser = require('lib/optionParser');
  3261.       tracker = require('lib/tracker');
  3262.       utils = require('outer/lib/utils');
  3263.       origins = require('outer/lib/origins');
  3264.       keymode = require('lib/keymode');
  3265.       App = function () {
  3266.         function App(options) {
  3267.           var ref,
  3268.           ref1;
  3269.           if (options == null) {
  3270.             options = {
  3271.             }
  3272.           }
  3273.           this.setForceAppType = bind(this.setForceAppType, this);
  3274.           this.setForceView = bind(this.setForceView, this);
  3275.           this.getHost = bind(this.getHost, this);
  3276.           this.setHost = bind(this.setHost, this);
  3277.           this.configure = bind(this.configure, this);
  3278.           this.close = bind(this.close, this);
  3279.           this.open = bind(this.open, this);
  3280.           this.configurations = {
  3281.           };
  3282.           this.checkouts = {
  3283.           };
  3284.           this.constructorOptions = {
  3285.             host: 'https://checkout.stripe.com',
  3286.             forceView: false,
  3287.             forceAppType: false
  3288.           };
  3289.           this.timeLoaded = Math.floor((new Date).getTime() / 1000);
  3290.           this.totalButtons = 0;
  3291.           if (((ref = window.Prototype) != null ? (ref1 = ref.Version) != null ? ref1.indexOf('1.6') : void 0 : void 0) === 0) {
  3292.             console.error('Stripe Checkout is not compatible with your version of Prototype.js. Please upgrade to version 1.7 or greater.')
  3293.           }
  3294.           this.ensureStripeHosted()
  3295.         }
  3296.         App.prototype.open = function (options, buttonId) {
  3297.           var checkout,
  3298.           k,
  3299.           mergedOptions,
  3300.           ref,
  3301.           v;
  3302.           if (options == null) {
  3303.             options = {
  3304.             }
  3305.           }
  3306.           if (buttonId == null) {
  3307.             buttonId = null
  3308.           }
  3309.           mergedOptions = {
  3310.           };
  3311.           if (buttonId && this.configurations[buttonId]) {
  3312.             ref = this.configurations[buttonId];
  3313.             for (k in ref) {
  3314.               v = ref[k];
  3315.               mergedOptions[k] = v
  3316.             }
  3317.           }
  3318.           for (k in options) {
  3319.             v = options[k];
  3320.             mergedOptions[k] = v
  3321.           }
  3322.           if (mergedOptions.image) {
  3323.             mergedOptions.image = utils.resolve(mergedOptions.image)
  3324.           }
  3325.           mergedOptions.referrer = document.referrer;
  3326.           mergedOptions.url = document.URL;
  3327.           mergedOptions.timeLoaded = this.timeLoaded;
  3328.           optionParser.checkUsage('open', mergedOptions);
  3329.           this.validateOptions(options, 'open');
  3330.           mergedOptions.createSource = !!mergedOptions.source;
  3331.           if (buttonId) {
  3332.             checkout = this.checkouts[buttonId];
  3333.             if (options.token != null || options.onToken != null) {
  3334.               checkout.setOnToken(new TokenCallback(options))
  3335.             }
  3336.           } else {
  3337.             checkout = new Checkout(new TokenCallback(options), this.constructorOptions, options)
  3338.           }
  3339.           this.trackOpen(checkout, mergedOptions);
  3340.           this.trackViewport();
  3341.           return checkout.open(mergedOptions)
  3342.         };
  3343.         App.prototype.close = function (buttonId) {
  3344.           var ref;
  3345.           return (ref = this.checkouts[buttonId]) != null ? ref.close() : void 0
  3346.         };
  3347.         App.prototype.configure = function (buttonId, options) {
  3348.           if (options == null) {
  3349.             options = {
  3350.             }
  3351.           }
  3352.           if (buttonId instanceof Object) {
  3353.             options = buttonId;
  3354.             buttonId = 'button' + this.totalButtons++
  3355.           }
  3356.           this.enableTracker(options);
  3357.           this.emitDeveloperWarning(options);
  3358.           optionParser.checkUsage('configure', options);
  3359.           if (options.image) {
  3360.             options.image = utils.resolve(options.image)
  3361.           }
  3362.           this.validateOptions(options, 'configure');
  3363.           this.configurations[buttonId] = options;
  3364.           this.checkouts[buttonId] = new Checkout(new TokenCallback(options), this.constructorOptions, options);
  3365.           this.checkouts[buttonId].preload(options);
  3366.           return {
  3367.             open: function (_this) {
  3368.               return function (options) {
  3369.                 return _this.open(options, buttonId)
  3370.               }
  3371.             }(this),
  3372.             close: function (_this) {
  3373.               return function () {
  3374.                 return _this.close(buttonId)
  3375.               }
  3376.             }(this)
  3377.           }
  3378.         };
  3379.         App.prototype.ensureStripeHosted = function () {
  3380.           var src;
  3381.           if (document.currentScript) {
  3382.             src = document.currentScript.src;
  3383.             if (!origins.isStripeHosted(src)) {
  3384.               if (origins.isLocalhost(src)) {
  3385.                 return console.error('Checkout needs to be loaded directly from \nhttps://checkout.stripe.com/checkout.js\nOtherwise your integration will not work in production.')
  3386.               } else {
  3387.                 this.trackSelfHostedError();
  3388.                 return console.error('Checkout needs to be loaded directly from https://checkout.stripe.com/checkout.js')
  3389.               }
  3390.             }
  3391.           }
  3392.         };
  3393.         App.prototype.validateOptions = function (options, which) {
  3394.           var error,
  3395.           url;
  3396.           try {
  3397.             return JSON.stringify(options)
  3398.           } catch (error) {
  3399.             url = 'https://stripe.com/docs/checkout#integration-custom';
  3400.             throw new Error('Stripe Checkout was unable to serialize the options passed to StripeCheckout.' + which + '(). Please consult the doumentation to confirm that you\'re supplying values of the expected type: ' + url)
  3401.           }
  3402.         };
  3403.         App.prototype.emitDeveloperWarning = function (options) {
  3404.           var isTestmode,
  3405.           mode;
  3406.           mode = keymode.fromKey(options.key);
  3407.           isTestmode = mode === keymode.KEY_MODES.test;
  3408.           if (isTestmode) {
  3409.             return typeof console !== 'undefined' && console !== null ? console.warn('You’re using the legacy version of Stripe Checkout.\n\nWe released a new version of Checkout in April 2019, which supports mobile wallets and other payment methods:\nhttps://stripe.com/docs/payments/checkout\n\nLearn how to upgrade to the new version:\nhttps://stripe.com/docs/payments/checkout/migration') : void 0
  3410.           }
  3411.         };
  3412.         App.prototype.setHost = function (host) {
  3413.           return this.constructorOptions.host = host
  3414.         };
  3415.         App.prototype.getHost = function () {
  3416.           return this.constructorOptions.host
  3417.         };
  3418.         App.prototype.setForceView = function (force) {
  3419.           return this.constructorOptions.forceView = force
  3420.         };
  3421.         App.prototype.setForceAppType = function (force) {
  3422.           return this.constructorOptions.forceAppType = force
  3423.         };
  3424.         App.prototype.enableTracker = function (options) {
  3425.           return tracker.setEnabled(!options.notrack)
  3426.         };
  3427.         App.prototype.trackOpen = function (checkout, options) {
  3428.           var data;
  3429.           this.enableTracker(options);
  3430.           data = {
  3431.             key: options.key,
  3432.             lsid: 'NA',
  3433.             cid: 'NA'
  3434.           };
  3435.           return tracker.track.outerOpen(data)
  3436.         };
  3437.         App.prototype.trackSelfHostedError = function () {
  3438.           tracker.setEnabled(true);
  3439.           return tracker.track.selfHostedError()
  3440.         };
  3441.         App.prototype.trackViewport = function (checkout, options) {
  3442.           var error,
  3443.           metaTags,
  3444.           tag,
  3445.           viewport,
  3446.           viewportContent;
  3447.           metaTags = document.getElementsByTagName('meta');
  3448.           viewportContent = function () {
  3449.             var i,
  3450.             len,
  3451.             results;
  3452.             results = [
  3453.             ];
  3454.             for (i = 0, len = metaTags.length; i < len; i++) {
  3455.               tag = metaTags[i];
  3456.               if (tag.name === 'viewport' && !!tag.content) {
  3457.                 results.push(tag.content)
  3458.               }
  3459.             }
  3460.             return results
  3461.           }().join(',');
  3462.           try {
  3463.             viewport = viewportContent.split(',').map(function (t) {
  3464.               return t.trim().toLowerCase()
  3465.             }).sort().join(', ');
  3466.             return tracker.track.viewport(viewport)
  3467.           } catch (error) {
  3468.           }
  3469.         };
  3470.         return App
  3471.       }();
  3472.       module.exports = App
  3473.     }).call(this)
  3474.   }
  3475. });
  3476. StripeCheckout.require.define({
  3477.   'outer/controllers/button': function (exports, require, module) {
  3478.     (function () {
  3479.       var $$,
  3480.       Button,
  3481.       addClass,
  3482.       append,
  3483.       hasAttr,
  3484.       hasClass,
  3485.       helpers,
  3486.       insertAfter,
  3487.       optionParser,
  3488.       parents,
  3489.       ref,
  3490.       resolve,
  3491.       text,
  3492.       trigger,
  3493.       bind = function (fn, me) {
  3494.         return function () {
  3495.           return fn.apply(me, arguments)
  3496.         }
  3497.       };
  3498.       ref = require('outer/lib/utils'),
  3499.       $$ = ref.$$,
  3500.       hasClass = ref.hasClass,
  3501.       addClass = ref.addClass,
  3502.       trigger = ref.trigger,
  3503.       append = ref.append,
  3504.       text = ref.text,
  3505.       parents = ref.parents,
  3506.       insertAfter = ref.insertAfter,
  3507.       hasAttr = ref.hasAttr,
  3508.       resolve = ref.resolve;
  3509.       helpers = require('lib/helpers');
  3510.       optionParser = require('lib/optionParser');
  3511.       Button = function () {
  3512.         Button.totalButtonId = 0;
  3513.         Button.load = function (app) {
  3514.           var button,
  3515.           el,
  3516.           element;
  3517.           element = $$('stripe-button');
  3518.           element = function () {
  3519.             var i,
  3520.             len,
  3521.             results;
  3522.             results = [
  3523.             ];
  3524.             for (i = 0, len = element.length; i < len; i++) {
  3525.               el = element[i];
  3526.               if (!hasClass(el, 'active')) {
  3527.                 results.push(el)
  3528.               }
  3529.             }
  3530.             return results
  3531.           }();
  3532.           element = element[element.length - 1];
  3533.           if (!element) {
  3534.             return
  3535.           }
  3536.           addClass(element, 'active');
  3537.           button = new Button(element, app);
  3538.           return button.append()
  3539.         };
  3540.         function Button(scriptEl, app) {
  3541.           this.parseOptions = bind(this.parseOptions, this);
  3542.           this.parentHead = bind(this.parentHead, this);
  3543.           this.parentForm = bind(this.parentForm, this);
  3544.           this.onToken = bind(this.onToken, this);
  3545.           this.open = bind(this.open, this);
  3546.           this.submit = bind(this.submit, this);
  3547.           this.append = bind(this.append, this);
  3548.           this.render = bind(this.render, this);
  3549.           var base;
  3550.           this.scriptEl = scriptEl;
  3551.           this.app = app;
  3552.           this.document = this.scriptEl.ownerDocument;
  3553.           this.options = this.parseOptions();
  3554.           (base = this.options).label || (base.label = 'Pay with Card');
  3555.           this.options.token = this.onToken;
  3556.           this.options.buttonIntegration = true;
  3557.           this.$el = document.createElement('button');
  3558.           this.$el.setAttribute('type', 'submit');
  3559.           this.$el.className = 'stripe-button-el';
  3560.           helpers.bind(this.$el, 'click', this.submit);
  3561.           helpers.bind(this.$el, 'touchstart', function () {
  3562.           });
  3563.           this.render()
  3564.         }
  3565.         Button.prototype.render = function () {
  3566.           this.$el.innerHTML = '';
  3567.           this.$span = document.createElement('span');
  3568.           text(this.$span, this.options.label);
  3569.           if (!this.nostyle) {
  3570.             this.$el.style.visibility = 'hidden';
  3571.             this.$span.style.display = 'block';
  3572.             this.$span.style.minHeight = '30px'
  3573.           }
  3574.           this.$style = document.createElement('link');
  3575.           this.$style.setAttribute('type', 'text/css');
  3576.           this.$style.setAttribute('rel', 'stylesheet');
  3577.           this.$style.setAttribute('href', this.app.getHost() + '/v3/checkout/button-qpwW2WfkB0oGWVWIASjIOQ.css');
  3578.           return append(this.$el, this.$span)
  3579.         };
  3580.         Button.prototype.append = function () {
  3581.           var head;
  3582.           if (this.scriptEl) {
  3583.             insertAfter(this.scriptEl, this.$el)
  3584.           }
  3585.           if (!this.nostyle) {
  3586.             head = this.parentHead();
  3587.             if (head) {
  3588.               append(head, this.$style)
  3589.             }
  3590.           }
  3591.           if (this.$form = this.parentForm()) {
  3592.             helpers.unbind(this.$form, 'submit', this.submit);
  3593.             helpers.bind(this.$form, 'submit', this.submit)
  3594.           }
  3595.           if (!this.nostyle) {
  3596.             setTimeout(function (_this) {
  3597.               return function () {
  3598.                 return _this.$el.style.visibility = 'visible'
  3599.               }
  3600.             }(this), 1000)
  3601.           }
  3602.           this.app.setHost(helpers.host(this.scriptEl.src));
  3603.           return this.appHandler = this.app.configure(this.options, {
  3604.             form: this.$form
  3605.           })
  3606.         };
  3607.         Button.prototype.disable = function () {
  3608.           return this.$el.setAttribute('disabled', true)
  3609.         };
  3610.         Button.prototype.enable = function () {
  3611.           return this.$el.removeAttribute('disabled')
  3612.         };
  3613.         Button.prototype.isDisabled = function () {
  3614.           return hasAttr(this.$el, 'disabled')
  3615.         };
  3616.         Button.prototype.submit = function (e) {
  3617.           if (typeof e.preventDefault === 'function') {
  3618.             e.preventDefault()
  3619.           }
  3620.           if (!this.isDisabled()) {
  3621.             this.open()
  3622.           }
  3623.           return false
  3624.         };
  3625.         Button.prototype.open = function () {
  3626.           return this.appHandler.open(this.options)
  3627.         };
  3628.         Button.prototype.onToken = function (token, args) {
  3629.           var $input,
  3630.           $tokenInput,
  3631.           $tokenTypeInput,
  3632.           key,
  3633.           value;
  3634.           trigger(this.scriptEl, 'token', token);
  3635.           if (this.$form) {
  3636.             $tokenInput = this.renderInput('stripeToken', token.id);
  3637.             append(this.$form, $tokenInput);
  3638.             $tokenTypeInput = this.renderInput('stripeTokenType', token.type);
  3639.             append(this.$form, $tokenTypeInput);
  3640.             if (token.email) {
  3641.               append(this.$form, this.renderInput('stripeEmail', token.email))
  3642.             }
  3643.             if (args) {
  3644.               for (key in args) {
  3645.                 value = args[key];
  3646.                 $input = this.renderInput(this.formatKey(key), value);
  3647.                 append(this.$form, $input)
  3648.               }
  3649.             }
  3650.             this.$form.submit()
  3651.           }
  3652.           return this.disable()
  3653.         };
  3654.         Button.prototype.formatKey = function (key) {
  3655.           var arg,
  3656.           args,
  3657.           i,
  3658.           len;
  3659.           args = key.split('_');
  3660.           key = '';
  3661.           for (i = 0, len = args.length; i < len; i++) {
  3662.             arg = args[i];
  3663.             if (arg.length > 0) {
  3664.               key = key + arg.substr(0, 1).toUpperCase() + arg.substr(1).toLowerCase()
  3665.             }
  3666.           }
  3667.           return 'stripe' + key
  3668.         };
  3669.         Button.prototype.renderInput = function (name, value) {
  3670.           var input;
  3671.           input = document.createElement('input');
  3672.           input.type = 'hidden';
  3673.           input.name = name;
  3674.           input.value = value;
  3675.           return input
  3676.         };
  3677.         Button.prototype.parentForm = function () {
  3678.           var el,
  3679.           elements,
  3680.           i,
  3681.           len,
  3682.           ref1;
  3683.           elements = parents(this.$el);
  3684.           for (i = 0, len = elements.length; i < len; i++) {
  3685.             el = elements[i];
  3686.             if (((ref1 = el.tagName) != null ? ref1.toLowerCase() : void 0) === 'form') {
  3687.               return el
  3688.             }
  3689.           }
  3690.           return null
  3691.         };
  3692.         Button.prototype.parentHead = function () {
  3693.           var ref1,
  3694.           ref2;
  3695.           return ((ref1 = this.document) != null ? ref1.head : void 0) || ((ref2 = this.document) != null ? ref2.getElementsByTagName('head') [0] : void 0) || this.document.body
  3696.         };
  3697.         Button.prototype.parseOptions = function () {
  3698.           var attr,
  3699.           camelOption,
  3700.           coercedValue,
  3701.           i,
  3702.           len,
  3703.           match,
  3704.           options,
  3705.           ref1,
  3706.           val;
  3707.           options = {
  3708.           };
  3709.           ref1 = this.scriptEl.attributes;
  3710.           for (i = 0, len = ref1.length; i < len; i++) {
  3711.             attr = ref1[i];
  3712.             match = attr.name.match(/^data-(.+)$/);
  3713.             if (match != null ? match[1] : void 0) {
  3714.               camelOption = helpers.dashToCamelCase(match[1]);
  3715.               if (camelOption === 'image') {
  3716.                 if (attr.value) {
  3717.                   val = resolve(attr.value)
  3718.                 }
  3719.               } else {
  3720.                 val = attr.value
  3721.               }
  3722.               coercedValue = optionParser.coerceButtonOption(camelOption, val);
  3723.               options[camelOption] = coercedValue;
  3724.               if (options.__originals == null) {
  3725.                 options.__originals = {
  3726.                 }
  3727.               }
  3728.               options.__originals[camelOption] = match[0]
  3729.             }
  3730.           }
  3731.           return options
  3732.         };
  3733.         return Button
  3734.       }();
  3735.       module.exports = Button
  3736.     }).call(this)
  3737.   }
  3738. });
  3739. StripeCheckout.require.define({
  3740.   'outer/controllers/checkout': function (exports, require, module) {
  3741.     (function () {
  3742.       var Checkout,
  3743.       IframeView,
  3744.       TabView,
  3745.       helpers,
  3746.       tracker,
  3747.       bind = function (fn, me) {
  3748.         return function () {
  3749.           return fn.apply(me, arguments)
  3750.         }
  3751.       };
  3752.       helpers = require('lib/helpers');
  3753.       IframeView = require('outer/views/iframeView');
  3754.       TabView = require('outer/views/tabView');
  3755.       tracker = require('lib/tracker');
  3756.       Checkout = function () {
  3757.         Checkout.activeView = null;
  3758.         function Checkout(tokenCallback, options, configOptions) {
  3759.           this.isLegacyIe = bind(this.isLegacyIe, this);
  3760.           this.onTokenCallback = bind(this.onTokenCallback, this);
  3761.           this.preload = bind(this.preload, this);
  3762.           this.open = bind(this.open, this);
  3763.           this.createView = bind(this.createView, this);
  3764.           this.setOnToken = bind(this.setOnToken, this);
  3765.           var couldBeBrokenSFSVC,
  3766.           forceIframeViewFromQuery,
  3767.           isFullscreenMobileCapableViewport;
  3768.           this.host = options.host;
  3769.           this.forceView = options.forceView;
  3770.           this.forceAppType = options.forceAppType;
  3771.           this.opened = false;
  3772.           this.setOnToken(tokenCallback);
  3773.           this.isMobileWebView = helpers.isNativeWebContainer() || helpers.isAndroidWebapp() || helpers.isAndroidFacebookApp() || helpers.isiOSWebView() || helpers.isiOSBroken();
  3774.           couldBeBrokenSFSVC = helpers.couldBeBrokenSFSVC();
  3775.           isFullscreenMobileCapableViewport = helpers.isFullscreenMobileCapableViewport();
  3776.           forceIframeViewFromQuery = window.location.search.indexOf('__stripe_private_force_mobile_frame=true') !== - 1;
  3777.           this.useFullscreenMobileView = function () {
  3778.             if (forceIframeViewFromQuery) {
  3779.               return true
  3780.             }
  3781.             if (!isFullscreenMobileCapableViewport) {
  3782.               return false
  3783.             }
  3784.             return couldBeBrokenSFSVC || helpers.isSafariStandaloneMode()
  3785.           };
  3786.           this.shouldPopup = helpers.isSupportedMobileOS() && !this.isMobileWebView && !this.useFullscreenMobileView();
  3787.           this.createView()
  3788.         }
  3789.         Checkout.prototype.setOnToken = function (tokenCallback) {
  3790.           var ref;
  3791.           this.tokenCallback = tokenCallback;
  3792.           this.onToken = function (_this) {
  3793.             return function (data) {
  3794.               return tokenCallback.trigger(data.token, data.args, _this.onTokenCallback)
  3795.             }
  3796.           }(this);
  3797.           return (ref = this.view) != null ? ref.onToken = this.onToken : void 0
  3798.         };
  3799.         Checkout.prototype.createView = function () {
  3800.           var forceViewClass,
  3801.           path,
  3802.           viewClass,
  3803.           views;
  3804.           if (this.view != null) {
  3805.             return
  3806.           }
  3807.           views = {
  3808.             IframeView: IframeView,
  3809.             TabView: TabView
  3810.           };
  3811.           forceViewClass = views[this.forceView];
  3812.           viewClass = function () {
  3813.             switch (false) {
  3814.               case !forceViewClass:
  3815.                 return forceViewClass;
  3816.               case !this.shouldPopup:
  3817.                 return TabView;
  3818.               default:
  3819.                 return IframeView
  3820.             }
  3821.           }.call(this);
  3822.           path = '/v3/82u6Z5A5MLNC2LtLYKXrWQ.html?distinct_id=' + tracker.getDistinctID();
  3823.           if (this.forceAppType) {
  3824.             path = path + '&force_app_type=' + this.forceAppType
  3825.           }
  3826.           this.view = new viewClass(this.onToken, this.host, path);
  3827.           if (this.preloadOptions != null) {
  3828.             this.view.preload(this.preloadOptions);
  3829.             return this.preloadOptions = null
  3830.           }
  3831.         };
  3832.         Checkout.prototype.open = function (options) {
  3833.           var iframeFallback;
  3834.           if (options == null) {
  3835.             options = {
  3836.             }
  3837.           }
  3838.           this.opened = true;
  3839.           if (Checkout.activeView && Checkout.activeView !== this.view) {
  3840.             Checkout.activeView.close()
  3841.           }
  3842.           Checkout.activeView = this.view;
  3843.           options.supportsTokenCallback = this.tokenCallback.supportsTokenCallback();
  3844.           iframeFallback = function (_this) {
  3845.             return function () {
  3846.               if (!(_this.view instanceof TabView)) {
  3847.                 return
  3848.               }
  3849.               _this.view = new IframeView(_this.onToken, _this.host, '/v3/82u6Z5A5MLNC2LtLYKXrWQ.html');
  3850.               tracker.track.tabOpeningError();
  3851.               return _this.open(options)
  3852.             }
  3853.           }(this);
  3854.           if (helpers.isiOSChrome() && helpers.iOSChromeTabViewWillFail()) {
  3855.             return iframeFallback()
  3856.           }
  3857.           return this.view.open(options, function (_this) {
  3858.             return function (status) {
  3859.               if (!status) {
  3860.                 return iframeFallback()
  3861.               }
  3862.             }
  3863.           }(this))
  3864.         };
  3865.         Checkout.prototype.close = function () {
  3866.           var ref;
  3867.           return (ref = this.view) != null ? ref.close() : void 0
  3868.         };
  3869.         Checkout.prototype.preload = function (options) {
  3870.           if (this.view != null) {
  3871.             return this.view.preload(options)
  3872.           } else {
  3873.             return this.preloadOptions = options
  3874.           }
  3875.         };
  3876.         Checkout.prototype.onTokenCallback = function () {
  3877.           return this.view.triggerTokenCallback.apply(this.view, arguments)
  3878.         };
  3879.         Checkout.prototype.isLegacyIe = function () {
  3880.           return !(window.XMLHttpRequest != null && (new XMLHttpRequest).withCredentials != null)
  3881.         };
  3882.         return Checkout
  3883.       }();
  3884.       module.exports = Checkout
  3885.     }).call(this)
  3886.   }
  3887. });
  3888. StripeCheckout.require.define({
  3889.   'outer/controllers/tokenCallback': function (exports, require, module) {
  3890.     (function () {
  3891.       var TokenCallback,
  3892.       bind = function (fn, me) {
  3893.         return function () {
  3894.           return fn.apply(me, arguments)
  3895.         }
  3896.       };
  3897.       TokenCallback = function () {
  3898.         function TokenCallback(options) {
  3899.           this.supportsTokenCallback = bind(this.supportsTokenCallback, this);
  3900.           this.trigger = bind(this.trigger, this);
  3901.           if (options.token) {
  3902.             this.fn = options.token;
  3903.             this.version = 1
  3904.           }
  3905.           if (options.source) {
  3906.             this.fn = options.source;
  3907.             this.version = 1
  3908.           } else if (options.onToken) {
  3909.             this.fn = options.onToken;
  3910.             this.version = 2
  3911.           }
  3912.         }
  3913.         TokenCallback.prototype.trigger = function (token, addresses, callback) {
  3914.           var data,
  3915.           k,
  3916.           shipping,
  3917.           v;
  3918.           if (this.version === 2) {
  3919.             data = {
  3920.               token: token
  3921.             };
  3922.             shipping = null;
  3923.             for (k in addresses) {
  3924.               v = addresses[k];
  3925.               if (/^shipping_/.test(k)) {
  3926.                 if (shipping == null) {
  3927.                   shipping = {
  3928.                   }
  3929.                 }
  3930.                 shipping[k.replace(/^shipping_/, '')] = v
  3931.               }
  3932.             }
  3933.             if (shipping != null) {
  3934.               data.shipping = shipping
  3935.             }
  3936.             return this.fn(data, callback)
  3937.           } else {
  3938.             return this.fn(token, addresses)
  3939.           }
  3940.         };
  3941.         TokenCallback.prototype.supportsTokenCallback = function () {
  3942.           return this.version > 1
  3943.         };
  3944.         return TokenCallback
  3945.       }();
  3946.       module.exports = TokenCallback
  3947.     }).call(this)
  3948.   }
  3949. });
  3950. StripeCheckout.require.define({
  3951.   'outer/views/iframeView': function (exports, require, module) {
  3952.     (function () {
  3953.       var IframeView,
  3954.       RPC,
  3955.       View,
  3956.       helpers,
  3957.       ready,
  3958.       utils,
  3959.       bind = function (fn, me) {
  3960.         return function () {
  3961.           return fn.apply(me, arguments)
  3962.         }
  3963.       },
  3964.       extend = function (child, parent) {
  3965.         for (var key in parent) {
  3966.           if (hasProp.call(parent, key)) child[key] = parent[key]
  3967.         }
  3968.         function ctor() {
  3969.           this.constructor = child
  3970.         }
  3971.         ctor.prototype = parent.prototype;
  3972.         child.prototype = new ctor;
  3973.         child.__super__ = parent.prototype;
  3974.         return child
  3975.       },
  3976.       hasProp = {
  3977.       }.hasOwnProperty;
  3978.       utils = require('outer/lib/utils');
  3979.       helpers = require('lib/helpers');
  3980.       RPC = require('lib/rpc');
  3981.       View = require('outer/views/view');
  3982.       ready = require('vendor/ready');
  3983.       IframeView = function (superClass) {
  3984.         extend(IframeView, superClass);
  3985.         function IframeView(onToken, host, path) {
  3986.           this.configure = bind(this.configure, this);
  3987.           this.removeFrame = bind(this.removeFrame, this);
  3988.           this.removeTouchOverlay = bind(this.removeTouchOverlay, this);
  3989.           this.showTouchOverlay = bind(this.showTouchOverlay, this);
  3990.           this.attachIframe = bind(this.attachIframe, this);
  3991.           this.setToken = bind(this.setToken, this);
  3992.           this.closed = bind(this.closed, this);
  3993.           this.close = bind(this.close, this);
  3994.           this.preload = bind(this.preload, this);
  3995.           this.opened = bind(this.opened, this);
  3996.           this.open = bind(this.open, this);
  3997.           IframeView.__super__.constructor.apply(this, arguments);
  3998.           this.useFullscreenMobileIframe = helpers.couldBeBrokenSFSVC();
  3999.           this.backButtonListener = function (_this) {
  4000.             return function () {
  4001.               if (history.state === 'temp1') {
  4002.                 _this.frame.style.visibility = 'hidden';
  4003.                 _this.frame.style.display = 'none';
  4004.                 return _this.close()
  4005.               }
  4006.             }
  4007.           }(this)
  4008.         }
  4009.         IframeView.prototype.open = function (options, callback) {
  4010.           IframeView.__super__.open.apply(this, arguments);
  4011.           return ready(function (_this) {
  4012.             return function () {
  4013.               var left,
  4014.               loaded,
  4015.               ref;
  4016.               _this.originalOverflowValue = document.body.style.overflow;
  4017.               if (_this.useFullscreenMobileIframe) {
  4018.                 _this.originalPositionValue = document.body.style.position;
  4019.                 _this.originalWidthValue = document.body.style.width;
  4020.                 _this.originalHeightValue = document.body.style.height;
  4021.                 history.pushState('temp1', null, null);
  4022.                 history.pushState('temp2', null, null);
  4023.                 window.addEventListener('popstate', _this.backButtonListener);
  4024.                 document.body.style.overflow = 'hidden';
  4025.                 document.body.style.position = 'fixed';
  4026.                 document.body.style.width = '100%';
  4027.                 document.body.style.height = '100%'
  4028.               }
  4029.               if (_this.frame == null) {
  4030.                 _this.configure()
  4031.               }
  4032.               if (typeof $ !== 'undefined' && $ !== null ? (ref = $.fn) != null ? ref.modal : void 0 : void 0) {
  4033.                 $(document).off('focusin.bs.modal').off('focusin.modal')
  4034.               }
  4035.               if (helpers.isIE()) {
  4036.                 document.body.style.overflow = 'hidden'
  4037.               }
  4038.               _this.frame.style.display = 'block';
  4039.               if (_this.shouldShowTouchOverlay()) {
  4040.                 _this.showTouchOverlay();
  4041.                 left = window.scrollX || window.pageXOffset;
  4042.                 if (_this.iframeWidth() < window.innerWidth) {
  4043.                   left += (window.innerWidth - _this.iframeWidth()) / 2
  4044.                 }
  4045.                 _this.frame.style.top = (window.scrollY || window.pageYOffset) + 'px';
  4046.                 _this.frame.style.left = left + 'px'
  4047.               }
  4048.               loaded = false;
  4049.               setTimeout(function () {
  4050.                 if (loaded) {
  4051.                   return
  4052.                 }
  4053.                 loaded = true;
  4054.                 callback(false);
  4055.                 return _this.removeFrame()
  4056.               }, 8000);
  4057.               return _this.rpc.ready(function () {
  4058.                 if (loaded) {
  4059.                   return
  4060.                 }
  4061.                 loaded = true;
  4062.                 callback(true);
  4063.                 _this.rpc.invoke('render', '', 'iframe', _this.options);
  4064.                 if (helpers.isIE()) {
  4065.                   document.body.style.overflow = 'hidden'
  4066.                 }
  4067.                 return _this.rpc.invoke('open', {
  4068.                   timeLoaded: _this.options.timeLoaded
  4069.                 })
  4070.               })
  4071.             }
  4072.           }(this))
  4073.         };
  4074.         IframeView.prototype.opened = function () {
  4075.           var base;
  4076.           return typeof (base = this.options).opened === 'function' ? base.opened() : void 0
  4077.         };
  4078.         IframeView.prototype.preload = function (options) {
  4079.           return ready(function (_this) {
  4080.             return function () {
  4081.               _this.configure();
  4082.               return _this.rpc.invoke('preload', options)
  4083.             }
  4084.           }(this))
  4085.         };
  4086.         IframeView.prototype.iframeWidth = function () {
  4087.           if (helpers.isSmallScreen()) {
  4088.             return 328
  4089.           } else {
  4090.             return 380
  4091.           }
  4092.         };
  4093.         IframeView.prototype.close = function () {
  4094.           if (!!this.rpc.target.window) {
  4095.             return this.rpc.invoke('close')
  4096.           }
  4097.         };
  4098.         IframeView.prototype.closed = function (e) {
  4099.           var base,
  4100.           tokenReceived;
  4101.           tokenReceived = this.token != null;
  4102.           document.body.style.overflow = this.originalOverflowValue;
  4103.           this.removeFrame();
  4104.           if (this.useFullscreenMobileIframe) {
  4105.             document.body.style.position = this.originalPositionValue;
  4106.             document.body.style.width = this.originalWidthValue;
  4107.             document.body.style.height = this.originalHeightValue;
  4108.             window.removeEventListener('popstate', this.backButtonListener);
  4109.             if (history.state === 'temp2') {
  4110.               history.go( - 2)
  4111.             } else if (history.state === 'temp1') {
  4112.               history.go( - 1)
  4113.             }
  4114.           }
  4115.           clearTimeout(this.tokenTimeout);
  4116.           if (tokenReceived) {
  4117.             this.onToken(this.token)
  4118.           }
  4119.           this.token = null;
  4120.           if (typeof (base = this.options).closed === 'function') {
  4121.             base.closed()
  4122.           }
  4123.           if ((e != null ? e.type : void 0) === 'error.close') {
  4124.             return alert(e.message)
  4125.           } else if (!tokenReceived) {
  4126.             return this.preload(this.options)
  4127.           }
  4128.         };
  4129.         IframeView.prototype.setToken = function (data) {
  4130.           this.token = data;
  4131.           if (this.tokenTimeout == null) {
  4132.             this.tokenTimeout = setTimeout(function (_this) {
  4133.               return function () {
  4134.                 _this.onToken(_this.token);
  4135.                 _this.tokenTimeout = null;
  4136.                 return _this.token = null
  4137.               }
  4138.             }(this), 3000)
  4139.           }
  4140.           return null
  4141.         };
  4142.         IframeView.prototype.attachIframe = function () {
  4143.           var cssText,
  4144.           iframe;
  4145.           iframe = document.createElement('iframe');
  4146.           iframe.setAttribute('frameBorder', '0');
  4147.           iframe.setAttribute('allowtransparency', 'true');
  4148.           cssText = 'z-index: 2147483647;\ndisplay: none;\nbackground: transparent;\nbackground: rgba(0,0,0,0.005);\nborder: 0px none transparent;\noverflow-x: hidden;\noverflow-y: auto;\nvisibility: hidden;\nmargin: 0;\npadding: 0;\n-webkit-tap-highlight-color: transparent;\n-webkit-touch-callout: none;';
  4149.           if (this.shouldShowTouchOverlay()) {
  4150.             cssText += 'position: absolute;\nwidth: ' + this.iframeWidth() + 'px;\nheight: ' + Math.max(document.body.scrollHeight, window.innerHeight) + 'px;'
  4151.           } else {
  4152.             cssText += 'position: fixed;\nleft: 0;\ntop: 0;\nwidth: 100%;\nheight: 100%;';
  4153.             if (this.useFullscreenMobileIframe) {
  4154.               cssText += 'overflow-x: hidden;\noverflow-y: auto;\nbackground-color: white;'
  4155.             }
  4156.           }
  4157.           iframe.style.cssText = cssText;
  4158.           helpers.bind(iframe, 'load', function () {
  4159.             return iframe.style.visibility = 'visible'
  4160.           });
  4161.           iframe.src = this.host + this.path;
  4162.           iframe.className = iframe.name = 'stripe_checkout_app';
  4163.           utils.append(document.body, iframe);
  4164.           return iframe
  4165.         };
  4166.         IframeView.prototype.showTouchOverlay = function () {
  4167.           var toRepaint;
  4168.           if (this.overlay) {
  4169.             return
  4170.           }
  4171.           this.overlay = document.createElement('div');
  4172.           this.overlay.style.cssText = 'z-index: 2147483646;\nbackground: #000;\nopacity: 0;\nborder: 0px none transparent;\noverflow: none;\nmargin: 0;\npadding: 0;\n-webkit-tap-highlight-color: transparent;\n-webkit-touch-callout: none;\ntransition: opacity 320ms ease;\n-webkit-transition: opacity 320ms ease;\n-moz-transition: opacity 320ms ease;\n-ms-transition: opacity 320ms ease;';
  4173.           this.overlay.style.position = 'absolute';
  4174.           this.overlay.style.left = 0;
  4175.           this.overlay.style.top = 0;
  4176.           this.overlay.style.width = document.body.scrollWidth + 'px';
  4177.           this.overlay.style.height = Math.max(document.body.scrollHeight, window.innerHeight) + 'px';
  4178.           utils.append(document.body, this.overlay);
  4179.           toRepaint = this.overlay.offsetHeight;
  4180.           return this.overlay.style.opacity = '0.5'
  4181.         };
  4182.         IframeView.prototype.removeTouchOverlay = function () {
  4183.           var overlay;
  4184.           if (!this.overlay) {
  4185.             return
  4186.           }
  4187.           overlay = this.overlay;
  4188.           overlay.style.opacity = '0';
  4189.           setTimeout(function () {
  4190.             return utils.remove(overlay)
  4191.           }, 400);
  4192.           return this.overlay = null
  4193.         };
  4194.         IframeView.prototype.removeFrame = function () {
  4195.           var frame;
  4196.           if (!this.frame) {
  4197.             return
  4198.           }
  4199.           if (this.shouldShowTouchOverlay()) {
  4200.             this.removeTouchOverlay()
  4201.           }
  4202.           frame = this.frame;
  4203.           if (this.useFullscreenMobileIframe) {
  4204.             this.frame.style.visibility = 'hidden';
  4205.             this.frame.style.display = 'none'
  4206.           }
  4207.           setTimeout(function () {
  4208.             return utils.remove(frame)
  4209.           }, 500);
  4210.           return this.frame = null
  4211.         };
  4212.         IframeView.prototype.configure = function () {
  4213.           if (this.frame != null) {
  4214.             this.removeFrame()
  4215.           }
  4216.           this.frame = this.attachIframe();
  4217.           this.rpc = new RPC(this.frame.contentWindow, {
  4218.             host: this.host
  4219.           });
  4220.           this.rpc.methods.closed = this.closed;
  4221.           this.rpc.methods.setToken = this.setToken;
  4222.           return this.rpc.methods.opened = this.opened
  4223.         };
  4224.         IframeView.prototype.shouldShowTouchOverlay = function () {
  4225.           return !this.useFullscreenMobileIframe && helpers.isSupportedMobileOS()
  4226.         };
  4227.         return IframeView
  4228.       }(View);
  4229.       module.exports = IframeView
  4230.     }).call(this)
  4231.   }
  4232. });
  4233. StripeCheckout.require.define({
  4234.   'outer/views/tabView': function (exports, require, module) {
  4235.     (function () {
  4236.       var RPC,
  4237.       TabView,
  4238.       View,
  4239.       helpers,
  4240.       bind = function (fn, me) {
  4241.         return function () {
  4242.           return fn.apply(me, arguments)
  4243.         }
  4244.       },
  4245.       extend = function (child, parent) {
  4246.         for (var key in parent) {
  4247.           if (hasProp.call(parent, key)) child[key] = parent[key]
  4248.         }
  4249.         function ctor() {
  4250.           this.constructor = child
  4251.         }
  4252.         ctor.prototype = parent.prototype;
  4253.         child.prototype = new ctor;
  4254.         child.__super__ = parent.prototype;
  4255.         return child
  4256.       },
  4257.       hasProp = {
  4258.       }.hasOwnProperty;
  4259.       RPC = require('lib/rpc');
  4260.       helpers = require('lib/helpers');
  4261.       View = require('outer/views/view');
  4262.       TabView = function (superClass) {
  4263.         extend(TabView, superClass);
  4264.         function TabView() {
  4265.           this.invokeOnToken = bind(this.invokeOnToken, this);
  4266.           this.closed = bind(this.closed, this);
  4267.           this.checkForClosedTab = bind(this.checkForClosedTab, this);
  4268.           this.setToken = bind(this.setToken, this);
  4269.           this.fullPath = bind(this.fullPath, this);
  4270.           this.close = bind(this.close, this);
  4271.           this.open = bind(this.open, this);
  4272.           TabView.__super__.constructor.apply(this, arguments);
  4273.           this.closedTabInterval = null;
  4274.           this.color = null;
  4275.           this.colorSet = false;
  4276.           this.invokedOnToken = false
  4277.         }
  4278.         TabView.prototype.open = function (options, callback) {
  4279.           var base,
  4280.           error,
  4281.           ref,
  4282.           ref1,
  4283.           targetName,
  4284.           url;
  4285.           TabView.__super__.open.apply(this, arguments);
  4286.           this.token = null;
  4287.           this.invokedOnToken = false;
  4288.           try {
  4289.             if ((ref = this.frame) != null) {
  4290.               ref.close()
  4291.             }
  4292.           } catch (error) {
  4293.           }
  4294.           if (window.name === 'stripe_checkout_tabview') {
  4295.             window.name = ''
  4296.           }
  4297.           if (helpers.isiOSChrome()) {
  4298.             targetName = '_blank'
  4299.           } else {
  4300.             targetName = 'stripe_checkout_tabview'
  4301.           }
  4302.           this.frame = window.open(this.fullPath(), targetName);
  4303.           if (!this.frame && ((ref1 = this.options.key) != null ? ref1.indexOf('test') : void 0) !== - 1) {
  4304.             url = 'https://stripe.com/docs/checkout#integration-more-runloop';
  4305.             console.error('Stripe Checkout was unable to open a new window, possibly due to a popup blocker.\nTo provide the best experience for your users, follow the guide at ' + url + '.\nThis message will only appear when using a test publishable key.')
  4306.           }
  4307.           if (!this.frame || this.frame === window) {
  4308.             this.close();
  4309.             callback(false);
  4310.             return
  4311.           }
  4312.           if (typeof (base = this.frame).focus === 'function') {
  4313.             base.focus()
  4314.           }
  4315.           this.rpc = new RPC(this.frame, {
  4316.             host: this.host
  4317.           });
  4318.           this.rpc.methods.setToken = this.setToken;
  4319.           this.rpc.methods.closed = this.closed;
  4320.           return this.rpc.ready(function (_this) {
  4321.             return function () {
  4322.               var base1;
  4323.               callback(true);
  4324.               _this.rpc.invoke('render', '', 'tab', _this.options);
  4325.               _this.rpc.invoke('open');
  4326.               if (typeof (base1 = _this.options).opened === 'function') {
  4327.                 base1.opened()
  4328.               }
  4329.               return _this.checkForClosedTab()
  4330.             }
  4331.           }(this))
  4332.         };
  4333.         TabView.prototype.close = function () {
  4334.           if (this.frame && this.frame !== window) {
  4335.             return this.frame.close()
  4336.           }
  4337.         };
  4338.         TabView.prototype.fullPath = function () {
  4339.           return this.host + this.path
  4340.         };
  4341.         TabView.prototype.setToken = function (data) {
  4342.           this.token = data;
  4343.           if (this.tokenTimeout == null) {
  4344.             this.tokenTimeout = setTimeout(function (_this) {
  4345.               return function () {
  4346.                 _this.invokeOnToken();
  4347.                 _this.tokenTimeout = null;
  4348.                 return _this.token = null
  4349.               }
  4350.             }(this), 3000)
  4351.           }
  4352.           return null
  4353.         };
  4354.         TabView.prototype.checkForClosedTab = function () {
  4355.           if (this.closedTabInterval) {
  4356.             clearInterval(this.closedTabInterval)
  4357.           }
  4358.           return this.closedTabInterval = setInterval(function (_this) {
  4359.             return function () {
  4360.               if (!_this.frame || !_this.frame.postMessage || _this.frame.closed) {
  4361.                 return _this.closed()
  4362.               }
  4363.             }
  4364.           }(this), 100)
  4365.         };
  4366.         TabView.prototype.closed = function () {
  4367.           var base;
  4368.           clearInterval(this.closedTabInterval);
  4369.           clearTimeout(this.tokenTimeout);
  4370.           this.invokeOnToken();
  4371.           return typeof (base = this.options).closed === 'function' ? base.closed() : void 0
  4372.         };
  4373.         TabView.prototype.invokeOnToken = function () {
  4374.           if (this.token != null && !this.invokedOnToken) {
  4375.             this.onToken(this.token);
  4376.             return this.invokedOnToken = true
  4377.           }
  4378.         };
  4379.         return TabView
  4380.       }(View);
  4381.       module.exports = TabView
  4382.     }).call(this)
  4383.   }
  4384. });
  4385. StripeCheckout.require.define({
  4386.   'outer/views/view': function (exports, require, module) {
  4387.     (function () {
  4388.       var View,
  4389.       bind = function (fn, me) {
  4390.         return function () {
  4391.           return fn.apply(me, arguments)
  4392.         }
  4393.       },
  4394.       slice = [
  4395.       ].slice;
  4396.       View = function () {
  4397.         function View(onToken, host, path) {
  4398.           this.triggerTokenCallback = bind(this.triggerTokenCallback, this);
  4399.           this.open = bind(this.open, this);
  4400.           this.onToken = onToken;
  4401.           this.host = host;
  4402.           this.path = path
  4403.         }
  4404.         View.prototype.open = function (options, callback) {
  4405.           return this.options = options
  4406.         };
  4407.         View.prototype.close = function () {
  4408.         };
  4409.         View.prototype.preload = function (options) {
  4410.         };
  4411.         View.prototype.triggerTokenCallback = function () {
  4412.           var args;
  4413.           args = arguments;
  4414.           return this.rpc.ready(function (_this) {
  4415.             return function () {
  4416.               var ref;
  4417.               return (ref = _this.rpc).invoke.apply(ref, [
  4418.                 'tokenCallback'
  4419.               ].concat(slice.call(args)))
  4420.             }
  4421.           }(this))
  4422.         };
  4423.         return View
  4424.       }();
  4425.       module.exports = View
  4426.     }).call(this)
  4427.   }
  4428. });
  4429. (function () {
  4430.   var App,
  4431.   Button,
  4432.   app,
  4433.   ref,
  4434.   ref1,
  4435.   ref2,
  4436.   ref3,
  4437.   require;
  4438.   require = require || this.StripeCheckout.require;
  4439.   Button = require('outer/controllers/button');
  4440.   App = require('outer/controllers/app');
  4441.   if (((ref = this.StripeCheckout) != null ? ref.__app : void 0) == null) {
  4442.     this.StripeCheckout || (this.StripeCheckout = {
  4443.     });
  4444.     this.StripeCheckout.__app = app = new App;
  4445.     this.StripeCheckout.open = app.open;
  4446.     this.StripeCheckout.configure = app.configure;
  4447.     this.StripeButton = this.StripeCheckout;
  4448.     if (((ref1 = this.StripeCheckout) != null ? ref1.__forceView : void 0) != null) {
  4449.       app.setForceView(this.StripeCheckout.__forceView)
  4450.     }
  4451.     if (((ref2 = this.StripeCheckout) != null ? ref2.__forceAppType : void 0) != null) {
  4452.       app.setForceAppType(this.StripeCheckout.__forceAppType)
  4453.     }
  4454.     if (((ref3 = this.StripeCheckout) != null ? ref3.__host : void 0) && this.StripeCheckout.__host !== '') {
  4455.       app.setHost(this.StripeCheckout.__host)
  4456.     }
  4457.   }
  4458.   Button.load(this.StripeCheckout.__app)
  4459. }).call(this);
  4460. // https://checkout.stripe.com/checkout.js
  4461.