UNPKG

apeman-react-upload

Version:
282 lines (240 loc) 24.2 kB
/** * apeman react package for file upload components. * @class ApUpload */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _assign = require('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _async = require('async'); var _async2 = _interopRequireDefault(_async); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _uuid = require('uuid'); var _uuid2 = _interopRequireDefault(_uuid); var _apemanReactImage = require('apeman-react-image'); var _apemanReactSpinner = require('apeman-react-spinner'); var _apemanReactButton = require('apeman-react-button'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** @lends ApUpload */ var ApUpload = _react2.default.createClass({ displayName: 'ApUpload', // -------------------- // Specs // -------------------- propTypes: { /** Name of input */ name: _react.PropTypes.string, /** DOM id of input */ id: _react.PropTypes.string, /** Allow multiple upload */ multiple: _react.PropTypes.bool, /** Handler for change event */ onChange: _react.PropTypes.func, /** Handler for load event */ onLoad: _react.PropTypes.func, /** Handler for error event */ onError: _react.PropTypes.func, /** Image width */ width: _react.PropTypes.number, /** Image height */ height: _react.PropTypes.number, /** Guide text */ text: _react.PropTypes.string, /** Accept file type */ accept: _react.PropTypes.string, /** Guide icon */ icon: _react.PropTypes.string, /** Icon for close images */ closeIcon: _react.PropTypes.string, /** Spinner theme */ spinner: _react.PropTypes.string, /** Value of input */ value: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.array]) }, mixins: [], statics: { readFile: function readFile(file, callback) { var reader = new window.FileReader(); reader.onerror = function onerror(err) { callback(err); }; reader.onload = function onload(ev) { callback(null, ev.target.result); }; reader.readAsDataURL(file); }, isImageUrl: function isImageUrl(url) { var imageExtensions = ['.jpg', '.jpeg', '.svg', '.gif', '.png']; return (/^data:image/.test(url) || !!~imageExtensions.indexOf(_path2.default.extname(url)) ); } }, getInitialState: function getInitialState() { var s = this; var props = s.props; var hasValue = props.value && props.value.length > 0; return { spinning: false, error: null, urls: hasValue ? [].concat(props.value) : null }; }, getDefaultProps: function getDefaultProps() { return { name: null, id: 'ap-upload-' + _uuid2.default.v4(), multiple: false, width: 180, height: 180, accept: null, text: 'Upload file', icon: 'fa fa-cloud-upload', closeIcon: 'fa fa-close', spinnerIcon: _apemanReactSpinner.ApSpinner.DEFAULT_THEME, onChange: null, onLoad: null, onError: null }; }, render: function render() { var s = this; var state = s.state, props = s.props; var width = props.width, height = props.height; return _react2.default.createElement( 'div', { className: (0, _classnames2.default)('ap-upload', props.className), style: (0, _assign2.default)({}, props.style) }, _react2.default.createElement('input', { type: 'file', className: 'ap-upload-input', multiple: props.multiple, name: props.name, id: props.id, accept: props.accept, onChange: s.handleChange, style: { width: width, height: height } }), _react2.default.createElement( 'label', { className: 'ap-upload-label', htmlFor: props.id }, _react2.default.createElement('span', { className: 'ap-upload-aligner' }), _react2.default.createElement( 'span', { className: 'ap-upload-label-inner' }, _react2.default.createElement('i', { className: (0, _classnames2.default)('ap-upload-icon', props.icon) }), _react2.default.createElement( 'span', { className: 'ap-upload-text' }, props.text ), props.children ) ), s._renderPreviewImage(state.urls, width, height), s._renderRemoveButton(!!(state.urls && state.urls.length > 0), props.closeIcon), s._renderSpinner(state.spinning, props.spinner) ); }, // -------------------- // Lifecycle // -------------------- componentWillReceiveProps: function componentWillReceiveProps(nextProps) { var s = this; var props = s.props; var value = nextProps.value; var hasValue = value && value.length > 0; if (hasValue && props.value !== value) { s.setState({ urls: [].concat(value) }); } }, // ------------------ // Custom // ------------------ handleChange: function handleChange(e) { var s = this; var props = s.props; var target = e.target; var files = Array.prototype.slice.call(target.files, 0); var onChange = props.onChange, onError = props.onError, onLoad = props.onLoad; s.setState({ spinning: true }); if (onChange) { onChange(e); } _async2.default.concat(files, ApUpload.readFile, function (error, urls) { s.setState({ spinning: false, error: error, urls: urls }); if (error) { if (onError) { onError(error); } } else { if (onLoad) { var loaded = (0, _assign2.default)({ urls: urls, target: target }); onLoad(loaded); } } }); }, handleRemove: function handleRemove() { var s = this; var props = s.props; var onLoad = props.onLoad; s.setState({ error: null, urls: null }); if (onLoad) { onLoad([]); } }, // ------------------ // Private // ------------------ _renderSpinner: function _renderSpinner(spinning, theme) { var s = this; return _react2.default.createElement(_apemanReactSpinner.ApSpinner, { enabled: spinning, theme: theme }); }, _renderRemoveButton: function _renderRemoveButton(removable, icon) { var s = this; if (!removable) { return null; } return _react2.default.createElement( _apemanReactButton.ApButton, { onTap: s.handleRemove, className: 'ap-upload-remove-button' }, _react2.default.createElement('i', { className: (0, _classnames2.default)('ap-upload-remove-icon', icon) }) ); }, _renderPreviewImage: function _renderPreviewImage(urls, width, height) { if (!urls) { return null; } var s = this; return urls.filter(function (url) { return ApUpload.isImageUrl(url); }).map(function (url, i) { return _react2.default.createElement(_apemanReactImage.ApImage, { key: url, src: url, height: height, width: width, className: (0, _classnames2.default)('ap-upload-preview-image'), style: { left: i * 10 + '%', top: i * 10 + '%' }, scale: 'fit' }); }); } }); exports.default = ApUpload; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwX3VwbG9hZC5qc3giXSwibmFtZXMiOlsiQXBVcGxvYWQiLCJjcmVhdGVDbGFzcyIsInByb3BUeXBlcyIsIm5hbWUiLCJzdHJpbmciLCJpZCIsIm11bHRpcGxlIiwiYm9vbCIsIm9uQ2hhbmdlIiwiZnVuYyIsIm9uTG9hZCIsIm9uRXJyb3IiLCJ3aWR0aCIsIm51bWJlciIsImhlaWdodCIsInRleHQiLCJhY2NlcHQiLCJpY29uIiwiY2xvc2VJY29uIiwic3Bpbm5lciIsInZhbHVlIiwib25lT2ZUeXBlIiwiYXJyYXkiLCJtaXhpbnMiLCJzdGF0aWNzIiwicmVhZEZpbGUiLCJmaWxlIiwiY2FsbGJhY2siLCJyZWFkZXIiLCJ3aW5kb3ciLCJGaWxlUmVhZGVyIiwib25lcnJvciIsImVyciIsIm9ubG9hZCIsImV2IiwidGFyZ2V0IiwicmVzdWx0IiwicmVhZEFzRGF0YVVSTCIsImlzSW1hZ2VVcmwiLCJ1cmwiLCJpbWFnZUV4dGVuc2lvbnMiLCJ0ZXN0IiwiaW5kZXhPZiIsImV4dG5hbWUiLCJnZXRJbml0aWFsU3RhdGUiLCJzIiwicHJvcHMiLCJoYXNWYWx1ZSIsImxlbmd0aCIsInNwaW5uaW5nIiwiZXJyb3IiLCJ1cmxzIiwiY29uY2F0IiwiZ2V0RGVmYXVsdFByb3BzIiwidjQiLCJzcGlubmVySWNvbiIsIkRFRkFVTFRfVEhFTUUiLCJyZW5kZXIiLCJzdGF0ZSIsImNsYXNzTmFtZSIsInN0eWxlIiwiaGFuZGxlQ2hhbmdlIiwiY2hpbGRyZW4iLCJfcmVuZGVyUHJldmlld0ltYWdlIiwiX3JlbmRlclJlbW92ZUJ1dHRvbiIsIl9yZW5kZXJTcGlubmVyIiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsIm5leHRQcm9wcyIsInNldFN0YXRlIiwiZSIsImZpbGVzIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJsb2FkZWQiLCJoYW5kbGVSZW1vdmUiLCJ0aGVtZSIsInJlbW92YWJsZSIsImZpbHRlciIsIm1hcCIsImkiLCJsZWZ0Iiwi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LEVBdU1EN0QsSUF2TUMsRUF1TUs7QUFDcEMsUUFBTTRCLElBQUksSUFBVjtBQUNBLFFBQUksQ0FBQ2lDLFNBQUwsRUFBZ0I7QUFDZCxhQUFPLElBQVA7QUFDRDtBQUNELFdBQ0U7QUFBQTtBQUFBLFFBQVUsT0FBUWpDLEVBQUUrQixZQUFwQixFQUFtQyxXQUFVLHlCQUE3QztBQUNFLDJDQUFHLFdBQVksMEJBQVcsdUJBQVgsRUFBb0MzRCxJQUFwQyxDQUFmO0FBREYsS0FERjtBQUtELEdBak5nQztBQW1OakM4QyxxQkFuTmlDLCtCQW1OWlosSUFuTlksRUFtTk52QyxLQW5OTSxFQW1OQ0UsTUFuTkQsRUFtTlM7QUFDeEMsUUFBSSxDQUFDcUMsSUFBTCxFQUFXO0FBQ1QsYUFBTyxJQUFQO0FBQ0Q7QUFDRCxRQUFNTixJQUFJLElBQVY7QUFDQSxXQUFPTSxLQUNKNEIsTUFESSxDQUNHLFVBQUN4QyxHQUFEO0FBQUEsYUFBU3ZDLFNBQVNzQyxVQUFULENBQW9CQyxHQUFwQixDQUFUO0FBQUEsS0FESCxFQUVKeUMsR0FGSSxDQUVBLFVBQUN6QyxHQUFELEVBQU0wQyxDQUFOO0FBQUEsYUFDSCwyREFBUyxLQUFNMUMsR0FBZjtBQUNTLGFBQU1BLEdBRGY7QUFFUyxnQkFBU3pCLE1BRmxCO0FBR1MsZUFBUUYsS0FIakI7QUFJUyxtQkFBWSwwQkFBVyx5QkFBWCxDQUpyQjtBQUtTLGVBQVEsRUFBRXNFLE1BQVNELElBQUksRUFBYixNQUFGLEVBQXNCRSxLQUFRRixJQUFJLEVBQVosTUFBdEIsRUFMakI7QUFNUyxlQUFNLEtBTmYsR0FERztBQUFBLEtBRkEsQ0FBUDtBQVlEO0FBcE9nQyxDQUFsQixDQUFqQjs7a0JBdU9lakYsUSIsImZpbGUiOiJhcF91cGxvYWQuanN4Iiwic291cmNlUm9vdCI6ImxpYiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXBlbWFuIHJlYWN0IHBhY2thZ2UgZm9yIGZpbGUgdXBsb2FkIGNvbXBvbmVudHMuXG4gKiBAY2xhc3MgQXBVcGxvYWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFJlYWN0LCB7IFByb3BUeXBlcyBhcyB0eXBlcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcbmltcG9ydCBhc3luYyBmcm9tICdhc3luYydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgdXVpZCBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgQXBJbWFnZSB9IGZyb20gJ2FwZW1hbi1yZWFjdC1pbWFnZSdcbmltcG9ydCB7IEFwU3Bpbm5lciB9IGZyb20gJ2FwZW1hbi1yZWFjdC1zcGlubmVyJ1xuaW1wb3J0IHsgQXBCdXR0b24gfSBmcm9tICdhcGVtYW4tcmVhY3QtYnV0dG9uJ1xuXG4vKiogQGxlbmRzIEFwVXBsb2FkICovXG5jb25zdCBBcFVwbG9hZCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTcGVjc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByb3BUeXBlczoge1xuICAgIC8qKiBOYW1lIG9mIGlucHV0ICovXG4gICAgbmFtZTogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBET00gaWQgb2YgaW5wdXQgKi9cbiAgICBpZDogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBBbGxvdyBtdWx0aXBsZSB1cGxvYWQgKi9cbiAgICBtdWx0aXBsZTogdHlwZXMuYm9vbCxcbiAgICAvKiogSGFuZGxlciBmb3IgY2hhbmdlIGV2ZW50ICovXG4gICAgb25DaGFuZ2U6IHR5cGVzLmZ1bmMsXG4gICAgLyoqIEhhbmRsZXIgZm9yIGxvYWQgZXZlbnQgKi9cbiAgICBvbkxvYWQ6IHR5cGVzLmZ1bmMsXG4gICAgLyoqIEhhbmRsZXIgZm9yIGVycm9yIGV2ZW50ICovXG4gICAgb25FcnJvcjogdHlwZXMuZnVuYyxcbiAgICAvKiogSW1hZ2Ugd2lkdGggKi9cbiAgICB3aWR0aDogdHlwZXMubnVtYmVyLFxuICAgIC8qKiBJbWFnZSBoZWlnaHQgKi9cbiAgICBoZWlnaHQ6IHR5cGVzLm51bWJlcixcbiAgICAvKiogR3VpZGUgdGV4dCAqL1xuICAgIHRleHQ6IHR5cGVzLnN0cmluZyxcbiAgICAvKiogQWNjZXB0IGZpbGUgdHlwZSAqL1xuICAgIGFjY2VwdDogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBHdWlkZSBpY29uICovXG4gICAgaWNvbjogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBJY29uIGZvciBjbG9zZSBpbWFnZXMgKi9cbiAgICBjbG9zZUljb246IHR5cGVzLnN0cmluZyxcbiAgICAvKiogU3Bpbm5lciB0aGVtZSAqL1xuICAgIHNwaW5uZXI6IHR5cGVzLnN0cmluZyxcbiAgICAvKiogVmFsdWUgb2YgaW5wdXQgKi9cbiAgICB2YWx1ZTogdHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIHR5cGVzLnN0cmluZyxcbiAgICAgIHR5cGVzLmFycmF5XG4gICAgXSlcbiAgfSxcblxuICBtaXhpbnM6IFtdLFxuXG4gIHN0YXRpY3M6IHtcbiAgICByZWFkRmlsZSAoZmlsZSwgY2FsbGJhY2spIHtcbiAgICAgIGxldCByZWFkZXIgPSBuZXcgd2luZG93LkZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIG9ubG9hZCAoZXYpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZXYudGFyZ2V0LnJlc3VsdClcbiAgICAgIH1cbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpXG4gICAgfSxcbiAgICBpc0ltYWdlVXJsICh1cmwpIHtcbiAgICAgIGNvbnN0IGltYWdlRXh0ZW5zaW9ucyA9IFtcbiAgICAgICAgJy5qcGcnLFxuICAgICAgICAnLmpwZWcnLFxuICAgICAgICAnLnN2ZycsXG4gICAgICAgICcuZ2lmJyxcbiAgICAgICAgJy5wbmcnXG4gICAgICBdXG4gICAgICByZXR1cm4gL15kYXRhOmltYWdlLy50ZXN0KHVybCkgfHwgISF+aW1hZ2VFeHRlbnNpb25zLmluZGV4T2YocGF0aC5leHRuYW1lKHVybCkpXG4gICAgfVxuICB9LFxuXG4gIGdldEluaXRpYWxTdGF0ZSAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgIGxldCBoYXNWYWx1ZSA9IHByb3BzLnZhbHVlICYmIHByb3BzLnZhbHVlLmxlbmd0aCA+IDBcbiAgICByZXR1cm4ge1xuICAgICAgc3Bpbm5pbmc6IGZhbHNlLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB1cmxzOiBoYXNWYWx1ZSA/IFtdLmNvbmNhdChwcm9wcy52YWx1ZSkgOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGdldERlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG51bGwsXG4gICAgICBpZDogYGFwLXVwbG9hZC0ke3V1aWQudjQoKX1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgd2lkdGg6IDE4MCxcbiAgICAgIGhlaWdodDogMTgwLFxuICAgICAgYWNjZXB0OiBudWxsLFxuICAgICAgdGV4dDogJ1VwbG9hZCBmaWxlJyxcbiAgICAgIGljb246ICdmYSBmYS1jbG91ZC11cGxvYWQnLFxuICAgICAgY2xvc2VJY29uOiAnZmEgZmEtY2xvc2UnLFxuICAgICAgc3Bpbm5lckljb246IEFwU3Bpbm5lci5ERUZBVUxUX1RIRU1FLFxuICAgICAgb25DaGFuZ2U6IG51bGwsXG4gICAgICBvbkxvYWQ6IG51bGwsXG4gICAgICBvbkVycm9yOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBzdGF0ZSwgcHJvcHMgfSA9IHNcbiAgICBsZXQgeyB3aWR0aCwgaGVpZ2h0IH0gPSBwcm9wc1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnYXAtdXBsb2FkJywgcHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgc3R5bGU9e09iamVjdC5hc3NpZ24oe30sIHByb3BzLnN0eWxlKX0+XG4gICAgICAgIDxpbnB1dCB0eXBlPSdmaWxlJ1xuICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdhcC11cGxvYWQtaW5wdXQnXG4gICAgICAgICAgICAgICBtdWx0aXBsZT17IHByb3BzLm11bHRpcGxlIH1cbiAgICAgICAgICAgICAgIG5hbWU9eyBwcm9wcy5uYW1lIH1cbiAgICAgICAgICAgICAgIGlkPXsgcHJvcHMuaWQgfVxuICAgICAgICAgICAgICAgYWNjZXB0PXsgcHJvcHMuYWNjZXB0IH1cbiAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtzLmhhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgIHN0eWxlPXt7IHdpZHRoLCBoZWlnaHQgfX1cbiAgICAgICAgLz5cbiAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nYXAtdXBsb2FkLWxhYmVsJyBodG1sRm9yPXsgcHJvcHMuaWQgfT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdhcC11cGxvYWQtYWxpZ25lcic+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2FwLXVwbG9hZC1sYWJlbC1pbm5lcic+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9eyBjbGFzc25hbWVzKCdhcC11cGxvYWQtaWNvbicsIHByb3BzLmljb24pIH0vPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdhcC11cGxvYWQtdGV4dCc+e3Byb3BzLnRleHR9PC9zcGFuPlxuICAgICAgICAgICAgeyBwcm9wcy5jaGlsZHJlbiB9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgeyBzLl9yZW5kZXJQcmV2aWV3SW1hZ2Uoc3RhdGUudXJscywgd2lkdGgsIGhlaWdodCkgfVxuICAgICAgICB7IHMuX3JlbmRlclJlbW92ZUJ1dHRvbighIShzdGF0ZS51cmxzICYmIHN0YXRlLnVybHMubGVuZ3RoID4gMCksIHByb3BzLmNsb3NlSWNvbikgfVxuICAgICAgICB7IHMuX3JlbmRlclNwaW5uZXIoc3RhdGUuc3Bpbm5pbmcsIHByb3BzLnNwaW5uZXIpIH1cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXh0UHJvcHMpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGNvbnN0IHsgcHJvcHMgfSA9IHNcbiAgICBsZXQgeyB2YWx1ZSB9ID0gbmV4dFByb3BzXG4gICAgbGV0IGhhc1ZhbHVlID0gdmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMFxuICAgIGlmIChoYXNWYWx1ZSAmJiAocHJvcHMudmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgcy5zZXRTdGF0ZSh7IHVybHM6IFtdLmNvbmNhdCh2YWx1ZSkgfSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEN1c3RvbVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cblxuICBoYW5kbGVDaGFuZ2UgKGUpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHByb3BzIH0gPSBzXG4gICAgbGV0IHsgdGFyZ2V0IH0gPSBlXG4gICAgbGV0IGZpbGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGFyZ2V0LmZpbGVzLCAwKVxuICAgIGxldCB7IG9uQ2hhbmdlLCBvbkVycm9yLCBvbkxvYWQgfSA9IHByb3BzXG5cbiAgICBzLnNldFN0YXRlKHsgc3Bpbm5pbmc6IHRydWUgfSlcbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKGUpXG4gICAgfVxuICAgIGFzeW5jLmNvbmNhdChmaWxlcywgQXBVcGxvYWQucmVhZEZpbGUsIChlcnJvciwgdXJscykgPT4ge1xuICAgICAgcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNwaW5uaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHVybHNcbiAgICAgIH0pXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgICBvbkVycm9yKGVycm9yKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob25Mb2FkKSB7XG4gICAgICAgICAgbGV0IGxvYWRlZCA9IE9iamVjdC5hc3NpZ24oeyB1cmxzLCB0YXJnZXQgfSlcbiAgICAgICAgICBvbkxvYWQobG9hZGVkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBoYW5kbGVSZW1vdmUgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IHsgcHJvcHMgfSA9IHNcbiAgICBsZXQgeyBvbkxvYWQgfSA9IHByb3BzXG4gICAgcy5zZXRTdGF0ZSh7XG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIHVybHM6IG51bGxcbiAgICB9KVxuICAgIGlmIChvbkxvYWQpIHtcbiAgICAgIG9uTG9hZChbXSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFByaXZhdGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgX3JlbmRlclNwaW5uZXIgKHNwaW5uaW5nLCB0aGVtZSkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgcmV0dXJuIChcbiAgICAgIDxBcFNwaW5uZXIgZW5hYmxlZD17c3Bpbm5pbmd9IHRoZW1lPXt0aGVtZX0+XG4gICAgICA8L0FwU3Bpbm5lcj5cbiAgICApXG4gIH0sXG5cbiAgX3JlbmRlclJlbW92ZUJ1dHRvbiAocmVtb3ZhYmxlLCBpY29uKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBpZiAoIXJlbW92YWJsZSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxBcEJ1dHRvbiBvblRhcD17IHMuaGFuZGxlUmVtb3ZlIH0gY2xhc3NOYW1lPSdhcC11cGxvYWQtcmVtb3ZlLWJ1dHRvbic+XG4gICAgICAgIDxpIGNsYXNzTmFtZT17IGNsYXNzbmFtZXMoJ2FwLXVwbG9hZC1yZW1vdmUtaWNvbicsIGljb24pIH0vPlxuICAgICAgPC9BcEJ1dHRvbj5cbiAgICApXG4gIH0sXG5cbiAgX3JlbmRlclByZXZpZXdJbWFnZSAodXJscywgd2lkdGgsIGhlaWdodCkge1xuICAgIGlmICghdXJscykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICByZXR1cm4gdXJsc1xuICAgICAgLmZpbHRlcigodXJsKSA9PiBBcFVwbG9hZC5pc0ltYWdlVXJsKHVybCkpXG4gICAgICAubWFwKCh1cmwsIGkpID0+IChcbiAgICAgICAgPEFwSW1hZ2Uga2V5PXsgdXJsIH1cbiAgICAgICAgICAgICAgICAgc3JjPXsgdXJsIH1cbiAgICAgICAgICAgICAgICAgaGVpZ2h0PXsgaGVpZ2h0IH1cbiAgICAgICAgICAgICAgICAgd2lkdGg9eyB3aWR0aCB9XG4gICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17IGNsYXNzbmFtZXMoJ2FwLXVwbG9hZC1wcmV2aWV3LWltYWdlJykgfVxuICAgICAgICAgICAgICAgICBzdHlsZT17IHsgbGVmdDogYCR7aSAqIDEwfSVgLCB0b3A6IGAke2kgKiAxMH0lYCB9IH1cbiAgICAgICAgICAgICAgICAgc2NhbGU9J2ZpdCc+XG4gICAgICAgIDwvQXBJbWFnZT5cbiAgICAgICkpXG4gIH1cbn0pXG5cbmV4cG9ydCBkZWZhdWx0IEFwVXBsb2FkXG4iXX0=