diff --git a/example.html b/example.html
index fd54462e..77c4a30c 100644
--- a/example.html
+++ b/example.html
@@ -132,17 +132,19 @@
showInlineToolbar: true,
allowedToPaste: true
},
- image: {
- type: 'image',
+ image_extended: {
+ type: 'image_extended',
iconClassname: 'ce-icon-picture',
- make: image.make,
appendCallback: image.appendCallback,
- settings: image.makeSettings,
+ prepare: image.prepare,
+ makeSettings: image.makeSettings,
render: image.render,
save: image.save,
isStretched: true,
displayInToolbox: true,
- enableLineBreaks: false
+ config: {
+ uploadUrl : '/club/fetch'
+ }
},
instagram: {
type: 'instagram',
diff --git a/plugins/image/image.js b/plugins/image/image.js
index 1403babc..c7cee244 100644
--- a/plugins/image/image.js
+++ b/plugins/image/image.js
@@ -1,40 +1,47 @@
/**
-* Image plugin for codex-editor
-* @author CodeX Team
-*
-* @version 1.1.3
-*/
-
+ * Image plugin for codex-editor
+ * @author CodeX Team
+ *
+ * @version 1.2.0
+ */
var image = (function(image) {
- var elementClasses = {
+ /**
+ * @private
+ *
+ * CSS classNames
+ */
+ var elementClasses_ = {
ce_image : 'ce-image',
loading : 'ce-plugin-image__loader',
blockStretched: 'ce-block--stretched',
uploadedImage : {
- centered : 'ce-plugin-image__uploaded--centered',
+ centered : 'ce-plugin-image__uploaded--centered',
stretched : 'ce-plugin-image__uploaded--stretched'
},
imageCaption : 'ce-plugin-image__caption',
imageWrapper : 'ce-plugin-image__wrapper',
formHolder : 'ce-plugin-image__holder',
- uploadButton : 'ce-plugin-image__button'
+ uploadButton : 'ce-plugin-image__button',
+ imagePreview : 'ce-image__preview'
+
};
- var holder = null;
-
- /** Default path to redactors images */
- var path = '/upload/redactor_images/';
-
- var ui = {
+ /**
+ *
+ * @private
+ *
+ * UI methods
+ */
+ var ui_ = {
holder : function(){
var element = document.createElement('DIV');
- element.classList.add(elementClasses.formHolder);
- element.classList.add(elementClasses.ce_image);
+ element.classList.add(elementClasses_.formHolder);
+ element.classList.add(elementClasses_.ce_image);
return element;
},
@@ -43,7 +50,7 @@ var image = (function(image) {
var button = document.createElement('SPAN');
- button.classList.add(elementClasses.uploadButton);
+ button.classList.add(elementClasses_.uploadButton);
button.innerHTML = ' ';
button.innerHTML += 'Загрузить фотографию';
@@ -53,17 +60,18 @@ var image = (function(image) {
},
/**
- * @param {string} source - file path
+ * @param {object} file - file path
* @param {string} style - css class
* @return {object} image - document IMG tag
*/
- image : function(source, style) {
+ image : function(file, style) {
var image = document.createElement('IMG');
image.classList.add(style);
- image.src = source;
+ image.src = file.url;
+ image.dataset.bigUrl = file.bigUrl;
return image;
},
@@ -72,7 +80,7 @@ var image = (function(image) {
var div = document.createElement('div');
- div.classList.add(elementClasses.imageWrapper);
+ div.classList.add(elementClasses_.imageWrapper);
return div;
},
@@ -81,7 +89,7 @@ var image = (function(image) {
var div = document.createElement('div');
- div.classList.add(elementClasses.imageCaption);
+ div.classList.add(elementClasses_.imageCaption);
div.contentEditable = true;
return div;
@@ -91,14 +99,14 @@ var image = (function(image) {
*/
makeForm : function() {
- var holder = ui.holder(),
- uploadButton = ui.uploadButton();
+ var holder = ui_.holder(),
+ uploadButton = ui_.uploadButton();
holder.appendChild(uploadButton);
- uploadButton.addEventListener('click', methods.uploadButtonClicked, false );
+ uploadButton.addEventListener('click', uploadButtonClicked_, false );
- holder = holder;
+ image.holder = holder;
return holder;
},
@@ -113,12 +121,12 @@ var image = (function(image) {
*/
makeImage : function(data, imageTypeClass, stretched) {
- var file = data.file.url,
+ var file = data.file,
text = data.caption,
type = data.type,
- image = ui.image(file, imageTypeClass),
- caption = ui.caption(),
- wrapper = ui.wrapper();
+ image = ui_.image(file, imageTypeClass),
+ caption = ui_.caption(),
+ wrapper = ui_.wrapper();
caption.textContent = text;
@@ -135,8 +143,8 @@ var image = (function(image) {
*/
getImage : function(data) {
- var image = data.querySelector('.' + elementClasses.uploadedImage.centered) ||
- data.querySelector('.' + elementClasses.uploadedImage.stretched);
+ var image = data.querySelector('.' + elementClasses_.uploadedImage.centered) ||
+ data.querySelector('.' + elementClasses_.uploadedImage.stretched);
return image;
},
@@ -149,12 +157,12 @@ var image = (function(image) {
*/
centeredImage : function(data) {
- var file = data.file.url,
+ var file = data.file,
text = data.caption,
type = data.type,
- image = ui.image(file, elementClasses.uploadedImage.centered),
- caption = ui.caption(),
- wrapper = ui.wrapper();
+ image = ui_.image(file, elementClasses_.uploadedImage.centered),
+ caption = ui_.caption(),
+ wrapper = ui_.wrapper();
caption.textContent = text;
@@ -175,16 +183,17 @@ var image = (function(image) {
*/
stretchedImage : function(data) {
- var file = data.file.url,
+ var file = data.file,
text = data.caption,
type = data.type,
- image = ui.image(file, elementClasses.uploadedImage.stretched),
- caption = ui.caption(),
- wrapper = ui.wrapper();
+ image = ui_.image(file, elementClasses_.uploadedImage.stretched),
+ caption = ui_.caption(),
+ wrapper = ui_.wrapper();
caption.textContent = text;
wrapper.dataset.stretched = 'true';
+
/** Appeding to the wrapper */
wrapper.appendChild(image);
wrapper.appendChild(caption);
@@ -192,25 +201,35 @@ var image = (function(image) {
return wrapper;
}
+
};
- var methods = {
+ /**
+ * @private
+ *
+ * After render callback
+ */
+ var uploadButtonClicked_ = function(event) {
- uploadButtonClicked : function(event) {
+ var beforeSend = uploadingCallbacks_.beforeSend,
+ success = uploadingCallbacks_.success,
+ error = uploadingCallbacks_.error;
- /** Define callbacks */
- codex.transport.selectAndUpload({
- beforeSend: photoUploadingCallbacks.beforeSend,
- success: photoUploadingCallbacks.success,
- error: photoUploadingCallbacks.error
- });
- },
+ /** Define callbacks */
+ codex.transport.selectAndUpload({
+ beforeSend: beforeSend,
+ success: success,
+ error: error
+ });
+ };
+
+ var methods_ = {
addSelectTypeClickListener : function(el, type) {
el.addEventListener('click', function() {
- methods.selectTypeClicked(type);
+ methods_.selectTypeClicked(type);
}, false);
@@ -218,126 +237,401 @@ var image = (function(image) {
selectTypeClicked : function(type) {
- var current = codex.content.currentNode,
+ var current = codex.content.currentNode,
blockContent = current.childNodes[0],
- image = ui.getImage(current),
- wrapper = current.querySelector('.' + elementClasses.imageWrapper);
+ image = ui_.getImage(current),
+ inFeed = false,
+ wrapper = current.querySelector('.' + elementClasses_.imageWrapper);
+
+ if (!image) {
+ return;
+ }
+
+ if (current.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE)) {
+ inFeed = true;
+ }
/** Clear classList */
current.className = '';
- image.className = '';
+ image.className = '';
+
+ if (inFeed) {
+ current.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);
+ }
/** Add important first-level class ce_block */
current.classList.add(codex.ui.className.BLOCK_CLASSNAME);
if (type === 'stretched') {
- image.classList.add(elementClasses.uploadedImage.stretched);
+ image.classList.add(elementClasses_.uploadedImage.stretched);
- blockContent.classList.add(elementClasses.blockStretched);
+ blockContent.classList.add(elementClasses_.blockStretched);
/** Setting dataset for saver */
wrapper.dataset.stretched = true;
} else if (type === 'centered') {
- image.classList.add(elementClasses.uploadedImage.centered);
+ image.classList.add(elementClasses_.uploadedImage.centered);
- blockContent.classList.remove(elementClasses.blockStretched);
+ blockContent.classList.remove(elementClasses_.blockStretched);
/** Setting dataset for saver */
wrapper.dataset.stretched = false;
}
+
+ codex.toolbar.settings.close();
}
};
- var photoUploadingCallbacks = {
-
- /** Before sending ajax request */
- beforeSend : function() {
- holder.classList.add(elementClasses.loading);
- },
-
- /** Photo was uploaded successfully */
- success : function(result) {
-
- var parsed = JSON.parse(result),
- data,
- currentBlock = codex.content.currentNode,
- imageReady;
-
- /**
- * Preparing {Object} data to draw an image
- * @uses make method
- */
- data = {
- background : false,
- border : false,
- isStretch : false,
- file : {
- url : path + 'o_' + parsed.filename,
- bigUrl : null,
- width : null,
- height : null,
- additionalData : null
- },
- caption : '',
- cover : null
- };
-
- imageReady = image.make(data);
-
- /**
- * If current block is empty, we can replace it to uploaded image
- * Or insert new block
- */
- codex.content.switchBlock(holder, imageReady, 'image');
- },
-
- /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */
- error : function(result) {
- console.log('Choosen file is not an image or image is corrupted');
- codex.notifications.errorThrown();
- }
-
- };
-
/**
- * Public method
+ * @private
+ * Callbacks
*/
- image.make = function ( data ) {
+ var uploadingCallbacks_ = {
- var imageHolder;
+ ByClick : {
+
+ /**
+ * Before sending ajax request
+ */
+ beforeSend : function() {
+
+ var input = codex.transport.input,
+ files = input.files;
+
+ var _validFileExtensions = ["jpg", "jpeg", "bmp", "gif", "png"];
+
+ var type = files[0].type.split('/');
+
+ var result = _validFileExtensions.some(function(ext) {
+ return ext == type[1]
+ });
+
+ if (!result) {
+ return;
+ }
+
+ var reader = new FileReader();
+ reader.readAsDataURL(files[0]);
+
+ reader.onload = function(e) {
+
+ var data = {
+ background : false,
+ border : false,
+ isstretch : false,
+ file : {
+ url : e.target.result,
+ bigUrl : null,
+ width : null,
+ height : null,
+ additionalData : null
+ },
+ caption : '',
+ cover : null
+ };
+
+ var image = make_(data);
+
+ codex.content.switchBlock(image.holder, image, 'image_extended');
+ image.classList.add(elementClasses_.imagePreview);
+
+ /**
+ * Change holder to image
+ */
+ image.holder = image;
+ };
+
+ },
+
+ /** Photo was uploaded successfully */
+ success : function(result) {
+
+ var parsed = JSON.parse(result),
+ data,
+ currentBlock = codex.content.currentNode;
+
+ /**
+ * Preparing {Object} data to draw an image
+ * @uses ceImage.make method
+ */
+ data = parsed.data;
+
+ image.holder.classList.remove(elementClasses_.imagePreview);
+
+ /**
+ * Change src of image
+ */
+ var img = image.holder.getElementsByTagName('IMG')[0];
+
+ img.src = parsed.data.file.url;
+ img.dataset.bigUrl = parsed.data.file.bigUrl;
+ },
+
+ /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */
+ error : function(result) {
+
+ var oldHolder = image.holder;
+ var form = ui_.makeForm();
+
+ codex.content.switchBlock(oldHolder, form, 'image_extended');
+
+ }
+ },
+
+ ByPaste : {
+
+ /**
+ * Direct upload
+ * Any URL that contains image extension
+ * @param url
+ */
+ uploadImageFromUrl : function(path) {
+
+ var ajaxUrl = image.config.uploadUrl,
+ file,
+ image_plugin,
+ current = codex.content.currentNode,
+ beforeSend,
+ success_callback;
+
+ /** When image is uploaded to redactors folder */
+ success_callback = function(data) {
+
+ var imageInfo = JSON.parse(data);
+
+ image_plugin.dataset.stretched = false;
+ image_plugin.dataset.src = imageInfo.file.url;
+ image_plugin.dataset.bigUrl = imageInfo.file.bigUrl;
+ image_plugin.dataset.width = imageInfo.file.width;
+ image_plugin.dataset.height = imageInfo.file.height;
+ image_plugin.dataset.additionalData = imageInfo.file.additionalData;
+
+ image_plugin.classList.remove(elementClasses_.imagePreview);
+
+ };
+
+ /** Before sending XMLHTTP request */
+ beforeSend = function() {
+
+ var content = current.querySelector('.ce-block__content');
+
+ var data = {
+ background: false,
+ border: false,
+ isStretch: false,
+ file: {
+ url: path,
+ bigUrl: null,
+ width: null,
+ height: null,
+ additionalData: null
+ },
+ caption: '',
+ cover: null
+ };
+
+ image_plugin = codex.tools.image_extended.make(data);
+
+ image_plugin.classList.add(elementClasses_.imagePreview);
+
+ var img = image_plugin.querySelector('img');
+
+ codex.content.switchBlock(codex.content.currentNode, image_plugin, 'image_extended');
+
+ };
+
+ /** Preparing data for XMLHTTP */
+ var data = {
+ url: image.config.uploadUrl,
+ type: "POST",
+ data : {
+ url: path
+ },
+ beforeSend : beforeSend,
+ success : success_callback
+ };
+
+ codex.core.ajax(data);
+ }
+
+ },
+
+ uploadFromUploadCare : function(image) {
+
+ var image_plugin;
+
+ /** Preparing data for XMLHTTP */
+ var data = {
+ url: image.config.uploadUrl,
+ type: "POST",
+ data : {
+ url: image
+ },
+ beforeSend : function() {
+
+ var data = {
+ background: false,
+ border: false,
+ isStretch: false,
+ file: {
+ url: image,
+ bigUrl: null,
+ width: null,
+ height: null,
+ additionalData: null
+ },
+ caption: '',
+ cover: null
+ };
+
+ /** Using Image plugin make method */
+ image_plugin = codex.tools.image_extended.make(data);
+
+ image_plugin.classList.add(elementClasses_.imagePreview);
+
+ var img = image_plugin.querySelector('img');
+
+ codex.content.switchBlock(codex.content.currentNode, image_plugin, 'image_extended');
+
+ },
+ success : function(result) {
+
+ var data = JSON.parse(result);
+
+ image_plugin.dataset.stretched = false;
+ image_plugin.dataset.src = data.file.url;
+ image_plugin.dataset.bigUrl = data.file.bigUrl;
+ image_plugin.dataset.width = data.file.width;
+ image_plugin.dataset.height = data.file.height;
+ image_plugin.dataset.additionalData = data.file.additionalData;
+
+ image_plugin.classList.remove(elementClasses_.imagePreview);
+ }
+ };
+
+ codex.core.ajax(data);
+ }
+ };
+
+ /**
+ * Default image holder which will be replaced after image upload
+ * @type {null}
+ */
+ image.holder = null;
+
+ /**
+ * Image path
+ * @type {null}
+ */
+ image.path = null;
+
+ /**
+ * Plugin configuration
+ */
+ image.config = null;
+
+ /**
+ *
+ * @private
+ *
+ * @param data
+ * @return {*}
+ *
+ */
+ var make_ = function ( data ) {
+
+ var holder;
if (data) {
- if ( data.isStretch !== 'true') {
- imageHolder = ui.makeImage(data, elementClasses.uploadedImage.centered, 'false');
+ if ( data.isstretch || data.isstretch === 'true') {
+
+ holder = ui_.makeImage(data, elementClasses_.uploadedImage.stretched, 'true');
+
} else {
- imageHolder = ui.makeImage(data, elementClasses.uploadedImage.stretched, 'true');
+
+ holder = ui_.makeImage(data, elementClasses_.uploadedImage.centered, 'false');
+
}
+ return holder;
+
} else {
- imageHolder = ui.makeForm();
+ holder = ui_.makeForm();
+ return holder;
}
-
- holder = imageHolder;
- return imageHolder;
};
/**
+ * @public
+ * @param config
+ */
+ image.prepare = function(config) {
+ image.config = config;
+ };
+
+ /**
+ * @public
+ *
* this tool works when tool is clicked in toolbox
*/
image.appendCallback = function(event) {
/** Upload image and call success callback*/
- methods.uploadButtonClicked(event);
+ uploadButtonClicked_(event);
};
/**
+ * @public
+ *
+ * @param data
+ * @return {*}
+ */
+ image.render = function( data ) {
+
+ return make_(data);
+ };
+
+ /**
+ * @public
+ *
+ * @param block
+ * @return {{background: boolean, border: boolean, isstretch: boolean, file: {url: (*|string|Object), bigUrl: (null|*), width: *, height: *, additionalData: null}, caption: (string|*|string), cover: null}}
+ */
+ image.save = function ( block ) {
+
+ var content = block,
+ image = ui_.getImage(content),
+ caption = content.querySelector('.' + elementClasses_.imageCaption);
+
+ var data = {
+ background : false,
+ border : false,
+ isstretch : content.dataset.stretched === 'true' ? true : false,
+ file : {
+ url : image.src,
+ bigUrl : image.dataset.bigUrl,
+ width : image.width,
+ height : image.height,
+ additionalData :null
+ },
+ caption : caption.textContent,
+ cover : null
+ };
+
+ return data;
+ };
+
+
+ /**
+ * @public
+ *
* Settings panel content
* @return {Element} element contains all settings
*/
@@ -361,7 +655,7 @@ var image = (function(image) {
selectTypeButton.textContent = types[type];
selectTypeButton.className = 'ce_plugin_image--select_button';
- methods.addSelectTypeClickListener(selectTypeButton, type);
+ methods_.addSelectTypeClickListener(selectTypeButton, type);
holder.appendChild(selectTypeButton);
@@ -371,35 +665,6 @@ var image = (function(image) {
};
- image.render = function( data ) {
-
- return image.make(data);
- };
-
- image.save = function ( block ) {
-
- var content = block,
- image = ui.getImage(content),
- caption = content.querySelector('.' + elementClasses.imageCaption);
-
- var data = {
- background : false,
- border : false,
- isStretch : content.dataset.stretched,
- file : {
- url : image.src,
- bigUrl : null,
- width : image.width,
- height : image.height,
- additionalData :null
- },
- caption : caption.textContent,
- cover : null
- };
-
- return data;
- };
-
return image;
})({});
\ No newline at end of file
diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map
index c7f24eae..909d5ad1 100644
--- a/whatwg-fetch.js.map
+++ b/whatwg-fetch.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap 6ca10f35aaf07c7ccc82?fc0f","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6ca10f35aaf07c7ccc82","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap 272a4df8a260c682a916?7f86","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 272a4df8a260c682a916","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""}
\ No newline at end of file