made with requirebin
Last active
August 21, 2016 18:12
-
-
Save wjordan/959dc4f69f3396b7ab185768705e35e4 to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var d3 = require('d3-request'); | |
| function errorPage(err) { | |
| document.getElementById('error').style.display = 'block'; | |
| console.log(err) | |
| throw err; | |
| } | |
| d3.json("https://v757x3tk5c.execute-api.us-east-1.amazonaws.com/prod", function(error, data) { | |
| if (error) { | |
| errorPage(error); | |
| } | |
| let list = document.getElementById('list'); | |
| var items = []; | |
| data.forEach(function(item){ | |
| var elemDiv = document.createElement('li'); | |
| elemDiv.className = "registryItem"; | |
| var name = document.createElement('div'); | |
| name.className = "registryItemName"; | |
| name.textContent = item.Name; | |
| elemDiv.appendChild(name); | |
| item.Price = parseInt(item.Price); | |
| var price = document.createElement('div'); | |
| price.className = "registryItemPrice"; | |
| price.textContent = `$${item.Price}`; | |
| elemDiv.appendChild(price); | |
| var desc = document.createElement('div'); | |
| desc.className = "registryItemDesc"; | |
| desc.textContent = item.Description; | |
| elemDiv.appendChild(desc); | |
| if (item.Image) { | |
| var img = document.createElement('div'); | |
| img.className = "registryItemImage"; | |
| var image = document.createElement('img'); | |
| image.src = item.Image; | |
| img.appendChild(image); | |
| elemDiv.appendChild(img); | |
| } | |
| item.Claimed = parseInt(item.Claimed); | |
| item.Needed = parseInt(item.Needed); | |
| var claimed = document.createElement('div'); | |
| claimed.className = "registryItemClaimed"; | |
| elemDiv.appendChild(claimed); | |
| item.selected =_=> items.filter(function(i){return i == item}).length; | |
| item.allClaimed =_=> item.Claimed + item.selected() >= item.Needed; | |
| item.updateDesc = function() { | |
| claimed.textContent = item.Claimed >= item.Needed ? | |
| `${item.Claimed} already purchased` : | |
| `${item.Needed - item.Claimed} of ${item.Needed} still needed`; | |
| } | |
| item.updateDesc(); | |
| var remove = document.createElement('div'); | |
| remove.className = "registryItemRemove"; | |
| remove.onclick = function(e) { | |
| e.stopPropagation(); | |
| var index = items.indexOf(item); | |
| if (index > -1) items.splice(index, 1); | |
| item.update(); | |
| return false; | |
| }; | |
| elemDiv.appendChild(remove); | |
| item.updateLinks = function() { | |
| if (item.allClaimed()) { | |
| elemDiv.className = "registryItem allClaimed"; | |
| } else { | |
| elemDiv.className = "registryItem"; | |
| } | |
| remove.innerHTML = `${item.selected()} selected <button class="registryItemRemove">Remove</button>`; | |
| remove.style.display = item.selected() <= 0 ? 'none' : 'block'; | |
| } | |
| item.updateLinks(); | |
| item.update = function() { | |
| updateList(); | |
| item.updateLinks(); | |
| updateTotal(); | |
| item.updateDesc(); | |
| var items = document.getElementById('form-items'); | |
| items.value = JSON.stringify(items) | |
| } | |
| elemDiv.onclick = function() { | |
| if (item.Claimed + item.selected() >= item.Needed) return true; | |
| items.push(item); | |
| item.update(); | |
| return false; | |
| }; | |
| list.appendChild(elemDiv); | |
| }); | |
| function priceTotal() { | |
| return items.reduce((a, b) => a + b.Price, 0); | |
| } | |
| let register = document.getElementById('register'); | |
| let form = document.getElementById('form-register'); | |
| let email = document.getElementById('email'); | |
| form.addEventListener('submit', function(e){ | |
| d3.request("https://v757x3tk5c.execute-api.us-east-1.amazonaws.com/prod") | |
| .header("Content-Type", "application/json") | |
| .post(JSON.stringify({email: email.value, items: items}), | |
| function(err, response) { | |
| if(err) { | |
| errorPage(err); | |
| } else { | |
| document.getElementById('thankyou').style.display = 'block'; | |
| document.getElementById('selected').style.display = 'none'; | |
| document.getElementById('total').textContent = `Total: $${priceTotal()}`; | |
| document.getElementById('paypal').href += priceTotal(); | |
| document.getElementById('square').href += priceTotal(); | |
| document.getElementById('list-registered').innerHTML = items.map(item => `<li>${item.Name}: $${item.Price}</li>`).join("\n"); | |
| console.log('Registry submission complete'); | |
| } | |
| }); | |
| console.log('Form submitted'); | |
| e.preventDefault(); | |
| }); | |
| function updateTotal() { | |
| let total = priceTotal(); | |
| register.disabled = (total <= 0 || !email.validity.valid); | |
| register.value = 'Register'; | |
| totalText.style.display = total > 0 ? 'block' : 'none'; | |
| totalText.textContent = `Total: $${total}` | |
| } | |
| updateTotal(); | |
| email.addEventListener('input', e => updateTotal()); | |
| function updateList() { | |
| noItems.textContent = items.length <= 0 ? | |
| 'No items selected' : | |
| `Selected ${items.length} item${items.length > 1?'s':''}`; | |
| var selected = document.getElementById('selectedList'); | |
| while (selected.firstChild) { | |
| selected.removeChild(selected.firstChild); | |
| } | |
| items.forEach(item => { | |
| var selectedItem = document.createElement('li'); | |
| selectedItem.className = 'selectedItem'; | |
| selectedItem.textContent = `${item.Name}: $${item.Price}`; | |
| var remove = document.createElement('button'); | |
| remove.className = "registryItemRemove"; | |
| remove.textContent = "Remove"; | |
| remove.onclick = function() { | |
| var index = items.indexOf(item); | |
| if (index > -1) items.splice(index, 1); | |
| item.update(); | |
| return false; | |
| }; | |
| selected.appendChild(selectedItem); | |
| selected.appendChild(remove); | |
| }); | |
| } | |
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| setTimeout(function(){ | |
| ;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
| // https://d3js.org/d3-collection/ Version 1.0.1. Copyright 2016 Mike Bostock. | |
| (function (global, factory) { | |
| typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | |
| typeof define === 'function' && define.amd ? define(['exports'], factory) : | |
| (factory((global.d3 = global.d3 || {}))); | |
| }(this, function (exports) { 'use strict'; | |
| var prefix = "$"; | |
| function Map() {} | |
| Map.prototype = map.prototype = { | |
| constructor: Map, | |
| has: function(key) { | |
| return (prefix + key) in this; | |
| }, | |
| get: function(key) { | |
| return this[prefix + key]; | |
| }, | |
| set: function(key, value) { | |
| this[prefix + key] = value; | |
| return this; | |
| }, | |
| remove: function(key) { | |
| var property = prefix + key; | |
| return property in this && delete this[property]; | |
| }, | |
| clear: function() { | |
| for (var property in this) if (property[0] === prefix) delete this[property]; | |
| }, | |
| keys: function() { | |
| var keys = []; | |
| for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); | |
| return keys; | |
| }, | |
| values: function() { | |
| var values = []; | |
| for (var property in this) if (property[0] === prefix) values.push(this[property]); | |
| return values; | |
| }, | |
| entries: function() { | |
| var entries = []; | |
| for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); | |
| return entries; | |
| }, | |
| size: function() { | |
| var size = 0; | |
| for (var property in this) if (property[0] === prefix) ++size; | |
| return size; | |
| }, | |
| empty: function() { | |
| for (var property in this) if (property[0] === prefix) return false; | |
| return true; | |
| }, | |
| each: function(f) { | |
| for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); | |
| } | |
| }; | |
| function map(object, f) { | |
| var map = new Map; | |
| // Copy constructor. | |
| if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); | |
| // Index array by numeric index or specified key function. | |
| else if (Array.isArray(object)) { | |
| var i = -1, | |
| n = object.length, | |
| o; | |
| if (f == null) while (++i < n) map.set(i, object[i]); | |
| else while (++i < n) map.set(f(o = object[i], i, object), o); | |
| } | |
| // Convert object to map. | |
| else if (object) for (var key in object) map.set(key, object[key]); | |
| return map; | |
| } | |
| function nest() { | |
| var keys = [], | |
| sortKeys = [], | |
| sortValues, | |
| rollup, | |
| nest; | |
| function apply(array, depth, createResult, setResult) { | |
| if (depth >= keys.length) return rollup != null | |
| ? rollup(array) : (sortValues != null | |
| ? array.sort(sortValues) | |
| : array); | |
| var i = -1, | |
| n = array.length, | |
| key = keys[depth++], | |
| keyValue, | |
| value, | |
| valuesByKey = map(), | |
| values, | |
| result = createResult(); | |
| while (++i < n) { | |
| if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { | |
| values.push(value); | |
| } else { | |
| valuesByKey.set(keyValue, [value]); | |
| } | |
| } | |
| valuesByKey.each(function(values, key) { | |
| setResult(result, key, apply(values, depth, createResult, setResult)); | |
| }); | |
| return result; | |
| } | |
| function entries(map, depth) { | |
| if (++depth > keys.length) return map; | |
| var array, sortKey = sortKeys[depth - 1]; | |
| if (rollup != null && depth >= keys.length) array = map.entries(); | |
| else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); }); | |
| return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array; | |
| } | |
| return nest = { | |
| object: function(array) { return apply(array, 0, createObject, setObject); }, | |
| map: function(array) { return apply(array, 0, createMap, setMap); }, | |
| entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); }, | |
| key: function(d) { keys.push(d); return nest; }, | |
| sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; }, | |
| sortValues: function(order) { sortValues = order; return nest; }, | |
| rollup: function(f) { rollup = f; return nest; } | |
| }; | |
| } | |
| function createObject() { | |
| return {}; | |
| } | |
| function setObject(object, key, value) { | |
| object[key] = value; | |
| } | |
| function createMap() { | |
| return map(); | |
| } | |
| function setMap(map, key, value) { | |
| map.set(key, value); | |
| } | |
| function Set() {} | |
| var proto = map.prototype; | |
| Set.prototype = set.prototype = { | |
| constructor: Set, | |
| has: proto.has, | |
| add: function(value) { | |
| value += ""; | |
| this[prefix + value] = value; | |
| return this; | |
| }, | |
| remove: proto.remove, | |
| clear: proto.clear, | |
| values: proto.keys, | |
| size: proto.size, | |
| empty: proto.empty, | |
| each: proto.each | |
| }; | |
| function set(object, f) { | |
| var set = new Set; | |
| // Copy constructor. | |
| if (object instanceof Set) object.each(function(value) { set.add(value); }); | |
| // Otherwise, assume it’s an array. | |
| else if (object) { | |
| var i = -1, n = object.length; | |
| if (f == null) while (++i < n) set.add(object[i]); | |
| else while (++i < n) set.add(f(object[i], i, object)); | |
| } | |
| return set; | |
| } | |
| function keys(map) { | |
| var keys = []; | |
| for (var key in map) keys.push(key); | |
| return keys; | |
| } | |
| function values(map) { | |
| var values = []; | |
| for (var key in map) values.push(map[key]); | |
| return values; | |
| } | |
| function entries(map) { | |
| var entries = []; | |
| for (var key in map) entries.push({key: key, value: map[key]}); | |
| return entries; | |
| } | |
| exports.nest = nest; | |
| exports.set = set; | |
| exports.map = map; | |
| exports.keys = keys; | |
| exports.values = values; | |
| exports.entries = entries; | |
| Object.defineProperty(exports, '__esModule', { value: true }); | |
| })); | |
| },{}],2:[function(require,module,exports){ | |
| // https://d3js.org/d3-dispatch/ Version 1.0.1. Copyright 2016 Mike Bostock. | |
| (function (global, factory) { | |
| typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | |
| typeof define === 'function' && define.amd ? define(['exports'], factory) : | |
| (factory((global.d3 = global.d3 || {}))); | |
| }(this, function (exports) { 'use strict'; | |
| var noop = {value: function() {}}; | |
| function dispatch() { | |
| for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { | |
| if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t); | |
| _[t] = []; | |
| } | |
| return new Dispatch(_); | |
| } | |
| function Dispatch(_) { | |
| this._ = _; | |
| } | |
| function parseTypenames(typenames, types) { | |
| return typenames.trim().split(/^|\s+/).map(function(t) { | |
| var name = "", i = t.indexOf("."); | |
| if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); | |
| if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); | |
| return {type: t, name: name}; | |
| }); | |
| } | |
| Dispatch.prototype = dispatch.prototype = { | |
| constructor: Dispatch, | |
| on: function(typename, callback) { | |
| var _ = this._, | |
| T = parseTypenames(typename + "", _), | |
| t, | |
| i = -1, | |
| n = T.length; | |
| // If no callback was specified, return the callback of the given type and name. | |
| if (arguments.length < 2) { | |
| while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; | |
| return; | |
| } | |
| // If a type was specified, set the callback for the given type and name. | |
| // Otherwise, if a null callback was specified, remove callbacks of the given name. | |
| if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); | |
| while (++i < n) { | |
| if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); | |
| else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); | |
| } | |
| return this; | |
| }, | |
| copy: function() { | |
| var copy = {}, _ = this._; | |
| for (var t in _) copy[t] = _[t].slice(); | |
| return new Dispatch(copy); | |
| }, | |
| call: function(type, that) { | |
| if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; | |
| if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); | |
| for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); | |
| }, | |
| apply: function(type, that, args) { | |
| if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); | |
| for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); | |
| } | |
| }; | |
| function get(type, name) { | |
| for (var i = 0, n = type.length, c; i < n; ++i) { | |
| if ((c = type[i]).name === name) { | |
| return c.value; | |
| } | |
| } | |
| } | |
| function set(type, name, callback) { | |
| for (var i = 0, n = type.length; i < n; ++i) { | |
| if (type[i].name === name) { | |
| type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); | |
| break; | |
| } | |
| } | |
| if (callback != null) type.push({name: name, value: callback}); | |
| return type; | |
| } | |
| exports.dispatch = dispatch; | |
| Object.defineProperty(exports, '__esModule', { value: true }); | |
| })); | |
| },{}],3:[function(require,module,exports){ | |
| // https://d3js.org/d3-dsv/ Version 1.0.1. Copyright 2016 Mike Bostock. | |
| (function (global, factory) { | |
| typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | |
| typeof define === 'function' && define.amd ? define(['exports'], factory) : | |
| (factory((global.d3 = global.d3 || {}))); | |
| }(this, function (exports) { 'use strict'; | |
| function objectConverter(columns) { | |
| return new Function("d", "return {" + columns.map(function(name, i) { | |
| return JSON.stringify(name) + ": d[" + i + "]"; | |
| }).join(",") + "}"); | |
| } | |
| function customConverter(columns, f) { | |
| var object = objectConverter(columns); | |
| return function(row, i) { | |
| return f(object(row), i, columns); | |
| }; | |
| } | |
| // Compute unique columns in order of discovery. | |
| function inferColumns(rows) { | |
| var columnSet = Object.create(null), | |
| columns = []; | |
| rows.forEach(function(row) { | |
| for (var column in row) { | |
| if (!(column in columnSet)) { | |
| columns.push(columnSet[column] = column); | |
| } | |
| } | |
| }); | |
| return columns; | |
| } | |
| function dsv(delimiter) { | |
| var reFormat = new RegExp("[\"" + delimiter + "\n]"), | |
| delimiterCode = delimiter.charCodeAt(0); | |
| function parse(text, f) { | |
| var convert, columns, rows = parseRows(text, function(row, i) { | |
| if (convert) return convert(row, i - 1); | |
| columns = row, convert = f ? customConverter(row, f) : objectConverter(row); | |
| }); | |
| rows.columns = columns; | |
| return rows; | |
| } | |
| function parseRows(text, f) { | |
| var EOL = {}, // sentinel value for end-of-line | |
| EOF = {}, // sentinel value for end-of-file | |
| rows = [], // output rows | |
| N = text.length, | |
| I = 0, // current character index | |
| n = 0, // the current line number | |
| t, // the current token | |
| eol; // is the current token followed by EOL? | |
| function token() { | |
| if (I >= N) return EOF; // special case: end of file | |
| if (eol) return eol = false, EOL; // special case: end of line | |
| // special case: quotes | |
| var j = I, c; | |
| if (text.charCodeAt(j) === 34) { | |
| var i = j; | |
| while (i++ < N) { | |
| if (text.charCodeAt(i) === 34) { | |
| if (text.charCodeAt(i + 1) !== 34) break; | |
| ++i; | |
| } | |
| } | |
| I = i + 2; | |
| c = text.charCodeAt(i + 1); | |
| if (c === 13) { | |
| eol = true; | |
| if (text.charCodeAt(i + 2) === 10) ++I; | |
| } else if (c === 10) { | |
| eol = true; | |
| } | |
| return text.slice(j + 1, i).replace(/""/g, "\""); | |
| } | |
| // common case: find next delimiter or newline | |
| while (I < N) { | |
| var k = 1; | |
| c = text.charCodeAt(I++); | |
| if (c === 10) eol = true; // \n | |
| else if (c === 13) { eol = true; if (text.charCodeAt(I) === 10) ++I, ++k; } // \r|\r\n | |
| else if (c !== delimiterCode) continue; | |
| return text.slice(j, I - k); | |
| } | |
| // special case: last token before EOF | |
| return text.slice(j); | |
| } | |
| while ((t = token()) !== EOF) { | |
| var a = []; | |
| while (t !== EOL && t !== EOF) { | |
| a.push(t); | |
| t = token(); | |
| } | |
| if (f && (a = f(a, n++)) == null) continue; | |
| rows.push(a); | |
| } | |
| return rows; | |
| } | |
| function format(rows, columns) { | |
| if (columns == null) columns = inferColumns(rows); | |
| return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) { | |
| return columns.map(function(column) { | |
| return formatValue(row[column]); | |
| }).join(delimiter); | |
| })).join("\n"); | |
| } | |
| function formatRows(rows) { | |
| return rows.map(formatRow).join("\n"); | |
| } | |
| function formatRow(row) { | |
| return row.map(formatValue).join(delimiter); | |
| } | |
| function formatValue(text) { | |
| return text == null ? "" | |
| : reFormat.test(text += "") ? "\"" + text.replace(/\"/g, "\"\"") + "\"" | |
| : text; | |
| } | |
| return { | |
| parse: parse, | |
| parseRows: parseRows, | |
| format: format, | |
| formatRows: formatRows | |
| }; | |
| } | |
| var csv = dsv(","); | |
| var csvParse = csv.parse; | |
| var csvParseRows = csv.parseRows; | |
| var csvFormat = csv.format; | |
| var csvFormatRows = csv.formatRows; | |
| var tsv = dsv("\t"); | |
| var tsvParse = tsv.parse; | |
| var tsvParseRows = tsv.parseRows; | |
| var tsvFormat = tsv.format; | |
| var tsvFormatRows = tsv.formatRows; | |
| exports.dsvFormat = dsv; | |
| exports.csvParse = csvParse; | |
| exports.csvParseRows = csvParseRows; | |
| exports.csvFormat = csvFormat; | |
| exports.csvFormatRows = csvFormatRows; | |
| exports.tsvParse = tsvParse; | |
| exports.tsvParseRows = tsvParseRows; | |
| exports.tsvFormat = tsvFormat; | |
| exports.tsvFormatRows = tsvFormatRows; | |
| Object.defineProperty(exports, '__esModule', { value: true }); | |
| })); | |
| },{}],"d3-request":[function(require,module,exports){ | |
| // https://d3js.org/d3-request/ Version 1.0.2. Copyright 2016 Mike Bostock. | |
| (function (global, factory) { | |
| typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-collection'), require('d3-dispatch'), require('d3-dsv')) : | |
| typeof define === 'function' && define.amd ? define(['exports', 'd3-collection', 'd3-dispatch', 'd3-dsv'], factory) : | |
| (factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3)); | |
| }(this, function (exports,d3Collection,d3Dispatch,d3Dsv) { 'use strict'; | |
| function request(url, callback) { | |
| var request, | |
| event = d3Dispatch.dispatch("beforesend", "progress", "load", "error"), | |
| mimeType, | |
| headers = d3Collection.map(), | |
| xhr = new XMLHttpRequest, | |
| user = null, | |
| password = null, | |
| response, | |
| responseType, | |
| timeout = 0; | |
| // If IE does not support CORS, use XDomainRequest. | |
| if (typeof XDomainRequest !== "undefined" | |
| && !("withCredentials" in xhr) | |
| && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest; | |
| "onload" in xhr | |
| ? xhr.onload = xhr.onerror = xhr.ontimeout = respond | |
| : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); }; | |
| function respond(o) { | |
| var status = xhr.status, result; | |
| if (!status && hasResponse(xhr) | |
| || status >= 200 && status < 300 | |
| || status === 304) { | |
| if (response) { | |
| try { | |
| result = response.call(request, xhr); | |
| } catch (e) { | |
| event.call("error", request, e); | |
| return; | |
| } | |
| } else { | |
| result = xhr; | |
| } | |
| event.call("load", request, result); | |
| } else { | |
| event.call("error", request, o); | |
| } | |
| } | |
| xhr.onprogress = function(e) { | |
| event.call("progress", request, e); | |
| }; | |
| request = { | |
| header: function(name, value) { | |
| name = (name + "").toLowerCase(); | |
| if (arguments.length < 2) return headers.get(name); | |
| if (value == null) headers.remove(name); | |
| else headers.set(name, value + ""); | |
| return request; | |
| }, | |
| // If mimeType is non-null and no Accept header is set, a default is used. | |
| mimeType: function(value) { | |
| if (!arguments.length) return mimeType; | |
| mimeType = value == null ? null : value + ""; | |
| return request; | |
| }, | |
| // Specifies what type the response value should take; | |
| // for instance, arraybuffer, blob, document, or text. | |
| responseType: function(value) { | |
| if (!arguments.length) return responseType; | |
| responseType = value; | |
| return request; | |
| }, | |
| timeout: function(value) { | |
| if (!arguments.length) return timeout; | |
| timeout = +value; | |
| return request; | |
| }, | |
| user: function(value) { | |
| return arguments.length < 1 ? user : (user = value == null ? null : value + "", request); | |
| }, | |
| password: function(value) { | |
| return arguments.length < 1 ? password : (password = value == null ? null : value + "", request); | |
| }, | |
| // Specify how to convert the response content to a specific type; | |
| // changes the callback value on "load" events. | |
| response: function(value) { | |
| response = value; | |
| return request; | |
| }, | |
| // Alias for send("GET", …). | |
| get: function(data, callback) { | |
| return request.send("GET", data, callback); | |
| }, | |
| // Alias for send("POST", …). | |
| post: function(data, callback) { | |
| return request.send("POST", data, callback); | |
| }, | |
| // If callback is non-null, it will be used for error and load events. | |
| send: function(method, data, callback) { | |
| xhr.open(method, url, true, user, password); | |
| if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*"); | |
| if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); }); | |
| if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType); | |
| if (responseType != null) xhr.responseType = responseType; | |
| if (timeout > 0) xhr.timeout = timeout; | |
| if (callback == null && typeof data === "function") callback = data, data = null; | |
| if (callback != null && callback.length === 1) callback = fixCallback(callback); | |
| if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); }); | |
| event.call("beforesend", request, xhr); | |
| xhr.send(data == null ? null : data); | |
| return request; | |
| }, | |
| abort: function() { | |
| xhr.abort(); | |
| return request; | |
| }, | |
| on: function() { | |
| var value = event.on.apply(event, arguments); | |
| return value === event ? request : value; | |
| } | |
| }; | |
| if (callback != null) { | |
| if (typeof callback !== "function") throw new Error("invalid callback: " + callback); | |
| return request.get(callback); | |
| } | |
| return request; | |
| } | |
| function fixCallback(callback) { | |
| return function(error, xhr) { | |
| callback(error == null ? xhr : null); | |
| }; | |
| } | |
| function hasResponse(xhr) { | |
| var type = xhr.responseType; | |
| return type && type !== "text" | |
| ? xhr.response // null on error | |
| : xhr.responseText; // "" on error | |
| } | |
| function type(defaultMimeType, response) { | |
| return function(url, callback) { | |
| var r = request(url).mimeType(defaultMimeType).response(response); | |
| if (callback != null) { | |
| if (typeof callback !== "function") throw new Error("invalid callback: " + callback); | |
| return r.get(callback); | |
| } | |
| return r; | |
| }; | |
| } | |
| var html = type("text/html", function(xhr) { | |
| return document.createRange().createContextualFragment(xhr.responseText); | |
| }); | |
| var json = type("application/json", function(xhr) { | |
| return JSON.parse(xhr.responseText); | |
| }); | |
| var text = type("text/plain", function(xhr) { | |
| return xhr.responseText; | |
| }); | |
| var xml = type("application/xml", function(xhr) { | |
| var xml = xhr.responseXML; | |
| if (!xml) throw new Error("parse error"); | |
| return xml; | |
| }); | |
| function dsv(defaultMimeType, parse) { | |
| return function(url, row, callback) { | |
| if (arguments.length < 3) callback = row, row = null; | |
| var r = request(url).mimeType(defaultMimeType); | |
| r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; }; | |
| r.row(row); | |
| return callback ? r.get(callback) : r; | |
| }; | |
| } | |
| function responseOf(parse, row) { | |
| return function(request) { | |
| return parse(request.responseText, row); | |
| }; | |
| } | |
| var csv = dsv("text/csv", d3Dsv.csvParse); | |
| var tsv = dsv("text/tab-separated-values", d3Dsv.tsvParse); | |
| exports.request = request; | |
| exports.html = html; | |
| exports.json = json; | |
| exports.text = text; | |
| exports.xml = xml; | |
| exports.csv = csv; | |
| exports.tsv = tsv; | |
| Object.defineProperty(exports, '__esModule', { value: true }); | |
| })); | |
| },{"d3-collection":1,"d3-dispatch":2,"d3-dsv":3}]},{},[]) | |
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9kMy1jb2xsZWN0aW9uL2J1aWxkL2QzLWNvbGxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvYnVpbGQvZDMtZGlzcGF0Y2guanMiLCJub2RlX21vZHVsZXMvZDMtZHN2L2J1aWxkL2QzLWRzdi5qcyIsImJ1aWxkL2QzLXJlcXVlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvLyBodHRwczovL2QzanMub3JnL2QzLWNvbGxlY3Rpb24vIFZlcnNpb24gMS4wLjEuIENvcHlyaWdodCAyMDE2IE1pa2UgQm9zdG9jay5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTtcbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBwcmVmaXggPSBcIiRcIjtcblxuICBmdW5jdGlvbiBNYXAoKSB7fVxuXG4gIE1hcC5wcm90b3R5cGUgPSBtYXAucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBNYXAsXG4gICAgaGFzOiBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiAocHJlZml4ICsga2V5KSBpbiB0aGlzO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzW3ByZWZpeCArIGtleV07XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgIHRoaXNbcHJlZml4ICsga2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgdmFyIHByb3BlcnR5ID0gcHJlZml4ICsga2V5O1xuICAgICAgcmV0dXJuIHByb3BlcnR5IGluIHRoaXMgJiYgZGVsZXRlIHRoaXNbcHJvcGVydHldO1xuICAgIH0sXG4gICAgY2xlYXI6IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTtcbiAgICB9LFxuICAgIGtleXM6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBrZXlzLnB1c2gocHJvcGVydHkuc2xpY2UoMSkpO1xuICAgICAgcmV0dXJuIGtleXM7XG4gICAgfSxcbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIHZhbHVlcy5wdXNoKHRoaXNbcHJvcGVydHldKTtcbiAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfSxcbiAgICBlbnRyaWVzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZW50cmllcy5wdXNoKHtrZXk6IHByb3BlcnR5LnNsaWNlKDEpLCB2YWx1ZTogdGhpc1twcm9wZXJ0eV19KTtcbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH0sXG4gICAgc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2l6ZSA9IDA7XG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgKytzaXplO1xuICAgICAgcmV0dXJuIHNpemU7XG4gICAgfSxcbiAgICBlbXB0eTogZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBlYWNoOiBmdW5jdGlvbihmKSB7XG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZih0aGlzW3Byb3BlcnR5XSwgcHJvcGVydHkuc2xpY2UoMSksIHRoaXMpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBtYXAob2JqZWN0LCBmKSB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXA7XG5cbiAgICAvLyBDb3B5IGNvbnN0cnVjdG9yLlxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIG9iamVjdC5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsgbWFwLnNldChrZXksIHZhbHVlKTsgfSk7XG5cbiAgICAvLyBJbmRleCBhcnJheSBieSBudW1lcmljIGluZGV4IG9yIHNwZWNpZmllZCBrZXkgZnVuY3Rpb24uXG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICB2YXIgaSA9IC0xLFxuICAgICAgICAgIG4gPSBvYmplY3QubGVuZ3RoLFxuICAgICAgICAgIG87XG5cbiAgICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGksIG9iamVjdFtpXSk7XG4gICAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGYobyA9IG9iamVjdFtpXSwgaSwgb2JqZWN0KSwgbyk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBvYmplY3QgdG8gbWFwLlxuICAgIGVsc2UgaWYgKG9iamVjdCkgZm9yICh2YXIga2V5IGluIG9iamVjdCkgbWFwLnNldChrZXksIG9iamVjdFtrZXldKTtcblxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBmdW5jdGlvbiBuZXN0KCkge1xuICAgIHZhciBrZXlzID0gW10sXG4gICAgICAgIHNvcnRLZXlzID0gW10sXG4gICAgICAgIHNvcnRWYWx1ZXMsXG4gICAgICAgIHJvbGx1cCxcbiAgICAgICAgbmVzdDtcblxuICAgIGZ1bmN0aW9uIGFwcGx5KGFycmF5LCBkZXB0aCwgY3JlYXRlUmVzdWx0LCBzZXRSZXN1bHQpIHtcbiAgICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHJvbGx1cCAhPSBudWxsXG4gICAgICAgICAgPyByb2xsdXAoYXJyYXkpIDogKHNvcnRWYWx1ZXMgIT0gbnVsbFxuICAgICAgICAgID8gYXJyYXkuc29ydChzb3J0VmFsdWVzKVxuICAgICAgICAgIDogYXJyYXkpO1xuXG4gICAgICB2YXIgaSA9IC0xLFxuICAgICAgICAgIG4gPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSxcbiAgICAgICAgICBrZXlWYWx1ZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICB2YWx1ZXNCeUtleSA9IG1hcCgpLFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICByZXN1bHQgPSBjcmVhdGVSZXN1bHQoKTtcblxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKHZhbHVlcyA9IHZhbHVlc0J5S2V5LmdldChrZXlWYWx1ZSA9IGtleSh2YWx1ZSA9IGFycmF5W2ldKSArIFwiXCIpKSB7XG4gICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlc0J5S2V5LnNldChrZXlWYWx1ZSwgW3ZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFsdWVzQnlLZXkuZWFjaChmdW5jdGlvbih2YWx1ZXMsIGtleSkge1xuICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCBrZXksIGFwcGx5KHZhbHVlcywgZGVwdGgsIGNyZWF0ZVJlc3VsdCwgc2V0UmVzdWx0KSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbnRyaWVzKG1hcCwgZGVwdGgpIHtcbiAgICAgIGlmICgrK2RlcHRoID4ga2V5cy5sZW5ndGgpIHJldHVybiBtYXA7XG4gICAgICB2YXIgYXJyYXksIHNvcnRLZXkgPSBzb3J0S2V5c1tkZXB0aCAtIDFdO1xuICAgICAgaWYgKHJvbGx1cCAhPSBudWxsICYmIGRlcHRoID49IGtleXMubGVuZ3RoKSBhcnJheSA9IG1hcC5lbnRyaWVzKCk7XG4gICAgICBlbHNlIGFycmF5ID0gW10sIG1hcC5lYWNoKGZ1bmN0aW9uKHYsIGspIHsgYXJyYXkucHVzaCh7a2V5OiBrLCB2YWx1ZXM6IGVudHJpZXModiwgZGVwdGgpfSk7IH0pO1xuICAgICAgcmV0dXJuIHNvcnRLZXkgIT0gbnVsbCA/IGFycmF5LnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gc29ydEtleShhLmtleSwgYi5rZXkpOyB9KSA6IGFycmF5O1xuICAgIH1cblxuICAgIHJldHVybiBuZXN0ID0ge1xuICAgICAgb2JqZWN0OiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU9iamVjdCwgc2V0T2JqZWN0KTsgfSxcbiAgICAgIG1hcDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5KGFycmF5LCAwLCBjcmVhdGVNYXAsIHNldE1hcCk7IH0sXG4gICAgICBlbnRyaWVzOiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gZW50cmllcyhhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApLCAwKTsgfSxcbiAgICAgIGtleTogZnVuY3Rpb24oZCkgeyBrZXlzLnB1c2goZCk7IHJldHVybiBuZXN0OyB9LFxuICAgICAgc29ydEtleXM6IGZ1bmN0aW9uKG9yZGVyKSB7IHNvcnRLZXlzW2tleXMubGVuZ3RoIC0gMV0gPSBvcmRlcjsgcmV0dXJuIG5lc3Q7IH0sXG4gICAgICBzb3J0VmFsdWVzOiBmdW5jdGlvbihvcmRlcikgeyBzb3J0VmFsdWVzID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LFxuICAgICAgcm9sbHVwOiBmdW5jdGlvbihmKSB7IHJvbGx1cCA9IGY7IHJldHVybiBuZXN0OyB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdCgpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBmdW5jdGlvbiBzZXRPYmplY3Qob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU1hcCgpIHtcbiAgICByZXR1cm4gbWFwKCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRNYXAobWFwLCBrZXksIHZhbHVlKSB7XG4gICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIFNldCgpIHt9XG5cbiAgdmFyIHByb3RvID0gbWFwLnByb3RvdHlwZTtcblxuICBTZXQucHJvdG90eXBlID0gc2V0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogU2V0LFxuICAgIGhhczogcHJvdG8uaGFzLFxuICAgIGFkZDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhbHVlICs9IFwiXCI7XG4gICAgICB0aGlzW3ByZWZpeCArIHZhbHVlXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICByZW1vdmU6IHByb3RvLnJlbW92ZSxcbiAgICBjbGVhcjogcHJvdG8uY2xlYXIsXG4gICAgdmFsdWVzOiBwcm90by5rZXlzLFxuICAgIHNpemU6IHByb3RvLnNpemUsXG4gICAgZW1wdHk6IHByb3RvLmVtcHR5LFxuICAgIGVhY2g6IHByb3RvLmVhY2hcbiAgfTtcblxuICBmdW5jdGlvbiBzZXQob2JqZWN0LCBmKSB7XG4gICAgdmFyIHNldCA9IG5ldyBTZXQ7XG5cbiAgICAvLyBDb3B5IGNvbnN0cnVjdG9yLlxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXQpIG9iamVjdC5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IHNldC5hZGQodmFsdWUpOyB9KTtcblxuICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIGl04oCZcyBhbiBhcnJheS5cbiAgICBlbHNlIGlmIChvYmplY3QpIHtcbiAgICAgIHZhciBpID0gLTEsIG4gPSBvYmplY3QubGVuZ3RoO1xuICAgICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUgKCsraSA8IG4pIHNldC5hZGQob2JqZWN0W2ldKTtcbiAgICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIHNldC5hZGQoZihvYmplY3RbaV0sIGksIG9iamVjdCkpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBrZXlzKG1hcCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7XG4gICAgcmV0dXJuIGtleXM7XG4gIH1cblxuICBmdW5jdGlvbiB2YWx1ZXMobWFwKSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1hcFtrZXldKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gZW50cmllcyhtYXApIHtcbiAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBtYXApIGVudHJpZXMucHVzaCh7a2V5OiBrZXksIHZhbHVlOiBtYXBba2V5XX0pO1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgZXhwb3J0cy5uZXN0ID0gbmVzdDtcbiAgZXhwb3J0cy5zZXQgPSBzZXQ7XG4gIGV4cG9ydHMubWFwID0gbWFwO1xuICBleHBvcnRzLmtleXMgPSBrZXlzO1xuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcbiAgZXhwb3J0cy5lbnRyaWVzID0gZW50cmllcztcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSk7IiwiLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1kaXNwYXRjaC8gVmVyc2lvbiAxLjAuMS4gQ29weXJpZ2h0IDIwMTYgTWlrZSBCb3N0b2NrLlxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOlxuICAoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpO1xufSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG5vb3AgPSB7dmFsdWU6IGZ1bmN0aW9uKCkge319O1xuXG4gIGZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICAgIF9bdF0gPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIERpc3BhdGNoKF8pIHtcbiAgICB0aGlzLl8gPSBfO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzLCB0eXBlcykge1xuICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gICAgfSk7XG4gIH1cblxuICBEaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IERpc3BhdGNoLFxuICAgIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIsIF8pLFxuICAgICAgICAgIHQsXG4gICAgICAgICAgaSA9IC0xLFxuICAgICAgICAgIG4gPSBULmxlbmd0aDtcblxuICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTtcbiAgICB9LFxuICAgIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgfSxcbiAgICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBleHBvcnRzLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpOyIsIi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtZHN2LyBWZXJzaW9uIDEuMC4xLiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7XG59KHRoaXMsIGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb24oXCJkXCIsIFwicmV0dXJuIHtcIiArIGNvbHVtbnMubWFwKGZ1bmN0aW9uKG5hbWUsIGkpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArIFwiOiBkW1wiICsgaSArIFwiXVwiO1xuICAgIH0pLmpvaW4oXCIsXCIpICsgXCJ9XCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3VzdG9tQ29udmVydGVyKGNvbHVtbnMsIGYpIHtcbiAgICB2YXIgb2JqZWN0ID0gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpO1xuICAgIHJldHVybiBmdW5jdGlvbihyb3csIGkpIHtcbiAgICAgIHJldHVybiBmKG9iamVjdChyb3cpLCBpLCBjb2x1bW5zKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gQ29tcHV0ZSB1bmlxdWUgY29sdW1ucyBpbiBvcmRlciBvZiBkaXNjb3ZlcnkuXG4gIGZ1bmN0aW9uIGluZmVyQ29sdW1ucyhyb3dzKSB7XG4gICAgdmFyIGNvbHVtblNldCA9IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgIGNvbHVtbnMgPSBbXTtcblxuICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcbiAgICAgIGZvciAodmFyIGNvbHVtbiBpbiByb3cpIHtcbiAgICAgICAgaWYgKCEoY29sdW1uIGluIGNvbHVtblNldCkpIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uU2V0W2NvbHVtbl0gPSBjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRzdihkZWxpbWl0ZXIpIHtcbiAgICB2YXIgcmVGb3JtYXQgPSBuZXcgUmVnRXhwKFwiW1xcXCJcIiArIGRlbGltaXRlciArIFwiXFxuXVwiKSxcbiAgICAgICAgZGVsaW1pdGVyQ29kZSA9IGRlbGltaXRlci5jaGFyQ29kZUF0KDApO1xuXG4gICAgZnVuY3Rpb24gcGFyc2UodGV4dCwgZikge1xuICAgICAgdmFyIGNvbnZlcnQsIGNvbHVtbnMsIHJvd3MgPSBwYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgICAgIGlmIChjb252ZXJ0KSByZXR1cm4gY29udmVydChyb3csIGkgLSAxKTtcbiAgICAgICAgY29sdW1ucyA9IHJvdywgY29udmVydCA9IGYgPyBjdXN0b21Db252ZXJ0ZXIocm93LCBmKSA6IG9iamVjdENvbnZlcnRlcihyb3cpO1xuICAgICAgfSk7XG4gICAgICByb3dzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VSb3dzKHRleHQsIGYpIHtcbiAgICAgIHZhciBFT0wgPSB7fSwgLy8gc2VudGluZWwgdmFsdWUgZm9yIGVuZC1vZi1saW5lXG4gICAgICAgICAgRU9GID0ge30sIC8vIHNlbnRpbmVsIHZhbHVlIGZvciBlbmQtb2YtZmlsZVxuICAgICAgICAgIHJvd3MgPSBbXSwgLy8gb3V0cHV0IHJvd3NcbiAgICAgICAgICBOID0gdGV4dC5sZW5ndGgsXG4gICAgICAgICAgSSA9IDAsIC8vIGN1cnJlbnQgY2hhcmFjdGVyIGluZGV4XG4gICAgICAgICAgbiA9IDAsIC8vIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyXG4gICAgICAgICAgdCwgLy8gdGhlIGN1cnJlbnQgdG9rZW5cbiAgICAgICAgICBlb2w7IC8vIGlzIHRoZSBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPTD9cblxuICAgICAgZnVuY3Rpb24gdG9rZW4oKSB7XG4gICAgICAgIGlmIChJID49IE4pIHJldHVybiBFT0Y7IC8vIHNwZWNpYWwgY2FzZTogZW5kIG9mIGZpbGVcbiAgICAgICAgaWYgKGVvbCkgcmV0dXJuIGVvbCA9IGZhbHNlLCBFT0w7IC8vIHNwZWNpYWwgY2FzZTogZW5kIG9mIGxpbmVcblxuICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IHF1b3Rlc1xuICAgICAgICB2YXIgaiA9IEksIGM7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaikgPT09IDM0KSB7XG4gICAgICAgICAgdmFyIGkgPSBqO1xuICAgICAgICAgIHdoaWxlIChpKysgPCBOKSB7XG4gICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkpID09PSAzNCkge1xuICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAxKSAhPT0gMzQpIGJyZWFrO1xuICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEkgPSBpICsgMjtcbiAgICAgICAgICBjID0gdGV4dC5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgICAgICAgICBpZiAoYyA9PT0gMTMpIHtcbiAgICAgICAgICAgIGVvbCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAyKSA9PT0gMTApICsrSTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IDEwKSB7XG4gICAgICAgICAgICBlb2wgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSkucmVwbGFjZSgvXCJcIi9nLCBcIlxcXCJcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb21tb24gY2FzZTogZmluZCBuZXh0IGRlbGltaXRlciBvciBuZXdsaW5lXG4gICAgICAgIHdoaWxlIChJIDwgTikge1xuICAgICAgICAgIHZhciBrID0gMTtcbiAgICAgICAgICBjID0gdGV4dC5jaGFyQ29kZUF0KEkrKyk7XG4gICAgICAgICAgaWYgKGMgPT09IDEwKSBlb2wgPSB0cnVlOyAvLyBcXG5cbiAgICAgICAgICBlbHNlIGlmIChjID09PSAxMykgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSAxMCkgKytJLCArK2s7IH0gLy8gXFxyfFxcclxcblxuICAgICAgICAgIGVsc2UgaWYgKGMgIT09IGRlbGltaXRlckNvZGUpIGNvbnRpbnVlO1xuICAgICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGosIEkgLSBrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZTogbGFzdCB0b2tlbiBiZWZvcmUgRU9GXG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGopO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoKHQgPSB0b2tlbigpKSAhPT0gRU9GKSB7XG4gICAgICAgIHZhciBhID0gW107XG4gICAgICAgIHdoaWxlICh0ICE9PSBFT0wgJiYgdCAhPT0gRU9GKSB7XG4gICAgICAgICAgYS5wdXNoKHQpO1xuICAgICAgICAgIHQgPSB0b2tlbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmICYmIChhID0gZihhLCBuKyspKSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgcm93cy5wdXNoKGEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQocm93cywgY29sdW1ucykge1xuICAgICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTtcbiAgICAgIHJldHVybiBbY29sdW1ucy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKV0uY29uY2F0KHJvd3MubWFwKGZ1bmN0aW9uKHJvdykge1xuICAgICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24oY29sdW1uKSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tjb2x1bW5dKTtcbiAgICAgICAgfSkuam9pbihkZWxpbWl0ZXIpO1xuICAgICAgfSkpLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm9ybWF0Um93cyhyb3dzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoZm9ybWF0Um93KS5qb2luKFwiXFxuXCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdFJvdyhyb3cpIHtcbiAgICAgIHJldHVybiByb3cubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodGV4dCkge1xuICAgICAgcmV0dXJuIHRleHQgPT0gbnVsbCA/IFwiXCJcbiAgICAgICAgICA6IHJlRm9ybWF0LnRlc3QodGV4dCArPSBcIlwiKSA/IFwiXFxcIlwiICsgdGV4dC5yZXBsYWNlKC9cXFwiL2csIFwiXFxcIlxcXCJcIikgKyBcIlxcXCJcIlxuICAgICAgICAgIDogdGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFyc2U6IHBhcnNlLFxuICAgICAgcGFyc2VSb3dzOiBwYXJzZVJvd3MsXG4gICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgIGZvcm1hdFJvd3M6IGZvcm1hdFJvd3NcbiAgICB9O1xuICB9XG5cbiAgdmFyIGNzdiA9IGRzdihcIixcIik7XG5cbiAgdmFyIGNzdlBhcnNlID0gY3N2LnBhcnNlO1xuICB2YXIgY3N2UGFyc2VSb3dzID0gY3N2LnBhcnNlUm93cztcbiAgdmFyIGNzdkZvcm1hdCA9IGNzdi5mb3JtYXQ7XG4gIHZhciBjc3ZGb3JtYXRSb3dzID0gY3N2LmZvcm1hdFJvd3M7XG5cbiAgdmFyIHRzdiA9IGRzdihcIlxcdFwiKTtcblxuICB2YXIgdHN2UGFyc2UgPSB0c3YucGFyc2U7XG4gIHZhciB0c3ZQYXJzZVJvd3MgPSB0c3YucGFyc2VSb3dzO1xuICB2YXIgdHN2Rm9ybWF0ID0gdHN2LmZvcm1hdDtcbiAgdmFyIHRzdkZvcm1hdFJvd3MgPSB0c3YuZm9ybWF0Um93cztcblxuICBleHBvcnRzLmRzdkZvcm1hdCA9IGRzdjtcbiAgZXhwb3J0cy5jc3ZQYXJzZSA9IGNzdlBhcnNlO1xuICBleHBvcnRzLmNzdlBhcnNlUm93cyA9IGNzdlBhcnNlUm93cztcbiAgZXhwb3J0cy5jc3ZGb3JtYXQgPSBjc3ZGb3JtYXQ7XG4gIGV4cG9ydHMuY3N2Rm9ybWF0Um93cyA9IGNzdkZvcm1hdFJvd3M7XG4gIGV4cG9ydHMudHN2UGFyc2UgPSB0c3ZQYXJzZTtcbiAgZXhwb3J0cy50c3ZQYXJzZVJvd3MgPSB0c3ZQYXJzZVJvd3M7XG4gIGV4cG9ydHMudHN2Rm9ybWF0ID0gdHN2Rm9ybWF0O1xuICBleHBvcnRzLnRzdkZvcm1hdFJvd3MgPSB0c3ZGb3JtYXRSb3dzO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKTsiLCIvLyBodHRwczovL2QzanMub3JnL2QzLXJlcXVlc3QvIFZlcnNpb24gMS4wLjIuIENvcHlyaWdodCAyMDE2IE1pa2UgQm9zdG9jay5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnZDMtY29sbGVjdGlvbicpLCByZXF1aXJlKCdkMy1kaXNwYXRjaCcpLCByZXF1aXJlKCdkMy1kc3YnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2QzLWNvbGxlY3Rpb24nLCAnZDMtZGlzcGF0Y2gnLCAnZDMtZHN2J10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSksZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMpKTtcbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsZDNDb2xsZWN0aW9uLGQzRGlzcGF0Y2gsZDNEc3YpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIHJlcXVlc3QodXJsLCBjYWxsYmFjaykge1xuICAgIHZhciByZXF1ZXN0LFxuICAgICAgICBldmVudCA9IGQzRGlzcGF0Y2guZGlzcGF0Y2goXCJiZWZvcmVzZW5kXCIsIFwicHJvZ3Jlc3NcIiwgXCJsb2FkXCIsIFwiZXJyb3JcIiksXG4gICAgICAgIG1pbWVUeXBlLFxuICAgICAgICBoZWFkZXJzID0gZDNDb2xsZWN0aW9uLm1hcCgpLFxuICAgICAgICB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIHVzZXIgPSBudWxsLFxuICAgICAgICBwYXNzd29yZCA9IG51bGwsXG4gICAgICAgIHJlc3BvbnNlLFxuICAgICAgICByZXNwb25zZVR5cGUsXG4gICAgICAgIHRpbWVvdXQgPSAwO1xuXG4gICAgLy8gSWYgSUUgZG9lcyBub3Qgc3VwcG9ydCBDT1JTLCB1c2UgWERvbWFpblJlcXVlc3QuXG4gICAgaWYgKHR5cGVvZiBYRG9tYWluUmVxdWVzdCAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAmJiAhKFwid2l0aENyZWRlbnRpYWxzXCIgaW4geGhyKVxuICAgICAgICAmJiAvXihodHRwKHMpPzopP1xcL1xcLy8udGVzdCh1cmwpKSB4aHIgPSBuZXcgWERvbWFpblJlcXVlc3Q7XG5cbiAgICBcIm9ubG9hZFwiIGluIHhoclxuICAgICAgICA/IHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9IHhoci5vbnRpbWVvdXQgPSByZXNwb25kXG4gICAgICAgIDogeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKG8pIHsgeGhyLnJlYWR5U3RhdGUgPiAzICYmIHJlc3BvbmQobyk7IH07XG5cbiAgICBmdW5jdGlvbiByZXNwb25kKG8pIHtcbiAgICAgIHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzLCByZXN1bHQ7XG4gICAgICBpZiAoIXN0YXR1cyAmJiBoYXNSZXNwb25zZSh4aHIpXG4gICAgICAgICAgfHwgc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDBcbiAgICAgICAgICB8fCBzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2UuY2FsbChyZXF1ZXN0LCB4aHIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGV2ZW50LmNhbGwoXCJlcnJvclwiLCByZXF1ZXN0LCBlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0geGhyO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LmNhbGwoXCJsb2FkXCIsIHJlcXVlc3QsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBldmVudC5jYWxsKFwiZXJyb3JcIiwgcmVxdWVzdCwgbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbihlKSB7XG4gICAgICBldmVudC5jYWxsKFwicHJvZ3Jlc3NcIiwgcmVxdWVzdCwgZSk7XG4gICAgfTtcblxuICAgIHJlcXVlc3QgPSB7XG4gICAgICBoZWFkZXI6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIG5hbWUgPSAobmFtZSArIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGhlYWRlcnMuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgaGVhZGVycy5yZW1vdmUobmFtZSk7XG4gICAgICAgIGVsc2UgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUgKyBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICB9LFxuXG4gICAgICAvLyBJZiBtaW1lVHlwZSBpcyBub24tbnVsbCBhbmQgbm8gQWNjZXB0IGhlYWRlciBpcyBzZXQsIGEgZGVmYXVsdCBpcyB1c2VkLlxuICAgICAgbWltZVR5cGU6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG1pbWVUeXBlO1xuICAgICAgICBtaW1lVHlwZSA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUgKyBcIlwiO1xuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFNwZWNpZmllcyB3aGF0IHR5cGUgdGhlIHJlc3BvbnNlIHZhbHVlIHNob3VsZCB0YWtlO1xuICAgICAgLy8gZm9yIGluc3RhbmNlLCBhcnJheWJ1ZmZlciwgYmxvYiwgZG9jdW1lbnQsIG9yIHRleHQuXG4gICAgICByZXNwb25zZVR5cGU6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJlc3BvbnNlVHlwZTtcbiAgICAgICAgcmVzcG9uc2VUeXBlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAgfSxcblxuICAgICAgdGltZW91dDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGltZW91dDtcbiAgICAgICAgdGltZW91dCA9ICt2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICB9LFxuXG4gICAgICB1c2VyOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyB1c2VyIDogKHVzZXIgPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHZhbHVlICsgXCJcIiwgcmVxdWVzdCk7XG4gICAgICB9LFxuXG4gICAgICBwYXNzd29yZDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAxID8gcGFzc3dvcmQgOiAocGFzc3dvcmQgPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHZhbHVlICsgXCJcIiwgcmVxdWVzdCk7XG4gICAgICB9LFxuXG4gICAgICAvLyBTcGVjaWZ5IGhvdyB0byBjb252ZXJ0IHRoZSByZXNwb25zZSBjb250ZW50IHRvIGEgc3BlY2lmaWMgdHlwZTtcbiAgICAgIC8vIGNoYW5nZXMgdGhlIGNhbGxiYWNrIHZhbHVlIG9uIFwibG9hZFwiIGV2ZW50cy5cbiAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXNwb25zZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgIH0sXG5cbiAgICAgIC8vIEFsaWFzIGZvciBzZW5kKFwiR0VUXCIsIOKApikuXG4gICAgICBnZXQ6IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0LnNlbmQoXCJHRVRcIiwgZGF0YSwgY2FsbGJhY2spO1xuICAgICAgfSxcblxuICAgICAgLy8gQWxpYXMgZm9yIHNlbmQoXCJQT1NUXCIsIOKApikuXG4gICAgICBwb3N0OiBmdW5jdGlvbihkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gcmVxdWVzdC5zZW5kKFwiUE9TVFwiLCBkYXRhLCBjYWxsYmFjayk7XG4gICAgICB9LFxuXG4gICAgICAvLyBJZiBjYWxsYmFjayBpcyBub24tbnVsbCwgaXQgd2lsbCBiZSB1c2VkIGZvciBlcnJvciBhbmQgbG9hZCBldmVudHMuXG4gICAgICBzZW5kOiBmdW5jdGlvbihtZXRob2QsIGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgIHhoci5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlLCB1c2VyLCBwYXNzd29yZCk7XG4gICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmICFoZWFkZXJzLmhhcyhcImFjY2VwdFwiKSkgaGVhZGVycy5zZXQoXCJhY2NlcHRcIiwgbWltZVR5cGUgKyBcIiwqLypcIik7XG4gICAgICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikgaGVhZGVycy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7IHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKTsgfSk7XG4gICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmIHhoci5vdmVycmlkZU1pbWVUeXBlKSB4aHIub3ZlcnJpZGVNaW1lVHlwZShtaW1lVHlwZSk7XG4gICAgICAgIGlmIChyZXNwb25zZVR5cGUgIT0gbnVsbCkgeGhyLnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB4aHIudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsICYmIHR5cGVvZiBkYXRhID09PSBcImZ1bmN0aW9uXCIpIGNhbGxiYWNrID0gZGF0YSwgZGF0YSA9IG51bGw7XG4gICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIGNhbGxiYWNrLmxlbmd0aCA9PT0gMSkgY2FsbGJhY2sgPSBmaXhDYWxsYmFjayhjYWxsYmFjayk7XG4gICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSByZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgY2FsbGJhY2spLm9uKFwibG9hZFwiLCBmdW5jdGlvbih4aHIpIHsgY2FsbGJhY2sobnVsbCwgeGhyKTsgfSk7XG4gICAgICAgIGV2ZW50LmNhbGwoXCJiZWZvcmVzZW5kXCIsIHJlcXVlc3QsIHhocik7XG4gICAgICAgIHhoci5zZW5kKGRhdGEgPT0gbnVsbCA/IG51bGwgOiBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICB9LFxuXG4gICAgICBhYm9ydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgIH0sXG5cbiAgICAgIG9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZXZlbnQub24uYXBwbHkoZXZlbnQsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gZXZlbnQgPyByZXF1ZXN0IDogdmFsdWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0KGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpeENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGVycm9yLCB4aHIpIHtcbiAgICAgIGNhbGxiYWNrKGVycm9yID09IG51bGwgPyB4aHIgOiBudWxsKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzUmVzcG9uc2UoeGhyKSB7XG4gICAgdmFyIHR5cGUgPSB4aHIucmVzcG9uc2VUeXBlO1xuICAgIHJldHVybiB0eXBlICYmIHR5cGUgIT09IFwidGV4dFwiXG4gICAgICAgID8geGhyLnJlc3BvbnNlIC8vIG51bGwgb24gZXJyb3JcbiAgICAgICAgOiB4aHIucmVzcG9uc2VUZXh0OyAvLyBcIlwiIG9uIGVycm9yXG4gIH1cblxuICBmdW5jdGlvbiB0eXBlKGRlZmF1bHRNaW1lVHlwZSwgcmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xuICAgICAgdmFyIHIgPSByZXF1ZXN0KHVybCkubWltZVR5cGUoZGVmYXVsdE1pbWVUeXBlKS5yZXNwb25zZShyZXNwb25zZSk7XG4gICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gci5nZXQoY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBodG1sID0gdHlwZShcInRleHQvaHRtbFwiLCBmdW5jdGlvbih4aHIpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoeGhyLnJlc3BvbnNlVGV4dCk7XG4gIH0pO1xuXG4gIHZhciBqc29uID0gdHlwZShcImFwcGxpY2F0aW9uL2pzb25cIiwgZnVuY3Rpb24oeGhyKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gIH0pO1xuXG4gIHZhciB0ZXh0ID0gdHlwZShcInRleHQvcGxhaW5cIiwgZnVuY3Rpb24oeGhyKSB7XG4gICAgcmV0dXJuIHhoci5yZXNwb25zZVRleHQ7XG4gIH0pO1xuXG4gIHZhciB4bWwgPSB0eXBlKFwiYXBwbGljYXRpb24veG1sXCIsIGZ1bmN0aW9uKHhocikge1xuICAgIHZhciB4bWwgPSB4aHIucmVzcG9uc2VYTUw7XG4gICAgaWYgKCF4bWwpIHRocm93IG5ldyBFcnJvcihcInBhcnNlIGVycm9yXCIpO1xuICAgIHJldHVybiB4bWw7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGRzdihkZWZhdWx0TWltZVR5cGUsIHBhcnNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHVybCwgcm93LCBjYWxsYmFjaykge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBjYWxsYmFjayA9IHJvdywgcm93ID0gbnVsbDtcbiAgICAgIHZhciByID0gcmVxdWVzdCh1cmwpLm1pbWVUeXBlKGRlZmF1bHRNaW1lVHlwZSk7XG4gICAgICByLnJvdyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByLnJlc3BvbnNlKHJlc3BvbnNlT2YocGFyc2UsIHJvdyA9IF8pKSA6IHJvdzsgfTtcbiAgICAgIHIucm93KHJvdyk7XG4gICAgICByZXR1cm4gY2FsbGJhY2sgPyByLmdldChjYWxsYmFjaykgOiByO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiByZXNwb25zZU9mKHBhcnNlLCByb3cpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ocmVxdWVzdCkge1xuICAgICAgcmV0dXJuIHBhcnNlKHJlcXVlc3QucmVzcG9uc2VUZXh0LCByb3cpO1xuICAgIH07XG4gIH1cblxuICB2YXIgY3N2ID0gZHN2KFwidGV4dC9jc3ZcIiwgZDNEc3YuY3N2UGFyc2UpO1xuXG4gIHZhciB0c3YgPSBkc3YoXCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzXCIsIGQzRHN2LnRzdlBhcnNlKTtcblxuICBleHBvcnRzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICBleHBvcnRzLmh0bWwgPSBodG1sO1xuICBleHBvcnRzLmpzb24gPSBqc29uO1xuICBleHBvcnRzLnRleHQgPSB0ZXh0O1xuICBleHBvcnRzLnhtbCA9IHhtbDtcbiAgZXhwb3J0cy5jc3YgPSBjc3Y7XG4gIGV4cG9ydHMudHN2ID0gdHN2O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKTsiXX0= | |
| var d3 = require('d3-request'); | |
| function errorPage(err) { | |
| document.getElementById('error').style.display = 'block'; | |
| console.log(err) | |
| throw err; | |
| } | |
| d3.json("https://v757x3tk5c.execute-api.us-east-1.amazonaws.com/prod", function(error, data) { | |
| if (error) { | |
| errorPage(error); | |
| } | |
| let list = document.getElementById('list'); | |
| var items = []; | |
| data.forEach(function(item){ | |
| var elemDiv = document.createElement('li'); | |
| elemDiv.className = "registryItem"; | |
| var name = document.createElement('div'); | |
| name.className = "registryItemName"; | |
| name.textContent = item.Name; | |
| elemDiv.appendChild(name); | |
| item.Price = parseInt(item.Price); | |
| var price = document.createElement('div'); | |
| price.className = "registryItemPrice"; | |
| price.textContent = `$${item.Price}`; | |
| elemDiv.appendChild(price); | |
| var desc = document.createElement('div'); | |
| desc.className = "registryItemDesc"; | |
| desc.textContent = item.Description; | |
| elemDiv.appendChild(desc); | |
| if (item.Image) { | |
| var img = document.createElement('div'); | |
| img.className = "registryItemImage"; | |
| var image = document.createElement('img'); | |
| image.src = item.Image; | |
| img.appendChild(image); | |
| elemDiv.appendChild(img); | |
| } | |
| item.Claimed = parseInt(item.Claimed); | |
| item.Needed = parseInt(item.Needed); | |
| var claimed = document.createElement('div'); | |
| claimed.className = "registryItemClaimed"; | |
| elemDiv.appendChild(claimed); | |
| item.selected =_=> items.filter(function(i){return i == item}).length; | |
| item.allClaimed =_=> item.Claimed + item.selected() >= item.Needed; | |
| item.updateDesc = function() { | |
| claimed.textContent = item.Claimed >= item.Needed ? | |
| `${item.Claimed} already purchased` : | |
| `${item.Needed - item.Claimed} of ${item.Needed} still needed`; | |
| } | |
| item.updateDesc(); | |
| var remove = document.createElement('div'); | |
| remove.className = "registryItemRemove"; | |
| remove.onclick = function(e) { | |
| e.stopPropagation(); | |
| var index = items.indexOf(item); | |
| if (index > -1) items.splice(index, 1); | |
| item.update(); | |
| return false; | |
| }; | |
| elemDiv.appendChild(remove); | |
| item.updateLinks = function() { | |
| if (item.allClaimed()) { | |
| elemDiv.className = "registryItem allClaimed"; | |
| } else { | |
| elemDiv.className = "registryItem"; | |
| } | |
| remove.innerHTML = `${item.selected()} selected <button class="registryItemRemove">Remove</button>`; | |
| remove.style.display = item.selected() <= 0 ? 'none' : 'block'; | |
| } | |
| item.updateLinks(); | |
| item.update = function() { | |
| updateList(); | |
| item.updateLinks(); | |
| updateTotal(); | |
| item.updateDesc(); | |
| var items = document.getElementById('form-items'); | |
| items.value = JSON.stringify(items) | |
| } | |
| elemDiv.onclick = function() { | |
| if (item.Claimed + item.selected() >= item.Needed) return true; | |
| items.push(item); | |
| item.update(); | |
| return false; | |
| }; | |
| list.appendChild(elemDiv); | |
| }); | |
| function priceTotal() { | |
| return items.reduce((a, b) => a + b.Price, 0); | |
| } | |
| let register = document.getElementById('register'); | |
| let form = document.getElementById('form-register'); | |
| let email = document.getElementById('email'); | |
| form.addEventListener('submit', function(e){ | |
| d3.request("https://v757x3tk5c.execute-api.us-east-1.amazonaws.com/prod") | |
| .header("Content-Type", "application/json") | |
| .post(JSON.stringify({email: email.value, items: items}), | |
| function(err, response) { | |
| if(err) { | |
| errorPage(err); | |
| } else { | |
| document.getElementById('thankyou').style.display = 'block'; | |
| document.getElementById('selected').style.display = 'none'; | |
| document.getElementById('total').textContent = `Total: $${priceTotal()}`; | |
| document.getElementById('paypal').href += priceTotal(); | |
| document.getElementById('square').href += priceTotal(); | |
| document.getElementById('list-registered').innerHTML = items.map(item => `<li>${item.Name}: $${item.Price}</li>`).join("\n"); | |
| console.log('Registry submission complete'); | |
| } | |
| }); | |
| console.log('Form submitted'); | |
| e.preventDefault(); | |
| }); | |
| function updateTotal() { | |
| let total = priceTotal(); | |
| register.disabled = (total <= 0 || !email.validity.valid); | |
| register.value = 'Register'; | |
| totalText.style.display = total > 0 ? 'block' : 'none'; | |
| totalText.textContent = `Total: $${total}` | |
| } | |
| updateTotal(); | |
| email.addEventListener('input', e => updateTotal()); | |
| function updateList() { | |
| noItems.textContent = items.length <= 0 ? | |
| 'No items selected' : | |
| `Selected ${items.length} item${items.length > 1?'s':''}`; | |
| var selected = document.getElementById('selectedList'); | |
| while (selected.firstChild) { | |
| selected.removeChild(selected.firstChild); | |
| } | |
| items.forEach(item => { | |
| var selectedItem = document.createElement('li'); | |
| selectedItem.className = 'selectedItem'; | |
| selectedItem.textContent = `${item.Name}: $${item.Price}`; | |
| var remove = document.createElement('button'); | |
| remove.className = "registryItemRemove"; | |
| remove.textContent = "Remove"; | |
| remove.onclick = function() { | |
| var index = items.indexOf(item); | |
| if (index > -1) items.splice(index, 1); | |
| item.update(); | |
| return false; | |
| }; | |
| selected.appendChild(selectedItem); | |
| selected.appendChild(remove); | |
| }); | |
| } | |
| }); | |
| ;}, 0) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "name": "requirebin-sketch", | |
| "version": "1.0.0", | |
| "dependencies": { | |
| "d3-request": "1.0.2" | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!-- contents of this file will be placed inside the <body> --> | |
| <div id="registry-container"> | |
| <ul id="list"></ul> | |
| <div id='selected' class='sticky fixed-sticky'> | |
| <p id='noItems'>No items selected</p> | |
| <ul id='selectedList'></ul> | |
| <p id='totalText' style='display:none;'>Total: 0</p> | |
| <form id='form-register' | |
| action="https://v757x3tk5c.execute-api.us-east-1.amazonaws.com/prod" | |
| method="post"> | |
| <input id='form-items' type="hidden" name="items"> | |
| To register for your items, please enter your email to proceed to the purchase page: <input id="email" type="email" | |
| name="email" | |
| required=true | |
| defaultValue="test" | |
| multiple=false><br> | |
| <input id='register' type="submit" value="Register"> | |
| </form> | |
| </div> | |
| <div id="error" style='display:none'> | |
| An error occurred. Please try again, or send us an email if the error persists. | |
| </div> | |
| <div id="thankyou" style='display:none'> | |
| <p>You have registered for the following items:</p> | |
| <ul id="list-registered"></ul> | |
| <p id='total'>Total: </p> | |
| <p>You may complete your gift payment online using PayPal or Square:</p> | |
| <ul> | |
| <li><a id='paypal' href="https://www.paypal.me/wgjordan/">PayPal</a> (Note: there is a small fee when sending money from a debit/credit card, but not from a bank account.)</li> | |
| <li><a id='square' href="https://cash.me/$wgj/">SquareCash</a>(Note: debit card only, but no fees.)</li> | |
| </ul> | |
| <p>Or, you may also mail either one of us a check:</p> | |
| <p translate="no"> | |
| Will Jordan or Jenelle Wagner<br> | |
| 925 Clayton St Apt 1<br> | |
| San Francisco, CA 94117 | |
| </p> | |
| <p>Thank you very much for your generous gift!</p> | |
| </div> | |
| </div> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!-- contents of this file will be placed inside the <head> --> | |
| <style> | |
| a.requirebin-link { | |
| display: none; | |
| } | |
| body { | |
| overflow: scroll; | |
| } | |
| li.registryItem:hover { | |
| background-color: #e5fbe5; | |
| } | |
| li.registryItem.allClaimed:hover { | |
| background-color: lightgray; | |
| } | |
| #selected { | |
| width: 20%; | |
| padding-right: 5px; | |
| overflow-x: hidden; | |
| overflow-y: auto; | |
| max-height: 100%; | |
| position: fixed; | |
| bottom: 10px; | |
| right: 10px; | |
| background-color: lightgray; | |
| } | |
| input#email { | |
| max-width: 100%; | |
| } | |
| .registryItemImage img { | |
| width: auto; | |
| max-width: 100%; | |
| height: 100%; | |
| } | |
| .registryItemImage { | |
| height: 150px; | |
| padding: 10px; | |
| } | |
| li.registryItem { | |
| border-style: solid; | |
| border-radius: 20px; | |
| border-width: 1px; | |
| border-color: lightgray; | |
| margin: 10px; | |
| padding: 10px; | |
| cursor: pointer; | |
| } | |
| li.registryItem.allClaimed { | |
| cursor: initial; | |
| background-color: lightgray; | |
| } | |
| ul#list { | |
| list-style-type: none; | |
| width: 70%; | |
| } | |
| .registryItemName { | |
| font-size: x-large; | |
| font-family: sans-serif; | |
| width: 80%; | |
| display: inline-flex; | |
| } | |
| .registryItemPrice { | |
| width: 10%; | |
| display: inline-block; | |
| font-size: x-large; | |
| padding-right: 10px; | |
| font-family: sans-serif; | |
| } | |
| .registryItemDesc { | |
| font-style: italic; | |
| } | |
| .registryItemClaimed { | |
| font-family: sans-serif; | |
| text-transform: uppercase; | |
| font-size: smaller; | |
| } | |
| input:valid { | |
| border: 1px solid green; | |
| } | |
| input:invalid { | |
| border: 1px solid red; | |
| } | |
| </style> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment