diff --git a/config/loggerConfig.js b/config/loggerConfig.js index 18c53a95..e5b98b52 100644 --- a/config/loggerConfig.js +++ b/config/loggerConfig.js @@ -1,5 +1,34 @@ -const loggerConfig = { - logLevel: 'debug', // options: silly, debug, verbose, info +const logger = require('winston'); +function LoggerConfig () { + this.logLevel = 'debug'; + this.configure = (config) => { + if (!config) { + return console.log('No logger config received.'); + } + // update values with local config params + const {logLevel} = config; + this.logLevel = logLevel; + // configure the winston logger + logger.configure({ + transports: [ + new (logger.transports.Console)({ + level : this.logLevel, + timestamp : false, + colorize : true, + prettyPrint : true, + handleExceptions : true, + humanReadableUnhandledException: true, + }), + ], + }); + // test all the log levels + logger.error('Level 0'); + logger.warn('Level 1'); + logger.info('Level 2'); + logger.verbose('Level 3'); + logger.debug('Level 4'); + logger.silly('Level 5'); + }; }; -module.exports = loggerConfig; +module.exports = new LoggerConfig(); diff --git a/config/mysqlConfig.js b/config/mysqlConfig.js index ee29c68f..0728d0fa 100644 --- a/config/mysqlConfig.js +++ b/config/mysqlConfig.js @@ -1,4 +1,4 @@ -function MysqlConfig () { +function mysql () { this.database = 'default'; this.username = 'default'; this.password = 'default'; @@ -13,4 +13,4 @@ function MysqlConfig () { }; }; -module.exports = new MysqlConfig(); +module.exports = new mysql(); diff --git a/config/slackConfig.js b/config/slackConfig.js index cceadab6..7c58543f 100644 --- a/config/slackConfig.js +++ b/config/slackConfig.js @@ -1,3 +1,6 @@ +const winstonSlackWebHook = require('winston-slack-webhook').SlackWebHook; +const winston = require('winston'); + function SlackConfig () { this.slackWebHook = 'default'; this.slackErrorChannel = 'default'; @@ -6,10 +9,40 @@ function SlackConfig () { if (!config) { return console.log('No slack config received.'); } + // update variables const {slackWebHook, slackErrorChannel, slackInfoChannel} = config; this.slackWebHook = slackWebHook; this.slackErrorChannel = slackErrorChannel; this.slackInfoChannel = slackInfoChannel; + // update slack webhook settings + if (this.slackWebHook) { + // add a transport for errors to slack + if (this.slackErrorChannel) { + winston.add(winstonSlackWebHook, { + name : 'slack-errors-transport', + level : 'warn', + webhookUrl: this.slackWebHook, + channel : this.slackErrorChannel, + username : 'spee.ch', + iconEmoji : ':face_with_head_bandage:', + }); + }; + if (slackInfoChannel) { + winston.add(winstonSlackWebHook, { + name : 'slack-info-transport', + level : 'info', + webhookUrl: this.slackWebHook, + channel : this.slackInfoChannel, + username : 'spee.ch', + iconEmoji : ':nerd_face:', + }); + }; + // send test messages + winston.error('Slack "error" logging is online.'); + winston.info('Slack "info" logging is online.'); + } else { + winston.warn('Slack logging is not enabled because no slackWebHook config var provided.'); + } }; }; diff --git a/index.js b/index.js index 0d773294..be547faa 100644 --- a/index.js +++ b/index.js @@ -1,11539 +1,25 @@ -module.exports = -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "/"; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 115); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports) { - -module.exports = require("react"); - -/***/ }), -/* 1 */ -/***/ (function(module, exports) { - -module.exports = require("react-redux"); - -/***/ }), -/* 2 */ -/***/ (function(module, exports) { - -module.exports = require("winston"); - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function SiteConfig() { - var _this = this; - - this.analytics = { - googleId: 'default' - }; - this.assetDefaults = { - description: 'An asset published on Spee.ch', - thumbnail: 'https://spee.ch/assets/img/video_thumb_default.png', - title: 'Spee.ch' - }; - this.auth = { - sessionKey: 'default' - }; - this.customComponents = { - components: {}, - containers: {}, - pages: {} - }; - this.details = { - description: 'Open-source, decentralized image and video sharing.', - host: 'default', - port: 3000, - title: 'Spee.ch', - twitter: '@spee_ch' - }; - this.publishing = { - additionalClaimAddresses: [], - disabled: false, - disabledMessage: 'Please check back soon.', - primaryClaimAddress: 'default', - thumbnailChannel: 'default', - thumbnailChannelId: 'default', - uploadDirectory: '/home/lbry/Uploads' - }; - this.configure = function (config) { - if (!config) { - return console.log('No site config received.'); - } - var analytics = config.analytics, - assetDefaults = config.assetDefaults, - auth = config.auth, - customComponents = config.customComponents, - details = config.details, - publishing = config.publishing; - - _this.analytics = analytics; - _this.assetDefaults = assetDefaults; - _this.auth = auth; - _this.details = details; - _this.publishing = publishing; - _this.customComponents = customComponents; - }; -}; - -module.exports = new SiteConfig(); - -/***/ }), -/* 4 */ -/***/ (function(module, exports) { - -module.exports = require("react-router-dom"); - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _channel = __webpack_require__(64); - -var _publish = __webpack_require__(6); - -var _view = __webpack_require__(65); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var channel = _ref.channel, - site = _ref.site; - - return { - channelName: channel.loggedInChannel.name, - channelShortId: channel.loggedInChannel.shortId, - channelLongId: channel.loggedInChannel.longId, - siteDescription: site.description - }; -}; - -var mapDispatchToProps = function mapDispatchToProps(dispatch) { - return { - onChannelLogin: function onChannelLogin(name, shortId, longId) { - dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); - dispatch((0, _publish.updateSelectedChannel)(name)); - }, - onChannelLogout: function onChannelLogout() { - dispatch((0, _channel.updateLoggedInChannel)(null, null, null)); - } - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.selectFile = selectFile; -exports.clearFile = clearFile; -exports.updateMetadata = updateMetadata; -exports.updateClaim = updateClaim; -exports.setPublishInChannel = setPublishInChannel; -exports.updatePublishStatus = updatePublishStatus; -exports.updateError = updateError; -exports.updateSelectedChannel = updateSelectedChannel; -exports.toggleMetadataInputs = toggleMetadataInputs; -exports.onNewThumbnail = onNewThumbnail; -exports.startPublish = startPublish; - -var _publish_action_types = __webpack_require__(104); - -var actions = _interopRequireWildcard(_publish_action_types); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -// export action creators -function selectFile(file) { - return { - type: actions.FILE_SELECTED, - data: file - }; -}; - -function clearFile() { - return { - type: actions.FILE_CLEAR - }; -}; - -function updateMetadata(name, value) { - return { - type: actions.METADATA_UPDATE, - data: { - name: name, - value: value - } - }; -}; - -function updateClaim(value) { - return { - type: actions.CLAIM_UPDATE, - data: value - }; -}; - -function setPublishInChannel(channel) { - return { - type: actions.SET_PUBLISH_IN_CHANNEL, - channel: channel - }; -}; - -function updatePublishStatus(status, message) { - return { - type: actions.PUBLISH_STATUS_UPDATE, - data: { - status: status, - message: message - } - }; -}; - -function updateError(name, value) { - return { - type: actions.ERROR_UPDATE, - data: { - name: name, - value: value - } - }; -}; - -function updateSelectedChannel(channelName) { - return { - type: actions.SELECTED_CHANNEL_UPDATE, - data: channelName - }; -}; - -function toggleMetadataInputs(showMetadataInputs) { - return { - type: actions.TOGGLE_METADATA_INPUTS, - data: showMetadataInputs - }; -}; - -function onNewThumbnail(file) { - return { - type: actions.THUMBNAIL_NEW, - data: file - }; -}; - -function startPublish(history) { - return { - type: actions.PUBLISH_START, - data: { history: history } - }; -} - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _view = __webpack_require__(66); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var site = _ref.site; - var defaultDescription = site.defaultDescription, - defaultThumbnail = site.defaultThumbnail, - siteDescription = site.description, - siteHost = site.host, - siteTitle = site.title, - siteTwitter = site.twitter; - - return { - defaultDescription: defaultDescription, - defaultThumbnail: defaultThumbnail, - siteDescription: siteDescription, - siteHost: siteHost, - siteTitle: siteTitle, - siteTwitter: siteTwitter - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -exports.default = request; - -__webpack_require__(152); - -/** - * Parses the JSON returned by a network request - * - * @param {object} response A response from a network request - * - * @return {object} The parsed JSON from the request - */ -function parseJSON(response) { - if (response.status === 204 || response.status === 205) { - return null; - } - return response.json(); -} - -/** - * Parses the status returned by a network request - * - * @param {object} response A response from a network request - * @param {object} response The parsed JSON from the network request - * - * @return {object | undefined} Returns object with status and statusText, or undefined - */ -function checkStatus(response, jsonResponse) { - if (response.status >= 200 && response.status < 300) { - return jsonResponse; - } - var error = new Error(jsonResponse.message); - error.response = response; - throw error; -} - -/** - * Requests a URL, returning a promise - * - * @param {string} url The URL we want to request - * @param {object} [options] The options we want to pass to "fetch" - * - * @return {object} The response data - */ - -function request(url, options) { - return fetch(url, options).then(function (response) { - return Promise.all([response, parseJSON(response)]); - }).then(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - response = _ref2[0], - jsonResponse = _ref2[1]; - - return checkStatus(response, jsonResponse); - }); -} - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Sequelize = __webpack_require__(95); -var logger = __webpack_require__(2); - -console.log('exporting sequelize models'); - -var _require = __webpack_require__(92), - database = _require.database, - username = _require.username, - password = _require.password; - -var db = {}; -// set sequelize options -var sequelize = new Sequelize(database, username, password, { - host: 'localhost', - dialect: 'mysql', - dialectOptions: { decimalNumbers: true }, // fix to ensure DECIMAL will not be stored as a string - logging: false, - pool: { - max: 5, - min: 0, - idle: 10000, - acquire: 10000 - } -}); - -// establish mysql connection -sequelize.authenticate().then(function () { - logger.info('Sequelize has established mysql connection successfully.'); -}).catch(function (err) { - logger.error('Sequelize was unable to connect to the database:', err); -}); - -// manually add each model to the db object -var Certificate = __webpack_require__(132); -var Channel = __webpack_require__(133); -var Claim = __webpack_require__(134); -var File = __webpack_require__(135); -var Request = __webpack_require__(136); -var User = __webpack_require__(137); -db['Certificate'] = sequelize.import('Certificate', Certificate); -db['Channel'] = sequelize.import('Channel', Channel); -db['Claim'] = sequelize.import('Claim', Claim); -db['File'] = sequelize.import('File', File); -db['Request'] = sequelize.import('Request', Request); -db['User'] = sequelize.import('User', User); - -// run model.association for each model in the db object that has an association -Object.keys(db).forEach(function (modelName) { - if (db[modelName].associate) { - logger.info('Associating model:', modelName); - db[modelName].associate(db); - } -}); - -db.sequelize = sequelize; -db.Sequelize = Sequelize; - -// add an 'upsert' method to the db object -db.upsert = function (Model, values, condition, tableName) { - return Model.findOne({ - where: condition - }).then(function (obj) { - if (obj) { - // update - logger.debug('updating record in db.' + tableName); - return obj.update(values); - } else { - // insert - logger.debug('creating record in db.' + tableName); - return Model.create(values); - } - }).catch(function (error) { - logger.error(tableName + '.upsert error', error); - throw error; - }); -}; - -module.exports = db; - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = __webpack_require__(14); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _ActiveStatusBar = __webpack_require__(24); - -var _ActiveStatusBar2 = _interopRequireDefault(_ActiveStatusBar); - -var _InactiveStatusBar = __webpack_require__(25); - -var _InactiveStatusBar2 = _interopRequireDefault(_InactiveStatusBar); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ProgressBar = function (_React$Component) { - _inherits(ProgressBar, _React$Component); - - function ProgressBar(props) { - _classCallCheck(this, ProgressBar); - - var _this = _possibleConstructorReturn(this, (ProgressBar.__proto__ || Object.getPrototypeOf(ProgressBar)).call(this, props)); - - _this.state = { - bars: [], - index: 0, - incrementer: 1 - }; - _this.createBars = _this.createBars.bind(_this); - _this.startProgressBar = _this.startProgressBar.bind(_this); - _this.updateProgressBar = _this.updateProgressBar.bind(_this); - _this.stopProgressBar = _this.stopProgressBar.bind(_this); - return _this; - } - - _createClass(ProgressBar, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.createBars(); - this.startProgressBar(); - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - this.stopProgressBar(); - } - }, { - key: 'createBars', - value: function createBars() { - var bars = []; - for (var i = 0; i <= this.props.size; i++) { - bars.push({ isActive: false }); - } - this.setState({ bars: bars }); - } - }, { - key: 'startProgressBar', - value: function startProgressBar() { - this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300); - } - }, { - key: 'updateProgressBar', - value: function updateProgressBar() { - var index = this.state.index; - var incrementer = this.state.incrementer; - var bars = this.state.bars; - // flip incrementer if necessary, to stay in bounds - if (index < 0 || index > this.props.size) { - incrementer = incrementer * -1; - index += incrementer; - } - // update the indexed bar - if (incrementer > 0) { - bars[index].isActive = true; - } else { - bars[index].isActive = false; - }; - // increment index - index += incrementer; - // update state - this.setState({ - bars: bars, - incrementer: incrementer, - index: index - }); - } - }, { - key: 'stopProgressBar', - value: function stopProgressBar() { - clearInterval(this.updateInterval); - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement( - 'div', - null, - this.state.bars.map(function (bar, index) { - return bar.isActive ? _react2.default.createElement(_ActiveStatusBar2.default, { key: index }) : _react2.default.createElement(_InactiveStatusBar2.default, { key: index }); - }) - ); - } - }]); - - return ProgressBar; -}(_react2.default.Component); - -; - -ProgressBar.propTypes = { - size: _propTypes2.default.number.isRequired -}; - -exports.default = ProgressBar; - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.onHandleShowPageUri = onHandleShowPageUri; -exports.onRequestError = onRequestError; -exports.onNewChannelRequest = onNewChannelRequest; -exports.onNewAssetRequest = onNewAssetRequest; -exports.onRequestUpdate = onRequestUpdate; -exports.addRequestToRequestList = addRequestToRequestList; -exports.addAssetToAssetList = addAssetToAssetList; -exports.addNewChannelToChannelList = addNewChannelToChannelList; -exports.onUpdateChannelClaims = onUpdateChannelClaims; -exports.updateChannelClaims = updateChannelClaims; -exports.fileRequested = fileRequested; -exports.updateFileAvailability = updateFileAvailability; -exports.updateDisplayAssetError = updateDisplayAssetError; - -var _show_action_types = __webpack_require__(19); - -var actions = _interopRequireWildcard(_show_action_types); - -var _show_request_types = __webpack_require__(112); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -// basic request parsing -function onHandleShowPageUri(params) { - return { - type: actions.HANDLE_SHOW_URI, - data: params - }; -}; - -function onRequestError(error) { - return { - type: actions.REQUEST_ERROR, - data: error - }; -}; - -function onNewChannelRequest(channelName, channelId) { - var requestType = _show_request_types.CHANNEL; - var requestId = 'cr#' + channelName + '#' + channelId; - return { - type: actions.CHANNEL_REQUEST_NEW, - data: { requestType: requestType, requestId: requestId, channelName: channelName, channelId: channelId } - }; -}; - -function onNewAssetRequest(name, id, channelName, channelId, extension) { - var requestType = extension ? _show_request_types.ASSET_LITE : _show_request_types.ASSET_DETAILS; - var requestId = 'ar#' + name + '#' + id + '#' + channelName + '#' + channelId; - return { - type: actions.ASSET_REQUEST_NEW, - data: { - requestType: requestType, - requestId: requestId, - name: name, - modifier: { - id: id, - channel: { - name: channelName, - id: channelId - } - } - } - }; -}; - -function onRequestUpdate(requestType, requestId) { - return { - type: actions.REQUEST_UPDATE, - data: { - requestType: requestType, - requestId: requestId - } - }; -}; - -function addRequestToRequestList(id, error, key) { - return { - type: actions.REQUEST_LIST_ADD, - data: { id: id, error: error, key: key } - }; -}; - -// asset actions - -function addAssetToAssetList(id, error, name, claimId, shortId, claimData) { - return { - type: actions.ASSET_ADD, - data: { id: id, error: error, name: name, claimId: claimId, shortId: shortId, claimData: claimData } - }; -} - -// channel actions - -function addNewChannelToChannelList(id, name, shortId, longId, claimsData) { - return { - type: actions.CHANNEL_ADD, - data: { id: id, name: name, shortId: shortId, longId: longId, claimsData: claimsData } - }; -}; - -function onUpdateChannelClaims(channelKey, name, longId, page) { - return { - type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC, - data: { channelKey: channelKey, name: name, longId: longId, page: page } - }; -}; - -function updateChannelClaims(channelListId, claimsData) { - return { - type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS, - data: { channelListId: channelListId, claimsData: claimsData } - }; -}; - -// display a file - -function fileRequested(name, claimId) { - return { - type: actions.FILE_REQUESTED, - data: { name: name, claimId: claimId } - }; -}; - -function updateFileAvailability(status) { - return { - type: actions.FILE_AVAILABILITY_UPDATE, - data: status - }; -}; - -function updateDisplayAssetError(error) { - return { - type: actions.DISPLAY_ASSET_ERROR, - data: error - }; -}; - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = __webpack_require__(14); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _NavBar = __webpack_require__(5); - -var _NavBar2 = _interopRequireDefault(_NavBar); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ErrorPage = function (_React$Component) { - _inherits(ErrorPage, _React$Component); - - function ErrorPage() { - _classCallCheck(this, ErrorPage); - - return _possibleConstructorReturn(this, (ErrorPage.__proto__ || Object.getPrototypeOf(ErrorPage)).apply(this, arguments)); - } - - _createClass(ErrorPage, [{ - key: 'render', - value: function render() { - var error = this.props.error; - - return _react2.default.createElement( - 'div', - null, - _react2.default.createElement(_NavBar2.default, null), - _react2.default.createElement( - 'div', - { className: 'row row--padded' }, - _react2.default.createElement( - 'p', - null, - error - ) - ) - ); - } - }]); - - return ErrorPage; -}(_react2.default.Component); - -; - -ErrorPage.propTypes = { - error: _propTypes2.default.string.isRequired -}; - -exports.default = ErrorPage; - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _reactGa = __webpack_require__(151); - -var _reactGa2 = _interopRequireDefault(_reactGa); - -var _reactRouterDom = __webpack_require__(4); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _require = __webpack_require__(3), - googleId = _require.analytics.googleId; - -_reactGa2.default.initialize(googleId); - -var GAListener = function (_React$Component) { - _inherits(GAListener, _React$Component); - - function GAListener() { - _classCallCheck(this, GAListener); - - return _possibleConstructorReturn(this, (GAListener.__proto__ || Object.getPrototypeOf(GAListener)).apply(this, arguments)); - } - - _createClass(GAListener, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.sendPageView(this.props.history.location); - this.props.history.listen(this.sendPageView); - } - }, { - key: 'sendPageView', - value: function sendPageView(location) { - _reactGa2.default.set({ page: location.pathname }); - _reactGa2.default.pageview(location.pathname); - } - }, { - key: 'render', - value: function render() { - return this.props.children; - } - }]); - - return GAListener; -}(_react2.default.Component); - -exports.default = (0, _reactRouterDom.withRouter)(GAListener); - -/***/ }), -/* 14 */ -/***/ (function(module, exports) { - -module.exports = require("prop-types"); - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _channel = __webpack_require__(64); - -var _view = __webpack_require__(68); - -var _view2 = _interopRequireDefault(_view); - -var _publish = __webpack_require__(6); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapDispatchToProps = function mapDispatchToProps(dispatch) { - return { - onChannelLogin: function onChannelLogin(name, shortId, longId) { - dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); - dispatch((0, _publish.updateSelectedChannel)(name)); - } - }; -}; - -exports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _channel = __webpack_require__(64); - -var _view = __webpack_require__(69); - -var _view2 = _interopRequireDefault(_view); - -var _publish = __webpack_require__(6); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapDispatchToProps = function mapDispatchToProps(dispatch) { - return { - onChannelLogin: function onChannelLogin(name, shortId, longId) { - dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId)); - dispatch((0, _publish.updateSelectedChannel)(name)); - } - }; -}; - -exports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _view = __webpack_require__(72); - -var _view2 = _interopRequireDefault(_view); - -var _show = __webpack_require__(11); - -var _show2 = __webpack_require__(28); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var show = _ref.show; - - // select error and status - var error = show.displayAsset.error; - var status = show.displayAsset.status; - // select asset - var asset = (0, _show2.selectAsset)(show); - // return props - return { - error: error, - status: status, - asset: asset - }; -}; - -var mapDispatchToProps = function mapDispatchToProps(dispatch) { - return { - onFileRequest: function onFileRequest(name, claimId) { - dispatch((0, _show.fileRequested)(name, claimId)); - } - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _publish = __webpack_require__(6); - -var _view = __webpack_require__(82); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var publish = _ref.publish; - - return { - file: publish.file, - thumbnail: publish.thumbnail, - fileError: publish.error.file - }; -}; - -var mapDispatchToProps = function mapDispatchToProps(dispatch) { - return { - selectFile: function selectFile(file) { - dispatch((0, _publish.selectFile)(file)); - }, - setFileError: function setFileError(value) { - dispatch((0, _publish.clearFile)()); - dispatch((0, _publish.updateError)('file', value)); - } - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -// request actions -var HANDLE_SHOW_URI = exports.HANDLE_SHOW_URI = 'HANDLE_SHOW_URI'; -var REQUEST_ERROR = exports.REQUEST_ERROR = 'REQUEST_ERROR'; -var REQUEST_UPDATE = exports.REQUEST_UPDATE = 'REQUEST_UPDATE'; -var ASSET_REQUEST_NEW = exports.ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW'; -var CHANNEL_REQUEST_NEW = exports.CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW'; -var REQUEST_LIST_ADD = exports.REQUEST_LIST_ADD = 'REQUEST_LIST_ADD'; - -// asset actions -var ASSET_ADD = exports.ASSET_ADD = 'ASSET_ADD'; - -// channel actions -var CHANNEL_ADD = exports.CHANNEL_ADD = 'CHANNEL_ADD'; - -var CHANNEL_CLAIMS_UPDATE_ASYNC = exports.CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC'; -var CHANNEL_CLAIMS_UPDATE_SUCCESS = exports.CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS'; - -// asset/file display actions -var FILE_REQUESTED = exports.FILE_REQUESTED = 'FILE_REQUESTED'; -var FILE_AVAILABILITY_UPDATE = exports.FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE'; -var DISPLAY_ASSET_ERROR = exports.DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR'; - -/***/ }), -/* 20 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _NavBar = __webpack_require__(5); - -var _NavBar2 = _interopRequireDefault(_NavBar); - -var _SEO = __webpack_require__(7); - -var _SEO2 = _interopRequireDefault(_SEO); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var AboutPage = function (_React$Component) { - _inherits(AboutPage, _React$Component); - - function AboutPage() { - _classCallCheck(this, AboutPage); - - return _possibleConstructorReturn(this, (AboutPage.__proto__ || Object.getPrototypeOf(AboutPage)).apply(this, arguments)); - } - - _createClass(AboutPage, [{ - key: 'render', - value: function render() { - return _react2.default.createElement( - 'div', - null, - _react2.default.createElement(_SEO2.default, { pageTitle: 'About', pageUri: 'about' }), - _react2.default.createElement(_NavBar2.default, null), - _react2.default.createElement( - 'div', - { className: 'row row--padded' }, - _react2.default.createElement( - 'div', - { className: 'column column--5 column--med-10 align-content-top' }, - _react2.default.createElement( - 'div', - { className: 'column column--8 column--med-10' }, - _react2.default.createElement( - 'p', - { className: 'pull-quote' }, - 'Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.' - ), - _react2.default.createElement( - 'p', - null, - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'https://twitter.com/spee_ch' }, - 'TWITTER' - ) - ), - _react2.default.createElement( - 'p', - null, - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch' }, - 'GITHUB' - ) - ), - _react2.default.createElement( - 'p', - null, - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'https://discord.gg/YjYbwhS' }, - 'DISCORD CHANNEL' - ) - ), - _react2.default.createElement( - 'p', - null, - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch/blob/master/README.md' }, - 'DOCUMENTATION' - ) - ) - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--5 column--med-10 align-content-top' }, - _react2.default.createElement( - 'div', - { className: 'column column--8 column--med-10' }, - _react2.default.createElement( - 'p', - null, - 'Spee.ch is a media-hosting site that reads from and publishes content to the ', - _react2.default.createElement( - 'a', - { className: 'link--primary', href: 'https://lbry.io' }, - 'LBRY' - ), - ' blockchain.' - ), - _react2.default.createElement( - 'p', - null, - 'Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the ', - _react2.default.createElement( - 'a', - { className: 'link--primary', href: 'https://lbry.io/get' }, - 'LBRY' - ), - ' network. This means that your images are stored in multiple locations without a single point of failure.' - ), - _react2.default.createElement( - 'h3', - null, - 'Contribute' - ), - _react2.default.createElement( - 'p', - null, - 'If you have an idea for your own spee.ch-like site on top of LBRY, fork our ', - _react2.default.createElement( - 'a', - { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch' }, - 'github repo' - ), - ' and go to town!' - ), - _react2.default.createElement( - 'p', - null, - 'If you want to improve spee.ch, join our ', - _react2.default.createElement( - 'a', - { className: 'link--primary', href: 'https://discord.gg/YjYbwhS' }, - 'discord channel' - ), - ' or solve one of our ', - _react2.default.createElement( - 'a', - { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch/issues' }, - 'github issues' - ), - '.' - ) - ) - ) - ) - ); - } - }]); - - return AboutPage; -}(_react2.default.Component); - -; - -exports.default = AboutPage; - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _reactRouterDom = __webpack_require__(4); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function Logo() { - return _react2.default.createElement( - 'svg', - { version: '1.1', id: 'Layer_1', x: '0px', y: '0px', height: '24px', viewBox: '0 0 80 31', enableBackground: 'new 0 0 80 31', className: 'nav-bar-logo' }, - _react2.default.createElement( - _reactRouterDom.Link, - { to: '/' }, - _react2.default.createElement( - 'title', - null, - 'Logo' - ), - _react2.default.createElement( - 'desc', - null, - 'Spee.ch logo' - ), - _react2.default.createElement( - 'g', - { id: 'About' }, - _react2.default.createElement( - 'g', - { id: 'Publish-Form-V2-_x28_filled_x29_', transform: 'translate(-42.000000, -23.000000)' }, - _react2.default.createElement( - 'g', - { id: 'Group-17', transform: 'translate(42.000000, 22.000000)' }, - _react2.default.createElement( - 'text', - { transform: 'matrix(1 0 0 1 0 20)', fontSize: '25', fontFamily: 'Roboto' }, - 'Spee= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ExpandingTextarea = function (_Component) { - _inherits(ExpandingTextarea, _Component); - - function ExpandingTextarea(props) { - _classCallCheck(this, ExpandingTextarea); - - var _this = _possibleConstructorReturn(this, (ExpandingTextarea.__proto__ || Object.getPrototypeOf(ExpandingTextarea)).call(this, props)); - - _this._handleChange = _this._handleChange.bind(_this); - return _this; - } - - _createClass(ExpandingTextarea, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.adjustTextarea({}); - } - }, { - key: '_handleChange', - value: function _handleChange(event) { - var onChange = this.props.onChange; - - if (onChange) onChange(event); - this.adjustTextarea(event); - } - }, { - key: 'adjustTextarea', - value: function adjustTextarea(_ref) { - var _ref$target = _ref.target, - target = _ref$target === undefined ? this.el : _ref$target; - - target.style.height = 0; - target.style.height = target.scrollHeight + 'px'; - } - }, { - key: 'render', - value: function render() { - var _this2 = this; - - var rest = _objectWithoutProperties(this.props, []); - - return _react2.default.createElement('textarea', _extends({}, rest, { - ref: function ref(x) { - return _this2.el = x; - }, - onChange: this._handleChange - })); - } - }]); - - return ExpandingTextarea; -}(_react.Component); - -ExpandingTextarea.propTypes = { - onChange: _propTypes2.default.func -}; - -exports.default = ExpandingTextarea; - -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = __webpack_require__(14); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PublishPreview = function (_React$Component) { - _inherits(PublishPreview, _React$Component); - - function PublishPreview(props) { - _classCallCheck(this, PublishPreview); - - var _this = _possibleConstructorReturn(this, (PublishPreview.__proto__ || Object.getPrototypeOf(PublishPreview)).call(this, props)); - - _this.state = { - imgSource: '', - defaultThumbnail: '/assets/img/video_thumb_default.png' - }; - return _this; - } - - _createClass(PublishPreview, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.setPreviewImageSource(this.props.file); - } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(newProps) { - if (newProps.file !== this.props.file) { - this.setPreviewImageSource(newProps.file); - } - if (newProps.thumbnail !== this.props.thumbnail) { - if (newProps.thumbnail) { - this.setPreviewImageSourceFromFile(newProps.thumbnail); - } else { - this.setState({ imgSource: this.state.defaultThumbnail }); - } - } - } - }, { - key: 'setPreviewImageSourceFromFile', - value: function setPreviewImageSourceFromFile(file) { - var _this2 = this; - - var previewReader = new FileReader(); - previewReader.readAsDataURL(file); - previewReader.onloadend = function () { - _this2.setState({ imgSource: previewReader.result }); - }; - } - }, { - key: 'setPreviewImageSource', - value: function setPreviewImageSource(file) { - if (file.type !== 'video/mp4') { - this.setPreviewImageSourceFromFile(file); - } else { - if (this.props.thumbnail) { - this.setPreviewImageSourceFromFile(this.props.thumbnail); - } - this.setState({ imgSource: this.state.defaultThumbnail }); - } - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement('img', { - id: 'dropzone-preview', - src: this.state.imgSource, - className: this.props.dimPreview ? 'dim' : '', - alt: 'publish preview' - }); - } - }]); - - return PublishPreview; -}(_react2.default.Component); - -; - -PublishPreview.propTypes = { - dimPreview: _propTypes2.default.bool.isRequired, - file: _propTypes2.default.object.isRequired, - thumbnail: _propTypes2.default.object -}; - -exports.default = PublishPreview; - -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = __webpack_require__(14); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function UrlMiddle(_ref) { - var publishInChannel = _ref.publishInChannel, - selectedChannel = _ref.selectedChannel, - loggedInChannelName = _ref.loggedInChannelName, - loggedInChannelShortId = _ref.loggedInChannelShortId; - - if (publishInChannel) { - if (selectedChannel === loggedInChannelName) { - return _react2.default.createElement( - 'span', - { id: 'url-channel', className: 'url-text--secondary' }, - loggedInChannelName, - ':', - loggedInChannelShortId, - ' /' - ); - } - return _react2.default.createElement( - 'span', - { id: 'url-channel-placeholder', className: 'url-text--secondary tooltip' }, - '@channel', - _react2.default.createElement( - 'span', - { - className: 'tooltip-text' }, - 'Select a channel below' - ), - ' /' - ); - } - return _react2.default.createElement( - 'span', - { id: 'url-no-channel-placeholder', className: 'url-text--secondary tooltip' }, - 'xyz', - _react2.default.createElement( - 'span', - { className: 'tooltip-text' }, - 'This will be a random id' - ), - ' /' - ); -} - -UrlMiddle.propTypes = { - publishInChannel: _propTypes2.default.bool.isRequired, - loggedInChannelName: _propTypes2.default.string, - loggedInChannelShortId: _propTypes2.default.string -}; - -exports.default = UrlMiddle; - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _publish = __webpack_require__(6); - -var _view = __webpack_require__(81); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var channel = _ref.channel, - publish = _ref.publish; - - return { - loggedInChannelName: channel.loggedInChannel.name, - publishInChannel: publish.publishInChannel, - selectedChannel: publish.selectedChannel, - channelError: publish.error.channel - }; -}; - -var mapDispatchToProps = function mapDispatchToProps(dispatch) { - return { - onPublishInChannelChange: function onPublishInChannelChange(value) { - dispatch((0, _publish.updateError)('channel', null)); - dispatch((0, _publish.setPublishInChannel)(value)); - }, - onChannelSelect: function onChannelSelect(value) { - dispatch((0, _publish.updateError)('channel', null)); - dispatch((0, _publish.updateSelectedChannel)(value)); - } - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _publish = __webpack_require__(6); - -var _view = __webpack_require__(83); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var channel = _ref.channel, - publish = _ref.publish; - - return { - file: publish.file - }; -}; - -var mapDispatchToProps = { - clearFile: _publish.clearFile, - startPublish: _publish.startPublish -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _publish = __webpack_require__(6); - -var _view = __webpack_require__(84); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var publish = _ref.publish; - - return { - title: publish.metadata.title - }; -}; - -var mapDispatchToProps = function mapDispatchToProps(dispatch) { - return { - onMetadataChange: function onMetadataChange(name, value) { - dispatch((0, _publish.updateMetadata)(name, value)); - } - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _publish = __webpack_require__(6); - -var _reactRedux = __webpack_require__(1); - -var _view = __webpack_require__(85); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var channel = _ref.channel, - publish = _ref.publish; - - return { - loggedInChannelName: channel.loggedInChannel.name, - loggedInChannelShortId: channel.loggedInChannel.shortId, - fileName: publish.file.name, - publishInChannel: publish.publishInChannel, - selectedChannel: publish.selectedChannel, - claim: publish.claim, - urlError: publish.error.url - }; -}; - -var mapDispatchToProps = function mapDispatchToProps(dispatch) { - return { - onClaimChange: function onClaimChange(value) { - dispatch((0, _publish.updateClaim)(value)); - dispatch((0, _publish.updateError)('publishSubmit', null)); - }, - onUrlError: function onUrlError(value) { - dispatch((0, _publish.updateError)('url', value)); - } - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _publish = __webpack_require__(6); - -var _view = __webpack_require__(86); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var file = _ref.publish.file; - - return { - file: file - }; -}; - -var mapDispatchToProps = { - onNewThumbnail: _publish.onNewThumbnail -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 44 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _publish = __webpack_require__(6); - -var _view = __webpack_require__(87); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var publish = _ref.publish; - - return { - showMetadataInputs: publish.showMetadataInputs, - description: publish.metadata.description, - license: publish.metadata.license, - nsfw: publish.metadata.nsfw - }; -}; - -var mapDispatchToProps = function mapDispatchToProps(dispatch) { - return { - onMetadataChange: function onMetadataChange(name, value) { - dispatch((0, _publish.updateMetadata)(name, value)); - }, - onToggleMetadataInputs: function onToggleMetadataInputs(value) { - dispatch((0, _publish.toggleMetadataInputs)(value)); - } - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _view = __webpack_require__(88); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var publish = _ref.publish; - - return { - message: publish.disabledMessage - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); - -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _publish = __webpack_require__(6); - -var _view = __webpack_require__(89); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var publish = _ref.publish; - - return { - status: publish.status.status, - message: publish.status.message - }; -}; - -var mapDispatchToProps = { - clearFile: _publish.clearFile -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default); - -/***/ }), -/* 47 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reactRedux = __webpack_require__(1); - -var _view = __webpack_require__(90); - -var _view2 = _interopRequireDefault(_view); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mapStateToProps = function mapStateToProps(_ref) { - var publish = _ref.publish; - - return { - disabled: publish.disabled, - file: publish.file, - status: publish.status.status - }; -}; - -exports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default); - -/***/ }), -/* 48 */ -/***/ (function(module, exports) { - -module.exports = require("react-helmet"); - -/***/ }), -/* 49 */ -/***/ (function(module, exports) { - -module.exports = require("redux-saga/effects"); - -/***/ }), -/* 50 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Path = __webpack_require__(51); - -var _require = __webpack_require__(80), - getSubDirectoryNames = _require.getSubDirectoryNames; - -var thisFolder = Path.resolve(__dirname, 'client/components/'); -var modules = {}; - -getSubDirectoryNames(thisFolder).forEach(function (name) { - modules[name] = __webpack_require__(168)("./" + name).default; -}); - -module.exports = modules; - -/***/ }), -/* 51 */ -/***/ (function(module, exports) { - -module.exports = require("path"); - -/***/ }), -/* 52 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Path = __webpack_require__(51); - -var _require = __webpack_require__(80), - getSubDirectoryNames = _require.getSubDirectoryNames; - -var thisFolder = Path.resolve(__dirname, 'client/containers/'); - -var modules = {}; - -getSubDirectoryNames(thisFolder).forEach(function (name) { - modules[name] = __webpack_require__(169)("./" + name).default; -}); - -module.exports = modules; - -/***/ }), -/* 53 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Path = __webpack_require__(51); - -var _require = __webpack_require__(80), - getSubDirectoryNames = _require.getSubDirectoryNames; - -var thisFolder = Path.resolve(__dirname, 'client/pages/'); - -var modules = {}; - -getSubDirectoryNames(thisFolder).forEach(function (name) { - modules[name] = __webpack_require__(171)("./" + name).default; -}); - -module.exports = modules; - -/***/ }), -/* 54 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _SEO = __webpack_require__(7); - -var _SEO2 = _interopRequireDefault(_SEO); - -var _NavBar = __webpack_require__(5); - -var _NavBar2 = _interopRequireDefault(_NavBar); - -var _PublishTool = __webpack_require__(47); - -var _PublishTool2 = _interopRequireDefault(_PublishTool); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var HomePage = function (_React$Component) { - _inherits(HomePage, _React$Component); - - function HomePage() { - _classCallCheck(this, HomePage); - - return _possibleConstructorReturn(this, (HomePage.__proto__ || Object.getPrototypeOf(HomePage)).apply(this, arguments)); - } - - _createClass(HomePage, [{ - key: 'render', - value: function render() { - return _react2.default.createElement( - 'div', - { className: 'row row--tall flex-container--column' }, - _react2.default.createElement(_SEO2.default, null), - _react2.default.createElement(_NavBar2.default, null), - _react2.default.createElement( - 'div', - { className: 'row row--tall row--padded flex-container--column' }, - _react2.default.createElement(_PublishTool2.default, null) - ) - ); - } - }]); - - return HomePage; -}(_react2.default.Component); - -; - -exports.default = HomePage; - -/***/ }), -/* 55 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var axios = __webpack_require__(129); -var logger = __webpack_require__(2); - -var _require = __webpack_require__(130), - _require$api = _require.api, - apiHost = _require$api.apiHost, - apiPort = _require$api.apiPort; - -var lbryApiUri = 'http://' + apiHost + ':' + apiPort; - -var _require2 = __webpack_require__(56), - chooseGaLbrynetPublishLabel = _require2.chooseGaLbrynetPublishLabel, - sendGATimingEvent = _require2.sendGATimingEvent; - -var handleLbrynetResponse = function handleLbrynetResponse(_ref, resolve, reject) { - var data = _ref.data; - - logger.debug('lbry api data:', data); - if (data.result) { - // check for an error - if (data.result.error) { - logger.debug('Lbrynet api error:', data.result.error); - reject(new Error(data.result.error)); - return; - }; - resolve(data.result); - return; - } - // fallback in case it just timed out - reject(JSON.stringify(data)); -}; - -module.exports = { - publishClaim: function publishClaim(publishParams) { - logger.debug('lbryApi >> Publishing claim to "' + publishParams.name + '"'); - var gaStartTime = Date.now(); - return new Promise(function (resolve, reject) { - axios.post(lbryApiUri, { - method: 'publish', - params: publishParams - }).then(function (response) { - sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now()); - handleLbrynetResponse(response, resolve, reject); - }).catch(function (error) { - reject(error); - }); - }); +// const Server = require('./server/server.js'); +// const Components = require('./client/components'); +// const Containers = require('./client/containers'); +// const Pages = require('./client/pages'); +const apiRoutes = require('./server/routes/apiRoutes.js'); +const logger = require('./config/loggerConfig.js'); +const mysql = require('./config/mysqlConfig.js'); +const slack = require('./config/slackConfig.js'); +const database = require('./server/models'); + +const exports = { + // Server, + // Components, + // Containers, + // Pages, + apiRoutes, + config: { + logger, + mysql, + slack, }, - getClaim: function getClaim(uri) { - logger.debug('lbryApi >> Getting Claim for "' + uri + '"'); - var gaStartTime = Date.now(); - return new Promise(function (resolve, reject) { - axios.post(lbryApiUri, { - method: 'get', - params: { uri: uri, timeout: 20 } - }).then(function (response) { - sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now()); - handleLbrynetResponse(response, resolve, reject); - }).catch(function (error) { - reject(error); - }); - }); - }, - getClaimList: function getClaimList(claimName) { - logger.debug('lbryApi >> Getting claim_list for "' + claimName + '"'); - var gaStartTime = Date.now(); - return new Promise(function (resolve, reject) { - axios.post(lbryApiUri, { - method: 'claim_list', - params: { name: claimName } - }).then(function (response) { - sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now()); - handleLbrynetResponse(response, resolve, reject); - }).catch(function (error) { - reject(error); - }); - }); - }, - resolveUri: function resolveUri(uri) { - logger.debug('lbryApi >> Resolving URI for "' + uri + '"'); - var gaStartTime = Date.now(); - return new Promise(function (resolve, reject) { - axios.post(lbryApiUri, { - method: 'resolve', - params: { uri: uri } - }).then(function (_ref2) { - var data = _ref2.data; - - sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now()); - if (data.result[uri].error) { - // check for errors - reject(data.result[uri].error); - } else { - // if no errors, resolve - resolve(data.result[uri]); - } - }).catch(function (error) { - reject(error); - }); - }); - }, - getDownloadDirectory: function getDownloadDirectory() { - logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...'); - var gaStartTime = Date.now(); - return new Promise(function (resolve, reject) { - axios.post(lbryApiUri, { - method: 'settings_get' - }).then(function (_ref3) { - var data = _ref3.data; - - sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now()); - if (data.result) { - resolve(data.result.download_directory); - } else { - return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.'); - } - }).catch(function (error) { - logger.error('Lbrynet Error:', error); - resolve('/home/lbry/Downloads/'); - }); - }); - }, - createChannel: function createChannel(name) { - logger.debug('lbryApi >> Creating channel for ' + name + '...'); - var gaStartTime = Date.now(); - return new Promise(function (resolve, reject) { - axios.post(lbryApiUri, { - method: 'channel_new', - params: { - channel_name: name, - amount: 0.1 - } - }).then(function (response) { - sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now()); - handleLbrynetResponse(response, resolve, reject); - }).catch(function (error) { - reject(error); - }); - }); - } -}; - -/***/ }), -/* 56 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var logger = __webpack_require__(2); -var ua = __webpack_require__(131); - -var _require = __webpack_require__(3), - googleId = _require.analytics.googleId, - title = _require.details.title; - -function createServeEventParams(headers, ip, originalUrl) { - return { - eventCategory: 'client requests', - eventAction: 'serve request', - eventLabel: originalUrl, - ipOverride: ip, - userAgentOverride: headers['user-agent'] - }; -}; - -function createPublishTimingEventParams(category, variable, label, startTime, endTime) { - var duration = endTime - startTime; - return { - userTimingCategory: category, - userTimingVariableName: variable, - userTimingTime: duration, - userTimingLabel: label - }; -}; - -function sendGoogleAnalyticsEvent(ip, params) { - var visitorId = ip.replace(/\./g, '-'); - var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); - visitor.event(params, function (err) { - if (err) { - logger.error('Google Analytics Event Error >>', err); - } - }); -}; - -function sendGoogleAnalyticsTiming(visitorId, params) { - var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true }); - visitor.timing(params, function (err) { - if (err) { - logger.error('Google Analytics Event Error >>', err); - } - logger.debug('Timing event successfully sent to google analytics'); - }); -}; - -module.exports = { - sendGAServeEvent: function sendGAServeEvent(headers, ip, originalUrl) { - var params = createServeEventParams(headers, ip, originalUrl); - sendGoogleAnalyticsEvent(ip, params); - }, - sendGATimingEvent: function sendGATimingEvent(category, variable, label, startTime, endTime) { - var params = createPublishTimingEventParams(category, variable, label, startTime, endTime); - sendGoogleAnalyticsTiming(title, params); - }, - chooseGaLbrynetPublishLabel: function chooseGaLbrynetPublishLabel(_ref) { - var channelName = _ref.channel_name, - channelId = _ref.channel_id; - - return channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM'; - } -}; - -/***/ }), -/* 57 */ -/***/ (function(module, exports) { - -module.exports = require("redux"); - -/***/ }), -/* 58 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _require = __webpack_require__(3), - customComponents = _require.customComponents; - -function getDeepestChildValue(parent, childrenKeys) { - var childKey = childrenKeys.shift(); // .shift() retrieves the first element of array and removes it from array - var child = parent[childKey]; - if (childrenKeys.length >= 1) { - return getDeepestChildValue(child, childrenKeys); - } - return child; -} - -var dynamicImport = exports.dynamicImport = function dynamicImport(filePath) { - // validate inputs - if (!filePath) { - throw new Error('no file path provided to dynamicImport()'); - } - if (typeof filePath !== 'string') { - console.log('dynamicImport > filePath:', filePath); - console.log('dynamicImport > filePath type:', typeof filePath === 'undefined' ? 'undefined' : _typeof(filePath)); - throw new Error('file path provided to dynamicImport() must be a string'); - } - if (!customComponents) { - return __webpack_require__(109)("" + filePath); - } - // split out the file folders // filter out any empty or white-space-only strings - var folders = filePath.split('/').filter(function (folderName) { - return folderName.replace(/\s/g, '').length; - }); - // check for the component corresponding to file path in the site config object - // i.e. customComponents[folders[0]][folders[2][...][folders[n]] - var component = getDeepestChildValue(customComponents, folders); - if (component) { - return component; // return custom component - } else { - return __webpack_require__(109)("" + filePath); - } -}; - -/***/ }), -/* 59 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var createBasicCanonicalLink = function createBasicCanonicalLink(page, siteHost) { - return siteHost + "/" + page; -}; - -var createAssetCanonicalLink = function createAssetCanonicalLink(asset, siteHost) { - var channelName = void 0, - certificateId = void 0, - name = void 0, - claimId = void 0; - if (asset.claimData) { - var _asset$claimData = asset.claimData; - channelName = _asset$claimData.channelName; - certificateId = _asset$claimData.certificateId; - name = _asset$claimData.name; - claimId = _asset$claimData.claimId; - }; - if (channelName) { - return siteHost + "/" + channelName + ":" + certificateId + "/" + name; - }; - return siteHost + "/" + claimId + "/" + name; -}; - -var createChannelCanonicalLink = function createChannelCanonicalLink(channel, siteHost) { - var name = channel.name, - longId = channel.longId; - - return siteHost + "/" + name + ":" + longId; -}; - -var createCanonicalLink = exports.createCanonicalLink = function createCanonicalLink(asset, channel, page, siteHost) { - if (asset) { - return createAssetCanonicalLink(asset, siteHost); - } - if (channel) { - return createChannelCanonicalLink(channel, siteHost); - } - return createBasicCanonicalLink(page, siteHost); -}; - -/***/ }), -/* 60 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = { - validateFile: function validateFile(file) { - if (!file) { - throw new Error('no file provided'); - } - if (/'/.test(file.name)) { - throw new Error('apostrophes are not allowed in the file name'); - } - // validate size and type - switch (file.type) { - case 'image/jpeg': - case 'image/jpg': - case 'image/png': - if (file.size > 10000000) { - throw new Error('Sorry, images are limited to 10 megabytes.'); - } - break; - case 'image/gif': - if (file.size > 50000000) { - throw new Error('Sorry, GIFs are limited to 50 megabytes.'); - } - break; - case 'video/mp4': - if (file.size > 50000000) { - throw new Error('Sorry, videos are limited to 50 megabytes.'); - } - break; - default: - throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.'); - } - } -}; - -/***/ }), -/* 61 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -module.exports = { - REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g, - REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g, - REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/, - CHANNEL_CHAR: '@', - parseIdentifier: function parseIdentifier(identifier) { - var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end) - '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) - ); - - var _componentsRegex$exec = componentsRegex // eslint-disable-line no-unused-vars - .exec(identifier).map(function (match) { - return match || null; - }), - _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4), - proto = _componentsRegex$exec2[0], - value = _componentsRegex$exec2[1], - modifierSeperator = _componentsRegex$exec2[2], - modifier = _componentsRegex$exec2[3]; - - // Validate and process name - - - if (!value) { - throw new Error('Check your URL. No channel name provided before "' + modifierSeperator + '"'); - } - var isChannel = value.startsWith(module.exports.CHANNEL_CHAR); - var channelName = isChannel ? value : null; - var claimId = void 0; - if (isChannel) { - if (!channelName) { - throw new Error('Check your URL. No channel name after "@".'); - } - var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL); - if (nameBadChars) { - throw new Error('Check your URL. Invalid characters in channel name: "' + nameBadChars.join(', ') + '".'); - } - } else { - claimId = value; - } - - // Validate and process modifier - var channelClaimId = void 0; - if (modifierSeperator) { - if (!modifier) { - throw new Error('Check your URL. No modifier provided after separator "' + modifierSeperator + '"'); - } - - if (modifierSeperator === ':') { - channelClaimId = modifier; - } else { - throw new Error('Check your URL. The "' + modifierSeperator + '" modifier is not currently supported'); - } - } - return { - isChannel: isChannel, - channelName: channelName, - channelClaimId: channelClaimId || null, - claimId: claimId || null - }; - }, - parseClaim: function parseClaim(name) { - var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first extension) - '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end) - ); - - var _componentsRegex$exec3 = componentsRegex // eslint-disable-line no-unused-vars - .exec(name).map(function (match) { - return match || null; - }), - _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4), - proto = _componentsRegex$exec4[0], - claimName = _componentsRegex$exec4[1], - extensionSeperator = _componentsRegex$exec4[2], - extension = _componentsRegex$exec4[3]; - - // Validate and process name - - - if (!claimName) { - throw new Error('Check your URL. No claim name provided before "."'); - } - var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM); - if (nameBadChars) { - throw new Error('Check your URL. Invalid characters in claim name: "' + nameBadChars.join(', ') + '".'); - } - // Validate and process extension - if (extensionSeperator) { - if (!extension) { - throw new Error('Check your URL. No file extension provided after separator "' + extensionSeperator + '".'); - } - if (extensionSeperator !== '.') { - throw new Error('Check your URL. The "' + extensionSeperator + '" separator is not supported in the claim name.'); - } - } - return { - claimName: claimName, - extension: extension || null - }; - } -}; - -/***/ }), -/* 62 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var determineOgThumbnailContentType = function determineOgThumbnailContentType(thumbnail) { - if (thumbnail) { - var fileExt = thumbnail.substring(thumbnail.lastIndexOf('.')); - switch (fileExt) { - case 'jpeg': - case 'jpg': - return 'image/jpeg'; - case 'png': - return 'image/png'; - case 'gif': - return 'image/gif'; - case 'mp4': - return 'video/mp4'; - default: - return 'image/jpeg'; - } - } - return ''; -}; - -var createBasicMetaTags = function createBasicMetaTags(siteHost, siteDescription, siteTitle, siteTwitter) { - return [{ property: 'og:title', content: siteTitle }, { property: 'og:url', content: siteHost }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: siteDescription }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }]; -}; - -var createChannelMetaTags = function createChannelMetaTags(siteTitle, siteHost, siteTwitter, channel) { - var name = channel.name, - longId = channel.longId; - - return [{ property: 'og:title', content: name + ' on ' + siteTitle }, { property: 'og:url', content: siteHost + '/' + name + ':' + longId }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: name + ', a channel on ' + siteTitle }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }]; -}; - -var createAssetMetaTags = function createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail) { - var claimData = asset.claimData; - var contentType = claimData.contentType; - - var embedUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name; - var showUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name; - var source = siteHost + '/' + claimData.claimId + '/' + claimData.name + '.' + claimData.fileExt; - var ogTitle = claimData.title || claimData.name; - var ogDescription = claimData.description || defaultDescription; - var ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail); - var ogThumbnail = claimData.thumbnail || defaultThumbnail; - var metaTags = [{ property: 'og:title', content: ogTitle }, { property: 'og:url', content: showUrl }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: ogDescription }, { property: 'og:image:width', content: 600 }, { property: 'og:image:height', content: 315 }, { property: 'twitter:site', content: siteTwitter }]; - if (contentType === 'video/mp4' || contentType === 'video/webm') { - metaTags.push({ property: 'og:video', content: source }); - metaTags.push({ property: 'og:video:secure_url', content: source }); - metaTags.push({ property: 'og:video:type', content: contentType }); - metaTags.push({ property: 'og:image', content: ogThumbnail }); - metaTags.push({ property: 'og:image:type', content: ogThumbnailContentType }); - metaTags.push({ property: 'og:type', content: 'video' }); - metaTags.push({ property: 'twitter:card', content: 'player' }); - metaTags.push({ property: 'twitter:player', content: embedUrl }); - metaTags.push({ property: 'twitter:player:width', content: 600 }); - metaTags.push({ property: 'twitter:text:player_width', content: 600 }); - metaTags.push({ property: 'twitter:player:height', content: 337 }); - metaTags.push({ property: 'twitter:player:stream', content: source }); - metaTags.push({ property: 'twitter:player:stream:content_type', content: contentType }); - } else { - metaTags.push({ property: 'og:image', content: source }); - metaTags.push({ property: 'og:image:type', content: contentType }); - metaTags.push({ property: 'og:type', content: 'article' }); - metaTags.push({ property: 'twitter:card', content: 'summary_large_image' }); - } - return metaTags; -}; - -var createMetaTags = exports.createMetaTags = function createMetaTags(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail) { - if (asset) { - return createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail); - }; - if (channel) { - return createChannelMetaTags(siteHost, siteTitle, siteTwitter, channel); - }; - return createBasicMetaTags(siteDescription, siteHost, siteTitle, siteTwitter); -}; - -/***/ }), -/* 63 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var createPageTitle = exports.createPageTitle = function createPageTitle(siteTitle, pageTitle) { - if (!pageTitle) { - return "" + siteTitle; - } - return siteTitle + " - " + pageTitle; -}; - -/***/ }), -/* 64 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.updateLoggedInChannel = updateLoggedInChannel; - -var _channel_action_types = __webpack_require__(106); - -var actions = _interopRequireWildcard(_channel_action_types); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -// export action creators - -function updateLoggedInChannel(name, shortId, longId) { - return { - type: actions.CHANNEL_UPDATE, - data: { - name: name, - shortId: shortId, - longId: longId - } - }; -}; - -/***/ }), -/* 65 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _reactRouterDom = __webpack_require__(4); - -var _Logo = __webpack_require__(21); - -var _Logo2 = _interopRequireDefault(_Logo); - -var _NavBarChannelOptionsDropdown = __webpack_require__(22); - -var _NavBarChannelOptionsDropdown2 = _interopRequireDefault(_NavBarChannelOptionsDropdown); - -var _request = __webpack_require__(8); - -var _request2 = _interopRequireDefault(_request); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var VIEW = 'VIEW'; -var LOGOUT = 'LOGOUT'; - -var NavBar = function (_React$Component) { - _inherits(NavBar, _React$Component); - - function NavBar(props) { - _classCallCheck(this, NavBar); - - var _this = _possibleConstructorReturn(this, (NavBar.__proto__ || Object.getPrototypeOf(NavBar)).call(this, props)); - - _this.checkForLoggedInUser = _this.checkForLoggedInUser.bind(_this); - _this.logoutUser = _this.logoutUser.bind(_this); - _this.handleSelection = _this.handleSelection.bind(_this); - return _this; - } - - _createClass(NavBar, [{ - key: 'componentDidMount', - value: function componentDidMount() { - // check to see if the user is already logged in - this.checkForLoggedInUser(); - } - }, { - key: 'checkForLoggedInUser', - value: function checkForLoggedInUser() { - var _this2 = this; - - var params = { credentials: 'include' }; - (0, _request2.default)('/user', params).then(function (_ref) { - var data = _ref.data; - - _this2.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId); - }).catch(function (error) { - console.log('/user error:', error.message); - }); - } - }, { - key: 'logoutUser', - value: function logoutUser() { - var _this3 = this; - - var params = { credentials: 'include' }; - (0, _request2.default)('/logout', params).then(function () { - _this3.props.onChannelLogout(); - }).catch(function (error) { - console.log('/logout error', error.message); - }); - } - }, { - key: 'handleSelection', - value: function handleSelection(event) { - var value = event.target.selectedOptions[0].value; - switch (value) { - case LOGOUT: - this.logoutUser(); - break; - case VIEW: - // redirect to channel page - this.props.history.push('/' + this.props.channelName + ':' + this.props.channelLongId); - break; - default: - break; - } - } - }, { - key: 'render', - value: function render() { - var siteDescription = this.props.siteDescription; - - return _react2.default.createElement( - 'div', - { className: 'row row--wide nav-bar' }, - _react2.default.createElement( - 'div', - { className: 'row row--padded row--short flex-container--row flex-container--space-between-center' }, - _react2.default.createElement(_Logo2.default, null), - _react2.default.createElement( - 'div', - { className: 'nav-bar--center' }, - _react2.default.createElement( - 'span', - { className: 'nav-bar-tagline' }, - siteDescription - ) - ), - _react2.default.createElement( - 'div', - { className: 'nav-bar--right' }, - _react2.default.createElement( - _reactRouterDom.NavLink, - { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/', exact: true }, - 'Publish' - ), - _react2.default.createElement( - _reactRouterDom.NavLink, - { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/about' }, - 'About' - ), - this.props.channelName ? _react2.default.createElement(_NavBarChannelOptionsDropdown2.default, { - channelName: this.props.channelName, - handleSelection: this.handleSelection, - defaultSelection: this.props.channelName, - VIEW: VIEW, - LOGOUT: LOGOUT - }) : _react2.default.createElement( - _reactRouterDom.NavLink, - { id: 'nav-bar-login-link', className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/login' }, - 'Channel' - ) - ) - ) - ); - } - }]); - - return NavBar; -}(_react2.default.Component); - -exports.default = (0, _reactRouterDom.withRouter)(NavBar); - -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _reactHelmet = __webpack_require__(48); - -var _reactHelmet2 = _interopRequireDefault(_reactHelmet); - -var _propTypes = __webpack_require__(14); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _pageTitle = __webpack_require__(63); - -var _metaTags = __webpack_require__(62); - -var _canonicalLink = __webpack_require__(59); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var SEO = function (_React$Component) { - _inherits(SEO, _React$Component); - - function SEO() { - _classCallCheck(this, SEO); - - return _possibleConstructorReturn(this, (SEO.__proto__ || Object.getPrototypeOf(SEO)).apply(this, arguments)); - } - - _createClass(SEO, [{ - key: 'render', - value: function render() { - // props from state - var _props = this.props, - defaultDescription = _props.defaultDescription, - defaultThumbnail = _props.defaultThumbnail, - siteDescription = _props.siteDescription, - siteHost = _props.siteHost, - siteTitle = _props.siteTitle, - siteTwitter = _props.siteTwitter; - // props from parent - - var _props2 = this.props, - asset = _props2.asset, - channel = _props2.channel, - pageUri = _props2.pageUri; - var pageTitle = this.props.pageTitle; - // create page title, tags, and canonical link - - pageTitle = (0, _pageTitle.createPageTitle)(siteTitle, pageTitle); - var metaTags = (0, _metaTags.createMetaTags)(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail); - var canonicalLink = (0, _canonicalLink.createCanonicalLink)(asset, channel, pageUri, siteHost); - // render results - return _react2.default.createElement(_reactHelmet2.default, { - title: pageTitle, - meta: metaTags, - link: [{ rel: 'canonical', href: canonicalLink }] - }); - } - }]); - - return SEO; -}(_react2.default.Component); - -; - -SEO.propTypes = { - pageTitle: _propTypes2.default.string, - pageUri: _propTypes2.default.string, - channel: _propTypes2.default.object, - asset: _propTypes2.default.object -}; - -exports.default = SEO; - -/***/ }), -/* 67 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _reactRouterDom = __webpack_require__(4); - -var _SEO = __webpack_require__(7); - -var _SEO2 = _interopRequireDefault(_SEO); - -var _NavBar = __webpack_require__(5); - -var _NavBar2 = _interopRequireDefault(_NavBar); - -var _ChannelLoginForm = __webpack_require__(15); - -var _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm); - -var _ChannelCreateForm = __webpack_require__(16); - -var _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var LoginPage = function (_React$Component) { - _inherits(LoginPage, _React$Component); - - function LoginPage() { - _classCallCheck(this, LoginPage); - - return _possibleConstructorReturn(this, (LoginPage.__proto__ || Object.getPrototypeOf(LoginPage)).apply(this, arguments)); - } - - _createClass(LoginPage, [{ - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(newProps) { - // re-route the user to the homepage if the user is logged in - if (newProps.loggedInChannelName !== this.props.loggedInChannelName) { - this.props.history.push('/'); - } - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement( - 'div', - null, - _react2.default.createElement(_SEO2.default, { pageTitle: 'Login', pageUri: 'login' }), - _react2.default.createElement(_NavBar2.default, null), - _react2.default.createElement( - 'div', - { className: 'row row--padded' }, - _react2.default.createElement( - 'div', - { className: 'column column--5 column--med-10 align-content-top' }, - _react2.default.createElement( - 'div', - { className: 'column column--8 column--med-10' }, - _react2.default.createElement( - 'p', - null, - 'Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you\'re ', - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: '/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8' }, - 'documenting important events' - ), - ', or making a public repository for ', - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: '/@catGifs' }, - 'cat gifs' - ), - ' (password: \'1234\'), try creating a channel for it!' - ) - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--5 column--med-10 align-content-top' }, - _react2.default.createElement( - 'div', - { className: 'column column--8 column--med-10' }, - _react2.default.createElement( - 'h3', - { className: 'h3--no-bottom' }, - 'Log in to an existing channel:' - ), - _react2.default.createElement(_ChannelLoginForm2.default, null), - _react2.default.createElement( - 'h3', - { className: 'h3--no-bottom' }, - 'Create a brand new channel:' - ), - _react2.default.createElement(_ChannelCreateForm2.default, null) - ) - ) - ) - ); - } - }]); - - return LoginPage; -}(_react2.default.Component); - -; - -exports.default = (0, _reactRouterDom.withRouter)(LoginPage); - -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _request = __webpack_require__(8); - -var _request2 = _interopRequireDefault(_request); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ChannelLoginForm = function (_React$Component) { - _inherits(ChannelLoginForm, _React$Component); - - function ChannelLoginForm(props) { - _classCallCheck(this, ChannelLoginForm); - - var _this = _possibleConstructorReturn(this, (ChannelLoginForm.__proto__ || Object.getPrototypeOf(ChannelLoginForm)).call(this, props)); - - _this.state = { - error: null, - name: '', - password: '' - }; - _this.handleInput = _this.handleInput.bind(_this); - _this.loginToChannel = _this.loginToChannel.bind(_this); - return _this; - } - - _createClass(ChannelLoginForm, [{ - key: 'handleInput', - value: function handleInput(event) { - var name = event.target.name; - var value = event.target.value; - this.setState(_defineProperty({}, name, value)); - } - }, { - key: 'loginToChannel', - value: function loginToChannel(event) { - var _this2 = this; - - event.preventDefault(); - var params = { - method: 'POST', - body: JSON.stringify({ username: this.state.name, password: this.state.password }), - headers: new Headers({ - 'Content-Type': 'application/json' - }), - credentials: 'include' - }; - (0, _request2.default)('login', params).then(function (_ref) { - var success = _ref.success, - channelName = _ref.channelName, - shortChannelId = _ref.shortChannelId, - channelClaimId = _ref.channelClaimId, - message = _ref.message; - - if (success) { - _this2.props.onChannelLogin(channelName, shortChannelId, channelClaimId); - } else { - _this2.setState({ 'error': message }); - }; - }).catch(function (error) { - if (error.message) { - _this2.setState({ 'error': error.message }); - } else { - _this2.setState({ 'error': error }); - } - }); - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement( - 'form', - { id: 'channel-login-form' }, - _react2.default.createElement( - 'div', - { className: 'row row--wide row--short' }, - _react2.default.createElement( - 'div', - { className: 'column column--3 column--sml-10' }, - _react2.default.createElement( - 'label', - { className: 'label', htmlFor: 'channel-login-name-input' }, - 'Name:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--6 column--sml-10' }, - _react2.default.createElement( - 'div', - { className: 'input-text--primary flex-container--row flex-container--left-bottom' }, - _react2.default.createElement( - 'span', - null, - '@' - ), - _react2.default.createElement('input', { type: 'text', id: 'channel-login-name-input', className: 'input-text', name: 'name', placeholder: 'Your Channel Name', value: this.state.channelName, onChange: this.handleInput }) - ) - ) - ), - _react2.default.createElement( - 'div', - { className: 'row row--wide row--short' }, - _react2.default.createElement( - 'div', - { className: 'column column--3 column--sml-10' }, - _react2.default.createElement( - 'label', - { className: 'label', htmlFor: 'channel-login-password-input' }, - 'Password:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--6 column--sml-10' }, - _react2.default.createElement( - 'div', - { className: 'input-text--primary' }, - _react2.default.createElement('input', { type: 'password', id: 'channel-login-password-input', name: 'password', className: 'input-text', placeholder: '', value: this.state.channelPassword, onChange: this.handleInput }) - ) - ) - ), - this.state.error ? _react2.default.createElement( - 'p', - { className: 'info-message--failure' }, - this.state.error - ) : _react2.default.createElement( - 'p', - { className: 'info-message' }, - 'Enter the name and password for your channel' - ), - _react2.default.createElement( - 'div', - { className: 'row row--wide' }, - _react2.default.createElement( - 'button', - { className: 'button--primary', onClick: this.loginToChannel }, - 'Authenticate' - ) - ) - ); - } - }]); - - return ChannelLoginForm; -}(_react2.default.Component); - -exports.default = ChannelLoginForm; - -/***/ }), -/* 69 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _ProgressBar = __webpack_require__(10); - -var _ProgressBar2 = _interopRequireDefault(_ProgressBar); - -var _request = __webpack_require__(8); - -var _request2 = _interopRequireDefault(_request); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ChannelCreateForm = function (_React$Component) { - _inherits(ChannelCreateForm, _React$Component); - - function ChannelCreateForm(props) { - _classCallCheck(this, ChannelCreateForm); - - var _this = _possibleConstructorReturn(this, (ChannelCreateForm.__proto__ || Object.getPrototypeOf(ChannelCreateForm)).call(this, props)); - - _this.state = { - error: null, - channel: '', - password: '', - status: null - }; - _this.handleChannelInput = _this.handleChannelInput.bind(_this); - _this.handleInput = _this.handleInput.bind(_this); - _this.createChannel = _this.createChannel.bind(_this); - return _this; - } - - _createClass(ChannelCreateForm, [{ - key: 'cleanseChannelInput', - value: function cleanseChannelInput(input) { - input = input.replace(/\s+/g, '-'); // replace spaces with dashes - input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-' - return input; - } - }, { - key: 'handleChannelInput', - value: function handleChannelInput(event) { - var value = event.target.value; - value = this.cleanseChannelInput(value); - this.setState({ channel: value }); - if (value) { - this.updateIsChannelAvailable(value); - } else { - this.setState({ error: 'Please enter a channel name' }); - } - } - }, { - key: 'handleInput', - value: function handleInput(event) { - var name = event.target.name; - var value = event.target.value; - this.setState(_defineProperty({}, name, value)); - } - }, { - key: 'updateIsChannelAvailable', - value: function updateIsChannelAvailable(channel) { - var _this2 = this; - - var channelWithAtSymbol = '@' + channel; - (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol).then(function () { - _this2.setState({ 'error': null }); - }).catch(function (error) { - _this2.setState({ 'error': error.message }); - }); - } - }, { - key: 'checkIsChannelAvailable', - value: function checkIsChannelAvailable(channel) { - var channelWithAtSymbol = '@' + channel; - return (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol); - } - }, { - key: 'checkIsPasswordProvided', - value: function checkIsPasswordProvided(password) { - return new Promise(function (resolve, reject) { - if (!password || password.length < 1) { - return reject(new Error('Please provide a password')); - } - resolve(); - }); - } - }, { - key: 'makePublishChannelRequest', - value: function makePublishChannelRequest(username, password) { - var params = { - method: 'POST', - body: JSON.stringify({ username: username, password: password }), - headers: new Headers({ - 'Content-Type': 'application/json' - }), - credentials: 'include' - }; - return new Promise(function (resolve, reject) { - (0, _request2.default)('/signup', params).then(function (result) { - return resolve(result); - }).catch(function (error) { - reject(new Error('Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ' + error.message)); - }); - }); - } - }, { - key: 'createChannel', - value: function createChannel(event) { - var _this3 = this; - - event.preventDefault(); - this.checkIsPasswordProvided(this.state.password).then(function () { - return _this3.checkIsChannelAvailable(_this3.state.channel); - }).then(function () { - _this3.setState({ status: 'We are publishing your new channel. Sit tight...' }); - return _this3.makePublishChannelRequest(_this3.state.channel, _this3.state.password); - }).then(function (result) { - _this3.setState({ status: null }); - _this3.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId); - }).catch(function (error) { - if (error.message) { - _this3.setState({ 'error': error.message, status: null }); - } else { - _this3.setState({ 'error': error, status: null }); - }; - }); - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement( - 'div', - null, - !this.state.status ? _react2.default.createElement( - 'form', - { id: 'publish-channel-form' }, - _react2.default.createElement( - 'div', - { className: 'row row--wide row--short' }, - _react2.default.createElement( - 'div', - { className: 'column column--3 column--sml-10' }, - _react2.default.createElement( - 'label', - { className: 'label', htmlFor: 'new-channel-name' }, - 'Name:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--6 column--sml-10' }, - _react2.default.createElement( - 'div', - { className: 'input-text--primary flex-container--row flex-container--left-bottom span--relative' }, - _react2.default.createElement( - 'span', - null, - '@' - ), - _react2.default.createElement('input', { type: 'text', name: 'channel', id: 'new-channel-name', className: 'input-text', placeholder: 'exampleChannelName', value: this.state.channel, onChange: this.handleChannelInput }), - this.state.channel && !this.state.error && _react2.default.createElement( - 'span', - { id: 'input-success-channel-name', className: 'info-message--success span--absolute' }, - '\u2713' - ), - this.state.error && _react2.default.createElement( - 'span', - { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' }, - '\u2716' - ) - ) - ) - ), - _react2.default.createElement( - 'div', - { className: 'row row--wide row--short' }, - _react2.default.createElement( - 'div', - { className: 'column column--3 column--sml-10' }, - _react2.default.createElement( - 'label', - { className: 'label', htmlFor: 'new-channel-password' }, - 'Password:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--6 column--sml-10' }, - _react2.default.createElement( - 'div', - { className: 'input-text--primary' }, - _react2.default.createElement('input', { type: 'password', name: 'password', id: 'new-channel-password', className: 'input-text', placeholder: '', value: this.state.password, onChange: this.handleInput }) - ) - ) - ), - this.state.error ? _react2.default.createElement( - 'p', - { className: 'info-message--failure' }, - this.state.error - ) : _react2.default.createElement( - 'p', - { className: 'info-message' }, - 'Choose a name and password for your channel' - ), - _react2.default.createElement( - 'div', - { className: 'row row--wide' }, - _react2.default.createElement( - 'button', - { className: 'button--primary', onClick: this.createChannel }, - 'Create Channel' - ) - ) - ) : _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'p', - { className: 'fine-print' }, - this.state.status - ), - _react2.default.createElement(_ProgressBar2.default, { size: 12 }) - ) - ); - } - }]); - - return ChannelCreateForm; -}(_react2.default.Component); - -exports.default = ChannelCreateForm; - -/***/ }), -/* 70 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _ErrorPage = __webpack_require__(12); - -var _ErrorPage2 = _interopRequireDefault(_ErrorPage); - -var _ShowAssetLite = __webpack_require__(27); - -var _ShowAssetLite2 = _interopRequireDefault(_ShowAssetLite); - -var _ShowAssetDetails = __webpack_require__(29); - -var _ShowAssetDetails2 = _interopRequireDefault(_ShowAssetDetails); - -var _ShowChannel = __webpack_require__(32); - -var _ShowChannel2 = _interopRequireDefault(_ShowChannel); - -var _show_request_types = __webpack_require__(112); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ShowPage = function (_React$Component) { - _inherits(ShowPage, _React$Component); - - function ShowPage() { - _classCallCheck(this, ShowPage); - - return _possibleConstructorReturn(this, (ShowPage.__proto__ || Object.getPrototypeOf(ShowPage)).apply(this, arguments)); - } - - _createClass(ShowPage, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.props.onHandleShowPageUri(this.props.match.params); - } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(nextProps) { - if (nextProps.match.params !== this.props.match.params) { - this.props.onHandleShowPageUri(nextProps.match.params); - } - } - }, { - key: 'render', - value: function render() { - var _props = this.props, - error = _props.error, - requestType = _props.requestType; - - if (error) { - return _react2.default.createElement(_ErrorPage2.default, { error: error }); - } - switch (requestType) { - case _show_request_types.CHANNEL: - return _react2.default.createElement(_ShowChannel2.default, null); - case _show_request_types.ASSET_LITE: - return _react2.default.createElement(_ShowAssetLite2.default, null); - case _show_request_types.ASSET_DETAILS: - return _react2.default.createElement(_ShowAssetDetails2.default, null); - default: - return _react2.default.createElement( - 'p', - null, - 'loading...' - ); - } - } - }]); - - return ShowPage; -}(_react2.default.Component); - -; - -exports.default = ShowPage; - -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _SEO = __webpack_require__(7); - -var _SEO2 = _interopRequireDefault(_SEO); - -var _reactRouterDom = __webpack_require__(4); - -var _AssetDisplay = __webpack_require__(17); - -var _AssetDisplay2 = _interopRequireDefault(_AssetDisplay); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ShowLite = function (_React$Component) { - _inherits(ShowLite, _React$Component); - - function ShowLite() { - _classCallCheck(this, ShowLite); - - return _possibleConstructorReturn(this, (ShowLite.__proto__ || Object.getPrototypeOf(ShowLite)).apply(this, arguments)); - } - - _createClass(ShowLite, [{ - key: 'render', - value: function render() { - var asset = this.props.asset; - - if (asset) { - var _asset$claimData = asset.claimData, - name = _asset$claimData.name, - claimId = _asset$claimData.claimId; - - return _react2.default.createElement( - 'div', - { className: 'row row--tall flex-container--column flex-container--center-center show-lite-container' }, - _react2.default.createElement(_SEO2.default, { pageTitle: name, asset: asset }), - _react2.default.createElement(_AssetDisplay2.default, null), - _react2.default.createElement( - _reactRouterDom.Link, - { id: 'asset-boilerpate', className: 'link--primary fine-print', to: '/' + claimId + '/' + name }, - 'hosted via Spee.ch' - ) - ); - } - return _react2.default.createElement( - 'div', - { className: 'row row--tall row--padded flex-container--column flex-container--center-center' }, - _react2.default.createElement( - 'p', - null, - 'loading asset data...' - ) - ); - } - }]); - - return ShowLite; -}(_react2.default.Component); - -; - -exports.default = ShowLite; - -/***/ }), -/* 72 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _ProgressBar = __webpack_require__(10); - -var _ProgressBar2 = _interopRequireDefault(_ProgressBar); - -var _asset_display_states = __webpack_require__(107); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var AssetDisplay = function (_React$Component) { - _inherits(AssetDisplay, _React$Component); - - function AssetDisplay() { - _classCallCheck(this, AssetDisplay); - - return _possibleConstructorReturn(this, (AssetDisplay.__proto__ || Object.getPrototypeOf(AssetDisplay)).apply(this, arguments)); - } - - _createClass(AssetDisplay, [{ - key: 'componentDidMount', - value: function componentDidMount() { - var _props$asset$claimDat = this.props.asset.claimData, - name = _props$asset$claimDat.name, - claimId = _props$asset$claimDat.claimId; - - this.props.onFileRequest(name, claimId); - } - }, { - key: 'render', - value: function render() { - var _props = this.props, - status = _props.status, - error = _props.error, - _props$asset$claimDat2 = _props.asset.claimData, - name = _props$asset$claimDat2.name, - claimId = _props$asset$claimDat2.claimId, - contentType = _props$asset$claimDat2.contentType, - fileExt = _props$asset$claimDat2.fileExt, - thumbnail = _props$asset$claimDat2.thumbnail; - - return _react2.default.createElement( - 'div', - { id: 'asset-display-component' }, - status === _asset_display_states.LOCAL_CHECK && _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'p', - null, - 'Checking to see if Spee.ch has your asset locally...' - ) - ), - status === _asset_display_states.UNAVAILABLE && _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'p', - null, - 'Sit tight, we\'re searching the LBRY blockchain for your asset!' - ), - _react2.default.createElement(_ProgressBar2.default, { size: 12 }), - _react2.default.createElement( - 'p', - null, - 'Curious what magic is happening here? ', - _react2.default.createElement( - 'a', - { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' }, - 'Learn more.' - ) - ) - ), - status === _asset_display_states.ERROR && _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'p', - null, - 'Unfortunately, we couldn\'t download your asset from LBRY. You can help us out by sharing the below error message in the ', - _react2.default.createElement( - 'a', - { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' }, - 'LBRY discord' - ), - '.' - ), - _react2.default.createElement( - 'i', - null, - _react2.default.createElement( - 'p', - { id: 'error-message' }, - error - ) - ) - ), - status === _asset_display_states.AVAILABLE && function () { - switch (contentType) { - case 'image/jpeg': - case 'image/jpg': - case 'image/png': - return _react2.default.createElement('img', { - className: 'asset', - src: '/' + claimId + '/' + name + '.' + fileExt, - alt: name }); - case 'image/gif': - return _react2.default.createElement('img', { - className: 'asset', - src: '/' + claimId + '/' + name + '.' + fileExt, - alt: name - }); - case 'video/mp4': - return _react2.default.createElement( - 'video', - { className: 'asset video', controls: true, poster: thumbnail }, - _react2.default.createElement('source', { - src: '/' + claimId + '/' + name + '.' + fileExt - }), - _react2.default.createElement( - 'p', - null, - 'Your browser does not support the ', - _react2.default.createElement( - 'code', - null, - 'video' - ), - ' element.' - ) - ); - default: - return _react2.default.createElement( - 'p', - null, - 'Unsupported file type' - ); - } - }() - ); - } - }]); - - return AssetDisplay; -}(_react2.default.Component); - -; - -exports.default = AssetDisplay; - -/***/ }), -/* 73 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _SEO = __webpack_require__(7); - -var _SEO2 = _interopRequireDefault(_SEO); - -var _NavBar = __webpack_require__(5); - -var _NavBar2 = _interopRequireDefault(_NavBar); - -var _ErrorPage = __webpack_require__(12); - -var _ErrorPage2 = _interopRequireDefault(_ErrorPage); - -var _AssetTitle = __webpack_require__(30); - -var _AssetTitle2 = _interopRequireDefault(_AssetTitle); - -var _AssetDisplay = __webpack_require__(17); - -var _AssetDisplay2 = _interopRequireDefault(_AssetDisplay); - -var _AssetInfo = __webpack_require__(31); - -var _AssetInfo2 = _interopRequireDefault(_AssetInfo); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ShowAssetDetails = function (_React$Component) { - _inherits(ShowAssetDetails, _React$Component); - - function ShowAssetDetails() { - _classCallCheck(this, ShowAssetDetails); - - return _possibleConstructorReturn(this, (ShowAssetDetails.__proto__ || Object.getPrototypeOf(ShowAssetDetails)).apply(this, arguments)); - } - - _createClass(ShowAssetDetails, [{ - key: 'render', - value: function render() { - var asset = this.props.asset; - - if (asset) { - var name = asset.claimData.name; - - return _react2.default.createElement( - 'div', - null, - _react2.default.createElement(_SEO2.default, { pageTitle: name + ' - details', asset: asset }), - _react2.default.createElement(_NavBar2.default, null), - _react2.default.createElement( - 'div', - { className: 'row row--tall row--padded' }, - _react2.default.createElement( - 'div', - { className: 'column column--10' }, - _react2.default.createElement(_AssetTitle2.default, null) - ), - _react2.default.createElement( - 'div', - { className: 'column column--5 column--sml-10 align-content-top' }, - _react2.default.createElement( - 'div', - { className: 'row row--padded show-details-container' }, - _react2.default.createElement(_AssetDisplay2.default, null) - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--5 column--sml-10 align-content-top' }, - _react2.default.createElement( - 'div', - { className: 'row row--padded' }, - _react2.default.createElement(_AssetInfo2.default, null) - ) - ) - ) - ); - }; - return _react2.default.createElement(_ErrorPage2.default, { error: 'loading asset data...' }); - } - }]); - - return ShowAssetDetails; -}(_react2.default.Component); - -; - -exports.default = ShowAssetDetails; - -/***/ }), -/* 74 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var AssetTitle = function AssetTitle(_ref) { - var title = _ref.title; - - return _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'span', - { className: 'text--large' }, - title - ) - ); -}; - -exports.default = AssetTitle; - -/***/ }), -/* 75 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _reactRouterDom = __webpack_require__(4); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var AssetInfo = function (_React$Component) { - _inherits(AssetInfo, _React$Component); - - function AssetInfo(props) { - _classCallCheck(this, AssetInfo); - - var _this = _possibleConstructorReturn(this, (AssetInfo.__proto__ || Object.getPrototypeOf(AssetInfo)).call(this, props)); - - _this.copyToClipboard = _this.copyToClipboard.bind(_this); - return _this; - } - - _createClass(AssetInfo, [{ - key: 'copyToClipboard', - value: function copyToClipboard(event) { - var elementToCopy = event.target.dataset.elementtocopy; - var element = document.getElementById(elementToCopy); - element.select(); - try { - document.execCommand('copy'); - } catch (err) { - this.setState({ error: 'Oops, unable to copy' }); - } - } - }, { - key: 'render', - value: function render() { - var _props$asset = this.props.asset, - shortId = _props$asset.shortId, - _props$asset$claimDat = _props$asset.claimData, - channelName = _props$asset$claimDat.channelName, - certificateId = _props$asset$claimDat.certificateId, - description = _props$asset$claimDat.description, - name = _props$asset$claimDat.name, - claimId = _props$asset$claimDat.claimId, - fileExt = _props$asset$claimDat.fileExt, - contentType = _props$asset$claimDat.contentType, - thumbnail = _props$asset$claimDat.thumbnail, - host = _props$asset$claimDat.host; - - return _react2.default.createElement( - 'div', - null, - channelName && _react2.default.createElement( - 'div', - { className: 'row row--padded row--wide row--no-top' }, - _react2.default.createElement( - 'div', - { className: 'column column--2 column--med-10' }, - _react2.default.createElement( - 'span', - { className: 'text' }, - 'Channel:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--8 column--med-10' }, - _react2.default.createElement( - 'span', - { className: 'text' }, - _react2.default.createElement( - _reactRouterDom.Link, - { to: '/' + channelName + ':' + certificateId }, - channelName - ) - ) - ) - ), - description && _react2.default.createElement( - 'div', - { className: 'row row--padded row--wide row--no-top' }, - _react2.default.createElement( - 'span', - { className: 'text' }, - description - ) - ), - _react2.default.createElement( - 'div', - { id: 'show-share-buttons' }, - _react2.default.createElement( - 'div', - { className: 'row row--padded row--wide row--no-top' }, - _react2.default.createElement( - 'div', - { className: 'column column--2 column--med-10' }, - _react2.default.createElement( - 'span', - { className: 'text' }, - 'Share:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--8 column--med-10' }, - _react2.default.createElement( - 'div', - { - className: 'row row--short row--wide flex-container--row flex-container--space-between-bottom flex-container--wrap' }, - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'https://twitter.com/intent/tweet?text=' + host + '/' + shortId + '/' + name }, - 'twitter' - ), - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'https://www.facebook.com/sharer/sharer.php?u=' + host + '/' + shortId + '/' + name }, - 'facebook' - ), - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'http://tumblr.com/widgets/share/tool?canonicalUrl=' + host + '/' + shortId + '/' + name }, - 'tumblr' - ), - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'https://www.reddit.com/submit?url=' + host + '/' + shortId + '/' + name + '&title=' + name }, - 'reddit' - ) - ) - ) - ) - ), - _react2.default.createElement( - 'div', - { className: 'row row--padded row--wide row--no-top' }, - _react2.default.createElement( - 'div', - { id: 'show-short-link' }, - _react2.default.createElement( - 'div', - { className: 'column column--2 column--med-10' }, - _react2.default.createElement( - 'span', - { className: 'text' }, - 'Link:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--8 column--med-10' }, - _react2.default.createElement( - 'div', - { className: 'row row--short row--wide' }, - _react2.default.createElement( - 'div', - { className: 'column column--7' }, - _react2.default.createElement( - 'div', - { className: 'input-error', id: 'input-error-copy-short-link', hidden: 'true' }, - 'error here' - ), - _react2.default.createElement('input', { type: 'text', id: 'short-link', className: 'input-disabled input-text--full-width', readOnly: true, - spellCheck: 'false', - value: host + '/' + shortId + '/' + name + '.' + fileExt, - onClick: this.select }) - ), - _react2.default.createElement('div', { className: 'column column--1' }), - _react2.default.createElement( - 'div', - { className: 'column column--2' }, - _react2.default.createElement( - 'button', - { className: 'button--primary button--wide', 'data-elementtocopy': 'short-link', - onClick: this.copyToClipboard }, - 'copy' - ) - ) - ) - ) - ), - _react2.default.createElement( - 'div', - { id: 'show-embed-code' }, - _react2.default.createElement( - 'div', - { className: 'column column--2 column--med-10' }, - _react2.default.createElement( - 'span', - { className: 'text' }, - 'Embed:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--8 column--med-10' }, - _react2.default.createElement( - 'div', - { className: 'row row--short row--wide' }, - _react2.default.createElement( - 'div', - { className: 'column column--7' }, - _react2.default.createElement( - 'div', - { className: 'input-error', id: 'input-error-copy-embed-text', hidden: 'true' }, - 'error here' - ), - contentType === 'video/mp4' ? _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true, - onClick: this.select, spellCheck: 'false', - value: '' }) : _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true, - onClick: this.select, spellCheck: 'false', - value: '' - }) - ), - _react2.default.createElement('div', { className: 'column column--1' }), - _react2.default.createElement( - 'div', - { className: 'column column--2' }, - _react2.default.createElement( - 'button', - { className: 'button--primary button--wide', 'data-elementtocopy': 'embed-text', - onClick: this.copyToClipboard }, - 'copy' - ) - ) - ) - ) - ) - ), - _react2.default.createElement( - 'div', - { className: 'flex-container--row flex-container--space-between-bottom' }, - _react2.default.createElement( - _reactRouterDom.Link, - { className: 'link--primary', to: '/' + shortId + '/' + name + '.' + fileExt }, - _react2.default.createElement( - 'span', - { - className: 'text' }, - 'Direct Link' - ) - ), - _react2.default.createElement( - 'a', - { className: 'link--primary', href: host + '/' + claimId + '/' + name + '.' + fileExt, download: name }, - 'Download' - ), - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'https://lbry.io/dmca' }, - 'Report' - ) - ) - ); - } - }]); - - return AssetInfo; -}(_react2.default.Component); - -; - -exports.default = AssetInfo; - -/***/ }), -/* 76 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _SEO = __webpack_require__(7); - -var _SEO2 = _interopRequireDefault(_SEO); - -var _ErrorPage = __webpack_require__(12); - -var _ErrorPage2 = _interopRequireDefault(_ErrorPage); - -var _NavBar = __webpack_require__(5); - -var _NavBar2 = _interopRequireDefault(_NavBar); - -var _ChannelClaimsDisplay = __webpack_require__(33); - -var _ChannelClaimsDisplay2 = _interopRequireDefault(_ChannelClaimsDisplay); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ShowChannel = function (_React$Component) { - _inherits(ShowChannel, _React$Component); - - function ShowChannel() { - _classCallCheck(this, ShowChannel); - - return _possibleConstructorReturn(this, (ShowChannel.__proto__ || Object.getPrototypeOf(ShowChannel)).apply(this, arguments)); - } - - _createClass(ShowChannel, [{ - key: 'render', - value: function render() { - var channel = this.props.channel; - - if (channel) { - var name = channel.name, - longId = channel.longId, - shortId = channel.shortId; - - return _react2.default.createElement( - 'div', - null, - _react2.default.createElement(_SEO2.default, { pageTitle: name, channel: channel }), - _react2.default.createElement(_NavBar2.default, null), - _react2.default.createElement( - 'div', - { className: 'row row--tall row--padded' }, - _react2.default.createElement( - 'div', - { className: 'column column--10' }, - _react2.default.createElement( - 'h2', - null, - 'channel name: ', - name - ), - _react2.default.createElement( - 'p', - { className: 'fine-print' }, - 'full channel id: ', - longId - ), - _react2.default.createElement( - 'p', - { className: 'fine-print' }, - 'short channel id: ', - shortId - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--10' }, - _react2.default.createElement(_ChannelClaimsDisplay2.default, null) - ) - ) - ); - }; - return _react2.default.createElement(_ErrorPage2.default, { error: 'loading channel data...' }); - } - }]); - - return ShowChannel; -}(_react2.default.Component); - -; - -exports.default = ShowChannel; - -/***/ }), -/* 77 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _AssetPreview = __webpack_require__(34); - -var _AssetPreview2 = _interopRequireDefault(_AssetPreview); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ChannelClaimsDisplay = function (_React$Component) { - _inherits(ChannelClaimsDisplay, _React$Component); - - function ChannelClaimsDisplay(props) { - _classCallCheck(this, ChannelClaimsDisplay); - - var _this = _possibleConstructorReturn(this, (ChannelClaimsDisplay.__proto__ || Object.getPrototypeOf(ChannelClaimsDisplay)).call(this, props)); - - _this.showNextResultsPage = _this.showNextResultsPage.bind(_this); - _this.showPreviousResultsPage = _this.showPreviousResultsPage.bind(_this); - return _this; - } - - _createClass(ChannelClaimsDisplay, [{ - key: 'showPreviousResultsPage', - value: function showPreviousResultsPage() { - var currentPage = this.props.channel.claimsData.currentPage; - - var previousPage = parseInt(currentPage) - 1; - this.showNewPage(previousPage); - } - }, { - key: 'showNextResultsPage', - value: function showNextResultsPage() { - var currentPage = this.props.channel.claimsData.currentPage; - - var nextPage = parseInt(currentPage) + 1; - this.showNewPage(nextPage); - } - }, { - key: 'showNewPage', - value: function showNewPage(page) { - var _props = this.props, - channelKey = _props.channelKey, - _props$channel = _props.channel, - name = _props$channel.name, - longId = _props$channel.longId; - - this.props.onUpdateChannelClaims(channelKey, name, longId, page); - } - }, { - key: 'render', - value: function render() { - var _props$channel$claims = this.props.channel.claimsData, - claims = _props$channel$claims.claims, - currentPage = _props$channel$claims.currentPage, - totalPages = _props$channel$claims.totalPages; - - return _react2.default.createElement( - 'div', - { className: 'row row--tall' }, - claims.length > 0 ? _react2.default.createElement( - 'div', - null, - claims.map(function (claim, index) { - return _react2.default.createElement(_AssetPreview2.default, { - claimData: claim, - key: claim.name + '-' + index - }); - }), - _react2.default.createElement( - 'div', - null, - currentPage > 1 && _react2.default.createElement( - 'button', - { className: 'button--secondary', onClick: this.showPreviousResultsPage }, - 'Previous Page' - ), - currentPage < totalPages && _react2.default.createElement( - 'button', - { className: 'button--secondary', onClick: this.showNextResultsPage }, - 'Next Page' - ) - ) - ) : _react2.default.createElement( - 'p', - null, - 'There are no claims in this channel' - ) - ); - } - }]); - - return ChannelClaimsDisplay; -}(_react2.default.Component); - -; - -exports.default = ChannelClaimsDisplay; - -/***/ }), -/* 78 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _reactRouterDom = __webpack_require__(4); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var AssetPreview = function AssetPreview(_ref) { - var defaultThumbnail = _ref.defaultThumbnail, - _ref$claimData = _ref.claimData, - name = _ref$claimData.name, - claimId = _ref$claimData.claimId, - fileExt = _ref$claimData.fileExt, - contentType = _ref$claimData.contentType, - thumbnail = _ref$claimData.thumbnail; - - var directSourceLink = claimId + '/' + name + '.' + fileExt; - var showUrlLink = '/' + claimId + '/' + name; - return _react2.default.createElement( - 'div', - { className: 'asset-holder' }, - _react2.default.createElement( - _reactRouterDom.Link, - { to: showUrlLink }, - function () { - switch (contentType) { - case 'image/jpeg': - case 'image/jpg': - case 'image/png': - case 'image/gif': - return _react2.default.createElement('img', { - className: 'asset-preview', - src: directSourceLink, - alt: name - }); - case 'video/mp4': - return _react2.default.createElement('img', { - className: 'asset-preview video', - src: thumbnail || defaultThumbnail, - alt: name - }); - default: - return _react2.default.createElement( - 'p', - null, - 'unsupported file type' - ); - } - }() - ) - ); -}; - -exports.default = AssetPreview; - -/***/ }), -/* 79 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _NavBar = __webpack_require__(5); - -var _NavBar2 = _interopRequireDefault(_NavBar); - -var _reactHelmet = __webpack_require__(48); - -var _reactHelmet2 = _interopRequireDefault(_reactHelmet); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var FourOhForPage = function (_React$Component) { - _inherits(FourOhForPage, _React$Component); - - function FourOhForPage() { - _classCallCheck(this, FourOhForPage); - - return _possibleConstructorReturn(this, (FourOhForPage.__proto__ || Object.getPrototypeOf(FourOhForPage)).apply(this, arguments)); - } - - _createClass(FourOhForPage, [{ - key: 'render', - value: function render() { - var _props = this.props, - title = _props.title, - host = _props.host; - - return _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - _reactHelmet2.default, - null, - _react2.default.createElement( - 'title', - null, - title, - ' - 404' - ), - _react2.default.createElement('link', { rel: 'canonical', href: host + '/404' }) - ), - _react2.default.createElement(_NavBar2.default, null), - _react2.default.createElement( - 'div', - { className: 'row row--padded' }, - _react2.default.createElement( - 'h2', - null, - '404' - ), - _react2.default.createElement( - 'p', - null, - 'That page does not exist' - ) - ) - ); - } - }]); - - return FourOhForPage; -}(_react2.default.Component); - -; - -exports.default = FourOhForPage; - -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _require = __webpack_require__(98), - lstatSync = _require.lstatSync, - readdirSync = _require.readdirSync; - -var _require2 = __webpack_require__(51), - join = _require2.join; - -var getSubDirectoryNames = exports.getSubDirectoryNames = function getSubDirectoryNames(root) { - return readdirSync(root).filter(function (name) { - var fullPath = join(root, name); - return lstatSync(fullPath).isDirectory(); - }); -}; - -/***/ }), -/* 81 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _ChannelLoginForm = __webpack_require__(15); - -var _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm); - -var _ChannelCreateForm = __webpack_require__(16); - -var _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm); - -var _publish_channel_select_states = __webpack_require__(105); - -var states = _interopRequireWildcard(_publish_channel_select_states); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ChannelSelect = function (_React$Component) { - _inherits(ChannelSelect, _React$Component); - - function ChannelSelect(props) { - _classCallCheck(this, ChannelSelect); - - var _this = _possibleConstructorReturn(this, (ChannelSelect.__proto__ || Object.getPrototypeOf(ChannelSelect)).call(this, props)); - - _this.toggleAnonymousPublish = _this.toggleAnonymousPublish.bind(_this); - _this.handleSelection = _this.handleSelection.bind(_this); - return _this; - } - - _createClass(ChannelSelect, [{ - key: 'toggleAnonymousPublish', - value: function toggleAnonymousPublish(event) { - var value = event.target.value; - if (value === 'anonymous') { - this.props.onPublishInChannelChange(false); - } else { - this.props.onPublishInChannelChange(true); - } - } - }, { - key: 'handleSelection', - value: function handleSelection(event) { - var selectedOption = event.target.selectedOptions[0].value; - this.props.onChannelSelect(selectedOption); - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'form', - null, - _react2.default.createElement( - 'div', - { className: 'column column--3 column--med-10' }, - _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'anonymous-radio', className: 'input-radio', value: 'anonymous', checked: !this.props.publishInChannel, onChange: this.toggleAnonymousPublish }), - _react2.default.createElement( - 'label', - { className: 'label label--pointer', htmlFor: 'anonymous-radio' }, - 'Anonymous' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--7 column--med-10' }, - _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'channel-radio', className: 'input-radio', value: 'in a channel', checked: this.props.publishInChannel, onChange: this.toggleAnonymousPublish }), - _react2.default.createElement( - 'label', - { className: 'label label--pointer', htmlFor: 'channel-radio' }, - 'In a channel' - ) - ), - this.props.channelError ? _react2.default.createElement( - 'p', - { className: 'info-message--failure' }, - this.props.channelError - ) : _react2.default.createElement( - 'p', - { className: 'info-message' }, - 'Publish anonymously or in a channel' - ) - ), - this.props.publishInChannel && _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'div', - { className: 'column column--3' }, - _react2.default.createElement( - 'label', - { className: 'label', htmlFor: 'channel-name-select' }, - 'Channel:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--7' }, - _react2.default.createElement( - 'select', - { type: 'text', id: 'channel-name-select', className: 'select select--arrow', value: this.props.selectedChannel, onChange: this.handleSelection }, - this.props.loggedInChannelName && _react2.default.createElement( - 'option', - { value: this.props.loggedInChannelName, id: 'publish-channel-select-channel-option' }, - this.props.loggedInChannelName - ), - _react2.default.createElement( - 'option', - { value: states.LOGIN }, - 'Existing' - ), - _react2.default.createElement( - 'option', - { value: states.CREATE }, - 'New' - ) - ) - ), - this.props.selectedChannel === states.LOGIN && _react2.default.createElement(_ChannelLoginForm2.default, null), - this.props.selectedChannel === states.CREATE && _react2.default.createElement(_ChannelCreateForm2.default, null) - ) - ); - } - }]); - - return ChannelSelect; -}(_react2.default.Component); - -exports.default = ChannelSelect; - -/***/ }), -/* 82 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _file = __webpack_require__(60); - -var _PublishPreview = __webpack_require__(37); - -var _PublishPreview2 = _interopRequireDefault(_PublishPreview); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Dropzone = function (_React$Component) { - _inherits(Dropzone, _React$Component); - - function Dropzone(props) { - _classCallCheck(this, Dropzone); - - var _this = _possibleConstructorReturn(this, (Dropzone.__proto__ || Object.getPrototypeOf(Dropzone)).call(this, props)); - - _this.state = { - dragOver: false, - mouseOver: false, - dimPreview: false - }; - _this.handleDrop = _this.handleDrop.bind(_this); - _this.handleDragOver = _this.handleDragOver.bind(_this); - _this.handleDragEnd = _this.handleDragEnd.bind(_this); - _this.handleDragEnter = _this.handleDragEnter.bind(_this); - _this.handleDragLeave = _this.handleDragLeave.bind(_this); - _this.handleMouseEnter = _this.handleMouseEnter.bind(_this); - _this.handleMouseLeave = _this.handleMouseLeave.bind(_this); - _this.handleClick = _this.handleClick.bind(_this); - _this.handleFileInput = _this.handleFileInput.bind(_this); - _this.chooseFile = _this.chooseFile.bind(_this); - return _this; - } - - _createClass(Dropzone, [{ - key: 'handleDrop', - value: function handleDrop(event) { - event.preventDefault(); - this.setState({ dragOver: false }); - // if dropped items aren't files, reject them - var dt = event.dataTransfer; - if (dt.items) { - if (dt.items[0].kind === 'file') { - var droppedFile = dt.items[0].getAsFile(); - this.chooseFile(droppedFile); - } - } - } - }, { - key: 'handleDragOver', - value: function handleDragOver(event) { - event.preventDefault(); - } - }, { - key: 'handleDragEnd', - value: function handleDragEnd(event) { - var dt = event.dataTransfer; - if (dt.items) { - for (var i = 0; i < dt.items.length; i++) { - dt.items.remove(i); - } - } else { - event.dataTransfer.clearData(); - } - } - }, { - key: 'handleDragEnter', - value: function handleDragEnter() { - this.setState({ dragOver: true, dimPreview: true }); - } - }, { - key: 'handleDragLeave', - value: function handleDragLeave() { - this.setState({ dragOver: false, dimPreview: false }); - } - }, { - key: 'handleMouseEnter', - value: function handleMouseEnter() { - this.setState({ mouseOver: true, dimPreview: true }); - } - }, { - key: 'handleMouseLeave', - value: function handleMouseLeave() { - this.setState({ mouseOver: false, dimPreview: false }); - } - }, { - key: 'handleClick', - value: function handleClick(event) { - event.preventDefault(); - document.getElementById('file_input').click(); - } - }, { - key: 'handleFileInput', - value: function handleFileInput(event) { - event.preventDefault(); - var fileList = event.target.files; - this.chooseFile(fileList[0]); - } - }, { - key: 'chooseFile', - value: function chooseFile(file) { - if (file) { - try { - (0, _file.validateFile)(file); // validate the file's name, type, and size - } catch (error) { - return this.props.setFileError(error.message); - } - // stage it so it will be ready when the publish button is clicked - this.props.selectFile(file); - } - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement( - 'div', - { className: 'row row--tall flex-container--column' }, - _react2.default.createElement( - 'form', - null, - _react2.default.createElement('input', { className: 'input-file', type: 'file', id: 'file_input', name: 'file_input', accept: 'video/*,image/*', onChange: this.handleFileInput, encType: 'multipart/form-data' }) - ), - _react2.default.createElement( - 'div', - { id: 'preview-dropzone', className: 'row row--padded row--tall dropzone' + (this.state.dragOver ? ' dropzone--drag-over' : ''), onDrop: this.handleDrop, onDragOver: this.handleDragOver, onDragEnd: this.handleDragEnd, onDragEnter: this.handleDragEnter, onDragLeave: this.handleDragLeave, onMouseEnter: this.handleMouseEnter, onMouseLeave: this.handleMouseLeave, onClick: this.handleClick }, - this.props.file ? _react2.default.createElement( - 'div', - null, - _react2.default.createElement(_PublishPreview2.default, { - dimPreview: this.state.dimPreview, - file: this.props.file, - thumbnail: this.props.thumbnail - }), - _react2.default.createElement( - 'div', - { id: 'dropzone-text-holder', className: 'flex-container--column flex-container--center-center' }, - this.state.dragOver ? _react2.default.createElement( - 'div', - { id: 'dropzone-dragover' }, - _react2.default.createElement( - 'p', - { className: 'blue' }, - 'Drop it.' - ) - ) : null, - this.state.mouseOver ? _react2.default.createElement( - 'div', - { id: 'dropzone-instructions' }, - _react2.default.createElement( - 'p', - { className: 'info-message-placeholder info-message--failure', id: 'input-error-file-selection' }, - this.props.fileError - ), - _react2.default.createElement( - 'p', - null, - 'Drag & drop image or video here to publish' - ), - _react2.default.createElement( - 'p', - { className: 'fine-print' }, - 'OR' - ), - _react2.default.createElement( - 'p', - { className: 'blue--underlined' }, - 'CHOOSE FILE' - ) - ) : null - ) - ) : _react2.default.createElement( - 'div', - { id: 'dropzone-text-holder', className: 'flex-container--column flex-container--center-center' }, - this.state.dragOver ? _react2.default.createElement( - 'div', - { id: 'dropzone-dragover' }, - _react2.default.createElement( - 'p', - { className: 'blue' }, - 'Drop it.' - ) - ) : _react2.default.createElement( - 'div', - { id: 'dropzone-instructions' }, - _react2.default.createElement( - 'p', - { className: 'info-message-placeholder info-message--failure', id: 'input-error-file-selection' }, - this.props.fileError - ), - _react2.default.createElement( - 'p', - null, - 'Drag & drop image or video here to publish' - ), - _react2.default.createElement( - 'p', - { className: 'fine-print' }, - 'OR' - ), - _react2.default.createElement( - 'p', - { className: 'blue--underlined' }, - 'CHOOSE FILE' - ) - ) - ) - ) - ); - } - }]); - - return Dropzone; -}(_react2.default.Component); - -; - -exports.default = Dropzone; - -/***/ }), -/* 83 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _reactRouterDom = __webpack_require__(4); - -var _Dropzone = __webpack_require__(18); - -var _Dropzone2 = _interopRequireDefault(_Dropzone); - -var _PublishTitleInput = __webpack_require__(41); - -var _PublishTitleInput2 = _interopRequireDefault(_PublishTitleInput); - -var _PublishUrlInput = __webpack_require__(42); - -var _PublishUrlInput2 = _interopRequireDefault(_PublishUrlInput); - -var _PublishThumbnailInput = __webpack_require__(43); - -var _PublishThumbnailInput2 = _interopRequireDefault(_PublishThumbnailInput); - -var _PublishMetadataInputs = __webpack_require__(44); - -var _PublishMetadataInputs2 = _interopRequireDefault(_PublishMetadataInputs); - -var _ChannelSelect = __webpack_require__(39); - -var _ChannelSelect2 = _interopRequireDefault(_ChannelSelect); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PublishDetails = function (_React$Component) { - _inherits(PublishDetails, _React$Component); - - function PublishDetails(props) { - _classCallCheck(this, PublishDetails); - - var _this = _possibleConstructorReturn(this, (PublishDetails.__proto__ || Object.getPrototypeOf(PublishDetails)).call(this, props)); - - _this.onPublishSubmit = _this.onPublishSubmit.bind(_this); - return _this; - } - - _createClass(PublishDetails, [{ - key: 'onPublishSubmit', - value: function onPublishSubmit() { - this.props.startPublish(this.props.history); - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement( - 'div', - { className: 'row row--no-bottom' }, - _react2.default.createElement( - 'div', - { className: 'column column--10' }, - _react2.default.createElement(_PublishTitleInput2.default, null) - ), - _react2.default.createElement( - 'div', - { className: 'column column--5 column--sml-10' }, - _react2.default.createElement( - 'div', - { className: 'row row--padded' }, - _react2.default.createElement(_Dropzone2.default, null) - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--5 column--sml-10 align-content-top' }, - _react2.default.createElement( - 'div', - { id: 'publish-active-area', className: 'row row--padded' }, - _react2.default.createElement( - 'div', - { className: 'row row--padded row--no-top row--wide' }, - _react2.default.createElement(_PublishUrlInput2.default, null) - ), - _react2.default.createElement( - 'div', - { className: 'row row--padded row--no-top row--wide' }, - _react2.default.createElement(_ChannelSelect2.default, null) - ), - this.props.file.type === 'video/mp4' && _react2.default.createElement( - 'div', - { className: 'row row--padded row--no-top row--wide ' }, - _react2.default.createElement(_PublishThumbnailInput2.default, null) - ), - _react2.default.createElement( - 'div', - { className: 'row row--padded row--no-top row--no-bottom row--wide' }, - _react2.default.createElement(_PublishMetadataInputs2.default, null) - ), - _react2.default.createElement( - 'div', - { className: 'row row--wide align-content-center' }, - _react2.default.createElement( - 'button', - { id: 'publish-submit', className: 'button--primary button--large', onClick: this.onPublishSubmit }, - 'Publish' - ) - ), - _react2.default.createElement( - 'div', - { className: 'row row--padded row--no-bottom align-content-center' }, - _react2.default.createElement( - 'button', - { className: 'button--cancel', onClick: this.props.clearFile }, - 'Cancel' - ) - ), - _react2.default.createElement( - 'div', - { className: 'row row--short align-content-center' }, - _react2.default.createElement( - 'p', - { className: 'fine-print' }, - 'By clicking \'Publish\', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. ', - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: 'https://lbry.io/learn' }, - 'Read more.' - ) - ) - ) - ) - ) - ); - } - }]); - - return PublishDetails; -}(_react2.default.Component); - -; - -exports.default = (0, _reactRouterDom.withRouter)(PublishDetails); - -/***/ }), -/* 84 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PublishTitleInput = function (_React$Component) { - _inherits(PublishTitleInput, _React$Component); - - function PublishTitleInput(props) { - _classCallCheck(this, PublishTitleInput); - - var _this = _possibleConstructorReturn(this, (PublishTitleInput.__proto__ || Object.getPrototypeOf(PublishTitleInput)).call(this, props)); - - _this.handleInput = _this.handleInput.bind(_this); - return _this; - } - - _createClass(PublishTitleInput, [{ - key: 'handleInput', - value: function handleInput(e) { - var name = e.target.name; - var value = e.target.value; - this.props.onMetadataChange(name, value); - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement('input', { type: 'text', id: 'publish-title', className: 'input-text text--large input-text--full-width', name: 'title', placeholder: 'Give your post a title...', onChange: this.handleInput, value: this.props.title }); - } - }]); - - return PublishTitleInput; -}(_react2.default.Component); - -exports.default = PublishTitleInput; - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _request = __webpack_require__(8); - -var _request2 = _interopRequireDefault(_request); - -var _PublishUrlMiddleDisplay = __webpack_require__(38); - -var _PublishUrlMiddleDisplay2 = _interopRequireDefault(_PublishUrlMiddleDisplay); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PublishUrlInput = function (_React$Component) { - _inherits(PublishUrlInput, _React$Component); - - function PublishUrlInput(props) { - _classCallCheck(this, PublishUrlInput); - - var _this = _possibleConstructorReturn(this, (PublishUrlInput.__proto__ || Object.getPrototypeOf(PublishUrlInput)).call(this, props)); - - _this.handleInput = _this.handleInput.bind(_this); - return _this; - } - - _createClass(PublishUrlInput, [{ - key: 'componentDidMount', - value: function componentDidMount() { - var _props = this.props, - claim = _props.claim, - fileName = _props.fileName; - - if (!claim) { - this.setClaimName(fileName); - } - } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(_ref) { - var claim = _ref.claim, - fileName = _ref.fileName; - - // if a new file was chosen, update the claim name - if (fileName !== this.props.fileName) { - return this.setClaimName(fileName); - } - // if the claim has updated, check its availability - if (claim !== this.props.claim) { - this.validateClaim(claim); - } - } - }, { - key: 'handleInput', - value: function handleInput(event) { - var value = event.target.value; - value = this.cleanseInput(value); - // update the state - this.props.onClaimChange(value); - } - }, { - key: 'cleanseInput', - value: function cleanseInput(input) { - input = input.replace(/\s+/g, '-'); // replace spaces with dashes - input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-' - return input; - } - }, { - key: 'setClaimName', - value: function setClaimName(fileName) { - var fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.')); - var cleanClaimName = this.cleanseInput(fileNameWithoutEnding); - this.props.onClaimChange(cleanClaimName); - } - }, { - key: 'validateClaim', - value: function validateClaim(claim) { - var _this2 = this; - - if (!claim) { - return this.props.onUrlError('Enter a url above'); - } - (0, _request2.default)('/api/claim/availability/' + claim).then(function () { - _this2.props.onUrlError(null); - }).catch(function (error) { - _this2.props.onUrlError(error.message); - }); - } - }, { - key: 'render', - value: function render() { - var _props2 = this.props, - claim = _props2.claim, - loggedInChannelName = _props2.loggedInChannelName, - loggedInChannelShortId = _props2.loggedInChannelShortId, - publishInChannel = _props2.publishInChannel, - selectedChannel = _props2.selectedChannel, - urlError = _props2.urlError; - - return _react2.default.createElement( - 'div', - { className: 'column column--10 column--sml-10' }, - _react2.default.createElement( - 'div', - { className: 'input-text--primary span--relative' }, - _react2.default.createElement( - 'span', - { className: 'url-text--secondary' }, - 'spee.ch / ' - ), - _react2.default.createElement(_PublishUrlMiddleDisplay2.default, { - publishInChannel: publishInChannel, - selectedChannel: selectedChannel, - loggedInChannelName: loggedInChannelName, - loggedInChannelShortId: loggedInChannelShortId - }), - _react2.default.createElement('input', { type: 'text', id: 'claim-name-input', className: 'input-text', name: 'claim', placeholder: 'your-url-here', onChange: this.handleInput, value: claim }), - claim && !urlError && _react2.default.createElement( - 'span', - { id: 'input-success-claim-name', className: 'info-message--success span--absolute' }, - '\u2713' - ), - urlError && _react2.default.createElement( - 'span', - { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' }, - '\u2716' - ) - ), - _react2.default.createElement( - 'div', - null, - urlError ? _react2.default.createElement( - 'p', - { id: 'input-error-claim-name', className: 'info-message--failure' }, - urlError - ) : _react2.default.createElement( - 'p', - { className: 'info-message' }, - 'Choose a custom url' - ) - ) - ); - } - }]); - - return PublishUrlInput; -}(_react2.default.Component); - -exports.default = PublishUrlInput; - -/***/ }), -/* 86 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -function dataURItoBlob(dataURI) { - // convert base64/URLEncoded data component to raw binary data held in a string - var byteString = atob(dataURI.split(',')[1]); - // separate out the mime component - var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; - // write the bytes of the string to a typed array - var ia = new Uint8Array(byteString.length); - for (var i = 0; i < byteString.length; i++) { - ia[i] = byteString.charCodeAt(i); - } - return new Blob([ia], { type: mimeString }); -} - -var PublishThumbnailInput = function (_React$Component) { - _inherits(PublishThumbnailInput, _React$Component); - - function PublishThumbnailInput(props) { - _classCallCheck(this, PublishThumbnailInput); - - var _this = _possibleConstructorReturn(this, (PublishThumbnailInput.__proto__ || Object.getPrototypeOf(PublishThumbnailInput)).call(this, props)); - - _this.state = { - videoSource: null, - error: null, - sliderMinRange: 1, - sliderMaxRange: null, - sliderValue: null - }; - _this.handleVideoLoadedData = _this.handleVideoLoadedData.bind(_this); - _this.handleSliderChange = _this.handleSliderChange.bind(_this); - _this.createThumbnail = _this.createThumbnail.bind(_this); - return _this; - } - - _createClass(PublishThumbnailInput, [{ - key: 'componentDidMount', - value: function componentDidMount() { - var file = this.props.file; - - this.setVideoSource(file); - } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(nextProps) { - // if file changes - if (nextProps.file && nextProps.file !== this.props.file) { - var file = nextProps.file; - - this.setVideoSource(file); - }; - } - }, { - key: 'setVideoSource', - value: function setVideoSource(file) { - var _this2 = this; - - var previewReader = new FileReader(); - previewReader.readAsDataURL(file); - previewReader.onloadend = function () { - var dataUri = previewReader.result; - var blob = dataURItoBlob(dataUri); - var videoSource = URL.createObjectURL(blob); - _this2.setState({ videoSource: videoSource }); - }; - } - }, { - key: 'handleVideoLoadedData', - value: function handleVideoLoadedData(event) { - var duration = event.target.duration; - var totalMinutes = Math.floor(duration / 60); - var totalSeconds = Math.floor(duration % 60); - // set the slider - this.setState({ - sliderMaxRange: duration * 100, - sliderValue: duration * 100 / 2, - totalMinutes: totalMinutes, - totalSeconds: totalSeconds - }); - // update the current time of the video - var video = document.getElementById('video-thumb-player'); - video.currentTime = duration / 2; - } - }, { - key: 'handleSliderChange', - value: function handleSliderChange(event) { - var value = parseInt(event.target.value); - // update the slider value - this.setState({ - sliderValue: value - }); - // update the current time of the video - var video = document.getElementById('video-thumb-player'); - video.currentTime = value / 100; - } - }, { - key: 'createThumbnail', - value: function createThumbnail() { - // take a snapshot - var video = document.getElementById('video-thumb-player'); - var canvas = document.createElement('canvas'); - canvas.width = video.videoWidth; - canvas.height = video.videoHeight; - canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height); - var dataUrl = canvas.toDataURL(); - var blob = dataURItoBlob(dataUrl); - var snapshot = new File([blob], 'thumbnail.png', { - type: 'image/png' - }); - // set the thumbnail in redux store - if (snapshot) { - this.props.onNewThumbnail(snapshot); - } - } - }, { - key: 'render', - value: function render() { - var _state = this.state, - error = _state.error, - videoSource = _state.videoSource, - sliderMinRange = _state.sliderMinRange, - sliderMaxRange = _state.sliderMaxRange, - sliderValue = _state.sliderValue, - totalMinutes = _state.totalMinutes, - totalSeconds = _state.totalSeconds; - - return _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'label', - { className: 'label' }, - 'Thumbnail:' - ), - _react2.default.createElement('video', { - id: 'video-thumb-player', - preload: 'metadata', - muted: true, - style: { display: 'none' }, - playsInline: true, - onLoadedData: this.handleVideoLoadedData, - src: videoSource, - onSeeked: this.createThumbnail - }), - sliderValue ? _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'div', - { className: 'flex-container--row flex-container--space-between-center', style: { width: '100%' } }, - _react2.default.createElement( - 'span', - { className: 'info-message' }, - '0\'00"' - ), - _react2.default.createElement( - 'span', - { className: 'info-message' }, - totalMinutes, - '\'', - totalSeconds, - '"' - ) - ), - _react2.default.createElement( - 'div', - null, - _react2.default.createElement('input', { - type: 'range', - min: sliderMinRange, - max: sliderMaxRange, - value: sliderValue, - className: 'slider', - onChange: this.handleSliderChange - }) - ) - ) : _react2.default.createElement( - 'p', - { className: 'info-message' }, - 'loading... ' - ), - error ? _react2.default.createElement( - 'p', - { className: 'info-message--failure' }, - error - ) : _react2.default.createElement( - 'p', - { className: 'info-message' }, - 'Use slider to set thumbnail' - ) - ); - } - }]); - - return PublishThumbnailInput; -}(_react2.default.Component); - -exports.default = PublishThumbnailInput; - -/***/ }), -/* 87 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _ExpandingTextArea = __webpack_require__(36); - -var _ExpandingTextArea2 = _interopRequireDefault(_ExpandingTextArea); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PublishMetadataInputs = function (_React$Component) { - _inherits(PublishMetadataInputs, _React$Component); - - function PublishMetadataInputs(props) { - _classCallCheck(this, PublishMetadataInputs); - - var _this = _possibleConstructorReturn(this, (PublishMetadataInputs.__proto__ || Object.getPrototypeOf(PublishMetadataInputs)).call(this, props)); - - _this.toggleShowInputs = _this.toggleShowInputs.bind(_this); - _this.handleInput = _this.handleInput.bind(_this); - _this.handleSelect = _this.handleSelect.bind(_this); - return _this; - } - - _createClass(PublishMetadataInputs, [{ - key: 'toggleShowInputs', - value: function toggleShowInputs() { - this.props.onToggleMetadataInputs(!this.props.showMetadataInputs); - } - }, { - key: 'handleInput', - value: function handleInput(event) { - var target = event.target; - var value = target.type === 'checkbox' ? target.checked : target.value; - var name = target.name; - this.props.onMetadataChange(name, value); - } - }, { - key: 'handleSelect', - value: function handleSelect(event) { - var name = event.target.name; - var selectedOption = event.target.selectedOptions[0].value; - this.props.onMetadataChange(name, selectedOption); - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement( - 'div', - { id: 'publish-details', className: 'row row--padded row--no-top row--wide' }, - this.props.showMetadataInputs && _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'div', - { className: 'row row--no-top' }, - _react2.default.createElement( - 'div', - { className: 'column column--3 column--med-10 align-content-top' }, - _react2.default.createElement( - 'label', - { htmlFor: 'publish-license', className: 'label' }, - 'Description:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--7 column--sml-10' }, - _react2.default.createElement(_ExpandingTextArea2.default, { - id: 'publish-description', - className: 'textarea textarea--primary textarea--full-width', - rows: 1, - maxLength: 2000, - style: { maxHeight: 200 }, - name: 'description', - placeholder: 'Optional description', - value: this.props.description, - onChange: this.handleInput }) - ) - ), - _react2.default.createElement( - 'div', - { className: 'row row--no-top' }, - _react2.default.createElement( - 'div', - { className: 'column column--3 column--med-10' }, - _react2.default.createElement( - 'label', - { htmlFor: 'publish-license', className: 'label' }, - 'License:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--7 column--sml-10' }, - _react2.default.createElement( - 'select', - { type: 'text', name: 'license', id: 'publish-license', className: 'select select--primary', onChange: this.handleSelect }, - _react2.default.createElement( - 'option', - { value: ' ' }, - 'Unspecified' - ), - _react2.default.createElement( - 'option', - { value: 'Public Domain' }, - 'Public Domain' - ), - _react2.default.createElement( - 'option', - { value: 'Creative Commons' }, - 'Creative Commons' - ) - ) - ) - ), - _react2.default.createElement( - 'div', - { className: 'row row--no-top' }, - _react2.default.createElement( - 'div', - { className: 'column column--3' }, - _react2.default.createElement( - 'label', - { htmlFor: 'publish-nsfw', className: 'label' }, - 'Mature:' - ) - ), - _react2.default.createElement( - 'div', - { className: 'column column--7' }, - _react2.default.createElement('input', { className: 'input-checkbox', type: 'checkbox', id: 'publish-nsfw', name: 'nsfw', value: this.props.nsfw, onChange: this.handleInput }) - ) - ) - ), - _react2.default.createElement( - 'button', - { className: 'button--secondary', onClick: this.toggleShowInputs }, - this.props.showMetadataInputs ? 'less' : 'more' - ) - ); - } - }]); - - return PublishMetadataInputs; -}(_react2.default.Component); - -exports.default = PublishMetadataInputs; - -/***/ }), -/* 88 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PublishDisabledMessage = function (_React$Component) { - _inherits(PublishDisabledMessage, _React$Component); - - function PublishDisabledMessage() { - _classCallCheck(this, PublishDisabledMessage); - - return _possibleConstructorReturn(this, (PublishDisabledMessage.__proto__ || Object.getPrototypeOf(PublishDisabledMessage)).apply(this, arguments)); - } - - _createClass(PublishDisabledMessage, [{ - key: 'render', - value: function render() { - var message = this.props.message; - console.log('this.props.message:', message); - return _react2.default.createElement( - 'div', - { className: 'row dropzone--disabled row--tall flex-container--column flex-container--center-center' }, - _react2.default.createElement( - 'p', - { className: 'text--disabled' }, - 'Publishing is currently disabled.' - ), - _react2.default.createElement( - 'p', - { className: 'text--disabled' }, - message - ) - ); - } - }]); - - return PublishDisabledMessage; -}(_react2.default.Component); - -exports.default = PublishDisabledMessage; - -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _ProgressBar = __webpack_require__(10); - -var _ProgressBar2 = _interopRequireDefault(_ProgressBar); - -var _publish_claim_states = __webpack_require__(170); - -var publishStates = _interopRequireWildcard(_publish_claim_states); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PublishStatus = function (_React$Component) { - _inherits(PublishStatus, _React$Component); - - function PublishStatus() { - _classCallCheck(this, PublishStatus); - - return _possibleConstructorReturn(this, (PublishStatus.__proto__ || Object.getPrototypeOf(PublishStatus)).apply(this, arguments)); - } - - _createClass(PublishStatus, [{ - key: 'render', - value: function render() { - var _props = this.props, - status = _props.status, - message = _props.message, - clearFile = _props.clearFile; - - return _react2.default.createElement( - 'div', - { className: 'row row--tall flex-container--column flex-container--center-center' }, - status === publishStates.LOAD_START && _react2.default.createElement( - 'div', - { className: 'row align-content-center' }, - _react2.default.createElement( - 'p', - null, - 'File is loading to server' - ), - _react2.default.createElement( - 'p', - { className: 'blue' }, - '0%' - ) - ), - status === publishStates.LOADING && _react2.default.createElement( - 'div', - null, - _react2.default.createElement( - 'div', - { className: 'row align-content-center' }, - _react2.default.createElement( - 'p', - null, - 'File is loading to server' - ), - _react2.default.createElement( - 'p', - { className: 'blue' }, - message - ) - ) - ), - status === publishStates.PUBLISHING && _react2.default.createElement( - 'div', - { className: 'row align-content-center' }, - _react2.default.createElement( - 'p', - null, - 'Upload complete. Your file is now being published on the blockchain...' - ), - _react2.default.createElement(_ProgressBar2.default, { size: 12 }), - _react2.default.createElement( - 'p', - null, - 'Curious what magic is happening here? ', - _react2.default.createElement( - 'a', - { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' }, - 'Learn more.' - ) - ) - ), - status === publishStates.SUCCESS && _react2.default.createElement( - 'div', - { className: 'row align-content-center' }, - _react2.default.createElement( - 'p', - null, - 'Your publish is complete! You are being redirected to it now.' - ), - _react2.default.createElement( - 'p', - null, - 'If you are not automatically redirected, ', - _react2.default.createElement( - 'a', - { className: 'link--primary', target: '_blank', href: message }, - 'click here.' - ) - ) - ), - status === publishStates.FAILED && _react2.default.createElement( - 'div', - { className: 'row align-content-center' }, - _react2.default.createElement( - 'p', - null, - 'Something went wrong...' - ), - _react2.default.createElement( - 'p', - null, - _react2.default.createElement( - 'strong', - null, - message - ) - ), - _react2.default.createElement( - 'p', - null, - 'For help, post the above error text in the #speech channel on the ', - _react2.default.createElement( - 'a', - { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' }, - 'lbry discord' - ) - ), - _react2.default.createElement( - 'button', - { className: 'button--secondary', onClick: clearFile }, - 'Reset' - ) - ) - ); - } - }]); - - return PublishStatus; -}(_react2.default.Component); - -; - -exports.default = PublishStatus; - -/***/ }), -/* 90 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _Dropzone = __webpack_require__(18); - -var _Dropzone2 = _interopRequireDefault(_Dropzone); - -var _PublishDetails = __webpack_require__(40); - -var _PublishDetails2 = _interopRequireDefault(_PublishDetails); - -var _PublishStatus = __webpack_require__(46); - -var _PublishStatus2 = _interopRequireDefault(_PublishStatus); - -var _PublishDisabledMessage = __webpack_require__(45); - -var _PublishDisabledMessage2 = _interopRequireDefault(_PublishDisabledMessage); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PublishTool = function (_React$Component) { - _inherits(PublishTool, _React$Component); - - function PublishTool() { - _classCallCheck(this, PublishTool); - - return _possibleConstructorReturn(this, (PublishTool.__proto__ || Object.getPrototypeOf(PublishTool)).apply(this, arguments)); - } - - _createClass(PublishTool, [{ - key: 'render', - value: function render() { - if (this.props.disabled) { - console.log('publish is disabled'); - return _react2.default.createElement(_PublishDisabledMessage2.default, null); - } else { - console.log('publish is not disabled'); - if (this.props.file) { - if (this.props.status) { - return _react2.default.createElement(_PublishStatus2.default, null); - } else { - return _react2.default.createElement(_PublishDetails2.default, null); - } - } - return _react2.default.createElement(_Dropzone2.default, null); - } - } - }]); - - return PublishTool; -}(_react2.default.Component); - -; - -exports.default = PublishTool; - -/***/ }), -/* 91 */ -/***/ (function(module, exports) { - -module.exports = require("passport"); - -/***/ }), -/* 92 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function MysqlConfig() { - var _this = this; - - this.database = 'default'; - this.username = 'default'; - this.password = 'default'; - this.configure = function (config) { - if (!config) { - return console.log('No MySQL config received.'); - } - var database = config.database, - username = config.username, - password = config.password; - - _this.database = database; - _this.username = username; - _this.password = password; - }; -}; - -module.exports = new MysqlConfig(); - -/***/ }), -/* 93 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function SlackConfig() { - var _this = this; - - this.slackWebHook = 'default'; - this.slackErrorChannel = 'default'; - this.slackInfoChannel = 'default'; - this.configure = function (config) { - if (!config) { - return console.log('No slack config received.'); - } - var slackWebHook = config.slackWebHook, - slackErrorChannel = config.slackErrorChannel, - slackInfoChannel = config.slackInfoChannel; - - _this.slackWebHook = slackWebHook; - _this.slackErrorChannel = slackErrorChannel; - _this.slackInfoChannel = slackInfoChannel; - }; -}; - -module.exports = new SlackConfig(); - -/***/ }), -/* 94 */ -/***/ (function(module, exports) { - -module.exports = require("passport-local"); - -/***/ }), -/* 95 */ -/***/ (function(module, exports) { - -module.exports = require("sequelize"); - -/***/ }), -/* 96 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = { - returnShortId: function returnShortId(claimsArray, longId) { - var claimIndex = void 0; - var shortId = longId.substring(0, 1); // default short id is the first letter - var shortIdLength = 0; - // find the index of this claim id - claimIndex = claimsArray.findIndex(function (element) { - return element.claimId === longId; - }); - if (claimIndex < 0) { - throw new Error('claim id not found in claims list'); - } - // get an array of all claims with lower height - var possibleMatches = claimsArray.slice(0, claimIndex); - // remove certificates with the same prefixes until none are left. - while (possibleMatches.length > 0) { - shortIdLength += 1; - shortId = longId.substring(0, shortIdLength); - possibleMatches = possibleMatches.filter(function (element) { - return element.claimId && element.claimId.substring(0, shortIdLength) === shortId; - }); - } - return shortId; - } -}; - -/***/ }), -/* 97 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var logger = __webpack_require__(2); -var fs = __webpack_require__(98); - -var _require = __webpack_require__(3), - details = _require.details, - publishing = _require.publishing; - -module.exports = { - parsePublishApiRequestBody: function parsePublishApiRequestBody(_ref) { - var name = _ref.name, - nsfw = _ref.nsfw, - license = _ref.license, - title = _ref.title, - description = _ref.description, - thumbnail = _ref.thumbnail; - - // validate name - if (!name) { - throw new Error('no name field found in request'); - } - var invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name); - if (invalidNameCharacters) { - throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and "-"'); - } - // optional parameters - nsfw = nsfw === 'true'; - license = license || null; - title = title || null; - description = description || null; - thumbnail = thumbnail || null; - // return results - return { - name: name, - nsfw: nsfw, - license: license, - title: title, - description: description, - thumbnail: thumbnail - }; - }, - parsePublishApiRequestFiles: function parsePublishApiRequestFiles(_ref2) { - var file = _ref2.file, - thumbnail = _ref2.thumbnail; - - // make sure a file was provided - if (!file) { - throw new Error('no file with key of [file] found in request'); - } - if (!file.path) { - throw new Error('no file path found'); - } - if (!file.type) { - throw new Error('no file type found'); - } - if (!file.size) { - throw new Error('no file type found'); - } - // validate the file name - if (/'/.test(file.name)) { - throw new Error('apostrophes are not allowed in the file name'); - } - // validate the file - module.exports.validateFileTypeAndSize(file); - // return results - return { - fileName: file.name, - filePath: file.path, - fileType: file.type, - thumbnailFileName: thumbnail ? thumbnail.name : null, - thumbnailFilePath: thumbnail ? thumbnail.path : null, - thumbnailFileType: thumbnail ? thumbnail.type : null - }; - }, - validateFileTypeAndSize: function validateFileTypeAndSize(file) { - // check file type and size - switch (file.type) { - case 'image/jpeg': - case 'image/jpg': - case 'image/png': - if (file.size > 10000000) { - logger.debug('publish > file validation > .jpeg/.jpg/.png was too big'); - throw new Error('Sorry, images are limited to 10 megabytes.'); - } - break; - case 'image/gif': - if (file.size > 50000000) { - logger.debug('publish > file validation > .gif was too big'); - throw new Error('Sorry, .gifs are limited to 50 megabytes.'); - } - break; - case 'video/mp4': - if (file.size > 50000000) { - logger.debug('publish > file validation > .mp4 was too big'); - throw new Error('Sorry, videos are limited to 50 megabytes.'); - } - break; - default: - logger.debug('publish > file validation > unrecognized file type'); - throw new Error('The ' + file.type + ' content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.'); - } - return file; - }, - createBasicPublishParams: function createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail) { - logger.debug('Creating Publish Parameters'); - // provide defaults for title - if (title === null || title.trim() === '') { - title = name; - } - // provide default for description - if (description === null || description.trim() === '') { - description = ''; - } - // provide default for license - if (license === null || license.trim() === '') { - license = ' '; // default to empty string - } - // create the publish params - var publishParams = { - name: name, - file_path: filePath, - bid: 0.01, - metadata: { - description: description, - title: title, - author: details.title, - language: 'en', - license: license, - nsfw: nsfw - }, - claim_address: publishing.primaryClaimAddress - }; - // add thumbnail to channel if video - if (thumbnail) { - publishParams['metadata']['thumbnail'] = thumbnail; - } - return publishParams; - }, - createThumbnailPublishParams: function createThumbnailPublishParams(thumbnailFilePath, claimName, license, nsfw) { - if (!thumbnailFilePath) { - return; - } - logger.debug('Creating Thumbnail Publish Parameters'); - // create the publish params - return { - name: claimName + '-thumb', - file_path: thumbnailFilePath, - bid: 0.01, - metadata: { - title: claimName + ' thumbnail', - description: 'a thumbnail for ' + claimName, - author: details.title, - language: 'en', - license: license, - nsfw: nsfw - }, - claim_address: publishing.primaryClaimAddress, - channel_name: publishing.thumbnailChannel, - channel_id: publishing.thumbnailChannelId - }; - }, - deleteTemporaryFile: function deleteTemporaryFile(filePath) { - fs.unlink(filePath, function (err) { - if (err) { - logger.error('error deleting temporary file ' + filePath); - throw err; - } - logger.debug('successfully deleted ' + filePath); - }); - }, - addGetResultsToFileData: function addGetResultsToFileData(fileInfo, getResult) { - fileInfo.fileName = getResult.file_name; - fileInfo.filePath = getResult.download_path; - return fileInfo; - }, - createFileData: function createFileData(_ref3) { - var name = _ref3.name, - claimId = _ref3.claimId, - outpoint = _ref3.outpoint, - height = _ref3.height, - address = _ref3.address, - nsfw = _ref3.nsfw, - contentType = _ref3.contentType; - - return { - name: name, - claimId: claimId, - outpoint: outpoint, - height: height, - address: address, - fileName: '', - filePath: '', - fileType: contentType, - nsfw: nsfw - }; - } -}; - -/***/ }), -/* 98 */ -/***/ (function(module, exports) { - -module.exports = require("fs"); - -/***/ }), -/* 99 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var logger = __webpack_require__(2); - -module.exports = { - handleErrorResponse: function handleErrorResponse(originalUrl, ip, error, res) { - logger.error('Error on ' + originalUrl, module.exports.useObjectPropertiesIfNoKeys(error)); - - var _module$exports$retur = module.exports.returnErrorMessageAndStatus(error), - _module$exports$retur2 = _slicedToArray(_module$exports$retur, 2), - status = _module$exports$retur2[0], - message = _module$exports$retur2[1]; - - res.status(status).json(module.exports.createErrorResponsePayload(status, message)); - }, - returnErrorMessageAndStatus: function returnErrorMessageAndStatus(error) { - var status = void 0, - message = void 0; - // check for daemon being turned off - if (error.code === 'ECONNREFUSED') { - status = 503; - message = 'Connection refused. The daemon may not be running.'; - // fallback for everything else - } else { - status = 400; - if (error.message) { - message = error.message; - } else { - message = error; - }; - }; - return [status, message]; - }, - useObjectPropertiesIfNoKeys: function useObjectPropertiesIfNoKeys(err) { - if (Object.keys(err).length === 0) { - var newErrorObject = {}; - Object.getOwnPropertyNames(err).forEach(function (key) { - newErrorObject[key] = err[key]; - }); - return newErrorObject; - } - return err; - }, - createErrorResponsePayload: function createErrorResponsePayload(status, message) { - return { - status: status, - success: false, - message: message - }; - } -}; - -/***/ }), -/* 100 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var db = __webpack_require__(9); -var logger = __webpack_require__(2); - -var _require = __webpack_require__(145), - returnPaginatedChannelClaims = _require.returnPaginatedChannelClaims; - -var NO_CHANNEL = 'NO_CHANNEL'; -var NO_CLAIM = 'NO_CLAIM'; -var NO_FILE = 'NO_FILE'; - -module.exports = { - getClaimId: function getClaimId(channelName, channelClaimId, name, claimId) { - if (channelName) { - return module.exports.getClaimIdByChannel(channelName, channelClaimId, name); - } else { - return module.exports.getClaimIdByClaim(name, claimId); - } - }, - getClaimIdByClaim: function getClaimIdByClaim(claimName, claimId) { - logger.debug('getClaimIdByClaim(' + claimName + ', ' + claimId + ')'); - return new Promise(function (resolve, reject) { - db.Claim.getLongClaimId(claimName, claimId).then(function (longClaimId) { - if (!longClaimId) { - resolve(NO_CLAIM); - } - resolve(longClaimId); - }).catch(function (error) { - reject(error); - }); - }); - }, - getClaimIdByChannel: function getClaimIdByChannel(channelName, channelClaimId, claimName) { - logger.debug('getClaimIdByChannel(' + channelName + ', ' + channelClaimId + ', ' + claimName + ')'); - return new Promise(function (resolve, reject) { - db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id - .then(function (longChannelId) { - if (!longChannelId) { - return [null, null]; - } - return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id - }).then(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - longChannelId = _ref2[0], - longClaimId = _ref2[1]; - - if (!longChannelId) { - return resolve(NO_CHANNEL); - } - if (!longClaimId) { - return resolve(NO_CLAIM); - } - resolve(longClaimId); - }).catch(function (error) { - reject(error); - }); - }); - }, - getChannelData: function getChannelData(channelName, channelClaimId, page) { - return new Promise(function (resolve, reject) { - // 1. get the long channel Id (make sure channel exists) - db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) { - if (!longChannelClaimId) { - return [null, null, null]; - } - // 2. get the short ID and all claims for that channel - return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]); - }).then(function (_ref3) { - var _ref4 = _slicedToArray(_ref3, 2), - longChannelClaimId = _ref4[0], - shortChannelClaimId = _ref4[1]; - - if (!longChannelClaimId) { - return resolve(NO_CHANNEL); - } - // 3. return all the channel information - resolve({ - channelName: channelName, - longChannelClaimId: longChannelClaimId, - shortChannelClaimId: shortChannelClaimId - }); - }).catch(function (error) { - reject(error); - }); - }); - }, - getChannelClaims: function getChannelClaims(channelName, channelClaimId, page) { - return new Promise(function (resolve, reject) { - // 1. get the long channel Id (make sure channel exists) - db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) { - if (!longChannelClaimId) { - return [null, null, null]; - } - // 2. get the short ID and all claims for that channel - return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]); - }).then(function (_ref5) { - var _ref6 = _slicedToArray(_ref5, 2), - longChannelClaimId = _ref6[0], - channelClaimsArray = _ref6[1]; - - if (!longChannelClaimId) { - return resolve(NO_CHANNEL); - } - // 3. format the data for the view, including pagination - var paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page); - // 4. return all the channel information and contents - resolve(paginatedChannelViewData); - }).catch(function (error) { - reject(error); - }); - }); - }, - getLocalFileRecord: function getLocalFileRecord(claimId, name) { - return db.File.findOne({ where: { claimId: claimId, name: name } }).then(function (file) { - if (!file) { - return NO_FILE; - } - return file.dataValues; - }); - } -}; - -/***/ }), -/* 101 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _server = __webpack_require__(102); - -var _redux = __webpack_require__(57); - -var _reducers = __webpack_require__(103); - -var _reducers2 = _interopRequireDefault(_reducers); - -var _reactRedux = __webpack_require__(1); - -var _reactRouterDom = __webpack_require__(4); - -var _GAListener = __webpack_require__(13); - -var _GAListener2 = _interopRequireDefault(_GAListener); - -var _app = __webpack_require__(108); - -var _app2 = _interopRequireDefault(_app); - -var _renderFullPage = __webpack_require__(113); - -var _renderFullPage2 = _interopRequireDefault(_renderFullPage); - -var _reactHelmet = __webpack_require__(48); - -var _reactHelmet2 = _interopRequireDefault(_reactHelmet); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -module.exports = function (req, res) { - var context = {}; - - // create a new Redux store instance - var store = (0, _redux.createStore)(_reducers2.default); - - // render component to a string - var html = (0, _server.renderToString)(_react2.default.createElement( - _reactRedux.Provider, - { store: store }, - _react2.default.createElement( - _reactRouterDom.StaticRouter, - { location: req.url, context: context }, - _react2.default.createElement( - _GAListener2.default, - null, - _react2.default.createElement(_app2.default, null) - ) - ) - )); - - // get head tags from helmet - var helmet = _reactHelmet2.default.renderStatic(); - - // check for a redirect - if (context.url) { - // Somewhere a `` was rendered - return res.redirect(301, context.url); - } else {} - // we're good, send the response - - - // get the initial state from our Redux store - var preloadedState = store.getState(); - - // send the rendered page back to the client - res.send((0, _renderFullPage2.default)(helmet, html, preloadedState)); -}; - -/***/ }), -/* 102 */ -/***/ (function(module, exports) { - -module.exports = require("react-dom/server"); - -/***/ }), -/* 103 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _redux = __webpack_require__(57); - -var _publish = __webpack_require__(147); - -var _publish2 = _interopRequireDefault(_publish); - -var _channel = __webpack_require__(148); - -var _channel2 = _interopRequireDefault(_channel); - -var _show = __webpack_require__(149); - -var _show2 = _interopRequireDefault(_show); - -var _site = __webpack_require__(150); - -var _site2 = _interopRequireDefault(_site); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = (0, _redux.combineReducers)({ - channel: _channel2.default, - publish: _publish2.default, - show: _show2.default, - site: _site2.default -}); - -/***/ }), -/* 104 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var FILE_SELECTED = exports.FILE_SELECTED = 'FILE_SELECTED'; -var FILE_CLEAR = exports.FILE_CLEAR = 'FILE_CLEAR'; -var METADATA_UPDATE = exports.METADATA_UPDATE = 'METADATA_UPDATE'; -var CLAIM_UPDATE = exports.CLAIM_UPDATE = 'CLAIM_UPDATE'; -var SET_PUBLISH_IN_CHANNEL = exports.SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL'; -var PUBLISH_STATUS_UPDATE = exports.PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE'; -var ERROR_UPDATE = exports.ERROR_UPDATE = 'ERROR_UPDATE'; -var SELECTED_CHANNEL_UPDATE = exports.SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE'; -var TOGGLE_METADATA_INPUTS = exports.TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS'; -var THUMBNAIL_NEW = exports.THUMBNAIL_NEW = 'THUMBNAIL_NEW'; -var PUBLISH_START = exports.PUBLISH_START = 'PUBLISH_START'; - -/***/ }), -/* 105 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var LOGIN = exports.LOGIN = 'Existing'; -var CREATE = exports.CREATE = 'New'; - -/***/ }), -/* 106 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var CHANNEL_UPDATE = exports.CHANNEL_UPDATE = 'CHANNEL_UPDATE'; - -/***/ }), -/* 107 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var LOCAL_CHECK = exports.LOCAL_CHECK = 'LOCAL_CHECK'; -var UNAVAILABLE = exports.UNAVAILABLE = 'UNAVAILABLE'; -var ERROR = exports.ERROR = 'ERROR'; -var AVAILABLE = exports.AVAILABLE = 'AVAILABLE'; - -/***/ }), -/* 108 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _reactRouterDom = __webpack_require__(4); - -var _dynamicImport = __webpack_require__(58); - -var _AboutPage = __webpack_require__(20); - -var _AboutPage2 = _interopRequireDefault(_AboutPage); - -var _LoginPage = __webpack_require__(23); - -var _LoginPage2 = _interopRequireDefault(_LoginPage); - -var _ShowPage = __webpack_require__(26); - -var _ShowPage2 = _interopRequireDefault(_ShowPage); - -var _FourOhFourPage = __webpack_require__(35); - -var _FourOhFourPage2 = _interopRequireDefault(_FourOhFourPage); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var HomePage = (0, _dynamicImport.dynamicImport)('pages/HomePage'); // or use the provided local homepage - -var App = function App() { - return _react2.default.createElement( - _reactRouterDom.Switch, - null, - _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/', component: HomePage }), - _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/about', component: _AboutPage2.default }), - _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/login', component: _LoginPage2.default }), - _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:identifier/:claim', component: _ShowPage2.default }), - _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:claim', component: _ShowPage2.default }), - _react2.default.createElement(_reactRouterDom.Route, { component: _FourOhFourPage2.default }) - ); -}; - -exports.default = App; - -/***/ }), -/* 109 */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./canonicalLink": 59, - "./canonicalLink.js": 59, - "./dynamicImport": 58, - "./dynamicImport.js": 58, - "./file": 60, - "./file.js": 60, - "./lbryUri": 61, - "./lbryUri.js": 61, - "./metaTags": 62, - "./metaTags.js": 62, - "./pageTitle": 63, - "./pageTitle.js": 63, - "./publish": 110, - "./publish.js": 110, - "./request": 8, - "./request.js": 8, - "./validate": 111, - "./validate.js": 111 -}; -function webpackContext(req) { - return __webpack_require__(webpackContextResolve(req)); -}; -function webpackContextResolve(req) { - var id = map[req]; - if(!(id + 1)) // check for number or string - throw new Error("Cannot find module '" + req + "'."); - return id; -}; -webpackContext.keys = function webpackContextKeys() { - return Object.keys(map); -}; -webpackContext.resolve = webpackContextResolve; -module.exports = webpackContext; -webpackContext.id = 109; - -/***/ }), -/* 110 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var createPublishMetadata = exports.createPublishMetadata = function createPublishMetadata(claim, _ref, _ref2, publishInChannel, selectedChannel) { - var type = _ref.type; - var title = _ref2.title, - description = _ref2.description, - license = _ref2.license, - nsfw = _ref2.nsfw; - - var metadata = { - name: claim, - title: title, - description: description, - license: license, - nsfw: nsfw, - type: type - }; - if (publishInChannel) { - metadata['channelName'] = selectedChannel; - } - return metadata; -}; - -var createPublishFormData = exports.createPublishFormData = function createPublishFormData(file, thumbnail, metadata) { - var fd = new FormData(); - // append file - fd.append('file', file); - // append thumbnail - if (thumbnail) { - fd.append('thumbnail', thumbnail); - } - // append metadata - for (var key in metadata) { - if (metadata.hasOwnProperty(key)) { - fd.append(key, metadata[key]); - } - } - return fd; -}; - -var createThumbnailUrl = exports.createThumbnailUrl = function createThumbnailUrl(channel, channelId, claim, host) { - return host + '/' + channel + ':' + channelId + '/' + claim + '-thumb.png'; -}; - -/***/ }), -/* 111 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var validateChannelSelection = exports.validateChannelSelection = function validateChannelSelection(publishInChannel, selectedChannel, loggedInChannel) { - if (publishInChannel && selectedChannel !== loggedInChannel.name) { - throw new Error('Log in to a channel or select Anonymous'); - } -}; - -var validatePublishParams = exports.validatePublishParams = function validatePublishParams(file, claim, urlError) { - if (!file) { - throw new Error('Please choose a file'); - } - if (!claim) { - throw new Error('Please enter a URL'); - } - if (urlError) { - throw new Error('Fix the url'); - } -}; - -/***/ }), -/* 112 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var CHANNEL = exports.CHANNEL = 'CHANNEL'; -var ASSET_LITE = exports.ASSET_LITE = 'ASSET_LITE'; -var ASSET_DETAILS = exports.ASSET_DETAILS = 'ASSET_DETAILS'; - -/***/ }), -/* 113 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = function (helmet, html, preloadedState) { - // take the html and preloadedState and return the full page - return '\n \n \n \n \n \n \n \n ' + helmet.title.toString() + '\n ' + helmet.meta.toString() + '\n ' + helmet.link.toString() + '\n \n \n \n \n \n \n \n \n
\n
' + html + '
\n
\n \n \n \n \n '; -}; - -/***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var selectSiteState = exports.selectSiteState = function selectSiteState(state) { - return state.site; -}; - -var selectSiteHost = exports.selectSiteHost = function selectSiteHost(state) { - return state.site.host; -}; - -/***/ }), -/* 115 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(116); -__webpack_require__(117); -module.exports = __webpack_require__(118); - - -/***/ }), -/* 116 */ -/***/ (function(module, exports) { - -module.exports = require("babel-polyfill"); - -/***/ }), -/* 117 */ -/***/ (function(module, exports) { - -module.exports = require("whatwg-fetch"); - -/***/ }), -/* 118 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Server = __webpack_require__(119); -var Components = __webpack_require__(50); -var Containers = __webpack_require__(52); -var Pages = __webpack_require__(53); - -var _exports = { - Server: Server, - Components: Components, - Containers: Containers, - Pages: Pages -}; - -module.exports = _exports; - -/***/ }), -/* 119 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -// app dependencies -var express = __webpack_require__(120); -var bodyParser = __webpack_require__(121); -var expressHandlebars = __webpack_require__(122); -var Handlebars = __webpack_require__(123); -var helmet = __webpack_require__(124); -var passport = __webpack_require__(91); - -var _require = __webpack_require__(125), - serializeSpeechUser = _require.serializeSpeechUser, - deserializeSpeechUser = _require.deserializeSpeechUser; - -var cookieSession = __webpack_require__(126); -var http = __webpack_require__(127); -// logging dependencies -var logger = __webpack_require__(2); - -function Server() { - var _this = this; - - this.configureMysql = function (mysqlConfig) { - __webpack_require__(92).configure(mysqlConfig); - }; - this.configureSite = function (siteConfig) { - __webpack_require__(3).configure(siteConfig); - _this.sessionKey = siteConfig.auth.sessionKey; - _this.PORT = siteConfig.details.port; - }; - this.configureSlack = function (slackConfig) { - __webpack_require__(93).configure(slackConfig); - }; - this.createApp = function () { - // create an Express application - var app = express(); - - // trust the proxy to get ip address for us - app.enable('trust proxy'); - - // add middleware - app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties - app.use(express.static(__dirname + '/public')); // 'express.static' to serve static files from public directory - app.use(bodyParser.json()); // 'body parser' for parsing application/json - app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded - app.use(function (req, res, next) { - // custom logging middleware to log all incoming http requests - logger.verbose('Request on ' + req.originalUrl + ' from ' + req.ip); - next(); - }); - - // configure passport - passport.serializeUser(serializeSpeechUser); - passport.deserializeUser(deserializeSpeechUser); - var localSignupStrategy = __webpack_require__(128); - var localLoginStrategy = __webpack_require__(139); - passport.use('local-signup', localSignupStrategy); - passport.use('local-login', localLoginStrategy); - // initialize passport - app.use(cookieSession({ - name: 'session', - keys: [_this.sessionKey], - maxAge: 24 * 60 * 60 * 1000 // i.e. 24 hours - })); - app.use(passport.initialize()); - app.use(passport.session()); - - // configure handlebars & register it with express app - var hbs = expressHandlebars.create({ - defaultLayout: 'embed', - handlebars: Handlebars - }); - app.engine('handlebars', hbs.engine); - app.set('view engine', 'handlebars'); - - // set the routes on the app - __webpack_require__(140)(app); - __webpack_require__(141)(app); - __webpack_require__(146)(app); - __webpack_require__(153)(app); - __webpack_require__(163)(app); - - _this.app = app; - }; - this.initialize = function () { - __webpack_require__(164)(logger); - __webpack_require__(166)(logger); - _this.createApp(); - _this.server = http.Server(_this.app); - }; - this.start = function () { - var db = __webpack_require__(9); - // sync sequelize - db.sequelize.sync() - // start the server - .then(function () { - _this.server.listen(_this.PORT, function () { - logger.info('Server is listening on PORT ' + _this.PORT); - }); - }).catch(function (error) { - logger.error('Startup Error:', error); - }); - }; -}; - -module.exports = Server; - -/***/ }), -/* 120 */ -/***/ (function(module, exports) { - -module.exports = require("express"); - -/***/ }), -/* 121 */ -/***/ (function(module, exports) { - -module.exports = require("body-parser"); - -/***/ }), -/* 122 */ -/***/ (function(module, exports) { - -module.exports = require("express-handlebars"); - -/***/ }), -/* 123 */ -/***/ (function(module, exports) { - -module.exports = require("handlebars"); - -/***/ }), -/* 124 */ -/***/ (function(module, exports) { - -module.exports = require("helmet"); - -/***/ }), -/* 125 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var logger = __webpack_require__(2); - -module.exports = { - serializeSpeechUser: function serializeSpeechUser(user, done) { - // returns user data to be serialized into session - logger.debug('serializing user'); - done(null, user); - }, - deserializeSpeechUser: function deserializeSpeechUser(user, done) { - // deserializes session and populates additional info to req.user - logger.debug('deserializing user'); - done(null, user); - } -}; - -/***/ }), -/* 126 */ -/***/ (function(module, exports) { - -module.exports = require("cookie-session"); - -/***/ }), -/* 127 */ -/***/ (function(module, exports) { - -module.exports = require("http"); - -/***/ }), -/* 128 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var PassportLocalStrategy = __webpack_require__(94).Strategy; -var lbryApi = __webpack_require__(55); -var logger = __webpack_require__(2); -var db = __webpack_require__(9); - -module.exports = new PassportLocalStrategy({ - usernameField: 'username', - passwordField: 'password' -}, function (username, password, done) { - logger.verbose('new channel signup request. user: ' + username + ' pass: ' + password + ' .'); - var userInfo = {}; - // server-side validaton of inputs (username, password) - - // create the channel and retrieve the metadata - return lbryApi.createChannel('@' + username).then(function (tx) { - // create user record - var userData = { - userName: username, - password: password - }; - logger.verbose('userData >', userData); - // create user record - var channelData = { - channelName: '@' + username, - channelClaimId: tx.claim_id - }; - logger.verbose('channelData >', channelData); - // create certificate record - var certificateData = { - claimId: tx.claim_id, - name: '@' + username - // address, - }; - logger.verbose('certificateData >', certificateData); - // save user and certificate to db - return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]); - }).then(function (_ref) { - var _ref2 = _slicedToArray(_ref, 3), - newUser = _ref2[0], - newChannel = _ref2[1], - newCertificate = _ref2[2]; - - logger.verbose('user and certificate successfully created'); - // store the relevant newUser info to be passed back for req.User - userInfo['id'] = newUser.id; - userInfo['userName'] = newUser.userName; - userInfo['channelName'] = newChannel.channelName; - userInfo['channelClaimId'] = newChannel.channelClaimId; - // associate the instances - return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]); - }).then(function () { - logger.verbose('user and certificate successfully associated'); - return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName); - }).then(function (shortChannelId) { - userInfo['shortChannelId'] = shortChannelId; - return done(null, userInfo); - }).catch(function (error) { - logger.error('signup error', error); - return done(error); - }); -}); - -/***/ }), -/* 129 */ -/***/ (function(module, exports) { - -module.exports = require("axios"); - -/***/ }), -/* 130 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var lbryConfig = { - api: { - apiHost: 'localhost', - apiPort: '5279' - } -}; - -module.exports = lbryConfig; - -/***/ }), -/* 131 */ -/***/ (function(module, exports) { - -module.exports = require("universal-analytics"); - -/***/ }), -/* 132 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var logger = __webpack_require__(2); - -var _require = __webpack_require__(96), - returnShortId = _require.returnShortId; - -module.exports = function (sequelize, _ref) { - var STRING = _ref.STRING, - BOOLEAN = _ref.BOOLEAN, - INTEGER = _ref.INTEGER, - TEXT = _ref.TEXT, - DECIMAL = _ref.DECIMAL; - - var Certificate = sequelize.define('Certificate', { - address: { - type: STRING, - default: null - }, - amount: { - type: DECIMAL(19, 8), - default: null - }, - claimId: { - type: STRING, - default: null - }, - claimSequence: { - type: INTEGER, - default: null - }, - decodedClaim: { - type: BOOLEAN, - default: null - }, - depth: { - type: INTEGER, - default: null - }, - effectiveAmount: { - type: DECIMAL(19, 8), - default: null - }, - hasSignature: { - type: BOOLEAN, - default: null - }, - height: { - type: INTEGER, - default: null - }, - hex: { - type: TEXT('long'), - default: null - }, - name: { - type: STRING, - default: null - }, - nout: { - type: INTEGER, - default: null - }, - txid: { - type: STRING, - default: null - }, - validAtHeight: { - type: INTEGER, - default: null - }, - outpoint: { - type: STRING, - default: null - }, - valueVersion: { - type: STRING, - default: null - }, - claimType: { - type: STRING, - default: null - }, - certificateVersion: { - type: STRING, - default: null - }, - keyType: { - type: STRING, - default: null - }, - publicKey: { - type: TEXT('long'), - default: null - } - }, { - freezeTableName: true - }); - - Certificate.associate = function (db) { - Certificate.belongsTo(db.Channel, { - foreignKey: { - allowNull: true - } - }); - }; - - Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) { - var _this = this; - - logger.debug('getShortChannelIdFromLongChannelId ' + channelName + ':' + longChannelId); - return new Promise(function (resolve, reject) { - _this.findAll({ - where: { name: channelName }, - order: [['height', 'ASC']] - }).then(function (result) { - switch (result.length) { - case 0: - throw new Error('No channel(s) found with that channel name'); - default: - return resolve(returnShortId(result, longChannelId)); - } - }).catch(function (error) { - reject(error); - }); - }); - }; - - Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) { - var _this2 = this; - - logger.debug('getLongChannelIdFromShortChannelId(' + channelName + ', ' + channelClaimId + ')'); - return new Promise(function (resolve, reject) { - _this2.findAll({ - where: { - name: channelName, - claimId: { - $like: channelClaimId + '%' - } - }, - order: [['height', 'ASC']] - }).then(function (result) { - switch (result.length) { - case 0: - return resolve(null); - default: - // note results must be sorted - return resolve(result[0].claimId); - } - }).catch(function (error) { - reject(error); - }); - }); - }; - - Certificate.getLongChannelIdFromChannelName = function (channelName) { - var _this3 = this; - - logger.debug('getLongChannelIdFromChannelName(' + channelName + ')'); - return new Promise(function (resolve, reject) { - _this3.findAll({ - where: { name: channelName }, - order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] - }).then(function (result) { - switch (result.length) { - case 0: - return resolve(null); - default: - return resolve(result[0].claimId); - } - }).catch(function (error) { - reject(error); - }); - }); - }; - - Certificate.validateLongChannelId = function (name, claimId) { - var _this4 = this; - - logger.debug('validateLongChannelId(' + name + ', ' + claimId + ')'); - return new Promise(function (resolve, reject) { - _this4.findOne({ - where: { name: name, claimId: claimId } - }).then(function (result) { - if (!result) { - return resolve(null); - }; - resolve(claimId); - }).catch(function (error) { - reject(error); - }); - }); - }; - - Certificate.getLongChannelId = function (channelName, channelClaimId) { - logger.debug('getLongChannelId(' + channelName + ', ' + channelClaimId + ')'); - if (channelClaimId && channelClaimId.length === 40) { - // if a full channel id is provided - return this.validateLongChannelId(channelName, channelClaimId); - } else if (channelClaimId && channelClaimId.length < 40) { - // if a short channel id is provided - return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId); - } else { - return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided - } - }; - - return Certificate; -}; - -/***/ }), -/* 133 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = function (sequelize, _ref) { - var STRING = _ref.STRING; - - var Channel = sequelize.define('Channel', { - channelName: { - type: STRING, - allowNull: false - }, - channelClaimId: { - type: STRING, - allowNull: false - } - }, { - freezeTableName: true - }); - - Channel.associate = function (db) { - Channel.belongsTo(db.User); - Channel.hasOne(db.Certificate); - }; - - return Channel; -}; - -/***/ }), -/* 134 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var logger = __webpack_require__(2); - -var _require = __webpack_require__(96), - returnShortId = _require.returnShortId; - -var _require2 = __webpack_require__(3), - defaultThumbnail = _require2.assetDefaults.thumbnail, - host = _require2.details.host; - -function determineFileExtensionFromContentType(contentType) { - switch (contentType) { - case 'image/jpeg': - case 'image/jpg': - return 'jpeg'; - case 'image/png': - return 'png'; - case 'image/gif': - return 'gif'; - case 'video/mp4': - return 'mp4'; - default: - logger.debug('setting unknown file type as file extension jpeg'); - return 'jpeg'; - } -}; - -function determineThumbnail(storedThumbnail, defaultThumbnail) { - if (storedThumbnail === '') { - return defaultThumbnail; - } - return storedThumbnail; -}; - -function prepareClaimData(claim) { - // logger.debug('preparing claim data based on resolved data:', claim); - claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail); - claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType); - claim['host'] = host; - return claim; -}; - -module.exports = function (sequelize, _ref) { - var STRING = _ref.STRING, - BOOLEAN = _ref.BOOLEAN, - INTEGER = _ref.INTEGER, - TEXT = _ref.TEXT, - DECIMAL = _ref.DECIMAL; - - var Claim = sequelize.define('Claim', { - address: { - type: STRING, - default: null - }, - amount: { - type: DECIMAL(19, 8), - default: null - }, - claimId: { - type: STRING, - default: null - }, - claimSequence: { - type: INTEGER, - default: null - }, - decodedClaim: { - type: BOOLEAN, - default: null - }, - depth: { - type: INTEGER, - default: null - }, - effectiveAmount: { - type: DECIMAL(19, 8), - default: null - }, - hasSignature: { - type: BOOLEAN, - default: null - }, - height: { - type: INTEGER, - default: null - }, - hex: { - type: TEXT('long'), - default: null - }, - name: { - type: STRING, - default: null - }, - nout: { - type: INTEGER, - default: null - }, - txid: { - type: STRING, - default: null - }, - validAtHeight: { - type: INTEGER, - default: null - }, - outpoint: { - type: STRING, - default: null - }, - claimType: { - type: STRING, - default: null - }, - certificateId: { - type: STRING, - default: null - }, - author: { - type: STRING, - default: null - }, - description: { - type: TEXT('long'), - default: null - }, - language: { - type: STRING, - default: null - }, - license: { - type: STRING, - default: null - }, - licenseUrl: { - type: STRING, - default: null - }, - nsfw: { - type: BOOLEAN, - default: null - }, - preview: { - type: STRING, - default: null - }, - thumbnail: { - type: STRING, - default: null - }, - title: { - type: STRING, - default: null - }, - metadataVersion: { - type: STRING, - default: null - }, - contentType: { - type: STRING, - default: null - }, - source: { - type: STRING, - default: null - }, - sourceType: { - type: STRING, - default: null - }, - sourceVersion: { - type: STRING, - default: null - }, - streamVersion: { - type: STRING, - default: null - }, - valueVersion: { - type: STRING, - default: null - }, - channelName: { - type: STRING, - allowNull: true, - default: null - } - }, { - freezeTableName: true - }); - - Claim.associate = function (db) { - Claim.belongsTo(db.File, { - foreignKey: { - allowNull: true - } - }); - }; - - Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) { - var _this = this; - - logger.debug('Claim.getShortClaimIdFromLongClaimId for ' + claimName + '#' + claimId); - return new Promise(function (resolve, reject) { - _this.findAll({ - where: { name: claimName }, - order: [['height', 'ASC']] - }).then(function (result) { - switch (result.length) { - case 0: - throw new Error('No claim(s) found with that claim name'); - default: - resolve(returnShortId(result, claimId)); - } - }).catch(function (error) { - reject(error); - }); - }); - }; - - Claim.getAllChannelClaims = function (channelClaimId) { - var _this2 = this; - - logger.debug('Claim.getAllChannelClaims for ' + channelClaimId); - return new Promise(function (resolve, reject) { - _this2.findAll({ - where: { certificateId: channelClaimId }, - order: [['height', 'ASC']], - raw: true // returns an array of only data, not an array of instances - }).then(function (channelClaimsArray) { - // logger.debug('channelclaimsarray length:', channelClaimsArray.length); - switch (channelClaimsArray.length) { - case 0: - return resolve(null); - default: - channelClaimsArray.forEach(function (claim) { - claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType); - claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail); - return claim; - }); - return resolve(channelClaimsArray); - } - }).catch(function (error) { - reject(error); - }); - }); - }; - - Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) { - var _this3 = this; - - logger.debug('finding claim id for claim ' + claimName + ' from channel ' + channelClaimId); - return new Promise(function (resolve, reject) { - _this3.findAll({ - where: { name: claimName, certificateId: channelClaimId }, - order: [['id', 'ASC']] - }).then(function (result) { - switch (result.length) { - case 0: - return resolve(null); - case 1: - return resolve(result[0].claimId); - default: - logger.error(result.length + ' records found for "' + claimName + '" in channel "' + channelClaimId + '"'); - return resolve(result[0].claimId); - } - }).catch(function (error) { - reject(error); - }); - }); - }; - - Claim.getLongClaimIdFromShortClaimId = function (name, shortId) { - var _this4 = this; - - return new Promise(function (resolve, reject) { - _this4.findAll({ - where: { - name: name, - claimId: { - $like: shortId + '%' - } }, - order: [['height', 'ASC']] - }).then(function (result) { - switch (result.length) { - case 0: - return resolve(null); - default: - // note results must be sorted - return resolve(result[0].claimId); - } - }).catch(function (error) { - reject(error); - }); - }); - }; - - Claim.getTopFreeClaimIdByClaimName = function (name) { - var _this5 = this; - - return new Promise(function (resolve, reject) { - _this5.findAll({ - where: { name: name }, - order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] // note: maybe height and effective amount need to switch? - }).then(function (result) { - logger.debug('length of result', result.length); - switch (result.length) { - case 0: - return resolve(null); - default: - return resolve(result[0].dataValues.claimId); - } - }).catch(function (error) { - reject(error); - }); - }); - }; - - Claim.validateLongClaimId = function (name, claimId) { - var _this6 = this; - - return new Promise(function (resolve, reject) { - _this6.findOne({ - where: { name: name, claimId: claimId } - }).then(function (result) { - if (!result) { - return resolve(null); - }; - resolve(claimId); - }).catch(function (error) { - reject(error); - }); - }); - }; - - Claim.getLongClaimId = function (claimName, claimId) { - logger.debug('getLongClaimId(' + claimName + ', ' + claimId + ')'); - if (claimId && claimId.length === 40) { - // if a full claim id is provided - return this.validateLongClaimId(claimName, claimId); - } else if (claimId && claimId.length < 40) { - return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided - } else { - return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided - } - }; - - Claim.resolveClaim = function (name, claimId) { - var _this7 = this; - - logger.debug('Claim.resolveClaim: ' + name + ' ' + claimId); - return new Promise(function (resolve, reject) { - _this7.findAll({ - where: { name: name, claimId: claimId } - }).then(function (claimArray) { - switch (claimArray.length) { - case 0: - return resolve(null); - case 1: - return resolve(prepareClaimData(claimArray[0].dataValues)); - default: - logger.error('more than one record matches ' + name + '#' + claimId + ' in db.Claim'); - return resolve(prepareClaimData(claimArray[0].dataValues)); - } - }).catch(function (error) { - reject(error); - }); - }); - }; - - return Claim; -}; - -/***/ }), -/* 135 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = function (sequelize, _ref) { - var STRING = _ref.STRING, - BOOLEAN = _ref.BOOLEAN, - INTEGER = _ref.INTEGER; - - var File = sequelize.define('File', { - name: { - type: STRING, - allowNull: false - }, - claimId: { - type: STRING, - allowNull: false - }, - address: { - type: STRING, - allowNull: false - }, - outpoint: { - type: STRING, - allowNull: false - }, - height: { - type: INTEGER, - allowNull: false, - default: 0 - }, - fileName: { - type: STRING, - allowNull: false - }, - filePath: { - type: STRING, - allowNull: false - }, - fileType: { - type: STRING - }, - nsfw: { - type: BOOLEAN, - allowNull: false, - defaultValue: false - }, - trendingEligible: { - type: BOOLEAN, - allowNull: false, - defaultValue: true - } - }, { - freezeTableName: true - }); - - File.associate = function (db) { - File.hasMany(db.Request); - File.hasOne(db.Claim); - }; - - File.getRecentClaims = function () { - return this.findAll({ - where: { nsfw: false, trendingEligible: true }, - order: [['createdAt', 'DESC']], - limit: 25 - }); - }; - - return File; -}; - -/***/ }), -/* 136 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = function (sequelize, _ref) { - var STRING = _ref.STRING, - BOOLEAN = _ref.BOOLEAN, - TEXT = _ref.TEXT; - - var Request = sequelize.define('Request', { - action: { - type: STRING, - allowNull: false - }, - url: { - type: STRING, - allowNull: false - }, - ipAddress: { - type: STRING, - allowNull: true - }, - result: { - type: TEXT('long'), - allowNull: true, - default: null - } - }, { - freezeTableName: true - }); - - Request.associate = function (db) { - Request.belongsTo(db.File, { - foreignKey: { - allowNull: true - } - }); - }; - - return Request; -}; - -/***/ }), -/* 137 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var bcrypt = __webpack_require__(138); -var logger = __webpack_require__(2); - -module.exports = function (sequelize, _ref) { - var STRING = _ref.STRING; - - var User = sequelize.define('User', { - userName: { - type: STRING, - allowNull: false - }, - password: { - type: STRING, - allowNull: false - } - }, { - freezeTableName: true - }); - - User.associate = function (db) { - User.hasOne(db.Channel); - }; - - User.prototype.comparePassword = function (password) { - return bcrypt.compare(password, this.password); - }; - - User.prototype.changePassword = function (newPassword) { - var _this = this; - - return new Promise(function (resolve, reject) { - // generate a salt string to use for hashing - bcrypt.genSalt(function (saltError, salt) { - if (saltError) { - logger.error('salt error', saltError); - reject(saltError); - return; - } - // generate a hashed version of the user's password - bcrypt.hash(newPassword, salt, function (hashError, hash) { - // if there is an error with the hash generation return the error - if (hashError) { - logger.error('hash error', hashError); - reject(hashError); - return; - } - // replace the current password with the new hash - _this.update({ password: hash }).then(function () { - resolve(); - }).catch(function (error) { - reject(error); - }); - }); - }); - }); - }; - - // pre-save hook method to hash the user's password before the user's info is saved to the db. - User.hook('beforeCreate', function (user, options) { - logger.debug('User.beforeCreate hook...'); - return new Promise(function (resolve, reject) { - // generate a salt string to use for hashing - bcrypt.genSalt(function (saltError, salt) { - if (saltError) { - logger.error('salt error', saltError); - reject(saltError); - return; - } - // generate a hashed version of the user's password - bcrypt.hash(user.password, salt, function (hashError, hash) { - // if there is an error with the hash generation return the error - if (hashError) { - logger.error('hash error', hashError); - reject(hashError); - return; - } - // replace the password string with the hash password value - user.password = hash; - resolve(); - }); - }); - }); - }); - - return User; -}; - -/***/ }), -/* 138 */ -/***/ (function(module, exports) { - -module.exports = require("bcrypt"); - -/***/ }), -/* 139 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var PassportLocalStrategy = __webpack_require__(94).Strategy; -var logger = __webpack_require__(2); -var db = __webpack_require__(9); - -var returnUserAndChannelInfo = function returnUserAndChannelInfo(userInstance) { - return new Promise(function (resolve, reject) { - var userInfo = {}; - userInfo['id'] = userInstance.id; - userInfo['userName'] = userInstance.userName; - userInstance.getChannel().then(function (_ref) { - var channelName = _ref.channelName, - channelClaimId = _ref.channelClaimId; - - userInfo['channelName'] = channelName; - userInfo['channelClaimId'] = channelClaimId; - return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName); - }).then(function (shortChannelId) { - userInfo['shortChannelId'] = shortChannelId; - resolve(userInfo); - }).catch(function (error) { - reject(error); - }); - }); -}; - -module.exports = new PassportLocalStrategy({ - usernameField: 'username', - passwordField: 'password' -}, function (username, password, done) { - return db.User.findOne({ - where: { userName: username } - }).then(function (user) { - if (!user) { - logger.debug('no user found'); - return done(null, false, { message: 'Incorrect username or password' }); - } - return user.comparePassword(password).then(function (isMatch) { - if (!isMatch) { - logger.debug('incorrect password'); - return done(null, false, { message: 'Incorrect username or password' }); - } - logger.debug('Password was a match, returning User'); - return returnUserAndChannelInfo(user).then(function (userInfo) { - return done(null, userInfo); - }).catch(function (error) { - return error; - }); - }).catch(function (error) { - return error; - }); - }).catch(function (error) { - return done(error); - }); -}); - -/***/ }), -/* 140 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var logger = __webpack_require__(2); -var passport = __webpack_require__(91); - -module.exports = function (app) { - // route for sign up - app.post('/signup', passport.authenticate('local-signup'), function (req, res) { - logger.verbose('successful signup for ' + req.user.channelName); - res.status(200).json({ - success: true, - channelName: req.user.channelName, - channelClaimId: req.user.channelClaimId, - shortChannelId: req.user.shortChannelId - }); - }); - // route for log in - app.post('/login', function (req, res, next) { - passport.authenticate('local-login', function (err, user, info) { - if (err) { - return next(err); - } - if (!user) { - return res.status(400).json({ - success: false, - message: info.message - }); - } - logger.debug('successful login'); - req.logIn(user, function (err) { - if (err) { - return next(err); - } - return res.status(200).json({ - success: true, - channelName: req.user.channelName, - channelClaimId: req.user.channelClaimId, - shortChannelId: req.user.shortChannelId - }); - }); - })(req, res, next); - }); - // route to log out - app.get('/logout', function (req, res) { - req.logout(); - res.status(200).json({ success: true, message: 'you successfully logged out' }); - }); - // see if user is authenticated, and return credentials if so - app.get('/user', function (req, res) { - if (req.user) { - res.status(200).json({ success: true, data: req.user }); - } else { - res.status(401).json({ success: false, message: 'user is not logged in' }); - } - }); -}; - -/***/ }), -/* 141 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var logger = __webpack_require__(2); -var multipart = __webpack_require__(142); - -var _require = __webpack_require__(3), - uploadDirectory = _require.publishing.uploadDirectory, - host = _require.details.host; - -var multipartMiddleware = multipart({ uploadDir: uploadDirectory }); -var db = __webpack_require__(9); - -var _require2 = __webpack_require__(143), - claimNameIsAvailable = _require2.claimNameIsAvailable, - checkChannelAvailability = _require2.checkChannelAvailability, - publish = _require2.publish; - -var _require3 = __webpack_require__(55), - getClaimList = _require3.getClaimList, - resolveUri = _require3.resolveUri, - getClaim = _require3.getClaim; - -var _require4 = __webpack_require__(97), - addGetResultsToFileData = _require4.addGetResultsToFileData, - createBasicPublishParams = _require4.createBasicPublishParams, - createThumbnailPublishParams = _require4.createThumbnailPublishParams, - parsePublishApiRequestBody = _require4.parsePublishApiRequestBody, - parsePublishApiRequestFiles = _require4.parsePublishApiRequestFiles, - createFileData = _require4.createFileData; - -var errorHandlers = __webpack_require__(99); - -var _require5 = __webpack_require__(56), - sendGATimingEvent = _require5.sendGATimingEvent; - -var _require6 = __webpack_require__(144), - authenticateUser = _require6.authenticateUser; - -var _require7 = __webpack_require__(100), - getChannelData = _require7.getChannelData, - getChannelClaims = _require7.getChannelClaims, - getClaimId = _require7.getClaimId; - -var NO_CHANNEL = 'NO_CHANNEL'; -var NO_CLAIM = 'NO_CLAIM'; - -module.exports = function (app) { - // route to check whether site has published to a channel - app.get('/api/channel/availability/:name', function (_ref, res) { - var ip = _ref.ip, - originalUrl = _ref.originalUrl, - name = _ref.params.name; - - var gaStartTime = Date.now(); - checkChannelAvailability(name).then(function (availableName) { - res.status(200).json(availableName); - sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now()); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - // route to get a short channel id from long channel Id - app.get('/api/channel/short-id/:longId/:name', function (_ref2, res) { - var ip = _ref2.ip, - originalUrl = _ref2.originalUrl, - params = _ref2.params; - - db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name).then(function (shortId) { - res.status(200).json(shortId); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - app.get('/api/channel/data/:channelName/:channelClaimId', function (_ref3, res) { - var ip = _ref3.ip, - originalUrl = _ref3.originalUrl, - body = _ref3.body, - params = _ref3.params; - - var channelName = params.channelName; - var channelClaimId = params.channelClaimId; - if (channelClaimId === 'none') channelClaimId = null; - getChannelData(channelName, channelClaimId, 0).then(function (data) { - if (data === NO_CHANNEL) { - return res.status(404).json({ success: false, message: 'No matching channel was found' }); - } - res.status(200).json({ success: true, data: data }); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - app.get('/api/channel/claims/:channelName/:channelClaimId/:page', function (_ref4, res) { - var ip = _ref4.ip, - originalUrl = _ref4.originalUrl, - body = _ref4.body, - params = _ref4.params; - - var channelName = params.channelName; - var channelClaimId = params.channelClaimId; - if (channelClaimId === 'none') channelClaimId = null; - var page = params.page; - getChannelClaims(channelName, channelClaimId, page).then(function (data) { - if (data === NO_CHANNEL) { - return res.status(404).json({ success: false, message: 'No matching channel was found' }); - } - res.status(200).json({ success: true, data: data }); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - // route to run a claim_list request on the daemon - app.get('/api/claim/list/:name', function (_ref5, res) { - var ip = _ref5.ip, - originalUrl = _ref5.originalUrl, - params = _ref5.params; - - getClaimList(params.name).then(function (claimsList) { - res.status(200).json(claimsList); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - // route to get an asset - app.get('/api/claim/get/:name/:claimId', function (_ref6, res) { - var ip = _ref6.ip, - originalUrl = _ref6.originalUrl, - params = _ref6.params; - - var name = params.name; - var claimId = params.claimId; - // resolve the claim - db.Claim.resolveClaim(name, claimId).then(function (resolveResult) { - // make sure a claim actually exists at that uri - if (!resolveResult) { - throw new Error('No matching uri found in Claim table'); - } - var fileData = createFileData(resolveResult); - // get the claim - return Promise.all([fileData, getClaim(name + '#' + claimId)]); - }).then(function (_ref7) { - var _ref8 = _slicedToArray(_ref7, 2), - fileData = _ref8[0], - getResult = _ref8[1]; - - fileData = addGetResultsToFileData(fileData, getResult); - return Promise.all([db.upsert(db.File, fileData, { name: name, claimId: claimId }, 'File'), getResult]); - }).then(function (_ref9) { - var _ref10 = _slicedToArray(_ref9, 2), - fileRecord = _ref10[0], - _ref10$ = _ref10[1], - message = _ref10$.message, - completed = _ref10$.completed; - - res.status(200).json({ success: true, message: message, completed: completed }); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - // route to check whether this site published to a claim - app.get('/api/claim/availability/:name', function (_ref11, res) { - var ip = _ref11.ip, - originalUrl = _ref11.originalUrl, - name = _ref11.params.name; - - var gaStartTime = Date.now(); - claimNameIsAvailable(name).then(function (result) { - res.status(200).json(result); - sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now()); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - // route to run a resolve request on the daemon - app.get('/api/claim/resolve/:name/:claimId', function (_ref12, res) { - var headers = _ref12.headers, - ip = _ref12.ip, - originalUrl = _ref12.originalUrl, - params = _ref12.params; - - resolveUri(params.name + '#' + params.claimId).then(function (resolvedUri) { - res.status(200).json(resolvedUri); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - // route to run a publish request on the daemon - app.post('/api/claim/publish', multipartMiddleware, function (_ref13, res) { - var body = _ref13.body, - files = _ref13.files, - headers = _ref13.headers, - ip = _ref13.ip, - originalUrl = _ref13.originalUrl, - user = _ref13.user; - - // define variables - var channelName = void 0, - channelId = void 0, - channelPassword = void 0, - description = void 0, - fileName = void 0, - filePath = void 0, - fileType = void 0, - gaStartTime = void 0, - license = void 0, - name = void 0, - nsfw = void 0, - thumbnail = void 0, - thumbnailFileName = void 0, - thumbnailFilePath = void 0, - thumbnailFileType = void 0, - title = void 0; - // record the start time of the request - gaStartTime = Date.now(); - // validate the body and files of the request - try { - var _parsePublishApiReque = parsePublishApiRequestBody(body); - // validateApiPublishRequest(body, files); - - - name = _parsePublishApiReque.name; - nsfw = _parsePublishApiReque.nsfw; - license = _parsePublishApiReque.license; - title = _parsePublishApiReque.title; - description = _parsePublishApiReque.description; - thumbnail = _parsePublishApiReque.thumbnail; - - var _parsePublishApiReque2 = parsePublishApiRequestFiles(files); - - fileName = _parsePublishApiReque2.fileName; - filePath = _parsePublishApiReque2.filePath; - fileType = _parsePublishApiReque2.fileType; - thumbnailFileName = _parsePublishApiReque2.thumbnailFileName; - thumbnailFilePath = _parsePublishApiReque2.thumbnailFilePath; - thumbnailFileType = _parsePublishApiReque2.thumbnailFileType; - channelName = body.channelName; - channelId = body.channelId; - channelPassword = body.channelPassword; - } catch (error) { - return res.status(400).json({ success: false, message: error.message }); - } - // check channel authorization - Promise.all([authenticateUser(channelName, channelId, channelPassword, user), claimNameIsAvailable(name), createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail), createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw)]).then(function (_ref14) { - var _ref15 = _slicedToArray(_ref14, 4), - _ref15$ = _ref15[0], - channelName = _ref15$.channelName, - channelClaimId = _ref15$.channelClaimId, - validatedClaimName = _ref15[1], - publishParams = _ref15[2], - thumbnailPublishParams = _ref15[3]; - - // add channel details to the publish params - if (channelName && channelClaimId) { - publishParams['channel_name'] = channelName; - publishParams['channel_id'] = channelClaimId; - } - // publish the thumbnail - if (thumbnailPublishParams) { - publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType); - } - // publish the asset - return publish(publishParams, fileName, fileType); - }).then(function (result) { - res.status(200).json({ - success: true, - message: 'publish completed successfully', - data: { - name: name, - claimId: result.claim_id, - url: host + '/' + result.claim_id + '/' + name, - lbryTx: result - } - }); - // record the publish end time and send to google analytics - sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now()); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - // route to get a short claim id from long claim Id - app.get('/api/claim/short-id/:longId/:name', function (_ref16, res) { - var ip = _ref16.ip, - originalUrl = _ref16.originalUrl, - body = _ref16.body, - params = _ref16.params; - - db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name).then(function (shortId) { - res.status(200).json({ success: true, data: shortId }); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - app.post('/api/claim/long-id', function (_ref17, res) { - var ip = _ref17.ip, - originalUrl = _ref17.originalUrl, - body = _ref17.body, - params = _ref17.params; - - logger.debug('body:', body); - var channelName = body.channelName; - var channelClaimId = body.channelClaimId; - var claimName = body.claimName; - var claimId = body.claimId; - getClaimId(channelName, channelClaimId, claimName, claimId).then(function (result) { - if (result === NO_CHANNEL) { - return res.status(404).json({ success: false, message: 'No matching channel could be found' }); - } - if (result === NO_CLAIM) { - return res.status(404).json({ success: false, message: 'No matching claim id could be found' }); - } - res.status(200).json({ success: true, data: result }); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - app.get('/api/claim/data/:claimName/:claimId', function (_ref18, res) { - var ip = _ref18.ip, - originalUrl = _ref18.originalUrl, - body = _ref18.body, - params = _ref18.params; - - var claimName = params.claimName; - var claimId = params.claimId; - if (claimId === 'none') claimId = null; - db.Claim.resolveClaim(claimName, claimId).then(function (claimInfo) { - if (!claimInfo) { - return res.status(404).json({ success: false, message: 'No claim could be found' }); - } - res.status(200).json({ success: true, data: claimInfo }); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); - // route to see if asset is available locally - app.get('/api/file/availability/:name/:claimId', function (_ref19, res) { - var ip = _ref19.ip, - originalUrl = _ref19.originalUrl, - params = _ref19.params; - - var name = params.name; - var claimId = params.claimId; - db.File.findOne({ where: { name: name, claimId: claimId } }).then(function (result) { - if (result) { - return res.status(200).json({ success: true, data: true }); - } - res.status(200).json({ success: true, data: false }); - }).catch(function (error) { - errorHandlers.handleErrorResponse(originalUrl, ip, error, res); - }); - }); -}; - -/***/ }), -/* 142 */ -/***/ (function(module, exports) { - -module.exports = require("connect-multiparty"); - -/***/ }), -/* 143 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -var logger = __webpack_require__(2); -var db = __webpack_require__(9); -var lbryApi = __webpack_require__(55); -var publishHelpers = __webpack_require__(97); - -var _require = __webpack_require__(3), - _require$publishing = _require.publishing, - primaryClaimAddress = _require$publishing.primaryClaimAddress, - additionalClaimAddresses = _require$publishing.additionalClaimAddresses; - -var Sequelize = __webpack_require__(95); -var Op = Sequelize.Op; - -module.exports = { - publish: function publish(publishParams, fileName, fileType) { - return new Promise(function (resolve, reject) { - var publishResults = void 0, - certificateId = void 0, - channelName = void 0; - // publish the file - return lbryApi.publishClaim(publishParams).then(function (tx) { - logger.info('Successfully published ' + publishParams.name + ' ' + fileName, tx); - publishResults = tx; - // get the channel information - if (publishParams.channel_name) { - logger.debug('this claim was published in channel: ' + publishParams.channel_name); - return db.Channel.findOne({ where: { channelName: publishParams.channel_name } }); - } else { - logger.debug('this claim was not published in a channel'); - return null; - } - }).then(function (channel) { - // set channel information - certificateId = null; - channelName = null; - if (channel) { - certificateId = channel.channelClaimId; - channelName = channel.channelName; - } - logger.debug('certificateId: ' + certificateId); - }).then(function () { - // create the File record - var fileRecord = { - name: publishParams.name, - claimId: publishResults.claim_id, - title: publishParams.metadata.title, - description: publishParams.metadata.description, - address: publishParams.claim_address, - outpoint: publishResults.txid + ':' + publishResults.nout, - height: 0, - fileName: fileName, - filePath: publishParams.file_path, - fileType: fileType, - nsfw: publishParams.metadata.nsfw - }; - // create the Claim record - var claimRecord = { - name: publishParams.name, - claimId: publishResults.claim_id, - title: publishParams.metadata.title, - description: publishParams.metadata.description, - address: publishParams.claim_address, - thumbnail: publishParams.metadata.thumbnail, - outpoint: publishResults.txid + ':' + publishResults.nout, - height: 0, - contentType: fileType, - nsfw: publishParams.metadata.nsfw, - amount: publishParams.bid, - certificateId: certificateId, - channelName: channelName - }; - // upsert criteria - var upsertCriteria = { - name: publishParams.name, - claimId: publishResults.claim_id - }; - // upsert the records - return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]); - }).then(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - file = _ref2[0], - claim = _ref2[1]; - - logger.debug('File and Claim records successfully created'); - return Promise.all([file.setClaim(claim), claim.setFile(file)]); - }).then(function () { - logger.debug('File and Claim records successfully associated'); - resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim; - }).catch(function (error) { - logger.error('PUBLISH ERROR', error); - publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file - reject(error); - }); - }); - }, - claimNameIsAvailable: function claimNameIsAvailable(name) { - var claimAddresses = additionalClaimAddresses || []; - claimAddresses.push(primaryClaimAddress); - // find any records where the name is used - return db.Claim.findAll({ - attributes: ['address'], - where: { - name: name, - address: _defineProperty({}, Op.or, claimAddresses) - } - }).then(function (result) { - if (result.length >= 1) { - throw new Error('That claim is already in use'); - }; - return name; - }).catch(function (error) { - throw error; - }); - }, - checkChannelAvailability: function checkChannelAvailability(name) { - return db.Channel.findAll({ - where: { channelName: name } - }).then(function (result) { - if (result.length >= 1) { - throw new Error('That channel has already been claimed'); - } - return name; - }).catch(function (error) { - throw error; - }); - } -}; - -/***/ }), -/* 144 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var db = __webpack_require__(9); -var logger = __webpack_require__(2); - -module.exports = { - authenticateUser: function authenticateUser(channelName, channelId, channelPassword, user) { - // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided - if (!channelName && !channelId) { - return { - channelName: null, - channelClaimId: null - }; - } - // case: channelName or channel Id are provided with user token - if (user) { - if (channelName && channelName !== user.channelName) { - throw new Error('the provided channel name does not match user credentials'); - } - if (channelId && channelId !== user.channelClaimId) { - throw new Error('the provided channel id does not match user credentials'); - } - return { - channelName: user.channelName, - channelClaimId: user.channelClaimId - }; - } - // case: channelName or channel Id are provided with password instead of user token - if (!channelPassword) throw new Error('no channel password provided'); - return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword); - }, - authenticateChannelCredentials: function authenticateChannelCredentials(channelName, channelId, userPassword) { - return new Promise(function (resolve, reject) { - // hoisted variables - var channelData = void 0; - // build the params for finding the channel - var channelFindParams = {}; - if (channelName) channelFindParams['channelName'] = channelName; - if (channelId) channelFindParams['channelClaimId'] = channelId; - // find the channel - db.Channel.findOne({ - where: channelFindParams - }).then(function (channel) { - if (!channel) { - logger.debug('no channel found'); - throw new Error('Authentication failed, you do not have access to that channel'); - } - channelData = channel.get(); - logger.debug('channel data:', channelData); - return db.User.findOne({ - where: { userName: channelData.channelName.substring(1) } - }); - }).then(function (user) { - if (!user) { - logger.debug('no user found'); - throw new Error('Authentication failed, you do not have access to that channel'); - } - return user.comparePassword(userPassword); - }).then(function (isMatch) { - if (!isMatch) { - logger.debug('incorrect password'); - throw new Error('Authentication failed, you do not have access to that channel'); - } - logger.debug('...password was a match...'); - resolve(channelData); - }).catch(function (error) { - reject(error); - }); - }); - } -}; - -/***/ }), -/* 145 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var CLAIMS_PER_PAGE = 12; - -module.exports = { - returnPaginatedChannelClaims: function returnPaginatedChannelClaims(channelName, longChannelClaimId, claims, page) { - var totalPages = module.exports.determineTotalPages(claims); - var paginationPage = module.exports.getPageFromQuery(page); - var viewData = { - channelName: channelName, - longChannelClaimId: longChannelClaimId, - claims: module.exports.extractPageFromClaims(claims, paginationPage), - previousPage: module.exports.determinePreviousPage(paginationPage), - currentPage: paginationPage, - nextPage: module.exports.determineNextPage(totalPages, paginationPage), - totalPages: totalPages, - totalResults: module.exports.determineTotalClaims(claims) - }; - return viewData; - }, - getPageFromQuery: function getPageFromQuery(page) { - if (page) { - return parseInt(page); - } - return 1; - }, - extractPageFromClaims: function extractPageFromClaims(claims, pageNumber) { - if (!claims) { - return []; // if no claims, return this default - } - // logger.debug('claims is array?', Array.isArray(claims)); - // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber)); - var claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE; - var claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE; - var pageOfClaims = claims.slice(claimStartIndex, claimEndIndex); - return pageOfClaims; - }, - determineTotalPages: function determineTotalPages(claims) { - if (!claims) { - return 0; - } else { - var totalClaims = claims.length; - if (totalClaims < CLAIMS_PER_PAGE) { - return 1; - } - var fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE); - var remainder = totalClaims % CLAIMS_PER_PAGE; - if (remainder === 0) { - return fullPages; - } - return fullPages + 1; - } - }, - determinePreviousPage: function determinePreviousPage(currentPage) { - if (currentPage === 1) { - return null; - } - return currentPage - 1; - }, - determineNextPage: function determineNextPage(totalPages, currentPage) { - if (currentPage === totalPages) { - return null; - } - return currentPage + 1; - }, - determineTotalClaims: function determineTotalClaims(claims) { - if (!claims) { - return 0; - } - return claims.length; - } -}; - -/***/ }), -/* 146 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _require = __webpack_require__(3), - host = _require.details; - -var handlePageRender = __webpack_require__(101); - -module.exports = function (app) { - // route for the home page - app.get('/', function (req, res) { - handlePageRender(req, res); - }); - // route to display login page - app.get('/login', function (req, res) { - handlePageRender(req, res); - }); - // route to show 'about' page - app.get('/about', function (req, res) { - handlePageRender(req, res); - }); - // route to display a list of the trending images - app.get('/trending', function (req, res) { - res.status(301).redirect('/popular'); - }); - app.get('/popular', function (req, res) { - handlePageRender(req, res); - }); - // route to display a list of the trending images - app.get('/new', function (req, res) { - handlePageRender(req, res); - }); - // route to send embedable video player (for twitter) - app.get('/embed/:claimId/:name', function (_ref, res) { - var params = _ref.params; - - var claimId = params.claimId; - var name = params.name; - // get and render the content - res.status(200).render('embed', { layout: 'embed', host: host, claimId: claimId, name: name }); - }); -}; - -/***/ }), -/* 147 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function () { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; - var action = arguments[1]; - - switch (action.type) { - case actions.FILE_SELECTED: - return Object.assign({}, initialState, { // note: clears to initial state - file: action.data - }); - case actions.FILE_CLEAR: - return initialState; - case actions.METADATA_UPDATE: - return Object.assign({}, state, { - metadata: Object.assign({}, state.metadata, _defineProperty({}, action.data.name, action.data.value)) - }); - case actions.CLAIM_UPDATE: - return Object.assign({}, state, { - claim: action.data - }); - case actions.SET_PUBLISH_IN_CHANNEL: - return Object.assign({}, state, { - publishInChannel: action.channel - }); - case actions.PUBLISH_STATUS_UPDATE: - return Object.assign({}, state, { - status: action.data - }); - case actions.ERROR_UPDATE: - return Object.assign({}, state, { - error: Object.assign({}, state.error, _defineProperty({}, action.data.name, action.data.value)) - }); - case actions.SELECTED_CHANNEL_UPDATE: - return Object.assign({}, state, { - selectedChannel: action.data - }); - case actions.TOGGLE_METADATA_INPUTS: - return Object.assign({}, state, { - showMetadataInputs: action.data - }); - case actions.THUMBNAIL_NEW: - return Object.assign({}, state, { - thumbnail: action.data - }); - default: - return state; - } -}; - -var _publish_action_types = __webpack_require__(104); - -var actions = _interopRequireWildcard(_publish_action_types); - -var _publish_channel_select_states = __webpack_require__(105); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -var _require = __webpack_require__(3), - publishing = _require.publishing; - -var initialState = { - disabled: publishing.disabled, - disabledMessage: publishing.disabledMessage, - publishInChannel: false, - selectedChannel: _publish_channel_select_states.LOGIN, - showMetadataInputs: false, - status: { - status: null, - message: null - }, - error: { - file: null, - url: null, - channel: null, - publishSubmit: null - }, - file: null, - claim: '', - metadata: { - title: '', - description: '', - license: '', - nsfw: false - }, - thumbnail: null -}; - -/***/ }), -/* 148 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function () { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; - var action = arguments[1]; - - switch (action.type) { - case actions.CHANNEL_UPDATE: - return Object.assign({}, state, { - loggedInChannel: action.data - }); - default: - return state; - } -}; - -var _channel_action_types = __webpack_require__(106); - -var actions = _interopRequireWildcard(_channel_action_types); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -var initialState = { - loggedInChannel: { - name: null, - shortId: null, - longId: null - } -}; - -/***/ }), -/* 149 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function () { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; - var action = arguments[1]; - - switch (action.type) { - // handle request - case actions.REQUEST_ERROR: - return Object.assign({}, state, { - request: Object.assign({}, state.request, { - error: action.data - }) - }); - case actions.REQUEST_UPDATE: - return Object.assign({}, state, { - request: Object.assign({}, state.request, { - type: action.data.requestType, - id: action.data.requestId - }) - }); - // store requests - case actions.REQUEST_LIST_ADD: - return Object.assign({}, state, { - requestList: Object.assign({}, state.requestList, _defineProperty({}, action.data.id, { - error: action.data.error, - key: action.data.key - })) - }); - // asset data - case actions.ASSET_ADD: - return Object.assign({}, state, { - assetList: Object.assign({}, state.assetList, _defineProperty({}, action.data.id, { - error: action.data.error, - name: action.data.name, - claimId: action.data.claimId, - shortId: action.data.shortId, - claimData: action.data.claimData - })) - }); - // channel data - case actions.CHANNEL_ADD: - return Object.assign({}, state, { - channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.id, { - name: action.data.name, - longId: action.data.longId, - shortId: action.data.shortId, - claimsData: action.data.claimsData - })) - }); - case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS: - return Object.assign({}, state, { - channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.channelListId, Object.assign({}, state.channelList[action.data.channelListId], { - claimsData: action.data.claimsData - }))) - }); - // display an asset - case actions.FILE_AVAILABILITY_UPDATE: - return Object.assign({}, state, { - displayAsset: Object.assign({}, state.displayAsset, { - status: action.data - }) - }); - case actions.DISPLAY_ASSET_ERROR: - return Object.assign({}, state, { - displayAsset: Object.assign({}, state.displayAsset, { - error: action.data, - status: _asset_display_states.ERROR - }) - }); - default: - return state; - } -}; - -var _show_action_types = __webpack_require__(19); - -var actions = _interopRequireWildcard(_show_action_types); - -var _asset_display_states = __webpack_require__(107); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -var initialState = { - request: { - error: null, - type: null, - id: null - }, - requestList: {}, - channelList: {}, - assetList: {}, - displayAsset: { - error: null, - status: _asset_display_states.LOCAL_CHECK - } -}; - -/***/ }), -/* 150 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function () { - var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; - var action = arguments[1]; - - switch (action.type) { - default: - return state; - } -}; - -var siteConfig = __webpack_require__(3); - -var googleAnalyticsId = siteConfig.analytics.googleId, - _siteConfig$assetDefa = siteConfig.assetDefaults, - defaultThumbnail = _siteConfig$assetDefa.thumbnail, - defaultDescription = _siteConfig$assetDefa.description, - _siteConfig$details = siteConfig.details, - description = _siteConfig$details.description, - host = _siteConfig$details.host, - title = _siteConfig$details.title, - twitter = _siteConfig$details.twitter; - - -var initialState = { - description: description, - googleAnalyticsId: googleAnalyticsId, - host: host, - title: title, - twitter: twitter, - defaultDescription: defaultDescription, - defaultThumbnail: defaultThumbnail -}; - -/***/ }), -/* 151 */ -/***/ (function(module, exports) { - -module.exports = require("react-ga"); - -/***/ }), -/* 152 */ -/***/ (function(module, exports) { - -module.exports = require("cross-fetch/polyfill"); - -/***/ }), -/* 153 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _require = __webpack_require__(56), - sendGAServeEvent = _require.sendGAServeEvent; - -var _require2 = __webpack_require__(154), - determineResponseType = _require2.determineResponseType, - flipClaimNameAndIdForBackwardsCompatibility = _require2.flipClaimNameAndIdForBackwardsCompatibility, - logRequestData = _require2.logRequestData, - getClaimIdAndServeAsset = _require2.getClaimIdAndServeAsset; - -var lbryUri = __webpack_require__(155); -var handleShowRender = __webpack_require__(156); -var SERVE = 'SERVE'; - -module.exports = function (app) { - // route to serve a specific asset using the channel or claim id - app.get('/:identifier/:claim', function (req, res) { - var headers = req.headers, - ip = req.ip, - originalUrl = req.originalUrl, - params = req.params; - // decide if this is a show request - - var hasFileExtension = void 0; - try { - var _lbryUri$parseModifie = lbryUri.parseModifier(params.claim); - - hasFileExtension = _lbryUri$parseModifie.hasFileExtension; - } catch (error) { - return res.status(400).json({ success: false, message: error.message }); - } - var responseType = determineResponseType(hasFileExtension, headers); - if (responseType !== SERVE) { - return handleShowRender(req, res); - } - // handle serve request - // send google analytics - sendGAServeEvent(headers, ip, originalUrl); - // parse the claim - var claimName = void 0; - try { - var _lbryUri$parseClaim = lbryUri.parseClaim(params.claim); - - claimName = _lbryUri$parseClaim.claimName; - } catch (error) { - return res.status(400).json({ success: false, message: error.message }); - } - // parse the identifier - var isChannel = void 0, - channelName = void 0, - channelClaimId = void 0, - claimId = void 0; - try { - var _lbryUri$parseIdentif = lbryUri.parseIdentifier(params.identifier); - - isChannel = _lbryUri$parseIdentif.isChannel; - channelName = _lbryUri$parseIdentif.channelName; - channelClaimId = _lbryUri$parseIdentif.channelClaimId; - claimId = _lbryUri$parseIdentif.claimId; - } catch (error) { - return res.status(400).json({ success: false, message: error.message }); - } - if (!isChannel) { - var _flipClaimNameAndIdFo = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName); - - var _flipClaimNameAndIdFo2 = _slicedToArray(_flipClaimNameAndIdFo, 2); - - claimId = _flipClaimNameAndIdFo2[0]; - claimName = _flipClaimNameAndIdFo2[1]; - } - // log the request data for debugging - logRequestData(responseType, claimName, channelName, claimId); - // get the claim Id and then serve the asset - getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res); - }); - // route to serve the winning asset at a claim or a channel page - app.get('/:claim', function (req, res) { - var headers = req.headers, - ip = req.ip, - originalUrl = req.originalUrl, - params = req.params; - // decide if this is a show request - - var hasFileExtension = void 0; - try { - var _lbryUri$parseModifie2 = lbryUri.parseModifier(params.claim); - - hasFileExtension = _lbryUri$parseModifie2.hasFileExtension; - } catch (error) { - return res.status(400).json({ success: false, message: error.message }); - } - var responseType = determineResponseType(hasFileExtension, headers); - if (responseType !== SERVE) { - return handleShowRender(req, res); - } - // handle serve request - // send google analytics - sendGAServeEvent(headers, ip, originalUrl); - // parse the claim - var claimName = void 0; - try { - var _lbryUri$parseClaim2 = lbryUri.parseClaim(params.claim); - - claimName = _lbryUri$parseClaim2.claimName; - } catch (error) { - return res.status(400).json({ success: false, message: error.message }); - } - // log the request data for debugging - logRequestData(responseType, claimName, null, null); - // get the claim Id and then serve the asset - getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res); - }); -}; - -/***/ }), -/* 154 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var logger = __webpack_require__(2); - -var _require = __webpack_require__(100), - getClaimId = _require.getClaimId, - getLocalFileRecord = _require.getLocalFileRecord; - -var _require2 = __webpack_require__(99), - handleErrorResponse = _require2.handleErrorResponse; - -var SERVE = 'SERVE'; -var SHOW = 'SHOW'; -var NO_FILE = 'NO_FILE'; -var NO_CHANNEL = 'NO_CHANNEL'; -var NO_CLAIM = 'NO_CLAIM'; - -function clientAcceptsHtml(_ref) { - var accept = _ref.accept; - - return accept && accept.match(/text\/html/); -}; - -function requestIsFromBrowser(headers) { - return headers['user-agent'] && headers['user-agent'].match(/Mozilla/); -}; - -function clientWantsAsset(_ref2) { - var accept = _ref2.accept, - range = _ref2.range; - - var imageIsWanted = accept && accept.match(/image\/.*/) && !accept.match(/text\/html/) && !accept.match(/text\/\*/); - var videoIsWanted = accept && range; - return imageIsWanted || videoIsWanted; -}; - -function isValidClaimId(claimId) { - return claimId.length === 40 && !/[^A-Za-z0-9]/g.test(claimId); -}; - -function isValidShortId(claimId) { - return claimId.length === 1; // it should really evaluate the short url itself -}; - -function isValidShortIdOrClaimId(input) { - return isValidClaimId(input) || isValidShortId(input); -}; - -function serveAssetToClient(claimId, name, res) { - return getLocalFileRecord(claimId, name).then(function (fileRecord) { - // check that a local record was found - if (fileRecord === NO_FILE) { - return res.status(307).redirect('/api/claim/get/' + name + '/' + claimId); - } - // serve the file - var filePath = fileRecord.filePath, - fileType = fileRecord.fileType; - - logger.verbose('serving file: ' + filePath); - var sendFileOptions = { - headers: { - 'X-Content-Type-Options': 'nosniff', - 'Content-Type': fileType || 'image/jpeg' - } - }; - res.status(200).sendFile(filePath, sendFileOptions); - }).catch(function (error) { - throw error; - }); -}; - -module.exports = { - getClaimIdAndServeAsset: function getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) { - // get the claim Id and then serve the asset - getClaimId(channelName, channelClaimId, claimName, claimId).then(function (fullClaimId) { - if (fullClaimId === NO_CLAIM) { - return res.status(404).json({ success: false, message: 'no claim id could be found' }); - } else if (fullClaimId === NO_CHANNEL) { - return res.status(404).json({ success: false, message: 'no channel id could be found' }); - } - serveAssetToClient(fullClaimId, claimName, res); - // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success'); - }).catch(function (error) { - handleErrorResponse(originalUrl, ip, error, res); - // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail'); - }); - }, - determineResponseType: function determineResponseType(hasFileExtension, headers) { - var responseType = void 0; - if (hasFileExtension) { - responseType = SERVE; // assume a serve request if file extension is present - if (clientAcceptsHtml(headers)) { - // if the request comes from a browser, change it to a show request - responseType = SHOW; - } - } else { - responseType = SHOW; - if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) { - // this is in case someone embeds a show url - logger.debug('Show request came from browser but wants an image/video. Changing response to serve...'); - responseType = SERVE; - } - } - return responseType; - }, - flipClaimNameAndIdForBackwardsCompatibility: function flipClaimNameAndIdForBackwardsCompatibility(identifier, name) { - // this is a patch for backwards compatability with '/name/claim_id' url format - if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) { - var tempName = name; - name = identifier; - identifier = tempName; - } - return [identifier, name]; - }, - logRequestData: function logRequestData(responseType, claimName, channelName, claimId) { - logger.debug('responseType ===', responseType); - logger.debug('claim name === ', claimName); - logger.debug('channel name ===', channelName); - logger.debug('claim id ===', claimId); - } -}; - -/***/ }), -/* 155 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var logger = __webpack_require__(2); - -module.exports = { - REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g, - REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g, - REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/, - CHANNEL_CHAR: '@', - parseIdentifier: function parseIdentifier(identifier) { - logger.debug('parsing identifier:', identifier); - var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end) - '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) - ); - - var _componentsRegex$exec = componentsRegex.exec(identifier).map(function (match) { - return match || null; - }), - _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4), - proto = _componentsRegex$exec2[0], - value = _componentsRegex$exec2[1], - modifierSeperator = _componentsRegex$exec2[2], - modifier = _componentsRegex$exec2[3]; - - logger.debug(proto + ', ' + value + ', ' + modifierSeperator + ', ' + modifier); - - // Validate and process name - if (!value) { - throw new Error('Check your url. No channel name provided before "' + modifierSeperator + '"'); - } - var isChannel = value.startsWith(module.exports.CHANNEL_CHAR); - var channelName = isChannel ? value : null; - var claimId = void 0; - if (isChannel) { - if (!channelName) { - throw new Error('No channel name after @.'); - } - var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL); - if (nameBadChars) { - throw new Error('Invalid characters in channel name: ' + nameBadChars.join(', ') + '.'); - } - } else { - claimId = value; - } - - // Validate and process modifier - var channelClaimId = void 0; - if (modifierSeperator) { - if (!modifier) { - throw new Error('No modifier provided after separator "' + modifierSeperator + '"'); - } - - if (modifierSeperator === ':') { - channelClaimId = modifier; - } else { - throw new Error('The "' + modifierSeperator + '" modifier is not currently supported'); - } - } - return { - isChannel: isChannel, - channelName: channelName, - channelClaimId: channelClaimId, - claimId: claimId - }; - }, - parseClaim: function parseClaim(claim) { - logger.debug('parsing name:', claim); - var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier) - '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) - ); - - var _componentsRegex$exec3 = componentsRegex.exec(claim).map(function (match) { - return match || null; - }), - _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4), - proto = _componentsRegex$exec4[0], - claimName = _componentsRegex$exec4[1], - modifierSeperator = _componentsRegex$exec4[2], - modifier = _componentsRegex$exec4[3]; - - logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier); - - // Validate and process name - if (!claimName) { - throw new Error('No claim name provided before .'); - } - var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM); - if (nameBadChars) { - throw new Error('Invalid characters in claim name: ' + nameBadChars.join(', ') + '.'); - } - // Validate and process modifier - if (modifierSeperator) { - if (!modifier) { - throw new Error('No file extension provided after separator ' + modifierSeperator + '.'); - } - if (modifierSeperator !== '.') { - throw new Error('The ' + modifierSeperator + ' modifier is not supported in the claim name'); - } - } - // return results - return { - claimName: claimName - }; - }, - parseModifier: function parseModifier(claim) { - logger.debug('parsing modifier:', claim); - var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier) - '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end) - ); - - var _componentsRegex$exec5 = componentsRegex.exec(claim).map(function (match) { - return match || null; - }), - _componentsRegex$exec6 = _slicedToArray(_componentsRegex$exec5, 4), - proto = _componentsRegex$exec6[0], - claimName = _componentsRegex$exec6[1], - modifierSeperator = _componentsRegex$exec6[2], - modifier = _componentsRegex$exec6[3]; - - logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier); - // Validate and process modifier - var hasFileExtension = false; - if (modifierSeperator) { - hasFileExtension = true; - } - return { - hasFileExtension: hasFileExtension - }; - } -}; - -/***/ }), -/* 156 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _react = __webpack_require__(0); - -var _react2 = _interopRequireDefault(_react); - -var _server = __webpack_require__(102); - -var _redux = __webpack_require__(57); - -var _index = __webpack_require__(103); - -var _index2 = _interopRequireDefault(_index); - -var _reactRedux = __webpack_require__(1); - -var _reactRouterDom = __webpack_require__(4); - -var _index3 = __webpack_require__(13); - -var _index4 = _interopRequireDefault(_index3); - -var _app = __webpack_require__(108); - -var _app2 = _interopRequireDefault(_app); - -var _renderFullPage = __webpack_require__(113); - -var _renderFullPage2 = _interopRequireDefault(_renderFullPage); - -var _reduxSaga = __webpack_require__(157); - -var _reduxSaga2 = _interopRequireDefault(_reduxSaga); - -var _effects = __webpack_require__(49); - -var _show_uri = __webpack_require__(158); - -var _show = __webpack_require__(11); - -var _reactHelmet = __webpack_require__(48); - -var _reactHelmet2 = _interopRequireDefault(_reactHelmet); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var returnSagaWithParams = function returnSagaWithParams(saga, params) { - return (/*#__PURE__*/regeneratorRuntime.mark(function _callee() { - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return (0, _effects.call)(saga, params); - - case 2: - case 'end': - return _context.stop(); - } - } - }, _callee, this); - }) - ); -}; - -module.exports = function (req, res) { - var context = {}; - - // create and apply middleware - var sagaMiddleware = (0, _reduxSaga2.default)(); - var middleware = (0, _redux.applyMiddleware)(sagaMiddleware); - - // create a new Redux store instance - var store = (0, _redux.createStore)(_index2.default, middleware); - - // create saga - var action = (0, _show.onHandleShowPageUri)(req.params); - var saga = returnSagaWithParams(_show_uri.handleShowPageUri, action); - - // run the saga middleware - sagaMiddleware.run(saga).done.then(function () { - // render component to a string - var html = (0, _server.renderToString)(_react2.default.createElement( - _reactRedux.Provider, - { store: store }, - _react2.default.createElement( - _reactRouterDom.StaticRouter, - { location: req.url, context: context }, - _react2.default.createElement( - _index4.default, - null, - _react2.default.createElement(_app2.default, null) - ) - ) - )); - - // get head tags from helmet - var helmet = _reactHelmet2.default.renderStatic(); - - // check for a redirect - if (context.url) { - return res.redirect(301, context.url); - } - - // get the initial state from our Redux store - var preloadedState = store.getState(); - - // send the rendered page back to the client - res.send((0, _renderFullPage2.default)(helmet, html, preloadedState)); - }); -}; - -/***/ }), -/* 157 */ -/***/ (function(module, exports) { - -module.exports = require("redux-saga"); - -/***/ }), -/* 158 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.handleShowPageUri = handleShowPageUri; -exports.watchHandleShowPageUri = watchHandleShowPageUri; - -var _effects = __webpack_require__(49); - -var _show_action_types = __webpack_require__(19); - -var actions = _interopRequireWildcard(_show_action_types); - -var _show = __webpack_require__(11); - -var _show_asset = __webpack_require__(159); - -var _show_channel = __webpack_require__(161); - -var _lbryUri = __webpack_require__(61); - -var _lbryUri2 = _interopRequireDefault(_lbryUri); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -var _marked = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateIdentifierAndClaim), - _marked2 = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateClaimOnly), - _marked3 = /*#__PURE__*/regeneratorRuntime.mark(handleShowPageUri), - _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchHandleShowPageUri); - -function parseAndUpdateIdentifierAndClaim(modifier, claim) { - var isChannel, channelName, channelClaimId, claimId, claimName, extension, _lbryUri$parseIdentif, _lbryUri$parseClaim; - - return regeneratorRuntime.wrap(function parseAndUpdateIdentifierAndClaim$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - // this is a request for an asset - // claim will be an asset claim - // the identifier could be a channel or a claim id - isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0, claimName = void 0, extension = void 0; - _context.prev = 1; - _lbryUri$parseIdentif = _lbryUri2.default.parseIdentifier(modifier); - isChannel = _lbryUri$parseIdentif.isChannel; - channelName = _lbryUri$parseIdentif.channelName; - channelClaimId = _lbryUri$parseIdentif.channelClaimId; - claimId = _lbryUri$parseIdentif.claimId; - _lbryUri$parseClaim = _lbryUri2.default.parseClaim(claim); - claimName = _lbryUri$parseClaim.claimName; - extension = _lbryUri$parseClaim.extension; - _context.next = 17; - break; - - case 12: - _context.prev = 12; - _context.t0 = _context['catch'](1); - _context.next = 16; - return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); - - case 16: - return _context.abrupt('return', _context.sent); - - case 17: - if (!isChannel) { - _context.next = 21; - break; - } - - _context.next = 20; - return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, channelName, channelClaimId, extension)); - - case 20: - return _context.abrupt('return', _context.sent); - - case 21: - ; - _context.next = 24; - return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, claimId, null, null, extension)); - - case 24: - case 'end': - return _context.stop(); - } - } - }, _marked, this, [[1, 12]]); -} -function parseAndUpdateClaimOnly(claim) { - var isChannel, channelName, channelClaimId, _lbryUri$parseIdentif2, claimName, extension, _lbryUri$parseClaim2; - - return regeneratorRuntime.wrap(function parseAndUpdateClaimOnly$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - // this could be a request for an asset or a channel page - // claim could be an asset claim or a channel claim - isChannel = void 0, channelName = void 0, channelClaimId = void 0; - _context2.prev = 1; - _lbryUri$parseIdentif2 = _lbryUri2.default.parseIdentifier(claim); - isChannel = _lbryUri$parseIdentif2.isChannel; - channelName = _lbryUri$parseIdentif2.channelName; - channelClaimId = _lbryUri$parseIdentif2.channelClaimId; - _context2.next = 13; - break; - - case 8: - _context2.prev = 8; - _context2.t0 = _context2['catch'](1); - _context2.next = 12; - return (0, _effects.put)((0, _show.onRequestError)(_context2.t0.message)); - - case 12: - return _context2.abrupt('return', _context2.sent); - - case 13: - if (!isChannel) { - _context2.next = 17; - break; - } - - _context2.next = 16; - return (0, _effects.call)(_show_channel.newChannelRequest, (0, _show.onNewChannelRequest)(channelName, channelClaimId)); - - case 16: - return _context2.abrupt('return', _context2.sent); - - case 17: - // if not for a channel, parse the claim request - claimName = void 0, extension = void 0; - _context2.prev = 18; - _lbryUri$parseClaim2 = _lbryUri2.default.parseClaim(claim); - claimName = _lbryUri$parseClaim2.claimName; - extension = _lbryUri$parseClaim2.extension; - _context2.next = 29; - break; - - case 24: - _context2.prev = 24; - _context2.t1 = _context2['catch'](18); - _context2.next = 28; - return (0, _effects.put)((0, _show.onRequestError)(_context2.t1.message)); - - case 28: - return _context2.abrupt('return', _context2.sent); - - case 29: - _context2.next = 31; - return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, null, null, extension)); - - case 31: - case 'end': - return _context2.stop(); - } - } - }, _marked2, this, [[1, 8], [18, 24]]); -} - -function handleShowPageUri(action) { - var _action$data, identifier, claim; - - return regeneratorRuntime.wrap(function handleShowPageUri$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - _action$data = action.data, identifier = _action$data.identifier, claim = _action$data.claim; - - if (!identifier) { - _context3.next = 5; - break; - } - - _context3.next = 4; - return (0, _effects.call)(parseAndUpdateIdentifierAndClaim, identifier, claim); - - case 4: - return _context3.abrupt('return', _context3.sent); - - case 5: - _context3.next = 7; - return (0, _effects.call)(parseAndUpdateClaimOnly, claim); - - case 7: - case 'end': - return _context3.stop(); - } - } - }, _marked3, this); -}; - -function watchHandleShowPageUri() { - return regeneratorRuntime.wrap(function watchHandleShowPageUri$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - _context4.next = 2; - return (0, _effects.takeLatest)(actions.HANDLE_SHOW_URI, handleShowPageUri); - - case 2: - case 'end': - return _context4.stop(); - } - } - }, _marked4, this); -}; - -/***/ }), -/* 159 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.newAssetRequest = newAssetRequest; -exports.watchNewAssetRequest = watchNewAssetRequest; - -var _effects = __webpack_require__(49); - -var _show_action_types = __webpack_require__(19); - -var actions = _interopRequireWildcard(_show_action_types); - -var _show = __webpack_require__(11); - -var _assetApi = __webpack_require__(160); - -var _show2 = __webpack_require__(28); - -var _site = __webpack_require__(114); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -var _marked = /*#__PURE__*/regeneratorRuntime.mark(newAssetRequest), - _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewAssetRequest); - -function newAssetRequest(action) { - var _action$data, requestType, requestId, name, modifier, state, host, longId, _ref, assetKey, shortId, _ref2, claimData, _ref3; - - return regeneratorRuntime.wrap(function newAssetRequest$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, name = _action$data.name, modifier = _action$data.modifier; - // put an action to update the request in redux - - _context.next = 3; - return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId)); - - case 3: - _context.next = 5; - return (0, _effects.select)(_show2.selectShowState); - - case 5: - state = _context.sent; - _context.next = 8; - return (0, _effects.select)(_site.selectSiteHost); - - case 8: - host = _context.sent; - - if (!state.requestList[requestId]) { - _context.next = 11; - break; - } - - return _context.abrupt('return', null); - - case 11: - // get long id && add request to request list - longId = void 0; - _context.prev = 12; - _context.next = 15; - return (0, _effects.call)(_assetApi.getLongClaimId, host, name, modifier); - - case 15: - _ref = _context.sent; - longId = _ref.data; - _context.next = 24; - break; - - case 19: - _context.prev = 19; - _context.t0 = _context['catch'](12); - _context.next = 23; - return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); - - case 23: - return _context.abrupt('return', _context.sent); - - case 24: - assetKey = 'a#' + name + '#' + longId; - _context.next = 27; - return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, assetKey)); - - case 27: - if (!state.assetList[assetKey]) { - _context.next = 29; - break; - } - - return _context.abrupt('return', null); - - case 29: - // get short Id - shortId = void 0; - _context.prev = 30; - _context.next = 33; - return (0, _effects.call)(_assetApi.getShortId, host, name, longId); - - case 33: - _ref2 = _context.sent; - shortId = _ref2.data; - _context.next = 42; - break; - - case 37: - _context.prev = 37; - _context.t1 = _context['catch'](30); - _context.next = 41; - return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message)); - - case 41: - return _context.abrupt('return', _context.sent); - - case 42: - // get asset claim data - claimData = void 0; - _context.prev = 43; - _context.next = 46; - return (0, _effects.call)(_assetApi.getClaimData, host, name, longId); - - case 46: - _ref3 = _context.sent; - claimData = _ref3.data; - _context.next = 55; - break; - - case 50: - _context.prev = 50; - _context.t2 = _context['catch'](43); - _context.next = 54; - return (0, _effects.put)((0, _show.onRequestError)(_context.t2.message)); - - case 54: - return _context.abrupt('return', _context.sent); - - case 55: - _context.next = 57; - return (0, _effects.put)((0, _show.addAssetToAssetList)(assetKey, null, name, longId, shortId, claimData)); - - case 57: - _context.next = 59; - return (0, _effects.put)((0, _show.onRequestError)(null)); - - case 59: - case 'end': - return _context.stop(); - } - } - }, _marked, this, [[12, 19], [30, 37], [43, 50]]); -}; - -function watchNewAssetRequest() { - return regeneratorRuntime.wrap(function watchNewAssetRequest$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return (0, _effects.takeLatest)(actions.ASSET_REQUEST_NEW, newAssetRequest); - - case 2: - case 'end': - return _context2.stop(); - } - } - }, _marked2, this); -}; - -/***/ }), -/* 160 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.getLongClaimId = getLongClaimId; -exports.getShortId = getShortId; -exports.getClaimData = getClaimData; - -var _request = __webpack_require__(8); - -var _request2 = _interopRequireDefault(_request); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function getLongClaimId(host, name, modifier) { - var body = {}; - // create request params - if (modifier) { - if (modifier.id) { - body['claimId'] = modifier.id; - } else { - body['channelName'] = modifier.channel.name; - body['channelClaimId'] = modifier.channel.id; - } - } - body['claimName'] = name; - var params = { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body) - }; - // create url - var url = host + '/api/claim/long-id'; - // return the request promise - return (0, _request2.default)(url, params); -}; - -function getShortId(host, name, claimId) { - var url = host + '/api/claim/short-id/' + claimId + '/' + name; - return (0, _request2.default)(url); -}; - -function getClaimData(host, name, claimId) { - var url = host + '/api/claim/data/' + name + '/' + claimId; - return (0, _request2.default)(url); -}; - -/***/ }), -/* 161 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.newChannelRequest = newChannelRequest; -exports.watchNewChannelRequest = watchNewChannelRequest; -exports.watchUpdateChannelClaims = watchUpdateChannelClaims; - -var _effects = __webpack_require__(49); - -var _show_action_types = __webpack_require__(19); - -var actions = _interopRequireWildcard(_show_action_types); - -var _show = __webpack_require__(11); - -var _channelApi = __webpack_require__(162); - -var _show2 = __webpack_require__(28); - -var _site = __webpack_require__(114); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -var _marked = /*#__PURE__*/regeneratorRuntime.mark(newChannelRequest), - _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewChannelRequest), - _marked3 = /*#__PURE__*/regeneratorRuntime.mark(getNewClaimsAndUpdateChannel), - _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchUpdateChannelClaims); - -function newChannelRequest(action) { - var _action$data, requestType, requestId, channelName, channelId, state, host, longId, shortId, _ref, _ref$data, channelKey, claimsData, _ref2; - - return regeneratorRuntime.wrap(function newChannelRequest$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, channelName = _action$data.channelName, channelId = _action$data.channelId; - // put an action to update the request in redux - - _context.next = 3; - return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId)); - - case 3: - _context.next = 5; - return (0, _effects.select)(_show2.selectShowState); - - case 5: - state = _context.sent; - _context.next = 8; - return (0, _effects.select)(_site.selectSiteHost); - - case 8: - host = _context.sent; - - if (!state.requestList[requestId]) { - _context.next = 11; - break; - } - - return _context.abrupt('return', null); - - case 11: - // get channel long id - longId = void 0, shortId = void 0; - _context.prev = 12; - _context.next = 15; - return (0, _effects.call)(_channelApi.getChannelData, host, channelName, channelId); - - case 15: - _ref = _context.sent; - _ref$data = _ref.data; - longId = _ref$data.longChannelClaimId; - shortId = _ref$data.shortChannelClaimId; - _context.next = 26; - break; - - case 21: - _context.prev = 21; - _context.t0 = _context['catch'](12); - _context.next = 25; - return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message)); - - case 25: - return _context.abrupt('return', _context.sent); - - case 26: - // store the request in the channel requests list - channelKey = 'c#' + channelName + '#' + longId; - _context.next = 29; - return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, channelKey)); - - case 29: - if (!state.channelList[channelKey]) { - _context.next = 31; - break; - } - - return _context.abrupt('return', null); - - case 31: - // get channel claims data - claimsData = void 0; - _context.prev = 32; - _context.next = 35; - return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, channelName, 1); - - case 35: - _ref2 = _context.sent; - claimsData = _ref2.data; - _context.next = 44; - break; - - case 39: - _context.prev = 39; - _context.t1 = _context['catch'](32); - _context.next = 43; - return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message)); - - case 43: - return _context.abrupt('return', _context.sent); - - case 44: - _context.next = 46; - return (0, _effects.put)((0, _show.addNewChannelToChannelList)(channelKey, channelName, shortId, longId, claimsData)); - - case 46: - _context.next = 48; - return (0, _effects.put)((0, _show.onRequestError)(null)); - - case 48: - case 'end': - return _context.stop(); - } - } - }, _marked, this, [[12, 21], [32, 39]]); -} - -function watchNewChannelRequest() { - return regeneratorRuntime.wrap(function watchNewChannelRequest$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return (0, _effects.takeLatest)(actions.CHANNEL_REQUEST_NEW, newChannelRequest); - - case 2: - case 'end': - return _context2.stop(); - } - } - }, _marked2, this); -}; - -function getNewClaimsAndUpdateChannel(action) { - var _action$data2, channelKey, name, longId, page, host, claimsData, _ref3; - - return regeneratorRuntime.wrap(function getNewClaimsAndUpdateChannel$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - _action$data2 = action.data, channelKey = _action$data2.channelKey, name = _action$data2.name, longId = _action$data2.longId, page = _action$data2.page; - _context3.next = 3; - return (0, _effects.select)(_site.selectSiteHost); - - case 3: - host = _context3.sent; - claimsData = void 0; - _context3.prev = 5; - _context3.next = 8; - return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, name, page); - - case 8: - _ref3 = _context3.sent; - claimsData = _ref3.data; - _context3.next = 17; - break; - - case 12: - _context3.prev = 12; - _context3.t0 = _context3['catch'](5); - _context3.next = 16; - return (0, _effects.put)((0, _show.onRequestError)(_context3.t0.message)); - - case 16: - return _context3.abrupt('return', _context3.sent); - - case 17: - _context3.next = 19; - return (0, _effects.put)((0, _show.updateChannelClaims)(channelKey, claimsData)); - - case 19: - case 'end': - return _context3.stop(); - } - } - }, _marked3, this, [[5, 12]]); -} - -function watchUpdateChannelClaims() { - return regeneratorRuntime.wrap(function watchUpdateChannelClaims$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - _context4.next = 2; - return (0, _effects.takeLatest)(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel); - - case 2: - case 'end': - return _context4.stop(); - } - } - }, _marked4, this); -} - -/***/ }), -/* 162 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.getChannelData = getChannelData; -exports.getChannelClaims = getChannelClaims; - -var _request = __webpack_require__(8); - -var _request2 = _interopRequireDefault(_request); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function getChannelData(host, id, name) { - if (!id) id = 'none'; - var url = host + '/api/channel/data/' + name + '/' + id; - return (0, _request2.default)(url); -}; - -function getChannelClaims(host, longId, name, page) { - if (!page) page = 1; - var url = host + '/api/channel/claims/' + name + '/' + longId + '/' + page; - return (0, _request2.default)(url); -}; - -/***/ }), -/* 163 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var handlePageRender = __webpack_require__(101); - -module.exports = function (app) { - // a catch-all route if someone visits a page that does not exist - app.use('*', function (req, res) { - // send response - handlePageRender(req, res); - }); -}; - -/***/ }), -/* 164 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _require = __webpack_require__(165), - logLevel = _require.logLevel; - -module.exports = function (winston) { - // configure - winston.configure({ - transports: [new winston.transports.Console({ - level: logLevel, - timestamp: false, - colorize: true, - prettyPrint: true, - handleExceptions: true, - humanReadableUnhandledException: true - })] - }); - // test all the log levels - winston.error('Level 0'); - winston.warn('Level 1'); - winston.info('Level 2'); - winston.verbose('Level 3'); - winston.debug('Level 4'); - winston.silly('Level 5'); -}; - -/***/ }), -/* 165 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var loggerConfig = { - logLevel: 'debug' // options: silly, debug, verbose, info -}; - -module.exports = loggerConfig; - -/***/ }), -/* 166 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var winstonSlackWebHook = __webpack_require__(167).SlackWebHook; -var slackConfig = __webpack_require__(93); - -module.exports = function (winston) { - var slackWebHook = slackConfig.slackWebHook, - slackErrorChannel = slackConfig.slackErrorChannel, - slackInfoChannel = slackConfig.slackInfoChannel; - - if (slackWebHook) { - // add a transport for errors to slack - if (slackErrorChannel) { - winston.add(winstonSlackWebHook, { - name: 'slack-errors-transport', - level: 'warn', - webhookUrl: slackWebHook, - channel: slackErrorChannel, - username: 'spee.ch', - iconEmoji: ':face_with_head_bandage:' - }); - }; - if (slackInfoChannel) { - winston.add(winstonSlackWebHook, { - name: 'slack-info-transport', - level: 'info', - webhookUrl: slackWebHook, - channel: slackInfoChannel, - username: 'spee.ch', - iconEmoji: ':nerd_face:' - }); - }; - // send test message - winston.error('Slack "error" logging is online.'); - winston.info('Slack "info" logging is online.'); - } else { - winston.warn('Slack logging is not enabled because no slackWebHook config var provided.'); - } -}; - -/***/ }), -/* 167 */ -/***/ (function(module, exports) { - -module.exports = require("winston-slack-webhook"); - -/***/ }), -/* 168 */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./": 50, - "./ActiveStatusBar": 24, - "./ActiveStatusBar/": 24, - "./ActiveStatusBar/index": 24, - "./ActiveStatusBar/index.jsx": 24, - "./AssetPreview": 34, - "./AssetPreview/": 34, - "./AssetPreview/index": 34, - "./AssetPreview/index.js": 34, - "./AssetPreview/view": 78, - "./AssetPreview/view.jsx": 78, - "./ExpandingTextArea": 36, - "./ExpandingTextArea/": 36, - "./ExpandingTextArea/index": 36, - "./ExpandingTextArea/index.jsx": 36, - "./GAListener": 13, - "./GAListener/": 13, - "./GAListener/index": 13, - "./GAListener/index.jsx": 13, - "./InactiveStatusBar": 25, - "./InactiveStatusBar/": 25, - "./InactiveStatusBar/index": 25, - "./InactiveStatusBar/index.jsx": 25, - "./Logo": 21, - "./Logo/": 21, - "./Logo/index": 21, - "./Logo/index.jsx": 21, - "./NavBarChannelOptionsDropdown": 22, - "./NavBarChannelOptionsDropdown/": 22, - "./NavBarChannelOptionsDropdown/index": 22, - "./NavBarChannelOptionsDropdown/index.jsx": 22, - "./ProgressBar": 10, - "./ProgressBar/": 10, - "./ProgressBar/index": 10, - "./ProgressBar/index.jsx": 10, - "./PublishPreview": 37, - "./PublishPreview/": 37, - "./PublishPreview/index": 37, - "./PublishPreview/index.jsx": 37, - "./PublishUrlMiddleDisplay": 38, - "./PublishUrlMiddleDisplay/": 38, - "./PublishUrlMiddleDisplay/index": 38, - "./PublishUrlMiddleDisplay/index.jsx": 38, - "./SEO": 7, - "./SEO/": 7, - "./SEO/index": 7, - "./SEO/index.js": 7, - "./SEO/view": 66, - "./SEO/view.jsx": 66, - "./index": 50, - "./index.js": 50 -}; -function webpackContext(req) { - return __webpack_require__(webpackContextResolve(req)); -}; -function webpackContextResolve(req) { - var id = map[req]; - if(!(id + 1)) // check for number or string - throw new Error("Cannot find module '" + req + "'."); - return id; -}; -webpackContext.keys = function webpackContextKeys() { - return Object.keys(map); -}; -webpackContext.resolve = webpackContextResolve; -module.exports = webpackContext; -webpackContext.id = 168; - -/***/ }), -/* 169 */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./": 52, - "./AssetDisplay": 17, - "./AssetDisplay/": 17, - "./AssetDisplay/index": 17, - "./AssetDisplay/index.js": 17, - "./AssetDisplay/view": 72, - "./AssetDisplay/view.jsx": 72, - "./AssetInfo": 31, - "./AssetInfo/": 31, - "./AssetInfo/index": 31, - "./AssetInfo/index.js": 31, - "./AssetInfo/view": 75, - "./AssetInfo/view.jsx": 75, - "./AssetTitle": 30, - "./AssetTitle/": 30, - "./AssetTitle/index": 30, - "./AssetTitle/index.js": 30, - "./AssetTitle/view": 74, - "./AssetTitle/view.jsx": 74, - "./ChannelClaimsDisplay": 33, - "./ChannelClaimsDisplay/": 33, - "./ChannelClaimsDisplay/index": 33, - "./ChannelClaimsDisplay/index.js": 33, - "./ChannelClaimsDisplay/view": 77, - "./ChannelClaimsDisplay/view.jsx": 77, - "./ChannelCreateForm": 16, - "./ChannelCreateForm/": 16, - "./ChannelCreateForm/index": 16, - "./ChannelCreateForm/index.js": 16, - "./ChannelCreateForm/view": 69, - "./ChannelCreateForm/view.jsx": 69, - "./ChannelLoginForm": 15, - "./ChannelLoginForm/": 15, - "./ChannelLoginForm/index": 15, - "./ChannelLoginForm/index.js": 15, - "./ChannelLoginForm/view": 68, - "./ChannelLoginForm/view.jsx": 68, - "./ChannelSelect": 39, - "./ChannelSelect/": 39, - "./ChannelSelect/index": 39, - "./ChannelSelect/index.js": 39, - "./ChannelSelect/view": 81, - "./ChannelSelect/view.jsx": 81, - "./Dropzone": 18, - "./Dropzone/": 18, - "./Dropzone/index": 18, - "./Dropzone/index.js": 18, - "./Dropzone/view": 82, - "./Dropzone/view.jsx": 82, - "./FourOhFourPage": 35, - "./FourOhFourPage/": 35, - "./FourOhFourPage/index": 35, - "./FourOhFourPage/index.jsx": 35, - "./FourOhFourPage/view": 79, - "./FourOhFourPage/view.jsx": 79, - "./NavBar": 5, - "./NavBar/": 5, - "./NavBar/index": 5, - "./NavBar/index.js": 5, - "./NavBar/view": 65, - "./NavBar/view.jsx": 65, - "./PublishDetails": 40, - "./PublishDetails/": 40, - "./PublishDetails/index": 40, - "./PublishDetails/index.js": 40, - "./PublishDetails/view": 83, - "./PublishDetails/view.jsx": 83, - "./PublishDisabledMessage": 45, - "./PublishDisabledMessage/": 45, - "./PublishDisabledMessage/index": 45, - "./PublishDisabledMessage/index.js": 45, - "./PublishDisabledMessage/view": 88, - "./PublishDisabledMessage/view.jsx": 88, - "./PublishMetadataInputs": 44, - "./PublishMetadataInputs/": 44, - "./PublishMetadataInputs/index": 44, - "./PublishMetadataInputs/index.js": 44, - "./PublishMetadataInputs/view": 87, - "./PublishMetadataInputs/view.jsx": 87, - "./PublishStatus": 46, - "./PublishStatus/": 46, - "./PublishStatus/index": 46, - "./PublishStatus/index.js": 46, - "./PublishStatus/view": 89, - "./PublishStatus/view.jsx": 89, - "./PublishThumbnailInput": 43, - "./PublishThumbnailInput/": 43, - "./PublishThumbnailInput/index": 43, - "./PublishThumbnailInput/index.js": 43, - "./PublishThumbnailInput/view": 86, - "./PublishThumbnailInput/view.jsx": 86, - "./PublishTitleInput": 41, - "./PublishTitleInput/": 41, - "./PublishTitleInput/index": 41, - "./PublishTitleInput/index.js": 41, - "./PublishTitleInput/view": 84, - "./PublishTitleInput/view.jsx": 84, - "./PublishTool": 47, - "./PublishTool/": 47, - "./PublishTool/index": 47, - "./PublishTool/index.js": 47, - "./PublishTool/view": 90, - "./PublishTool/view.jsx": 90, - "./PublishUrlInput": 42, - "./PublishUrlInput/": 42, - "./PublishUrlInput/index": 42, - "./PublishUrlInput/index.js": 42, - "./PublishUrlInput/view": 85, - "./PublishUrlInput/view.jsx": 85, - "./ShowAssetDetails": 29, - "./ShowAssetDetails/": 29, - "./ShowAssetDetails/index": 29, - "./ShowAssetDetails/index.js": 29, - "./ShowAssetDetails/view": 73, - "./ShowAssetDetails/view.jsx": 73, - "./ShowAssetLite": 27, - "./ShowAssetLite/": 27, - "./ShowAssetLite/index": 27, - "./ShowAssetLite/index.js": 27, - "./ShowAssetLite/view": 71, - "./ShowAssetLite/view.jsx": 71, - "./ShowChannel": 32, - "./ShowChannel/": 32, - "./ShowChannel/index": 32, - "./ShowChannel/index.js": 32, - "./ShowChannel/view": 76, - "./ShowChannel/view.jsx": 76, - "./index": 52, - "./index.js": 52 -}; -function webpackContext(req) { - return __webpack_require__(webpackContextResolve(req)); -}; -function webpackContextResolve(req) { - var id = map[req]; - if(!(id + 1)) // check for number or string - throw new Error("Cannot find module '" + req + "'."); - return id; -}; -webpackContext.keys = function webpackContextKeys() { - return Object.keys(map); -}; -webpackContext.resolve = webpackContextResolve; -module.exports = webpackContext; -webpackContext.id = 169; - -/***/ }), -/* 170 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var LOAD_START = exports.LOAD_START = 'LOAD_START'; -var LOADING = exports.LOADING = 'LOADING'; -var PUBLISHING = exports.PUBLISHING = 'PUBLISHING'; -var SUCCESS = exports.SUCCESS = 'SUCCESS'; -var FAILED = exports.FAILED = 'FAILED'; - -/***/ }), -/* 171 */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./": 53, - "./AboutPage": 20, - "./AboutPage/": 20, - "./AboutPage/index": 20, - "./AboutPage/index.jsx": 20, - "./ErrorPage": 12, - "./ErrorPage/": 12, - "./ErrorPage/index": 12, - "./ErrorPage/index.jsx": 12, - "./HomePage": 54, - "./HomePage/": 54, - "./HomePage/index": 54, - "./HomePage/index.jsx": 54, - "./LoginPage": 23, - "./LoginPage/": 23, - "./LoginPage/index": 23, - "./LoginPage/index.js": 23, - "./LoginPage/view": 67, - "./LoginPage/view.jsx": 67, - "./ShowPage": 26, - "./ShowPage/": 26, - "./ShowPage/index": 26, - "./ShowPage/index.js": 26, - "./ShowPage/view": 70, - "./ShowPage/view.jsx": 70, - "./index": 53, - "./index.js": 53 -}; -function webpackContext(req) { - return __webpack_require__(webpackContextResolve(req)); -}; -function webpackContextResolve(req) { - var id = map[req]; - if(!(id + 1)) // check for number or string - throw new Error("Cannot find module '" + req + "'."); - return id; -}; -webpackContext.keys = function webpackContextKeys() { - return Object.keys(map); + database, }; -webpackContext.resolve = webpackContextResolve; -module.exports = webpackContext; -webpackContext.id = 171; -/***/ }) -/******/ ]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYWIyNDhiOGE5NmE5NmIzY2U0MzEiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3RcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1yZWR1eFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIndpbnN0b25cIiIsIndlYnBhY2s6Ly8vLi9jb25maWcvc2l0ZUNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdC1yb3V0ZXItZG9tXCIiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvTmF2QmFyL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9hY3Rpb25zL3B1Ymxpc2guanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvU0VPL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9yZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL3NlcnZlci9tb2RlbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvUHJvZ3Jlc3NCYXIvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9hY3Rpb25zL3Nob3cuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3BhZ2VzL0Vycm9yUGFnZS9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvR0FMaXN0ZW5lci9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicHJvcC10eXBlc1wiIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxMb2dpbkZvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0Ryb3B6b25lL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3BhZ2VzL0Fib3V0UGFnZS9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvTG9nby9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvTmF2QmFyQ2hhbm5lbE9wdGlvbnNEcm9wZG93bi9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3BhZ2VzL0xvZ2luUGFnZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9BY3RpdmVTdGF0dXNCYXIvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL0luYWN0aXZlU3RhdHVzQmFyL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcGFnZXMvU2hvd1BhZ2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0TGl0ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvc2VsZWN0b3JzL3Nob3cuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0RGV0YWlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9Bc3NldFRpdGxlL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0Fzc2V0SW5mby9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9TaG93Q2hhbm5lbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9Bc3NldFByZXZpZXcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvRm91ck9oRm91clBhZ2UvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL0V4cGFuZGluZ1RleHRBcmVhL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29tcG9uZW50cy9QdWJsaXNoUHJldmlldy9pbmRleC5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvUHVibGlzaFVybE1pZGRsZURpc3BsYXkvaW5kZXguanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxTZWxlY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaERldGFpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFRpdGxlSW5wdXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFVybElucHV0L2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUaHVtYm5haWxJbnB1dC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoTWV0YWRhdGFJbnB1dHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaERpc2FibGVkTWVzc2FnZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoU3RhdHVzL2luZGV4LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUb29sL2luZGV4LmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcInJlYWN0LWhlbG1ldFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInJlZHV4LXNhZ2EvZWZmZWN0c1wiIiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL2luZGV4LmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcInBhdGhcIiIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcGFnZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3BhZ2VzL0hvbWVQYWdlL2luZGV4LmpzeCIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9sYnJ5QXBpLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL2dvb2dsZUFuYWx5dGljcy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWR1eFwiIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9keW5hbWljSW1wb3J0LmpzIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9jYW5vbmljYWxMaW5rLmpzIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9maWxlLmpzIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9sYnJ5VXJpLmpzIiwid2VicGFjazovLy8uL2NsaWVudC91dGlscy9tZXRhVGFncy5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvdXRpbHMvcGFnZVRpdGxlLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9hY3Rpb25zL2NoYW5uZWwuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvTmF2QmFyL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb21wb25lbnRzL1NFTy92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvcGFnZXMvTG9naW5QYWdlL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxMb2dpbkZvcm0vdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0vdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3BhZ2VzL1Nob3dQYWdlL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1Nob3dBc3NldExpdGUvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5L3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1Nob3dBc3NldERldGFpbHMvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXRUaXRsZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9Bc3NldEluZm8vdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0NoYW5uZWwvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbENsYWltc0Rpc3BsYXkvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMvQXNzZXRQcmV2aWV3L3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0ZvdXJPaEZvdXJQYWdlL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2J1aWxkL2dldEZvbGRlck5hbWVzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxTZWxlY3Qvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvRHJvcHpvbmUvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaERldGFpbHMvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFRpdGxlSW5wdXQvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFVybElucHV0L3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUaHVtYm5haWxJbnB1dC92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoTWV0YWRhdGFJbnB1dHMvdmlldy5qc3giLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaERpc2FibGVkTWVzc2FnZS92aWV3LmpzeCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoU3RhdHVzL3ZpZXcuanN4Iiwid2VicGFjazovLy8uL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUb29sL3ZpZXcuanN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcInBhc3Nwb3J0XCIiLCJ3ZWJwYWNrOi8vLy4vY29uZmlnL215c3FsQ29uZmlnLmpzIiwid2VicGFjazovLy8uL2NvbmZpZy9zbGFja0NvbmZpZy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwYXNzcG9ydC1sb2NhbFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInNlcXVlbGl6ZVwiIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL3NlcXVlbGl6ZUhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvcHVibGlzaEhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZnNcIiIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9lcnJvckhhbmRsZXJzLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9jb250cm9sbGVycy9zZXJ2ZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvaGFuZGxlUGFnZVJlbmRlci5qc3giLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QtZG9tL3NlcnZlclwiIiwid2VicGFjazovLy8uL2NsaWVudC9yZWR1Y2Vycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29uc3RhbnRzL3B1Ymxpc2hfYWN0aW9uX3R5cGVzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb25zdGFudHMvcHVibGlzaF9jaGFubmVsX3NlbGVjdF9zdGF0ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbnN0YW50cy9jaGFubmVsX2FjdGlvbl90eXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29uc3RhbnRzL2Fzc2V0X2Rpc3BsYXlfc3RhdGVzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9hcHAuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3V0aWxzIF4uKiQiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3V0aWxzL3B1Ymxpc2guanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3V0aWxzL3ZhbGlkYXRlLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9jb25zdGFudHMvc2hvd19yZXF1ZXN0X3R5cGVzLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9oZWxwZXJzL3JlbmRlckZ1bGxQYWdlLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9zZWxlY3RvcnMvc2l0ZS5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJiYWJlbC1wb2x5ZmlsbFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcIndoYXR3Zy1mZXRjaFwiIiwid2VicGFjazovLy8uL3NwZWVjaC5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvc2VydmVyLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImV4cHJlc3NcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJib2R5LXBhcnNlclwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImV4cHJlc3MtaGFuZGxlYmFyc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcImhhbmRsZWJhcnNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJoZWxtZXRcIiIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9hdXRoSGVscGVycy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJjb29raWUtc2Vzc2lvblwiIiwid2VicGFjazovLy9leHRlcm5hbCBcImh0dHBcIiIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvcGFzc3BvcnQvbG9jYWwtc2lnbnVwLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImF4aW9zXCIiLCJ3ZWJwYWNrOi8vLy4vY29uZmlnL2xicnlDb25maWcuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwidW5pdmVyc2FsLWFuYWx5dGljc1wiIiwid2VicGFjazovLy8uL3NlcnZlci9tb2RlbHMvY2VydGlmaWNhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL21vZGVscy9jaGFubmVsLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9tb2RlbHMvY2xhaW0uanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL21vZGVscy9maWxlLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9tb2RlbHMvcmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvbW9kZWxzL3VzZXIuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiYmNyeXB0XCIiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3Bhc3Nwb3J0L2xvY2FsLWxvZ2luLmpzIiwid2VicGFjazovLy8uL3NlcnZlci9yb3V0ZXMvYXV0aC1yb3V0ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9hcGktcm91dGVzLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImNvbm5lY3QtbXVsdGlwYXJ0eVwiIiwid2VicGFjazovLy8uL3NlcnZlci9jb250cm9sbGVycy9wdWJsaXNoQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvYXV0aC9hdXRoZW50aWNhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9jaGFubmVsUGFnaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvcm91dGVzL3BhZ2Utcm91dGVzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9yZWR1Y2Vycy9wdWJsaXNoLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9yZWR1Y2Vycy9jaGFubmVsLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9yZWR1Y2Vycy9zaG93LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9yZWR1Y2Vycy9zaXRlLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcInJlYWN0LWdhXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY3Jvc3MtZmV0Y2gvcG9seWZpbGxcIiIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvcm91dGVzL2Fzc2V0LXJvdXRlcy5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9zZXJ2ZUhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvbGJyeVVyaS5qcyIsIndlYnBhY2s6Ly8vLi9zZXJ2ZXIvaGVscGVycy9oYW5kbGVTaG93UmVuZGVyLmpzeCIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWR1eC1zYWdhXCIiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3NhZ2FzL3Nob3dfdXJpLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9zYWdhcy9zaG93X2Fzc2V0LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9hcGkvYXNzZXRBcGkuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3NhZ2FzL3Nob3dfY2hhbm5lbC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvYXBpL2NoYW5uZWxBcGkuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL3JvdXRlcy9mYWxsYmFjay1yb3V0ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvY29uZmlndXJlTG9nZ2VyLmpzIiwid2VicGFjazovLy8uL2NvbmZpZy9sb2dnZXJDb25maWcuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmVyL2hlbHBlcnMvY29uZmlndXJlU2xhY2suanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwid2luc3Rvbi1zbGFjay13ZWJob29rXCIiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2NvbXBvbmVudHMgXlxcLlxcLy4qJCIsIndlYnBhY2s6Ly8vLi9jbGllbnQvY29udGFpbmVycyBeXFwuXFwvLiokIiwid2VicGFjazovLy8uL2NsaWVudC9jb25zdGFudHMvcHVibGlzaF9jbGFpbV9zdGF0ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L3BhZ2VzIF5cXC5cXC8uKiQiXSwibmFtZXMiOlsiU2l0ZUNvbmZpZyIsImFuYWx5dGljcyIsImdvb2dsZUlkIiwiYXNzZXREZWZhdWx0cyIsImRlc2NyaXB0aW9uIiwidGh1bWJuYWlsIiwidGl0bGUiLCJhdXRoIiwic2Vzc2lvbktleSIsImN1c3RvbUNvbXBvbmVudHMiLCJjb21wb25lbnRzIiwiY29udGFpbmVycyIsInBhZ2VzIiwiZGV0YWlscyIsImhvc3QiLCJwb3J0IiwidHdpdHRlciIsInB1Ymxpc2hpbmciLCJhZGRpdGlvbmFsQ2xhaW1BZGRyZXNzZXMiLCJkaXNhYmxlZCIsImRpc2FibGVkTWVzc2FnZSIsInByaW1hcnlDbGFpbUFkZHJlc3MiLCJ0aHVtYm5haWxDaGFubmVsIiwidGh1bWJuYWlsQ2hhbm5lbElkIiwidXBsb2FkRGlyZWN0b3J5IiwiY29uZmlndXJlIiwiY29uZmlnIiwiY29uc29sZSIsImxvZyIsIm1vZHVsZSIsImV4cG9ydHMiLCJtYXBTdGF0ZVRvUHJvcHMiLCJjaGFubmVsIiwic2l0ZSIsImNoYW5uZWxOYW1lIiwibG9nZ2VkSW5DaGFubmVsIiwibmFtZSIsImNoYW5uZWxTaG9ydElkIiwic2hvcnRJZCIsImNoYW5uZWxMb25nSWQiLCJsb25nSWQiLCJzaXRlRGVzY3JpcHRpb24iLCJtYXBEaXNwYXRjaFRvUHJvcHMiLCJvbkNoYW5uZWxMb2dpbiIsImRpc3BhdGNoIiwib25DaGFubmVsTG9nb3V0Iiwic2VsZWN0RmlsZSIsImNsZWFyRmlsZSIsInVwZGF0ZU1ldGFkYXRhIiwidXBkYXRlQ2xhaW0iLCJzZXRQdWJsaXNoSW5DaGFubmVsIiwidXBkYXRlUHVibGlzaFN0YXR1cyIsInVwZGF0ZUVycm9yIiwidXBkYXRlU2VsZWN0ZWRDaGFubmVsIiwidG9nZ2xlTWV0YWRhdGFJbnB1dHMiLCJvbk5ld1RodW1ibmFpbCIsInN0YXJ0UHVibGlzaCIsImFjdGlvbnMiLCJmaWxlIiwidHlwZSIsIkZJTEVfU0VMRUNURUQiLCJkYXRhIiwiRklMRV9DTEVBUiIsInZhbHVlIiwiTUVUQURBVEFfVVBEQVRFIiwiQ0xBSU1fVVBEQVRFIiwiU0VUX1BVQkxJU0hfSU5fQ0hBTk5FTCIsInN0YXR1cyIsIm1lc3NhZ2UiLCJQVUJMSVNIX1NUQVRVU19VUERBVEUiLCJFUlJPUl9VUERBVEUiLCJTRUxFQ1RFRF9DSEFOTkVMX1VQREFURSIsInNob3dNZXRhZGF0YUlucHV0cyIsIlRPR0dMRV9NRVRBREFUQV9JTlBVVFMiLCJUSFVNQk5BSUxfTkVXIiwiaGlzdG9yeSIsIlBVQkxJU0hfU1RBUlQiLCJkZWZhdWx0RGVzY3JpcHRpb24iLCJkZWZhdWx0VGh1bWJuYWlsIiwic2l0ZUhvc3QiLCJzaXRlVGl0bGUiLCJzaXRlVHdpdHRlciIsInJlcXVlc3QiLCJwYXJzZUpTT04iLCJyZXNwb25zZSIsImpzb24iLCJjaGVja1N0YXR1cyIsImpzb25SZXNwb25zZSIsImVycm9yIiwiRXJyb3IiLCJ1cmwiLCJvcHRpb25zIiwiZmV0Y2giLCJ0aGVuIiwiUHJvbWlzZSIsImFsbCIsIlNlcXVlbGl6ZSIsInJlcXVpcmUiLCJsb2dnZXIiLCJkYXRhYmFzZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJkYiIsInNlcXVlbGl6ZSIsImRpYWxlY3QiLCJkaWFsZWN0T3B0aW9ucyIsImRlY2ltYWxOdW1iZXJzIiwibG9nZ2luZyIsInBvb2wiLCJtYXgiLCJtaW4iLCJpZGxlIiwiYWNxdWlyZSIsImF1dGhlbnRpY2F0ZSIsImluZm8iLCJjYXRjaCIsImVyciIsIkNlcnRpZmljYXRlIiwiQ2hhbm5lbCIsIkNsYWltIiwiRmlsZSIsIlJlcXVlc3QiLCJVc2VyIiwiaW1wb3J0IiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJtb2RlbE5hbWUiLCJhc3NvY2lhdGUiLCJ1cHNlcnQiLCJNb2RlbCIsInZhbHVlcyIsImNvbmRpdGlvbiIsInRhYmxlTmFtZSIsImZpbmRPbmUiLCJ3aGVyZSIsIm9iaiIsImRlYnVnIiwidXBkYXRlIiwiY3JlYXRlIiwiUHJvZ3Jlc3NCYXIiLCJwcm9wcyIsInN0YXRlIiwiYmFycyIsImluZGV4IiwiaW5jcmVtZW50ZXIiLCJjcmVhdGVCYXJzIiwiYmluZCIsInN0YXJ0UHJvZ3Jlc3NCYXIiLCJ1cGRhdGVQcm9ncmVzc0JhciIsInN0b3BQcm9ncmVzc0JhciIsImkiLCJzaXplIiwicHVzaCIsImlzQWN0aXZlIiwic2V0U3RhdGUiLCJ1cGRhdGVJbnRlcnZhbCIsInNldEludGVydmFsIiwiY2xlYXJJbnRlcnZhbCIsIm1hcCIsImJhciIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJvbkhhbmRsZVNob3dQYWdlVXJpIiwib25SZXF1ZXN0RXJyb3IiLCJvbk5ld0NoYW5uZWxSZXF1ZXN0Iiwib25OZXdBc3NldFJlcXVlc3QiLCJvblJlcXVlc3RVcGRhdGUiLCJhZGRSZXF1ZXN0VG9SZXF1ZXN0TGlzdCIsImFkZEFzc2V0VG9Bc3NldExpc3QiLCJhZGROZXdDaGFubmVsVG9DaGFubmVsTGlzdCIsIm9uVXBkYXRlQ2hhbm5lbENsYWltcyIsInVwZGF0ZUNoYW5uZWxDbGFpbXMiLCJmaWxlUmVxdWVzdGVkIiwidXBkYXRlRmlsZUF2YWlsYWJpbGl0eSIsInVwZGF0ZURpc3BsYXlBc3NldEVycm9yIiwicGFyYW1zIiwiSEFORExFX1NIT1dfVVJJIiwiUkVRVUVTVF9FUlJPUiIsImNoYW5uZWxJZCIsInJlcXVlc3RUeXBlIiwicmVxdWVzdElkIiwiQ0hBTk5FTF9SRVFVRVNUX05FVyIsImlkIiwiZXh0ZW5zaW9uIiwiQVNTRVRfUkVRVUVTVF9ORVciLCJtb2RpZmllciIsIlJFUVVFU1RfVVBEQVRFIiwia2V5IiwiUkVRVUVTVF9MSVNUX0FERCIsImNsYWltSWQiLCJjbGFpbURhdGEiLCJBU1NFVF9BREQiLCJjbGFpbXNEYXRhIiwiQ0hBTk5FTF9BREQiLCJjaGFubmVsS2V5IiwicGFnZSIsIkNIQU5ORUxfQ0xBSU1TX1VQREFURV9BU1lOQyIsImNoYW5uZWxMaXN0SWQiLCJDSEFOTkVMX0NMQUlNU19VUERBVEVfU1VDQ0VTUyIsIkZJTEVfUkVRVUVTVEVEIiwiRklMRV9BVkFJTEFCSUxJVFlfVVBEQVRFIiwiRElTUExBWV9BU1NFVF9FUlJPUiIsIkVycm9yUGFnZSIsInN0cmluZyIsImluaXRpYWxpemUiLCJHQUxpc3RlbmVyIiwic2VuZFBhZ2VWaWV3IiwibG9jYXRpb24iLCJsaXN0ZW4iLCJzZXQiLCJwYXRobmFtZSIsInBhZ2V2aWV3IiwiY2hpbGRyZW4iLCJzaG93IiwiZGlzcGxheUFzc2V0IiwiYXNzZXQiLCJvbkZpbGVSZXF1ZXN0IiwicHVibGlzaCIsImZpbGVFcnJvciIsInNldEZpbGVFcnJvciIsIkFib3V0UGFnZSIsIkxvZ28iLCJOYXZCYXJDaGFubmVsRHJvcGRvd24iLCJoYW5kbGVTZWxlY3Rpb24iLCJkZWZhdWx0U2VsZWN0aW9uIiwiVklFVyIsIkxPR09VVCIsImxvZ2dlZEluQ2hhbm5lbE5hbWUiLCJBY3RpdmVTdGF0dXNCYXIiLCJJbmFjdGl2ZVN0YXR1c0JhciIsInJlcXVlc3RMaXN0IiwiYXNzZXRMaXN0IiwiYXNzZXRLZXkiLCJzZWxlY3RBc3NldCIsInNlbGVjdFNob3dTdGF0ZSIsInByZXZpb3VzUmVxdWVzdCIsImNoYW5uZWxMaXN0IiwiZGVmYXVsdHMiLCJFeHBhbmRpbmdUZXh0YXJlYSIsIl9oYW5kbGVDaGFuZ2UiLCJhZGp1c3RUZXh0YXJlYSIsImV2ZW50Iiwib25DaGFuZ2UiLCJ0YXJnZXQiLCJlbCIsInN0eWxlIiwiaGVpZ2h0Iiwic2Nyb2xsSGVpZ2h0IiwicmVzdCIsIngiLCJmdW5jIiwiUHVibGlzaFByZXZpZXciLCJpbWdTb3VyY2UiLCJzZXRQcmV2aWV3SW1hZ2VTb3VyY2UiLCJuZXdQcm9wcyIsInNldFByZXZpZXdJbWFnZVNvdXJjZUZyb21GaWxlIiwicHJldmlld1JlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwib25sb2FkZW5kIiwicmVzdWx0IiwiZGltUHJldmlldyIsImJvb2wiLCJvYmplY3QiLCJVcmxNaWRkbGUiLCJwdWJsaXNoSW5DaGFubmVsIiwic2VsZWN0ZWRDaGFubmVsIiwibG9nZ2VkSW5DaGFubmVsU2hvcnRJZCIsImNoYW5uZWxFcnJvciIsIm9uUHVibGlzaEluQ2hhbm5lbENoYW5nZSIsIm9uQ2hhbm5lbFNlbGVjdCIsIm1ldGFkYXRhIiwib25NZXRhZGF0YUNoYW5nZSIsImZpbGVOYW1lIiwiY2xhaW0iLCJ1cmxFcnJvciIsIm9uQ2xhaW1DaGFuZ2UiLCJvblVybEVycm9yIiwibGljZW5zZSIsIm5zZnciLCJvblRvZ2dsZU1ldGFkYXRhSW5wdXRzIiwiUGF0aCIsImdldFN1YkRpcmVjdG9yeU5hbWVzIiwidGhpc0ZvbGRlciIsInJlc29sdmUiLCJfX2Rpcm5hbWUiLCJtb2R1bGVzIiwiZGVmYXVsdCIsIkhvbWVQYWdlIiwiYXhpb3MiLCJhcGkiLCJhcGlIb3N0IiwiYXBpUG9ydCIsImxicnlBcGlVcmkiLCJjaG9vc2VHYUxicnluZXRQdWJsaXNoTGFiZWwiLCJzZW5kR0FUaW1pbmdFdmVudCIsImhhbmRsZUxicnluZXRSZXNwb25zZSIsInJlamVjdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdWJsaXNoQ2xhaW0iLCJwdWJsaXNoUGFyYW1zIiwiZ2FTdGFydFRpbWUiLCJEYXRlIiwibm93IiwicG9zdCIsIm1ldGhvZCIsImdldENsYWltIiwidXJpIiwidGltZW91dCIsImdldENsYWltTGlzdCIsImNsYWltTmFtZSIsInJlc29sdmVVcmkiLCJnZXREb3dubG9hZERpcmVjdG9yeSIsImRvd25sb2FkX2RpcmVjdG9yeSIsImNyZWF0ZUNoYW5uZWwiLCJjaGFubmVsX25hbWUiLCJhbW91bnQiLCJ1YSIsImNyZWF0ZVNlcnZlRXZlbnRQYXJhbXMiLCJoZWFkZXJzIiwiaXAiLCJvcmlnaW5hbFVybCIsImV2ZW50Q2F0ZWdvcnkiLCJldmVudEFjdGlvbiIsImV2ZW50TGFiZWwiLCJpcE92ZXJyaWRlIiwidXNlckFnZW50T3ZlcnJpZGUiLCJjcmVhdGVQdWJsaXNoVGltaW5nRXZlbnRQYXJhbXMiLCJjYXRlZ29yeSIsInZhcmlhYmxlIiwibGFiZWwiLCJzdGFydFRpbWUiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJ1c2VyVGltaW5nQ2F0ZWdvcnkiLCJ1c2VyVGltaW5nVmFyaWFibGVOYW1lIiwidXNlclRpbWluZ1RpbWUiLCJ1c2VyVGltaW5nTGFiZWwiLCJzZW5kR29vZ2xlQW5hbHl0aWNzRXZlbnQiLCJ2aXNpdG9ySWQiLCJyZXBsYWNlIiwidmlzaXRvciIsInN0cmljdENpZEZvcm1hdCIsImh0dHBzIiwic2VuZEdvb2dsZUFuYWx5dGljc1RpbWluZyIsInRpbWluZyIsInNlbmRHQVNlcnZlRXZlbnQiLCJjaGFubmVsX2lkIiwiZ2V0RGVlcGVzdENoaWxkVmFsdWUiLCJwYXJlbnQiLCJjaGlsZHJlbktleXMiLCJjaGlsZEtleSIsInNoaWZ0IiwiY2hpbGQiLCJsZW5ndGgiLCJkeW5hbWljSW1wb3J0IiwiZmlsZVBhdGgiLCJmb2xkZXJzIiwic3BsaXQiLCJmaWx0ZXIiLCJmb2xkZXJOYW1lIiwiY29tcG9uZW50IiwiY3JlYXRlQmFzaWNDYW5vbmljYWxMaW5rIiwiY3JlYXRlQXNzZXRDYW5vbmljYWxMaW5rIiwiY2VydGlmaWNhdGVJZCIsImNyZWF0ZUNoYW5uZWxDYW5vbmljYWxMaW5rIiwiY3JlYXRlQ2Fub25pY2FsTGluayIsInZhbGlkYXRlRmlsZSIsInRlc3QiLCJSRUdFWFBfSU5WQUxJRF9DTEFJTSIsIlJFR0VYUF9JTlZBTElEX0NIQU5ORUwiLCJSRUdFWFBfQUREUkVTUyIsIkNIQU5ORUxfQ0hBUiIsInBhcnNlSWRlbnRpZmllciIsImlkZW50aWZpZXIiLCJjb21wb25lbnRzUmVnZXgiLCJSZWdFeHAiLCJleGVjIiwibWF0Y2giLCJwcm90byIsIm1vZGlmaWVyU2VwZXJhdG9yIiwiaXNDaGFubmVsIiwic3RhcnRzV2l0aCIsIm5hbWVCYWRDaGFycyIsImpvaW4iLCJjaGFubmVsQ2xhaW1JZCIsInBhcnNlQ2xhaW0iLCJleHRlbnNpb25TZXBlcmF0b3IiLCJkZXRlcm1pbmVPZ1RodW1ibmFpbENvbnRlbnRUeXBlIiwiZmlsZUV4dCIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiY3JlYXRlQmFzaWNNZXRhVGFncyIsInByb3BlcnR5IiwiY29udGVudCIsImNyZWF0ZUNoYW5uZWxNZXRhVGFncyIsImNyZWF0ZUFzc2V0TWV0YVRhZ3MiLCJjb250ZW50VHlwZSIsImVtYmVkVXJsIiwic2hvd1VybCIsInNvdXJjZSIsIm9nVGl0bGUiLCJvZ0Rlc2NyaXB0aW9uIiwib2dUaHVtYm5haWxDb250ZW50VHlwZSIsIm9nVGh1bWJuYWlsIiwibWV0YVRhZ3MiLCJjcmVhdGVNZXRhVGFncyIsImNyZWF0ZVBhZ2VUaXRsZSIsInBhZ2VUaXRsZSIsInVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCIsIkNIQU5ORUxfVVBEQVRFIiwiTmF2QmFyIiwiY2hlY2tGb3JMb2dnZWRJblVzZXIiLCJsb2dvdXRVc2VyIiwiY3JlZGVudGlhbHMiLCJzaG9ydENoYW5uZWxJZCIsInNlbGVjdGVkT3B0aW9ucyIsIlNFTyIsInBhZ2VVcmkiLCJjYW5vbmljYWxMaW5rIiwicmVsIiwiaHJlZiIsIkxvZ2luUGFnZSIsIkNoYW5uZWxMb2dpbkZvcm0iLCJoYW5kbGVJbnB1dCIsImxvZ2luVG9DaGFubmVsIiwicHJldmVudERlZmF1bHQiLCJib2R5IiwiSGVhZGVycyIsInN1Y2Nlc3MiLCJjaGFubmVsUGFzc3dvcmQiLCJDaGFubmVsQ3JlYXRlRm9ybSIsImhhbmRsZUNoYW5uZWxJbnB1dCIsImlucHV0IiwiY2xlYW5zZUNoYW5uZWxJbnB1dCIsInVwZGF0ZUlzQ2hhbm5lbEF2YWlsYWJsZSIsImNoYW5uZWxXaXRoQXRTeW1ib2wiLCJjaGVja0lzUGFzc3dvcmRQcm92aWRlZCIsImNoZWNrSXNDaGFubmVsQXZhaWxhYmxlIiwibWFrZVB1Ymxpc2hDaGFubmVsUmVxdWVzdCIsIlNob3dQYWdlIiwibmV4dFByb3BzIiwiU2hvd0xpdGUiLCJBc3NldERpc3BsYXkiLCJTaG93QXNzZXREZXRhaWxzIiwiQXNzZXRUaXRsZSIsIkFzc2V0SW5mbyIsImNvcHlUb0NsaXBib2FyZCIsImVsZW1lbnRUb0NvcHkiLCJkYXRhc2V0IiwiZWxlbWVudHRvY29weSIsImVsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwic2VsZWN0IiwiZXhlY0NvbW1hbmQiLCJTaG93Q2hhbm5lbCIsIkNoYW5uZWxDbGFpbXNEaXNwbGF5Iiwic2hvd05leHRSZXN1bHRzUGFnZSIsInNob3dQcmV2aW91c1Jlc3VsdHNQYWdlIiwiY3VycmVudFBhZ2UiLCJwcmV2aW91c1BhZ2UiLCJwYXJzZUludCIsInNob3dOZXdQYWdlIiwibmV4dFBhZ2UiLCJjbGFpbXMiLCJ0b3RhbFBhZ2VzIiwiQXNzZXRQcmV2aWV3IiwiZGlyZWN0U291cmNlTGluayIsInNob3dVcmxMaW5rIiwiRm91ck9oRm9yUGFnZSIsImxzdGF0U3luYyIsInJlYWRkaXJTeW5jIiwicm9vdCIsImZ1bGxQYXRoIiwiaXNEaXJlY3RvcnkiLCJzdGF0ZXMiLCJDaGFubmVsU2VsZWN0IiwidG9nZ2xlQW5vbnltb3VzUHVibGlzaCIsInNlbGVjdGVkT3B0aW9uIiwiTE9HSU4iLCJDUkVBVEUiLCJEcm9wem9uZSIsImRyYWdPdmVyIiwibW91c2VPdmVyIiwiaGFuZGxlRHJvcCIsImhhbmRsZURyYWdPdmVyIiwiaGFuZGxlRHJhZ0VuZCIsImhhbmRsZURyYWdFbnRlciIsImhhbmRsZURyYWdMZWF2ZSIsImhhbmRsZU1vdXNlRW50ZXIiLCJoYW5kbGVNb3VzZUxlYXZlIiwiaGFuZGxlQ2xpY2siLCJoYW5kbGVGaWxlSW5wdXQiLCJjaG9vc2VGaWxlIiwiZHQiLCJkYXRhVHJhbnNmZXIiLCJpdGVtcyIsImtpbmQiLCJkcm9wcGVkRmlsZSIsImdldEFzRmlsZSIsInJlbW92ZSIsImNsZWFyRGF0YSIsImNsaWNrIiwiZmlsZUxpc3QiLCJmaWxlcyIsIlB1Ymxpc2hEZXRhaWxzIiwib25QdWJsaXNoU3VibWl0IiwiUHVibGlzaFRpdGxlSW5wdXQiLCJlIiwiUHVibGlzaFVybElucHV0Iiwic2V0Q2xhaW1OYW1lIiwidmFsaWRhdGVDbGFpbSIsImNsZWFuc2VJbnB1dCIsImZpbGVOYW1lV2l0aG91dEVuZGluZyIsImNsZWFuQ2xhaW1OYW1lIiwiZGF0YVVSSXRvQmxvYiIsImRhdGFVUkkiLCJieXRlU3RyaW5nIiwiYXRvYiIsIm1pbWVTdHJpbmciLCJpYSIsIlVpbnQ4QXJyYXkiLCJjaGFyQ29kZUF0IiwiQmxvYiIsIlB1Ymxpc2hUaHVtYm5haWxJbnB1dCIsInZpZGVvU291cmNlIiwic2xpZGVyTWluUmFuZ2UiLCJzbGlkZXJNYXhSYW5nZSIsInNsaWRlclZhbHVlIiwiaGFuZGxlVmlkZW9Mb2FkZWREYXRhIiwiaGFuZGxlU2xpZGVyQ2hhbmdlIiwiY3JlYXRlVGh1bWJuYWlsIiwic2V0VmlkZW9Tb3VyY2UiLCJkYXRhVXJpIiwiYmxvYiIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsInRvdGFsTWludXRlcyIsIk1hdGgiLCJmbG9vciIsInRvdGFsU2Vjb25kcyIsInZpZGVvIiwiY3VycmVudFRpbWUiLCJjYW52YXMiLCJjcmVhdGVFbGVtZW50Iiwid2lkdGgiLCJ2aWRlb1dpZHRoIiwidmlkZW9IZWlnaHQiLCJnZXRDb250ZXh0IiwiZHJhd0ltYWdlIiwiZGF0YVVybCIsInRvRGF0YVVSTCIsInNuYXBzaG90IiwiZGlzcGxheSIsIlB1Ymxpc2hNZXRhZGF0YUlucHV0cyIsInRvZ2dsZVNob3dJbnB1dHMiLCJoYW5kbGVTZWxlY3QiLCJjaGVja2VkIiwibWF4SGVpZ2h0IiwiUHVibGlzaERpc2FibGVkTWVzc2FnZSIsInB1Ymxpc2hTdGF0ZXMiLCJQdWJsaXNoU3RhdHVzIiwiTE9BRF9TVEFSVCIsIkxPQURJTkciLCJQVUJMSVNISU5HIiwiU1VDQ0VTUyIsIkZBSUxFRCIsIlB1Ymxpc2hUb29sIiwiTXlzcWxDb25maWciLCJTbGFja0NvbmZpZyIsInNsYWNrV2ViSG9vayIsInNsYWNrRXJyb3JDaGFubmVsIiwic2xhY2tJbmZvQ2hhbm5lbCIsInJldHVyblNob3J0SWQiLCJjbGFpbXNBcnJheSIsImNsYWltSW5kZXgiLCJzaG9ydElkTGVuZ3RoIiwiZmluZEluZGV4IiwicG9zc2libGVNYXRjaGVzIiwic2xpY2UiLCJmcyIsInBhcnNlUHVibGlzaEFwaVJlcXVlc3RCb2R5IiwiaW52YWxpZE5hbWVDaGFyYWN0ZXJzIiwicGFyc2VQdWJsaXNoQXBpUmVxdWVzdEZpbGVzIiwicGF0aCIsInZhbGlkYXRlRmlsZVR5cGVBbmRTaXplIiwiZmlsZVR5cGUiLCJ0aHVtYm5haWxGaWxlTmFtZSIsInRodW1ibmFpbEZpbGVQYXRoIiwidGh1bWJuYWlsRmlsZVR5cGUiLCJjcmVhdGVCYXNpY1B1Ymxpc2hQYXJhbXMiLCJ0cmltIiwiZmlsZV9wYXRoIiwiYmlkIiwiYXV0aG9yIiwibGFuZ3VhZ2UiLCJjbGFpbV9hZGRyZXNzIiwiY3JlYXRlVGh1bWJuYWlsUHVibGlzaFBhcmFtcyIsImRlbGV0ZVRlbXBvcmFyeUZpbGUiLCJ1bmxpbmsiLCJhZGRHZXRSZXN1bHRzVG9GaWxlRGF0YSIsImZpbGVJbmZvIiwiZ2V0UmVzdWx0IiwiZmlsZV9uYW1lIiwiZG93bmxvYWRfcGF0aCIsImNyZWF0ZUZpbGVEYXRhIiwib3V0cG9pbnQiLCJhZGRyZXNzIiwiaGFuZGxlRXJyb3JSZXNwb25zZSIsInJlcyIsInVzZU9iamVjdFByb3BlcnRpZXNJZk5vS2V5cyIsInJldHVybkVycm9yTWVzc2FnZUFuZFN0YXR1cyIsImNyZWF0ZUVycm9yUmVzcG9uc2VQYXlsb2FkIiwiY29kZSIsIm5ld0Vycm9yT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInJldHVyblBhZ2luYXRlZENoYW5uZWxDbGFpbXMiLCJOT19DSEFOTkVMIiwiTk9fQ0xBSU0iLCJOT19GSUxFIiwiZ2V0Q2xhaW1JZCIsImdldENsYWltSWRCeUNoYW5uZWwiLCJnZXRDbGFpbUlkQnlDbGFpbSIsImdldExvbmdDbGFpbUlkIiwibG9uZ0NsYWltSWQiLCJnZXRMb25nQ2hhbm5lbElkIiwibG9uZ0NoYW5uZWxJZCIsImdldENsYWltSWRCeUxvbmdDaGFubmVsSWQiLCJnZXRDaGFubmVsRGF0YSIsImxvbmdDaGFubmVsQ2xhaW1JZCIsImdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQiLCJzaG9ydENoYW5uZWxDbGFpbUlkIiwiZ2V0Q2hhbm5lbENsYWltcyIsImdldEFsbENoYW5uZWxDbGFpbXMiLCJjaGFubmVsQ2xhaW1zQXJyYXkiLCJwYWdpbmF0ZWRDaGFubmVsVmlld0RhdGEiLCJnZXRMb2NhbEZpbGVSZWNvcmQiLCJkYXRhVmFsdWVzIiwicmVxIiwiY29udGV4dCIsInN0b3JlIiwiaHRtbCIsImhlbG1ldCIsInJlbmRlclN0YXRpYyIsInJlZGlyZWN0IiwicHJlbG9hZGVkU3RhdGUiLCJnZXRTdGF0ZSIsInNlbmQiLCJMT0NBTF9DSEVDSyIsIlVOQVZBSUxBQkxFIiwiRVJST1IiLCJBVkFJTEFCTEUiLCJBcHAiLCJjcmVhdGVQdWJsaXNoTWV0YWRhdGEiLCJjcmVhdGVQdWJsaXNoRm9ybURhdGEiLCJmZCIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiaGFzT3duUHJvcGVydHkiLCJjcmVhdGVUaHVtYm5haWxVcmwiLCJ2YWxpZGF0ZUNoYW5uZWxTZWxlY3Rpb24iLCJ2YWxpZGF0ZVB1Ymxpc2hQYXJhbXMiLCJDSEFOTkVMIiwiQVNTRVRfTElURSIsIkFTU0VUX0RFVEFJTFMiLCJ0b1N0cmluZyIsIm1ldGEiLCJsaW5rIiwic2VsZWN0U2l0ZVN0YXRlIiwic2VsZWN0U2l0ZUhvc3QiLCJTZXJ2ZXIiLCJDb21wb25lbnRzIiwiQ29udGFpbmVycyIsIlBhZ2VzIiwiZXhwcmVzcyIsImJvZHlQYXJzZXIiLCJleHByZXNzSGFuZGxlYmFycyIsIkhhbmRsZWJhcnMiLCJwYXNzcG9ydCIsInNlcmlhbGl6ZVNwZWVjaFVzZXIiLCJkZXNlcmlhbGl6ZVNwZWVjaFVzZXIiLCJjb29raWVTZXNzaW9uIiwiaHR0cCIsImNvbmZpZ3VyZU15c3FsIiwibXlzcWxDb25maWciLCJjb25maWd1cmVTaXRlIiwic2l0ZUNvbmZpZyIsIlBPUlQiLCJjb25maWd1cmVTbGFjayIsInNsYWNrQ29uZmlnIiwiY3JlYXRlQXBwIiwiYXBwIiwiZW5hYmxlIiwidXNlIiwic3RhdGljIiwidXJsZW5jb2RlZCIsImV4dGVuZGVkIiwibmV4dCIsInZlcmJvc2UiLCJzZXJpYWxpemVVc2VyIiwiZGVzZXJpYWxpemVVc2VyIiwibG9jYWxTaWdudXBTdHJhdGVneSIsImxvY2FsTG9naW5TdHJhdGVneSIsIm1heEFnZSIsInNlc3Npb24iLCJoYnMiLCJkZWZhdWx0TGF5b3V0IiwiaGFuZGxlYmFycyIsImVuZ2luZSIsInNlcnZlciIsInN0YXJ0Iiwic3luYyIsInVzZXIiLCJkb25lIiwiUGFzc3BvcnRMb2NhbFN0cmF0ZWd5IiwiU3RyYXRlZ3kiLCJsYnJ5QXBpIiwidXNlcm5hbWVGaWVsZCIsInBhc3N3b3JkRmllbGQiLCJ1c2VySW5mbyIsInVzZXJEYXRhIiwidXNlck5hbWUiLCJjaGFubmVsRGF0YSIsInR4IiwiY2xhaW1faWQiLCJjZXJ0aWZpY2F0ZURhdGEiLCJuZXdVc2VyIiwibmV3Q2hhbm5lbCIsIm5ld0NlcnRpZmljYXRlIiwic2V0Q2hhbm5lbCIsInNldFVzZXIiLCJsYnJ5Q29uZmlnIiwiU1RSSU5HIiwiQk9PTEVBTiIsIklOVEVHRVIiLCJURVhUIiwiREVDSU1BTCIsImRlZmluZSIsImNsYWltU2VxdWVuY2UiLCJkZWNvZGVkQ2xhaW0iLCJkZXB0aCIsImVmZmVjdGl2ZUFtb3VudCIsImhhc1NpZ25hdHVyZSIsImhleCIsIm5vdXQiLCJ0eGlkIiwidmFsaWRBdEhlaWdodCIsInZhbHVlVmVyc2lvbiIsImNsYWltVHlwZSIsImNlcnRpZmljYXRlVmVyc2lvbiIsImtleVR5cGUiLCJwdWJsaWNLZXkiLCJmcmVlemVUYWJsZU5hbWUiLCJiZWxvbmdzVG8iLCJmb3JlaWduS2V5IiwiYWxsb3dOdWxsIiwiZmluZEFsbCIsIm9yZGVyIiwiZ2V0TG9uZ0NoYW5uZWxJZEZyb21TaG9ydENoYW5uZWxJZCIsIiRsaWtlIiwiZ2V0TG9uZ0NoYW5uZWxJZEZyb21DaGFubmVsTmFtZSIsInZhbGlkYXRlTG9uZ0NoYW5uZWxJZCIsImhhc09uZSIsImRldGVybWluZUZpbGVFeHRlbnNpb25Gcm9tQ29udGVudFR5cGUiLCJkZXRlcm1pbmVUaHVtYm5haWwiLCJzdG9yZWRUaHVtYm5haWwiLCJwcmVwYXJlQ2xhaW1EYXRhIiwibGljZW5zZVVybCIsInByZXZpZXciLCJtZXRhZGF0YVZlcnNpb24iLCJzb3VyY2VUeXBlIiwic291cmNlVmVyc2lvbiIsInN0cmVhbVZlcnNpb24iLCJnZXRTaG9ydENsYWltSWRGcm9tTG9uZ0NsYWltSWQiLCJyYXciLCJnZXRMb25nQ2xhaW1JZEZyb21TaG9ydENsYWltSWQiLCJnZXRUb3BGcmVlQ2xhaW1JZEJ5Q2xhaW1OYW1lIiwidmFsaWRhdGVMb25nQ2xhaW1JZCIsInJlc29sdmVDbGFpbSIsImNsYWltQXJyYXkiLCJkZWZhdWx0VmFsdWUiLCJ0cmVuZGluZ0VsaWdpYmxlIiwiaGFzTWFueSIsImdldFJlY2VudENsYWltcyIsImxpbWl0IiwiYWN0aW9uIiwiaXBBZGRyZXNzIiwiYmNyeXB0IiwicHJvdG90eXBlIiwiY29tcGFyZVBhc3N3b3JkIiwiY29tcGFyZSIsImNoYW5nZVBhc3N3b3JkIiwibmV3UGFzc3dvcmQiLCJnZW5TYWx0Iiwic2FsdEVycm9yIiwic2FsdCIsImhhc2giLCJoYXNoRXJyb3IiLCJob29rIiwicmV0dXJuVXNlckFuZENoYW5uZWxJbmZvIiwidXNlckluc3RhbmNlIiwiZ2V0Q2hhbm5lbCIsImlzTWF0Y2giLCJsb2dJbiIsImdldCIsImxvZ291dCIsIm11bHRpcGFydCIsIm11bHRpcGFydE1pZGRsZXdhcmUiLCJ1cGxvYWREaXIiLCJjbGFpbU5hbWVJc0F2YWlsYWJsZSIsImNoZWNrQ2hhbm5lbEF2YWlsYWJpbGl0eSIsImVycm9ySGFuZGxlcnMiLCJhdXRoZW50aWNhdGVVc2VyIiwiYXZhaWxhYmxlTmFtZSIsImNsYWltc0xpc3QiLCJyZXNvbHZlUmVzdWx0IiwiZmlsZURhdGEiLCJmaWxlUmVjb3JkIiwiY29tcGxldGVkIiwicmVzb2x2ZWRVcmkiLCJ2YWxpZGF0ZWRDbGFpbU5hbWUiLCJ0aHVtYm5haWxQdWJsaXNoUGFyYW1zIiwibGJyeVR4IiwiY2xhaW1JbmZvIiwicHVibGlzaEhlbHBlcnMiLCJPcCIsInB1Ymxpc2hSZXN1bHRzIiwiY2xhaW1SZWNvcmQiLCJ1cHNlcnRDcml0ZXJpYSIsInNldENsYWltIiwic2V0RmlsZSIsImNsYWltQWRkcmVzc2VzIiwiYXR0cmlidXRlcyIsIm9yIiwiYXV0aGVudGljYXRlQ2hhbm5lbENyZWRlbnRpYWxzIiwidXNlclBhc3N3b3JkIiwiY2hhbm5lbEZpbmRQYXJhbXMiLCJDTEFJTVNfUEVSX1BBR0UiLCJkZXRlcm1pbmVUb3RhbFBhZ2VzIiwicGFnaW5hdGlvblBhZ2UiLCJnZXRQYWdlRnJvbVF1ZXJ5Iiwidmlld0RhdGEiLCJleHRyYWN0UGFnZUZyb21DbGFpbXMiLCJkZXRlcm1pbmVQcmV2aW91c1BhZ2UiLCJkZXRlcm1pbmVOZXh0UGFnZSIsInRvdGFsUmVzdWx0cyIsImRldGVybWluZVRvdGFsQ2xhaW1zIiwicGFnZU51bWJlciIsImNsYWltU3RhcnRJbmRleCIsImNsYWltRW5kSW5kZXgiLCJwYWdlT2ZDbGFpbXMiLCJ0b3RhbENsYWltcyIsImZ1bGxQYWdlcyIsInJlbWFpbmRlciIsImhhbmRsZVBhZ2VSZW5kZXIiLCJyZW5kZXIiLCJsYXlvdXQiLCJpbml0aWFsU3RhdGUiLCJhc3NpZ24iLCJwdWJsaXNoU3VibWl0IiwiZ29vZ2xlQW5hbHl0aWNzSWQiLCJkZXRlcm1pbmVSZXNwb25zZVR5cGUiLCJmbGlwQ2xhaW1OYW1lQW5kSWRGb3JCYWNrd2FyZHNDb21wYXRpYmlsaXR5IiwibG9nUmVxdWVzdERhdGEiLCJnZXRDbGFpbUlkQW5kU2VydmVBc3NldCIsImxicnlVcmkiLCJoYW5kbGVTaG93UmVuZGVyIiwiU0VSVkUiLCJoYXNGaWxlRXh0ZW5zaW9uIiwicGFyc2VNb2RpZmllciIsInJlc3BvbnNlVHlwZSIsIlNIT1ciLCJjbGllbnRBY2NlcHRzSHRtbCIsImFjY2VwdCIsInJlcXVlc3RJc0Zyb21Ccm93c2VyIiwiY2xpZW50V2FudHNBc3NldCIsInJhbmdlIiwiaW1hZ2VJc1dhbnRlZCIsInZpZGVvSXNXYW50ZWQiLCJpc1ZhbGlkQ2xhaW1JZCIsImlzVmFsaWRTaG9ydElkIiwiaXNWYWxpZFNob3J0SWRPckNsYWltSWQiLCJzZXJ2ZUFzc2V0VG9DbGllbnQiLCJzZW5kRmlsZU9wdGlvbnMiLCJzZW5kRmlsZSIsImZ1bGxDbGFpbUlkIiwidGVtcE5hbWUiLCJyZXR1cm5TYWdhV2l0aFBhcmFtcyIsInNhZ2EiLCJzYWdhTWlkZGxld2FyZSIsIm1pZGRsZXdhcmUiLCJydW4iLCJoYW5kbGVTaG93UGFnZVVyaSIsIndhdGNoSGFuZGxlU2hvd1BhZ2VVcmkiLCJwYXJzZUFuZFVwZGF0ZUlkZW50aWZpZXJBbmRDbGFpbSIsInBhcnNlQW5kVXBkYXRlQ2xhaW1Pbmx5IiwibmV3QXNzZXRSZXF1ZXN0Iiwid2F0Y2hOZXdBc3NldFJlcXVlc3QiLCJnZXRTaG9ydElkIiwiZ2V0Q2xhaW1EYXRhIiwibmV3Q2hhbm5lbFJlcXVlc3QiLCJ3YXRjaE5ld0NoYW5uZWxSZXF1ZXN0Iiwid2F0Y2hVcGRhdGVDaGFubmVsQ2xhaW1zIiwiZ2V0TmV3Q2xhaW1zQW5kVXBkYXRlQ2hhbm5lbCIsImxvZ0xldmVsIiwid2luc3RvbiIsInRyYW5zcG9ydHMiLCJDb25zb2xlIiwibGV2ZWwiLCJ0aW1lc3RhbXAiLCJjb2xvcml6ZSIsInByZXR0eVByaW50IiwiaGFuZGxlRXhjZXB0aW9ucyIsImh1bWFuUmVhZGFibGVVbmhhbmRsZWRFeGNlcHRpb24iLCJ3YXJuIiwic2lsbHkiLCJsb2dnZXJDb25maWciLCJ3aW5zdG9uU2xhY2tXZWJIb29rIiwiU2xhY2tXZWJIb29rIiwiYWRkIiwid2ViaG9va1VybCIsImljb25FbW9qaSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0I7Ozs7OztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCOzs7Ozs7Ozs7Ozs7QUNqSk8sSUFBTWhXLGtDQUFhLFlBQW5CO0FBQ0EsSUFBTUMsNEJBQVUsU0FBaEI7QUFDQSxJQUFNQyxrQ0FBYSxZQUFuQjtBQUNBLElBQU1DLDRCQUFVLFNBQWhCO0FBQ0EsSUFBTUMsMEJBQVMsUUFBZixDOzs7Ozs7QUNKUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDExNSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYWIyNDhiOGE5NmE5NmIzY2U0MzEiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlYWN0XCJcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtcmVkdXhcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWFjdC1yZWR1eFwiXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndpbnN0b25cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJ3aW5zdG9uXCJcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZnVuY3Rpb24gU2l0ZUNvbmZpZyAoKSB7XG4gIHRoaXMuYW5hbHl0aWNzID0ge1xuICAgIGdvb2dsZUlkOiAnZGVmYXVsdCcsXG4gIH07XG4gIHRoaXMuYXNzZXREZWZhdWx0cyA9IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FuIGFzc2V0IHB1Ymxpc2hlZCBvbiBTcGVlLmNoJyxcbiAgICB0aHVtYm5haWwgIDogJ2h0dHBzOi8vc3BlZS5jaC9hc3NldHMvaW1nL3ZpZGVvX3RodW1iX2RlZmF1bHQucG5nJyxcbiAgICB0aXRsZSAgICAgIDogJ1NwZWUuY2gnLFxuICB9O1xuICB0aGlzLmF1dGggPSB7XG4gICAgc2Vzc2lvbktleTogJ2RlZmF1bHQnLFxuICB9O1xuICB0aGlzLmN1c3RvbUNvbXBvbmVudHMgPSB7XG4gICAgY29tcG9uZW50czoge30sXG4gICAgY29udGFpbmVyczoge30sXG4gICAgcGFnZXMgICAgIDoge30sXG4gIH07XG4gIHRoaXMuZGV0YWlscyA9IHtcbiAgICBkZXNjcmlwdGlvbjogJ09wZW4tc291cmNlLCBkZWNlbnRyYWxpemVkIGltYWdlIGFuZCB2aWRlbyBzaGFyaW5nLicsXG4gICAgaG9zdCAgICAgICA6ICdkZWZhdWx0JyxcbiAgICBwb3J0ICAgICAgIDogMzAwMCxcbiAgICB0aXRsZSAgICAgIDogJ1NwZWUuY2gnLFxuICAgIHR3aXR0ZXIgICAgOiAnQHNwZWVfY2gnLFxuICB9O1xuICB0aGlzLnB1Ymxpc2hpbmcgPSB7XG4gICAgYWRkaXRpb25hbENsYWltQWRkcmVzc2VzOiBbXSxcbiAgICBkaXNhYmxlZCAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgIGRpc2FibGVkTWVzc2FnZSAgICAgICAgIDogJ1BsZWFzZSBjaGVjayBiYWNrIHNvb24uJyxcbiAgICBwcmltYXJ5Q2xhaW1BZGRyZXNzICAgICA6ICdkZWZhdWx0JyxcbiAgICB0aHVtYm5haWxDaGFubmVsICAgICAgICA6ICdkZWZhdWx0JyxcbiAgICB0aHVtYm5haWxDaGFubmVsSWQgICAgICA6ICdkZWZhdWx0JyxcbiAgICB1cGxvYWREaXJlY3RvcnkgICAgICAgICA6ICcvaG9tZS9sYnJ5L1VwbG9hZHMnLFxuICB9O1xuICB0aGlzLmNvbmZpZ3VyZSA9IChjb25maWcpID0+IHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdObyBzaXRlIGNvbmZpZyByZWNlaXZlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgeyBhbmFseXRpY3MsIGFzc2V0RGVmYXVsdHMsIGF1dGgsIGN1c3RvbUNvbXBvbmVudHMsIGRldGFpbHMsIHB1Ymxpc2hpbmcgfSA9IGNvbmZpZztcbiAgICB0aGlzLmFuYWx5dGljcyA9IGFuYWx5dGljcztcbiAgICB0aGlzLmFzc2V0RGVmYXVsdHMgPSBhc3NldERlZmF1bHRzO1xuICAgIHRoaXMuYXV0aCA9IGF1dGg7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB0aGlzLnB1Ymxpc2hpbmcgPSBwdWJsaXNoaW5nO1xuICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cyA9IGN1c3RvbUNvbXBvbmVudHM7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTaXRlQ29uZmlnKCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvc2l0ZUNvbmZpZy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LXJvdXRlci1kb21cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWFjdC1yb3V0ZXItZG9tXCJcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IHVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCB9IGZyb20gJ2FjdGlvbnMvY2hhbm5lbCc7XG5pbXBvcnQge3VwZGF0ZVNlbGVjdGVkQ2hhbm5lbH0gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IGNoYW5uZWwsIHNpdGUgfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGNoYW5uZWxOYW1lICAgOiBjaGFubmVsLmxvZ2dlZEluQ2hhbm5lbC5uYW1lLFxuICAgIGNoYW5uZWxTaG9ydElkOiBjaGFubmVsLmxvZ2dlZEluQ2hhbm5lbC5zaG9ydElkLFxuICAgIGNoYW5uZWxMb25nSWQgOiBjaGFubmVsLmxvZ2dlZEluQ2hhbm5lbC5sb25nSWQsXG4gICAgc2l0ZURlc2NyaXB0aW9uOiBzaXRlLmRlc2NyaXB0aW9uLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uQ2hhbm5lbExvZ2luOiAobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVMb2dnZWRJbkNoYW5uZWwobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSk7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVTZWxlY3RlZENoYW5uZWwobmFtZSkpO1xuICAgIH0sXG4gICAgb25DaGFubmVsTG9nb3V0OiAoKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVMb2dnZWRJbkNoYW5uZWwobnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL05hdkJhci9pbmRleC5qcyIsImltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3B1Ymxpc2hfYWN0aW9uX3R5cGVzJztcblxuLy8gZXhwb3J0IGFjdGlvbiBjcmVhdG9yc1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEZpbGUgKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkZJTEVfU0VMRUNURUQsXG4gICAgZGF0YTogZmlsZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckZpbGUgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuRklMRV9DTEVBUixcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVNZXRhZGF0YSAobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLk1FVEFEQVRBX1VQREFURSxcbiAgICBkYXRhOiB7XG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDbGFpbSAodmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkNMQUlNX1VQREFURSxcbiAgICBkYXRhOiB2YWx1ZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRQdWJsaXNoSW5DaGFubmVsIChjaGFubmVsKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5TRVRfUFVCTElTSF9JTl9DSEFOTkVMLFxuICAgIGNoYW5uZWwsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUHVibGlzaFN0YXR1cyAoc3RhdHVzLCBtZXNzYWdlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5QVUJMSVNIX1NUQVRVU19VUERBVEUsXG4gICAgZGF0YToge1xuICAgICAgc3RhdHVzLFxuICAgICAgbWVzc2FnZSxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUVycm9yIChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuRVJST1JfVVBEQVRFLFxuICAgIGRhdGE6IHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkQ2hhbm5lbCAoY2hhbm5lbE5hbWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlNFTEVDVEVEX0NIQU5ORUxfVVBEQVRFLFxuICAgIGRhdGE6IGNoYW5uZWxOYW1lLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZU1ldGFkYXRhSW5wdXRzIChzaG93TWV0YWRhdGFJbnB1dHMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlRPR0dMRV9NRVRBREFUQV9JTlBVVFMsXG4gICAgZGF0YTogc2hvd01ldGFkYXRhSW5wdXRzLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uTmV3VGh1bWJuYWlsIChmaWxlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5USFVNQk5BSUxfTkVXLFxuICAgIGRhdGE6IGZpbGUsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRQdWJsaXNoIChoaXN0b3J5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5QVUJMSVNIX1NUQVJULFxuICAgIGRhdGE6IHsgaGlzdG9yeSB9LFxuICB9O1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2FjdGlvbnMvcHVibGlzaC5qcyIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaXRlIH0pID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0RGVzY3JpcHRpb24sIGRlZmF1bHRUaHVtYm5haWwsIGRlc2NyaXB0aW9uOiBzaXRlRGVzY3JpcHRpb24sIGhvc3Q6IHNpdGVIb3N0LCB0aXRsZTogc2l0ZVRpdGxlLCB0d2l0dGVyOiBzaXRlVHdpdHRlciB9ID0gc2l0ZTtcbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0RGVzY3JpcHRpb24sXG4gICAgZGVmYXVsdFRodW1ibmFpbCxcbiAgICBzaXRlRGVzY3JpcHRpb24sXG4gICAgc2l0ZUhvc3QsXG4gICAgc2l0ZVRpdGxlLFxuICAgIHNpdGVUd2l0dGVyLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvU0VPL2luZGV4LmpzIiwiaW1wb3J0ICdjcm9zcy1mZXRjaC9wb2x5ZmlsbCc7XG5cbi8qKlxuICogUGFyc2VzIHRoZSBKU09OIHJldHVybmVkIGJ5IGEgbmV0d29yayByZXF1ZXN0XG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSByZXNwb25zZSBBIHJlc3BvbnNlIGZyb20gYSBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJuIHtvYmplY3R9ICAgICAgICAgIFRoZSBwYXJzZWQgSlNPTiBmcm9tIHRoZSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIHBhcnNlSlNPTiAocmVzcG9uc2UpIHtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0IHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA1KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIHN0YXR1cyByZXR1cm5lZCBieSBhIG5ldHdvcmsgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gcmVzcG9uc2UgICBBIHJlc3BvbnNlIGZyb20gYSBuZXR3b3JrIHJlcXVlc3RcbiAqIEBwYXJhbSAge29iamVjdH0gcmVzcG9uc2UgICBUaGUgcGFyc2VkIEpTT04gZnJvbSB0aGUgbmV0d29yayByZXF1ZXN0XG4gKlxuICogQHJldHVybiB7b2JqZWN0IHwgdW5kZWZpbmVkfSBSZXR1cm5zIG9iamVjdCB3aXRoIHN0YXR1cyBhbmQgc3RhdHVzVGV4dCwgb3IgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3RhdHVzIChyZXNwb25zZSwganNvblJlc3BvbnNlKSB7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgIHJldHVybiBqc29uUmVzcG9uc2U7XG4gIH1cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoanNvblJlc3BvbnNlLm1lc3NhZ2UpO1xuICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICB0aHJvdyBlcnJvcjtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyBhIFVSTCwgcmV0dXJuaW5nIGEgcHJvbWlzZVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gdXJsICAgICAgIFRoZSBVUkwgd2Ugd2FudCB0byByZXF1ZXN0XG4gKiBAcGFyYW0gIHtvYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyB3ZSB3YW50IHRvIHBhc3MgdG8gXCJmZXRjaFwiXG4gKlxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAgVGhlIHJlc3BvbnNlIGRhdGFcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1ZXN0ICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucylcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3Jlc3BvbnNlLCBwYXJzZUpTT04ocmVzcG9uc2UpXSk7XG4gICAgfSlcbiAgICAudGhlbigoW3Jlc3BvbnNlLCBqc29uUmVzcG9uc2VdKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tTdGF0dXMocmVzcG9uc2UsIGpzb25SZXNwb25zZSk7XG4gICAgfSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvdXRpbHMvcmVxdWVzdC5qcyIsImNvbnN0IFNlcXVlbGl6ZSA9IHJlcXVpcmUoJ3NlcXVlbGl6ZScpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuXG5jb25zb2xlLmxvZygnZXhwb3J0aW5nIHNlcXVlbGl6ZSBtb2RlbHMnKTtcbmNvbnN0IHsgZGF0YWJhc2UsIHVzZXJuYW1lLCBwYXNzd29yZCB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL215c3FsQ29uZmlnJyk7XG5jb25zdCBkYiA9IHt9O1xuLy8gc2V0IHNlcXVlbGl6ZSBvcHRpb25zXG5jb25zdCBzZXF1ZWxpemUgPSBuZXcgU2VxdWVsaXplKGRhdGFiYXNlLCB1c2VybmFtZSwgcGFzc3dvcmQsIHtcbiAgaG9zdCAgICAgICAgICA6ICdsb2NhbGhvc3QnLFxuICBkaWFsZWN0ICAgICAgIDogJ215c3FsJyxcbiAgZGlhbGVjdE9wdGlvbnM6IHtkZWNpbWFsTnVtYmVyczogdHJ1ZX0sIC8vIGZpeCB0byBlbnN1cmUgREVDSU1BTCB3aWxsIG5vdCBiZSBzdG9yZWQgYXMgYSBzdHJpbmdcbiAgbG9nZ2luZyAgICAgICA6IGZhbHNlLFxuICBwb29sICAgICAgICAgIDoge1xuICAgIG1heCAgICA6IDUsXG4gICAgbWluICAgIDogMCxcbiAgICBpZGxlICAgOiAxMDAwMCxcbiAgICBhY3F1aXJlOiAxMDAwMCxcbiAgfSxcbn0pO1xuXG4vLyBlc3RhYmxpc2ggbXlzcWwgY29ubmVjdGlvblxuc2VxdWVsaXplXG4gIC5hdXRoZW50aWNhdGUoKVxuICAudGhlbigoKSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oJ1NlcXVlbGl6ZSBoYXMgZXN0YWJsaXNoZWQgbXlzcWwgY29ubmVjdGlvbiBzdWNjZXNzZnVsbHkuJyk7XG4gIH0pXG4gIC5jYXRjaChlcnIgPT4ge1xuICAgIGxvZ2dlci5lcnJvcignU2VxdWVsaXplIHdhcyB1bmFibGUgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2U6JywgZXJyKTtcbiAgfSk7XG5cbi8vIG1hbnVhbGx5IGFkZCBlYWNoIG1vZGVsIHRvIHRoZSBkYiBvYmplY3RcbmNvbnN0IENlcnRpZmljYXRlID0gcmVxdWlyZSgnLi9jZXJ0aWZpY2F0ZS5qcycpO1xuY29uc3QgQ2hhbm5lbCA9IHJlcXVpcmUoJy4vY2hhbm5lbC5qcycpO1xuY29uc3QgQ2xhaW0gPSByZXF1aXJlKCcuL2NsYWltLmpzJyk7XG5jb25zdCBGaWxlID0gcmVxdWlyZSgnLi9maWxlLmpzJyk7XG5jb25zdCBSZXF1ZXN0ID0gcmVxdWlyZSgnLi9yZXF1ZXN0LmpzJyk7XG5jb25zdCBVc2VyID0gcmVxdWlyZSgnLi91c2VyLmpzJyk7XG5kYlsnQ2VydGlmaWNhdGUnXSA9IHNlcXVlbGl6ZS5pbXBvcnQoJ0NlcnRpZmljYXRlJywgQ2VydGlmaWNhdGUpO1xuZGJbJ0NoYW5uZWwnXSA9IHNlcXVlbGl6ZS5pbXBvcnQoJ0NoYW5uZWwnLCBDaGFubmVsKTtcbmRiWydDbGFpbSddID0gc2VxdWVsaXplLmltcG9ydCgnQ2xhaW0nLCBDbGFpbSk7XG5kYlsnRmlsZSddID0gc2VxdWVsaXplLmltcG9ydCgnRmlsZScsIEZpbGUpO1xuZGJbJ1JlcXVlc3QnXSA9IHNlcXVlbGl6ZS5pbXBvcnQoJ1JlcXVlc3QnLCBSZXF1ZXN0KTtcbmRiWydVc2VyJ10gPSBzZXF1ZWxpemUuaW1wb3J0KCdVc2VyJywgVXNlcik7XG5cbi8vIHJ1biBtb2RlbC5hc3NvY2lhdGlvbiBmb3IgZWFjaCBtb2RlbCBpbiB0aGUgZGIgb2JqZWN0IHRoYXQgaGFzIGFuIGFzc29jaWF0aW9uXG5PYmplY3Qua2V5cyhkYikuZm9yRWFjaChtb2RlbE5hbWUgPT4ge1xuICBpZiAoZGJbbW9kZWxOYW1lXS5hc3NvY2lhdGUpIHtcbiAgICBsb2dnZXIuaW5mbygnQXNzb2NpYXRpbmcgbW9kZWw6JywgbW9kZWxOYW1lKTtcbiAgICBkYlttb2RlbE5hbWVdLmFzc29jaWF0ZShkYik7XG4gIH1cbn0pO1xuXG5kYi5zZXF1ZWxpemUgPSBzZXF1ZWxpemU7XG5kYi5TZXF1ZWxpemUgPSBTZXF1ZWxpemU7XG5cbi8vIGFkZCBhbiAndXBzZXJ0JyBtZXRob2QgdG8gdGhlIGRiIG9iamVjdFxuZGIudXBzZXJ0ID0gKE1vZGVsLCB2YWx1ZXMsIGNvbmRpdGlvbiwgdGFibGVOYW1lKSA9PiB7XG4gIHJldHVybiBNb2RlbFxuICAgIC5maW5kT25lKHtcbiAgICAgIHdoZXJlOiBjb25kaXRpb24sXG4gICAgfSlcbiAgICAudGhlbihvYmogPT4ge1xuICAgICAgaWYgKG9iaikgeyAgLy8gdXBkYXRlXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgdXBkYXRpbmcgcmVjb3JkIGluIGRiLiR7dGFibGVOYW1lfWApO1xuICAgICAgICByZXR1cm4gb2JqLnVwZGF0ZSh2YWx1ZXMpO1xuICAgICAgfSBlbHNlIHsgIC8vIGluc2VydFxuICAgICAgICBsb2dnZXIuZGVidWcoYGNyZWF0aW5nIHJlY29yZCBpbiBkYi4ke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgcmV0dXJuIE1vZGVsLmNyZWF0ZSh2YWx1ZXMpO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGAke3RhYmxlTmFtZX0udXBzZXJ0IGVycm9yYCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL21vZGVscy9pbmRleC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEFjdGl2ZVN0YXR1c0JhciBmcm9tICdjb21wb25lbnRzL0FjdGl2ZVN0YXR1c0Jhcic7XG5pbXBvcnQgSW5hY3RpdmVTdGF0dXNCYXIgZnJvbSAnY29tcG9uZW50cy9JbmFjdGl2ZVN0YXR1c0Jhcic7XG5cbmNsYXNzIFByb2dyZXNzQmFyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBiYXJzICAgICAgIDogW10sXG4gICAgICBpbmRleCAgICAgIDogMCxcbiAgICAgIGluY3JlbWVudGVyOiAxLFxuICAgIH07XG4gICAgdGhpcy5jcmVhdGVCYXJzID0gdGhpcy5jcmVhdGVCYXJzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zdGFydFByb2dyZXNzQmFyID0gdGhpcy5zdGFydFByb2dyZXNzQmFyLmJpbmQodGhpcyk7XG4gICAgdGhpcy51cGRhdGVQcm9ncmVzc0JhciA9IHRoaXMudXBkYXRlUHJvZ3Jlc3NCYXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLnN0b3BQcm9ncmVzc0JhciA9IHRoaXMuc3RvcFByb2dyZXNzQmFyLmJpbmQodGhpcyk7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIHRoaXMuY3JlYXRlQmFycygpO1xuICAgIHRoaXMuc3RhcnRQcm9ncmVzc0JhcigpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICB0aGlzLnN0b3BQcm9ncmVzc0JhcigpO1xuICB9XG4gIGNyZWF0ZUJhcnMgKCkge1xuICAgIGNvbnN0IGJhcnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0aGlzLnByb3BzLnNpemU7IGkrKykge1xuICAgICAgYmFycy5wdXNoKHtpc0FjdGl2ZTogZmFsc2V9KTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGJhcnMgfSk7XG4gIH1cbiAgc3RhcnRQcm9ncmVzc0JhciAoKSB7XG4gICAgdGhpcy51cGRhdGVJbnRlcnZhbCA9IHNldEludGVydmFsKHRoaXMudXBkYXRlUHJvZ3Jlc3NCYXIuYmluZCh0aGlzKSwgMzAwKTtcbiAgfTtcbiAgdXBkYXRlUHJvZ3Jlc3NCYXIgKCkge1xuICAgIGxldCBpbmRleCA9IHRoaXMuc3RhdGUuaW5kZXg7XG4gICAgbGV0IGluY3JlbWVudGVyID0gdGhpcy5zdGF0ZS5pbmNyZW1lbnRlcjtcbiAgICBsZXQgYmFycyA9IHRoaXMuc3RhdGUuYmFycztcbiAgICAvLyBmbGlwIGluY3JlbWVudGVyIGlmIG5lY2Vzc2FyeSwgdG8gc3RheSBpbiBib3VuZHNcbiAgICBpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID4gdGhpcy5wcm9wcy5zaXplKSkge1xuICAgICAgaW5jcmVtZW50ZXIgPSBpbmNyZW1lbnRlciAqIC0xO1xuICAgICAgaW5kZXggKz0gaW5jcmVtZW50ZXI7XG4gICAgfVxuICAgIC8vIHVwZGF0ZSB0aGUgaW5kZXhlZCBiYXJcbiAgICBpZiAoaW5jcmVtZW50ZXIgPiAwKSB7XG4gICAgICBiYXJzW2luZGV4XS5pc0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhcnNbaW5kZXhdLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgICAvLyBpbmNyZW1lbnQgaW5kZXhcbiAgICBpbmRleCArPSBpbmNyZW1lbnRlcjtcbiAgICAvLyB1cGRhdGUgc3RhdGVcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGJhcnMsXG4gICAgICBpbmNyZW1lbnRlcixcbiAgICAgIGluZGV4LFxuICAgIH0pO1xuICB9O1xuICBzdG9wUHJvZ3Jlc3NCYXIgKCkge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVJbnRlcnZhbCk7XG4gIH07XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIHt0aGlzLnN0YXRlLmJhcnMubWFwKChiYXIsIGluZGV4KSA9PiBiYXIuaXNBY3RpdmUgPyA8QWN0aXZlU3RhdHVzQmFyIGtleT17aW5kZXh9IC8+IDogPEluYWN0aXZlU3RhdHVzQmFyIGtleT17aW5kZXh9Lz4pfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuUHJvZ3Jlc3NCYXIucHJvcFR5cGVzID0ge1xuICBzaXplOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9ncmVzc0JhcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL1Byb2dyZXNzQmFyL2luZGV4LmpzeCIsImltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3Nob3dfYWN0aW9uX3R5cGVzJztcblxuaW1wb3J0IHsgQ0hBTk5FTCwgQVNTRVRfTElURSwgQVNTRVRfREVUQUlMUyB9IGZyb20gJ2NvbnN0YW50cy9zaG93X3JlcXVlc3RfdHlwZXMnO1xuXG4vLyBiYXNpYyByZXF1ZXN0IHBhcnNpbmdcbmV4cG9ydCBmdW5jdGlvbiBvbkhhbmRsZVNob3dQYWdlVXJpIChwYXJhbXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkhBTkRMRV9TSE9XX1VSSSxcbiAgICBkYXRhOiBwYXJhbXMsXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb25SZXF1ZXN0RXJyb3IgKGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5SRVFVRVNUX0VSUk9SLFxuICAgIGRhdGE6IGVycm9yLFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uTmV3Q2hhbm5lbFJlcXVlc3QgKGNoYW5uZWxOYW1lLCBjaGFubmVsSWQpIHtcbiAgY29uc3QgcmVxdWVzdFR5cGUgPSBDSEFOTkVMO1xuICBjb25zdCByZXF1ZXN0SWQgPSBgY3IjJHtjaGFubmVsTmFtZX0jJHtjaGFubmVsSWR9YDtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkNIQU5ORUxfUkVRVUVTVF9ORVcsXG4gICAgZGF0YTogeyByZXF1ZXN0VHlwZSwgcmVxdWVzdElkLCBjaGFubmVsTmFtZSwgY2hhbm5lbElkIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb25OZXdBc3NldFJlcXVlc3QgKG5hbWUsIGlkLCBjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBleHRlbnNpb24pIHtcbiAgY29uc3QgcmVxdWVzdFR5cGUgPSBleHRlbnNpb24gPyBBU1NFVF9MSVRFIDogQVNTRVRfREVUQUlMUztcbiAgY29uc3QgcmVxdWVzdElkID0gYGFyIyR7bmFtZX0jJHtpZH0jJHtjaGFubmVsTmFtZX0jJHtjaGFubmVsSWR9YDtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkFTU0VUX1JFUVVFU1RfTkVXLFxuICAgIGRhdGE6IHtcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgcmVxdWVzdElkLFxuICAgICAgbmFtZSxcbiAgICAgIG1vZGlmaWVyOiB7XG4gICAgICAgIGlkLFxuICAgICAgICBjaGFubmVsOiB7XG4gICAgICAgICAgbmFtZTogY2hhbm5lbE5hbWUsXG4gICAgICAgICAgaWQgIDogY2hhbm5lbElkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uUmVxdWVzdFVwZGF0ZSAocmVxdWVzdFR5cGUsIHJlcXVlc3RJZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuUkVRVUVTVF9VUERBVEUsXG4gICAgZGF0YToge1xuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICByZXF1ZXN0SWQsXG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRSZXF1ZXN0VG9SZXF1ZXN0TGlzdCAoaWQsIGVycm9yLCBrZXkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLlJFUVVFU1RfTElTVF9BREQsXG4gICAgZGF0YTogeyBpZCwgZXJyb3IsIGtleSB9LFxuICB9O1xufTtcblxuLy8gYXNzZXQgYWN0aW9uc1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkQXNzZXRUb0Fzc2V0TGlzdCAoaWQsIGVycm9yLCBuYW1lLCBjbGFpbUlkLCBzaG9ydElkLCBjbGFpbURhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkFTU0VUX0FERCxcbiAgICBkYXRhOiB7IGlkLCBlcnJvciwgbmFtZSwgY2xhaW1JZCwgc2hvcnRJZCwgY2xhaW1EYXRhIH0sXG4gIH07XG59XG5cbi8vIGNoYW5uZWwgYWN0aW9uc1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkTmV3Q2hhbm5lbFRvQ2hhbm5lbExpc3QgKGlkLCBuYW1lLCBzaG9ydElkLCBsb25nSWQsIGNsYWltc0RhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkNIQU5ORUxfQURELFxuICAgIGRhdGE6IHsgaWQsIG5hbWUsIHNob3J0SWQsIGxvbmdJZCwgY2xhaW1zRGF0YSB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uVXBkYXRlQ2hhbm5lbENsYWltcyAoY2hhbm5lbEtleSwgbmFtZSwgbG9uZ0lkLCBwYWdlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5DSEFOTkVMX0NMQUlNU19VUERBVEVfQVNZTkMsXG4gICAgZGF0YToge2NoYW5uZWxLZXksIG5hbWUsIGxvbmdJZCwgcGFnZX0sXG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ2hhbm5lbENsYWltcyAoY2hhbm5lbExpc3RJZCwgY2xhaW1zRGF0YSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX1NVQ0NFU1MsXG4gICAgZGF0YToge2NoYW5uZWxMaXN0SWQsIGNsYWltc0RhdGF9LFxuICB9O1xufTtcblxuLy8gZGlzcGxheSBhIGZpbGVcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVSZXF1ZXN0ZWQgKG5hbWUsIGNsYWltSWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkZJTEVfUkVRVUVTVEVELFxuICAgIGRhdGE6IHsgbmFtZSwgY2xhaW1JZCB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUZpbGVBdmFpbGFiaWxpdHkgKHN0YXR1cykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGFjdGlvbnMuRklMRV9BVkFJTEFCSUxJVFlfVVBEQVRFLFxuICAgIGRhdGE6IHN0YXR1cyxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5QXNzZXRFcnJvciAoZXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBhY3Rpb25zLkRJU1BMQVlfQVNTRVRfRVJST1IsXG4gICAgZGF0YTogZXJyb3IsXG4gIH07XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2FjdGlvbnMvc2hvdy5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5cbmNsYXNzIEVycm9yUGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBlcnJvciB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPE5hdkJhciAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkJz5cbiAgICAgICAgICA8cD57ZXJyb3J9PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbkVycm9yUGFnZS5wcm9wVHlwZXMgPSB7XG4gIGVycm9yOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBFcnJvclBhZ2U7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcGFnZXMvRXJyb3JQYWdlL2luZGV4LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgR29vZ2xlQW5hbHl0aWNzIGZyb20gJ3JlYWN0LWdhJztcbmltcG9ydCB7IHdpdGhSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmNvbnN0IHsgYW5hbHl0aWNzOiB7IGdvb2dsZUlkIH0gfSA9IHJlcXVpcmUoJy4uLy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbkdvb2dsZUFuYWx5dGljcy5pbml0aWFsaXplKGdvb2dsZUlkKTtcblxuY2xhc3MgR0FMaXN0ZW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLnNlbmRQYWdlVmlldyh0aGlzLnByb3BzLmhpc3RvcnkubG9jYXRpb24pO1xuICAgIHRoaXMucHJvcHMuaGlzdG9yeS5saXN0ZW4odGhpcy5zZW5kUGFnZVZpZXcpO1xuICB9XG5cbiAgc2VuZFBhZ2VWaWV3IChsb2NhdGlvbikge1xuICAgIEdvb2dsZUFuYWx5dGljcy5zZXQoeyBwYWdlOiBsb2NhdGlvbi5wYXRobmFtZSB9KTtcbiAgICBHb29nbGVBbmFseXRpY3MucGFnZXZpZXcobG9jYXRpb24ucGF0aG5hbWUpO1xuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoUm91dGVyKEdBTGlzdGVuZXIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvR0FMaXN0ZW5lci9pbmRleC5qc3giLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicHJvcC10eXBlc1wiXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgdXBkYXRlTG9nZ2VkSW5DaGFubmVsIH0gZnJvbSAnYWN0aW9ucy9jaGFubmVsJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQge3VwZGF0ZVNlbGVjdGVkQ2hhbm5lbH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9wdWJsaXNoJztcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uQ2hhbm5lbExvZ2luOiAobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVMb2dnZWRJbkNoYW5uZWwobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSk7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVTZWxlY3RlZENoYW5uZWwobmFtZSkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG51bGwsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtL2luZGV4LmpzIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IHVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCB9IGZyb20gJ2FjdGlvbnMvY2hhbm5lbCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHt1cGRhdGVTZWxlY3RlZENoYW5uZWx9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkNoYW5uZWxMb2dpbjogKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTG9nZ2VkSW5DaGFubmVsKG5hbWUsIHNob3J0SWQsIGxvbmdJZCkpO1xuICAgICAgZGlzcGF0Y2godXBkYXRlU2VsZWN0ZWRDaGFubmVsKG5hbWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChudWxsLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0vaW5kZXguanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7IGZpbGVSZXF1ZXN0ZWQgfSBmcm9tICdhY3Rpb25zL3Nob3cnO1xuaW1wb3J0IHsgc2VsZWN0QXNzZXQgfSBmcm9tICdzZWxlY3RvcnMvc2hvdyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgZXJyb3IgYW5kIHN0YXR1c1xuICBjb25zdCBlcnJvciAgPSBzaG93LmRpc3BsYXlBc3NldC5lcnJvcjtcbiAgY29uc3Qgc3RhdHVzID0gc2hvdy5kaXNwbGF5QXNzZXQuc3RhdHVzO1xuICAvLyBzZWxlY3QgYXNzZXRcbiAgY29uc3QgYXNzZXQgPSBzZWxlY3RBc3NldChzaG93KTtcbiAgLy8gIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGVycm9yLFxuICAgIHN0YXR1cyxcbiAgICBhc3NldCxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkZpbGVSZXF1ZXN0OiAobmFtZSwgY2xhaW1JZCkgPT4ge1xuICAgICAgZGlzcGF0Y2goZmlsZVJlcXVlc3RlZChuYW1lLCBjbGFpbUlkKSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5L2luZGV4LmpzIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IHNlbGVjdEZpbGUsIHVwZGF0ZUVycm9yLCBjbGVhckZpbGUgfSBmcm9tICdhY3Rpb25zL3B1Ymxpc2gnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgcHVibGlzaCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgZmlsZSAgICAgOiBwdWJsaXNoLmZpbGUsXG4gICAgdGh1bWJuYWlsOiBwdWJsaXNoLnRodW1ibmFpbCxcbiAgICBmaWxlRXJyb3I6IHB1Ymxpc2guZXJyb3IuZmlsZSxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBzZWxlY3RGaWxlOiAoZmlsZSkgPT4ge1xuICAgICAgZGlzcGF0Y2goc2VsZWN0RmlsZShmaWxlKSk7XG4gICAgfSxcbiAgICBzZXRGaWxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2goY2xlYXJGaWxlKCkpO1xuICAgICAgZGlzcGF0Y2godXBkYXRlRXJyb3IoJ2ZpbGUnLCB2YWx1ZSkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0Ryb3B6b25lL2luZGV4LmpzIiwiLy8gcmVxdWVzdCBhY3Rpb25zXG5leHBvcnQgY29uc3QgSEFORExFX1NIT1dfVVJJID0gJ0hBTkRMRV9TSE9XX1VSSSc7XG5leHBvcnQgY29uc3QgUkVRVUVTVF9FUlJPUiA9ICdSRVFVRVNUX0VSUk9SJztcbmV4cG9ydCBjb25zdCBSRVFVRVNUX1VQREFURSA9ICdSRVFVRVNUX1VQREFURSc7XG5leHBvcnQgY29uc3QgQVNTRVRfUkVRVUVTVF9ORVcgPSAnQVNTRVRfUkVRVUVTVF9ORVcnO1xuZXhwb3J0IGNvbnN0IENIQU5ORUxfUkVRVUVTVF9ORVcgPSAnQ0hBTk5FTF9SRVFVRVNUX05FVyc7XG5leHBvcnQgY29uc3QgUkVRVUVTVF9MSVNUX0FERCA9ICdSRVFVRVNUX0xJU1RfQUREJztcblxuLy8gYXNzZXQgYWN0aW9uc1xuZXhwb3J0IGNvbnN0IEFTU0VUX0FERCA9IGBBU1NFVF9BRERgO1xuXG4vLyBjaGFubmVsIGFjdGlvbnNcbmV4cG9ydCBjb25zdCBDSEFOTkVMX0FERCA9ICdDSEFOTkVMX0FERCc7XG5cbmV4cG9ydCBjb25zdCBDSEFOTkVMX0NMQUlNU19VUERBVEVfQVNZTkMgPSAnQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX0FTWU5DJztcbmV4cG9ydCBjb25zdCBDSEFOTkVMX0NMQUlNU19VUERBVEVfU1VDQ0VTUyA9ICdDSEFOTkVMX0NMQUlNU19VUERBVEVfU1VDQ0VTUyc7XG5cbi8vIGFzc2V0L2ZpbGUgZGlzcGxheSBhY3Rpb25zXG5leHBvcnQgY29uc3QgRklMRV9SRVFVRVNURUQgPSAnRklMRV9SRVFVRVNURUQnO1xuZXhwb3J0IGNvbnN0IEZJTEVfQVZBSUxBQklMSVRZX1VQREFURSA9ICdGSUxFX0FWQUlMQUJJTElUWV9VUERBVEUnO1xuZXhwb3J0IGNvbnN0IERJU1BMQVlfQVNTRVRfRVJST1IgPSAnRElTUExBWV9BU1NFVF9FUlJPUic7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29uc3RhbnRzL3Nob3dfYWN0aW9uX3R5cGVzLmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuaW1wb3J0IFNFTyBmcm9tICdjb21wb25lbnRzL1NFTyc7XG5cbmNsYXNzIEFib3V0UGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxTRU8gcGFnZVRpdGxlPXsnQWJvdXQnfSBwYWdlVXJpPXsnYWJvdXQnfSAvPlxuICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tbWVkLTEwIGFsaWduLWNvbnRlbnQtdG9wJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdwdWxsLXF1b3RlJz5TcGVlLmNoIGlzIGFuIG9wZW4tc291cmNlIHByb2plY3QuICBQbGVhc2UgY29udHJpYnV0ZSB0byB0aGUgZXhpc3Rpbmcgc2l0ZSwgb3IgZm9yayBpdCBhbmQgbWFrZSB5b3VyIG93bi48L3A+XG4gICAgICAgICAgICAgIDxwPjxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vdHdpdHRlci5jb20vc3BlZV9jaCc+VFdJVFRFUjwvYT48L3A+XG4gICAgICAgICAgICAgIDxwPjxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9sYnJ5aW8vc3BlZS5jaCc+R0lUSFVCPC9hPjwvcD5cbiAgICAgICAgICAgICAgPHA+PGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly9kaXNjb3JkLmdnL1lqWWJ3aFMnPkRJU0NPUkQgQ0hBTk5FTDwvYT48L3A+XG4gICAgICAgICAgICAgIDxwPjxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9sYnJ5aW8vc3BlZS5jaC9ibG9iL21hc3Rlci9SRUFETUUubWQnPkRPQ1VNRU5UQVRJT048L2E+PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8cD5TcGVlLmNoIGlzIGEgbWVkaWEtaG9zdGluZyBzaXRlIHRoYXQgcmVhZHMgZnJvbSBhbmQgcHVibGlzaGVzIGNvbnRlbnQgdG8gdGhlIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9sYnJ5LmlvJz5MQlJZPC9hPiBibG9ja2NoYWluLjwvcD5cbiAgICAgICAgICAgICAgPHA+U3BlZS5jaCBpcyBhIGhvc3Rpbmcgc2VydmljZSwgYnV0IHdpdGggdGhlIGFkZGVkIGJlbmVmaXQgdGhhdCBpdCBzdG9yZXMgeW91ciBjb250ZW50IG9uIGEgZGVjZW50cmFsaXplZCBuZXR3b3JrIG9mIGNvbXB1dGVycyAtLSB0aGUgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyBocmVmPSdodHRwczovL2xicnkuaW8vZ2V0Jz5MQlJZPC9hPiBuZXR3b3JrLiAgVGhpcyBtZWFucyB0aGF0IHlvdXIgaW1hZ2VzIGFyZSBzdG9yZWQgaW4gbXVsdGlwbGUgbG9jYXRpb25zIHdpdGhvdXQgYSBzaW5nbGUgcG9pbnQgb2YgZmFpbHVyZS48L3A+XG4gICAgICAgICAgICAgIDxoMz5Db250cmlidXRlPC9oMz5cbiAgICAgICAgICAgICAgPHA+SWYgeW91IGhhdmUgYW4gaWRlYSBmb3IgeW91ciBvd24gc3BlZS5jaC1saWtlIHNpdGUgb24gdG9wIG9mIExCUlksIGZvcmsgb3VyIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL2xicnlpby9zcGVlLmNoJz5naXRodWIgcmVwbzwvYT4gYW5kIGdvIHRvIHRvd24hPC9wPlxuICAgICAgICAgICAgICA8cD5JZiB5b3Ugd2FudCB0byBpbXByb3ZlIHNwZWUuY2gsIGpvaW4gb3VyIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9kaXNjb3JkLmdnL1lqWWJ3aFMnPmRpc2NvcmQgY2hhbm5lbDwvYT4gb3Igc29sdmUgb25lIG9mIG91ciA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9sYnJ5aW8vc3BlZS5jaC9pc3N1ZXMnPmdpdGh1YiBpc3N1ZXM8L2E+LjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFib3V0UGFnZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9wYWdlcy9BYm91dFBhZ2UvaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcblxuZnVuY3Rpb24gTG9nbyAoKSB7XG4gIHJldHVybiAoXG4gICAgPHN2ZyB2ZXJzaW9uPScxLjEnIGlkPSdMYXllcl8xJyB4PScwcHgnIHk9JzBweCcgaGVpZ2h0PScyNHB4JyB2aWV3Qm94PScwIDAgODAgMzEnIGVuYWJsZUJhY2tncm91bmQ9J25ldyAwIDAgODAgMzEnIGNsYXNzTmFtZT0nbmF2LWJhci1sb2dvJz5cbiAgICAgIDxMaW5rIHRvPScvJz5cbiAgICAgICAgPHRpdGxlPkxvZ288L3RpdGxlPlxuICAgICAgICA8ZGVzYz5TcGVlLmNoIGxvZ288L2Rlc2M+XG4gICAgICAgIDxnIGlkPSdBYm91dCc+XG4gICAgICAgICAgPGcgaWQ9J1B1Ymxpc2gtRm9ybS1WMi1feDI4X2ZpbGxlZF94MjlfJyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtNDIuMDAwMDAwLCAtMjMuMDAwMDAwKSc+XG4gICAgICAgICAgICA8ZyBpZD0nR3JvdXAtMTcnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDQyLjAwMDAwMCwgMjIuMDAwMDAwKSc+XG4gICAgICAgICAgICAgIDx0ZXh0IHRyYW5zZm9ybT0nbWF0cml4KDEgMCAwIDEgMCAyMCknIGZvbnRTaXplPScyNScgZm9udEZhbWlseT0nUm9ib3RvJz5TcGVlJmx0O2g8L3RleHQ+XG4gICAgICAgICAgICAgIDxnIGlkPSdHcm91cC0xNicgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMC4wMDAwMDAsIDMwLjAwMDAwMCknPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPSdMaW5lLTgnIGZpbGw9J25vbmUnIHN0cm9rZT0nIzA5RjkxMScgc3Ryb2tlV2lkdGg9JzEnIHN0cm9rZUxpbmVjYXA9J3NxdWFyZScgZD0nTTAuNSwxLjVoMTUnIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggaWQ9J0xpbmUtOC1Db3B5JyBmaWxsPSdub25lJyBzdHJva2U9JyMwMjlENzQnIHN0cm9rZVdpZHRoPScxJyBzdHJva2VMaW5lY2FwPSdzcXVhcmUnIGQ9J00xNi41LDEuNWgxNScgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBpZD0nTGluZS04LUNvcHktMicgZmlsbD0nbm9uZScgc3Ryb2tlPScjRTM1QkQ4JyBzdHJva2VXaWR0aD0nMScgc3Ryb2tlTGluZWNhcD0nc3F1YXJlJyBkPSdNMzIuNSwxLjVoMTUnIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggaWQ9J0xpbmUtOC1Db3B5LTMnIGZpbGw9J25vbmUnIHN0cm9rZT0nIzQxNTZDNScgc3Ryb2tlV2lkdGg9JzEnIHN0cm9rZUxpbmVjYXA9J3NxdWFyZScgZD0nTTQ4LjUsMS41aDE1JyAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPSdMaW5lLTgtQ29weS00JyBmaWxsPSdub25lJyBzdHJva2U9JyM2MzU2ODgnIHN0cm9rZVdpZHRoPScxJyBzdHJva2VMaW5lY2FwPSdzcXVhcmUnIGQ9J002NC41LDEuNWgxNScgLz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9nPlxuICAgICAgPC9MaW5rPlxuICAgIDwvc3ZnPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTG9nbztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL0xvZ28vaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gTmF2QmFyQ2hhbm5lbERyb3Bkb3duICh7IGNoYW5uZWxOYW1lLCBoYW5kbGVTZWxlY3Rpb24sIGRlZmF1bHRTZWxlY3Rpb24sIFZJRVcsIExPR09VVCB9KSB7XG4gIHJldHVybiAoXG4gICAgPHNlbGVjdCB0eXBlPSd0ZXh0JyBpZD0nbmF2LWJhci1jaGFubmVsLXNlbGVjdCcgY2xhc3NOYW1lPSdzZWxlY3Qgc2VsZWN0LS1hcnJvdyBsaW5rLS1uYXYnIG9uQ2hhbmdlPXtoYW5kbGVTZWxlY3Rpb259IHZhbHVlPXtkZWZhdWx0U2VsZWN0aW9ufT5cbiAgICAgIDxvcHRpb24gaWQ9J25hdi1iYXItY2hhbm5lbC1zZWxlY3QtY2hhbm5lbC1vcHRpb24nPntjaGFubmVsTmFtZX08L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9e1ZJRVd9PlZpZXc8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9e0xPR09VVH0+TG9nb3V0PC9vcHRpb24+XG4gICAgPC9zZWxlY3Q+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBOYXZCYXJDaGFubmVsRHJvcGRvd247XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duL2luZGV4LmpzeCIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgY2hhbm5lbCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgbG9nZ2VkSW5DaGFubmVsTmFtZTogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwubmFtZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9wYWdlcy9Mb2dpblBhZ2UvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5jb25zdCBBY3RpdmVTdGF0dXNCYXIgPSAoKSA9PiB7XG4gIHJldHVybiA8c3BhbiBjbGFzc05hbWU9J3Byb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItLWFjdGl2ZSc+fCA8L3NwYW4+O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWN0aXZlU3RhdHVzQmFyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvQWN0aXZlU3RhdHVzQmFyL2luZGV4LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmNvbnN0IEluYWN0aXZlU3RhdHVzQmFyID0gKCkgPT4ge1xuICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPSdwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLS1pbmFjdGl2ZSc+fCA8L3NwYW4+O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSW5hY3RpdmVTdGF0dXNCYXI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9JbmFjdGl2ZVN0YXR1c0Jhci9pbmRleC5qc3giLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgb25IYW5kbGVTaG93UGFnZVVyaSB9IGZyb20gJ2FjdGlvbnMvc2hvdyc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaG93IH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBlcnJvciAgICAgIDogc2hvdy5yZXF1ZXN0LmVycm9yLFxuICAgIHJlcXVlc3RUeXBlOiBzaG93LnJlcXVlc3QudHlwZSxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IHtcbiAgb25IYW5kbGVTaG93UGFnZVVyaSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3BhZ2VzL1Nob3dQYWdlL2luZGV4LmpzIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHNob3cgfSkgPT4ge1xuICAvLyBzZWxlY3QgcmVxdWVzdCBpbmZvXG4gIGNvbnN0IHJlcXVlc3RJZCA9IHNob3cucmVxdWVzdC5pZDtcbiAgLy8gc2VsZWN0IGFzc2V0IGluZm9cbiAgbGV0IGFzc2V0O1xuICBjb25zdCByZXF1ZXN0ID0gc2hvdy5yZXF1ZXN0TGlzdFtyZXF1ZXN0SWRdIHx8IG51bGw7XG4gIGNvbnN0IGFzc2V0TGlzdCA9IHNob3cuYXNzZXRMaXN0O1xuICBpZiAocmVxdWVzdCAmJiBhc3NldExpc3QpIHtcbiAgICBjb25zdCBhc3NldEtleSA9IHJlcXVlc3Qua2V5OyAgLy8gbm90ZToganVzdCBzdG9yZSB0aGlzIGluIHRoZSByZXF1ZXN0XG4gICAgYXNzZXQgPSBhc3NldExpc3RbYXNzZXRLZXldIHx8IG51bGw7XG4gIH07XG4gIC8vIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGFzc2V0LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0TGl0ZS9pbmRleC5qcyIsImV4cG9ydCBjb25zdCBzZWxlY3RBc3NldCA9IChzaG93KSA9PiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBzaG93LnJlcXVlc3RMaXN0W3Nob3cucmVxdWVzdC5pZF07XG4gIGNvbnN0IGFzc2V0S2V5ID0gcmVxdWVzdC5rZXk7XG4gIHJldHVybiBzaG93LmFzc2V0TGlzdFthc3NldEtleV07XG59O1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0U2hvd1N0YXRlID0gKHN0YXRlKSA9PiB7XG4gIHJldHVybiBzdGF0ZS5zaG93O1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9zZWxlY3RvcnMvc2hvdy5qcyIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaG93IH0pID0+IHtcbiAgLy8gc2VsZWN0IHJlcXVlc3QgaW5mb1xuICBjb25zdCByZXF1ZXN0SWQgPSBzaG93LnJlcXVlc3QuaWQ7XG4gIC8vIHNlbGVjdCBhc3NldCBpbmZvXG4gIGxldCBhc3NldDtcbiAgY29uc3QgcmVxdWVzdCA9IHNob3cucmVxdWVzdExpc3RbcmVxdWVzdElkXSB8fCBudWxsO1xuICBjb25zdCBhc3NldExpc3QgPSBzaG93LmFzc2V0TGlzdDtcbiAgaWYgKHJlcXVlc3QgJiYgYXNzZXRMaXN0KSB7XG4gICAgY29uc3QgYXNzZXRLZXkgPSByZXF1ZXN0LmtleTsgIC8vIG5vdGU6IGp1c3Qgc3RvcmUgdGhpcyBpbiB0aGUgcmVxdWVzdFxuICAgIGFzc2V0ID0gYXNzZXRMaXN0W2Fzc2V0S2V5XSB8fCBudWxsO1xuICB9O1xuICAvLyByZXR1cm4gcHJvcHNcbiAgcmV0dXJuIHtcbiAgICBhc3NldCxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1Nob3dBc3NldERldGFpbHMvaW5kZXguanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7IHNlbGVjdEFzc2V0IH0gZnJvbSAnc2VsZWN0b3JzL3Nob3cnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaG93IH0pID0+IHtcbiAgY29uc3QgeyBjbGFpbURhdGE6IHsgdGl0bGUgfSB9ID0gc2VsZWN0QXNzZXQoc2hvdyk7XG4gIHJldHVybiB7XG4gICAgdGl0bGUsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldFRpdGxlL2luZGV4LmpzIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQgeyBzZWxlY3RBc3NldCB9IGZyb20gJ3NlbGVjdG9ycy9zaG93JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIC8vIHNlbGVjdCBhc3NldFxuICBjb25zdCBhc3NldCA9IHNlbGVjdEFzc2V0KHNob3cpO1xuICAvLyAgcmV0dXJuIHByb3BzXG4gIHJldHVybiB7XG4gICAgYXNzZXQsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldEluZm8vaW5kZXguanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2hvdyB9KSA9PiB7XG4gIC8vIHNlbGVjdCByZXF1ZXN0IGluZm9cbiAgY29uc3QgcmVxdWVzdElkID0gc2hvdy5yZXF1ZXN0LmlkO1xuICAvLyBzZWxlY3QgcmVxdWVzdFxuICBjb25zdCBwcmV2aW91c1JlcXVlc3QgPSBzaG93LnJlcXVlc3RMaXN0W3JlcXVlc3RJZF0gfHwgbnVsbDtcbiAgLy8gc2VsZWN0IGNoYW5uZWxcbiAgbGV0IGNoYW5uZWw7XG4gIGlmIChwcmV2aW91c1JlcXVlc3QpIHtcbiAgICBjb25zdCBjaGFubmVsS2V5ID0gcHJldmlvdXNSZXF1ZXN0LmtleTtcbiAgICBjaGFubmVsID0gc2hvdy5jaGFubmVsTGlzdFtjaGFubmVsS2V5XSB8fCBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2hhbm5lbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBudWxsKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1Nob3dDaGFubmVsL2luZGV4LmpzIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IG9uVXBkYXRlQ2hhbm5lbENsYWltcyB9IGZyb20gJ2FjdGlvbnMvc2hvdyc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBzaG93IH0pID0+IHtcbiAgLy8gc2VsZWN0IGNoYW5uZWwga2V5XG4gIGNvbnN0IHJlcXVlc3QgPSBzaG93LnJlcXVlc3RMaXN0W3Nob3cucmVxdWVzdC5pZF07XG4gIGNvbnN0IGNoYW5uZWxLZXkgPSByZXF1ZXN0LmtleTtcbiAgLy8gc2VsZWN0IGNoYW5uZWwgY2xhaW1zXG4gIGNvbnN0IGNoYW5uZWwgPSBzaG93LmNoYW5uZWxMaXN0W2NoYW5uZWxLZXldIHx8IG51bGw7XG4gIC8vIHJldHVybiBwcm9wc1xuICByZXR1cm4ge1xuICAgIGNoYW5uZWxLZXksXG4gICAgY2hhbm5lbCxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IHtcbiAgb25VcGRhdGVDaGFubmVsQ2xhaW1zLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheS9pbmRleC5qcyIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoe3NpdGU6IHtkZWZhdWx0czogeyBkZWZhdWx0VGh1bWJuYWlsIH19fSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGRlZmF1bHRUaHVtYm5haWwsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29tcG9uZW50cy9Bc3NldFByZXZpZXcvaW5kZXguanMiLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgc2l0ZTogeyBob3N0LCB0aXRsZSB9IH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBob3N0LFxuICAgIHRpdGxlLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvRm91ck9oRm91clBhZ2UvaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmNsYXNzIEV4cGFuZGluZ1RleHRhcmVhIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuX2hhbmRsZUNoYW5nZSA9IHRoaXMuX2hhbmRsZUNoYW5nZS5iaW5kKHRoaXMpO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLmFkanVzdFRleHRhcmVhKHt9KTtcbiAgfVxuICBfaGFuZGxlQ2hhbmdlIChldmVudCkge1xuICAgIGNvbnN0IHsgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKG9uQ2hhbmdlKSBvbkNoYW5nZShldmVudCk7XG4gICAgdGhpcy5hZGp1c3RUZXh0YXJlYShldmVudCk7XG4gIH1cbiAgYWRqdXN0VGV4dGFyZWEgKHsgdGFyZ2V0ID0gdGhpcy5lbCB9KSB7XG4gICAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IDA7XG4gICAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IGAke3RhcmdldC5zY3JvbGxIZWlnaHR9cHhgO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyAuLi5yZXN0IH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8dGV4dGFyZWFcbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAgIHJlZj17eCA9PiB0aGlzLmVsID0geH1cbiAgICAgICAgb25DaGFuZ2U9e3RoaXMuX2hhbmRsZUNoYW5nZX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5FeHBhbmRpbmdUZXh0YXJlYS5wcm9wVHlwZXMgPSB7XG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEV4cGFuZGluZ1RleHRhcmVhO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvRXhwYW5kaW5nVGV4dEFyZWEvaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmNsYXNzIFB1Ymxpc2hQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpbWdTb3VyY2UgICAgICAgOiAnJyxcbiAgICAgIGRlZmF1bHRUaHVtYm5haWw6ICcvYXNzZXRzL2ltZy92aWRlb190aHVtYl9kZWZhdWx0LnBuZycsXG4gICAgfTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5zZXRQcmV2aWV3SW1hZ2VTb3VyY2UodGhpcy5wcm9wcy5maWxlKTtcbiAgfVxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXdQcm9wcykge1xuICAgIGlmIChuZXdQcm9wcy5maWxlICE9PSB0aGlzLnByb3BzLmZpbGUpIHtcbiAgICAgIHRoaXMuc2V0UHJldmlld0ltYWdlU291cmNlKG5ld1Byb3BzLmZpbGUpO1xuICAgIH1cbiAgICBpZiAobmV3UHJvcHMudGh1bWJuYWlsICE9PSB0aGlzLnByb3BzLnRodW1ibmFpbCkge1xuICAgICAgaWYgKG5ld1Byb3BzLnRodW1ibmFpbCkge1xuICAgICAgICB0aGlzLnNldFByZXZpZXdJbWFnZVNvdXJjZUZyb21GaWxlKG5ld1Byb3BzLnRodW1ibmFpbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbWdTb3VyY2U6IHRoaXMuc3RhdGUuZGVmYXVsdFRodW1ibmFpbH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzZXRQcmV2aWV3SW1hZ2VTb3VyY2VGcm9tRmlsZSAoZmlsZSkge1xuICAgIGNvbnN0IHByZXZpZXdSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHByZXZpZXdSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICBwcmV2aWV3UmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2ltZ1NvdXJjZTogcHJldmlld1JlYWRlci5yZXN1bHR9KTtcbiAgICB9O1xuICB9XG4gIHNldFByZXZpZXdJbWFnZVNvdXJjZSAoZmlsZSkge1xuICAgIGlmIChmaWxlLnR5cGUgIT09ICd2aWRlby9tcDQnKSB7XG4gICAgICB0aGlzLnNldFByZXZpZXdJbWFnZVNvdXJjZUZyb21GaWxlKGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy50aHVtYm5haWwpIHtcbiAgICAgICAgdGhpcy5zZXRQcmV2aWV3SW1hZ2VTb3VyY2VGcm9tRmlsZSh0aGlzLnByb3BzLnRodW1ibmFpbCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXRlKHtpbWdTb3VyY2U6IHRoaXMuc3RhdGUuZGVmYXVsdFRodW1ibmFpbH0pO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8aW1nXG4gICAgICAgIGlkPSdkcm9wem9uZS1wcmV2aWV3J1xuICAgICAgICBzcmM9e3RoaXMuc3RhdGUuaW1nU291cmNlfVxuICAgICAgICBjbGFzc05hbWU9e3RoaXMucHJvcHMuZGltUHJldmlldyA/ICdkaW0nIDogJyd9XG4gICAgICAgIGFsdD0ncHVibGlzaCBwcmV2aWV3J1xuICAgICAgLz5cbiAgICApO1xuICB9XG59O1xuXG5QdWJsaXNoUHJldmlldy5wcm9wVHlwZXMgPSB7XG4gIGRpbVByZXZpZXc6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGZpbGUgICAgICA6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgdGh1bWJuYWlsIDogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFB1Ymxpc2hQcmV2aWV3O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvUHVibGlzaFByZXZpZXcvaW5kZXguanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmZ1bmN0aW9uIFVybE1pZGRsZSAoe3B1Ymxpc2hJbkNoYW5uZWwsIHNlbGVjdGVkQ2hhbm5lbCwgbG9nZ2VkSW5DaGFubmVsTmFtZSwgbG9nZ2VkSW5DaGFubmVsU2hvcnRJZH0pIHtcbiAgaWYgKHB1Ymxpc2hJbkNoYW5uZWwpIHtcbiAgICBpZiAoc2VsZWN0ZWRDaGFubmVsID09PSBsb2dnZWRJbkNoYW5uZWxOYW1lKSB7XG4gICAgICByZXR1cm4gPHNwYW4gaWQ9J3VybC1jaGFubmVsJyBjbGFzc05hbWU9J3VybC10ZXh0LS1zZWNvbmRhcnknPntsb2dnZWRJbkNoYW5uZWxOYW1lfTp7bG9nZ2VkSW5DaGFubmVsU2hvcnRJZH0gLzwvc3Bhbj47XG4gICAgfVxuICAgIHJldHVybiA8c3BhbiBpZD0ndXJsLWNoYW5uZWwtcGxhY2Vob2xkZXInIGNsYXNzTmFtZT0ndXJsLXRleHQtLXNlY29uZGFyeSB0b29sdGlwJz5AY2hhbm5lbDxzcGFuXG4gICAgICBjbGFzc05hbWU9J3Rvb2x0aXAtdGV4dCc+U2VsZWN0IGEgY2hhbm5lbCBiZWxvdzwvc3Bhbj4gLzwvc3Bhbj47XG4gIH1cbiAgcmV0dXJuIChcbiAgICA8c3BhbiBpZD0ndXJsLW5vLWNoYW5uZWwtcGxhY2Vob2xkZXInIGNsYXNzTmFtZT0ndXJsLXRleHQtLXNlY29uZGFyeSB0b29sdGlwJz54eXo8c3BhbiBjbGFzc05hbWU9J3Rvb2x0aXAtdGV4dCc+VGhpcyB3aWxsIGJlIGEgcmFuZG9tIGlkPC9zcGFuPiAvPC9zcGFuPlxuICApO1xufVxuXG5VcmxNaWRkbGUucHJvcFR5cGVzID0ge1xuICBwdWJsaXNoSW5DaGFubmVsICAgICAgOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBsb2dnZWRJbkNoYW5uZWxOYW1lICAgOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsb2dnZWRJbkNoYW5uZWxTaG9ydElkOiBQcm9wVHlwZXMuc3RyaW5nLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgVXJsTWlkZGxlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvUHVibGlzaFVybE1pZGRsZURpc3BsYXkvaW5kZXguanN4IiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge3NldFB1Ymxpc2hJbkNoYW5uZWwsIHVwZGF0ZVNlbGVjdGVkQ2hhbm5lbCwgdXBkYXRlRXJyb3J9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBjaGFubmVsLCBwdWJsaXNoIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBsb2dnZWRJbkNoYW5uZWxOYW1lOiBjaGFubmVsLmxvZ2dlZEluQ2hhbm5lbC5uYW1lLFxuICAgIHB1Ymxpc2hJbkNoYW5uZWwgICA6IHB1Ymxpc2gucHVibGlzaEluQ2hhbm5lbCxcbiAgICBzZWxlY3RlZENoYW5uZWwgICAgOiBwdWJsaXNoLnNlbGVjdGVkQ2hhbm5lbCxcbiAgICBjaGFubmVsRXJyb3IgICAgICAgOiBwdWJsaXNoLmVycm9yLmNoYW5uZWwsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSBkaXNwYXRjaCA9PiB7XG4gIHJldHVybiB7XG4gICAgb25QdWJsaXNoSW5DaGFubmVsQ2hhbmdlOiAodmFsdWUpID0+IHtcbiAgICAgIGRpc3BhdGNoKHVwZGF0ZUVycm9yKCdjaGFubmVsJywgbnVsbCkpO1xuICAgICAgZGlzcGF0Y2goc2V0UHVibGlzaEluQ2hhbm5lbCh2YWx1ZSkpO1xuICAgIH0sXG4gICAgb25DaGFubmVsU2VsZWN0OiAodmFsdWUpID0+IHtcbiAgICAgIGRpc3BhdGNoKHVwZGF0ZUVycm9yKCdjaGFubmVsJywgbnVsbCkpO1xuICAgICAgZGlzcGF0Y2godXBkYXRlU2VsZWN0ZWRDaGFubmVsKHZhbHVlKSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbFNlbGVjdC9pbmRleC5qcyIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtjbGVhckZpbGUsIHN0YXJ0UHVibGlzaH0gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IGNoYW5uZWwsIHB1Ymxpc2ggfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGZpbGU6IHB1Ymxpc2guZmlsZSxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IHtcbiAgY2xlYXJGaWxlLFxuICBzdGFydFB1Ymxpc2gsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hEZXRhaWxzL2luZGV4LmpzIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge3VwZGF0ZU1ldGFkYXRhfSBmcm9tICdhY3Rpb25zL3B1Ymxpc2gnO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgcHVibGlzaCB9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IHB1Ymxpc2gubWV0YWRhdGEudGl0bGUsXG4gIH07XG59O1xuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSBkaXNwYXRjaCA9PiB7XG4gIHJldHVybiB7XG4gICAgb25NZXRhZGF0YUNoYW5nZTogKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVNZXRhZGF0YShuYW1lLCB2YWx1ZSkpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShWaWV3KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUaXRsZUlucHV0L2luZGV4LmpzIiwiaW1wb3J0IHt1cGRhdGVDbGFpbSwgdXBkYXRlRXJyb3J9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IGNoYW5uZWwsIHB1Ymxpc2ggfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGxvZ2dlZEluQ2hhbm5lbE5hbWUgICA6IGNoYW5uZWwubG9nZ2VkSW5DaGFubmVsLm5hbWUsXG4gICAgbG9nZ2VkSW5DaGFubmVsU2hvcnRJZDogY2hhbm5lbC5sb2dnZWRJbkNoYW5uZWwuc2hvcnRJZCxcbiAgICBmaWxlTmFtZSAgICAgICAgICAgICAgOiBwdWJsaXNoLmZpbGUubmFtZSxcbiAgICBwdWJsaXNoSW5DaGFubmVsICAgICAgOiBwdWJsaXNoLnB1Ymxpc2hJbkNoYW5uZWwsXG4gICAgc2VsZWN0ZWRDaGFubmVsICAgICAgIDogcHVibGlzaC5zZWxlY3RlZENoYW5uZWwsXG4gICAgY2xhaW0gICAgICAgICAgICAgICAgIDogcHVibGlzaC5jbGFpbSxcbiAgICB1cmxFcnJvciAgICAgICAgICAgICAgOiBwdWJsaXNoLmVycm9yLnVybCxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvbkNsYWltQ2hhbmdlOiAodmFsdWUpID0+IHtcbiAgICAgIGRpc3BhdGNoKHVwZGF0ZUNsYWltKHZhbHVlKSk7XG4gICAgICBkaXNwYXRjaCh1cGRhdGVFcnJvcigncHVibGlzaFN1Ym1pdCcsIG51bGwpKTtcbiAgICB9LFxuICAgIG9uVXJsRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlRXJyb3IoJ3VybCcsIHZhbHVlKSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFVybElucHV0L2luZGV4LmpzIiwiaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IG9uTmV3VGh1bWJuYWlsIH0gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHB1Ymxpc2g6IHsgZmlsZSB9IH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBmaWxlLFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0ge1xuICBvbk5ld1RodW1ibmFpbCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFRodW1ibmFpbElucHV0L2luZGV4LmpzIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge3VwZGF0ZU1ldGFkYXRhLCB0b2dnbGVNZXRhZGF0YUlucHV0c30gZnJvbSAnYWN0aW9ucy9wdWJsaXNoJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHB1Ymxpc2ggfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIHNob3dNZXRhZGF0YUlucHV0czogcHVibGlzaC5zaG93TWV0YWRhdGFJbnB1dHMsXG4gICAgZGVzY3JpcHRpb24gICAgICAgOiBwdWJsaXNoLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgIGxpY2Vuc2UgICAgICAgICAgIDogcHVibGlzaC5tZXRhZGF0YS5saWNlbnNlLFxuICAgIG5zZncgICAgICAgICAgICAgIDogcHVibGlzaC5tZXRhZGF0YS5uc2Z3LFxuICB9O1xufTtcblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gZGlzcGF0Y2ggPT4ge1xuICByZXR1cm4ge1xuICAgIG9uTWV0YWRhdGFDaGFuZ2U6IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2godXBkYXRlTWV0YWRhdGEobmFtZSwgdmFsdWUpKTtcbiAgICB9LFxuICAgIG9uVG9nZ2xlTWV0YWRhdGFJbnB1dHM6ICh2YWx1ZSkgPT4ge1xuICAgICAgZGlzcGF0Y2godG9nZ2xlTWV0YWRhdGFJbnB1dHModmFsdWUpKTtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoTWV0YWRhdGFJbnB1dHMvaW5kZXguanMiLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IHB1Ymxpc2ggfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIG1lc3NhZ2U6IHB1Ymxpc2guZGlzYWJsZWRNZXNzYWdlLFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG51bGwpKFZpZXcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaERpc2FibGVkTWVzc2FnZS9pbmRleC5qcyIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtjbGVhckZpbGV9IGZyb20gJ2FjdGlvbnMvcHVibGlzaCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBwdWJsaXNoIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXMgOiBwdWJsaXNoLnN0YXR1cy5zdGF0dXMsXG4gICAgbWVzc2FnZTogcHVibGlzaC5zdGF0dXMubWVzc2FnZSxcbiAgfTtcbn07XG5cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IHtcbiAgY2xlYXJGaWxlLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoU3RhdHVzL2luZGV4LmpzIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBwdWJsaXNoIH0pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBkaXNhYmxlZDogcHVibGlzaC5kaXNhYmxlZCxcbiAgICBmaWxlICAgIDogcHVibGlzaC5maWxlLFxuICAgIHN0YXR1cyAgOiBwdWJsaXNoLnN0YXR1cy5zdGF0dXMsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkoVmlldyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVG9vbC9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWhlbG1ldFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInJlYWN0LWhlbG1ldFwiXG4vLyBtb2R1bGUgaWQgPSA0OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWR1eC1zYWdhL2VmZmVjdHNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWR1eC1zYWdhL2VmZmVjdHNcIlxuLy8gbW9kdWxlIGlkID0gNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgUGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHsgZ2V0U3ViRGlyZWN0b3J5TmFtZXMgfSA9IHJlcXVpcmUoJ2J1aWxkL2dldEZvbGRlck5hbWVzLmpzJyk7XG5cbmNvbnN0IHRoaXNGb2xkZXIgPSBQYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnY2xpZW50L2NvbXBvbmVudHMvJyk7XG5sZXQgbW9kdWxlcyA9IHt9O1xuXG5nZXRTdWJEaXJlY3RvcnlOYW1lcyh0aGlzRm9sZGVyKVxuICAuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgIG1vZHVsZXNbbmFtZV0gPSByZXF1aXJlKGAuLyR7bmFtZX1gKS5kZWZhdWx0O1xuICB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBtb2R1bGVzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbXBvbmVudHMvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicGF0aFwiXG4vLyBtb2R1bGUgaWQgPSA1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBQYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgeyBnZXRTdWJEaXJlY3RvcnlOYW1lcyB9ID0gcmVxdWlyZSgnYnVpbGQvZ2V0Rm9sZGVyTmFtZXMuanMnKTtcbmNvbnN0IHRoaXNGb2xkZXIgPSBQYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnY2xpZW50L2NvbnRhaW5lcnMvJyk7XG5cbmxldCBtb2R1bGVzID0ge307XG5cbmdldFN1YkRpcmVjdG9yeU5hbWVzKHRoaXNGb2xkZXIpXG4gIC5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgbW9kdWxlc1tuYW1lXSA9IHJlcXVpcmUoYC4vJHtuYW1lfWApLmRlZmF1bHQ7XG4gIH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1vZHVsZXM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9pbmRleC5qcyIsImNvbnN0IFBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCB7IGdldFN1YkRpcmVjdG9yeU5hbWVzIH0gPSByZXF1aXJlKCdidWlsZC9nZXRGb2xkZXJOYW1lcy5qcycpO1xuY29uc3QgdGhpc0ZvbGRlciA9IFBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdjbGllbnQvcGFnZXMvJyk7XG5cbmxldCBtb2R1bGVzID0ge307XG5cbmdldFN1YkRpcmVjdG9yeU5hbWVzKHRoaXNGb2xkZXIpXG4gIC5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgbW9kdWxlc1tuYW1lXSA9IHJlcXVpcmUoYC4vJHtuYW1lfWApLmRlZmF1bHQ7XG4gIH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1vZHVsZXM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcGFnZXMvaW5kZXguanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNFTyBmcm9tICdjb21wb25lbnRzL1NFTyc7XG5pbXBvcnQgTmF2QmFyIGZyb20gJ2NvbnRhaW5lcnMvTmF2QmFyJztcbmltcG9ydCBQdWJsaXNoVG9vbCBmcm9tICdjb250YWluZXJzL1B1Ymxpc2hUb29sJztcblxuY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17J3JvdyByb3ctLXRhbGwgZmxleC1jb250YWluZXItLWNvbHVtbid9PlxuICAgICAgICA8U0VPIC8+XG4gICAgICAgIDxOYXZCYXIgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9eydyb3cgcm93LS10YWxsIHJvdy0tcGFkZGVkIGZsZXgtY29udGFpbmVyLS1jb2x1bW4nfT5cbiAgICAgICAgICA8UHVibGlzaFRvb2wgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBIb21lUGFnZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9wYWdlcy9Ib21lUGFnZS9pbmRleC5qc3giLCJjb25zdCBheGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCB7IGFwaTogeyBhcGlIb3N0LCBhcGlQb3J0IH0gfSA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9sYnJ5Q29uZmlnLmpzJyk7XG5jb25zdCBsYnJ5QXBpVXJpID0gJ2h0dHA6Ly8nICsgYXBpSG9zdCArICc6JyArIGFwaVBvcnQ7XG5jb25zdCB7IGNob29zZUdhTGJyeW5ldFB1Ymxpc2hMYWJlbCwgc2VuZEdBVGltaW5nRXZlbnQgfSA9IHJlcXVpcmUoJy4vZ29vZ2xlQW5hbHl0aWNzLmpzJyk7XG5cbmNvbnN0IGhhbmRsZUxicnluZXRSZXNwb25zZSA9ICh7IGRhdGEgfSwgcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gIGxvZ2dlci5kZWJ1ZygnbGJyeSBhcGkgZGF0YTonLCBkYXRhKTtcbiAgaWYgKGRhdGEucmVzdWx0KSB7XG4gICAgLy8gY2hlY2sgZm9yIGFuIGVycm9yXG4gICAgaWYgKGRhdGEucmVzdWx0LmVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0xicnluZXQgYXBpIGVycm9yOicsIGRhdGEucmVzdWx0LmVycm9yKTtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoZGF0YS5yZXN1bHQuZXJyb3IpKTtcbiAgICAgIHJldHVybjtcbiAgICB9O1xuICAgIHJlc29sdmUoZGF0YS5yZXN1bHQpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBmYWxsYmFjayBpbiBjYXNlIGl0IGp1c3QgdGltZWQgb3V0XG4gIHJlamVjdChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcHVibGlzaENsYWltIChwdWJsaXNoUGFyYW1zKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBsYnJ5QXBpID4+IFB1Ymxpc2hpbmcgY2xhaW0gdG8gXCIke3B1Ymxpc2hQYXJhbXMubmFtZX1cImApO1xuICAgIGNvbnN0IGdhU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYXhpb3NcbiAgICAgICAgLnBvc3QobGJyeUFwaVVyaSwge1xuICAgICAgICAgIG1ldGhvZDogJ3B1Ymxpc2gnLFxuICAgICAgICAgIHBhcmFtczogcHVibGlzaFBhcmFtcyxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdsYnJ5bmV0JywgJ3B1Ymxpc2gnLCBjaG9vc2VHYUxicnluZXRQdWJsaXNoTGFiZWwocHVibGlzaFBhcmFtcyksIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICBoYW5kbGVMYnJ5bmV0UmVzcG9uc2UocmVzcG9uc2UsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldENsYWltICh1cmkpIHtcbiAgICBsb2dnZXIuZGVidWcoYGxicnlBcGkgPj4gR2V0dGluZyBDbGFpbSBmb3IgXCIke3VyaX1cImApO1xuICAgIGNvbnN0IGdhU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYXhpb3NcbiAgICAgICAgLnBvc3QobGJyeUFwaVVyaSwge1xuICAgICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgICAgcGFyYW1zOiB7IHVyaSwgdGltZW91dDogMjAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdsYnJ5bmV0JywgJ2dldENsYWltJywgJ0dFVCcsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICBoYW5kbGVMYnJ5bmV0UmVzcG9uc2UocmVzcG9uc2UsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldENsYWltTGlzdCAoY2xhaW1OYW1lKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBsYnJ5QXBpID4+IEdldHRpbmcgY2xhaW1fbGlzdCBmb3IgXCIke2NsYWltTmFtZX1cImApO1xuICAgIGNvbnN0IGdhU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYXhpb3NcbiAgICAgICAgLnBvc3QobGJyeUFwaVVyaSwge1xuICAgICAgICAgIG1ldGhvZDogJ2NsYWltX2xpc3QnLFxuICAgICAgICAgIHBhcmFtczogeyBuYW1lOiBjbGFpbU5hbWUgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdsYnJ5bmV0JywgJ2dldENsYWltTGlzdCcsICdDTEFJTV9MSVNUJywgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgICAgIGhhbmRsZUxicnluZXRSZXNwb25zZShyZXNwb25zZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgcmVzb2x2ZVVyaSAodXJpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBsYnJ5QXBpID4+IFJlc29sdmluZyBVUkkgZm9yIFwiJHt1cml9XCJgKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdyZXNvbHZlJyxcbiAgICAgICAgICBwYXJhbXM6IHsgdXJpIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdsYnJ5bmV0JywgJ3Jlc29sdmVVcmknLCAnUkVTT0xWRScsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICBpZiAoZGF0YS5yZXN1bHRbdXJpXS5lcnJvcikgeyAgLy8gY2hlY2sgZm9yIGVycm9yc1xuICAgICAgICAgICAgcmVqZWN0KGRhdGEucmVzdWx0W3VyaV0uZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7ICAvLyBpZiBubyBlcnJvcnMsIHJlc29sdmVcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YS5yZXN1bHRbdXJpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXREb3dubG9hZERpcmVjdG9yeSAoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdsYnJ5QXBpID4+IFJldHJpZXZpbmcgdGhlIGRvd25sb2FkIGRpcmVjdG9yeSBwYXRoIGZyb20gbGJyeSBkYWVtb24uLi4nKTtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KGxicnlBcGlVcmksIHtcbiAgICAgICAgICBtZXRob2Q6ICdzZXR0aW5nc19nZXQnLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdnZXREb3dubG9hZERpcmVjdG9yeScsICdTRVRUSU5HU19HRVQnLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgaWYgKGRhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEucmVzdWx0LmRvd25sb2FkX2RpcmVjdG9yeSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1N1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gbGJyeSBkYWVtb24sIGJ1dCB1bmFibGUgdG8gcmV0cmlldmUgdGhlIGRvd25sb2FkIGRpcmVjdG9yeS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdMYnJ5bmV0IEVycm9yOicsIGVycm9yKTtcbiAgICAgICAgICByZXNvbHZlKCcvaG9tZS9sYnJ5L0Rvd25sb2Fkcy8nKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGNyZWF0ZUNoYW5uZWwgKG5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYGxicnlBcGkgPj4gQ3JlYXRpbmcgY2hhbm5lbCBmb3IgJHtuYW1lfS4uLmApO1xuICAgIGNvbnN0IGdhU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYXhpb3NcbiAgICAgICAgLnBvc3QobGJyeUFwaVVyaSwge1xuICAgICAgICAgIG1ldGhvZDogJ2NoYW5uZWxfbmV3JyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGNoYW5uZWxfbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGFtb3VudCAgICAgIDogMC4xLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnbGJyeW5ldCcsICdjcmVhdGVDaGFubmVsJywgJ0NIQU5ORUxfTkVXJywgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgICAgIGhhbmRsZUxicnluZXRSZXNwb25zZShyZXNwb25zZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9sYnJ5QXBpLmpzIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgdWEgPSByZXF1aXJlKCd1bml2ZXJzYWwtYW5hbHl0aWNzJyk7XG5jb25zdCB7IGFuYWx5dGljcyA6IHsgZ29vZ2xlSWQgfSwgZGV0YWlsczogeyB0aXRsZSB9IH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5mdW5jdGlvbiBjcmVhdGVTZXJ2ZUV2ZW50UGFyYW1zIChoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwpIHtcbiAgcmV0dXJuIHtcbiAgICBldmVudENhdGVnb3J5ICAgIDogJ2NsaWVudCByZXF1ZXN0cycsXG4gICAgZXZlbnRBY3Rpb24gICAgICA6ICdzZXJ2ZSByZXF1ZXN0JyxcbiAgICBldmVudExhYmVsICAgICAgIDogb3JpZ2luYWxVcmwsXG4gICAgaXBPdmVycmlkZSAgICAgICA6IGlwLFxuICAgIHVzZXJBZ2VudE92ZXJyaWRlOiBoZWFkZXJzWyd1c2VyLWFnZW50J10sXG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVQdWJsaXNoVGltaW5nRXZlbnRQYXJhbXMgKGNhdGVnb3J5LCB2YXJpYWJsZSwgbGFiZWwsIHN0YXJ0VGltZSwgZW5kVGltZSkge1xuICBjb25zdCBkdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gIHJldHVybiB7XG4gICAgdXNlclRpbWluZ0NhdGVnb3J5ICAgIDogY2F0ZWdvcnksXG4gICAgdXNlclRpbWluZ1ZhcmlhYmxlTmFtZTogdmFyaWFibGUsXG4gICAgdXNlclRpbWluZ1RpbWUgICAgICAgIDogZHVyYXRpb24sXG4gICAgdXNlclRpbWluZ0xhYmVsICAgICAgIDogbGFiZWwsXG4gIH07XG59O1xuXG5mdW5jdGlvbiBzZW5kR29vZ2xlQW5hbHl0aWNzRXZlbnQgKGlwLCBwYXJhbXMpIHtcbiAgY29uc3QgdmlzaXRvcklkID0gaXAucmVwbGFjZSgvXFwuL2csICctJyk7XG4gIGNvbnN0IHZpc2l0b3IgPSB1YShnb29nbGVJZCwgdmlzaXRvcklkLCB7IHN0cmljdENpZEZvcm1hdDogZmFsc2UsIGh0dHBzOiB0cnVlIH0pO1xuICB2aXNpdG9yLmV2ZW50KHBhcmFtcywgKGVycikgPT4ge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignR29vZ2xlIEFuYWx5dGljcyBFdmVudCBFcnJvciA+PicsIGVycik7XG4gICAgfVxuICB9KTtcbn07XG5cbmZ1bmN0aW9uIHNlbmRHb29nbGVBbmFseXRpY3NUaW1pbmcgKHZpc2l0b3JJZCwgcGFyYW1zKSB7XG4gIGNvbnN0IHZpc2l0b3IgPSB1YShnb29nbGVJZCwgdmlzaXRvcklkLCB7IHN0cmljdENpZEZvcm1hdDogZmFsc2UsIGh0dHBzOiB0cnVlIH0pO1xuICB2aXNpdG9yLnRpbWluZyhwYXJhbXMsIChlcnIpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dvb2dsZSBBbmFseXRpY3MgRXZlbnQgRXJyb3IgPj4nLCBlcnIpO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoYFRpbWluZyBldmVudCBzdWNjZXNzZnVsbHkgc2VudCB0byBnb29nbGUgYW5hbHl0aWNzYCk7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNlbmRHQVNlcnZlRXZlbnQgKGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IGNyZWF0ZVNlcnZlRXZlbnRQYXJhbXMoaGVhZGVycywgaXAsIG9yaWdpbmFsVXJsKTtcbiAgICBzZW5kR29vZ2xlQW5hbHl0aWNzRXZlbnQoaXAsIHBhcmFtcyk7XG4gIH0sXG4gIHNlbmRHQVRpbWluZ0V2ZW50IChjYXRlZ29yeSwgdmFyaWFibGUsIGxhYmVsLCBzdGFydFRpbWUsIGVuZFRpbWUpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBjcmVhdGVQdWJsaXNoVGltaW5nRXZlbnRQYXJhbXMoY2F0ZWdvcnksIHZhcmlhYmxlLCBsYWJlbCwgc3RhcnRUaW1lLCBlbmRUaW1lKTtcbiAgICBzZW5kR29vZ2xlQW5hbHl0aWNzVGltaW5nKHRpdGxlLCBwYXJhbXMpO1xuICB9LFxuICBjaG9vc2VHYUxicnluZXRQdWJsaXNoTGFiZWwgKHsgY2hhbm5lbF9uYW1lOiBjaGFubmVsTmFtZSwgY2hhbm5lbF9pZDogY2hhbm5lbElkIH0pIHtcbiAgICByZXR1cm4gKGNoYW5uZWxOYW1lIHx8IGNoYW5uZWxJZCA/ICdQVUJMSVNIX0lOX0NIQU5ORUxfQ0xBSU0nIDogJ1BVQkxJU0hfQU5PTllNT1VTX0NMQUlNJyk7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvZ29vZ2xlQW5hbHl0aWNzLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVkdXhcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWR1eFwiXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCB7IGN1c3RvbUNvbXBvbmVudHMgfSA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5cbmZ1bmN0aW9uIGdldERlZXBlc3RDaGlsZFZhbHVlIChwYXJlbnQsIGNoaWxkcmVuS2V5cykge1xuICBsZXQgY2hpbGRLZXkgPSBjaGlsZHJlbktleXMuc2hpZnQoKTsgLy8gLnNoaWZ0KCkgcmV0cmlldmVzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IGFuZCByZW1vdmVzIGl0IGZyb20gYXJyYXlcbiAgbGV0IGNoaWxkID0gcGFyZW50W2NoaWxkS2V5XTtcbiAgaWYgKGNoaWxkcmVuS2V5cy5sZW5ndGggPj0gMSkge1xuICAgIHJldHVybiBnZXREZWVwZXN0Q2hpbGRWYWx1ZShjaGlsZCwgY2hpbGRyZW5LZXlzKTtcbiAgfVxuICByZXR1cm4gY2hpbGQ7XG59XG5cbmV4cG9ydCBjb25zdCBkeW5hbWljSW1wb3J0ID0gKGZpbGVQYXRoKSA9PiB7XG4gIC8vIHZhbGlkYXRlIGlucHV0c1xuICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHBhdGggcHJvdmlkZWQgdG8gZHluYW1pY0ltcG9ydCgpJyk7XG4gIH1cbiAgaWYgKHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICBjb25zb2xlLmxvZygnZHluYW1pY0ltcG9ydCA+IGZpbGVQYXRoOicsIGZpbGVQYXRoKTtcbiAgICBjb25zb2xlLmxvZygnZHluYW1pY0ltcG9ydCA+IGZpbGVQYXRoIHR5cGU6JywgdHlwZW9mIGZpbGVQYXRoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbGUgcGF0aCBwcm92aWRlZCB0byBkeW5hbWljSW1wb3J0KCkgbXVzdCBiZSBhIHN0cmluZycpO1xuICB9XG4gIGlmICghY3VzdG9tQ29tcG9uZW50cykge1xuICAgIHJldHVybiByZXF1aXJlKGAke2ZpbGVQYXRofWApO1xuICB9XG4gIC8vIHNwbGl0IG91dCB0aGUgZmlsZSBmb2xkZXJzICAvLyBmaWx0ZXIgb3V0IGFueSBlbXB0eSBvciB3aGl0ZS1zcGFjZS1vbmx5IHN0cmluZ3NcbiAgY29uc3QgZm9sZGVycyA9IGZpbGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKGZvbGRlck5hbWUgPT4gZm9sZGVyTmFtZS5yZXBsYWNlKC9cXHMvZywgJycpLmxlbmd0aCk7XG4gIC8vIGNoZWNrIGZvciB0aGUgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gZmlsZSBwYXRoIGluIHRoZSBzaXRlIGNvbmZpZyBvYmplY3RcbiAgLy8gaS5lLiBjdXN0b21Db21wb25lbnRzW2ZvbGRlcnNbMF1dW2ZvbGRlcnNbMl1bLi4uXVtmb2xkZXJzW25dXVxuICBjb25zdCBjb21wb25lbnQgPSBnZXREZWVwZXN0Q2hpbGRWYWx1ZShjdXN0b21Db21wb25lbnRzLCBmb2xkZXJzKTtcbiAgaWYgKGNvbXBvbmVudCkge1xuICAgIHJldHVybiBjb21wb25lbnQ7ICAvLyByZXR1cm4gY3VzdG9tIGNvbXBvbmVudFxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXF1aXJlKGAke2ZpbGVQYXRofWApO1xuICB9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3V0aWxzL2R5bmFtaWNJbXBvcnQuanMiLCJjb25zdCBjcmVhdGVCYXNpY0Nhbm9uaWNhbExpbmsgPSAocGFnZSwgc2l0ZUhvc3QpID0+IHtcbiAgcmV0dXJuIGAke3NpdGVIb3N0fS8ke3BhZ2V9YDtcbn07XG5cbmNvbnN0IGNyZWF0ZUFzc2V0Q2Fub25pY2FsTGluayA9IChhc3NldCwgc2l0ZUhvc3QpID0+IHtcbiAgbGV0IGNoYW5uZWxOYW1lLCBjZXJ0aWZpY2F0ZUlkLCBuYW1lLCBjbGFpbUlkO1xuICBpZiAoYXNzZXQuY2xhaW1EYXRhKSB7XG4gICAgKHsgY2hhbm5lbE5hbWUsIGNlcnRpZmljYXRlSWQsIG5hbWUsIGNsYWltSWQgfSA9IGFzc2V0LmNsYWltRGF0YSk7XG4gIH07XG4gIGlmIChjaGFubmVsTmFtZSkge1xuICAgIHJldHVybiBgJHtzaXRlSG9zdH0vJHtjaGFubmVsTmFtZX06JHtjZXJ0aWZpY2F0ZUlkfS8ke25hbWV9YDtcbiAgfTtcbiAgcmV0dXJuIGAke3NpdGVIb3N0fS8ke2NsYWltSWR9LyR7bmFtZX1gO1xufTtcblxuY29uc3QgY3JlYXRlQ2hhbm5lbENhbm9uaWNhbExpbmsgPSAoY2hhbm5lbCwgc2l0ZUhvc3QpID0+IHtcbiAgY29uc3QgeyBuYW1lLCBsb25nSWQgfSA9IGNoYW5uZWw7XG4gIHJldHVybiBgJHtzaXRlSG9zdH0vJHtuYW1lfToke2xvbmdJZH1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNhbm9uaWNhbExpbmsgPSAoYXNzZXQsIGNoYW5uZWwsIHBhZ2UsIHNpdGVIb3N0KSA9PiB7XG4gIGlmIChhc3NldCkge1xuICAgIHJldHVybiBjcmVhdGVBc3NldENhbm9uaWNhbExpbmsoYXNzZXQsIHNpdGVIb3N0KTtcbiAgfVxuICBpZiAoY2hhbm5lbCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFubmVsQ2Fub25pY2FsTGluayhjaGFubmVsLCBzaXRlSG9zdCk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJhc2ljQ2Fub25pY2FsTGluayhwYWdlLCBzaXRlSG9zdCk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3V0aWxzL2Nhbm9uaWNhbExpbmsuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVGaWxlIChmaWxlKSB7XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZpbGUgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgaWYgKC8nLy50ZXN0KGZpbGUubmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXBvc3Ryb3BoZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBmaWxlIG5hbWUnKTtcbiAgICB9XG4gICAgLy8gdmFsaWRhdGUgc2l6ZSBhbmQgdHlwZVxuICAgIHN3aXRjaCAoZmlsZS50eXBlKSB7XG4gICAgICBjYXNlICdpbWFnZS9qcGVnJzpcbiAgICAgIGNhc2UgJ2ltYWdlL2pwZyc6XG4gICAgICBjYXNlICdpbWFnZS9wbmcnOlxuICAgICAgICBpZiAoZmlsZS5zaXplID4gMTAwMDAwMDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvcnJ5LCBpbWFnZXMgYXJlIGxpbWl0ZWQgdG8gMTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzpcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IDUwMDAwMDAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3JyeSwgR0lGcyBhcmUgbGltaXRlZCB0byA1MCBtZWdhYnl0ZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd2aWRlby9tcDQnOlxuICAgICAgICBpZiAoZmlsZS5zaXplID4gNTAwMDAwMDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvcnJ5LCB2aWRlb3MgYXJlIGxpbWl0ZWQgdG8gNTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZpbGUudHlwZSArICcgaXMgbm90IGEgc3VwcG9ydGVkIGZpbGUgdHlwZS4gT25seSwgLmpwZWcsIC5wbmcsIC5naWYsIGFuZCAubXA0IGZpbGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvdXRpbHMvZmlsZS5qcyIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBSRUdFWFBfSU5WQUxJRF9DTEFJTSAgOiAvW15BLVphLXowLTktXS9nLFxuICBSRUdFWFBfSU5WQUxJRF9DSEFOTkVMOiAvW15BLVphLXowLTktQF0vZyxcbiAgUkVHRVhQX0FERFJFU1MgICAgICAgIDogL15iKD89W14wT0lsXXszMiwzM30pWzAtOUEtWmEtel17MzIsMzN9JC8sXG4gIENIQU5ORUxfQ0hBUiAgICAgICAgICA6ICdAJyxcbiAgcGFyc2VJZGVudGlmaWVyICAgICAgIDogZnVuY3Rpb24gKGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBjb21wb25lbnRzUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJyhbXjokIy9dKiknICsgLy8gdmFsdWUgKHN0b3BzIGF0IHRoZSBmaXJzdCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICAgJyhbOiQjXT8pKFteL10qKScgLy8gbW9kaWZpZXIgc2VwYXJhdG9yLCBtb2RpZmllciAoc3RvcHMgYXQgdGhlIGZpcnN0IHBhdGggc2VwYXJhdG9yIG9yIGVuZClcbiAgICApO1xuICAgIGNvbnN0IFtwcm90bywgdmFsdWUsIG1vZGlmaWVyU2VwZXJhdG9yLCBtb2RpZmllcl0gPSBjb21wb25lbnRzUmVnZXggIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIC5leGVjKGlkZW50aWZpZXIpXG4gICAgICAubWFwKG1hdGNoID0+IG1hdGNoIHx8IG51bGwpO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgbmFtZVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciBVUkwuICBObyBjaGFubmVsIG5hbWUgcHJvdmlkZWQgYmVmb3JlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cImApO1xuICAgIH1cbiAgICBjb25zdCBpc0NoYW5uZWwgPSB2YWx1ZS5zdGFydHNXaXRoKG1vZHVsZS5leHBvcnRzLkNIQU5ORUxfQ0hBUik7XG4gICAgY29uc3QgY2hhbm5lbE5hbWUgPSBpc0NoYW5uZWwgPyB2YWx1ZSA6IG51bGw7XG4gICAgbGV0IGNsYWltSWQ7XG4gICAgaWYgKGlzQ2hhbm5lbCkge1xuICAgICAgaWYgKCFjaGFubmVsTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrIHlvdXIgVVJMLiAgTm8gY2hhbm5lbCBuYW1lIGFmdGVyIFwiQFwiLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZUJhZENoYXJzID0gKGNoYW5uZWxOYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DSEFOTkVMKTtcbiAgICAgIGlmIChuYW1lQmFkQ2hhcnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIEludmFsaWQgY2hhcmFjdGVycyBpbiBjaGFubmVsIG5hbWU6IFwiJHtuYW1lQmFkQ2hhcnMuam9pbignLCAnKX1cIi5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2xhaW1JZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgbGV0IGNoYW5uZWxDbGFpbUlkO1xuICAgIGlmIChtb2RpZmllclNlcGVyYXRvcikge1xuICAgICAgaWYgKCFtb2RpZmllcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgTm8gbW9kaWZpZXIgcHJvdmlkZWQgYWZ0ZXIgc2VwYXJhdG9yIFwiJHttb2RpZmllclNlcGVyYXRvcn1cImApO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kaWZpZXJTZXBlcmF0b3IgPT09ICc6Jykge1xuICAgICAgICBjaGFubmVsQ2xhaW1JZCA9IG1vZGlmaWVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIFRoZSBcIiR7bW9kaWZpZXJTZXBlcmF0b3J9XCIgbW9kaWZpZXIgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQ2hhbm5lbCxcbiAgICAgIGNoYW5uZWxOYW1lLFxuICAgICAgY2hhbm5lbENsYWltSWQ6IGNoYW5uZWxDbGFpbUlkIHx8IG51bGwsXG4gICAgICBjbGFpbUlkICAgICAgIDogY2xhaW1JZCB8fCBudWxsLFxuICAgIH07XG4gIH0sXG4gIHBhcnNlQ2xhaW06IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgY29uc3QgY29tcG9uZW50c1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICcoW146JCMvLl0qKScgKyAvLyBuYW1lIChzdG9wcyBhdCB0aGUgZmlyc3QgZXh0ZW5zaW9uKVxuICAgICAgJyhbOiQjLl0/KShbXi9dKiknIC8vIGV4dGVuc2lvbiBzZXBhcmF0b3IsIGV4dGVuc2lvbiAoc3RvcHMgYXQgdGhlIGZpcnN0IHBhdGggc2VwYXJhdG9yIG9yIGVuZClcbiAgICApO1xuICAgIGNvbnN0IFtwcm90bywgY2xhaW1OYW1lLCBleHRlbnNpb25TZXBlcmF0b3IsIGV4dGVuc2lvbl0gPSBjb21wb25lbnRzUmVnZXggLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgLmV4ZWMobmFtZSlcbiAgICAgIC5tYXAobWF0Y2ggPT4gbWF0Y2ggfHwgbnVsbCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBuYW1lXG4gICAgaWYgKCFjbGFpbU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2sgeW91ciBVUkwuICBObyBjbGFpbSBuYW1lIHByb3ZpZGVkIGJlZm9yZSBcIi5cIicpO1xuICAgIH1cbiAgICBjb25zdCBuYW1lQmFkQ2hhcnMgPSAoY2xhaW1OYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DTEFJTSk7XG4gICAgaWYgKG5hbWVCYWRDaGFycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVjayB5b3VyIFVSTC4gIEludmFsaWQgY2hhcmFjdGVycyBpbiBjbGFpbSBuYW1lOiBcIiR7bmFtZUJhZENoYXJzLmpvaW4oJywgJyl9XCIuYCk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIGV4dGVuc2lvblxuICAgIGlmIChleHRlbnNpb25TZXBlcmF0b3IpIHtcbiAgICAgIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciBVUkwuICBObyBmaWxlIGV4dGVuc2lvbiBwcm92aWRlZCBhZnRlciBzZXBhcmF0b3IgXCIke2V4dGVuc2lvblNlcGVyYXRvcn1cIi5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChleHRlbnNpb25TZXBlcmF0b3IgIT09ICcuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZWNrIHlvdXIgVVJMLiAgVGhlIFwiJHtleHRlbnNpb25TZXBlcmF0b3J9XCIgc2VwYXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGNsYWltIG5hbWUuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjbGFpbU5hbWUsXG4gICAgICBleHRlbnNpb246IGV4dGVuc2lvbiB8fCBudWxsLFxuICAgIH07XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3V0aWxzL2xicnlVcmkuanMiLCJjb25zdCBkZXRlcm1pbmVPZ1RodW1ibmFpbENvbnRlbnRUeXBlID0gKHRodW1ibmFpbCkgPT4ge1xuICBpZiAodGh1bWJuYWlsKSB7XG4gICAgY29uc3QgZmlsZUV4dCA9IHRodW1ibmFpbC5zdWJzdHJpbmcodGh1bWJuYWlsLmxhc3RJbmRleE9mKCcuJykpO1xuICAgIHN3aXRjaCAoZmlsZUV4dCkge1xuICAgICAgY2FzZSAnanBlZyc6XG4gICAgICBjYXNlICdqcGcnOlxuICAgICAgICByZXR1cm4gJ2ltYWdlL2pwZWcnO1xuICAgICAgY2FzZSAncG5nJzpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9wbmcnO1xuICAgICAgY2FzZSAnZ2lmJzpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9naWYnO1xuICAgICAgY2FzZSAnbXA0JzpcbiAgICAgICAgcmV0dXJuICd2aWRlby9tcDQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdpbWFnZS9qcGVnJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufTtcblxuY29uc3QgY3JlYXRlQmFzaWNNZXRhVGFncyA9IChzaXRlSG9zdCwgc2l0ZURlc2NyaXB0aW9uLCBzaXRlVGl0bGUsIHNpdGVUd2l0dGVyKSA9PiB7XG4gIHJldHVybiBbXG4gICAge3Byb3BlcnR5OiAnb2c6dGl0bGUnLCBjb250ZW50OiBzaXRlVGl0bGV9LFxuICAgIHtwcm9wZXJ0eTogJ29nOnVybCcsIGNvbnRlbnQ6IHNpdGVIb3N0fSxcbiAgICB7cHJvcGVydHk6ICdvZzpzaXRlX25hbWUnLCBjb250ZW50OiBzaXRlVGl0bGV9LFxuICAgIHtwcm9wZXJ0eTogJ29nOmRlc2NyaXB0aW9uJywgY29udGVudDogc2l0ZURlc2NyaXB0aW9ufSxcbiAgICB7cHJvcGVydHk6ICd0d2l0dGVyOnNpdGUnLCBjb250ZW50OiBzaXRlVHdpdHRlcn0sXG4gICAge3Byb3BlcnR5OiAndHdpdHRlcjpjYXJkJywgY29udGVudDogJ3N1bW1hcnknfSxcbiAgXTtcbn07XG5cbmNvbnN0IGNyZWF0ZUNoYW5uZWxNZXRhVGFncyA9IChzaXRlVGl0bGUsIHNpdGVIb3N0LCBzaXRlVHdpdHRlciwgY2hhbm5lbCkgPT4ge1xuICBjb25zdCB7IG5hbWUsIGxvbmdJZCB9ID0gY2hhbm5lbDtcbiAgcmV0dXJuIFtcbiAgICB7cHJvcGVydHk6ICdvZzp0aXRsZScsIGNvbnRlbnQ6IGAke25hbWV9IG9uICR7c2l0ZVRpdGxlfWB9LFxuICAgIHtwcm9wZXJ0eTogJ29nOnVybCcsIGNvbnRlbnQ6IGAke3NpdGVIb3N0fS8ke25hbWV9OiR7bG9uZ0lkfWB9LFxuICAgIHtwcm9wZXJ0eTogJ29nOnNpdGVfbmFtZScsIGNvbnRlbnQ6IHNpdGVUaXRsZX0sXG4gICAge3Byb3BlcnR5OiAnb2c6ZGVzY3JpcHRpb24nLCBjb250ZW50OiBgJHtuYW1lfSwgYSBjaGFubmVsIG9uICR7c2l0ZVRpdGxlfWB9LFxuICAgIHtwcm9wZXJ0eTogJ3R3aXR0ZXI6c2l0ZScsIGNvbnRlbnQ6IHNpdGVUd2l0dGVyfSxcbiAgICB7cHJvcGVydHk6ICd0d2l0dGVyOmNhcmQnLCBjb250ZW50OiAnc3VtbWFyeSd9LFxuICBdO1xufTtcblxuY29uc3QgY3JlYXRlQXNzZXRNZXRhVGFncyA9IChzaXRlSG9zdCwgc2l0ZVRpdGxlLCBzaXRlVHdpdHRlciwgYXNzZXQsIGRlZmF1bHREZXNjcmlwdGlvbiwgZGVmYXVsdFRodW1ibmFpbCkgPT4ge1xuICBjb25zdCB7IGNsYWltRGF0YSB9ID0gYXNzZXQ7XG4gIGNvbnN0IHsgY29udGVudFR5cGUgfSA9IGNsYWltRGF0YTtcbiAgY29uc3QgZW1iZWRVcmwgPSBgJHtzaXRlSG9zdH0vJHtjbGFpbURhdGEuY2xhaW1JZH0vJHtjbGFpbURhdGEubmFtZX1gO1xuICBjb25zdCBzaG93VXJsID0gYCR7c2l0ZUhvc3R9LyR7Y2xhaW1EYXRhLmNsYWltSWR9LyR7Y2xhaW1EYXRhLm5hbWV9YDtcbiAgY29uc3Qgc291cmNlID0gYCR7c2l0ZUhvc3R9LyR7Y2xhaW1EYXRhLmNsYWltSWR9LyR7Y2xhaW1EYXRhLm5hbWV9LiR7Y2xhaW1EYXRhLmZpbGVFeHR9YDtcbiAgY29uc3Qgb2dUaXRsZSA9IGNsYWltRGF0YS50aXRsZSB8fCBjbGFpbURhdGEubmFtZTtcbiAgY29uc3Qgb2dEZXNjcmlwdGlvbiA9IGNsYWltRGF0YS5kZXNjcmlwdGlvbiB8fCBkZWZhdWx0RGVzY3JpcHRpb247XG4gIGNvbnN0IG9nVGh1bWJuYWlsQ29udGVudFR5cGUgPSBkZXRlcm1pbmVPZ1RodW1ibmFpbENvbnRlbnRUeXBlKGNsYWltRGF0YS50aHVtYm5haWwpO1xuICBjb25zdCBvZ1RodW1ibmFpbCA9IGNsYWltRGF0YS50aHVtYm5haWwgfHwgZGVmYXVsdFRodW1ibmFpbDtcbiAgY29uc3QgbWV0YVRhZ3MgPSBbXG4gICAge3Byb3BlcnR5OiAnb2c6dGl0bGUnLCBjb250ZW50OiBvZ1RpdGxlfSxcbiAgICB7cHJvcGVydHk6ICdvZzp1cmwnLCBjb250ZW50OiBzaG93VXJsfSxcbiAgICB7cHJvcGVydHk6ICdvZzpzaXRlX25hbWUnLCBjb250ZW50OiBzaXRlVGl0bGV9LFxuICAgIHtwcm9wZXJ0eTogJ29nOmRlc2NyaXB0aW9uJywgY29udGVudDogb2dEZXNjcmlwdGlvbn0sXG4gICAge3Byb3BlcnR5OiAnb2c6aW1hZ2U6d2lkdGgnLCBjb250ZW50OiA2MDB9LFxuICAgIHtwcm9wZXJ0eTogJ29nOmltYWdlOmhlaWdodCcsIGNvbnRlbnQ6IDMxNX0sXG4gICAge3Byb3BlcnR5OiAndHdpdHRlcjpzaXRlJywgY29udGVudDogc2l0ZVR3aXR0ZXJ9LFxuICBdO1xuICBpZiAoY29udGVudFR5cGUgPT09ICd2aWRlby9tcDQnIHx8IGNvbnRlbnRUeXBlID09PSAndmlkZW8vd2VibScpIHtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ29nOnZpZGVvJywgY29udGVudDogc291cmNlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp2aWRlbzpzZWN1cmVfdXJsJywgY29udGVudDogc291cmNlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp2aWRlbzp0eXBlJywgY29udGVudDogY29udGVudFR5cGV9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ29nOmltYWdlJywgY29udGVudDogb2dUaHVtYm5haWx9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ29nOmltYWdlOnR5cGUnLCBjb250ZW50OiBvZ1RodW1ibmFpbENvbnRlbnRUeXBlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp0eXBlJywgY29udGVudDogJ3ZpZGVvJ30pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjpjYXJkJywgY29udGVudDogJ3BsYXllcid9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6cGxheWVyJywgY29udGVudDogZW1iZWRVcmx9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6cGxheWVyOndpZHRoJywgY29udGVudDogNjAwfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnRleHQ6cGxheWVyX3dpZHRoJywgY29udGVudDogNjAwfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOnBsYXllcjpoZWlnaHQnLCBjb250ZW50OiAzMzd9KTtcbiAgICBtZXRhVGFncy5wdXNoKHtwcm9wZXJ0eTogJ3R3aXR0ZXI6cGxheWVyOnN0cmVhbScsIGNvbnRlbnQ6IHNvdXJjZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAndHdpdHRlcjpwbGF5ZXI6c3RyZWFtOmNvbnRlbnRfdHlwZScsIGNvbnRlbnQ6IGNvbnRlbnRUeXBlfSk7XG4gIH0gZWxzZSB7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzppbWFnZScsIGNvbnRlbnQ6IHNvdXJjZX0pO1xuICAgIG1ldGFUYWdzLnB1c2goe3Byb3BlcnR5OiAnb2c6aW1hZ2U6dHlwZScsIGNvbnRlbnQ6IGNvbnRlbnRUeXBlfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICdvZzp0eXBlJywgY29udGVudDogJ2FydGljbGUnfSk7XG4gICAgbWV0YVRhZ3MucHVzaCh7cHJvcGVydHk6ICd0d2l0dGVyOmNhcmQnLCBjb250ZW50OiAnc3VtbWFyeV9sYXJnZV9pbWFnZSd9KTtcbiAgfVxuICByZXR1cm4gbWV0YVRhZ3M7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWV0YVRhZ3MgPSAoc2l0ZURlc2NyaXB0aW9uLCBzaXRlSG9zdCwgc2l0ZVRpdGxlLCBzaXRlVHdpdHRlciwgYXNzZXQsIGNoYW5uZWwsIGRlZmF1bHREZXNjcmlwdGlvbiwgZGVmYXVsdFRodW1ibmFpbCkgPT4ge1xuICBpZiAoYXNzZXQpIHtcbiAgICByZXR1cm4gY3JlYXRlQXNzZXRNZXRhVGFncyhzaXRlSG9zdCwgc2l0ZVRpdGxlLCBzaXRlVHdpdHRlciwgYXNzZXQsIGRlZmF1bHREZXNjcmlwdGlvbiwgZGVmYXVsdFRodW1ibmFpbCk7XG4gIH07XG4gIGlmIChjaGFubmVsKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYW5uZWxNZXRhVGFncyhzaXRlSG9zdCwgc2l0ZVRpdGxlLCBzaXRlVHdpdHRlciwgY2hhbm5lbCk7XG4gIH07XG4gIHJldHVybiBjcmVhdGVCYXNpY01ldGFUYWdzKHNpdGVEZXNjcmlwdGlvbiwgc2l0ZUhvc3QsIHNpdGVUaXRsZSwgc2l0ZVR3aXR0ZXIpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC91dGlscy9tZXRhVGFncy5qcyIsImV4cG9ydCBjb25zdCBjcmVhdGVQYWdlVGl0bGUgPSAoc2l0ZVRpdGxlLCBwYWdlVGl0bGUpID0+IHtcbiAgaWYgKCFwYWdlVGl0bGUpIHtcbiAgICByZXR1cm4gYCR7c2l0ZVRpdGxlfWA7XG4gIH1cbiAgcmV0dXJuIGAke3NpdGVUaXRsZX0gLSAke3BhZ2VUaXRsZX1gO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC91dGlscy9wYWdlVGl0bGUuanMiLCJpbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJ2NvbnN0YW50cy9jaGFubmVsX2FjdGlvbl90eXBlcyc7XG5cbi8vIGV4cG9ydCBhY3Rpb24gY3JlYXRvcnNcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxvZ2dlZEluQ2hhbm5lbCAobmFtZSwgc2hvcnRJZCwgbG9uZ0lkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogYWN0aW9ucy5DSEFOTkVMX1VQREFURSxcbiAgICBkYXRhOiB7XG4gICAgICBuYW1lLFxuICAgICAgc2hvcnRJZCxcbiAgICAgIGxvbmdJZCxcbiAgICB9LFxuICB9O1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9hY3Rpb25zL2NoYW5uZWwuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTmF2TGluaywgd2l0aFJvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IExvZ28gZnJvbSAnY29tcG9uZW50cy9Mb2dvJztcbmltcG9ydCBOYXZCYXJDaGFubmVsRHJvcGRvd24gZnJvbSAnY29tcG9uZW50cy9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuXG5jb25zdCBWSUVXID0gJ1ZJRVcnO1xuY29uc3QgTE9HT1VUID0gJ0xPR09VVCc7XG5cbmNsYXNzIE5hdkJhciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmNoZWNrRm9yTG9nZ2VkSW5Vc2VyID0gdGhpcy5jaGVja0ZvckxvZ2dlZEluVXNlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMubG9nb3V0VXNlciA9IHRoaXMubG9nb3V0VXNlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uID0gdGhpcy5oYW5kbGVTZWxlY3Rpb24uYmluZCh0aGlzKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIGlzIGFscmVhZHkgbG9nZ2VkIGluXG4gICAgdGhpcy5jaGVja0ZvckxvZ2dlZEluVXNlcigpO1xuICB9XG4gIGNoZWNrRm9yTG9nZ2VkSW5Vc2VyICgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7Y3JlZGVudGlhbHM6ICdpbmNsdWRlJ307XG4gICAgcmVxdWVzdCgnL3VzZXInLCBwYXJhbXMpXG4gICAgICAudGhlbigoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxMb2dpbihkYXRhLmNoYW5uZWxOYW1lLCBkYXRhLnNob3J0Q2hhbm5lbElkLCBkYXRhLmNoYW5uZWxDbGFpbUlkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnL3VzZXIgZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICB9KTtcbiAgfVxuICBsb2dvdXRVc2VyICgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7Y3JlZGVudGlhbHM6ICdpbmNsdWRlJ307XG4gICAgcmVxdWVzdCgnL2xvZ291dCcsIHBhcmFtcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5uZWxMb2dvdXQoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnL2xvZ291dCBlcnJvcicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cbiAgaGFuZGxlU2VsZWN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnNlbGVjdGVkT3B0aW9uc1swXS52YWx1ZTtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlIExPR09VVDpcbiAgICAgICAgdGhpcy5sb2dvdXRVc2VyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWSUVXOlxuICAgICAgICAvLyByZWRpcmVjdCB0byBjaGFubmVsIHBhZ2VcbiAgICAgICAgdGhpcy5wcm9wcy5oaXN0b3J5LnB1c2goYC8ke3RoaXMucHJvcHMuY2hhbm5lbE5hbWV9OiR7dGhpcy5wcm9wcy5jaGFubmVsTG9uZ0lkfWApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgc2l0ZURlc2NyaXB0aW9uIH0gPSAgdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgbmF2LWJhcic+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS1zaG9ydCBmbGV4LWNvbnRhaW5lci0tcm93IGZsZXgtY29udGFpbmVyLS1zcGFjZS1iZXR3ZWVuLWNlbnRlcic+XG4gICAgICAgICAgPExvZ28gLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbmF2LWJhci0tY2VudGVyJz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nbmF2LWJhci10YWdsaW5lJz57c2l0ZURlc2NyaXB0aW9ufTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbmF2LWJhci0tcmlnaHQnPlxuICAgICAgICAgICAgPE5hdkxpbmsgY2xhc3NOYW1lPSduYXYtYmFyLWxpbmsgbGluay0tbmF2JyBhY3RpdmVDbGFzc05hbWU9J2xpbmstLW5hdi1hY3RpdmUnIHRvPScvJyBleGFjdD5QdWJsaXNoPC9OYXZMaW5rPlxuICAgICAgICAgICAgPE5hdkxpbmsgY2xhc3NOYW1lPSduYXYtYmFyLWxpbmsgbGluay0tbmF2JyAgYWN0aXZlQ2xhc3NOYW1lPSdsaW5rLS1uYXYtYWN0aXZlJyB0bz0nL2Fib3V0Jz5BYm91dDwvTmF2TGluaz5cbiAgICAgICAgICAgIHsgdGhpcy5wcm9wcy5jaGFubmVsTmFtZSA/IChcbiAgICAgICAgICAgICAgPE5hdkJhckNoYW5uZWxEcm9wZG93blxuICAgICAgICAgICAgICAgIGNoYW5uZWxOYW1lPXt0aGlzLnByb3BzLmNoYW5uZWxOYW1lfVxuICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbj17dGhpcy5oYW5kbGVTZWxlY3Rpb259XG4gICAgICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGlvbj17dGhpcy5wcm9wcy5jaGFubmVsTmFtZX1cbiAgICAgICAgICAgICAgICBWSUVXPXtWSUVXfVxuICAgICAgICAgICAgICAgIExPR09VVD17TE9HT1VUfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPE5hdkxpbmsgaWQ9J25hdi1iYXItbG9naW4tbGluaycgY2xhc3NOYW1lPSduYXYtYmFyLWxpbmsgbGluay0tbmF2JyBhY3RpdmVDbGFzc05hbWU9J2xpbmstLW5hdi1hY3RpdmUnIHRvPScvbG9naW4nPkNoYW5uZWw8L05hdkxpbms+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFJvdXRlcihOYXZCYXIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvTmF2QmFyL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIZWxtZXQgZnJvbSAncmVhY3QtaGVsbWV0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVBhZ2VUaXRsZSB9IGZyb20gJ3V0aWxzL3BhZ2VUaXRsZSc7XG5pbXBvcnQgeyBjcmVhdGVNZXRhVGFncyB9IGZyb20gJ3V0aWxzL21ldGFUYWdzJztcbmltcG9ydCB7IGNyZWF0ZUNhbm9uaWNhbExpbmsgfSBmcm9tICd1dGlscy9jYW5vbmljYWxMaW5rJztcblxuY2xhc3MgU0VPIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICAvLyBwcm9wcyBmcm9tIHN0YXRlXG4gICAgY29uc3QgeyBkZWZhdWx0RGVzY3JpcHRpb24sIGRlZmF1bHRUaHVtYm5haWwsIHNpdGVEZXNjcmlwdGlvbiwgc2l0ZUhvc3QsIHNpdGVUaXRsZSwgc2l0ZVR3aXR0ZXIgfSA9IHRoaXMucHJvcHM7XG4gICAgLy8gcHJvcHMgZnJvbSBwYXJlbnRcbiAgICBjb25zdCB7IGFzc2V0LCBjaGFubmVsLCBwYWdlVXJpIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7IHBhZ2VUaXRsZSB9ID0gdGhpcy5wcm9wcztcbiAgICAvLyBjcmVhdGUgcGFnZSB0aXRsZSwgdGFncywgYW5kIGNhbm9uaWNhbCBsaW5rXG4gICAgcGFnZVRpdGxlID0gY3JlYXRlUGFnZVRpdGxlKHNpdGVUaXRsZSwgcGFnZVRpdGxlKTtcbiAgICBjb25zdCBtZXRhVGFncyA9IGNyZWF0ZU1ldGFUYWdzKHNpdGVEZXNjcmlwdGlvbiwgc2l0ZUhvc3QsIHNpdGVUaXRsZSwgc2l0ZVR3aXR0ZXIsIGFzc2V0LCBjaGFubmVsLCBkZWZhdWx0RGVzY3JpcHRpb24sIGRlZmF1bHRUaHVtYm5haWwpO1xuICAgIGNvbnN0IGNhbm9uaWNhbExpbmsgPSBjcmVhdGVDYW5vbmljYWxMaW5rKGFzc2V0LCBjaGFubmVsLCBwYWdlVXJpLCBzaXRlSG9zdCk7XG4gICAgLy8gcmVuZGVyIHJlc3VsdHNcbiAgICByZXR1cm4gKFxuICAgICAgPEhlbG1ldFxuICAgICAgICB0aXRsZT17cGFnZVRpdGxlfVxuICAgICAgICBtZXRhPXttZXRhVGFnc31cbiAgICAgICAgbGluaz17W3tyZWw6ICdjYW5vbmljYWwnLCBocmVmOiBjYW5vbmljYWxMaW5rfV19XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn07XG5cblNFTy5wcm9wVHlwZXMgPSB7XG4gIHBhZ2VUaXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgcGFnZVVyaSAgOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjaGFubmVsICA6IFByb3BUeXBlcy5vYmplY3QsXG4gIGFzc2V0ICAgIDogUHJvcFR5cGVzLm9iamVjdCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNFTztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL1NFTy92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB3aXRoUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgU0VPIGZyb20gJ2NvbXBvbmVudHMvU0VPJztcbmltcG9ydCBOYXZCYXIgZnJvbSAnY29udGFpbmVycy9OYXZCYXInO1xuaW1wb3J0IENoYW5uZWxMb2dpbkZvcm0gZnJvbSAnY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtJztcbmltcG9ydCBDaGFubmVsQ3JlYXRlRm9ybSBmcm9tICdjb250YWluZXJzL0NoYW5uZWxDcmVhdGVGb3JtJztcblxuY2xhc3MgTG9naW5QYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAobmV3UHJvcHMpIHtcbiAgICAvLyByZS1yb3V0ZSB0aGUgdXNlciB0byB0aGUgaG9tZXBhZ2UgaWYgdGhlIHVzZXIgaXMgbG9nZ2VkIGluXG4gICAgaWYgKG5ld1Byb3BzLmxvZ2dlZEluQ2hhbm5lbE5hbWUgIT09IHRoaXMucHJvcHMubG9nZ2VkSW5DaGFubmVsTmFtZSkge1xuICAgICAgdGhpcy5wcm9wcy5oaXN0b3J5LnB1c2goYC9gKTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPFNFTyBwYWdlVGl0bGU9eydMb2dpbid9IHBhZ2VVcmk9eydsb2dpbid9IC8+XG4gICAgICAgIDxOYXZCYXIgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1tZWQtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8cD5DaGFubmVscyBhbGxvdyB5b3UgdG8gcHVibGlzaCBhbmQgZ3JvdXAgY29udGVudCB1bmRlciBhbiBpZGVudGl0eS4gWW91IGNhbiBjcmVhdGUgYSBjaGFubmVsIGZvciB5b3Vyc2VsZiwgb3Igc2hhcmUgb25lIHdpdGggbGlrZS1taW5kZWQgZnJpZW5kcy4gIFlvdSBjYW4gY3JlYXRlIDEgY2hhbm5lbCwgb3IgMTAwLCBzbyB3aGV0aGVyIHlvdSdyZSA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPScvQGNhdGFsb25pYTIwMTc6NDNkY2Y0NzE2M2NhYTIxZDg0MDRkOWZlOWIzMGY3OGVmM2UxNDZhOCc+ZG9jdW1lbnRpbmcgaW1wb3J0YW50IGV2ZW50czwvYT4sIG9yIG1ha2luZyBhIHB1YmxpYyByZXBvc2l0b3J5IGZvciA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPScvQGNhdEdpZnMnPmNhdCBnaWZzPC9hPiAocGFzc3dvcmQ6ICcxMjM0JyksIHRyeSBjcmVhdGluZyBhIGNoYW5uZWwgZm9yIGl0ITwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS01IGNvbHVtbi0tbWVkLTEwIGFsaWduLWNvbnRlbnQtdG9wJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT0naDMtLW5vLWJvdHRvbSc+TG9nIGluIHRvIGFuIGV4aXN0aW5nIGNoYW5uZWw6PC9oMz5cbiAgICAgICAgICAgICAgPENoYW5uZWxMb2dpbkZvcm0gLz5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT0naDMtLW5vLWJvdHRvbSc+Q3JlYXRlIGEgYnJhbmQgbmV3IGNoYW5uZWw6PC9oMz5cbiAgICAgICAgICAgICAgPENoYW5uZWxDcmVhdGVGb3JtIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUm91dGVyKExvZ2luUGFnZSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcGFnZXMvTG9naW5QYWdlL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuXG5jbGFzcyBDaGFubmVsTG9naW5Gb3JtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBlcnJvciAgIDogbnVsbCxcbiAgICAgIG5hbWUgICAgOiAnJyxcbiAgICAgIHBhc3N3b3JkOiAnJyxcbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlSW5wdXQgPSB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5sb2dpblRvQ2hhbm5lbCA9IHRoaXMubG9naW5Ub0NoYW5uZWwuYmluZCh0aGlzKTtcbiAgfVxuICBoYW5kbGVJbnB1dCAoZXZlbnQpIHtcbiAgICBjb25zdCBuYW1lID0gZXZlbnQudGFyZ2V0Lm5hbWU7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZXRTdGF0ZSh7W25hbWVdOiB2YWx1ZX0pO1xuICB9XG4gIGxvZ2luVG9DaGFubmVsIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbWV0aG9kIDogJ1BPU1QnLFxuICAgICAgYm9keSAgIDogSlNPTi5zdHJpbmdpZnkoe3VzZXJuYW1lOiB0aGlzLnN0YXRlLm5hbWUsIHBhc3N3b3JkOiB0aGlzLnN0YXRlLnBhc3N3b3JkfSksXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfTtcbiAgICByZXF1ZXN0KCdsb2dpbicsIHBhcmFtcylcbiAgICAgIC50aGVuKCh7c3VjY2VzcywgY2hhbm5lbE5hbWUsIHNob3J0Q2hhbm5lbElkLCBjaGFubmVsQ2xhaW1JZCwgbWVzc2FnZX0pID0+IHtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbm5lbExvZ2luKGNoYW5uZWxOYW1lLCBzaG9ydENoYW5uZWxJZCwgY2hhbm5lbENsYWltSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IG1lc3NhZ2V9KTtcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsnZXJyb3InOiBlcnJvcn0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Zm9ybSBpZD0nY2hhbm5lbC1sb2dpbi1mb3JtJz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgcm93LS1zaG9ydCc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nbGFiZWwnIGh0bWxGb3I9J2NoYW5uZWwtbG9naW4tbmFtZS1pbnB1dCc+TmFtZTo8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS02IGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdpbnB1dC10ZXh0LS1wcmltYXJ5IGZsZXgtY29udGFpbmVyLS1yb3cgZmxleC1jb250YWluZXItLWxlZnQtYm90dG9tJz5cbiAgICAgICAgICAgICAgPHNwYW4+QDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGlkPSdjaGFubmVsLWxvZ2luLW5hbWUtaW5wdXQnIGNsYXNzTmFtZT0naW5wdXQtdGV4dCcgbmFtZT0nbmFtZScgcGxhY2Vob2xkZXI9J1lvdXIgQ2hhbm5lbCBOYW1lJyB2YWx1ZT17dGhpcy5zdGF0ZS5jaGFubmVsTmFtZX0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS13aWRlIHJvdy0tc2hvcnQnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zIGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9J2xhYmVsJyBodG1sRm9yPSdjaGFubmVsLWxvZ2luLXBhc3N3b3JkLWlucHV0JyA+UGFzc3dvcmQ6PC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNiBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtdGV4dC0tcHJpbWFyeSc+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdwYXNzd29yZCcgaWQ9J2NoYW5uZWwtbG9naW4tcGFzc3dvcmQtaW5wdXQnIG5hbWU9J3Bhc3N3b3JkJyBjbGFzc05hbWU9J2lucHV0LXRleHQnIHBsYWNlaG9sZGVyPScnIHZhbHVlPXt0aGlzLnN0YXRlLmNoYW5uZWxQYXNzd29yZH0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHsgdGhpcy5zdGF0ZS5lcnJvciA/IChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tZmFpbHVyZSc+e3RoaXMuc3RhdGUuZXJyb3J9PC9wPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz5FbnRlciB0aGUgbmFtZSBhbmQgcGFzc3dvcmQgZm9yIHlvdXIgY2hhbm5lbDwvcD5cbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUnPlxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXByaW1hcnknIG9uQ2xpY2s9e3RoaXMubG9naW5Ub0NoYW5uZWx9PkF1dGhlbnRpY2F0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENoYW5uZWxMb2dpbkZvcm07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9DaGFubmVsTG9naW5Gb3JtL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9ncmVzc0JhciBmcm9tICdjb21wb25lbnRzL1Byb2dyZXNzQmFyJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuXG5jbGFzcyBDaGFubmVsQ3JlYXRlRm9ybSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZXJyb3IgICA6IG51bGwsXG4gICAgICBjaGFubmVsIDogJycsXG4gICAgICBwYXNzd29yZDogJycsXG4gICAgICBzdGF0dXMgIDogbnVsbCxcbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlQ2hhbm5lbElucHV0ID0gdGhpcy5oYW5kbGVDaGFubmVsSW5wdXQuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZUlucHV0ID0gdGhpcy5oYW5kbGVJbnB1dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbCA9IHRoaXMuY3JlYXRlQ2hhbm5lbC5iaW5kKHRoaXMpO1xuICB9XG4gIGNsZWFuc2VDaGFubmVsSW5wdXQgKGlucHV0KSB7XG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9cXHMrL2csICctJyk7IC8vIHJlcGxhY2Ugc3BhY2VzIHdpdGggZGFzaGVzXG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOS1dL2csICcnKTsgIC8vIHJlbW92ZSBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgQS1aLCBhLXosIDAtOSwgb3IgJy0nXG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG4gIGhhbmRsZUNoYW5uZWxJbnB1dCAoZXZlbnQpIHtcbiAgICBsZXQgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdmFsdWUgPSB0aGlzLmNsZWFuc2VDaGFubmVsSW5wdXQodmFsdWUpO1xuICAgIHRoaXMuc2V0U3RhdGUoe2NoYW5uZWw6IHZhbHVlfSk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUlzQ2hhbm5lbEF2YWlsYWJsZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2Vycm9yOiAnUGxlYXNlIGVudGVyIGEgY2hhbm5lbCBuYW1lJ30pO1xuICAgIH1cbiAgfVxuICBoYW5kbGVJbnB1dCAoZXZlbnQpIHtcbiAgICBjb25zdCBuYW1lID0gZXZlbnQudGFyZ2V0Lm5hbWU7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZXRTdGF0ZSh7W25hbWVdOiB2YWx1ZX0pO1xuICB9XG4gIHVwZGF0ZUlzQ2hhbm5lbEF2YWlsYWJsZSAoY2hhbm5lbCkge1xuICAgIGNvbnN0IGNoYW5uZWxXaXRoQXRTeW1ib2wgPSBgQCR7Y2hhbm5lbH1gO1xuICAgIHJlcXVlc3QoYC9hcGkvY2hhbm5lbC9hdmFpbGFiaWxpdHkvJHtjaGFubmVsV2l0aEF0U3ltYm9sfWApXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IG51bGx9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeydlcnJvcic6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgIH0pO1xuICB9XG4gIGNoZWNrSXNDaGFubmVsQXZhaWxhYmxlIChjaGFubmVsKSB7XG4gICAgY29uc3QgY2hhbm5lbFdpdGhBdFN5bWJvbCA9IGBAJHtjaGFubmVsfWA7XG4gICAgcmV0dXJuIHJlcXVlc3QoYC9hcGkvY2hhbm5lbC9hdmFpbGFiaWxpdHkvJHtjaGFubmVsV2l0aEF0U3ltYm9sfWApO1xuICB9XG4gIGNoZWNrSXNQYXNzd29yZFByb3ZpZGVkIChwYXNzd29yZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXBhc3N3b3JkIHx8IHBhc3N3b3JkLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgcGFzc3dvcmQnKSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cbiAgbWFrZVB1Ymxpc2hDaGFubmVsUmVxdWVzdCAodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbWV0aG9kIDogJ1BPU1QnLFxuICAgICAgYm9keSAgIDogSlNPTi5zdHJpbmdpZnkoe3VzZXJuYW1lLCBwYXNzd29yZH0pLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSksXG4gICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlcXVlc3QoJy9zaWdudXAnLCBwYXJhbXMpXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmZvcnR1bmF0ZWx5LCB3ZSBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSBjcmVhdGluZyB5b3VyIGNoYW5uZWwuIFBsZWFzZSBsZXQgdXMga25vdyBpbiBEaXNjb3JkISAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBjcmVhdGVDaGFubmVsIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5jaGVja0lzUGFzc3dvcmRQcm92aWRlZCh0aGlzLnN0YXRlLnBhc3N3b3JkKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0lzQ2hhbm5lbEF2YWlsYWJsZSh0aGlzLnN0YXRlLmNoYW5uZWwpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c3RhdHVzOiAnV2UgYXJlIHB1Ymxpc2hpbmcgeW91ciBuZXcgY2hhbm5lbC4gIFNpdCB0aWdodC4uLid9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFrZVB1Ymxpc2hDaGFubmVsUmVxdWVzdCh0aGlzLnN0YXRlLmNoYW5uZWwsIHRoaXMuc3RhdGUucGFzc3dvcmQpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3N0YXR1czogbnVsbH0pO1xuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbm5lbExvZ2luKHJlc3VsdC5jaGFubmVsTmFtZSwgcmVzdWx0LnNob3J0Q2hhbm5lbElkLCByZXN1bHQuY2hhbm5lbENsYWltSWQpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsnZXJyb3InOiBlcnJvci5tZXNzYWdlLCBzdGF0dXM6IG51bGx9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsnZXJyb3InOiBlcnJvciwgc3RhdHVzOiBudWxsfSk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICB7ICF0aGlzLnN0YXRlLnN0YXR1cyA/IChcbiAgICAgICAgICA8Zm9ybSBpZD0ncHVibGlzaC1jaGFubmVsLWZvcm0nPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgcm93LS1zaG9ydCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zIGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCcgaHRtbEZvcj0nbmV3LWNoYW5uZWwtbmFtZSc+TmFtZTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNiBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2lucHV0LXRleHQtLXByaW1hcnkgZmxleC1jb250YWluZXItLXJvdyBmbGV4LWNvbnRhaW5lci0tbGVmdC1ib3R0b20gc3Bhbi0tcmVsYXRpdmUnPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+QDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdjaGFubmVsJyBpZD0nbmV3LWNoYW5uZWwtbmFtZScgY2xhc3NOYW1lPSdpbnB1dC10ZXh0JyBwbGFjZWhvbGRlcj0nZXhhbXBsZUNoYW5uZWxOYW1lJyB2YWx1ZT17dGhpcy5zdGF0ZS5jaGFubmVsfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVDaGFubmVsSW5wdXR9IC8+XG4gICAgICAgICAgICAgICAgICB7ICh0aGlzLnN0YXRlLmNoYW5uZWwgJiYgIXRoaXMuc3RhdGUuZXJyb3IpICYmIDxzcGFuIGlkPSdpbnB1dC1zdWNjZXNzLWNoYW5uZWwtbmFtZScgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLXN1Y2Nlc3Mgc3Bhbi0tYWJzb2x1dGUnPnsnXFx1MjcxMyd9PC9zcGFuPiB9XG4gICAgICAgICAgICAgICAgICB7IHRoaXMuc3RhdGUuZXJyb3IgJiYgPHNwYW4gaWQ9J2lucHV0LXN1Y2Nlc3MtY2hhbm5lbC1uYW1lJyBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tZmFpbHVyZSBzcGFuLS1hYnNvbHV0ZSc+eydcXHUyNzE2J308L3NwYW4+IH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS13aWRlIHJvdy0tc2hvcnQnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMyBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nbGFiZWwnIGh0bWxGb3I9J25ldy1jaGFubmVsLXBhc3N3b3JkJz5QYXNzd29yZDo8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNiBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2lucHV0LXRleHQtLXByaW1hcnknPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3Bhc3N3b3JkJyBuYW1lPSdwYXNzd29yZCcgaWQ9J25ldy1jaGFubmVsLXBhc3N3b3JkJyBjbGFzc05hbWU9J2lucHV0LXRleHQnICBwbGFjZWhvbGRlcj0nJyB2YWx1ZT17dGhpcy5zdGF0ZS5wYXNzd29yZH0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS5lcnJvciA/IChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLWZhaWx1cmUnPnt0aGlzLnN0YXRlLmVycm9yfTwvcD5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz5DaG9vc2UgYSBuYW1lIGFuZCBwYXNzd29yZCBmb3IgeW91ciBjaGFubmVsPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS13aWRlJz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9J2J1dHRvbi0tcHJpbWFyeScgb25DbGljaz17dGhpcy5jcmVhdGVDaGFubmVsfT5DcmVhdGUgQ2hhbm5lbDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9J2ZpbmUtcHJpbnQnPnt0aGlzLnN0YXRlLnN0YXR1c308L3A+XG4gICAgICAgICAgICA8UHJvZ3Jlc3NCYXIgc2l6ZT17MTJ9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENoYW5uZWxDcmVhdGVGb3JtO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQ2hhbm5lbENyZWF0ZUZvcm0vdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEVycm9yUGFnZSBmcm9tICdwYWdlcy9FcnJvclBhZ2UnO1xuaW1wb3J0IFNob3dBc3NldExpdGUgZnJvbSAnY29udGFpbmVycy9TaG93QXNzZXRMaXRlJztcbmltcG9ydCBTaG93QXNzZXREZXRhaWxzIGZyb20gJ2NvbnRhaW5lcnMvU2hvd0Fzc2V0RGV0YWlscyc7XG5pbXBvcnQgU2hvd0NoYW5uZWwgZnJvbSAnY29udGFpbmVycy9TaG93Q2hhbm5lbCc7XG5cbmltcG9ydCB7IENIQU5ORUwsIEFTU0VUX0xJVEUsIEFTU0VUX0RFVEFJTFMgfSBmcm9tICdjb25zdGFudHMvc2hvd19yZXF1ZXN0X3R5cGVzJztcblxuY2xhc3MgU2hvd1BhZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5wcm9wcy5vbkhhbmRsZVNob3dQYWdlVXJpKHRoaXMucHJvcHMubWF0Y2gucGFyYW1zKTtcbiAgfVxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXh0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLm1hdGNoLnBhcmFtcyAhPT0gdGhpcy5wcm9wcy5tYXRjaC5wYXJhbXMpIHtcbiAgICAgIHRoaXMucHJvcHMub25IYW5kbGVTaG93UGFnZVVyaShuZXh0UHJvcHMubWF0Y2gucGFyYW1zKTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGVycm9yLCByZXF1ZXN0VHlwZSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxFcnJvclBhZ2UgZXJyb3I9e2Vycm9yfSAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgc3dpdGNoIChyZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSBDSEFOTkVMOlxuICAgICAgICByZXR1cm4gPFNob3dDaGFubmVsIC8+O1xuICAgICAgY2FzZSBBU1NFVF9MSVRFOlxuICAgICAgICByZXR1cm4gPFNob3dBc3NldExpdGUgLz47XG4gICAgICBjYXNlIEFTU0VUX0RFVEFJTFM6XG4gICAgICAgIHJldHVybiA8U2hvd0Fzc2V0RGV0YWlscyAvPjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiA8cD5sb2FkaW5nLi4uPC9wPjtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dQYWdlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3BhZ2VzL1Nob3dQYWdlL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTRU8gZnJvbSAnY29tcG9uZW50cy9TRU8nO1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IEFzc2V0RGlzcGxheSBmcm9tICdjb250YWluZXJzL0Fzc2V0RGlzcGxheSc7XG5cbmNsYXNzIFNob3dMaXRlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGFzc2V0IH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChhc3NldCkge1xuICAgICAgY29uc3QgeyBuYW1lLCBjbGFpbUlkIH0gPSBhc3NldC5jbGFpbURhdGE7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uIGZsZXgtY29udGFpbmVyLS1jZW50ZXItY2VudGVyIHNob3ctbGl0ZS1jb250YWluZXInPlxuICAgICAgICAgIDxTRU8gcGFnZVRpdGxlPXtuYW1lfSBhc3NldD17YXNzZXR9IC8+XG4gICAgICAgICAgPEFzc2V0RGlzcGxheSAvPlxuICAgICAgICAgIDxMaW5rIGlkPSdhc3NldC1ib2lsZXJwYXRlJyBjbGFzc05hbWU9J2xpbmstLXByaW1hcnkgZmluZS1wcmludCcgdG89e2AvJHtjbGFpbUlkfS8ke25hbWV9YH0+aG9zdGVkXG4gICAgICAgICAgICB2aWEgU3BlZS5jaDwvTGluaz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwgcm93LS1wYWRkZWQgZmxleC1jb250YWluZXItLWNvbHVtbiBmbGV4LWNvbnRhaW5lci0tY2VudGVyLWNlbnRlcic+XG4gICAgICAgIDxwPmxvYWRpbmcgYXNzZXQgZGF0YS4uLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dMaXRlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0Fzc2V0TGl0ZS92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAnY29tcG9uZW50cy9Qcm9ncmVzc0Jhcic7XG5pbXBvcnQgeyBMT0NBTF9DSEVDSywgVU5BVkFJTEFCTEUsIEVSUk9SLCBBVkFJTEFCTEUgfSBmcm9tICdjb25zdGFudHMvYXNzZXRfZGlzcGxheV9zdGF0ZXMnO1xuXG5jbGFzcyBBc3NldERpc3BsYXkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgY29uc3QgeyBhc3NldDogeyBjbGFpbURhdGE6IHsgbmFtZSwgY2xhaW1JZCB9IH0gfSA9IHRoaXMucHJvcHM7XG4gICAgdGhpcy5wcm9wcy5vbkZpbGVSZXF1ZXN0KG5hbWUsIGNsYWltSWQpO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBzdGF0dXMsIGVycm9yLCBhc3NldDogeyBjbGFpbURhdGE6IHsgbmFtZSwgY2xhaW1JZCwgY29udGVudFR5cGUsIGZpbGVFeHQsIHRodW1ibmFpbCB9IH0gfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgaWQ9J2Fzc2V0LWRpc3BsYXktY29tcG9uZW50Jz5cbiAgICAgICAgeyhzdGF0dXMgPT09IExPQ0FMX0NIRUNLKSAmJlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxwPkNoZWNraW5nIHRvIHNlZSBpZiBTcGVlLmNoIGhhcyB5b3VyIGFzc2V0IGxvY2FsbHkuLi48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHsoc3RhdHVzID09PSBVTkFWQUlMQUJMRSkgJiZcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cD5TaXQgdGlnaHQsIHdlJ3JlIHNlYXJjaGluZyB0aGUgTEJSWSBibG9ja2NoYWluIGZvciB5b3VyIGFzc2V0ITwvcD5cbiAgICAgICAgICA8UHJvZ3Jlc3NCYXIgc2l6ZT17MTJ9IC8+XG4gICAgICAgICAgPHA+Q3VyaW91cyB3aGF0IG1hZ2ljIGlzIGhhcHBlbmluZyBoZXJlPyA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nYmxhbmsnIGhyZWY9J2h0dHBzOi8vbGJyeS5pby9mYXEvd2hhdC1pcy1sYnJ5Jz5MZWFybiBtb3JlLjwvYT48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHsoc3RhdHVzID09PSBFUlJPUikgJiZcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cD5VbmZvcnR1bmF0ZWx5LCB3ZSBjb3VsZG4ndCBkb3dubG9hZCB5b3VyIGFzc2V0IGZyb20gTEJSWS4gIFlvdSBjYW4gaGVscCB1cyBvdXQgYnkgc2hhcmluZyB0aGUgYmVsb3cgZXJyb3IgbWVzc2FnZSBpbiB0aGUgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyBocmVmPSdodHRwczovL2Rpc2NvcmQuZ2cvWWpZYndoUycgdGFyZ2V0PSdfYmxhbmsnPkxCUlkgZGlzY29yZDwvYT4uPC9wPlxuICAgICAgICAgIDxpPjxwIGlkPSdlcnJvci1tZXNzYWdlJz57ZXJyb3J9PC9wPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgeyhzdGF0dXMgPT09IEFWQUlMQUJMRSkgJiZcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9qcGVnJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL2pwZyc6XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9wbmcnOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nYXNzZXQnXG4gICAgICAgICAgICAgICAgICBzcmM9e2AvJHtjbGFpbUlkfS8ke25hbWV9LiR7ZmlsZUV4dH1gfVxuICAgICAgICAgICAgICAgICAgYWx0PXtuYW1lfSAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Fzc2V0J1xuICAgICAgICAgICAgICAgICAgc3JjPXtgLyR7Y2xhaW1JZH0vJHtuYW1lfS4ke2ZpbGVFeHR9YH1cbiAgICAgICAgICAgICAgICAgIGFsdD17bmFtZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSAndmlkZW8vbXA0JzpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8dmlkZW8gY2xhc3NOYW1lPSdhc3NldCB2aWRlbycgY29udHJvbHMgcG9zdGVyPXt0aHVtYm5haWx9PlxuICAgICAgICAgICAgICAgICAgPHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICBzcmM9e2AvJHtjbGFpbUlkfS8ke25hbWV9LiR7ZmlsZUV4dH1gfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxwPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSA8Y29kZT52aWRlbzwvY29kZT4gZWxlbWVudC48L3A+XG4gICAgICAgICAgICAgICAgPC92aWRlbz5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPHA+VW5zdXBwb3J0ZWQgZmlsZSB0eXBlPC9wPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBc3NldERpc3BsYXk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldERpc3BsYXkvdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNFTyBmcm9tICdjb21wb25lbnRzL1NFTyc7XG5pbXBvcnQgTmF2QmFyIGZyb20gJ2NvbnRhaW5lcnMvTmF2QmFyJztcbmltcG9ydCBFcnJvclBhZ2UgZnJvbSAncGFnZXMvRXJyb3JQYWdlJztcbmltcG9ydCBBc3NldFRpdGxlIGZyb20gJ2NvbnRhaW5lcnMvQXNzZXRUaXRsZSc7XG5pbXBvcnQgQXNzZXREaXNwbGF5IGZyb20gJ2NvbnRhaW5lcnMvQXNzZXREaXNwbGF5JztcbmltcG9ydCBBc3NldEluZm8gZnJvbSAnY29udGFpbmVycy9Bc3NldEluZm8nO1xuXG5jbGFzcyBTaG93QXNzZXREZXRhaWxzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGFzc2V0IH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChhc3NldCkge1xuICAgICAgY29uc3QgeyBjbGFpbURhdGE6IHsgbmFtZSB9IH0gPSBhc3NldDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPFNFTyBwYWdlVGl0bGU9e2Ake25hbWV9IC0gZGV0YWlsc2B9IGFzc2V0PXthc3NldH0gLz5cbiAgICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwgcm93LS1wYWRkZWQnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTEwJz5cbiAgICAgICAgICAgICAgPEFzc2V0VGl0bGUgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTUgY29sdW1uLS1zbWwtMTAgYWxpZ24tY29udGVudC10b3AnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHNob3ctZGV0YWlscy1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxBc3NldERpc3BsYXkgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNSBjb2x1bW4tLXNtbC0xMCBhbGlnbi1jb250ZW50LXRvcCc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQnPlxuICAgICAgICAgICAgICAgIDxBc3NldEluZm8gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxFcnJvclBhZ2UgZXJyb3I9eydsb2FkaW5nIGFzc2V0IGRhdGEuLi4nfSAvPlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dBc3NldERldGFpbHM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9TaG93QXNzZXREZXRhaWxzL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgQXNzZXRUaXRsZSA9ICh7IHRpdGxlIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXh0LS1sYXJnZSc+e3RpdGxlfTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFzc2V0VGl0bGU7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9Bc3NldFRpdGxlL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcblxuY2xhc3MgQXNzZXRJbmZvIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuY29weVRvQ2xpcGJvYXJkID0gdGhpcy5jb3B5VG9DbGlwYm9hcmQuYmluZCh0aGlzKTtcbiAgfVxuICBjb3B5VG9DbGlwYm9hcmQgKGV2ZW50KSB7XG4gICAgdmFyIGVsZW1lbnRUb0NvcHkgPSBldmVudC50YXJnZXQuZGF0YXNldC5lbGVtZW50dG9jb3B5O1xuICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudFRvQ29weSk7XG4gICAgZWxlbWVudC5zZWxlY3QoKTtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2Vycm9yOiAnT29wcywgdW5hYmxlIHRvIGNvcHknfSk7XG4gICAgfVxuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBhc3NldDogeyBzaG9ydElkLCBjbGFpbURhdGEgOiB7IGNoYW5uZWxOYW1lLCBjZXJ0aWZpY2F0ZUlkLCBkZXNjcmlwdGlvbiwgbmFtZSwgY2xhaW1JZCwgZmlsZUV4dCwgY29udGVudFR5cGUsIHRodW1ibmFpbCwgaG9zdCB9IH0gfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIHtjaGFubmVsTmFtZSAmJlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0td2lkZSByb3ctLW5vLXRvcCc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTIgY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXh0Jz5DaGFubmVsOjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tOCBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQnPjxMaW5rIHRvPXtgLyR7Y2hhbm5lbE5hbWV9OiR7Y2VydGlmaWNhdGVJZH1gfT57Y2hhbm5lbE5hbWV9PC9MaW5rPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICB7ZGVzY3JpcHRpb24gJiZcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLXdpZGUgcm93LS1uby10b3AnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndGV4dCc+e2Rlc2NyaXB0aW9ufTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8ZGl2IGlkPSdzaG93LXNoYXJlLWJ1dHRvbnMnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS13aWRlIHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0yIGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXh0Jz5TaGFyZTo8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS04IGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncm93IHJvdy0tc2hvcnQgcm93LS13aWRlIGZsZXgtY29udGFpbmVyLS1yb3cgZmxleC1jb250YWluZXItLXNwYWNlLWJldHdlZW4tYm90dG9tIGZsZXgtY29udGFpbmVyLS13cmFwJz5cbiAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPXtgaHR0cHM6Ly90d2l0dGVyLmNvbS9pbnRlbnQvdHdlZXQ/dGV4dD0ke2hvc3R9LyR7c2hvcnRJZH0vJHtuYW1lfWB9PnR3aXR0ZXI8L2E+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj17YGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIvc2hhcmVyLnBocD91PSR7aG9zdH0vJHtzaG9ydElkfS8ke25hbWV9YH0+ZmFjZWJvb2s8L2E+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj17YGh0dHA6Ly90dW1ibHIuY29tL3dpZGdldHMvc2hhcmUvdG9vbD9jYW5vbmljYWxVcmw9JHtob3N0fS8ke3Nob3J0SWR9LyR7bmFtZX1gfT50dW1ibHI8L2E+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyB0YXJnZXQ9J19ibGFuaycgaHJlZj17YGh0dHBzOi8vd3d3LnJlZGRpdC5jb20vc3VibWl0P3VybD0ke2hvc3R9LyR7c2hvcnRJZH0vJHtuYW1lfSZ0aXRsZT0ke25hbWV9YH0+cmVkZGl0PC9hPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0td2lkZSByb3ctLW5vLXRvcCc+XG4gICAgICAgICAgPGRpdiBpZD0nc2hvdy1zaG9ydC1saW5rJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0yIGNvbHVtbi0tbWVkLTEwJz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXh0Jz5MaW5rOjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tc2hvcnQgcm93LS13aWRlJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNyc+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtZXJyb3InIGlkPSdpbnB1dC1lcnJvci1jb3B5LXNob3J0LWxpbmsnIGhpZGRlbj0ndHJ1ZSc+ZXJyb3IgaGVyZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGlkPSdzaG9ydC1saW5rJyBjbGFzc05hbWU9J2lucHV0LWRpc2FibGVkIGlucHV0LXRleHQtLWZ1bGwtd2lkdGgnIHJlYWRPbmx5XG4gICAgICAgICAgICAgICAgICAgIHNwZWxsQ2hlY2s9J2ZhbHNlJ1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YCR7aG9zdH0vJHtzaG9ydElkfS8ke25hbWV9LiR7ZmlsZUV4dH1gfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnNlbGVjdH0gLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMScgLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMic+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT0nYnV0dG9uLS1wcmltYXJ5IGJ1dHRvbi0td2lkZScgZGF0YS1lbGVtZW50dG9jb3B5PSdzaG9ydC1saW5rJ1xuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmNvcHlUb0NsaXBib2FyZH0+Y29weVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGlkPSdzaG93LWVtYmVkLWNvZGUnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTIgY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J3RleHQnPkVtYmVkOjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTggY29sdW1uLS1tZWQtMTAnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tc2hvcnQgcm93LS13aWRlJz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNyc+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0naW5wdXQtZXJyb3InIGlkPSdpbnB1dC1lcnJvci1jb3B5LWVtYmVkLXRleHQnIGhpZGRlbj0ndHJ1ZSc+ZXJyb3IgaGVyZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgeyhjb250ZW50VHlwZSA9PT0gJ3ZpZGVvL21wNCcpID8gKFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2VtYmVkLXRleHQnIGNsYXNzTmFtZT0naW5wdXQtZGlzYWJsZWQgaW5wdXQtdGV4dC0tZnVsbC13aWR0aCcgcmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnNlbGVjdH0gc3BlbGxDaGVjaz0nZmFsc2UnXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2A8dmlkZW8gd2lkdGg9XCIxMDAlXCIgY29udHJvbHMgcG9zdGVyPVwiJHt0aHVtYm5haWx9XCIgc3JjPVwiJHtob3N0fS8ke2NsYWltSWR9LyR7bmFtZX0uJHtmaWxlRXh0fVwiLz48L3ZpZGVvPmB9IC8+XG4gICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2VtYmVkLXRleHQnIGNsYXNzTmFtZT0naW5wdXQtZGlzYWJsZWQgaW5wdXQtdGV4dC0tZnVsbC13aWR0aCcgcmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnNlbGVjdH0gc3BlbGxDaGVjaz0nZmFsc2UnXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2A8aW1nIHNyYz1cIiR7aG9zdH0vJHtjbGFpbUlkfS8ke25hbWV9LiR7ZmlsZUV4dH1cIi8+YH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTEnIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTInPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9J2J1dHRvbi0tcHJpbWFyeSBidXR0b24tLXdpZGUnIGRhdGEtZWxlbWVudHRvY29weT0nZW1iZWQtdGV4dCdcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5jb3B5VG9DbGlwYm9hcmR9PmNvcHlcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZmxleC1jb250YWluZXItLXJvdyBmbGV4LWNvbnRhaW5lci0tc3BhY2UtYmV0d2Vlbi1ib3R0b20nPlxuICAgICAgICAgIDxMaW5rIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdG89e2AvJHtzaG9ydElkfS8ke25hbWV9LiR7ZmlsZUV4dH1gfT48c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPSd0ZXh0Jz5EaXJlY3QgTGluazwvc3Bhbj48L0xpbms+XG4gICAgICAgICAgPGEgY2xhc3NOYW1lPSdsaW5rLS1wcmltYXJ5JyBocmVmPXtgJHtob3N0fS8ke2NsYWltSWR9LyR7bmFtZX0uJHtmaWxlRXh0fWB9IGRvd25sb2FkPXtuYW1lfT5Eb3dubG9hZDwvYT5cbiAgICAgICAgICA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwczovL2xicnkuaW8vZG1jYSc+UmVwb3J0PC9hPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQXNzZXRJbmZvO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvQXNzZXRJbmZvL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTRU8gZnJvbSAnY29tcG9uZW50cy9TRU8nO1xuaW1wb3J0IEVycm9yUGFnZSBmcm9tICdwYWdlcy9FcnJvclBhZ2UnO1xuaW1wb3J0IE5hdkJhciBmcm9tICdjb250YWluZXJzL05hdkJhcic7XG5pbXBvcnQgQ2hhbm5lbENsYWltc0Rpc3BsYXkgZnJvbSAnY29udGFpbmVycy9DaGFubmVsQ2xhaW1zRGlzcGxheSc7XG5cbmNsYXNzIFNob3dDaGFubmVsIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGNoYW5uZWwgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKGNoYW5uZWwpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgbG9uZ0lkLCBzaG9ydElkIH0gPSBjaGFubmVsO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8U0VPIHBhZ2VUaXRsZT17bmFtZX0gY2hhbm5lbD17Y2hhbm5lbH0gLz5cbiAgICAgICAgICA8TmF2QmFyIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwgcm93LS1wYWRkZWQnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTEwJz5cbiAgICAgICAgICAgICAgPGgyPmNoYW5uZWwgbmFtZToge25hbWV9PC9oMj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXsnZmluZS1wcmludCd9PmZ1bGwgY2hhbm5lbCBpZDoge2xvbmdJZH08L3A+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT17J2ZpbmUtcHJpbnQnfT5zaG9ydCBjaGFubmVsIGlkOiB7c2hvcnRJZH08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0xMCc+XG4gICAgICAgICAgICAgIDxDaGFubmVsQ2xhaW1zRGlzcGxheSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JQYWdlIGVycm9yPXsnbG9hZGluZyBjaGFubmVsIGRhdGEuLi4nfSAvPlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNob3dDaGFubmVsO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvU2hvd0NoYW5uZWwvdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEFzc2V0UHJldmlldyBmcm9tICdjb21wb25lbnRzL0Fzc2V0UHJldmlldyc7XG5cbmNsYXNzIENoYW5uZWxDbGFpbXNEaXNwbGF5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc2hvd05leHRSZXN1bHRzUGFnZSA9IHRoaXMuc2hvd05leHRSZXN1bHRzUGFnZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2hvd1ByZXZpb3VzUmVzdWx0c1BhZ2UgPSB0aGlzLnNob3dQcmV2aW91c1Jlc3VsdHNQYWdlLmJpbmQodGhpcyk7XG4gIH1cbiAgc2hvd1ByZXZpb3VzUmVzdWx0c1BhZ2UgKCkge1xuICAgIGNvbnN0IHsgY2hhbm5lbDogeyBjbGFpbXNEYXRhOiB7IGN1cnJlbnRQYWdlIH0gfSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBwcmV2aW91c1BhZ2UgPSBwYXJzZUludChjdXJyZW50UGFnZSkgLSAxO1xuICAgIHRoaXMuc2hvd05ld1BhZ2UocHJldmlvdXNQYWdlKTtcbiAgfVxuICBzaG93TmV4dFJlc3VsdHNQYWdlICgpIHtcbiAgICBjb25zdCB7IGNoYW5uZWw6IHsgY2xhaW1zRGF0YTogeyBjdXJyZW50UGFnZSB9IH0gfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSBwYXJzZUludChjdXJyZW50UGFnZSkgKyAxO1xuICAgIHRoaXMuc2hvd05ld1BhZ2UobmV4dFBhZ2UpO1xuICB9XG4gIHNob3dOZXdQYWdlIChwYWdlKSB7XG4gICAgY29uc3QgeyBjaGFubmVsS2V5LCBjaGFubmVsOiB7IG5hbWUsIGxvbmdJZCB9IH0gPSB0aGlzLnByb3BzO1xuICAgIHRoaXMucHJvcHMub25VcGRhdGVDaGFubmVsQ2xhaW1zKGNoYW5uZWxLZXksIG5hbWUsIGxvbmdJZCwgcGFnZSk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGNoYW5uZWw6IHsgY2xhaW1zRGF0YTogeyBjbGFpbXMsIGN1cnJlbnRQYWdlLCB0b3RhbFBhZ2VzIH0gfSB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXRhbGwnPlxuICAgICAgICB7KGNsYWltcy5sZW5ndGggPiAwKSA/IChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAge2NsYWltcy5tYXAoKGNsYWltLCBpbmRleCkgPT4gPEFzc2V0UHJldmlld1xuICAgICAgICAgICAgICBjbGFpbURhdGE9e2NsYWltfVxuICAgICAgICAgICAgICBrZXk9e2Ake2NsYWltLm5hbWV9LSR7aW5kZXh9YH1cbiAgICAgICAgICAgIC8+KX1cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIHsoY3VycmVudFBhZ2UgPiAxKSAmJlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17J2J1dHRvbi0tc2Vjb25kYXJ5J30gb25DbGljaz17dGhpcy5zaG93UHJldmlvdXNSZXN1bHRzUGFnZX0+UHJldmlvdXMgUGFnZTwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHsoY3VycmVudFBhZ2UgPCB0b3RhbFBhZ2VzKSAmJlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17J2J1dHRvbi0tc2Vjb25kYXJ5J30gb25DbGljaz17dGhpcy5zaG93TmV4dFJlc3VsdHNQYWdlfT5OZXh0IFBhZ2U8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPHA+VGhlcmUgYXJlIG5vIGNsYWltcyBpbiB0aGlzIGNoYW5uZWw8L3A+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDaGFubmVsQ2xhaW1zRGlzcGxheTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxDbGFpbXNEaXNwbGF5L3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IExpbmsgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcblxuY29uc3QgQXNzZXRQcmV2aWV3ID0gKHsgZGVmYXVsdFRodW1ibmFpbCwgY2xhaW1EYXRhOiB7IG5hbWUsIGNsYWltSWQsIGZpbGVFeHQsIGNvbnRlbnRUeXBlLCB0aHVtYm5haWwgfSB9KSA9PiB7XG4gIGNvbnN0IGRpcmVjdFNvdXJjZUxpbmsgPSBgJHtjbGFpbUlkfS8ke25hbWV9LiR7ZmlsZUV4dH1gO1xuICBjb25zdCBzaG93VXJsTGluayA9IGAvJHtjbGFpbUlkfS8ke25hbWV9YDtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT0nYXNzZXQtaG9sZGVyJz5cbiAgICAgIDxMaW5rIHRvPXtzaG93VXJsTGlua30gPlxuICAgICAgICB7KCgpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9qcGVnJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL2pwZyc6XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9wbmcnOlxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvZ2lmJzpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eydhc3NldC1wcmV2aWV3J31cbiAgICAgICAgICAgICAgICAgIHNyYz17ZGlyZWN0U291cmNlTGlua31cbiAgICAgICAgICAgICAgICAgIGFsdD17bmFtZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSAndmlkZW8vbXA0JzpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eydhc3NldC1wcmV2aWV3IHZpZGVvJ31cbiAgICAgICAgICAgICAgICAgIHNyYz17dGh1bWJuYWlsIHx8IGRlZmF1bHRUaHVtYm5haWx9XG4gICAgICAgICAgICAgICAgICBhbHQ9e25hbWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPHA+dW5zdXBwb3J0ZWQgZmlsZSB0eXBlPC9wPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKX1cbiAgICAgIDwvTGluaz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFzc2V0UHJldmlldztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb21wb25lbnRzL0Fzc2V0UHJldmlldy92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTmF2QmFyIGZyb20gJ2NvbnRhaW5lcnMvTmF2QmFyJztcbmltcG9ydCBIZWxtZXQgZnJvbSAncmVhY3QtaGVsbWV0JztcblxuY2xhc3MgRm91ck9oRm9yUGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge3RpdGxlLCBob3N0fSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxIZWxtZXQ+XG4gICAgICAgICAgPHRpdGxlPnt0aXRsZX0gLSA0MDQ8L3RpdGxlPlxuICAgICAgICAgIDxsaW5rIHJlbD0nY2Fub25pY2FsJyBocmVmPXtgJHtob3N0fS80MDRgfSAvPlxuICAgICAgICA8L0hlbG1ldD5cbiAgICAgICAgPE5hdkJhciAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkJz5cbiAgICAgICAgICA8aDI+NDA0PC9oMj5cbiAgICAgICAgICA8cD5UaGF0IHBhZ2UgZG9lcyBub3QgZXhpc3Q8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm91ck9oRm9yUGFnZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0ZvdXJPaEZvdXJQYWdlL3ZpZXcuanN4IiwiY29uc3QgeyBsc3RhdFN5bmMsIHJlYWRkaXJTeW5jIH0gPSByZXF1aXJlKCdmcycpO1xuY29uc3QgeyBqb2luIH0gPSByZXF1aXJlKCdwYXRoJyk7XG5cbmV4cG9ydCBjb25zdCBnZXRTdWJEaXJlY3RvcnlOYW1lcyA9IChyb290KSA9PiB7XG4gIHJldHVybiByZWFkZGlyU3luYyhyb290KVxuICAgIC5maWx0ZXIobmFtZSA9PiB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4ocm9vdCwgbmFtZSk7XG4gICAgICByZXR1cm4gbHN0YXRTeW5jKGZ1bGxQYXRoKS5pc0RpcmVjdG9yeSgpO1xuICAgIH0pO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2J1aWxkL2dldEZvbGRlck5hbWVzLmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDaGFubmVsTG9naW5Gb3JtIGZyb20gJ2NvbnRhaW5lcnMvQ2hhbm5lbExvZ2luRm9ybSc7XG5pbXBvcnQgQ2hhbm5lbENyZWF0ZUZvcm0gZnJvbSAnY29udGFpbmVycy9DaGFubmVsQ3JlYXRlRm9ybSc7XG5pbXBvcnQgKiBhcyBzdGF0ZXMgZnJvbSAnY29uc3RhbnRzL3B1Ymxpc2hfY2hhbm5lbF9zZWxlY3Rfc3RhdGVzJztcblxuY2xhc3MgQ2hhbm5lbFNlbGVjdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnRvZ2dsZUFub255bW91c1B1Ymxpc2ggPSB0aGlzLnRvZ2dsZUFub255bW91c1B1Ymxpc2guYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbiA9IHRoaXMuaGFuZGxlU2VsZWN0aW9uLmJpbmQodGhpcyk7XG4gIH1cbiAgdG9nZ2xlQW5vbnltb3VzUHVibGlzaCAoZXZlbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICBpZiAodmFsdWUgPT09ICdhbm9ueW1vdXMnKSB7XG4gICAgICB0aGlzLnByb3BzLm9uUHVibGlzaEluQ2hhbm5lbENoYW5nZShmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMub25QdWJsaXNoSW5DaGFubmVsQ2hhbmdlKHRydWUpO1xuICAgIH1cbiAgfVxuICBoYW5kbGVTZWxlY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSBldmVudC50YXJnZXQuc2VsZWN0ZWRPcHRpb25zWzBdLnZhbHVlO1xuICAgIHRoaXMucHJvcHMub25DaGFubmVsU2VsZWN0KHNlbGVjdGVkT3B0aW9uKTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8Zm9ybT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMyBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J2Fub255bW91cy1vci1jaGFubmVsJyBpZD0nYW5vbnltb3VzLXJhZGlvJyBjbGFzc05hbWU9J2lucHV0LXJhZGlvJyB2YWx1ZT0nYW5vbnltb3VzJyBjaGVja2VkPXshdGhpcy5wcm9wcy5wdWJsaXNoSW5DaGFubmVsfSBvbkNoYW5nZT17dGhpcy50b2dnbGVBbm9ueW1vdXNQdWJsaXNofSAvPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nbGFiZWwgbGFiZWwtLXBvaW50ZXInIGh0bWxGb3I9J2Fub255bW91cy1yYWRpbyc+QW5vbnltb3VzPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNyBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J2Fub255bW91cy1vci1jaGFubmVsJyBpZD0nY2hhbm5lbC1yYWRpbycgY2xhc3NOYW1lPSdpbnB1dC1yYWRpbycgdmFsdWU9J2luIGEgY2hhbm5lbCcgY2hlY2tlZD17dGhpcy5wcm9wcy5wdWJsaXNoSW5DaGFubmVsfSBvbkNoYW5nZT17dGhpcy50b2dnbGVBbm9ueW1vdXNQdWJsaXNofSAvPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nbGFiZWwgbGFiZWwtLXBvaW50ZXInIGh0bWxGb3I9J2NoYW5uZWwtcmFkaW8nPkluIGEgY2hhbm5lbDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgeyB0aGlzLnByb3BzLmNoYW5uZWxFcnJvciA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLS1mYWlsdXJlJz57dGhpcy5wcm9wcy5jaGFubmVsRXJyb3J9PC9wPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9J2luZm8tbWVzc2FnZSc+UHVibGlzaCBhbm9ueW1vdXNseSBvciBpbiBhIGNoYW5uZWw8L3A+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9mb3JtPlxuICAgICAgICB7IHRoaXMucHJvcHMucHVibGlzaEluQ2hhbm5lbCAmJiAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS0zJz5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0nbGFiZWwnIGh0bWxGb3I9J2NoYW5uZWwtbmFtZS1zZWxlY3QnPkNoYW5uZWw6PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PjxkaXYgY2xhc3NOYW1lPSdjb2x1bW4gY29sdW1uLS03Jz5cbiAgICAgICAgICAgICAgPHNlbGVjdCB0eXBlPSd0ZXh0JyBpZD0nY2hhbm5lbC1uYW1lLXNlbGVjdCcgY2xhc3NOYW1lPSdzZWxlY3Qgc2VsZWN0LS1hcnJvdycgdmFsdWU9e3RoaXMucHJvcHMuc2VsZWN0ZWRDaGFubmVsfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVTZWxlY3Rpb259PlxuICAgICAgICAgICAgICAgIHsgdGhpcy5wcm9wcy5sb2dnZWRJbkNoYW5uZWxOYW1lICYmIDxvcHRpb24gdmFsdWU9e3RoaXMucHJvcHMubG9nZ2VkSW5DaGFubmVsTmFtZX0gaWQ9J3B1Ymxpc2gtY2hhbm5lbC1zZWxlY3QtY2hhbm5lbC1vcHRpb24nPnt0aGlzLnByb3BzLmxvZ2dlZEluQ2hhbm5lbE5hbWV9PC9vcHRpb24+IH1cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtzdGF0ZXMuTE9HSU59PkV4aXN0aW5nPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17c3RhdGVzLkNSRUFURX0+TmV3PC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7ICh0aGlzLnByb3BzLnNlbGVjdGVkQ2hhbm5lbCA9PT0gc3RhdGVzLkxPR0lOKSAmJiA8Q2hhbm5lbExvZ2luRm9ybSAvPiB9XG4gICAgICAgICAgICB7ICh0aGlzLnByb3BzLnNlbGVjdGVkQ2hhbm5lbCA9PT0gc3RhdGVzLkNSRUFURSkgJiYgPENoYW5uZWxDcmVhdGVGb3JtIC8+IH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2hhbm5lbFNlbGVjdDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL0NoYW5uZWxTZWxlY3Qvdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWxlIH0gZnJvbSAndXRpbHMvZmlsZSc7XG5pbXBvcnQgUHVibGlzaFByZXZpZXcgZnJvbSAnY29tcG9uZW50cy9QdWJsaXNoUHJldmlldyc7XG5cbmNsYXNzIERyb3B6b25lIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkcmFnT3ZlciAgOiBmYWxzZSxcbiAgICAgIG1vdXNlT3ZlciA6IGZhbHNlLFxuICAgICAgZGltUHJldmlldzogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZURyb3AgPSB0aGlzLmhhbmRsZURyb3AuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZURyYWdPdmVyID0gdGhpcy5oYW5kbGVEcmFnT3Zlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlRHJhZ0VuZCA9IHRoaXMuaGFuZGxlRHJhZ0VuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlRHJhZ0VudGVyID0gdGhpcy5oYW5kbGVEcmFnRW50ZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZURyYWdMZWF2ZSA9IHRoaXMuaGFuZGxlRHJhZ0xlYXZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVNb3VzZUVudGVyID0gdGhpcy5oYW5kbGVNb3VzZUVudGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVNb3VzZUxlYXZlID0gdGhpcy5oYW5kbGVNb3VzZUxlYXZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVDbGljayA9IHRoaXMuaGFuZGxlQ2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZUZpbGVJbnB1dCA9IHRoaXMuaGFuZGxlRmlsZUlucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5jaG9vc2VGaWxlID0gdGhpcy5jaG9vc2VGaWxlLmJpbmQodGhpcyk7XG4gIH1cbiAgaGFuZGxlRHJvcCAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc2V0U3RhdGUoe2RyYWdPdmVyOiBmYWxzZX0pO1xuICAgIC8vIGlmIGRyb3BwZWQgaXRlbXMgYXJlbid0IGZpbGVzLCByZWplY3QgdGhlbVxuICAgIGNvbnN0IGR0ID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgIGlmIChkdC5pdGVtcykge1xuICAgICAgaWYgKGR0Lml0ZW1zWzBdLmtpbmQgPT09ICdmaWxlJykge1xuICAgICAgICBjb25zdCBkcm9wcGVkRmlsZSA9IGR0Lml0ZW1zWzBdLmdldEFzRmlsZSgpO1xuICAgICAgICB0aGlzLmNob29zZUZpbGUoZHJvcHBlZEZpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBoYW5kbGVEcmFnT3ZlciAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGhhbmRsZURyYWdFbmQgKGV2ZW50KSB7XG4gICAgdmFyIGR0ID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgIGlmIChkdC5pdGVtcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkdC5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBkdC5pdGVtcy5yZW1vdmUoaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5jbGVhckRhdGEoKTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlRHJhZ0VudGVyICgpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtkcmFnT3ZlcjogdHJ1ZSwgZGltUHJldmlldzogdHJ1ZX0pO1xuICB9XG4gIGhhbmRsZURyYWdMZWF2ZSAoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7ZHJhZ092ZXI6IGZhbHNlLCBkaW1QcmV2aWV3OiBmYWxzZX0pO1xuICB9XG4gIGhhbmRsZU1vdXNlRW50ZXIgKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe21vdXNlT3ZlcjogdHJ1ZSwgZGltUHJldmlldzogdHJ1ZX0pO1xuICB9XG4gIGhhbmRsZU1vdXNlTGVhdmUgKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe21vdXNlT3ZlcjogZmFsc2UsIGRpbVByZXZpZXc6IGZhbHNlfSk7XG4gIH1cbiAgaGFuZGxlQ2xpY2sgKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZV9pbnB1dCcpLmNsaWNrKCk7XG4gIH1cbiAgaGFuZGxlRmlsZUlucHV0IChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG4gICAgdGhpcy5jaG9vc2VGaWxlKGZpbGVMaXN0WzBdKTtcbiAgfVxuICBjaG9vc2VGaWxlIChmaWxlKSB7XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlRmlsZShmaWxlKTsgLy8gdmFsaWRhdGUgdGhlIGZpbGUncyBuYW1lLCB0eXBlLCBhbmQgc2l6ZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2V0RmlsZUVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgLy8gc3RhZ2UgaXQgc28gaXQgd2lsbCBiZSByZWFkeSB3aGVuIHRoZSBwdWJsaXNoIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAgICB0aGlzLnByb3BzLnNlbGVjdEZpbGUoZmlsZSk7XG4gICAgfVxuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS10YWxsIGZsZXgtY29udGFpbmVyLS1jb2x1bW4nPlxuICAgICAgICA8Zm9ybT5cbiAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPSdpbnB1dC1maWxlJyB0eXBlPSdmaWxlJyBpZD0nZmlsZV9pbnB1dCcgbmFtZT0nZmlsZV9pbnB1dCcgYWNjZXB0PSd2aWRlby8qLGltYWdlLyonIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUZpbGVJbnB1dH0gZW5jVHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YScgLz5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgICA8ZGl2IGlkPSdwcmV2aWV3LWRyb3B6b25lJyBjbGFzc05hbWU9eydyb3cgcm93LS1wYWRkZWQgcm93LS10YWxsIGRyb3B6b25lJyArICh0aGlzLnN0YXRlLmRyYWdPdmVyID8gJyBkcm9wem9uZS0tZHJhZy1vdmVyJyA6ICcnKX0gb25Ecm9wPXt0aGlzLmhhbmRsZURyb3B9IG9uRHJhZ092ZXI9e3RoaXMuaGFuZGxlRHJhZ092ZXJ9IG9uRHJhZ0VuZD17dGhpcy5oYW5kbGVEcmFnRW5kfSBvbkRyYWdFbnRlcj17dGhpcy5oYW5kbGVEcmFnRW50ZXJ9IG9uRHJhZ0xlYXZlPXt0aGlzLmhhbmRsZURyYWdMZWF2ZX0gb25Nb3VzZUVudGVyPXt0aGlzLmhhbmRsZU1vdXNlRW50ZXJ9IG9uTW91c2VMZWF2ZT17dGhpcy5oYW5kbGVNb3VzZUxlYXZlfSBvbkNsaWNrPXt0aGlzLmhhbmRsZUNsaWNrfT5cbiAgICAgICAgICB7dGhpcy5wcm9wcy5maWxlID8gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPFB1Ymxpc2hQcmV2aWV3XG4gICAgICAgICAgICAgICAgZGltUHJldmlldz17dGhpcy5zdGF0ZS5kaW1QcmV2aWV3fVxuICAgICAgICAgICAgICAgIGZpbGU9e3RoaXMucHJvcHMuZmlsZX1cbiAgICAgICAgICAgICAgICB0aHVtYm5haWw9e3RoaXMucHJvcHMudGh1bWJuYWlsfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGlkPSdkcm9wem9uZS10ZXh0LWhvbGRlcicgY2xhc3NOYW1lPXsnZmxleC1jb250YWluZXItLWNvbHVtbiBmbGV4LWNvbnRhaW5lci0tY2VudGVyLWNlbnRlcid9PlxuICAgICAgICAgICAgICAgIHsgdGhpcy5zdGF0ZS5kcmFnT3ZlciA/IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9J2Ryb3B6b25lLWRyYWdvdmVyJz5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdibHVlJz5Ecm9wIGl0LjwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7IHRoaXMuc3RhdGUubW91c2VPdmVyID8gKFxuICAgICAgICAgICAgICAgICAgPGRpdiBpZD0nZHJvcHpvbmUtaW5zdHJ1Y3Rpb25zJz5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtcGxhY2Vob2xkZXIgaW5mby1tZXNzYWdlLS1mYWlsdXJlJyBpZD0naW5wdXQtZXJyb3ItZmlsZS1zZWxlY3Rpb24nPnt0aGlzLnByb3BzLmZpbGVFcnJvcn08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxwPkRyYWcgJiBkcm9wIGltYWdlIG9yIHZpZGVvIGhlcmUgdG8gcHVibGlzaDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdmaW5lLXByaW50Jz5PUjwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdibHVlLS11bmRlcmxpbmVkJz5DSE9PU0UgRklMRTwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBpZD0nZHJvcHpvbmUtdGV4dC1ob2xkZXInIGNsYXNzTmFtZT17J2ZsZXgtY29udGFpbmVyLS1jb2x1bW4gZmxleC1jb250YWluZXItLWNlbnRlci1jZW50ZXInfT5cbiAgICAgICAgICAgICAgeyB0aGlzLnN0YXRlLmRyYWdPdmVyID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9J2Ryb3B6b25lLWRyYWdvdmVyJz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nYmx1ZSc+RHJvcCBpdC48L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBpZD0nZHJvcHpvbmUtaW5zdHJ1Y3Rpb25zJz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlLXBsYWNlaG9sZGVyIGluZm8tbWVzc2FnZS0tZmFpbHVyZScgaWQ9J2lucHV0LWVycm9yLWZpbGUtc2VsZWN0aW9uJz57dGhpcy5wcm9wcy5maWxlRXJyb3J9PC9wPlxuICAgICAgICAgICAgICAgICAgPHA+RHJhZyAmIGRyb3AgaW1hZ2Ugb3IgdmlkZW8gaGVyZSB0byBwdWJsaXNoPC9wPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSdmaW5lLXByaW50Jz5PUjwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0nYmx1ZS0tdW5kZXJsaW5lZCc+Q0hPT1NFIEZJTEU8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IERyb3B6b25lO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvRHJvcHpvbmUvdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgd2l0aFJvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IERyb3B6b25lIGZyb20gJ2NvbnRhaW5lcnMvRHJvcHpvbmUnO1xuaW1wb3J0IFB1Ymxpc2hUaXRsZUlucHV0IGZyb20gJ2NvbnRhaW5lcnMvUHVibGlzaFRpdGxlSW5wdXQnO1xuaW1wb3J0IFB1Ymxpc2hVcmxJbnB1dCBmcm9tICdjb250YWluZXJzL1B1Ymxpc2hVcmxJbnB1dCc7XG5pbXBvcnQgUHVibGlzaFRodW1ibmFpbElucHV0IGZyb20gJ2NvbnRhaW5lcnMvUHVibGlzaFRodW1ibmFpbElucHV0JztcbmltcG9ydCBQdWJsaXNoTWV0YWRhdGFJbnB1dHMgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoTWV0YWRhdGFJbnB1dHMnO1xuaW1wb3J0IENoYW5uZWxTZWxlY3QgZnJvbSAnY29udGFpbmVycy9DaGFubmVsU2VsZWN0JztcblxuY2xhc3MgUHVibGlzaERldGFpbHMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLm9uUHVibGlzaFN1Ym1pdCA9IHRoaXMub25QdWJsaXNoU3VibWl0LmJpbmQodGhpcyk7XG4gIH1cbiAgb25QdWJsaXNoU3VibWl0ICgpIHtcbiAgICB0aGlzLnByb3BzLnN0YXJ0UHVibGlzaCh0aGlzLnByb3BzLmhpc3RvcnkpO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1uby1ib3R0b20nPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMTAnPlxuICAgICAgICAgIDxQdWJsaXNoVGl0bGVJbnB1dCAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgey8qIGxlZnQgY29sdW1uICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNSBjb2x1bW4tLXNtbC0xMCcgPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQnPlxuICAgICAgICAgICAgPERyb3B6b25lIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7LyogcmlnaHQgY29sdW1uICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNSBjb2x1bW4tLXNtbC0xMCBhbGlnbi1jb250ZW50LXRvcCc+XG4gICAgICAgICAgPGRpdiBpZD0ncHVibGlzaC1hY3RpdmUtYXJlYScgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLW5vLXRvcCByb3ctLXdpZGUnPlxuICAgICAgICAgICAgICA8UHVibGlzaFVybElucHV0IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS1uby10b3Agcm93LS13aWRlJz5cbiAgICAgICAgICAgICAgPENoYW5uZWxTZWxlY3QgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgeyAodGhpcy5wcm9wcy5maWxlLnR5cGUgPT09ICd2aWRlby9tcDQnKSAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1wYWRkZWQgcm93LS1uby10b3Agcm93LS13aWRlICc+XG4gICAgICAgICAgICAgICAgPFB1Ymxpc2hUaHVtYm5haWxJbnB1dCAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0tbm8tdG9wIHJvdy0tbm8tYm90dG9tIHJvdy0td2lkZSc+XG4gICAgICAgICAgICAgIDxQdWJsaXNoTWV0YWRhdGFJbnB1dHMgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXdpZGUgYWxpZ24tY29udGVudC1jZW50ZXInPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPSdwdWJsaXNoLXN1Ym1pdCcgY2xhc3NOYW1lPSdidXR0b24tLXByaW1hcnkgYnV0dG9uLS1sYXJnZScgb25DbGljaz17dGhpcy5vblB1Ymxpc2hTdWJtaXR9PlB1Ymxpc2g8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyByb3ctLXBhZGRlZCByb3ctLW5vLWJvdHRvbSBhbGlnbi1jb250ZW50LWNlbnRlcic+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLWNhbmNlbCcgb25DbGljaz17dGhpcy5wcm9wcy5jbGVhckZpbGV9PkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tc2hvcnQgYWxpZ24tY29udGVudC1jZW50ZXInPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9J2ZpbmUtcHJpbnQnPkJ5IGNsaWNraW5nICdQdWJsaXNoJywgeW91IGFmZmlybSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodHMgdG8gcHVibGlzaCB0aGlzIGNvbnRlbnQgdG8gdGhlIExCUlkgbmV0d29yaywgYW5kIHRoYXQgeW91IHVuZGVyc3RhbmQgdGhlIHByb3BlcnRpZXMgb2YgcHVibGlzaGluZyBpdCB0byBhIGRlY2VudHJhbGl6ZWQsIHVzZXItY29udHJvbGxlZCBuZXR3b3JrLiA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwczovL2xicnkuaW8vbGVhcm4nPlJlYWQgbW9yZS48L2E+PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aFJvdXRlcihQdWJsaXNoRGV0YWlscyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoRGV0YWlscy92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmNsYXNzIFB1Ymxpc2hUaXRsZUlucHV0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlSW5wdXQgPSB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcyk7XG4gIH1cbiAgaGFuZGxlSW5wdXQgKGUpIHtcbiAgICBjb25zdCBuYW1lID0gZS50YXJnZXQubmFtZTtcbiAgICBjb25zdCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMucHJvcHMub25NZXRhZGF0YUNoYW5nZShuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGlkPSdwdWJsaXNoLXRpdGxlJyBjbGFzc05hbWU9J2lucHV0LXRleHQgdGV4dC0tbGFyZ2UgaW5wdXQtdGV4dC0tZnVsbC13aWR0aCcgbmFtZT0ndGl0bGUnIHBsYWNlaG9sZGVyPSdHaXZlIHlvdXIgcG9zdCBhIHRpdGxlLi4uJyBvbkNoYW5nZT17dGhpcy5oYW5kbGVJbnB1dH0gdmFsdWU9e3RoaXMucHJvcHMudGl0bGV9IC8+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdWJsaXNoVGl0bGVJbnB1dDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hUaXRsZUlucHV0L3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IFVybE1pZGRsZSBmcm9tICdjb21wb25lbnRzL1B1Ymxpc2hVcmxNaWRkbGVEaXNwbGF5JztcblxuY2xhc3MgUHVibGlzaFVybElucHV0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlSW5wdXQgPSB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcyk7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGNvbnN0IHsgY2xhaW0sIGZpbGVOYW1lIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmICghY2xhaW0pIHtcbiAgICAgIHRoaXMuc2V0Q2xhaW1OYW1lKGZpbGVOYW1lKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAoeyBjbGFpbSwgZmlsZU5hbWUgfSkge1xuICAgIC8vIGlmIGEgbmV3IGZpbGUgd2FzIGNob3NlbiwgdXBkYXRlIHRoZSBjbGFpbSBuYW1lXG4gICAgaWYgKGZpbGVOYW1lICE9PSB0aGlzLnByb3BzLmZpbGVOYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRDbGFpbU5hbWUoZmlsZU5hbWUpO1xuICAgIH1cbiAgICAvLyBpZiB0aGUgY2xhaW0gaGFzIHVwZGF0ZWQsIGNoZWNrIGl0cyBhdmFpbGFiaWxpdHlcbiAgICBpZiAoY2xhaW0gIT09IHRoaXMucHJvcHMuY2xhaW0pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVDbGFpbShjbGFpbSk7XG4gICAgfVxuICB9XG4gIGhhbmRsZUlucHV0IChldmVudCkge1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB2YWx1ZSA9IHRoaXMuY2xlYW5zZUlucHV0KHZhbHVlKTtcbiAgICAvLyB1cGRhdGUgdGhlIHN0YXRlXG4gICAgdGhpcy5wcm9wcy5vbkNsYWltQ2hhbmdlKHZhbHVlKTtcbiAgfVxuICBjbGVhbnNlSW5wdXQgKGlucHV0KSB7XG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9cXHMrL2csICctJyk7IC8vIHJlcGxhY2Ugc3BhY2VzIHdpdGggZGFzaGVzXG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOS1dL2csICcnKTsgIC8vIHJlbW92ZSBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgQS1aLCBhLXosIDAtOSwgb3IgJy0nXG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG4gIHNldENsYWltTmFtZSAoZmlsZU5hbWUpIHtcbiAgICBjb25zdCBmaWxlTmFtZVdpdGhvdXRFbmRpbmcgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgY29uc3QgY2xlYW5DbGFpbU5hbWUgPSB0aGlzLmNsZWFuc2VJbnB1dChmaWxlTmFtZVdpdGhvdXRFbmRpbmcpO1xuICAgIHRoaXMucHJvcHMub25DbGFpbUNoYW5nZShjbGVhbkNsYWltTmFtZSk7XG4gIH1cbiAgdmFsaWRhdGVDbGFpbSAoY2xhaW0pIHtcbiAgICBpZiAoIWNsYWltKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5vblVybEVycm9yKCdFbnRlciBhIHVybCBhYm92ZScpO1xuICAgIH1cbiAgICByZXF1ZXN0KGAvYXBpL2NsYWltL2F2YWlsYWJpbGl0eS8ke2NsYWltfWApXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25VcmxFcnJvcihudWxsKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25VcmxFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIH0pO1xuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBjbGFpbSwgbG9nZ2VkSW5DaGFubmVsTmFtZSwgbG9nZ2VkSW5DaGFubmVsU2hvcnRJZCwgcHVibGlzaEluQ2hhbm5lbCwgc2VsZWN0ZWRDaGFubmVsLCB1cmxFcnJvciB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTEwIGNvbHVtbi0tc21sLTEwJz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2lucHV0LXRleHQtLXByaW1hcnkgc3Bhbi0tcmVsYXRpdmUnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndXJsLXRleHQtLXNlY29uZGFyeSc+c3BlZS5jaCAvIDwvc3Bhbj5cbiAgICAgICAgICA8VXJsTWlkZGxlXG4gICAgICAgICAgICBwdWJsaXNoSW5DaGFubmVsPXtwdWJsaXNoSW5DaGFubmVsfVxuICAgICAgICAgICAgc2VsZWN0ZWRDaGFubmVsPXtzZWxlY3RlZENoYW5uZWx9XG4gICAgICAgICAgICBsb2dnZWRJbkNoYW5uZWxOYW1lPXtsb2dnZWRJbkNoYW5uZWxOYW1lfVxuICAgICAgICAgICAgbG9nZ2VkSW5DaGFubmVsU2hvcnRJZD17bG9nZ2VkSW5DaGFubmVsU2hvcnRJZH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nY2xhaW0tbmFtZS1pbnB1dCcgY2xhc3NOYW1lPSdpbnB1dC10ZXh0JyBuYW1lPSdjbGFpbScgcGxhY2Vob2xkZXI9J3lvdXItdXJsLWhlcmUnIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUlucHV0fSB2YWx1ZT17Y2xhaW19IC8+XG4gICAgICAgICAgeyAoY2xhaW0gJiYgIXVybEVycm9yKSAmJiA8c3BhbiBpZD0naW5wdXQtc3VjY2Vzcy1jbGFpbS1uYW1lJyBjbGFzc05hbWU9J2luZm8tbWVzc2FnZS0tc3VjY2VzcyBzcGFuLS1hYnNvbHV0ZSc+eydcXHUyNzEzJ308L3NwYW4+IH1cbiAgICAgICAgICB7IHVybEVycm9yICYmIDxzcGFuIGlkPSdpbnB1dC1zdWNjZXNzLWNoYW5uZWwtbmFtZScgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLWZhaWx1cmUgc3Bhbi0tYWJzb2x1dGUnPnsnXFx1MjcxNid9PC9zcGFuPiB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIHsgdXJsRXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBpZD0naW5wdXQtZXJyb3ItY2xhaW0tbmFtZScgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLWZhaWx1cmUnPnt1cmxFcnJvcn08L3A+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz5DaG9vc2UgYSBjdXN0b20gdXJsPC9wPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdWJsaXNoVXJsSW5wdXQ7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVXJsSW5wdXQvdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiBkYXRhVVJJdG9CbG9iKGRhdGFVUkkpIHtcbiAgLy8gY29udmVydCBiYXNlNjQvVVJMRW5jb2RlZCBkYXRhIGNvbXBvbmVudCB0byByYXcgYmluYXJ5IGRhdGEgaGVsZCBpbiBhIHN0cmluZ1xuICBsZXQgYnl0ZVN0cmluZyA9IGF0b2IoZGF0YVVSSS5zcGxpdCgnLCcpWzFdKTtcbiAgLy8gc2VwYXJhdGUgb3V0IHRoZSBtaW1lIGNvbXBvbmVudFxuICBsZXQgbWltZVN0cmluZyA9IGRhdGFVUkkuc3BsaXQoJywnKVswXS5zcGxpdCgnOicpWzFdLnNwbGl0KCc7JylbMF07XG4gIC8vIHdyaXRlIHRoZSBieXRlcyBvZiB0aGUgc3RyaW5nIHRvIGEgdHlwZWQgYXJyYXlcbiAgbGV0IGlhID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICBpYVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gbmV3IEJsb2IoW2lhXSwge3R5cGU6IG1pbWVTdHJpbmd9KTtcbn1cblxuY2xhc3MgUHVibGlzaFRodW1ibmFpbElucHV0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICB2aWRlb1NvdXJjZSAgIDogbnVsbCxcbiAgICAgIGVycm9yICAgICAgICAgOiBudWxsLFxuICAgICAgc2xpZGVyTWluUmFuZ2U6IDEsXG4gICAgICBzbGlkZXJNYXhSYW5nZTogbnVsbCxcbiAgICAgIHNsaWRlclZhbHVlICAgOiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5oYW5kbGVWaWRlb0xvYWRlZERhdGEgPSB0aGlzLmhhbmRsZVZpZGVvTG9hZGVkRGF0YS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlID0gdGhpcy5oYW5kbGVTbGlkZXJDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZVRodW1ibmFpbCA9IHRoaXMuY3JlYXRlVGh1bWJuYWlsLmJpbmQodGhpcyk7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGNvbnN0IHsgZmlsZSB9ID0gdGhpcy5wcm9wcztcbiAgICB0aGlzLnNldFZpZGVvU291cmNlKGZpbGUpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKG5leHRQcm9wcykge1xuICAgIC8vIGlmIGZpbGUgY2hhbmdlc1xuICAgIGlmIChuZXh0UHJvcHMuZmlsZSAmJiBuZXh0UHJvcHMuZmlsZSAhPT0gdGhpcy5wcm9wcy5maWxlKSB7XG4gICAgICBjb25zdCB7IGZpbGUgfSA9IG5leHRQcm9wcztcbiAgICAgIHRoaXMuc2V0VmlkZW9Tb3VyY2UoZmlsZSk7XG4gICAgfTtcbiAgfVxuICBzZXRWaWRlb1NvdXJjZSAoZmlsZSkge1xuICAgIGNvbnN0IHByZXZpZXdSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHByZXZpZXdSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICBwcmV2aWV3UmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFVcmkgPSBwcmV2aWV3UmVhZGVyLnJlc3VsdDtcbiAgICAgIGNvbnN0IGJsb2IgPSBkYXRhVVJJdG9CbG9iKGRhdGFVcmkpO1xuICAgICAgY29uc3QgdmlkZW9Tb3VyY2UgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZpZGVvU291cmNlIH0pO1xuICAgIH07XG4gIH1cbiAgaGFuZGxlVmlkZW9Mb2FkZWREYXRhIChldmVudCkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gZXZlbnQudGFyZ2V0LmR1cmF0aW9uO1xuICAgIGNvbnN0IHRvdGFsTWludXRlcyA9IE1hdGguZmxvb3IoZHVyYXRpb24gLyA2MCk7XG4gICAgY29uc3QgdG90YWxTZWNvbmRzID0gTWF0aC5mbG9vcihkdXJhdGlvbiAlIDYwKTtcbiAgICAvLyBzZXQgdGhlIHNsaWRlclxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2xpZGVyTWF4UmFuZ2U6IGR1cmF0aW9uICogMTAwLFxuICAgICAgc2xpZGVyVmFsdWUgICA6IGR1cmF0aW9uICogMTAwIC8gMixcbiAgICAgIHRvdGFsTWludXRlcyxcbiAgICAgIHRvdGFsU2Vjb25kcyxcbiAgICB9KTtcbiAgICAvLyB1cGRhdGUgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgdmlkZW9cbiAgICBsZXQgdmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlkZW8tdGh1bWItcGxheWVyJyk7XG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSBkdXJhdGlvbiAvIDI7XG4gIH1cbiAgaGFuZGxlU2xpZGVyQ2hhbmdlIChldmVudCkge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAvLyB1cGRhdGUgdGhlIHNsaWRlciB2YWx1ZVxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2xpZGVyVmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSB2aWRlb1xuICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWRlby10aHVtYi1wbGF5ZXInKTtcbiAgICB2aWRlby5jdXJyZW50VGltZSA9IHZhbHVlIC8gMTAwO1xuICB9XG4gIGNyZWF0ZVRodW1ibmFpbCAoKSB7XG4gICAgLy8gdGFrZSBhIHNuYXBzaG90XG4gICAgbGV0IHZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZGVvLXRodW1iLXBsYXllcicpO1xuICAgIGxldCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB2aWRlby52aWRlb1dpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSB2aWRlby52aWRlb0hlaWdodDtcbiAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UodmlkZW8sIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgY29uc3QgZGF0YVVybCA9IGNhbnZhcy50b0RhdGFVUkwoKTtcbiAgICBjb25zdCBibG9iID0gZGF0YVVSSXRvQmxvYihkYXRhVXJsKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IG5ldyBGaWxlKFtibG9iXSwgYHRodW1ibmFpbC5wbmdgLCB7XG4gICAgICB0eXBlOiAnaW1hZ2UvcG5nJyxcbiAgICB9KTtcbiAgICAvLyBzZXQgdGhlIHRodW1ibmFpbCBpbiByZWR1eCBzdG9yZVxuICAgIGlmIChzbmFwc2hvdCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk5ld1RodW1ibmFpbChzbmFwc2hvdCk7XG4gICAgfVxuICB9XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBlcnJvciwgdmlkZW9Tb3VyY2UsIHNsaWRlck1pblJhbmdlLCBzbGlkZXJNYXhSYW5nZSwgc2xpZGVyVmFsdWUsIHRvdGFsTWludXRlcywgdG90YWxTZWNvbmRzIH0gPSB0aGlzLnN0YXRlO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSdsYWJlbCc+VGh1bWJuYWlsOjwvbGFiZWw+XG4gICAgICAgIDx2aWRlb1xuICAgICAgICAgIGlkPSd2aWRlby10aHVtYi1wbGF5ZXInXG4gICAgICAgICAgcHJlbG9hZD0nbWV0YWRhdGEnXG4gICAgICAgICAgbXV0ZWRcbiAgICAgICAgICBzdHlsZT17e2Rpc3BsYXk6ICdub25lJ319XG4gICAgICAgICAgcGxheXNJbmxpbmVcbiAgICAgICAgICBvbkxvYWRlZERhdGE9e3RoaXMuaGFuZGxlVmlkZW9Mb2FkZWREYXRhfVxuICAgICAgICAgIHNyYz17dmlkZW9Tb3VyY2V9XG4gICAgICAgICAgb25TZWVrZWQ9e3RoaXMuY3JlYXRlVGh1bWJuYWlsfVxuICAgICAgICAvPlxuICAgICAgICB7XG4gICAgICAgICAgc2xpZGVyVmFsdWUgPyAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZmxleC1jb250YWluZXItLXJvdyBmbGV4LWNvbnRhaW5lci0tc3BhY2UtYmV0d2Vlbi1jZW50ZXInIHN0eWxlPXt7d2lkdGg6ICcxMDAlJ319PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJz4wJzAwXCI8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UnPnt0b3RhbE1pbnV0ZXN9J3t0b3RhbFNlY29uZHN9XCI8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT0ncmFuZ2UnXG4gICAgICAgICAgICAgICAgICBtaW49e3NsaWRlck1pblJhbmdlfVxuICAgICAgICAgICAgICAgICAgbWF4PXtzbGlkZXJNYXhSYW5nZX1cbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtzbGlkZXJWYWx1ZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nc2xpZGVyJ1xuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlU2xpZGVyQ2hhbmdlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0naW5mby1tZXNzYWdlJyA+bG9hZGluZy4uLiA8L3A+XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHsgZXJyb3IgPyAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UtLWZhaWx1cmUnPntlcnJvcn08L3A+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPSdpbmZvLW1lc3NhZ2UnPlVzZSBzbGlkZXIgdG8gc2V0IHRodW1ibmFpbDwvcD5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHVibGlzaFRodW1ibmFpbElucHV0O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaFRodW1ibmFpbElucHV0L3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBFeHBhbmRpbmdUZXh0QXJlYSBmcm9tICdjb21wb25lbnRzL0V4cGFuZGluZ1RleHRBcmVhJztcblxuY2xhc3MgUHVibGlzaE1ldGFkYXRhSW5wdXRzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMudG9nZ2xlU2hvd0lucHV0cyA9IHRoaXMudG9nZ2xlU2hvd0lucHV0cy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlSW5wdXQgPSB0aGlzLmhhbmRsZUlucHV0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVTZWxlY3QgPSB0aGlzLmhhbmRsZVNlbGVjdC5iaW5kKHRoaXMpO1xuICB9XG4gIHRvZ2dsZVNob3dJbnB1dHMgKCkge1xuICAgIHRoaXMucHJvcHMub25Ub2dnbGVNZXRhZGF0YUlucHV0cyghdGhpcy5wcm9wcy5zaG93TWV0YWRhdGFJbnB1dHMpO1xuICB9XG4gIGhhbmRsZUlucHV0IChldmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldC50eXBlID09PSAnY2hlY2tib3gnID8gdGFyZ2V0LmNoZWNrZWQgOiB0YXJnZXQudmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IHRhcmdldC5uYW1lO1xuICAgIHRoaXMucHJvcHMub25NZXRhZGF0YUNoYW5nZShuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgaGFuZGxlU2VsZWN0IChldmVudCkge1xuICAgIGNvbnN0IG5hbWUgPSBldmVudC50YXJnZXQubmFtZTtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IGV2ZW50LnRhcmdldC5zZWxlY3RlZE9wdGlvbnNbMF0udmFsdWU7XG4gICAgdGhpcy5wcm9wcy5vbk1ldGFkYXRhQ2hhbmdlKG5hbWUsIHNlbGVjdGVkT3B0aW9uKTtcbiAgfVxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGlkPSdwdWJsaXNoLWRldGFpbHMnIGNsYXNzTmFtZT0ncm93IHJvdy0tcGFkZGVkIHJvdy0tbm8tdG9wIHJvdy0td2lkZSc+XG4gICAgICAgIHt0aGlzLnByb3BzLnNob3dNZXRhZGF0YUlucHV0cyAmJiAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1uby10b3AnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMyBjb2x1bW4tLW1lZC0xMCBhbGlnbi1jb250ZW50LXRvcCc+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9J3B1Ymxpc2gtbGljZW5zZScgY2xhc3NOYW1lPSdsYWJlbCc+RGVzY3JpcHRpb246PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+PGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTcgY29sdW1uLS1zbWwtMTAnPlxuICAgICAgICAgICAgICAgIDxFeHBhbmRpbmdUZXh0QXJlYVxuICAgICAgICAgICAgICAgICAgaWQ9J3B1Ymxpc2gtZGVzY3JpcHRpb24nXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3RleHRhcmVhIHRleHRhcmVhLS1wcmltYXJ5IHRleHRhcmVhLS1mdWxsLXdpZHRoJ1xuICAgICAgICAgICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICAgICAgICAgIG1heExlbmd0aD17MjAwMH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IG1heEhlaWdodDogMjAwIH19XG4gICAgICAgICAgICAgICAgICBuYW1lPSdkZXNjcmlwdGlvbidcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSdPcHRpb25hbCBkZXNjcmlwdGlvbidcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnByb3BzLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlSW5wdXR9IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS1uby10b3AnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tMyBjb2x1bW4tLW1lZC0xMCc+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9J3B1Ymxpc2gtbGljZW5zZScgY2xhc3NOYW1lPSdsYWJlbCc+TGljZW5zZTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNyBjb2x1bW4tLXNtbC0xMCc+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCB0eXBlPSd0ZXh0JyBuYW1lPSdsaWNlbnNlJyBpZD0ncHVibGlzaC1saWNlbnNlJyBjbGFzc05hbWU9J3NlbGVjdCBzZWxlY3QtLXByaW1hcnknIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZVNlbGVjdH0+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPScgJz5VbnNwZWNpZmllZDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0nUHVibGljIERvbWFpbic+UHVibGljIERvbWFpbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0nQ3JlYXRpdmUgQ29tbW9ucyc+Q3JlYXRpdmUgQ29tbW9uczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IHJvdy0tbm8tdG9wJz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbHVtbiBjb2x1bW4tLTMnPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPSdwdWJsaXNoLW5zZncnIGNsYXNzTmFtZT0nbGFiZWwnPk1hdHVyZTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj48ZGl2IGNsYXNzTmFtZT0nY29sdW1uIGNvbHVtbi0tNyc+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT0naW5wdXQtY2hlY2tib3gnIHR5cGU9J2NoZWNrYm94JyBpZD0ncHVibGlzaC1uc2Z3JyBuYW1lPSduc2Z3JyB2YWx1ZT17dGhpcy5wcm9wcy5uc2Z3fSBvbkNoYW5nZT17dGhpcy5oYW5kbGVJbnB1dH0gLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9J2J1dHRvbi0tc2Vjb25kYXJ5JyBvbkNsaWNrPXt0aGlzLnRvZ2dsZVNob3dJbnB1dHN9Pnt0aGlzLnByb3BzLnNob3dNZXRhZGF0YUlucHV0cyA/ICdsZXNzJyA6ICdtb3JlJ308L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHVibGlzaE1ldGFkYXRhSW5wdXRzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaE1ldGFkYXRhSW5wdXRzL3ZpZXcuanN4IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY2xhc3MgUHVibGlzaERpc2FibGVkTWVzc2FnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMucHJvcHMubWVzc2FnZTtcbiAgICBjb25zb2xlLmxvZygndGhpcy5wcm9wcy5tZXNzYWdlOicsIG1lc3NhZ2UpO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IGRyb3B6b25lLS1kaXNhYmxlZCByb3ctLXRhbGwgZmxleC1jb250YWluZXItLWNvbHVtbiBmbGV4LWNvbnRhaW5lci0tY2VudGVyLWNlbnRlcic+XG4gICAgICAgIDxwIGNsYXNzTmFtZT0ndGV4dC0tZGlzYWJsZWQnPlB1Ymxpc2hpbmcgaXMgY3VycmVudGx5IGRpc2FibGVkLjwvcD5cbiAgICAgICAgPHAgY2xhc3NOYW1lPSd0ZXh0LS1kaXNhYmxlZCc+e21lc3NhZ2V9PC9wPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdWJsaXNoRGlzYWJsZWRNZXNzYWdlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnRhaW5lcnMvUHVibGlzaERpc2FibGVkTWVzc2FnZS92aWV3LmpzeCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAnY29tcG9uZW50cy9Qcm9ncmVzc0Jhcic7XG5pbXBvcnQgKiBhcyBwdWJsaXNoU3RhdGVzIGZyb20gJ2NvbnN0YW50cy9wdWJsaXNoX2NsYWltX3N0YXRlcyc7XG5cbmNsYXNzIFB1Ymxpc2hTdGF0dXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgc3RhdHVzLCBtZXNzYWdlLCBjbGVhckZpbGUgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgcm93LS10YWxsIGZsZXgtY29udGFpbmVyLS1jb2x1bW4gZmxleC1jb250YWluZXItLWNlbnRlci1jZW50ZXInPlxuICAgICAgICB7c3RhdHVzID09PSBwdWJsaXNoU3RhdGVzLkxPQURfU1RBUlQgJiZcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3JvdyBhbGlnbi1jb250ZW50LWNlbnRlcic+XG4gICAgICAgICAgPHA+RmlsZSBpcyBsb2FkaW5nIHRvIHNlcnZlcjwvcD5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9J2JsdWUnPjAlPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7c3RhdHVzID09PSBwdWJsaXNoU3RhdGVzLkxPQURJTkcgJiZcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93IGFsaWduLWNvbnRlbnQtY2VudGVyJz5cbiAgICAgICAgICAgIDxwPkZpbGUgaXMgbG9hZGluZyB0byBzZXJ2ZXI8L3A+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9J2JsdWUnPnttZXNzYWdlfTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAge3N0YXR1cyA9PT0gcHVibGlzaFN0YXRlcy5QVUJMSVNISU5HICYmXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgYWxpZ24tY29udGVudC1jZW50ZXInPlxuICAgICAgICAgIDxwPlVwbG9hZCBjb21wbGV0ZS4gIFlvdXIgZmlsZSBpcyBub3cgYmVpbmcgcHVibGlzaGVkIG9uIHRoZSBibG9ja2NoYWluLi4uPC9wPlxuICAgICAgICAgIDxQcm9ncmVzc0JhciBzaXplPXsxMn0gLz5cbiAgICAgICAgICA8cD5DdXJpb3VzIHdoYXQgbWFnaWMgaXMgaGFwcGVuaW5nIGhlcmU/IDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgdGFyZ2V0PSdibGFuaycgaHJlZj0naHR0cHM6Ly9sYnJ5LmlvL2ZhcS93aGF0LWlzLWxicnknPkxlYXJuIG1vcmUuPC9hPjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAge3N0YXR1cyA9PT0gcHVibGlzaFN0YXRlcy5TVUNDRVNTICYmXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgYWxpZ24tY29udGVudC1jZW50ZXInPlxuICAgICAgICAgIDxwPllvdXIgcHVibGlzaCBpcyBjb21wbGV0ZSEgWW91IGFyZSBiZWluZyByZWRpcmVjdGVkIHRvIGl0IG5vdy48L3A+XG4gICAgICAgICAgPHA+SWYgeW91IGFyZSBub3QgYXV0b21hdGljYWxseSByZWRpcmVjdGVkLCA8YSBjbGFzc05hbWU9J2xpbmstLXByaW1hcnknIHRhcmdldD0nX2JsYW5rJyBocmVmPXttZXNzYWdlfT5jbGljayBoZXJlLjwvYT48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHtzdGF0dXMgPT09IHB1Ymxpc2hTdGF0ZXMuRkFJTEVEICYmXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cgYWxpZ24tY29udGVudC1jZW50ZXInPlxuICAgICAgICAgIDxwPlNvbWV0aGluZyB3ZW50IHdyb25nLi4uPC9wPlxuICAgICAgICAgIDxwPjxzdHJvbmc+e21lc3NhZ2V9PC9zdHJvbmc+PC9wPlxuICAgICAgICAgIDxwPkZvciBoZWxwLCBwb3N0IHRoZSBhYm92ZSBlcnJvciB0ZXh0IGluIHRoZSAjc3BlZWNoIGNoYW5uZWwgb24gdGhlIDxhIGNsYXNzTmFtZT0nbGluay0tcHJpbWFyeScgaHJlZj0naHR0cHM6Ly9kaXNjb3JkLmdnL1lqWWJ3aFMnIHRhcmdldD0nX2JsYW5rJz5sYnJ5IGRpc2NvcmQ8L2E+PC9wPlxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidXR0b24tLXNlY29uZGFyeScgb25DbGljaz17Y2xlYXJGaWxlfT5SZXNldDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHVibGlzaFN0YXR1cztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb250YWluZXJzL1B1Ymxpc2hTdGF0dXMvdmlldy5qc3giLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IERyb3B6b25lIGZyb20gJ2NvbnRhaW5lcnMvRHJvcHpvbmUnO1xuaW1wb3J0IFB1Ymxpc2hEZXRhaWxzIGZyb20gJ2NvbnRhaW5lcnMvUHVibGlzaERldGFpbHMnO1xuaW1wb3J0IFB1Ymxpc2hTdGF0dXMgZnJvbSAnY29udGFpbmVycy9QdWJsaXNoU3RhdHVzJztcbmltcG9ydCBQdWJsaXNoRGlzYWJsZWRNZXNzYWdlIGZyb20gJ2NvbnRhaW5lcnMvUHVibGlzaERpc2FibGVkTWVzc2FnZSc7XG5cbmNsYXNzIFB1Ymxpc2hUb29sIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgY29uc29sZS5sb2coJ3B1Ymxpc2ggaXMgZGlzYWJsZWQnKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxQdWJsaXNoRGlzYWJsZWRNZXNzYWdlIC8+XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygncHVibGlzaCBpcyBub3QgZGlzYWJsZWQnKTtcbiAgICAgIGlmICh0aGlzLnByb3BzLmZpbGUpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc3RhdHVzKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxQdWJsaXNoU3RhdHVzIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gPFB1Ymxpc2hEZXRhaWxzIC8+O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gPERyb3B6b25lIC8+O1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHVibGlzaFRvb2w7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29udGFpbmVycy9QdWJsaXNoVG9vbC92aWV3LmpzeCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhc3Nwb3J0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicGFzc3BvcnRcIlxuLy8gbW9kdWxlIGlkID0gOTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZnVuY3Rpb24gTXlzcWxDb25maWcgKCkge1xuICB0aGlzLmRhdGFiYXNlID0gJ2RlZmF1bHQnO1xuICB0aGlzLnVzZXJuYW1lID0gJ2RlZmF1bHQnO1xuICB0aGlzLnBhc3N3b3JkID0gJ2RlZmF1bHQnO1xuICB0aGlzLmNvbmZpZ3VyZSA9IChjb25maWcpID0+IHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdObyBNeVNRTCBjb25maWcgcmVjZWl2ZWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IHtkYXRhYmFzZSwgdXNlcm5hbWUsIHBhc3N3b3JkfSA9IGNvbmZpZztcbiAgICB0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2U7XG4gICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lO1xuICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IE15c3FsQ29uZmlnKCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jb25maWcvbXlzcWxDb25maWcuanMiLCJmdW5jdGlvbiBTbGFja0NvbmZpZyAoKSB7XG4gIHRoaXMuc2xhY2tXZWJIb29rICAgICAgPSAnZGVmYXVsdCc7XG4gIHRoaXMuc2xhY2tFcnJvckNoYW5uZWwgPSAnZGVmYXVsdCc7XG4gIHRoaXMuc2xhY2tJbmZvQ2hhbm5lbCAgPSAnZGVmYXVsdCc7XG4gIHRoaXMuY29uZmlndXJlID0gKGNvbmZpZykgPT4ge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ05vIHNsYWNrIGNvbmZpZyByZWNlaXZlZC4nKTtcbiAgICB9XG4gICAgY29uc3Qge3NsYWNrV2ViSG9vaywgc2xhY2tFcnJvckNoYW5uZWwsIHNsYWNrSW5mb0NoYW5uZWx9ID0gY29uZmlnO1xuICAgIHRoaXMuc2xhY2tXZWJIb29rID0gc2xhY2tXZWJIb29rO1xuICAgIHRoaXMuc2xhY2tFcnJvckNoYW5uZWwgPSBzbGFja0Vycm9yQ2hhbm5lbDtcbiAgICB0aGlzLnNsYWNrSW5mb0NoYW5uZWwgPSBzbGFja0luZm9DaGFubmVsO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2xhY2tDb25maWcoKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvbmZpZy9zbGFja0NvbmZpZy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhc3Nwb3J0LWxvY2FsXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicGFzc3BvcnQtbG9jYWxcIlxuLy8gbW9kdWxlIGlkID0gOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic2VxdWVsaXplXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwic2VxdWVsaXplXCJcbi8vIG1vZHVsZSBpZCA9IDk1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0ge1xuICByZXR1cm5TaG9ydElkOiBmdW5jdGlvbiAoY2xhaW1zQXJyYXksIGxvbmdJZCkge1xuICAgIGxldCBjbGFpbUluZGV4O1xuICAgIGxldCBzaG9ydElkID0gbG9uZ0lkLnN1YnN0cmluZygwLCAxKTsgLy8gZGVmYXVsdCBzaG9ydCBpZCBpcyB0aGUgZmlyc3QgbGV0dGVyXG4gICAgbGV0IHNob3J0SWRMZW5ndGggPSAwO1xuICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoaXMgY2xhaW0gaWRcbiAgICBjbGFpbUluZGV4ID0gY2xhaW1zQXJyYXkuZmluZEluZGV4KGVsZW1lbnQgPT4ge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuY2xhaW1JZCA9PT0gbG9uZ0lkO1xuICAgIH0pO1xuICAgIGlmIChjbGFpbUluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGFpbSBpZCBub3QgZm91bmQgaW4gY2xhaW1zIGxpc3QnKTtcbiAgICB9XG4gICAgLy8gZ2V0IGFuIGFycmF5IG9mIGFsbCBjbGFpbXMgd2l0aCBsb3dlciBoZWlnaHRcbiAgICBsZXQgcG9zc2libGVNYXRjaGVzID0gY2xhaW1zQXJyYXkuc2xpY2UoMCwgY2xhaW1JbmRleCk7XG4gICAgLy8gcmVtb3ZlIGNlcnRpZmljYXRlcyB3aXRoIHRoZSBzYW1lIHByZWZpeGVzIHVudGlsIG5vbmUgYXJlIGxlZnQuXG4gICAgd2hpbGUgKHBvc3NpYmxlTWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzaG9ydElkTGVuZ3RoICs9IDE7XG4gICAgICBzaG9ydElkID0gbG9uZ0lkLnN1YnN0cmluZygwLCBzaG9ydElkTGVuZ3RoKTtcbiAgICAgIHBvc3NpYmxlTWF0Y2hlcyA9IHBvc3NpYmxlTWF0Y2hlcy5maWx0ZXIoZWxlbWVudCA9PiB7XG4gICAgICAgIHJldHVybiAoZWxlbWVudC5jbGFpbUlkICYmIChlbGVtZW50LmNsYWltSWQuc3Vic3RyaW5nKDAsIHNob3J0SWRMZW5ndGgpID09PSBzaG9ydElkKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNob3J0SWQ7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvc2VxdWVsaXplSGVscGVycy5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcblxuY29uc3QgeyBkZXRhaWxzLCBwdWJsaXNoaW5nIH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2VQdWJsaXNoQXBpUmVxdWVzdEJvZHkgKHtuYW1lLCBuc2Z3LCBsaWNlbnNlLCB0aXRsZSwgZGVzY3JpcHRpb24sIHRodW1ibmFpbH0pIHtcbiAgICAvLyB2YWxpZGF0ZSBuYW1lXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIG5hbWUgZmllbGQgZm91bmQgaW4gcmVxdWVzdCcpO1xuICAgIH1cbiAgICBjb25zdCBpbnZhbGlkTmFtZUNoYXJhY3RlcnMgPSAvW15BLVphLXowLTksLV0vLmV4ZWMobmFtZSk7XG4gICAgaWYgKGludmFsaWROYW1lQ2hhcmFjdGVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2xhaW0gbmFtZSB5b3UgcHJvdmlkZWQgaXMgbm90IGFsbG93ZWQuICBPbmx5IHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgYWxsb3dlZDogQS1aLCBhLXosIDAtOSwgYW5kIFwiLVwiJyk7XG4gICAgfVxuICAgIC8vIG9wdGlvbmFsIHBhcmFtZXRlcnNcbiAgICBuc2Z3ID0gKG5zZncgPT09ICd0cnVlJyk7XG4gICAgbGljZW5zZSA9IGxpY2Vuc2UgfHwgbnVsbDtcbiAgICB0aXRsZSA9IHRpdGxlIHx8IG51bGw7XG4gICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiB8fCBudWxsO1xuICAgIHRodW1ibmFpbCA9IHRodW1ibmFpbCB8fCBudWxsO1xuICAgIC8vIHJldHVybiByZXN1bHRzXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICBuc2Z3LFxuICAgICAgbGljZW5zZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWwsXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VQdWJsaXNoQXBpUmVxdWVzdEZpbGVzICh7ZmlsZSwgdGh1bWJuYWlsfSkge1xuICAgIC8vIG1ha2Ugc3VyZSBhIGZpbGUgd2FzIHByb3ZpZGVkXG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZpbGUgd2l0aCBrZXkgb2YgW2ZpbGVdIGZvdW5kIGluIHJlcXVlc3QnKTtcbiAgICB9XG4gICAgaWYgKCFmaWxlLnBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZmlsZSBwYXRoIGZvdW5kJyk7XG4gICAgfVxuICAgIGlmICghZmlsZS50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZpbGUgdHlwZSBmb3VuZCcpO1xuICAgIH1cbiAgICBpZiAoIWZpbGUuc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmaWxlIHR5cGUgZm91bmQnKTtcbiAgICB9XG4gICAgLy8gdmFsaWRhdGUgdGhlIGZpbGUgbmFtZVxuICAgIGlmICgvJy8udGVzdChmaWxlLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Fwb3N0cm9waGVzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgZmlsZSBuYW1lJyk7XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHRoZSBmaWxlXG4gICAgbW9kdWxlLmV4cG9ydHMudmFsaWRhdGVGaWxlVHlwZUFuZFNpemUoZmlsZSk7XG4gICAgLy8gcmV0dXJuIHJlc3VsdHNcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZU5hbWUgICAgICAgICA6IGZpbGUubmFtZSxcbiAgICAgIGZpbGVQYXRoICAgICAgICAgOiBmaWxlLnBhdGgsXG4gICAgICBmaWxlVHlwZSAgICAgICAgIDogZmlsZS50eXBlLFxuICAgICAgdGh1bWJuYWlsRmlsZU5hbWU6ICh0aHVtYm5haWwgPyB0aHVtYm5haWwubmFtZSA6IG51bGwpLFxuICAgICAgdGh1bWJuYWlsRmlsZVBhdGg6ICh0aHVtYm5haWwgPyB0aHVtYm5haWwucGF0aCA6IG51bGwpLFxuICAgICAgdGh1bWJuYWlsRmlsZVR5cGU6ICh0aHVtYm5haWwgPyB0aHVtYm5haWwudHlwZSA6IG51bGwpLFxuICAgIH07XG4gIH0sXG4gIHZhbGlkYXRlRmlsZVR5cGVBbmRTaXplIChmaWxlKSB7XG4gICAgLy8gY2hlY2sgZmlsZSB0eXBlIGFuZCBzaXplXG4gICAgc3dpdGNoIChmaWxlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2ltYWdlL2pwZWcnOlxuICAgICAgY2FzZSAnaW1hZ2UvanBnJzpcbiAgICAgIGNhc2UgJ2ltYWdlL3BuZyc6XG4gICAgICAgIGlmIChmaWxlLnNpemUgPiAxMDAwMDAwMCkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygncHVibGlzaCA+IGZpbGUgdmFsaWRhdGlvbiA+IC5qcGVnLy5qcGcvLnBuZyB3YXMgdG9vIGJpZycpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29ycnksIGltYWdlcyBhcmUgbGltaXRlZCB0byAxMCBtZWdhYnl0ZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbWFnZS9naWYnOlxuICAgICAgICBpZiAoZmlsZS5zaXplID4gNTAwMDAwMDApIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ3B1Ymxpc2ggPiBmaWxlIHZhbGlkYXRpb24gPiAuZ2lmIHdhcyB0b28gYmlnJyk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3JyeSwgLmdpZnMgYXJlIGxpbWl0ZWQgdG8gNTAgbWVnYWJ5dGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmlkZW8vbXA0JzpcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IDUwMDAwMDAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdwdWJsaXNoID4gZmlsZSB2YWxpZGF0aW9uID4gLm1wNCB3YXMgdG9vIGJpZycpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29ycnksIHZpZGVvcyBhcmUgbGltaXRlZCB0byA1MCBtZWdhYnl0ZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2dnZXIuZGVidWcoJ3B1Ymxpc2ggPiBmaWxlIHZhbGlkYXRpb24gPiB1bnJlY29nbml6ZWQgZmlsZSB0eXBlJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlICcgKyBmaWxlLnR5cGUgKyAnIGNvbnRlbnQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiAgT25seSwgLmpwZWcsIC5wbmcsIC5naWYsIGFuZCAubXA0IGZpbGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZTtcbiAgfSxcbiAgY3JlYXRlQmFzaWNQdWJsaXNoUGFyYW1zIChmaWxlUGF0aCwgbmFtZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsaWNlbnNlLCBuc2Z3LCB0aHVtYm5haWwpIHtcbiAgICBsb2dnZXIuZGVidWcoYENyZWF0aW5nIFB1Ymxpc2ggUGFyYW1ldGVyc2ApO1xuICAgIC8vIHByb3ZpZGUgZGVmYXVsdHMgZm9yIHRpdGxlXG4gICAgaWYgKHRpdGxlID09PSBudWxsIHx8IHRpdGxlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRpdGxlID0gbmFtZTtcbiAgICB9XG4gICAgLy8gcHJvdmlkZSBkZWZhdWx0IGZvciBkZXNjcmlwdGlvblxuICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gbnVsbCB8fCBkZXNjcmlwdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIH1cbiAgICAvLyBwcm92aWRlIGRlZmF1bHQgZm9yIGxpY2Vuc2VcbiAgICBpZiAobGljZW5zZSA9PT0gbnVsbCB8fCBsaWNlbnNlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGxpY2Vuc2UgPSAnICc7ICAvLyBkZWZhdWx0IHRvIGVtcHR5IHN0cmluZ1xuICAgIH1cbiAgICAvLyBjcmVhdGUgdGhlIHB1Ymxpc2ggcGFyYW1zXG4gICAgY29uc3QgcHVibGlzaFBhcmFtcyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBmaWxlX3BhdGg6IGZpbGVQYXRoLFxuICAgICAgYmlkICAgICAgOiAwLjAxLFxuICAgICAgbWV0YWRhdGEgOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgYXV0aG9yICA6IGRldGFpbHMudGl0bGUsXG4gICAgICAgIGxhbmd1YWdlOiAnZW4nLFxuICAgICAgICBsaWNlbnNlLFxuICAgICAgICBuc2Z3LFxuICAgICAgfSxcbiAgICAgIGNsYWltX2FkZHJlc3M6IHB1Ymxpc2hpbmcucHJpbWFyeUNsYWltQWRkcmVzcyxcbiAgICB9O1xuICAgIC8vIGFkZCB0aHVtYm5haWwgdG8gY2hhbm5lbCBpZiB2aWRlb1xuICAgIGlmICh0aHVtYm5haWwpIHtcbiAgICAgIHB1Ymxpc2hQYXJhbXNbJ21ldGFkYXRhJ11bJ3RodW1ibmFpbCddID0gdGh1bWJuYWlsO1xuICAgIH1cbiAgICByZXR1cm4gcHVibGlzaFBhcmFtcztcbiAgfSxcbiAgY3JlYXRlVGh1bWJuYWlsUHVibGlzaFBhcmFtcyAodGh1bWJuYWlsRmlsZVBhdGgsIGNsYWltTmFtZSwgbGljZW5zZSwgbnNmdykge1xuICAgIGlmICghdGh1bWJuYWlsRmlsZVBhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBUaHVtYm5haWwgUHVibGlzaCBQYXJhbWV0ZXJzYCk7XG4gICAgLy8gY3JlYXRlIHRoZSBwdWJsaXNoIHBhcmFtc1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lICAgICA6IGAke2NsYWltTmFtZX0tdGh1bWJgLFxuICAgICAgZmlsZV9wYXRoOiB0aHVtYm5haWxGaWxlUGF0aCxcbiAgICAgIGJpZCAgICAgIDogMC4wMSxcbiAgICAgIG1ldGFkYXRhIDoge1xuICAgICAgICB0aXRsZSAgICAgIDogYCR7Y2xhaW1OYW1lfSB0aHVtYm5haWxgLFxuICAgICAgICBkZXNjcmlwdGlvbjogYGEgdGh1bWJuYWlsIGZvciAke2NsYWltTmFtZX1gLFxuICAgICAgICBhdXRob3IgICAgIDogZGV0YWlscy50aXRsZSxcbiAgICAgICAgbGFuZ3VhZ2UgICA6ICdlbicsXG4gICAgICAgIGxpY2Vuc2UsXG4gICAgICAgIG5zZncsXG4gICAgICB9LFxuICAgICAgY2xhaW1fYWRkcmVzczogcHVibGlzaGluZy5wcmltYXJ5Q2xhaW1BZGRyZXNzLFxuICAgICAgY2hhbm5lbF9uYW1lIDogcHVibGlzaGluZy50aHVtYm5haWxDaGFubmVsLFxuICAgICAgY2hhbm5lbF9pZCAgIDogcHVibGlzaGluZy50aHVtYm5haWxDaGFubmVsSWQsXG4gICAgfTtcbiAgfSxcbiAgZGVsZXRlVGVtcG9yYXJ5RmlsZSAoZmlsZVBhdGgpIHtcbiAgICBmcy51bmxpbmsoZmlsZVBhdGgsIGVyciA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgZXJyb3IgZGVsZXRpbmcgdGVtcG9yYXJ5IGZpbGUgJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmRlYnVnKGBzdWNjZXNzZnVsbHkgZGVsZXRlZCAke2ZpbGVQYXRofWApO1xuICAgIH0pO1xuICB9LFxuICBhZGRHZXRSZXN1bHRzVG9GaWxlRGF0YSAoZmlsZUluZm8sIGdldFJlc3VsdCkge1xuICAgIGZpbGVJbmZvLmZpbGVOYW1lID0gZ2V0UmVzdWx0LmZpbGVfbmFtZTtcbiAgICBmaWxlSW5mby5maWxlUGF0aCA9IGdldFJlc3VsdC5kb3dubG9hZF9wYXRoO1xuICAgIHJldHVybiBmaWxlSW5mbztcbiAgfSxcbiAgY3JlYXRlRmlsZURhdGEgKHsgbmFtZSwgY2xhaW1JZCwgb3V0cG9pbnQsIGhlaWdodCwgYWRkcmVzcywgbnNmdywgY29udGVudFR5cGUgfSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgY2xhaW1JZCxcbiAgICAgIG91dHBvaW50LFxuICAgICAgaGVpZ2h0LFxuICAgICAgYWRkcmVzcyxcbiAgICAgIGZpbGVOYW1lOiAnJyxcbiAgICAgIGZpbGVQYXRoOiAnJyxcbiAgICAgIGZpbGVUeXBlOiBjb250ZW50VHlwZSxcbiAgICAgIG5zZncsXG4gICAgfTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9wdWJsaXNoSGVscGVycy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiZnNcIlxuLy8gbW9kdWxlIGlkID0gOThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaGFuZGxlRXJyb3JSZXNwb25zZTogZnVuY3Rpb24gKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcykge1xuICAgIGxvZ2dlci5lcnJvcihgRXJyb3Igb24gJHtvcmlnaW5hbFVybH1gLCBtb2R1bGUuZXhwb3J0cy51c2VPYmplY3RQcm9wZXJ0aWVzSWZOb0tleXMoZXJyb3IpKTtcbiAgICBjb25zdCBbc3RhdHVzLCBtZXNzYWdlXSA9IG1vZHVsZS5leHBvcnRzLnJldHVybkVycm9yTWVzc2FnZUFuZFN0YXR1cyhlcnJvcik7XG4gICAgcmVzXG4gICAgICAuc3RhdHVzKHN0YXR1cylcbiAgICAgIC5qc29uKG1vZHVsZS5leHBvcnRzLmNyZWF0ZUVycm9yUmVzcG9uc2VQYXlsb2FkKHN0YXR1cywgbWVzc2FnZSkpO1xuICB9LFxuICByZXR1cm5FcnJvck1lc3NhZ2VBbmRTdGF0dXM6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGxldCBzdGF0dXMsIG1lc3NhZ2U7XG4gICAgLy8gY2hlY2sgZm9yIGRhZW1vbiBiZWluZyB0dXJuZWQgb2ZmXG4gICAgaWYgKGVycm9yLmNvZGUgPT09ICdFQ09OTlJFRlVTRUQnKSB7XG4gICAgICBzdGF0dXMgPSA1MDM7XG4gICAgICBtZXNzYWdlID0gJ0Nvbm5lY3Rpb24gcmVmdXNlZC4gIFRoZSBkYWVtb24gbWF5IG5vdCBiZSBydW5uaW5nLic7XG4gICAgICAvLyBmYWxsYmFjayBmb3IgZXZlcnl0aGluZyBlbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cyA9IDQwMDtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVzc2FnZSA9IGVycm9yO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBbc3RhdHVzLCBtZXNzYWdlXTtcbiAgfSxcbiAgdXNlT2JqZWN0UHJvcGVydGllc0lmTm9LZXlzOiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGVycikubGVuZ3RoID09PSAwKSB7XG4gICAgICBsZXQgbmV3RXJyb3JPYmplY3QgPSB7fTtcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycikuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIG5ld0Vycm9yT2JqZWN0W2tleV0gPSBlcnJba2V5XTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ld0Vycm9yT2JqZWN0O1xuICAgIH1cbiAgICByZXR1cm4gZXJyO1xuICB9LFxuICBjcmVhdGVFcnJvclJlc3BvbnNlUGF5bG9hZCAoc3RhdHVzLCBtZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgbWVzc2FnZSxcbiAgICB9O1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2Vycm9ySGFuZGxlcnMuanMiLCJjb25zdCBkYiA9IHJlcXVpcmUoJy4uL21vZGVscy9pbmRleCcpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyByZXR1cm5QYWdpbmF0ZWRDaGFubmVsQ2xhaW1zIH0gPSByZXF1aXJlKCcuLi9oZWxwZXJzL2NoYW5uZWxQYWdpbmF0aW9uLmpzJyk7XG5cbmNvbnN0IE5PX0NIQU5ORUwgPSAnTk9fQ0hBTk5FTCc7XG5jb25zdCBOT19DTEFJTSA9ICdOT19DTEFJTSc7XG5jb25zdCBOT19GSUxFID0gJ05PX0ZJTEUnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q2xhaW1JZCAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBuYW1lLCBjbGFpbUlkKSB7XG4gICAgaWYgKGNoYW5uZWxOYW1lKSB7XG4gICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHMuZ2V0Q2xhaW1JZEJ5Q2hhbm5lbChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHMuZ2V0Q2xhaW1JZEJ5Q2xhaW0obmFtZSwgY2xhaW1JZCk7XG4gICAgfVxuICB9LFxuICBnZXRDbGFpbUlkQnlDbGFpbSAoY2xhaW1OYW1lLCBjbGFpbUlkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRDbGFpbUlkQnlDbGFpbSgke2NsYWltTmFtZX0sICR7Y2xhaW1JZH0pYCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRiLkNsYWltLmdldExvbmdDbGFpbUlkKGNsYWltTmFtZSwgY2xhaW1JZClcbiAgICAgICAgLnRoZW4obG9uZ0NsYWltSWQgPT4ge1xuICAgICAgICAgIGlmICghbG9uZ0NsYWltSWQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoTk9fQ0xBSU0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGxvbmdDbGFpbUlkKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Q2xhaW1JZEJ5Q2hhbm5lbCAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbU5hbWUpIHtcbiAgICBsb2dnZXIuZGVidWcoYGdldENsYWltSWRCeUNoYW5uZWwoJHtjaGFubmVsTmFtZX0sICR7Y2hhbm5lbENsYWltSWR9LCAke2NsYWltTmFtZX0pYCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRiLkNlcnRpZmljYXRlLmdldExvbmdDaGFubmVsSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKSAvLyAxLiBnZXQgdGhlIGxvbmcgY2hhbm5lbCBpZFxuICAgICAgICAudGhlbihsb25nQ2hhbm5lbElkID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbG9uZ0NoYW5uZWxJZCwgZGIuQ2xhaW0uZ2V0Q2xhaW1JZEJ5TG9uZ0NoYW5uZWxJZChsb25nQ2hhbm5lbElkLCBjbGFpbU5hbWUpXSk7ICAvLyAyLiBnZXQgdGhlIGxvbmcgY2xhaW0gaWRcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtsb25nQ2hhbm5lbElkLCBsb25nQ2xhaW1JZF0pID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsSWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKE5PX0NIQU5ORUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWxvbmdDbGFpbUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShOT19DTEFJTSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUobG9uZ0NsYWltSWQpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRDaGFubmVsRGF0YSAoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBwYWdlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIDEuIGdldCB0aGUgbG9uZyBjaGFubmVsIElkIChtYWtlIHN1cmUgY2hhbm5lbCBleGlzdHMpXG4gICAgICBkYi5DZXJ0aWZpY2F0ZS5nZXRMb25nQ2hhbm5lbElkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZClcbiAgICAgICAgLnRoZW4obG9uZ0NoYW5uZWxDbGFpbUlkID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsQ2xhaW1JZCkge1xuICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsLCBudWxsXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gMi4gZ2V0IHRoZSBzaG9ydCBJRCBhbmQgYWxsIGNsYWltcyBmb3IgdGhhdCBjaGFubmVsXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtsb25nQ2hhbm5lbENsYWltSWQsIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQobG9uZ0NoYW5uZWxDbGFpbUlkLCBjaGFubmVsTmFtZSldKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtsb25nQ2hhbm5lbENsYWltSWQsIHNob3J0Q2hhbm5lbENsYWltSWRdKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbENsYWltSWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKE5PX0NIQU5ORUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyAzLiByZXR1cm4gYWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uXG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBjaGFubmVsTmFtZSxcbiAgICAgICAgICAgIGxvbmdDaGFubmVsQ2xhaW1JZCxcbiAgICAgICAgICAgIHNob3J0Q2hhbm5lbENsYWltSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldENoYW5uZWxDbGFpbXMgKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgcGFnZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyAxLiBnZXQgdGhlIGxvbmcgY2hhbm5lbCBJZCAobWFrZSBzdXJlIGNoYW5uZWwgZXhpc3RzKVxuICAgICAgZGIuQ2VydGlmaWNhdGUuZ2V0TG9uZ0NoYW5uZWxJZChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpXG4gICAgICAgIC50aGVuKGxvbmdDaGFubmVsQ2xhaW1JZCA9PiB7XG4gICAgICAgICAgaWYgKCFsb25nQ2hhbm5lbENsYWltSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIDIuIGdldCB0aGUgc2hvcnQgSUQgYW5kIGFsbCBjbGFpbXMgZm9yIHRoYXQgY2hhbm5lbFxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbG9uZ0NoYW5uZWxDbGFpbUlkLCBkYi5DbGFpbS5nZXRBbGxDaGFubmVsQ2xhaW1zKGxvbmdDaGFubmVsQ2xhaW1JZCldKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKFtsb25nQ2hhbm5lbENsYWltSWQsIGNoYW5uZWxDbGFpbXNBcnJheV0pID0+IHtcbiAgICAgICAgICBpZiAoIWxvbmdDaGFubmVsQ2xhaW1JZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoTk9fQ0hBTk5FTCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIDMuIGZvcm1hdCB0aGUgZGF0YSBmb3IgdGhlIHZpZXcsIGluY2x1ZGluZyBwYWdpbmF0aW9uXG4gICAgICAgICAgbGV0IHBhZ2luYXRlZENoYW5uZWxWaWV3RGF0YSA9IHJldHVyblBhZ2luYXRlZENoYW5uZWxDbGFpbXMoY2hhbm5lbE5hbWUsIGxvbmdDaGFubmVsQ2xhaW1JZCwgY2hhbm5lbENsYWltc0FycmF5LCBwYWdlKTtcbiAgICAgICAgICAvLyA0LiByZXR1cm4gYWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIGFuZCBjb250ZW50c1xuICAgICAgICAgIHJlc29sdmUocGFnaW5hdGVkQ2hhbm5lbFZpZXdEYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0TG9jYWxGaWxlUmVjb3JkIChjbGFpbUlkLCBuYW1lKSB7XG4gICAgcmV0dXJuIGRiLkZpbGUuZmluZE9uZSh7d2hlcmU6IHtjbGFpbUlkLCBuYW1lfX0pXG4gICAgICAudGhlbihmaWxlID0+IHtcbiAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgcmV0dXJuIE5PX0ZJTEU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGUuZGF0YVZhbHVlcztcbiAgICAgIH0pO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9jb250cm9sbGVycy9zZXJ2ZUNvbnRyb2xsZXIuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyVG9TdHJpbmcgfSBmcm9tICdyZWFjdC1kb20vc2VydmVyJztcbmltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IFJlZHVjZXIgZnJvbSAnY2xpZW50L3JlZHVjZXJzJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgU3RhdGljUm91dGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgR0FMaXN0ZW5lciBmcm9tICdjbGllbnQvY29tcG9uZW50cy9HQUxpc3RlbmVyLyc7XG5pbXBvcnQgQXBwIGZyb20gJ2NsaWVudC9hcHAnO1xuaW1wb3J0IHJlbmRlckZ1bGxQYWdlIGZyb20gJy4vcmVuZGVyRnVsbFBhZ2UuanMnO1xuaW1wb3J0IEhlbG1ldCBmcm9tICdyZWFjdC1oZWxtZXQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChyZXEsIHJlcykgPT4ge1xuICBsZXQgY29udGV4dCA9IHt9O1xuXG4gIC8vIGNyZWF0ZSBhIG5ldyBSZWR1eCBzdG9yZSBpbnN0YW5jZVxuICBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlKFJlZHVjZXIpO1xuXG4gIC8vIHJlbmRlciBjb21wb25lbnQgdG8gYSBzdHJpbmdcbiAgY29uc3QgaHRtbCA9IHJlbmRlclRvU3RyaW5nKFxuICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxuICAgICAgPFN0YXRpY1JvdXRlciBsb2NhdGlvbj17cmVxLnVybH0gY29udGV4dD17Y29udGV4dH0+XG4gICAgICAgIDxHQUxpc3RlbmVyPlxuICAgICAgICAgIDxBcHAgLz5cbiAgICAgICAgPC9HQUxpc3RlbmVyPlxuICAgICAgPC9TdGF0aWNSb3V0ZXI+XG4gICAgPC9Qcm92aWRlcj5cbiAgKTtcblxuICAvLyBnZXQgaGVhZCB0YWdzIGZyb20gaGVsbWV0XG4gIGNvbnN0IGhlbG1ldCA9IEhlbG1ldC5yZW5kZXJTdGF0aWMoKTtcblxuICAvLyBjaGVjayBmb3IgYSByZWRpcmVjdFxuICBpZiAoY29udGV4dC51cmwpIHtcbiAgICAvLyBTb21ld2hlcmUgYSBgPFJlZGlyZWN0PmAgd2FzIHJlbmRlcmVkXG4gICAgcmV0dXJuIHJlcy5yZWRpcmVjdCgzMDEsIGNvbnRleHQudXJsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3ZSdyZSBnb29kLCBzZW5kIHRoZSByZXNwb25zZVxuICB9XG5cbiAgLy8gZ2V0IHRoZSBpbml0aWFsIHN0YXRlIGZyb20gb3VyIFJlZHV4IHN0b3JlXG4gIGNvbnN0IHByZWxvYWRlZFN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcblxuICAvLyBzZW5kIHRoZSByZW5kZXJlZCBwYWdlIGJhY2sgdG8gdGhlIGNsaWVudFxuICByZXMuc2VuZChyZW5kZXJGdWxsUGFnZShoZWxtZXQsIGh0bWwsIHByZWxvYWRlZFN0YXRlKSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvaGFuZGxlUGFnZVJlbmRlci5qc3giLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1kb20vc2VydmVyXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicmVhY3QtZG9tL3NlcnZlclwiXG4vLyBtb2R1bGUgaWQgPSAxMDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IFB1Ymxpc2hSZWR1Y2VyIGZyb20gJ3JlZHVjZXJzL3B1Ymxpc2gnO1xuaW1wb3J0IENoYW5uZWxSZWR1Y2VyIGZyb20gJ3JlZHVjZXJzL2NoYW5uZWwnO1xuaW1wb3J0IFNob3dSZWR1Y2VyIGZyb20gJ3JlZHVjZXJzL3Nob3cnO1xuaW1wb3J0IFNpdGVSZWR1Y2VyIGZyb20gJ3JlZHVjZXJzL3NpdGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjb21iaW5lUmVkdWNlcnMoe1xuICBjaGFubmVsOiBDaGFubmVsUmVkdWNlcixcbiAgcHVibGlzaDogUHVibGlzaFJlZHVjZXIsXG4gIHNob3cgICA6IFNob3dSZWR1Y2VyLFxuICBzaXRlICAgOiBTaXRlUmVkdWNlcixcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3JlZHVjZXJzL2luZGV4LmpzIiwiZXhwb3J0IGNvbnN0IEZJTEVfU0VMRUNURUQgPSAnRklMRV9TRUxFQ1RFRCc7XG5leHBvcnQgY29uc3QgRklMRV9DTEVBUiA9ICdGSUxFX0NMRUFSJztcbmV4cG9ydCBjb25zdCBNRVRBREFUQV9VUERBVEUgPSAnTUVUQURBVEFfVVBEQVRFJztcbmV4cG9ydCBjb25zdCBDTEFJTV9VUERBVEUgPSAnQ0xBSU1fVVBEQVRFJztcbmV4cG9ydCBjb25zdCBTRVRfUFVCTElTSF9JTl9DSEFOTkVMID0gJ1NFVF9QVUJMSVNIX0lOX0NIQU5ORUwnO1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hfU1RBVFVTX1VQREFURSA9ICdQVUJMSVNIX1NUQVRVU19VUERBVEUnO1xuZXhwb3J0IGNvbnN0IEVSUk9SX1VQREFURSA9ICdFUlJPUl9VUERBVEUnO1xuZXhwb3J0IGNvbnN0IFNFTEVDVEVEX0NIQU5ORUxfVVBEQVRFID0gJ1NFTEVDVEVEX0NIQU5ORUxfVVBEQVRFJztcbmV4cG9ydCBjb25zdCBUT0dHTEVfTUVUQURBVEFfSU5QVVRTID0gJ1RPR0dMRV9NRVRBREFUQV9JTlBVVFMnO1xuZXhwb3J0IGNvbnN0IFRIVU1CTkFJTF9ORVcgPSAnVEhVTUJOQUlMX05FVyc7XG5leHBvcnQgY29uc3QgUFVCTElTSF9TVEFSVCA9ICdQVUJMSVNIX1NUQVJUJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9jb25zdGFudHMvcHVibGlzaF9hY3Rpb25fdHlwZXMuanMiLCJleHBvcnQgY29uc3QgTE9HSU4gPSAnRXhpc3RpbmcnO1xuZXhwb3J0IGNvbnN0IENSRUFURSA9ICdOZXcnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnN0YW50cy9wdWJsaXNoX2NoYW5uZWxfc2VsZWN0X3N0YXRlcy5qcyIsImV4cG9ydCBjb25zdCBDSEFOTkVMX1VQREFURSA9ICdDSEFOTkVMX1VQREFURSc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29uc3RhbnRzL2NoYW5uZWxfYWN0aW9uX3R5cGVzLmpzIiwiZXhwb3J0IGNvbnN0IExPQ0FMX0NIRUNLID0gJ0xPQ0FMX0NIRUNLJztcbmV4cG9ydCBjb25zdCBVTkFWQUlMQUJMRSA9ICdVTkFWQUlMQUJMRSc7XG5leHBvcnQgY29uc3QgRVJST1IgPSAnRVJST1InO1xuZXhwb3J0IGNvbnN0IEFWQUlMQUJMRSA9ICdBVkFJTEFCTEUnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnN0YW50cy9hc3NldF9kaXNwbGF5X3N0YXRlcy5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSb3V0ZSwgU3dpdGNoIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSc7XG5pbXBvcnQgeyBkeW5hbWljSW1wb3J0IH0gZnJvbSAndXRpbHMvZHluYW1pY0ltcG9ydCc7XG5pbXBvcnQgQWJvdXRQYWdlIGZyb20gJ3BhZ2VzL0Fib3V0UGFnZSc7XG5pbXBvcnQgTG9naW5QYWdlIGZyb20gJ3BhZ2VzL0xvZ2luUGFnZSc7XG5pbXBvcnQgU2hvd1BhZ2UgZnJvbSAncGFnZXMvU2hvd1BhZ2UnO1xuaW1wb3J0IEZvdXJPaEZvdXJQYWdlIGZyb20gJ2NvbnRhaW5lcnMvRm91ck9oRm91clBhZ2UnO1xuY29uc3QgSG9tZVBhZ2UgPSBkeW5hbWljSW1wb3J0KCdwYWdlcy9Ib21lUGFnZScpOyAvLyBvciB1c2UgdGhlIHByb3ZpZGVkIGxvY2FsIGhvbWVwYWdlXG5cbmNvbnN0IEFwcCA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8U3dpdGNoPlxuICAgICAgPFJvdXRlIGV4YWN0IHBhdGg9Jy8nIGNvbXBvbmVudD17SG9tZVBhZ2V9IC8+XG4gICAgICA8Um91dGUgZXhhY3QgcGF0aD0nL2Fib3V0JyBjb21wb25lbnQ9e0Fib3V0UGFnZX0gLz5cbiAgICAgIDxSb3V0ZSBleGFjdCBwYXRoPScvbG9naW4nIGNvbXBvbmVudD17TG9naW5QYWdlfSAvPlxuICAgICAgPFJvdXRlIGV4YWN0IHBhdGg9Jy86aWRlbnRpZmllci86Y2xhaW0nIGNvbXBvbmVudD17U2hvd1BhZ2V9IC8+XG4gICAgICA8Um91dGUgZXhhY3QgcGF0aD0nLzpjbGFpbScgY29tcG9uZW50PXtTaG93UGFnZX0gLz5cbiAgICAgIDxSb3V0ZSBjb21wb25lbnQ9e0ZvdXJPaEZvdXJQYWdlfSAvPlxuICAgIDwvU3dpdGNoPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXBwO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2FwcC5qcyIsInZhciBtYXAgPSB7XG5cdFwiLi9jYW5vbmljYWxMaW5rXCI6IDU5LFxuXHRcIi4vY2Fub25pY2FsTGluay5qc1wiOiA1OSxcblx0XCIuL2R5bmFtaWNJbXBvcnRcIjogNTgsXG5cdFwiLi9keW5hbWljSW1wb3J0LmpzXCI6IDU4LFxuXHRcIi4vZmlsZVwiOiA2MCxcblx0XCIuL2ZpbGUuanNcIjogNjAsXG5cdFwiLi9sYnJ5VXJpXCI6IDYxLFxuXHRcIi4vbGJyeVVyaS5qc1wiOiA2MSxcblx0XCIuL21ldGFUYWdzXCI6IDYyLFxuXHRcIi4vbWV0YVRhZ3MuanNcIjogNjIsXG5cdFwiLi9wYWdlVGl0bGVcIjogNjMsXG5cdFwiLi9wYWdlVGl0bGUuanNcIjogNjMsXG5cdFwiLi9wdWJsaXNoXCI6IDExMCxcblx0XCIuL3B1Ymxpc2guanNcIjogMTEwLFxuXHRcIi4vcmVxdWVzdFwiOiA4LFxuXHRcIi4vcmVxdWVzdC5qc1wiOiA4LFxuXHRcIi4vdmFsaWRhdGVcIjogMTExLFxuXHRcIi4vdmFsaWRhdGUuanNcIjogMTExXG59O1xuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpKTtcbn07XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdHZhciBpZCA9IG1hcFtyZXFdO1xuXHRpZighKGlkICsgMSkpIC8vIGNoZWNrIGZvciBudW1iZXIgb3Igc3RyaW5nXG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJy5cIik7XG5cdHJldHVybiBpZDtcbn07XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gMTA5O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vY2xpZW50L3V0aWxzIF4uKiRcbi8vIG1vZHVsZSBpZCA9IDEwOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnQgY29uc3QgY3JlYXRlUHVibGlzaE1ldGFkYXRhID0gKGNsYWltLCB7IHR5cGUgfSwgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGxpY2Vuc2UsIG5zZncgfSwgcHVibGlzaEluQ2hhbm5lbCwgc2VsZWN0ZWRDaGFubmVsKSA9PiB7XG4gIGxldCBtZXRhZGF0YSA9IHtcbiAgICBuYW1lOiBjbGFpbSxcbiAgICB0aXRsZSxcbiAgICBkZXNjcmlwdGlvbixcbiAgICBsaWNlbnNlLFxuICAgIG5zZncsXG4gICAgdHlwZSxcbiAgfTtcbiAgaWYgKHB1Ymxpc2hJbkNoYW5uZWwpIHtcbiAgICBtZXRhZGF0YVsnY2hhbm5lbE5hbWUnXSA9IHNlbGVjdGVkQ2hhbm5lbDtcbiAgfVxuICByZXR1cm4gbWV0YWRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUHVibGlzaEZvcm1EYXRhID0gKGZpbGUsIHRodW1ibmFpbCwgbWV0YWRhdGEpID0+IHtcbiAgbGV0IGZkID0gbmV3IEZvcm1EYXRhKCk7XG4gIC8vIGFwcGVuZCBmaWxlXG4gIGZkLmFwcGVuZCgnZmlsZScsIGZpbGUpO1xuICAvLyBhcHBlbmQgdGh1bWJuYWlsXG4gIGlmICh0aHVtYm5haWwpIHtcbiAgICBmZC5hcHBlbmQoJ3RodW1ibmFpbCcsIHRodW1ibmFpbCk7XG4gIH1cbiAgLy8gYXBwZW5kIG1ldGFkYXRhXG4gIGZvciAobGV0IGtleSBpbiBtZXRhZGF0YSkge1xuICAgIGlmIChtZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBmZC5hcHBlbmQoa2V5LCBtZXRhZGF0YVtrZXldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZkO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRodW1ibmFpbFVybCA9IChjaGFubmVsLCBjaGFubmVsSWQsIGNsYWltLCBob3N0KSA9PiB7XG4gIHJldHVybiBgJHtob3N0fS8ke2NoYW5uZWx9OiR7Y2hhbm5lbElkfS8ke2NsYWltfS10aHVtYi5wbmdgO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC91dGlscy9wdWJsaXNoLmpzIiwiZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2hhbm5lbFNlbGVjdGlvbiA9IChwdWJsaXNoSW5DaGFubmVsLCBzZWxlY3RlZENoYW5uZWwsIGxvZ2dlZEluQ2hhbm5lbCkgPT4ge1xuICBpZiAocHVibGlzaEluQ2hhbm5lbCAmJiAoc2VsZWN0ZWRDaGFubmVsICE9PSBsb2dnZWRJbkNoYW5uZWwubmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvZyBpbiB0byBhIGNoYW5uZWwgb3Igc2VsZWN0IEFub255bW91cycpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVQdWJsaXNoUGFyYW1zID0gKGZpbGUsIGNsYWltLCB1cmxFcnJvcikgPT4ge1xuICBpZiAoIWZpbGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7XG4gIH1cbiAgaWYgKCFjbGFpbSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIGVudGVyIGEgVVJMJyk7XG4gIH1cbiAgaWYgKHVybEVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaXggdGhlIHVybCcpO1xuICB9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3V0aWxzL3ZhbGlkYXRlLmpzIiwiZXhwb3J0IGNvbnN0IENIQU5ORUwgPSAnQ0hBTk5FTCc7XG5leHBvcnQgY29uc3QgQVNTRVRfTElURSA9ICdBU1NFVF9MSVRFJztcbmV4cG9ydCBjb25zdCBBU1NFVF9ERVRBSUxTID0gJ0FTU0VUX0RFVEFJTFMnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2NvbnN0YW50cy9zaG93X3JlcXVlc3RfdHlwZXMuanMiLCJtb2R1bGUuZXhwb3J0cyA9IChoZWxtZXQsIGh0bWwsIHByZWxvYWRlZFN0YXRlKSA9PiB7XG4gIC8vIHRha2UgdGhlIGh0bWwgYW5kIHByZWxvYWRlZFN0YXRlIGFuZCByZXR1cm4gdGhlIGZ1bGwgcGFnZVxuICByZXR1cm4gYFxuICAgIDwhRE9DVFlQRSBodG1sPlxuICAgIDxodG1sIGxhbmc9XCJlblwiIHByZWZpeD1cIm9nOiBodHRwOi8vb2dwLm1lL25zIyBmYjogaHR0cDovL29ncC5tZS9ucy9mYiNcIj5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICAgICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEsIHVzZXItc2NhbGFibGU9bm9cIj5cbiAgICAgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9XCJYLVVBLUNvbXBhdGlibGVcIiBjb250ZW50PVwiaWU9ZWRnZVwiPlxuICAgICAgICAgICAgPCEtLWhlbG1ldC0tPlxuICAgICAgICAgICAgJHtoZWxtZXQudGl0bGUudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICR7aGVsbWV0Lm1ldGEudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICR7aGVsbWV0LmxpbmsudG9TdHJpbmcoKX1cbiAgICAgICAgICAgIDwhLS1zdHlsZSBzaGVldHMtLT5cbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiL2Fzc2V0cy9jc3MvcmVzZXQuY3NzXCIgdHlwZT1cInRleHQvY3NzXCI+XG4gICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi9hc3NldHMvY3NzL2dlbmVyYWwuY3NzXCIgdHlwZT1cInRleHQvY3NzXCI+XG4gICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi9hc3NldHMvY3NzL21lZGlhUXVlcmllcy5jc3NcIiB0eXBlPVwidGV4dC9jc3NcIj5cbiAgICAgICAgICAgIDwhLS1nb29nbGUgZm9udC0tPlxuICAgICAgICAgICAgPGxpbmsgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86MzAwXCIgcmVsPVwic3R5bGVzaGVldFwiPlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5IGlkPVwibWFpbi1ib2R5XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInJlYWN0LWFwcFwiIGNsYXNzPVwicm93IHJvdy0tdGFsbCBmbGV4LWNvbnRhaW5lci0tY29sdW1uXCI+JHtodG1sfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICAgICAgIHdpbmRvdy5fX1BSRUxPQURFRF9TVEFURV9fID0gJHtKU09OLnN0cmluZ2lmeShwcmVsb2FkZWRTdGF0ZSkucmVwbGFjZSgvPC9nLCAnXFxcXFxcdTAwM2MnKX1cbiAgICAgICAgICAgIDwvc2NyaXB0PlxuICAgICAgICAgICAgPHNjcmlwdCBzcmM9XCIvYnVuZGxlL2J1bmRsZS5qc1wiPjwvc2NyaXB0PlxuICAgICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICBgO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL3JlbmRlckZ1bGxQYWdlLmpzIiwiZXhwb3J0IGNvbnN0IHNlbGVjdFNpdGVTdGF0ZSA9IChzdGF0ZSkgPT4ge1xuICByZXR1cm4gc3RhdGUuc2l0ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RTaXRlSG9zdCA9IChzdGF0ZSkgPT4ge1xuICByZXR1cm4gc3RhdGUuc2l0ZS5ob3N0O1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9zZWxlY3RvcnMvc2l0ZS5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJhYmVsLXBvbHlmaWxsXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiYmFiZWwtcG9seWZpbGxcIlxuLy8gbW9kdWxlIGlkID0gMTE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndoYXR3Zy1mZXRjaFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIndoYXR3Zy1mZXRjaFwiXG4vLyBtb2R1bGUgaWQgPSAxMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgU2VydmVyID0gcmVxdWlyZSgnLi9zZXJ2ZXIvc2VydmVyLmpzJyk7XG5jb25zdCBDb21wb25lbnRzID0gcmVxdWlyZSgnLi9jbGllbnQvY29tcG9uZW50cycpO1xuY29uc3QgQ29udGFpbmVycyA9IHJlcXVpcmUoJy4vY2xpZW50L2NvbnRhaW5lcnMnKTtcbmNvbnN0IFBhZ2VzID0gcmVxdWlyZSgnLi9jbGllbnQvcGFnZXMnKTtcblxuY29uc3QgZXhwb3J0cyA9IHtcbiAgU2VydmVyLFxuICBDb21wb25lbnRzLFxuICBDb250YWluZXJzLFxuICBQYWdlcyxcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NwZWVjaC5qcyIsIi8vIGFwcCBkZXBlbmRlbmNpZXNcbmNvbnN0IGV4cHJlc3MgPSByZXF1aXJlKCdleHByZXNzJyk7XG5jb25zdCBib2R5UGFyc2VyID0gcmVxdWlyZSgnYm9keS1wYXJzZXInKTtcbmNvbnN0IGV4cHJlc3NIYW5kbGViYXJzID0gcmVxdWlyZSgnZXhwcmVzcy1oYW5kbGViYXJzJyk7XG5jb25zdCBIYW5kbGViYXJzID0gcmVxdWlyZSgnaGFuZGxlYmFycycpO1xuY29uc3QgaGVsbWV0ID0gcmVxdWlyZSgnaGVsbWV0Jyk7XG5jb25zdCBwYXNzcG9ydCA9IHJlcXVpcmUoJ3Bhc3Nwb3J0Jyk7XG5jb25zdCB7IHNlcmlhbGl6ZVNwZWVjaFVzZXIsIGRlc2VyaWFsaXplU3BlZWNoVXNlciB9ID0gcmVxdWlyZSgnLi9oZWxwZXJzL2F1dGhIZWxwZXJzLmpzJyk7XG5jb25zdCBjb29raWVTZXNzaW9uID0gcmVxdWlyZSgnY29va2llLXNlc3Npb24nKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG4vLyBsb2dnaW5nIGRlcGVuZGVuY2llc1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuXG5mdW5jdGlvbiBTZXJ2ZXIgKCkge1xuICB0aGlzLmNvbmZpZ3VyZU15c3FsID0gKG15c3FsQ29uZmlnKSA9PiB7XG4gICAgcmVxdWlyZSgnLi4vY29uZmlnL215c3FsQ29uZmlnLmpzJykuY29uZmlndXJlKG15c3FsQ29uZmlnKTtcbiAgfTtcbiAgdGhpcy5jb25maWd1cmVTaXRlID0gKHNpdGVDb25maWcpID0+IHtcbiAgICByZXF1aXJlKCcuLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpLmNvbmZpZ3VyZShzaXRlQ29uZmlnKTtcbiAgICB0aGlzLnNlc3Npb25LZXkgPSBzaXRlQ29uZmlnLmF1dGguc2Vzc2lvbktleTtcbiAgICB0aGlzLlBPUlQgPSBzaXRlQ29uZmlnLmRldGFpbHMucG9ydDtcbiAgfTtcbiAgdGhpcy5jb25maWd1cmVTbGFjayA9IChzbGFja0NvbmZpZykgPT4ge1xuICAgIHJlcXVpcmUoJy4uL2NvbmZpZy9zbGFja0NvbmZpZy5qcycpLmNvbmZpZ3VyZShzbGFja0NvbmZpZyk7XG4gIH07XG4gIHRoaXMuY3JlYXRlQXBwID0gKCkgPT4ge1xuICAgIC8vIGNyZWF0ZSBhbiBFeHByZXNzIGFwcGxpY2F0aW9uXG4gICAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4gICAgLy8gdHJ1c3QgdGhlIHByb3h5IHRvIGdldCBpcCBhZGRyZXNzIGZvciB1c1xuICAgIGFwcC5lbmFibGUoJ3RydXN0IHByb3h5Jyk7XG5cbiAgICAvLyBhZGQgbWlkZGxld2FyZVxuICAgIGFwcC51c2UoaGVsbWV0KCkpOyAvLyBzZXQgSFRUUCBoZWFkZXJzIHRvIHByb3RlY3QgYWdhaW5zdCB3ZWxsLWtub3duIHdlYiB2dWxuZXJhYmlsdGllc1xuICAgIGFwcC51c2UoZXhwcmVzcy5zdGF0aWMoYCR7X19kaXJuYW1lfS9wdWJsaWNgKSk7IC8vICdleHByZXNzLnN0YXRpYycgdG8gc2VydmUgc3RhdGljIGZpbGVzIGZyb20gcHVibGljIGRpcmVjdG9yeVxuICAgIGFwcC51c2UoYm9keVBhcnNlci5qc29uKCkpOyAvLyAnYm9keSBwYXJzZXInIGZvciBwYXJzaW5nIGFwcGxpY2F0aW9uL2pzb25cbiAgICBhcHAudXNlKGJvZHlQYXJzZXIudXJsZW5jb2RlZCh7IGV4dGVuZGVkOiB0cnVlIH0pKTsgLy8gJ2JvZHkgcGFyc2VyJyBmb3IgcGFyc2luZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcbiAgICBhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4geyAgLy8gY3VzdG9tIGxvZ2dpbmcgbWlkZGxld2FyZSB0byBsb2cgYWxsIGluY29taW5nIGh0dHAgcmVxdWVzdHNcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXF1ZXN0IG9uICR7cmVxLm9yaWdpbmFsVXJsfSBmcm9tICR7cmVxLmlwfWApO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuXG4gICAgLy8gY29uZmlndXJlIHBhc3Nwb3J0XG4gICAgcGFzc3BvcnQuc2VyaWFsaXplVXNlcihzZXJpYWxpemVTcGVlY2hVc2VyKTtcbiAgICBwYXNzcG9ydC5kZXNlcmlhbGl6ZVVzZXIoZGVzZXJpYWxpemVTcGVlY2hVc2VyKTtcbiAgICBjb25zdCBsb2NhbFNpZ251cFN0cmF0ZWd5ID0gcmVxdWlyZSgnLi9wYXNzcG9ydC9sb2NhbC1zaWdudXAuanMnKTtcbiAgICBjb25zdCBsb2NhbExvZ2luU3RyYXRlZ3kgPSByZXF1aXJlKCcuL3Bhc3Nwb3J0L2xvY2FsLWxvZ2luLmpzJyk7XG4gICAgcGFzc3BvcnQudXNlKCdsb2NhbC1zaWdudXAnLCBsb2NhbFNpZ251cFN0cmF0ZWd5KTtcbiAgICBwYXNzcG9ydC51c2UoJ2xvY2FsLWxvZ2luJywgbG9jYWxMb2dpblN0cmF0ZWd5KTtcbiAgICAvLyBpbml0aWFsaXplIHBhc3Nwb3J0XG4gICAgYXBwLnVzZShjb29raWVTZXNzaW9uKHtcbiAgICAgIG5hbWUgIDogJ3Nlc3Npb24nLFxuICAgICAga2V5cyAgOiBbdGhpcy5zZXNzaW9uS2V5XSxcbiAgICAgIG1heEFnZTogMjQgKiA2MCAqIDYwICogMTAwMCwgLy8gaS5lLiAyNCBob3Vyc1xuICAgIH0pKTtcbiAgICBhcHAudXNlKHBhc3Nwb3J0LmluaXRpYWxpemUoKSk7XG4gICAgYXBwLnVzZShwYXNzcG9ydC5zZXNzaW9uKCkpO1xuXG4gICAgLy8gY29uZmlndXJlIGhhbmRsZWJhcnMgJiByZWdpc3RlciBpdCB3aXRoIGV4cHJlc3MgYXBwXG4gICAgY29uc3QgaGJzID0gZXhwcmVzc0hhbmRsZWJhcnMuY3JlYXRlKHtcbiAgICAgIGRlZmF1bHRMYXlvdXQ6ICdlbWJlZCcsXG4gICAgICBoYW5kbGViYXJzICAgOiBIYW5kbGViYXJzLFxuICAgIH0pO1xuICAgIGFwcC5lbmdpbmUoJ2hhbmRsZWJhcnMnLCBoYnMuZW5naW5lKTtcbiAgICBhcHAuc2V0KCd2aWV3IGVuZ2luZScsICdoYW5kbGViYXJzJyk7XG5cbiAgICAvLyBzZXQgdGhlIHJvdXRlcyBvbiB0aGUgYXBwXG4gICAgcmVxdWlyZSgnLi9yb3V0ZXMvYXV0aC1yb3V0ZXMuanMnKShhcHApO1xuICAgIHJlcXVpcmUoJy4vcm91dGVzL2FwaS1yb3V0ZXMuanMnKShhcHApO1xuICAgIHJlcXVpcmUoJy4vcm91dGVzL3BhZ2Utcm91dGVzLmpzJykoYXBwKTtcbiAgICByZXF1aXJlKCcuL3JvdXRlcy9hc3NldC1yb3V0ZXMuanMnKShhcHApO1xuICAgIHJlcXVpcmUoJy4vcm91dGVzL2ZhbGxiYWNrLXJvdXRlcy5qcycpKGFwcCk7XG5cbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgfTtcbiAgdGhpcy5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgIHJlcXVpcmUoJy4vaGVscGVycy9jb25maWd1cmVMb2dnZXIuanMnKShsb2dnZXIpO1xuICAgIHJlcXVpcmUoJy4vaGVscGVycy9jb25maWd1cmVTbGFjay5qcycpKGxvZ2dlcik7XG4gICAgdGhpcy5jcmVhdGVBcHAoKTtcbiAgICB0aGlzLnNlcnZlciA9IGh0dHAuU2VydmVyKHRoaXMuYXBwKTtcbiAgfTtcbiAgdGhpcy5zdGFydCA9ICgpID0+IHtcbiAgICBjb25zdCBkYiA9IHJlcXVpcmUoJy4vbW9kZWxzL2luZGV4Jyk7XG4gICAgLy8gc3luYyBzZXF1ZWxpemVcbiAgICBkYi5zZXF1ZWxpemUuc3luYygpXG4gICAgICAvLyBzdGFydCB0aGUgc2VydmVyXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VydmVyLmxpc3Rlbih0aGlzLlBPUlQsICgpID0+IHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgU2VydmVyIGlzIGxpc3RlbmluZyBvbiBQT1JUICR7dGhpcy5QT1JUfWApO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgU3RhcnR1cCBFcnJvcjpgLCBlcnJvcik7XG4gICAgICB9KTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2VydmVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3NlcnZlci5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV4cHJlc3NcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJleHByZXNzXCJcbi8vIG1vZHVsZSBpZCA9IDEyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib2R5LXBhcnNlclwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImJvZHktcGFyc2VyXCJcbi8vIG1vZHVsZSBpZCA9IDEyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJleHByZXNzLWhhbmRsZWJhcnNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJleHByZXNzLWhhbmRsZWJhcnNcIlxuLy8gbW9kdWxlIGlkID0gMTIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImhhbmRsZWJhcnNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJoYW5kbGViYXJzXCJcbi8vIG1vZHVsZSBpZCA9IDEyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJoZWxtZXRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJoZWxtZXRcIlxuLy8gbW9kdWxlIGlkID0gMTI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNlcmlhbGl6ZVNwZWVjaFVzZXIgKHVzZXIsIGRvbmUpIHsgIC8vIHJldHVybnMgdXNlciBkYXRhIHRvIGJlIHNlcmlhbGl6ZWQgaW50byBzZXNzaW9uXG4gICAgbG9nZ2VyLmRlYnVnKCdzZXJpYWxpemluZyB1c2VyJyk7XG4gICAgZG9uZShudWxsLCB1c2VyKTtcbiAgfSxcbiAgZGVzZXJpYWxpemVTcGVlY2hVc2VyICh1c2VyLCBkb25lKSB7ICAvLyBkZXNlcmlhbGl6ZXMgc2Vzc2lvbiBhbmQgcG9wdWxhdGVzIGFkZGl0aW9uYWwgaW5mbyB0byByZXEudXNlclxuICAgIGxvZ2dlci5kZWJ1ZygnZGVzZXJpYWxpemluZyB1c2VyJyk7XG4gICAgZG9uZShudWxsLCB1c2VyKTtcbiAgfSxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9hdXRoSGVscGVycy5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvb2tpZS1zZXNzaW9uXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiY29va2llLXNlc3Npb25cIlxuLy8gbW9kdWxlIGlkID0gMTI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImh0dHBcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJodHRwXCJcbi8vIG1vZHVsZSBpZCA9IDEyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBQYXNzcG9ydExvY2FsU3RyYXRlZ3kgPSByZXF1aXJlKCdwYXNzcG9ydC1sb2NhbCcpLlN0cmF0ZWd5O1xuY29uc3QgbGJyeUFwaSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvbGJyeUFwaS5qcycpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgZGIgPSByZXF1aXJlKCcuLi9tb2RlbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgUGFzc3BvcnRMb2NhbFN0cmF0ZWd5KFxuICB7XG4gICAgdXNlcm5hbWVGaWVsZDogJ3VzZXJuYW1lJyxcbiAgICBwYXNzd29yZEZpZWxkOiAncGFzc3dvcmQnLFxuICB9LFxuICAodXNlcm5hbWUsIHBhc3N3b3JkLCBkb25lKSA9PiB7XG4gICAgbG9nZ2VyLnZlcmJvc2UoYG5ldyBjaGFubmVsIHNpZ251cCByZXF1ZXN0LiB1c2VyOiAke3VzZXJuYW1lfSBwYXNzOiAke3Bhc3N3b3JkfSAuYCk7XG4gICAgbGV0IHVzZXJJbmZvID0ge307XG4gICAgLy8gc2VydmVyLXNpZGUgdmFsaWRhdG9uIG9mIGlucHV0cyAodXNlcm5hbWUsIHBhc3N3b3JkKVxuXG4gICAgLy8gY3JlYXRlIHRoZSBjaGFubmVsIGFuZCByZXRyaWV2ZSB0aGUgbWV0YWRhdGFcbiAgICByZXR1cm4gbGJyeUFwaS5jcmVhdGVDaGFubmVsKGBAJHt1c2VybmFtZX1gKVxuICAgICAgLnRoZW4odHggPT4ge1xuICAgICAgICAvLyBjcmVhdGUgdXNlciByZWNvcmRcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSB7XG4gICAgICAgICAgdXNlck5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgfTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ3VzZXJEYXRhID4nLCB1c2VyRGF0YSk7XG4gICAgICAgIC8vIGNyZWF0ZSB1c2VyIHJlY29yZFxuICAgICAgICBjb25zdCBjaGFubmVsRGF0YSA9IHtcbiAgICAgICAgICBjaGFubmVsTmFtZSAgIDogYEAke3VzZXJuYW1lfWAsXG4gICAgICAgICAgY2hhbm5lbENsYWltSWQ6IHR4LmNsYWltX2lkLFxuICAgICAgICB9O1xuICAgICAgICBsb2dnZXIudmVyYm9zZSgnY2hhbm5lbERhdGEgPicsIGNoYW5uZWxEYXRhKTtcbiAgICAgICAgLy8gY3JlYXRlIGNlcnRpZmljYXRlIHJlY29yZFxuICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZURhdGEgPSB7XG4gICAgICAgICAgY2xhaW1JZDogdHguY2xhaW1faWQsXG4gICAgICAgICAgbmFtZSAgIDogYEAke3VzZXJuYW1lfWAsXG4gICAgICAgICAgLy8gYWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ2NlcnRpZmljYXRlRGF0YSA+JywgY2VydGlmaWNhdGVEYXRhKTtcbiAgICAgICAgLy8gc2F2ZSB1c2VyIGFuZCBjZXJ0aWZpY2F0ZSB0byBkYlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW2RiLlVzZXIuY3JlYXRlKHVzZXJEYXRhKSwgZGIuQ2hhbm5lbC5jcmVhdGUoY2hhbm5lbERhdGEpLCBkYi5DZXJ0aWZpY2F0ZS5jcmVhdGUoY2VydGlmaWNhdGVEYXRhKV0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChbbmV3VXNlciwgbmV3Q2hhbm5lbCwgbmV3Q2VydGlmaWNhdGVdKSA9PiB7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKCd1c2VyIGFuZCBjZXJ0aWZpY2F0ZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCcpO1xuICAgICAgICAvLyBzdG9yZSB0aGUgcmVsZXZhbnQgbmV3VXNlciBpbmZvIHRvIGJlIHBhc3NlZCBiYWNrIGZvciByZXEuVXNlclxuICAgICAgICB1c2VySW5mb1snaWQnXSA9IG5ld1VzZXIuaWQ7XG4gICAgICAgIHVzZXJJbmZvWyd1c2VyTmFtZSddID0gbmV3VXNlci51c2VyTmFtZTtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxOYW1lJ10gPSBuZXdDaGFubmVsLmNoYW5uZWxOYW1lO1xuICAgICAgICB1c2VySW5mb1snY2hhbm5lbENsYWltSWQnXSA9IG5ld0NoYW5uZWwuY2hhbm5lbENsYWltSWQ7XG4gICAgICAgIC8vIGFzc29jaWF0ZSB0aGUgaW5zdGFuY2VzXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbmV3Q2VydGlmaWNhdGUuc2V0Q2hhbm5lbChuZXdDaGFubmVsKSwgbmV3Q2hhbm5lbC5zZXRVc2VyKG5ld1VzZXIpXSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBsb2dnZXIudmVyYm9zZSgndXNlciBhbmQgY2VydGlmaWNhdGUgc3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQnKTtcbiAgICAgICAgcmV0dXJuIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQodXNlckluZm8uY2hhbm5lbENsYWltSWQsIHVzZXJJbmZvLmNoYW5uZWxOYW1lKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihzaG9ydENoYW5uZWxJZCA9PiB7XG4gICAgICAgIHVzZXJJbmZvWydzaG9ydENoYW5uZWxJZCddID0gc2hvcnRDaGFubmVsSWQ7XG4gICAgICAgIHJldHVybiBkb25lKG51bGwsIHVzZXJJbmZvKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ3NpZ251cCBlcnJvcicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGRvbmUoZXJyb3IpO1xuICAgICAgfSk7XG4gIH1cbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcGFzc3BvcnQvbG9jYWwtc2lnbnVwLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYXhpb3NcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJheGlvc1wiXG4vLyBtb2R1bGUgaWQgPSAxMjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgbGJyeUNvbmZpZyA9IHtcbiAgYXBpOiB7XG4gICAgYXBpSG9zdDogJ2xvY2FsaG9zdCcsXG4gICAgYXBpUG9ydDogJzUyNzknLFxuICB9LFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBsYnJ5Q29uZmlnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY29uZmlnL2xicnlDb25maWcuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1bml2ZXJzYWwtYW5hbHl0aWNzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwidW5pdmVyc2FsLWFuYWx5dGljc1wiXG4vLyBtb2R1bGUgaWQgPSAxMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyByZXR1cm5TaG9ydElkIH0gPSByZXF1aXJlKCcuLi9oZWxwZXJzL3NlcXVlbGl6ZUhlbHBlcnMuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORywgQk9PTEVBTiwgSU5URUdFUiwgVEVYVCwgREVDSU1BTCB9KSA9PiB7XG4gIGNvbnN0IENlcnRpZmljYXRlID0gc2VxdWVsaXplLmRlZmluZShcbiAgICAnQ2VydGlmaWNhdGUnLFxuICAgIHtcbiAgICAgIGFkZHJlc3M6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGFtb3VudDoge1xuICAgICAgICB0eXBlICAgOiBERUNJTUFMKDE5LCA4KSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbUlkOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjbGFpbVNlcXVlbmNlOiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZGVjb2RlZENsYWltOiB7XG4gICAgICAgIHR5cGUgICA6IEJPT0xFQU4sXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZGVwdGg6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBlZmZlY3RpdmVBbW91bnQ6IHtcbiAgICAgICAgdHlwZSAgIDogREVDSU1BTCgxOSwgOCksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgaGFzU2lnbmF0dXJlOiB7XG4gICAgICAgIHR5cGUgICA6IEJPT0xFQU4sXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgaGV4OiB7XG4gICAgICAgIHR5cGUgICA6IFRFWFQoJ2xvbmcnKSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBuYW1lOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBub3V0OiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdHhpZDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdmFsaWRBdEhlaWdodDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIG91dHBvaW50OiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB2YWx1ZVZlcnNpb246IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNsYWltVHlwZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2VydGlmaWNhdGVWZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBrZXlUeXBlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBwdWJsaWNLZXk6IHtcbiAgICAgICAgdHlwZSAgIDogVEVYVCgnbG9uZycpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZyZWV6ZVRhYmxlTmFtZTogdHJ1ZSxcbiAgICB9XG4gICk7XG5cbiAgQ2VydGlmaWNhdGUuYXNzb2NpYXRlID0gZGIgPT4ge1xuICAgIENlcnRpZmljYXRlLmJlbG9uZ3NUbyhkYi5DaGFubmVsLCB7XG4gICAgICBmb3JlaWduS2V5OiB7XG4gICAgICAgIGFsbG93TnVsbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgQ2VydGlmaWNhdGUuZ2V0U2hvcnRDaGFubmVsSWRGcm9tTG9uZ0NoYW5uZWxJZCA9IGZ1bmN0aW9uIChsb25nQ2hhbm5lbElkLCBjaGFubmVsTmFtZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgZ2V0U2hvcnRDaGFubmVsSWRGcm9tTG9uZ0NoYW5uZWxJZCAke2NoYW5uZWxOYW1lfToke2xvbmdDaGFubmVsSWR9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7bmFtZTogY2hhbm5lbE5hbWV9LFxuICAgICAgICAgIG9yZGVyOiBbWydoZWlnaHQnLCAnQVNDJ11dLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNoYW5uZWwocykgZm91bmQgd2l0aCB0aGF0IGNoYW5uZWwgbmFtZScpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmV0dXJuU2hvcnRJZChyZXN1bHQsIGxvbmdDaGFubmVsSWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2VydGlmaWNhdGUuZ2V0TG9uZ0NoYW5uZWxJZEZyb21TaG9ydENoYW5uZWxJZCA9IGZ1bmN0aW9uIChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpIHtcbiAgICBsb2dnZXIuZGVidWcoYGdldExvbmdDaGFubmVsSWRGcm9tU2hvcnRDaGFubmVsSWQoJHtjaGFubmVsTmFtZX0sICR7Y2hhbm5lbENsYWltSWR9KWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZToge1xuICAgICAgICAgICAgbmFtZSAgIDogY2hhbm5lbE5hbWUsXG4gICAgICAgICAgICBjbGFpbUlkOiB7XG4gICAgICAgICAgICAgICRsaWtlOiBgJHtjaGFubmVsQ2xhaW1JZH0lYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmRlcjogW1snaGVpZ2h0JywgJ0FTQyddXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBkZWZhdWx0OiAvLyBub3RlIHJlc3VsdHMgbXVzdCBiZSBzb3J0ZWRcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmNsYWltSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDZXJ0aWZpY2F0ZS5nZXRMb25nQ2hhbm5lbElkRnJvbUNoYW5uZWxOYW1lID0gZnVuY3Rpb24gKGNoYW5uZWxOYW1lKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBnZXRMb25nQ2hhbm5lbElkRnJvbUNoYW5uZWxOYW1lKCR7Y2hhbm5lbE5hbWV9KWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZTogeyBuYW1lOiBjaGFubmVsTmFtZSB9LFxuICAgICAgICAgIG9yZGVyOiBbWydlZmZlY3RpdmVBbW91bnQnLCAnREVTQyddLCBbJ2hlaWdodCcsICdBU0MnXV0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLmNsYWltSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDZXJ0aWZpY2F0ZS52YWxpZGF0ZUxvbmdDaGFubmVsSWQgPSBmdW5jdGlvbiAobmFtZSwgY2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgdmFsaWRhdGVMb25nQ2hhbm5lbElkKCR7bmFtZX0sICR7Y2xhaW1JZH0pYCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7bmFtZSwgY2xhaW1JZH0sXG4gICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJlc29sdmUoY2xhaW1JZCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2VydGlmaWNhdGUuZ2V0TG9uZ0NoYW5uZWxJZCA9IGZ1bmN0aW9uIChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpIHtcbiAgICBsb2dnZXIuZGVidWcoYGdldExvbmdDaGFubmVsSWQoJHtjaGFubmVsTmFtZX0sICR7Y2hhbm5lbENsYWltSWR9KWApO1xuICAgIGlmIChjaGFubmVsQ2xhaW1JZCAmJiAoY2hhbm5lbENsYWltSWQubGVuZ3RoID09PSA0MCkpIHsgIC8vIGlmIGEgZnVsbCBjaGFubmVsIGlkIGlzIHByb3ZpZGVkXG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUxvbmdDaGFubmVsSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDbGFpbUlkICYmIGNoYW5uZWxDbGFpbUlkLmxlbmd0aCA8IDQwKSB7ICAvLyBpZiBhIHNob3J0IGNoYW5uZWwgaWQgaXMgcHJvdmlkZWRcbiAgICAgIHJldHVybiB0aGlzLmdldExvbmdDaGFubmVsSWRGcm9tU2hvcnRDaGFubmVsSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9uZ0NoYW5uZWxJZEZyb21DaGFubmVsTmFtZShjaGFubmVsTmFtZSk7ICAvLyBpZiBubyBjaGFubmVsIGlkIHByb3ZpZGVkXG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBDZXJ0aWZpY2F0ZTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvbW9kZWxzL2NlcnRpZmljYXRlLmpzIiwibW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORyB9KSA9PiB7XG4gIGNvbnN0IENoYW5uZWwgPSBzZXF1ZWxpemUuZGVmaW5lKFxuICAgICdDaGFubmVsJyxcbiAgICB7XG4gICAgICBjaGFubmVsTmFtZToge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBjaGFubmVsQ2xhaW1JZDoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcmVlemVUYWJsZU5hbWU6IHRydWUsXG4gICAgfVxuICApO1xuXG4gIENoYW5uZWwuYXNzb2NpYXRlID0gZGIgPT4ge1xuICAgIENoYW5uZWwuYmVsb25nc1RvKGRiLlVzZXIpO1xuICAgIENoYW5uZWwuaGFzT25lKGRiLkNlcnRpZmljYXRlKTtcbiAgfTtcblxuICByZXR1cm4gQ2hhbm5lbDtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvbW9kZWxzL2NoYW5uZWwuanMiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCB7IHJldHVyblNob3J0SWQgfSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvc2VxdWVsaXplSGVscGVycy5qcycpO1xuY29uc3QgeyBhc3NldERlZmF1bHRzOiB7IHRodW1ibmFpbDogZGVmYXVsdFRodW1ibmFpbCB9LCBkZXRhaWxzOiB7IGhvc3QgfSB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuZnVuY3Rpb24gZGV0ZXJtaW5lRmlsZUV4dGVuc2lvbkZyb21Db250ZW50VHlwZSAoY29udGVudFR5cGUpIHtcbiAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgIGNhc2UgJ2ltYWdlL2pwZWcnOlxuICAgIGNhc2UgJ2ltYWdlL2pwZyc6XG4gICAgICByZXR1cm4gJ2pwZWcnO1xuICAgIGNhc2UgJ2ltYWdlL3BuZyc6XG4gICAgICByZXR1cm4gJ3BuZyc7XG4gICAgY2FzZSAnaW1hZ2UvZ2lmJzpcbiAgICAgIHJldHVybiAnZ2lmJztcbiAgICBjYXNlICd2aWRlby9tcDQnOlxuICAgICAgcmV0dXJuICdtcDQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsb2dnZXIuZGVidWcoJ3NldHRpbmcgdW5rbm93biBmaWxlIHR5cGUgYXMgZmlsZSBleHRlbnNpb24ganBlZycpO1xuICAgICAgcmV0dXJuICdqcGVnJztcbiAgfVxufTtcblxuZnVuY3Rpb24gZGV0ZXJtaW5lVGh1bWJuYWlsIChzdG9yZWRUaHVtYm5haWwsIGRlZmF1bHRUaHVtYm5haWwpIHtcbiAgaWYgKHN0b3JlZFRodW1ibmFpbCA9PT0gJycpIHtcbiAgICByZXR1cm4gZGVmYXVsdFRodW1ibmFpbDtcbiAgfVxuICByZXR1cm4gc3RvcmVkVGh1bWJuYWlsO1xufTtcblxuZnVuY3Rpb24gcHJlcGFyZUNsYWltRGF0YSAoY2xhaW0pIHtcbiAgLy8gbG9nZ2VyLmRlYnVnKCdwcmVwYXJpbmcgY2xhaW0gZGF0YSBiYXNlZCBvbiByZXNvbHZlZCBkYXRhOicsIGNsYWltKTtcbiAgY2xhaW1bJ3RodW1ibmFpbCddID0gZGV0ZXJtaW5lVGh1bWJuYWlsKGNsYWltLnRodW1ibmFpbCwgZGVmYXVsdFRodW1ibmFpbCk7XG4gIGNsYWltWydmaWxlRXh0J10gPSBkZXRlcm1pbmVGaWxlRXh0ZW5zaW9uRnJvbUNvbnRlbnRUeXBlKGNsYWltLmNvbnRlbnRUeXBlKTtcbiAgY2xhaW1bJ2hvc3QnXSA9IGhvc3Q7XG4gIHJldHVybiBjbGFpbTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gKHNlcXVlbGl6ZSwgeyBTVFJJTkcsIEJPT0xFQU4sIElOVEVHRVIsIFRFWFQsIERFQ0lNQUwgfSkgPT4ge1xuICBjb25zdCBDbGFpbSA9IHNlcXVlbGl6ZS5kZWZpbmUoXG4gICAgJ0NsYWltJyxcbiAgICB7XG4gICAgICBhZGRyZXNzOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhbW91bnQ6IHtcbiAgICAgICAgdHlwZSAgIDogREVDSU1BTCgxOSwgOCksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2xhaW1JZDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2xhaW1TZXF1ZW5jZToge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGRlY29kZWRDbGFpbToge1xuICAgICAgICB0eXBlICAgOiBCT09MRUFOLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGRlcHRoOiB7XG4gICAgICAgIHR5cGUgICA6IElOVEVHRVIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgZWZmZWN0aXZlQW1vdW50OiB7XG4gICAgICAgIHR5cGUgICA6IERFQ0lNQUwoMTksIDgpLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhhc1NpZ25hdHVyZToge1xuICAgICAgICB0eXBlICAgOiBCT09MRUFOLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhleDoge1xuICAgICAgICB0eXBlICAgOiBURVhUKCdsb25nJyksXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbm91dDoge1xuICAgICAgICB0eXBlICAgOiBJTlRFR0VSLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHR4aWQ6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHZhbGlkQXRIZWlnaHQ6IHtcbiAgICAgICAgdHlwZSAgIDogSU5URUdFUixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBvdXRwb2ludDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY2xhaW1UeXBlOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjZXJ0aWZpY2F0ZUlkOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBhdXRob3I6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFRFWFQoJ2xvbmcnKSxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBsYW5ndWFnZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbGljZW5zZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbGljZW5zZVVybDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgbnNmdzoge1xuICAgICAgICB0eXBlICAgOiBCT09MRUFOLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHByZXZpZXc6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHRodW1ibmFpbDoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIG1ldGFkYXRhVmVyc2lvbjoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgdHlwZSAgIDogU1RSSU5HLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHNvdXJjZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgc291cmNlVHlwZToge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgc291cmNlVmVyc2lvbjoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgc3RyZWFtVmVyc2lvbjoge1xuICAgICAgICB0eXBlICAgOiBTVFJJTkcsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdmFsdWVWZXJzaW9uOiB7XG4gICAgICAgIHR5cGUgICA6IFNUUklORyxcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBjaGFubmVsTmFtZToge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiB0cnVlLFxuICAgICAgICBkZWZhdWx0ICA6IG51bGwsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgZnJlZXplVGFibGVOYW1lOiB0cnVlLFxuICAgIH1cbiAgKTtcblxuICBDbGFpbS5hc3NvY2lhdGUgPSBkYiA9PiB7XG4gICAgQ2xhaW0uYmVsb25nc1RvKGRiLkZpbGUsIHtcbiAgICAgIGZvcmVpZ25LZXk6IHtcbiAgICAgICAgYWxsb3dOdWxsOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBDbGFpbS5nZXRTaG9ydENsYWltSWRGcm9tTG9uZ0NsYWltSWQgPSBmdW5jdGlvbiAoY2xhaW1JZCwgY2xhaW1OYW1lKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDbGFpbS5nZXRTaG9ydENsYWltSWRGcm9tTG9uZ0NsYWltSWQgZm9yICR7Y2xhaW1OYW1lfSMke2NsYWltSWR9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7IG5hbWU6IGNsYWltTmFtZSB9LFxuICAgICAgICAgIG9yZGVyOiBbWydoZWlnaHQnLCAnQVNDJ11dLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNsYWltKHMpIGZvdW5kIHdpdGggdGhhdCBjbGFpbSBuYW1lJyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblNob3J0SWQocmVzdWx0LCBjbGFpbUlkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLmdldEFsbENoYW5uZWxDbGFpbXMgPSBmdW5jdGlvbiAoY2hhbm5lbENsYWltSWQpIHtcbiAgICBsb2dnZXIuZGVidWcoYENsYWltLmdldEFsbENoYW5uZWxDbGFpbXMgZm9yICR7Y2hhbm5lbENsYWltSWR9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7IGNlcnRpZmljYXRlSWQ6IGNoYW5uZWxDbGFpbUlkIH0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2hlaWdodCcsICdBU0MnXV0sXG4gICAgICAgICAgcmF3ICA6IHRydWUsICAvLyByZXR1cm5zIGFuIGFycmF5IG9mIG9ubHkgZGF0YSwgbm90IGFuIGFycmF5IG9mIGluc3RhbmNlc1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihjaGFubmVsQ2xhaW1zQXJyYXkgPT4ge1xuICAgICAgICAgIC8vIGxvZ2dlci5kZWJ1ZygnY2hhbm5lbGNsYWltc2FycmF5IGxlbmd0aDonLCBjaGFubmVsQ2xhaW1zQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5uZWxDbGFpbXNBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjaGFubmVsQ2xhaW1zQXJyYXkuZm9yRWFjaChjbGFpbSA9PiB7XG4gICAgICAgICAgICAgICAgY2xhaW1bJ2ZpbGVFeHQnXSA9IGRldGVybWluZUZpbGVFeHRlbnNpb25Gcm9tQ29udGVudFR5cGUoY2xhaW0uY29udGVudFR5cGUpO1xuICAgICAgICAgICAgICAgIGNsYWltWyd0aHVtYm5haWwnXSA9IGRldGVybWluZVRodW1ibmFpbChjbGFpbS50aHVtYm5haWwsIGRlZmF1bHRUaHVtYm5haWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFpbTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGNoYW5uZWxDbGFpbXNBcnJheSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIENsYWltLmdldENsYWltSWRCeUxvbmdDaGFubmVsSWQgPSBmdW5jdGlvbiAoY2hhbm5lbENsYWltSWQsIGNsYWltTmFtZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgZmluZGluZyBjbGFpbSBpZCBmb3IgY2xhaW0gJHtjbGFpbU5hbWV9IGZyb20gY2hhbm5lbCAke2NoYW5uZWxDbGFpbUlkfWApO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzXG4gICAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgICB3aGVyZTogeyBuYW1lOiBjbGFpbU5hbWUsIGNlcnRpZmljYXRlSWQ6IGNoYW5uZWxDbGFpbUlkIH0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2lkJywgJ0FTQyddXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdFswXS5jbGFpbUlkKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgJHtyZXN1bHQubGVuZ3RofSByZWNvcmRzIGZvdW5kIGZvciBcIiR7Y2xhaW1OYW1lfVwiIGluIGNoYW5uZWwgXCIke2NoYW5uZWxDbGFpbUlkfVwiYCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdFswXS5jbGFpbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2xhaW0uZ2V0TG9uZ0NsYWltSWRGcm9tU2hvcnRDbGFpbUlkID0gZnVuY3Rpb24gKG5hbWUsIHNob3J0SWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjbGFpbUlkOiB7XG4gICAgICAgICAgICAgICRsaWtlOiBgJHtzaG9ydElkfSVgLFxuICAgICAgICAgICAgfX0sXG4gICAgICAgICAgb3JkZXI6IFtbJ2hlaWdodCcsICdBU0MnXV0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgZGVmYXVsdDogLy8gbm90ZSByZXN1bHRzIG11c3QgYmUgc29ydGVkXG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdFswXS5jbGFpbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ2xhaW0uZ2V0VG9wRnJlZUNsYWltSWRCeUNsYWltTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXNcbiAgICAgICAgLmZpbmRBbGwoe1xuICAgICAgICAgIHdoZXJlOiB7IG5hbWUgfSxcbiAgICAgICAgICBvcmRlcjogW1snZWZmZWN0aXZlQW1vdW50JywgJ0RFU0MnXSwgWydoZWlnaHQnLCAnQVNDJ11dLCAgLy8gbm90ZTogbWF5YmUgaGVpZ2h0IGFuZCBlZmZlY3RpdmUgYW1vdW50IG5lZWQgdG8gc3dpdGNoP1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnbGVuZ3RoIG9mIHJlc3VsdCcsIHJlc3VsdC5sZW5ndGgpO1xuICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdFswXS5kYXRhVmFsdWVzLmNsYWltSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDbGFpbS52YWxpZGF0ZUxvbmdDbGFpbUlkID0gZnVuY3Rpb24gKG5hbWUsIGNsYWltSWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5maW5kT25lKHtcbiAgICAgICAgd2hlcmU6IHtuYW1lLCBjbGFpbUlkfSxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmVzb2x2ZShjbGFpbUlkKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBDbGFpbS5nZXRMb25nQ2xhaW1JZCA9IGZ1bmN0aW9uIChjbGFpbU5hbWUsIGNsYWltSWQpIHtcbiAgICBsb2dnZXIuZGVidWcoYGdldExvbmdDbGFpbUlkKCR7Y2xhaW1OYW1lfSwgJHtjbGFpbUlkfSlgKTtcbiAgICBpZiAoY2xhaW1JZCAmJiAoY2xhaW1JZC5sZW5ndGggPT09IDQwKSkgeyAgLy8gaWYgYSBmdWxsIGNsYWltIGlkIGlzIHByb3ZpZGVkXG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUxvbmdDbGFpbUlkKGNsYWltTmFtZSwgY2xhaW1JZCk7XG4gICAgfSBlbHNlIGlmIChjbGFpbUlkICYmIGNsYWltSWQubGVuZ3RoIDwgNDApIHtcbiAgICAgIHJldHVybiB0aGlzLmdldExvbmdDbGFpbUlkRnJvbVNob3J0Q2xhaW1JZChjbGFpbU5hbWUsIGNsYWltSWQpOyAgLy8gaWYgYSBzaG9ydCBjbGFpbSBpZCBpcyBwcm92aWRlZFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUb3BGcmVlQ2xhaW1JZEJ5Q2xhaW1OYW1lKGNsYWltTmFtZSk7ICAvLyBpZiBubyBjbGFpbSBpZCBpcyBwcm92aWRlZFxuICAgIH1cbiAgfTtcblxuICBDbGFpbS5yZXNvbHZlQ2xhaW0gPSBmdW5jdGlvbiAobmFtZSwgY2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ2xhaW0ucmVzb2x2ZUNsYWltOiAke25hbWV9ICR7Y2xhaW1JZH1gKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpc1xuICAgICAgICAuZmluZEFsbCh7XG4gICAgICAgICAgd2hlcmU6IHsgbmFtZSwgY2xhaW1JZCB9LFxuICAgICAgICB9KVxuICAgICAgICAudGhlbihjbGFpbUFycmF5ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKGNsYWltQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShwcmVwYXJlQ2xhaW1EYXRhKGNsYWltQXJyYXlbMF0uZGF0YVZhbHVlcykpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBtb3JlIHRoYW4gb25lIHJlY29yZCBtYXRjaGVzICR7bmFtZX0jJHtjbGFpbUlkfSBpbiBkYi5DbGFpbWApO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShwcmVwYXJlQ2xhaW1EYXRhKGNsYWltQXJyYXlbMF0uZGF0YVZhbHVlcykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gQ2xhaW07XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL21vZGVscy9jbGFpbS5qcyIsIm1vZHVsZS5leHBvcnRzID0gKHNlcXVlbGl6ZSwgeyBTVFJJTkcsIEJPT0xFQU4sIElOVEVHRVIgfSkgPT4ge1xuICBjb25zdCBGaWxlID0gc2VxdWVsaXplLmRlZmluZShcbiAgICAnRmlsZScsXG4gICAge1xuICAgICAgbmFtZToge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBjbGFpbUlkOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGFkZHJlc3M6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgb3V0cG9pbnQ6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiB7XG4gICAgICAgIHR5cGUgICAgIDogSU5URUdFUixcbiAgICAgICAgYWxsb3dOdWxsOiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdCAgOiAwLFxuICAgICAgfSxcbiAgICAgIGZpbGVOYW1lOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGZpbGVQYXRoOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGZpbGVUeXBlOiB7XG4gICAgICAgIHR5cGU6IFNUUklORyxcbiAgICAgIH0sXG4gICAgICBuc2Z3OiB7XG4gICAgICAgIHR5cGUgICAgICAgIDogQk9PTEVBTixcbiAgICAgICAgYWxsb3dOdWxsICAgOiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB0cmVuZGluZ0VsaWdpYmxlOiB7XG4gICAgICAgIHR5cGUgICAgICAgIDogQk9PTEVBTixcbiAgICAgICAgYWxsb3dOdWxsICAgOiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZyZWV6ZVRhYmxlTmFtZTogdHJ1ZSxcbiAgICB9XG4gICk7XG5cbiAgRmlsZS5hc3NvY2lhdGUgPSBkYiA9PiB7XG4gICAgRmlsZS5oYXNNYW55KGRiLlJlcXVlc3QpO1xuICAgIEZpbGUuaGFzT25lKGRiLkNsYWltKTtcbiAgfTtcblxuICBGaWxlLmdldFJlY2VudENsYWltcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kQWxsKHtcbiAgICAgIHdoZXJlOiB7IG5zZnc6IGZhbHNlLCB0cmVuZGluZ0VsaWdpYmxlOiB0cnVlIH0sXG4gICAgICBvcmRlcjogW1snY3JlYXRlZEF0JywgJ0RFU0MnXV0sXG4gICAgICBsaW1pdDogMjUsXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEZpbGU7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL21vZGVscy9maWxlLmpzIiwibW9kdWxlLmV4cG9ydHMgPSAoc2VxdWVsaXplLCB7IFNUUklORywgQk9PTEVBTiwgVEVYVCB9KSA9PiB7XG4gIGNvbnN0IFJlcXVlc3QgPSBzZXF1ZWxpemUuZGVmaW5lKFxuICAgICdSZXF1ZXN0JyxcbiAgICB7XG4gICAgICBhY3Rpb246IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgdXJsOiB7XG4gICAgICAgIHR5cGUgICAgIDogU1RSSU5HLFxuICAgICAgICBhbGxvd051bGw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGlwQWRkcmVzczoge1xuICAgICAgICB0eXBlICAgICA6IFNUUklORyxcbiAgICAgICAgYWxsb3dOdWxsOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICB0eXBlICAgICA6IFRFWFQoJ2xvbmcnKSxcbiAgICAgICAgYWxsb3dOdWxsOiB0cnVlLFxuICAgICAgICBkZWZhdWx0ICA6IG51bGwsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgZnJlZXplVGFibGVOYW1lOiB0cnVlLFxuICAgIH1cbiAgKTtcblxuICBSZXF1ZXN0LmFzc29jaWF0ZSA9IGRiID0+IHtcbiAgICBSZXF1ZXN0LmJlbG9uZ3NUbyhkYi5GaWxlLCB7XG4gICAgICBmb3JlaWduS2V5OiB7XG4gICAgICAgIGFsbG93TnVsbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFJlcXVlc3Q7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL21vZGVscy9yZXF1ZXN0LmpzIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYmNyeXB0ID0gcmVxdWlyZSgnYmNyeXB0Jyk7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKHNlcXVlbGl6ZSwgeyBTVFJJTkcgfSkgPT4ge1xuICBjb25zdCBVc2VyID0gc2VxdWVsaXplLmRlZmluZShcbiAgICAnVXNlcicsXG4gICAge1xuICAgICAgdXNlck5hbWU6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgcGFzc3dvcmQ6IHtcbiAgICAgICAgdHlwZSAgICAgOiBTVFJJTkcsXG4gICAgICAgIGFsbG93TnVsbDogZmFsc2UsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgZnJlZXplVGFibGVOYW1lOiB0cnVlLFxuICAgIH1cbiAgKTtcblxuICBVc2VyLmFzc29jaWF0ZSA9IGRiID0+IHtcbiAgICBVc2VyLmhhc09uZShkYi5DaGFubmVsKTtcbiAgfTtcblxuICBVc2VyLnByb3RvdHlwZS5jb21wYXJlUGFzc3dvcmQgPSBmdW5jdGlvbiAocGFzc3dvcmQpIHtcbiAgICByZXR1cm4gYmNyeXB0LmNvbXBhcmUocGFzc3dvcmQsIHRoaXMucGFzc3dvcmQpO1xuICB9O1xuXG4gIFVzZXIucHJvdG90eXBlLmNoYW5nZVBhc3N3b3JkID0gZnVuY3Rpb24gKG5ld1Bhc3N3b3JkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGdlbmVyYXRlIGEgc2FsdCBzdHJpbmcgdG8gdXNlIGZvciBoYXNoaW5nXG4gICAgICBiY3J5cHQuZ2VuU2FsdCgoc2FsdEVycm9yLCBzYWx0KSA9PiB7XG4gICAgICAgIGlmIChzYWx0RXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ3NhbHQgZXJyb3InLCBzYWx0RXJyb3IpO1xuICAgICAgICAgIHJlamVjdChzYWx0RXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZW5lcmF0ZSBhIGhhc2hlZCB2ZXJzaW9uIG9mIHRoZSB1c2VyJ3MgcGFzc3dvcmRcbiAgICAgICAgYmNyeXB0Lmhhc2gobmV3UGFzc3dvcmQsIHNhbHQsIChoYXNoRXJyb3IsIGhhc2gpID0+IHtcbiAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHRoZSBoYXNoIGdlbmVyYXRpb24gcmV0dXJuIHRoZSBlcnJvclxuICAgICAgICAgIGlmIChoYXNoRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignaGFzaCBlcnJvcicsIGhhc2hFcnJvcik7XG4gICAgICAgICAgICByZWplY3QoaGFzaEVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcmVwbGFjZSB0aGUgY3VycmVudCBwYXNzd29yZCB3aXRoIHRoZSBuZXcgaGFzaFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgIC51cGRhdGUoe3Bhc3N3b3JkOiBoYXNofSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBwcmUtc2F2ZSBob29rIG1ldGhvZCB0byBoYXNoIHRoZSB1c2VyJ3MgcGFzc3dvcmQgYmVmb3JlIHRoZSB1c2VyJ3MgaW5mbyBpcyBzYXZlZCB0byB0aGUgZGIuXG4gIFVzZXIuaG9vaygnYmVmb3JlQ3JlYXRlJywgKHVzZXIsIG9wdGlvbnMpID0+IHtcbiAgICBsb2dnZXIuZGVidWcoJ1VzZXIuYmVmb3JlQ3JlYXRlIGhvb2suLi4nKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gZ2VuZXJhdGUgYSBzYWx0IHN0cmluZyB0byB1c2UgZm9yIGhhc2hpbmdcbiAgICAgIGJjcnlwdC5nZW5TYWx0KChzYWx0RXJyb3IsIHNhbHQpID0+IHtcbiAgICAgICAgaWYgKHNhbHRFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignc2FsdCBlcnJvcicsIHNhbHRFcnJvcik7XG4gICAgICAgICAgcmVqZWN0KHNhbHRFcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdlbmVyYXRlIGEgaGFzaGVkIHZlcnNpb24gb2YgdGhlIHVzZXIncyBwYXNzd29yZFxuICAgICAgICBiY3J5cHQuaGFzaCh1c2VyLnBhc3N3b3JkLCBzYWx0LCAoaGFzaEVycm9yLCBoYXNoKSA9PiB7XG4gICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2l0aCB0aGUgaGFzaCBnZW5lcmF0aW9uIHJldHVybiB0aGUgZXJyb3JcbiAgICAgICAgICBpZiAoaGFzaEVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ2hhc2ggZXJyb3InLCBoYXNoRXJyb3IpO1xuICAgICAgICAgICAgcmVqZWN0KGhhc2hFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIHBhc3N3b3JkIHN0cmluZyB3aXRoIHRoZSBoYXNoIHBhc3N3b3JkIHZhbHVlXG4gICAgICAgICAgdXNlci5wYXNzd29yZCA9IGhhc2g7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gVXNlcjtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvbW9kZWxzL3VzZXIuanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJiY3J5cHRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJiY3J5cHRcIlxuLy8gbW9kdWxlIGlkID0gMTM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IFBhc3Nwb3J0TG9jYWxTdHJhdGVneSA9IHJlcXVpcmUoJ3Bhc3Nwb3J0LWxvY2FsJykuU3RyYXRlZ3k7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCBkYiA9IHJlcXVpcmUoJy4uL21vZGVscy9pbmRleCcpO1xuXG5jb25zdCByZXR1cm5Vc2VyQW5kQ2hhbm5lbEluZm8gPSAodXNlckluc3RhbmNlKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHVzZXJJbmZvID0ge307XG4gICAgdXNlckluZm9bJ2lkJ10gPSB1c2VySW5zdGFuY2UuaWQ7XG4gICAgdXNlckluZm9bJ3VzZXJOYW1lJ10gPSB1c2VySW5zdGFuY2UudXNlck5hbWU7XG4gICAgdXNlckluc3RhbmNlXG4gICAgICAuZ2V0Q2hhbm5lbCgpXG4gICAgICAudGhlbigoe2NoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZH0pID0+IHtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxOYW1lJ10gPSBjaGFubmVsTmFtZTtcbiAgICAgICAgdXNlckluZm9bJ2NoYW5uZWxDbGFpbUlkJ10gPSBjaGFubmVsQ2xhaW1JZDtcbiAgICAgICAgcmV0dXJuIGRiLkNlcnRpZmljYXRlLmdldFNob3J0Q2hhbm5lbElkRnJvbUxvbmdDaGFubmVsSWQoY2hhbm5lbENsYWltSWQsIGNoYW5uZWxOYW1lKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihzaG9ydENoYW5uZWxJZCA9PiB7XG4gICAgICAgIHVzZXJJbmZvWydzaG9ydENoYW5uZWxJZCddID0gc2hvcnRDaGFubmVsSWQ7XG4gICAgICAgIHJlc29sdmUodXNlckluZm8pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBQYXNzcG9ydExvY2FsU3RyYXRlZ3koXG4gIHtcbiAgICB1c2VybmFtZUZpZWxkOiAndXNlcm5hbWUnLFxuICAgIHBhc3N3b3JkRmllbGQ6ICdwYXNzd29yZCcsXG4gIH0sXG4gICh1c2VybmFtZSwgcGFzc3dvcmQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gZGIuVXNlclxuICAgICAgLmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge3VzZXJOYW1lOiB1c2VybmFtZX0sXG4gICAgICB9KVxuICAgICAgLnRoZW4odXNlciA9PiB7XG4gICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnbm8gdXNlciBmb3VuZCcpO1xuICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIGZhbHNlLCB7bWVzc2FnZTogJ0luY29ycmVjdCB1c2VybmFtZSBvciBwYXNzd29yZCd9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNlci5jb21wYXJlUGFzc3dvcmQocGFzc3dvcmQpXG4gICAgICAgICAgLnRoZW4oaXNNYXRjaCA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzTWF0Y2gpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdpbmNvcnJlY3QgcGFzc3dvcmQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRvbmUobnVsbCwgZmFsc2UsIHttZXNzYWdlOiAnSW5jb3JyZWN0IHVzZXJuYW1lIG9yIHBhc3N3b3JkJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdQYXNzd29yZCB3YXMgYSBtYXRjaCwgcmV0dXJuaW5nIFVzZXInKTtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5Vc2VyQW5kQ2hhbm5lbEluZm8odXNlcilcbiAgICAgICAgICAgICAgLnRoZW4odXNlckluZm8gPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIHVzZXJJbmZvKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gZG9uZShlcnJvcik7XG4gICAgICB9KTtcbiAgfSxcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcGFzc3BvcnQvbG9jYWwtbG9naW4uanMiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCBwYXNzcG9ydCA9IHJlcXVpcmUoJ3Bhc3Nwb3J0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFwcCkgPT4ge1xuICAvLyByb3V0ZSBmb3Igc2lnbiB1cFxuICBhcHAucG9zdCgnL3NpZ251cCcsIHBhc3Nwb3J0LmF1dGhlbnRpY2F0ZSgnbG9jYWwtc2lnbnVwJyksIChyZXEsIHJlcykgPT4ge1xuICAgIGxvZ2dlci52ZXJib3NlKGBzdWNjZXNzZnVsIHNpZ251cCBmb3IgJHtyZXEudXNlci5jaGFubmVsTmFtZX1gKTtcbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7XG4gICAgICBzdWNjZXNzICAgICAgIDogdHJ1ZSxcbiAgICAgIGNoYW5uZWxOYW1lICAgOiByZXEudXNlci5jaGFubmVsTmFtZSxcbiAgICAgIGNoYW5uZWxDbGFpbUlkOiByZXEudXNlci5jaGFubmVsQ2xhaW1JZCxcbiAgICAgIHNob3J0Q2hhbm5lbElkOiByZXEudXNlci5zaG9ydENoYW5uZWxJZCxcbiAgICB9KTtcbiAgfSk7XG4gIC8vIHJvdXRlIGZvciBsb2cgaW5cbiAgYXBwLnBvc3QoJy9sb2dpbicsIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIHBhc3Nwb3J0LmF1dGhlbnRpY2F0ZSgnbG9jYWwtbG9naW4nLCAoZXJyLCB1c2VyLCBpbmZvKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBuZXh0KGVycik7XG4gICAgICB9XG4gICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBpbmZvLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmRlYnVnKCdzdWNjZXNzZnVsIGxvZ2luJyk7XG4gICAgICByZXEubG9nSW4odXNlciwgKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIG5leHQoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oe1xuICAgICAgICAgIHN1Y2Nlc3MgICAgICAgOiB0cnVlLFxuICAgICAgICAgIGNoYW5uZWxOYW1lICAgOiByZXEudXNlci5jaGFubmVsTmFtZSxcbiAgICAgICAgICBjaGFubmVsQ2xhaW1JZDogcmVxLnVzZXIuY2hhbm5lbENsYWltSWQsXG4gICAgICAgICAgc2hvcnRDaGFubmVsSWQ6IHJlcS51c2VyLnNob3J0Q2hhbm5lbElkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pKHJlcSwgcmVzLCBuZXh0KTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIGxvZyBvdXRcbiAgYXBwLmdldCgnL2xvZ291dCcsIChyZXEsIHJlcykgPT4ge1xuICAgIHJlcS5sb2dvdXQoKTtcbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgbWVzc2FnZTogJ3lvdSBzdWNjZXNzZnVsbHkgbG9nZ2VkIG91dCd9KTtcbiAgfSk7XG4gIC8vIHNlZSBpZiB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQsIGFuZCByZXR1cm4gY3JlZGVudGlhbHMgaWYgc29cbiAgYXBwLmdldCgnL3VzZXInLCAocmVxLCByZXMpID0+IHtcbiAgICBpZiAocmVxLnVzZXIpIHtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXEudXNlcn0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMuc3RhdHVzKDQwMSkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICd1c2VyIGlzIG5vdCBsb2dnZWQgaW4nfSk7XG4gICAgfVxuICB9KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvcm91dGVzL2F1dGgtcm91dGVzLmpzIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgbXVsdGlwYXJ0ID0gcmVxdWlyZSgnY29ubmVjdC1tdWx0aXBhcnR5Jyk7XG5jb25zdCB7IHB1Ymxpc2hpbmc6IHsgdXBsb2FkRGlyZWN0b3J5IH0sIGRldGFpbHM6IHsgaG9zdCB9IH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuY29uc3QgbXVsdGlwYXJ0TWlkZGxld2FyZSA9IG11bHRpcGFydCh7dXBsb2FkRGlyOiB1cGxvYWREaXJlY3Rvcnl9KTtcbmNvbnN0IGRiID0gcmVxdWlyZSgnLi4vbW9kZWxzL2luZGV4Jyk7XG5jb25zdCB7IGNsYWltTmFtZUlzQXZhaWxhYmxlLCBjaGVja0NoYW5uZWxBdmFpbGFiaWxpdHksIHB1Ymxpc2ggfSA9IHJlcXVpcmUoJy4uL2NvbnRyb2xsZXJzL3B1Ymxpc2hDb250cm9sbGVyLmpzJyk7XG5jb25zdCB7IGdldENsYWltTGlzdCwgcmVzb2x2ZVVyaSwgZ2V0Q2xhaW0gfSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvbGJyeUFwaS5qcycpO1xuY29uc3QgeyBhZGRHZXRSZXN1bHRzVG9GaWxlRGF0YSwgY3JlYXRlQmFzaWNQdWJsaXNoUGFyYW1zLCBjcmVhdGVUaHVtYm5haWxQdWJsaXNoUGFyYW1zLCBwYXJzZVB1Ymxpc2hBcGlSZXF1ZXN0Qm9keSwgcGFyc2VQdWJsaXNoQXBpUmVxdWVzdEZpbGVzLCBjcmVhdGVGaWxlRGF0YSB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9wdWJsaXNoSGVscGVycy5qcycpO1xuY29uc3QgZXJyb3JIYW5kbGVycyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvZXJyb3JIYW5kbGVycy5qcycpO1xuY29uc3QgeyBzZW5kR0FUaW1pbmdFdmVudCB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9nb29nbGVBbmFseXRpY3MuanMnKTtcbmNvbnN0IHsgYXV0aGVudGljYXRlVXNlciB9ID0gcmVxdWlyZSgnLi4vYXV0aC9hdXRoZW50aWNhdGlvbi5qcycpO1xuY29uc3QgeyBnZXRDaGFubmVsRGF0YSwgZ2V0Q2hhbm5lbENsYWltcywgZ2V0Q2xhaW1JZCB9ID0gcmVxdWlyZSgnLi4vY29udHJvbGxlcnMvc2VydmVDb250cm9sbGVyLmpzJyk7XG5cbmNvbnN0IE5PX0NIQU5ORUwgPSAnTk9fQ0hBTk5FTCc7XG5jb25zdCBOT19DTEFJTSA9ICdOT19DTEFJTSc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFwcCkgPT4ge1xuICAvLyByb3V0ZSB0byBjaGVjayB3aGV0aGVyIHNpdGUgaGFzIHB1Ymxpc2hlZCB0byBhIGNoYW5uZWxcbiAgYXBwLmdldCgnL2FwaS9jaGFubmVsL2F2YWlsYWJpbGl0eS86bmFtZScsICh7IGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zOiB7IG5hbWUgfSB9LCByZXMpID0+IHtcbiAgICBjb25zdCBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY2hlY2tDaGFubmVsQXZhaWxhYmlsaXR5KG5hbWUpXG4gICAgICAudGhlbihhdmFpbGFibGVOYW1lID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oYXZhaWxhYmxlTmFtZSk7XG4gICAgICAgIHNlbmRHQVRpbWluZ0V2ZW50KCdlbmQtdG8tZW5kJywgJ2NsYWltIG5hbWUgYXZhaWxhYmlsaXR5JywgbmFtZSwgZ2FTdGFydFRpbWUsIERhdGUubm93KCkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBnZXQgYSBzaG9ydCBjaGFubmVsIGlkIGZyb20gbG9uZyBjaGFubmVsIElkXG4gIGFwcC5nZXQoJy9hcGkvY2hhbm5lbC9zaG9ydC1pZC86bG9uZ0lkLzpuYW1lJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgZGIuQ2VydGlmaWNhdGUuZ2V0U2hvcnRDaGFubmVsSWRGcm9tTG9uZ0NoYW5uZWxJZChwYXJhbXMubG9uZ0lkLCBwYXJhbXMubmFtZSlcbiAgICAgIC50aGVuKHNob3J0SWQgPT4ge1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbihzaG9ydElkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgYXBwLmdldCgnL2FwaS9jaGFubmVsL2RhdGEvOmNoYW5uZWxOYW1lLzpjaGFubmVsQ2xhaW1JZCcsICh7IGlwLCBvcmlnaW5hbFVybCwgYm9keSwgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gcGFyYW1zLmNoYW5uZWxOYW1lO1xuICAgIGxldCBjaGFubmVsQ2xhaW1JZCA9IHBhcmFtcy5jaGFubmVsQ2xhaW1JZDtcbiAgICBpZiAoY2hhbm5lbENsYWltSWQgPT09ICdub25lJykgY2hhbm5lbENsYWltSWQgPSBudWxsO1xuICAgIGdldENoYW5uZWxEYXRhKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgMClcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICBpZiAoZGF0YSA9PT0gTk9fQ0hBTk5FTCkge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdObyBtYXRjaGluZyBjaGFubmVsIHdhcyBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YX0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICBhcHAuZ2V0KCcvYXBpL2NoYW5uZWwvY2xhaW1zLzpjaGFubmVsTmFtZS86Y2hhbm5lbENsYWltSWQvOnBhZ2UnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIGJvZHksIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBjaGFubmVsTmFtZSA9IHBhcmFtcy5jaGFubmVsTmFtZTtcbiAgICBsZXQgY2hhbm5lbENsYWltSWQgPSBwYXJhbXMuY2hhbm5lbENsYWltSWQ7XG4gICAgaWYgKGNoYW5uZWxDbGFpbUlkID09PSAnbm9uZScpIGNoYW5uZWxDbGFpbUlkID0gbnVsbDtcbiAgICBjb25zdCBwYWdlID0gcGFyYW1zLnBhZ2U7XG4gICAgZ2V0Q2hhbm5lbENsYWltcyhjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIHBhZ2UpXG4gICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgaWYgKGRhdGEgPT09IE5PX0NIQU5ORUwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnTm8gbWF0Y2hpbmcgY2hhbm5lbCB3YXMgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGF9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gcnVuIGEgY2xhaW1fbGlzdCByZXF1ZXN0IG9uIHRoZSBkYWVtb25cbiAgYXBwLmdldCgnL2FwaS9jbGFpbS9saXN0LzpuYW1lJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgZ2V0Q2xhaW1MaXN0KHBhcmFtcy5uYW1lKVxuICAgICAgLnRoZW4oY2xhaW1zTGlzdCA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKGNsYWltc0xpc3QpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBnZXQgYW4gYXNzZXRcbiAgYXBwLmdldCgnL2FwaS9jbGFpbS9nZXQvOm5hbWUvOmNsYWltSWQnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBuYW1lID0gcGFyYW1zLm5hbWU7XG4gICAgY29uc3QgY2xhaW1JZCA9IHBhcmFtcy5jbGFpbUlkO1xuICAgIC8vIHJlc29sdmUgdGhlIGNsYWltXG4gICAgZGIuQ2xhaW0ucmVzb2x2ZUNsYWltKG5hbWUsIGNsYWltSWQpXG4gICAgICAudGhlbihyZXNvbHZlUmVzdWx0ID0+IHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGEgY2xhaW0gYWN0dWFsbHkgZXhpc3RzIGF0IHRoYXQgdXJpXG4gICAgICAgIGlmICghcmVzb2x2ZVJlc3VsdCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbWF0Y2hpbmcgdXJpIGZvdW5kIGluIENsYWltIHRhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVEYXRhID0gY3JlYXRlRmlsZURhdGEocmVzb2x2ZVJlc3VsdCk7XG4gICAgICAgIC8vIGdldCB0aGUgY2xhaW1cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtmaWxlRGF0YSwgZ2V0Q2xhaW0oYCR7bmFtZX0jJHtjbGFpbUlkfWApXSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKFsgZmlsZURhdGEsIGdldFJlc3VsdCBdKSA9PiB7XG4gICAgICAgIGZpbGVEYXRhID0gYWRkR2V0UmVzdWx0c1RvRmlsZURhdGEoZmlsZURhdGEsIGdldFJlc3VsdCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbZGIudXBzZXJ0KGRiLkZpbGUsIGZpbGVEYXRhLCB7bmFtZSwgY2xhaW1JZH0sICdGaWxlJyksIGdldFJlc3VsdF0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChbIGZpbGVSZWNvcmQsIHttZXNzYWdlLCBjb21wbGV0ZWR9IF0pID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBtZXNzYWdlLCBjb21wbGV0ZWQgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBzaXRlIHB1Ymxpc2hlZCB0byBhIGNsYWltXG4gIGFwcC5nZXQoJy9hcGkvY2xhaW0vYXZhaWxhYmlsaXR5LzpuYW1lJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBwYXJhbXM6IHsgbmFtZSB9IH0sIHJlcykgPT4ge1xuICAgIGNvbnN0IGdhU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjbGFpbU5hbWVJc0F2YWlsYWJsZShuYW1lKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24ocmVzdWx0KTtcbiAgICAgICAgc2VuZEdBVGltaW5nRXZlbnQoJ2VuZC10by1lbmQnLCAnY2xhaW0gbmFtZSBhdmFpbGFiaWxpdHknLCBuYW1lLCBnYVN0YXJ0VGltZSwgRGF0ZS5ub3coKSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIHJ1biBhIHJlc29sdmUgcmVxdWVzdCBvbiB0aGUgZGFlbW9uXG4gIGFwcC5nZXQoJy9hcGkvY2xhaW0vcmVzb2x2ZS86bmFtZS86Y2xhaW1JZCcsICh7IGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIHJlc29sdmVVcmkoYCR7cGFyYW1zLm5hbWV9IyR7cGFyYW1zLmNsYWltSWR9YClcbiAgICAgIC50aGVuKHJlc29sdmVkVXJpID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24ocmVzb2x2ZWRVcmkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBydW4gYSBwdWJsaXNoIHJlcXVlc3Qgb24gdGhlIGRhZW1vblxuICBhcHAucG9zdCgnL2FwaS9jbGFpbS9wdWJsaXNoJywgbXVsdGlwYXJ0TWlkZGxld2FyZSwgKHsgYm9keSwgZmlsZXMsIGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCwgdXNlciB9LCByZXMpID0+IHtcbiAgICAvLyBkZWZpbmUgdmFyaWFibGVzXG4gICAgbGV0ICBjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBjaGFubmVsUGFzc3dvcmQsIGRlc2NyaXB0aW9uLCBmaWxlTmFtZSwgZmlsZVBhdGgsIGZpbGVUeXBlLCBnYVN0YXJ0VGltZSwgbGljZW5zZSwgbmFtZSwgbnNmdywgdGh1bWJuYWlsLCB0aHVtYm5haWxGaWxlTmFtZSwgdGh1bWJuYWlsRmlsZVBhdGgsIHRodW1ibmFpbEZpbGVUeXBlLCB0aXRsZTtcbiAgICAvLyByZWNvcmQgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHJlcXVlc3RcbiAgICBnYVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgLy8gdmFsaWRhdGUgdGhlIGJvZHkgYW5kIGZpbGVzIG9mIHRoZSByZXF1ZXN0XG4gICAgdHJ5IHtcbiAgICAgIC8vIHZhbGlkYXRlQXBpUHVibGlzaFJlcXVlc3QoYm9keSwgZmlsZXMpO1xuICAgICAgKHtuYW1lLCBuc2Z3LCBsaWNlbnNlLCB0aXRsZSwgZGVzY3JpcHRpb24sIHRodW1ibmFpbH0gPSBwYXJzZVB1Ymxpc2hBcGlSZXF1ZXN0Qm9keShib2R5KSk7XG4gICAgICAoe2ZpbGVOYW1lLCBmaWxlUGF0aCwgZmlsZVR5cGUsIHRodW1ibmFpbEZpbGVOYW1lLCB0aHVtYm5haWxGaWxlUGF0aCwgdGh1bWJuYWlsRmlsZVR5cGV9ID0gcGFyc2VQdWJsaXNoQXBpUmVxdWVzdEZpbGVzKGZpbGVzKSk7XG4gICAgICAoe2NoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGNoYW5uZWxQYXNzd29yZH0gPSBib2R5KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgICAvLyBjaGVjayBjaGFubmVsIGF1dGhvcml6YXRpb25cbiAgICBQcm9taXNlLmFsbChbXG4gICAgICBhdXRoZW50aWNhdGVVc2VyKGNoYW5uZWxOYW1lLCBjaGFubmVsSWQsIGNoYW5uZWxQYXNzd29yZCwgdXNlciksXG4gICAgICBjbGFpbU5hbWVJc0F2YWlsYWJsZShuYW1lKSxcbiAgICAgIGNyZWF0ZUJhc2ljUHVibGlzaFBhcmFtcyhmaWxlUGF0aCwgbmFtZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsaWNlbnNlLCBuc2Z3LCB0aHVtYm5haWwpLFxuICAgICAgY3JlYXRlVGh1bWJuYWlsUHVibGlzaFBhcmFtcyh0aHVtYm5haWxGaWxlUGF0aCwgbmFtZSwgbGljZW5zZSwgbnNmdyksXG4gICAgXSlcbiAgICAgIC50aGVuKChbe2NoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZH0sIHZhbGlkYXRlZENsYWltTmFtZSwgcHVibGlzaFBhcmFtcywgdGh1bWJuYWlsUHVibGlzaFBhcmFtc10pID0+IHtcbiAgICAgICAgLy8gYWRkIGNoYW5uZWwgZGV0YWlscyB0byB0aGUgcHVibGlzaCBwYXJhbXNcbiAgICAgICAgaWYgKGNoYW5uZWxOYW1lICYmIGNoYW5uZWxDbGFpbUlkKSB7XG4gICAgICAgICAgcHVibGlzaFBhcmFtc1snY2hhbm5lbF9uYW1lJ10gPSBjaGFubmVsTmFtZTtcbiAgICAgICAgICBwdWJsaXNoUGFyYW1zWydjaGFubmVsX2lkJ10gPSBjaGFubmVsQ2xhaW1JZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBwdWJsaXNoIHRoZSB0aHVtYm5haWxcbiAgICAgICAgaWYgKHRodW1ibmFpbFB1Ymxpc2hQYXJhbXMpIHtcbiAgICAgICAgICBwdWJsaXNoKHRodW1ibmFpbFB1Ymxpc2hQYXJhbXMsIHRodW1ibmFpbEZpbGVOYW1lLCB0aHVtYm5haWxGaWxlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHVibGlzaCB0aGUgYXNzZXRcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2gocHVibGlzaFBhcmFtcywgZmlsZU5hbWUsIGZpbGVUeXBlKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiAncHVibGlzaCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAgICAgICBkYXRhICAgOiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgY2xhaW1JZDogcmVzdWx0LmNsYWltX2lkLFxuICAgICAgICAgICAgdXJsICAgIDogYCR7aG9zdH0vJHtyZXN1bHQuY2xhaW1faWR9LyR7bmFtZX1gLFxuICAgICAgICAgICAgbGJyeVR4IDogcmVzdWx0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyByZWNvcmQgdGhlIHB1Ymxpc2ggZW5kIHRpbWUgYW5kIHNlbmQgdG8gZ29vZ2xlIGFuYWx5dGljc1xuICAgICAgICBzZW5kR0FUaW1pbmdFdmVudCgnZW5kLXRvLWVuZCcsICdwdWJsaXNoJywgZmlsZVR5cGUsIGdhU3RhcnRUaW1lLCBEYXRlLm5vdygpKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gZ2V0IGEgc2hvcnQgY2xhaW0gaWQgZnJvbSBsb25nIGNsYWltIElkXG4gIGFwcC5nZXQoJy9hcGkvY2xhaW0vc2hvcnQtaWQvOmxvbmdJZC86bmFtZScsICh7IGlwLCBvcmlnaW5hbFVybCwgYm9keSwgcGFyYW1zIH0sIHJlcykgPT4ge1xuICAgIGRiLkNsYWltLmdldFNob3J0Q2xhaW1JZEZyb21Mb25nQ2xhaW1JZChwYXJhbXMubG9uZ0lkLCBwYXJhbXMubmFtZSlcbiAgICAgIC50aGVuKHNob3J0SWQgPT4ge1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YTogc2hvcnRJZH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9ySGFuZGxlcnMuaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgfSk7XG4gIH0pO1xuICBhcHAucG9zdCgnL2FwaS9jbGFpbS9sb25nLWlkJywgKHsgaXAsIG9yaWdpbmFsVXJsLCBib2R5LCBwYXJhbXMgfSwgcmVzKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKCdib2R5OicsIGJvZHkpO1xuICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gYm9keS5jaGFubmVsTmFtZTtcbiAgICBjb25zdCBjaGFubmVsQ2xhaW1JZCA9IGJvZHkuY2hhbm5lbENsYWltSWQ7XG4gICAgY29uc3QgY2xhaW1OYW1lID0gYm9keS5jbGFpbU5hbWU7XG4gICAgY29uc3QgY2xhaW1JZCA9IGJvZHkuY2xhaW1JZDtcbiAgICBnZXRDbGFpbUlkKGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgY2xhaW1OYW1lLCBjbGFpbUlkKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gTk9fQ0hBTk5FTCkge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdObyBtYXRjaGluZyBjaGFubmVsIGNvdWxkIGJlIGZvdW5kJ30pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgPT09IE5PX0NMQUlNKSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ05vIG1hdGNoaW5nIGNsYWltIGlkIGNvdWxkIGJlIGZvdW5kJ30pO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHR9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgYXBwLmdldCgnL2FwaS9jbGFpbS9kYXRhLzpjbGFpbU5hbWUvOmNsYWltSWQnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIGJvZHksIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBjbGFpbU5hbWUgPSBwYXJhbXMuY2xhaW1OYW1lO1xuICAgIGxldCBjbGFpbUlkID0gcGFyYW1zLmNsYWltSWQ7XG4gICAgaWYgKGNsYWltSWQgPT09ICdub25lJykgY2xhaW1JZCA9IG51bGw7XG4gICAgZGIuQ2xhaW0ucmVzb2x2ZUNsYWltKGNsYWltTmFtZSwgY2xhaW1JZClcbiAgICAgIC50aGVuKGNsYWltSW5mbyA9PiB7XG4gICAgICAgIGlmICghY2xhaW1JbmZvKSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogJ05vIGNsYWltIGNvdWxkIGJlIGZvdW5kJ30pO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiBjbGFpbUluZm99KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvckhhbmRsZXJzLmhhbmRsZUVycm9yUmVzcG9uc2Uob3JpZ2luYWxVcmwsIGlwLCBlcnJvciwgcmVzKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gc2VlIGlmIGFzc2V0IGlzIGF2YWlsYWJsZSBsb2NhbGx5XG4gIGFwcC5nZXQoJy9hcGkvZmlsZS9hdmFpbGFiaWxpdHkvOm5hbWUvOmNsYWltSWQnLCAoeyBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBuYW1lID0gcGFyYW1zLm5hbWU7XG4gICAgY29uc3QgY2xhaW1JZCA9IHBhcmFtcy5jbGFpbUlkO1xuICAgIGRiLkZpbGUuZmluZE9uZSh7d2hlcmU6IHtuYW1lLCBjbGFpbUlkfX0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiB0cnVlfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGE6IGZhbHNlfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5oYW5kbGVFcnJvclJlc3BvbnNlKG9yaWdpbmFsVXJsLCBpcCwgZXJyb3IsIHJlcyk7XG4gICAgICB9KTtcbiAgfSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3JvdXRlcy9hcGktcm91dGVzLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29ubmVjdC1tdWx0aXBhcnR5XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiY29ubmVjdC1tdWx0aXBhcnR5XCJcbi8vIG1vZHVsZSBpZCA9IDE0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJjb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5jb25zdCBkYiA9IHJlcXVpcmUoJy4uL21vZGVscy9pbmRleCcpO1xuY29uc3QgbGJyeUFwaSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvbGJyeUFwaS5qcycpO1xuY29uc3QgcHVibGlzaEhlbHBlcnMgPSByZXF1aXJlKCcuLi9oZWxwZXJzL3B1Ymxpc2hIZWxwZXJzLmpzJyk7XG5jb25zdCB7IHB1Ymxpc2hpbmc6IHsgcHJpbWFyeUNsYWltQWRkcmVzcywgYWRkaXRpb25hbENsYWltQWRkcmVzc2VzIH0gfSA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5jb25zdCBTZXF1ZWxpemUgPSByZXF1aXJlKCdzZXF1ZWxpemUnKTtcbmNvbnN0IE9wID0gU2VxdWVsaXplLk9wO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcHVibGlzaCAocHVibGlzaFBhcmFtcywgZmlsZU5hbWUsIGZpbGVUeXBlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBwdWJsaXNoUmVzdWx0cywgY2VydGlmaWNhdGVJZCwgY2hhbm5lbE5hbWU7XG4gICAgICAvLyBwdWJsaXNoIHRoZSBmaWxlXG4gICAgICByZXR1cm4gbGJyeUFwaS5wdWJsaXNoQ2xhaW0ocHVibGlzaFBhcmFtcylcbiAgICAgICAgLnRoZW4odHggPT4ge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgcHVibGlzaGVkICR7cHVibGlzaFBhcmFtcy5uYW1lfSAke2ZpbGVOYW1lfWAsIHR4KTtcbiAgICAgICAgICBwdWJsaXNoUmVzdWx0cyA9IHR4O1xuICAgICAgICAgIC8vIGdldCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvblxuICAgICAgICAgIGlmIChwdWJsaXNoUGFyYW1zLmNoYW5uZWxfbmFtZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGB0aGlzIGNsYWltIHdhcyBwdWJsaXNoZWQgaW4gY2hhbm5lbDogJHtwdWJsaXNoUGFyYW1zLmNoYW5uZWxfbmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBkYi5DaGFubmVsLmZpbmRPbmUoe3doZXJlOiB7Y2hhbm5lbE5hbWU6IHB1Ymxpc2hQYXJhbXMuY2hhbm5lbF9uYW1lfX0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ3RoaXMgY2xhaW0gd2FzIG5vdCBwdWJsaXNoZWQgaW4gYSBjaGFubmVsJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGNoYW5uZWwgPT4ge1xuICAgICAgICAvLyBzZXQgY2hhbm5lbCBpbmZvcm1hdGlvblxuICAgICAgICAgIGNlcnRpZmljYXRlSWQgPSBudWxsO1xuICAgICAgICAgIGNoYW5uZWxOYW1lID0gbnVsbDtcbiAgICAgICAgICBpZiAoY2hhbm5lbCkge1xuICAgICAgICAgICAgY2VydGlmaWNhdGVJZCA9IGNoYW5uZWwuY2hhbm5lbENsYWltSWQ7XG4gICAgICAgICAgICBjaGFubmVsTmFtZSA9IGNoYW5uZWwuY2hhbm5lbE5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgY2VydGlmaWNhdGVJZDogJHtjZXJ0aWZpY2F0ZUlkfWApO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgRmlsZSByZWNvcmRcbiAgICAgICAgICBjb25zdCBmaWxlUmVjb3JkID0ge1xuICAgICAgICAgICAgbmFtZSAgICAgICA6IHB1Ymxpc2hQYXJhbXMubmFtZSxcbiAgICAgICAgICAgIGNsYWltSWQgICAgOiBwdWJsaXNoUmVzdWx0cy5jbGFpbV9pZCxcbiAgICAgICAgICAgIHRpdGxlICAgICAgOiBwdWJsaXNoUGFyYW1zLm1ldGFkYXRhLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHB1Ymxpc2hQYXJhbXMubWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBhZGRyZXNzICAgIDogcHVibGlzaFBhcmFtcy5jbGFpbV9hZGRyZXNzLFxuICAgICAgICAgICAgb3V0cG9pbnQgICA6IGAke3B1Ymxpc2hSZXN1bHRzLnR4aWR9OiR7cHVibGlzaFJlc3VsdHMubm91dH1gLFxuICAgICAgICAgICAgaGVpZ2h0ICAgICA6IDAsXG4gICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgIGZpbGVQYXRoICAgOiBwdWJsaXNoUGFyYW1zLmZpbGVfcGF0aCxcbiAgICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICAgICAgbnNmdyAgICAgICA6IHB1Ymxpc2hQYXJhbXMubWV0YWRhdGEubnNmdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgQ2xhaW0gcmVjb3JkXG4gICAgICAgICAgY29uc3QgY2xhaW1SZWNvcmQgPSB7XG4gICAgICAgICAgICBuYW1lICAgICAgIDogcHVibGlzaFBhcmFtcy5uYW1lLFxuICAgICAgICAgICAgY2xhaW1JZCAgICA6IHB1Ymxpc2hSZXN1bHRzLmNsYWltX2lkLFxuICAgICAgICAgICAgdGl0bGUgICAgICA6IHB1Ymxpc2hQYXJhbXMubWV0YWRhdGEudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGFkZHJlc3MgICAgOiBwdWJsaXNoUGFyYW1zLmNsYWltX2FkZHJlc3MsXG4gICAgICAgICAgICB0aHVtYm5haWwgIDogcHVibGlzaFBhcmFtcy5tZXRhZGF0YS50aHVtYm5haWwsXG4gICAgICAgICAgICBvdXRwb2ludCAgIDogYCR7cHVibGlzaFJlc3VsdHMudHhpZH06JHtwdWJsaXNoUmVzdWx0cy5ub3V0fWAsXG4gICAgICAgICAgICBoZWlnaHQgICAgIDogMCxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBmaWxlVHlwZSxcbiAgICAgICAgICAgIG5zZncgICAgICAgOiBwdWJsaXNoUGFyYW1zLm1ldGFkYXRhLm5zZncsXG4gICAgICAgICAgICBhbW91bnQgICAgIDogcHVibGlzaFBhcmFtcy5iaWQsXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZUlkLFxuICAgICAgICAgICAgY2hhbm5lbE5hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyB1cHNlcnQgY3JpdGVyaWFcbiAgICAgICAgICBjb25zdCB1cHNlcnRDcml0ZXJpYSA9IHtcbiAgICAgICAgICAgIG5hbWUgICA6IHB1Ymxpc2hQYXJhbXMubmFtZSxcbiAgICAgICAgICAgIGNsYWltSWQ6IHB1Ymxpc2hSZXN1bHRzLmNsYWltX2lkLFxuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gdXBzZXJ0IHRoZSByZWNvcmRzXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtkYi51cHNlcnQoZGIuRmlsZSwgZmlsZVJlY29yZCwgdXBzZXJ0Q3JpdGVyaWEsICdGaWxlJyksIGRiLnVwc2VydChkYi5DbGFpbSwgY2xhaW1SZWNvcmQsIHVwc2VydENyaXRlcmlhLCAnQ2xhaW0nKV0pO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbigoW2ZpbGUsIGNsYWltXSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmlsZSBhbmQgQ2xhaW0gcmVjb3JkcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCcpO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbZmlsZS5zZXRDbGFpbShjbGFpbSksIGNsYWltLnNldEZpbGUoZmlsZSldKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmlsZSBhbmQgQ2xhaW0gcmVjb3JkcyBzdWNjZXNzZnVsbHkgYXNzb2NpYXRlZCcpO1xuICAgICAgICAgIHJlc29sdmUocHVibGlzaFJlc3VsdHMpOyAvLyByZXNvbHZlIHRoZSBwcm9taXNlIHdpdGggdGhlIHJlc3VsdCBmcm9tIGxicnlBcGkucHVibGlzaENsYWltO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignUFVCTElTSCBFUlJPUicsIGVycm9yKTtcbiAgICAgICAgICBwdWJsaXNoSGVscGVycy5kZWxldGVUZW1wb3JhcnlGaWxlKHB1Ymxpc2hQYXJhbXMuZmlsZV9wYXRoKTsgLy8gZGVsZXRlIHRoZSBsb2NhbCBmaWxlXG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGNsYWltTmFtZUlzQXZhaWxhYmxlIChuYW1lKSB7XG4gICAgY29uc3QgY2xhaW1BZGRyZXNzZXMgPSBhZGRpdGlvbmFsQ2xhaW1BZGRyZXNzZXMgfHwgW107XG4gICAgY2xhaW1BZGRyZXNzZXMucHVzaChwcmltYXJ5Q2xhaW1BZGRyZXNzKTtcbiAgICAvLyBmaW5kIGFueSByZWNvcmRzIHdoZXJlIHRoZSBuYW1lIGlzIHVzZWRcbiAgICByZXR1cm4gZGIuQ2xhaW1cbiAgICAgIC5maW5kQWxsKHtcbiAgICAgICAgYXR0cmlidXRlczogWydhZGRyZXNzJ10sXG4gICAgICAgIHdoZXJlICAgICA6IHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGFkZHJlc3M6IHtcbiAgICAgICAgICAgIFtPcC5vcl06IGNsYWltQWRkcmVzc2VzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhhdCBjbGFpbSBpcyBhbHJlYWR5IGluIHVzZScpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICB9LFxuICBjaGVja0NoYW5uZWxBdmFpbGFiaWxpdHkgKG5hbWUpIHtcbiAgICByZXR1cm4gZGIuQ2hhbm5lbFxuICAgICAgLmZpbmRBbGwoe1xuICAgICAgICB3aGVyZTogeyBjaGFubmVsTmFtZTogbmFtZSB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoYXQgY2hhbm5lbCBoYXMgYWxyZWFkeSBiZWVuIGNsYWltZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9jb250cm9sbGVycy9wdWJsaXNoQ29udHJvbGxlci5qcyIsImNvbnN0IGRiID0gcmVxdWlyZSgnLi4vbW9kZWxzJyk7XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCd3aW5zdG9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhdXRoZW50aWNhdGVVc2VyIChjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBjaGFubmVsUGFzc3dvcmQsIHVzZXIpIHtcbiAgICAvLyBjYXNlOiBubyBjaGFubmVsTmFtZSBvciBjaGFubmVsIElkIGFyZSBwcm92aWRlZCAoYW5vbnltb3VzKSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVzZXIgdG9rZW4gaXMgcHJvdmlkZWRcbiAgICBpZiAoIWNoYW5uZWxOYW1lICYmICFjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5uZWxOYW1lICAgOiBudWxsLFxuICAgICAgICBjaGFubmVsQ2xhaW1JZDogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIGNhc2U6IGNoYW5uZWxOYW1lIG9yIGNoYW5uZWwgSWQgYXJlIHByb3ZpZGVkIHdpdGggdXNlciB0b2tlblxuICAgIGlmICh1c2VyKSB7XG4gICAgICBpZiAoY2hhbm5lbE5hbWUgJiYgY2hhbm5lbE5hbWUgIT09IHVzZXIuY2hhbm5lbE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgcHJvdmlkZWQgY2hhbm5lbCBuYW1lIGRvZXMgbm90IG1hdGNoIHVzZXIgY3JlZGVudGlhbHMnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFubmVsSWQgJiYgY2hhbm5lbElkICE9PSB1c2VyLmNoYW5uZWxDbGFpbUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHByb3ZpZGVkIGNoYW5uZWwgaWQgZG9lcyBub3QgbWF0Y2ggdXNlciBjcmVkZW50aWFscycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbm5lbE5hbWUgICA6IHVzZXIuY2hhbm5lbE5hbWUsXG4gICAgICAgIGNoYW5uZWxDbGFpbUlkOiB1c2VyLmNoYW5uZWxDbGFpbUlkLFxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gY2FzZTogY2hhbm5lbE5hbWUgb3IgY2hhbm5lbCBJZCBhcmUgcHJvdmlkZWQgd2l0aCBwYXNzd29yZCBpbnN0ZWFkIG9mIHVzZXIgdG9rZW5cbiAgICBpZiAoIWNoYW5uZWxQYXNzd29yZCkgdGhyb3cgbmV3IEVycm9yKCdubyBjaGFubmVsIHBhc3N3b3JkIHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmF1dGhlbnRpY2F0ZUNoYW5uZWxDcmVkZW50aWFscyhjaGFubmVsTmFtZSwgY2hhbm5lbElkLCBjaGFubmVsUGFzc3dvcmQpO1xuICB9LFxuICBhdXRoZW50aWNhdGVDaGFubmVsQ3JlZGVudGlhbHMgKGNoYW5uZWxOYW1lLCBjaGFubmVsSWQsIHVzZXJQYXNzd29yZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBob2lzdGVkIHZhcmlhYmxlc1xuICAgICAgbGV0IGNoYW5uZWxEYXRhO1xuICAgICAgLy8gYnVpbGQgdGhlIHBhcmFtcyBmb3IgZmluZGluZyB0aGUgY2hhbm5lbFxuICAgICAgbGV0IGNoYW5uZWxGaW5kUGFyYW1zID0ge307XG4gICAgICBpZiAoY2hhbm5lbE5hbWUpIGNoYW5uZWxGaW5kUGFyYW1zWydjaGFubmVsTmFtZSddID0gY2hhbm5lbE5hbWU7XG4gICAgICBpZiAoY2hhbm5lbElkKSBjaGFubmVsRmluZFBhcmFtc1snY2hhbm5lbENsYWltSWQnXSA9IGNoYW5uZWxJZDtcbiAgICAgIC8vIGZpbmQgdGhlIGNoYW5uZWxcbiAgICAgIGRiLkNoYW5uZWxcbiAgICAgICAgLmZpbmRPbmUoe1xuICAgICAgICAgIHdoZXJlOiBjaGFubmVsRmluZFBhcmFtcyxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oY2hhbm5lbCA9PiB7XG4gICAgICAgICAgaWYgKCFjaGFubmVsKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ25vIGNoYW5uZWwgZm91bmQnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkLCB5b3UgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoYXQgY2hhbm5lbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFubmVsRGF0YSA9IGNoYW5uZWwuZ2V0KCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdjaGFubmVsIGRhdGE6JywgY2hhbm5lbERhdGEpO1xuICAgICAgICAgIHJldHVybiBkYi5Vc2VyLmZpbmRPbmUoe1xuICAgICAgICAgICAgd2hlcmU6IHsgdXNlck5hbWU6IGNoYW5uZWxEYXRhLmNoYW5uZWxOYW1lLnN1YnN0cmluZygxKSB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbih1c2VyID0+IHtcbiAgICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnbm8gdXNlciBmb3VuZCcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiBmYWlsZWQsIHlvdSBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhhdCBjaGFubmVsJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1c2VyLmNvbXBhcmVQYXNzd29yZCh1c2VyUGFzc3dvcmQpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihpc01hdGNoID0+IHtcbiAgICAgICAgICBpZiAoIWlzTWF0Y2gpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnaW5jb3JyZWN0IHBhc3N3b3JkJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCwgeW91IGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGF0IGNoYW5uZWwnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCcuLi5wYXNzd29yZCB3YXMgYSBtYXRjaC4uLicpO1xuICAgICAgICAgIHJlc29sdmUoY2hhbm5lbERhdGEpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9hdXRoL2F1dGhlbnRpY2F0aW9uLmpzIiwiY29uc3QgQ0xBSU1TX1BFUl9QQUdFID0gMTI7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZXR1cm5QYWdpbmF0ZWRDaGFubmVsQ2xhaW1zIChjaGFubmVsTmFtZSwgbG9uZ0NoYW5uZWxDbGFpbUlkLCBjbGFpbXMsIHBhZ2UpIHtcbiAgICBjb25zdCB0b3RhbFBhZ2VzID0gbW9kdWxlLmV4cG9ydHMuZGV0ZXJtaW5lVG90YWxQYWdlcyhjbGFpbXMpO1xuICAgIGNvbnN0IHBhZ2luYXRpb25QYWdlID0gbW9kdWxlLmV4cG9ydHMuZ2V0UGFnZUZyb21RdWVyeShwYWdlKTtcbiAgICBjb25zdCB2aWV3RGF0YSA9IHtcbiAgICAgIGNoYW5uZWxOYW1lICAgICAgIDogY2hhbm5lbE5hbWUsXG4gICAgICBsb25nQ2hhbm5lbENsYWltSWQ6IGxvbmdDaGFubmVsQ2xhaW1JZCxcbiAgICAgIGNsYWltcyAgICAgICAgICAgIDogbW9kdWxlLmV4cG9ydHMuZXh0cmFjdFBhZ2VGcm9tQ2xhaW1zKGNsYWltcywgcGFnaW5hdGlvblBhZ2UpLFxuICAgICAgcHJldmlvdXNQYWdlICAgICAgOiBtb2R1bGUuZXhwb3J0cy5kZXRlcm1pbmVQcmV2aW91c1BhZ2UocGFnaW5hdGlvblBhZ2UpLFxuICAgICAgY3VycmVudFBhZ2UgICAgICAgOiBwYWdpbmF0aW9uUGFnZSxcbiAgICAgIG5leHRQYWdlICAgICAgICAgIDogbW9kdWxlLmV4cG9ydHMuZGV0ZXJtaW5lTmV4dFBhZ2UodG90YWxQYWdlcywgcGFnaW5hdGlvblBhZ2UpLFxuICAgICAgdG90YWxQYWdlcyAgICAgICAgOiB0b3RhbFBhZ2VzLFxuICAgICAgdG90YWxSZXN1bHRzICAgICAgOiBtb2R1bGUuZXhwb3J0cy5kZXRlcm1pbmVUb3RhbENsYWltcyhjbGFpbXMpLFxuICAgIH07XG4gICAgcmV0dXJuIHZpZXdEYXRhO1xuICB9LFxuICBnZXRQYWdlRnJvbVF1ZXJ5IChwYWdlKSB7XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIHJldHVybiBwYXJzZUludChwYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIGV4dHJhY3RQYWdlRnJvbUNsYWltcyAoY2xhaW1zLCBwYWdlTnVtYmVyKSB7XG4gICAgaWYgKCFjbGFpbXMpIHtcbiAgICAgIHJldHVybiBbXTsgIC8vIGlmIG5vIGNsYWltcywgcmV0dXJuIHRoaXMgZGVmYXVsdFxuICAgIH1cbiAgICAvLyBsb2dnZXIuZGVidWcoJ2NsYWltcyBpcyBhcnJheT8nLCBBcnJheS5pc0FycmF5KGNsYWltcykpO1xuICAgIC8vIGxvZ2dlci5kZWJ1ZyhgcGFnZU51bWJlciAke3BhZ2VOdW1iZXJ9IGlzIG51bWJlcj9gLCBOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VOdW1iZXIpKTtcbiAgICBjb25zdCBjbGFpbVN0YXJ0SW5kZXggPSAocGFnZU51bWJlciAtIDEpICogQ0xBSU1TX1BFUl9QQUdFO1xuICAgIGNvbnN0IGNsYWltRW5kSW5kZXggPSBjbGFpbVN0YXJ0SW5kZXggKyBDTEFJTVNfUEVSX1BBR0U7XG4gICAgY29uc3QgcGFnZU9mQ2xhaW1zID0gY2xhaW1zLnNsaWNlKGNsYWltU3RhcnRJbmRleCwgY2xhaW1FbmRJbmRleCk7XG4gICAgcmV0dXJuIHBhZ2VPZkNsYWltcztcbiAgfSxcbiAgZGV0ZXJtaW5lVG90YWxQYWdlcyAoY2xhaW1zKSB7XG4gICAgaWYgKCFjbGFpbXMpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b3RhbENsYWltcyA9IGNsYWltcy5sZW5ndGg7XG4gICAgICBpZiAodG90YWxDbGFpbXMgPCBDTEFJTVNfUEVSX1BBR0UpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBjb25zdCBmdWxsUGFnZXMgPSBNYXRoLmZsb29yKHRvdGFsQ2xhaW1zIC8gQ0xBSU1TX1BFUl9QQUdFKTtcbiAgICAgIGNvbnN0IHJlbWFpbmRlciA9IHRvdGFsQ2xhaW1zICUgQ0xBSU1TX1BFUl9QQUdFO1xuICAgICAgaWYgKHJlbWFpbmRlciA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZnVsbFBhZ2VzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bGxQYWdlcyArIDE7XG4gICAgfVxuICB9LFxuICBkZXRlcm1pbmVQcmV2aW91c1BhZ2UgKGN1cnJlbnRQYWdlKSB7XG4gICAgaWYgKGN1cnJlbnRQYWdlID09PSAxKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRQYWdlIC0gMTtcbiAgfSxcbiAgZGV0ZXJtaW5lTmV4dFBhZ2UgKHRvdGFsUGFnZXMsIGN1cnJlbnRQYWdlKSB7XG4gICAgaWYgKGN1cnJlbnRQYWdlID09PSB0b3RhbFBhZ2VzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRQYWdlICsgMTtcbiAgfSxcbiAgZGV0ZXJtaW5lVG90YWxDbGFpbXMgKGNsYWltcykge1xuICAgIGlmICghY2xhaW1zKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGNsYWltcy5sZW5ndGg7XG4gIH0sXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL2hlbHBlcnMvY2hhbm5lbFBhZ2luYXRpb24uanMiLCJjb25zdCB7IGRldGFpbHM6IGhvc3QgfSA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9zaXRlQ29uZmlnLmpzJyk7XG5jb25zdCBoYW5kbGVQYWdlUmVuZGVyID0gcmVxdWlyZSgnLi4vaGVscGVycy9oYW5kbGVQYWdlUmVuZGVyLmpzeCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChhcHApID0+IHtcbiAgLy8gcm91dGUgZm9yIHRoZSBob21lIHBhZ2VcbiAgYXBwLmdldCgnLycsIChyZXEsIHJlcykgPT4ge1xuICAgIGhhbmRsZVBhZ2VSZW5kZXIocmVxLCByZXMpO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gZGlzcGxheSBsb2dpbiBwYWdlXG4gIGFwcC5nZXQoJy9sb2dpbicsIChyZXEsIHJlcykgPT4ge1xuICAgIGhhbmRsZVBhZ2VSZW5kZXIocmVxLCByZXMpO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gc2hvdyAnYWJvdXQnIHBhZ2VcbiAgYXBwLmdldCgnL2Fib3V0JywgKHJlcSwgcmVzKSA9PiB7XG4gICAgaGFuZGxlUGFnZVJlbmRlcihyZXEsIHJlcyk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBkaXNwbGF5IGEgbGlzdCBvZiB0aGUgdHJlbmRpbmcgaW1hZ2VzXG4gIGFwcC5nZXQoJy90cmVuZGluZycsIChyZXEsIHJlcykgPT4ge1xuICAgIHJlcy5zdGF0dXMoMzAxKS5yZWRpcmVjdCgnL3BvcHVsYXInKTtcbiAgfSk7XG4gIGFwcC5nZXQoJy9wb3B1bGFyJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgaGFuZGxlUGFnZVJlbmRlcihyZXEsIHJlcyk7XG4gIH0pO1xuICAvLyByb3V0ZSB0byBkaXNwbGF5IGEgbGlzdCBvZiB0aGUgdHJlbmRpbmcgaW1hZ2VzXG4gIGFwcC5nZXQoJy9uZXcnLCAocmVxLCByZXMpID0+IHtcbiAgICBoYW5kbGVQYWdlUmVuZGVyKHJlcSwgcmVzKTtcbiAgfSk7XG4gIC8vIHJvdXRlIHRvIHNlbmQgZW1iZWRhYmxlIHZpZGVvIHBsYXllciAoZm9yIHR3aXR0ZXIpXG4gIGFwcC5nZXQoJy9lbWJlZC86Y2xhaW1JZC86bmFtZScsICh7IHBhcmFtcyB9LCByZXMpID0+IHtcbiAgICBjb25zdCBjbGFpbUlkID0gcGFyYW1zLmNsYWltSWQ7XG4gICAgY29uc3QgbmFtZSA9IHBhcmFtcy5uYW1lO1xuICAgIC8vIGdldCBhbmQgcmVuZGVyIHRoZSBjb250ZW50XG4gICAgcmVzLnN0YXR1cygyMDApLnJlbmRlcignZW1iZWQnLCB7IGxheW91dDogJ2VtYmVkJywgaG9zdCwgY2xhaW1JZCwgbmFtZSB9KTtcbiAgfSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3JvdXRlcy9wYWdlLXJvdXRlcy5qcyIsImltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3B1Ymxpc2hfYWN0aW9uX3R5cGVzJztcbmltcG9ydCB7IExPR0lOIH0gZnJvbSAnY29uc3RhbnRzL3B1Ymxpc2hfY2hhbm5lbF9zZWxlY3Rfc3RhdGVzJztcbmNvbnN0IHsgcHVibGlzaGluZyB9ID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnL3NpdGVDb25maWcuanMnKTtcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBkaXNhYmxlZCAgICAgICAgICA6IHB1Ymxpc2hpbmcuZGlzYWJsZWQsXG4gIGRpc2FibGVkTWVzc2FnZSAgIDogcHVibGlzaGluZy5kaXNhYmxlZE1lc3NhZ2UsXG4gIHB1Ymxpc2hJbkNoYW5uZWwgIDogZmFsc2UsXG4gIHNlbGVjdGVkQ2hhbm5lbCAgIDogTE9HSU4sXG4gIHNob3dNZXRhZGF0YUlucHV0czogZmFsc2UsXG4gIHN0YXR1cyAgICAgICAgICAgIDoge1xuICAgIHN0YXR1cyA6IG51bGwsXG4gICAgbWVzc2FnZTogbnVsbCxcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICBmaWxlICAgICAgICAgOiBudWxsLFxuICAgIHVybCAgICAgICAgICA6IG51bGwsXG4gICAgY2hhbm5lbCAgICAgIDogbnVsbCxcbiAgICBwdWJsaXNoU3VibWl0OiBudWxsLFxuICB9LFxuICBmaWxlICAgIDogbnVsbCxcbiAgY2xhaW0gICA6ICcnLFxuICBtZXRhZGF0YToge1xuICAgIHRpdGxlICAgICAgOiAnJyxcbiAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgbGljZW5zZSAgICA6ICcnLFxuICAgIG5zZncgICAgICAgOiBmYWxzZSxcbiAgfSxcbiAgdGh1bWJuYWlsOiBudWxsLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgYWN0aW9ucy5GSUxFX1NFTEVDVEVEOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGluaXRpYWxTdGF0ZSwgeyAgLy8gbm90ZTogY2xlYXJzIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgICAgZmlsZTogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuRklMRV9DTEVBUjpcbiAgICAgIHJldHVybiBpbml0aWFsU3RhdGU7XG4gICAgY2FzZSBhY3Rpb25zLk1FVEFEQVRBX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBtZXRhZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUubWV0YWRhdGEsIHtcbiAgICAgICAgICBbYWN0aW9uLmRhdGEubmFtZV06IGFjdGlvbi5kYXRhLnZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5DTEFJTV9VUERBVEU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgY2xhaW06IGFjdGlvbi5kYXRhLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLlNFVF9QVUJMSVNIX0lOX0NIQU5ORUw6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgcHVibGlzaEluQ2hhbm5lbDogYWN0aW9uLmNoYW5uZWwsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuUFVCTElTSF9TVEFUVVNfVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHN0YXR1czogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuRVJST1JfVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGVycm9yOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5lcnJvciwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5uYW1lXTogYWN0aW9uLmRhdGEudmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLlNFTEVDVEVEX0NIQU5ORUxfVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHNlbGVjdGVkQ2hhbm5lbDogYWN0aW9uLmRhdGEsXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuVE9HR0xFX01FVEFEQVRBX0lOUFVUUzpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBzaG93TWV0YWRhdGFJbnB1dHM6IGFjdGlvbi5kYXRhLFxuICAgICAgfSk7XG4gICAgY2FzZSBhY3Rpb25zLlRIVU1CTkFJTF9ORVc6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgdGh1bWJuYWlsOiBhY3Rpb24uZGF0YSxcbiAgICAgIH0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9yZWR1Y2Vycy9wdWJsaXNoLmpzIiwiaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvY2hhbm5lbF9hY3Rpb25fdHlwZXMnO1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGxvZ2dlZEluQ2hhbm5lbDoge1xuICAgIG5hbWUgICA6IG51bGwsXG4gICAgc2hvcnRJZDogbnVsbCxcbiAgICBsb25nSWQgOiBudWxsLFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgYWN0aW9ucy5DSEFOTkVMX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBsb2dnZWRJbkNoYW5uZWw6IGFjdGlvbi5kYXRhLFxuICAgICAgfSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3JlZHVjZXJzL2NoYW5uZWwuanMiLCJpbXBvcnQgKiBhcyBhY3Rpb25zIGZyb20gJ2NvbnN0YW50cy9zaG93X2FjdGlvbl90eXBlcyc7XG5pbXBvcnQgeyBMT0NBTF9DSEVDSywgRVJST1IgfSBmcm9tICdjb25zdGFudHMvYXNzZXRfZGlzcGxheV9zdGF0ZXMnO1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIHJlcXVlc3Q6IHtcbiAgICBlcnJvcjogbnVsbCxcbiAgICB0eXBlIDogbnVsbCxcbiAgICBpZCAgIDogbnVsbCxcbiAgfSxcbiAgcmVxdWVzdExpc3QgOiB7fSxcbiAgY2hhbm5lbExpc3QgOiB7fSxcbiAgYXNzZXRMaXN0ICAgOiB7fSxcbiAgZGlzcGxheUFzc2V0OiB7XG4gICAgZXJyb3IgOiBudWxsLFxuICAgIHN0YXR1czogTE9DQUxfQ0hFQ0ssXG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgLy8gaGFuZGxlIHJlcXVlc3RcbiAgICBjYXNlIGFjdGlvbnMuUkVRVUVTVF9FUlJPUjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICByZXF1ZXN0OiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZXF1ZXN0LCB7XG4gICAgICAgICAgZXJyb3I6IGFjdGlvbi5kYXRhLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5SRVFVRVNUX1VQREFURTpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICByZXF1ZXN0OiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZXF1ZXN0LCB7XG4gICAgICAgICAgdHlwZTogYWN0aW9uLmRhdGEucmVxdWVzdFR5cGUsXG4gICAgICAgICAgaWQgIDogYWN0aW9uLmRhdGEucmVxdWVzdElkLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIC8vIHN0b3JlIHJlcXVlc3RzXG4gICAgY2FzZSBhY3Rpb25zLlJFUVVFU1RfTElTVF9BREQ6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgcmVxdWVzdExpc3Q6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlcXVlc3RMaXN0LCB7XG4gICAgICAgICAgW2FjdGlvbi5kYXRhLmlkXToge1xuICAgICAgICAgICAgZXJyb3I6IGFjdGlvbi5kYXRhLmVycm9yLFxuICAgICAgICAgICAga2V5ICA6IGFjdGlvbi5kYXRhLmtleSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIC8vIGFzc2V0IGRhdGFcbiAgICBjYXNlIGFjdGlvbnMuQVNTRVRfQUREOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGFzc2V0TGlzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXNzZXRMaXN0LCB7XG4gICAgICAgICAgW2FjdGlvbi5kYXRhLmlkXToge1xuICAgICAgICAgICAgZXJyb3IgICAgOiBhY3Rpb24uZGF0YS5lcnJvcixcbiAgICAgICAgICAgIG5hbWUgICAgIDogYWN0aW9uLmRhdGEubmFtZSxcbiAgICAgICAgICAgIGNsYWltSWQgIDogYWN0aW9uLmRhdGEuY2xhaW1JZCxcbiAgICAgICAgICAgIHNob3J0SWQgIDogYWN0aW9uLmRhdGEuc2hvcnRJZCxcbiAgICAgICAgICAgIGNsYWltRGF0YTogYWN0aW9uLmRhdGEuY2xhaW1EYXRhLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgLy8gY2hhbm5lbCBkYXRhXG4gICAgY2FzZSBhY3Rpb25zLkNIQU5ORUxfQUREOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGNoYW5uZWxMaXN0OiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5jaGFubmVsTGlzdCwge1xuICAgICAgICAgIFthY3Rpb24uZGF0YS5pZF06IHtcbiAgICAgICAgICAgIG5hbWUgICAgICA6IGFjdGlvbi5kYXRhLm5hbWUsXG4gICAgICAgICAgICBsb25nSWQgICAgOiBhY3Rpb24uZGF0YS5sb25nSWQsXG4gICAgICAgICAgICBzaG9ydElkICAgOiBhY3Rpb24uZGF0YS5zaG9ydElkLFxuICAgICAgICAgICAgY2xhaW1zRGF0YTogYWN0aW9uLmRhdGEuY2xhaW1zRGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIGNhc2UgYWN0aW9ucy5DSEFOTkVMX0NMQUlNU19VUERBVEVfU1VDQ0VTUzpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBjaGFubmVsTGlzdDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuY2hhbm5lbExpc3QsIHtcbiAgICAgICAgICBbYWN0aW9uLmRhdGEuY2hhbm5lbExpc3RJZF06IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmNoYW5uZWxMaXN0W2FjdGlvbi5kYXRhLmNoYW5uZWxMaXN0SWRdLCB7XG4gICAgICAgICAgICBjbGFpbXNEYXRhOiBhY3Rpb24uZGF0YS5jbGFpbXNEYXRhLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIC8vIGRpc3BsYXkgYW4gYXNzZXRcbiAgICBjYXNlIGFjdGlvbnMuRklMRV9BVkFJTEFCSUxJVFlfVVBEQVRFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGRpc3BsYXlBc3NldDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZGlzcGxheUFzc2V0LCB7XG4gICAgICAgICAgc3RhdHVzOiBhY3Rpb24uZGF0YSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjYXNlIGFjdGlvbnMuRElTUExBWV9BU1NFVF9FUlJPUjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBkaXNwbGF5QXNzZXQ6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmRpc3BsYXlBc3NldCwge1xuICAgICAgICAgIGVycm9yIDogYWN0aW9uLmRhdGEsXG4gICAgICAgICAgc3RhdHVzOiBFUlJPUixcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvcmVkdWNlcnMvc2hvdy5qcyIsImNvbnN0IHNpdGVDb25maWcgPSByZXF1aXJlKCcuLi8uLi9jb25maWcvc2l0ZUNvbmZpZy5qcycpO1xuXG5jb25zdCB7XG4gIGFuYWx5dGljczoge1xuICAgIGdvb2dsZUlkOiBnb29nbGVBbmFseXRpY3NJZCxcbiAgfSxcbiAgYXNzZXREZWZhdWx0czoge1xuICAgIHRodW1ibmFpbDogZGVmYXVsdFRodW1ibmFpbCxcbiAgICBkZXNjcmlwdGlvbjogZGVmYXVsdERlc2NyaXB0aW9uLFxuICB9LFxuICBkZXRhaWxzOiB7XG4gICAgZGVzY3JpcHRpb24sXG4gICAgaG9zdCxcbiAgICB0aXRsZSxcbiAgICB0d2l0dGVyLFxuICB9LFxufSA9IHNpdGVDb25maWc7XG5cbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgZGVzY3JpcHRpb24sXG4gIGdvb2dsZUFuYWx5dGljc0lkLFxuICBob3N0LFxuICB0aXRsZSxcbiAgdHdpdHRlcixcbiAgZGVmYXVsdERlc2NyaXB0aW9uLFxuICBkZWZhdWx0VGh1bWJuYWlsLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9yZWR1Y2Vycy9zaXRlLmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtZ2FcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWFjdC1nYVwiXG4vLyBtb2R1bGUgaWQgPSAxNTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3Jvc3MtZmV0Y2gvcG9seWZpbGxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJjcm9zcy1mZXRjaC9wb2x5ZmlsbFwiXG4vLyBtb2R1bGUgaWQgPSAxNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiY29uc3QgeyBzZW5kR0FTZXJ2ZUV2ZW50IH0gPSByZXF1aXJlKCcuLi9oZWxwZXJzL2dvb2dsZUFuYWx5dGljcycpO1xuY29uc3QgeyBkZXRlcm1pbmVSZXNwb25zZVR5cGUsIGZsaXBDbGFpbU5hbWVBbmRJZEZvckJhY2t3YXJkc0NvbXBhdGliaWxpdHksIGxvZ1JlcXVlc3REYXRhLCBnZXRDbGFpbUlkQW5kU2VydmVBc3NldCB9ID0gcmVxdWlyZSgnLi4vaGVscGVycy9zZXJ2ZUhlbHBlcnMuanMnKTtcbmNvbnN0IGxicnlVcmkgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2xicnlVcmkuanMnKTtcbmNvbnN0IGhhbmRsZVNob3dSZW5kZXIgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2hhbmRsZVNob3dSZW5kZXIuanN4Jyk7XG5jb25zdCBTRVJWRSA9ICdTRVJWRSc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFwcCkgPT4ge1xuICAvLyByb3V0ZSB0byBzZXJ2ZSBhIHNwZWNpZmljIGFzc2V0IHVzaW5nIHRoZSBjaGFubmVsIG9yIGNsYWltIGlkXG4gIGFwcC5nZXQoJy86aWRlbnRpZmllci86Y2xhaW0nLCAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB7IGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCwgcGFyYW1zIH0gPSByZXE7XG4gICAgLy8gZGVjaWRlIGlmIHRoaXMgaXMgYSBzaG93IHJlcXVlc3RcbiAgICBsZXQgaGFzRmlsZUV4dGVuc2lvbjtcbiAgICB0cnkge1xuICAgICAgKHsgaGFzRmlsZUV4dGVuc2lvbiB9ID0gbGJyeVVyaS5wYXJzZU1vZGlmaWVyKHBhcmFtcy5jbGFpbSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICAgIGxldCByZXNwb25zZVR5cGUgPSBkZXRlcm1pbmVSZXNwb25zZVR5cGUoaGFzRmlsZUV4dGVuc2lvbiwgaGVhZGVycyk7XG4gICAgaWYgKHJlc3BvbnNlVHlwZSAhPT0gU0VSVkUpIHtcbiAgICAgIHJldHVybiBoYW5kbGVTaG93UmVuZGVyKHJlcSwgcmVzKTtcbiAgICB9XG4gICAgLy8gaGFuZGxlIHNlcnZlIHJlcXVlc3RcbiAgICAvLyBzZW5kIGdvb2dsZSBhbmFseXRpY3NcbiAgICBzZW5kR0FTZXJ2ZUV2ZW50KGhlYWRlcnMsIGlwLCBvcmlnaW5hbFVybCk7XG4gICAgLy8gcGFyc2UgdGhlIGNsYWltXG4gICAgbGV0IGNsYWltTmFtZTtcbiAgICB0cnkge1xuICAgICAgKHsgY2xhaW1OYW1lIH0gPSBsYnJ5VXJpLnBhcnNlQ2xhaW0ocGFyYW1zLmNsYWltKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICB9XG4gICAgLy8gcGFyc2UgdGhlIGlkZW50aWZpZXJcbiAgICBsZXQgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltSWQ7XG4gICAgdHJ5IHtcbiAgICAgICh7IGlzQ2hhbm5lbCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbUlkIH0gPSBsYnJ5VXJpLnBhcnNlSWRlbnRpZmllcihwYXJhbXMuaWRlbnRpZmllcikpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICAgIGlmICghaXNDaGFubmVsKSB7XG4gICAgICBbY2xhaW1JZCwgY2xhaW1OYW1lXSA9IGZsaXBDbGFpbU5hbWVBbmRJZEZvckJhY2t3YXJkc0NvbXBhdGliaWxpdHkoY2xhaW1JZCwgY2xhaW1OYW1lKTtcbiAgICB9XG4gICAgLy8gbG9nIHRoZSByZXF1ZXN0IGRhdGEgZm9yIGRlYnVnZ2luZ1xuICAgIGxvZ1JlcXVlc3REYXRhKHJlc3BvbnNlVHlwZSwgY2xhaW1OYW1lLCBjaGFubmVsTmFtZSwgY2xhaW1JZCk7XG4gICAgLy8gZ2V0IHRoZSBjbGFpbSBJZCBhbmQgdGhlbiBzZXJ2ZSB0aGUgYXNzZXRcbiAgICBnZXRDbGFpbUlkQW5kU2VydmVBc3NldChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltTmFtZSwgY2xhaW1JZCwgb3JpZ2luYWxVcmwsIGlwLCByZXMpO1xuICB9KTtcbiAgLy8gcm91dGUgdG8gc2VydmUgdGhlIHdpbm5pbmcgYXNzZXQgYXQgYSBjbGFpbSBvciBhIGNoYW5uZWwgcGFnZVxuICBhcHAuZ2V0KCcvOmNsYWltJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgeyBoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwsIHBhcmFtcyB9ID0gcmVxO1xuICAgIC8vIGRlY2lkZSBpZiB0aGlzIGlzIGEgc2hvdyByZXF1ZXN0XG4gICAgbGV0IGhhc0ZpbGVFeHRlbnNpb247XG4gICAgdHJ5IHtcbiAgICAgICh7IGhhc0ZpbGVFeHRlbnNpb24gfSA9IGxicnlVcmkucGFyc2VNb2RpZmllcihwYXJhbXMuY2xhaW0pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgICBsZXQgcmVzcG9uc2VUeXBlID0gZGV0ZXJtaW5lUmVzcG9uc2VUeXBlKGhhc0ZpbGVFeHRlbnNpb24sIGhlYWRlcnMpO1xuICAgIGlmIChyZXNwb25zZVR5cGUgIT09IFNFUlZFKSB7XG4gICAgICByZXR1cm4gaGFuZGxlU2hvd1JlbmRlcihyZXEsIHJlcyk7XG4gICAgfVxuICAgIC8vIGhhbmRsZSBzZXJ2ZSByZXF1ZXN0XG4gICAgLy8gc2VuZCBnb29nbGUgYW5hbHl0aWNzXG4gICAgc2VuZEdBU2VydmVFdmVudChoZWFkZXJzLCBpcCwgb3JpZ2luYWxVcmwpO1xuICAgIC8vIHBhcnNlIHRoZSBjbGFpbVxuICAgIGxldCBjbGFpbU5hbWU7XG4gICAgdHJ5IHtcbiAgICAgICh7Y2xhaW1OYW1lfSA9IGxicnlVcmkucGFyc2VDbGFpbShwYXJhbXMuY2xhaW0pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgICAvLyBsb2cgdGhlIHJlcXVlc3QgZGF0YSBmb3IgZGVidWdnaW5nXG4gICAgbG9nUmVxdWVzdERhdGEocmVzcG9uc2VUeXBlLCBjbGFpbU5hbWUsIG51bGwsIG51bGwpO1xuICAgIC8vIGdldCB0aGUgY2xhaW0gSWQgYW5kIHRoZW4gc2VydmUgdGhlIGFzc2V0XG4gICAgZ2V0Q2xhaW1JZEFuZFNlcnZlQXNzZXQobnVsbCwgbnVsbCwgY2xhaW1OYW1lLCBudWxsLCBvcmlnaW5hbFVybCwgaXAsIHJlcyk7XG4gIH0pO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9yb3V0ZXMvYXNzZXQtcm91dGVzLmpzIiwiY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnd2luc3RvbicpO1xuY29uc3QgeyBnZXRDbGFpbUlkLCBnZXRMb2NhbEZpbGVSZWNvcmQgfSA9IHJlcXVpcmUoJy4uL2NvbnRyb2xsZXJzL3NlcnZlQ29udHJvbGxlci5qcycpO1xuY29uc3QgeyBoYW5kbGVFcnJvclJlc3BvbnNlIH0gPSByZXF1aXJlKCcuL2Vycm9ySGFuZGxlcnMuanMnKTtcblxuY29uc3QgU0VSVkUgPSAnU0VSVkUnO1xuY29uc3QgU0hPVyA9ICdTSE9XJztcbmNvbnN0IE5PX0ZJTEUgPSAnTk9fRklMRSc7XG5jb25zdCBOT19DSEFOTkVMID0gJ05PX0NIQU5ORUwnO1xuY29uc3QgTk9fQ0xBSU0gPSAnTk9fQ0xBSU0nO1xuXG5mdW5jdGlvbiBjbGllbnRBY2NlcHRzSHRtbCAoe2FjY2VwdH0pIHtcbiAgcmV0dXJuIGFjY2VwdCAmJiBhY2NlcHQubWF0Y2goL3RleHRcXC9odG1sLyk7XG59O1xuXG5mdW5jdGlvbiByZXF1ZXN0SXNGcm9tQnJvd3NlciAoaGVhZGVycykge1xuICByZXR1cm4gaGVhZGVyc1sndXNlci1hZ2VudCddICYmIGhlYWRlcnNbJ3VzZXItYWdlbnQnXS5tYXRjaCgvTW96aWxsYS8pO1xufTtcblxuZnVuY3Rpb24gY2xpZW50V2FudHNBc3NldCAoe2FjY2VwdCwgcmFuZ2V9KSB7XG4gIGNvbnN0IGltYWdlSXNXYW50ZWQgPSBhY2NlcHQgJiYgYWNjZXB0Lm1hdGNoKC9pbWFnZVxcLy4qLykgJiYgIWFjY2VwdC5tYXRjaCgvdGV4dFxcL2h0bWwvKSAmJiAhYWNjZXB0Lm1hdGNoKC90ZXh0XFwvXFwqLyk7XG4gIGNvbnN0IHZpZGVvSXNXYW50ZWQgPSBhY2NlcHQgJiYgcmFuZ2U7XG4gIHJldHVybiBpbWFnZUlzV2FudGVkIHx8IHZpZGVvSXNXYW50ZWQ7XG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkQ2xhaW1JZCAoY2xhaW1JZCkge1xuICByZXR1cm4gKChjbGFpbUlkLmxlbmd0aCA9PT0gNDApICYmICEvW15BLVphLXowLTldL2cudGVzdChjbGFpbUlkKSk7XG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkU2hvcnRJZCAoY2xhaW1JZCkge1xuICByZXR1cm4gY2xhaW1JZC5sZW5ndGggPT09IDE7ICAvLyBpdCBzaG91bGQgcmVhbGx5IGV2YWx1YXRlIHRoZSBzaG9ydCB1cmwgaXRzZWxmXG59O1xuXG5mdW5jdGlvbiBpc1ZhbGlkU2hvcnRJZE9yQ2xhaW1JZCAoaW5wdXQpIHtcbiAgcmV0dXJuIChpc1ZhbGlkQ2xhaW1JZChpbnB1dCkgfHwgaXNWYWxpZFNob3J0SWQoaW5wdXQpKTtcbn07XG5cbmZ1bmN0aW9uIHNlcnZlQXNzZXRUb0NsaWVudCAoY2xhaW1JZCwgbmFtZSwgcmVzKSB7XG4gIHJldHVybiBnZXRMb2NhbEZpbGVSZWNvcmQoY2xhaW1JZCwgbmFtZSlcbiAgICAudGhlbihmaWxlUmVjb3JkID0+IHtcbiAgICAgIC8vIGNoZWNrIHRoYXQgYSBsb2NhbCByZWNvcmQgd2FzIGZvdW5kXG4gICAgICBpZiAoZmlsZVJlY29yZCA9PT0gTk9fRklMRSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cygzMDcpLnJlZGlyZWN0KGAvYXBpL2NsYWltL2dldC8ke25hbWV9LyR7Y2xhaW1JZH1gKTtcbiAgICAgIH1cbiAgICAgIC8vIHNlcnZlIHRoZSBmaWxlXG4gICAgICBjb25zdCB7ZmlsZVBhdGgsIGZpbGVUeXBlfSA9IGZpbGVSZWNvcmQ7XG4gICAgICBsb2dnZXIudmVyYm9zZShgc2VydmluZyBmaWxlOiAke2ZpbGVQYXRofWApO1xuICAgICAgY29uc3Qgc2VuZEZpbGVPcHRpb25zID0ge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnOiAnbm9zbmlmZicsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZScgICAgICAgICAgOiBmaWxlVHlwZSB8fCAnaW1hZ2UvanBlZycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmVzLnN0YXR1cygyMDApLnNlbmRGaWxlKGZpbGVQYXRoLCBzZW5kRmlsZU9wdGlvbnMpO1xuICAgIH0pXG4gICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENsYWltSWRBbmRTZXJ2ZUFzc2V0IChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltTmFtZSwgY2xhaW1JZCwgb3JpZ2luYWxVcmwsIGlwLCByZXMpIHtcbiAgICAvLyBnZXQgdGhlIGNsYWltIElkIGFuZCB0aGVuIHNlcnZlIHRoZSBhc3NldFxuICAgIGdldENsYWltSWQoY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbU5hbWUsIGNsYWltSWQpXG4gICAgICAudGhlbihmdWxsQ2xhaW1JZCA9PiB7XG4gICAgICAgIGlmIChmdWxsQ2xhaW1JZCA9PT0gTk9fQ0xBSU0pIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnbm8gY2xhaW0gaWQgY291bGQgYmUgZm91bmQnfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnVsbENsYWltSWQgPT09IE5PX0NIQU5ORUwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiAnbm8gY2hhbm5lbCBpZCBjb3VsZCBiZSBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgICBzZXJ2ZUFzc2V0VG9DbGllbnQoZnVsbENsYWltSWQsIGNsYWltTmFtZSwgcmVzKTtcbiAgICAgICAgLy8gcG9zdFRvU3RhdHMocmVzcG9uc2VUeXBlLCBvcmlnaW5hbFVybCwgaXAsIGNsYWltTmFtZSwgZnVsbENsYWltSWQsICdzdWNjZXNzJyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3JSZXNwb25zZShvcmlnaW5hbFVybCwgaXAsIGVycm9yLCByZXMpO1xuICAgICAgICAvLyBwb3N0VG9TdGF0cyhyZXNwb25zZVR5cGUsIG9yaWdpbmFsVXJsLCBpcCwgY2xhaW1OYW1lLCBmdWxsQ2xhaW1JZCwgJ2ZhaWwnKTtcbiAgICAgIH0pO1xuICB9LFxuICBkZXRlcm1pbmVSZXNwb25zZVR5cGUgKGhhc0ZpbGVFeHRlbnNpb24sIGhlYWRlcnMpIHtcbiAgICBsZXQgcmVzcG9uc2VUeXBlO1xuICAgIGlmIChoYXNGaWxlRXh0ZW5zaW9uKSB7XG4gICAgICByZXNwb25zZVR5cGUgPSBTRVJWRTsgIC8vIGFzc3VtZSBhIHNlcnZlIHJlcXVlc3QgaWYgZmlsZSBleHRlbnNpb24gaXMgcHJlc2VudFxuICAgICAgaWYgKGNsaWVudEFjY2VwdHNIdG1sKGhlYWRlcnMpKSB7ICAvLyBpZiB0aGUgcmVxdWVzdCBjb21lcyBmcm9tIGEgYnJvd3NlciwgY2hhbmdlIGl0IHRvIGEgc2hvdyByZXF1ZXN0XG4gICAgICAgIHJlc3BvbnNlVHlwZSA9IFNIT1c7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlVHlwZSA9IFNIT1c7XG4gICAgICBpZiAoY2xpZW50V2FudHNBc3NldChoZWFkZXJzKSAmJiByZXF1ZXN0SXNGcm9tQnJvd3NlcihoZWFkZXJzKSkgeyAgLy8gdGhpcyBpcyBpbiBjYXNlIHNvbWVvbmUgZW1iZWRzIGEgc2hvdyB1cmxcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTaG93IHJlcXVlc3QgY2FtZSBmcm9tIGJyb3dzZXIgYnV0IHdhbnRzIGFuIGltYWdlL3ZpZGVvLiBDaGFuZ2luZyByZXNwb25zZSB0byBzZXJ2ZS4uLicpO1xuICAgICAgICByZXNwb25zZVR5cGUgPSBTRVJWRTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlVHlwZTtcbiAgfSxcbiAgZmxpcENsYWltTmFtZUFuZElkRm9yQmFja3dhcmRzQ29tcGF0aWJpbGl0eSAoaWRlbnRpZmllciwgbmFtZSkge1xuICAgIC8vIHRoaXMgaXMgYSBwYXRjaCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgd2l0aCAnL25hbWUvY2xhaW1faWQnIHVybCBmb3JtYXRcbiAgICBpZiAoaXNWYWxpZFNob3J0SWRPckNsYWltSWQobmFtZSkgJiYgIWlzVmFsaWRTaG9ydElkT3JDbGFpbUlkKGlkZW50aWZpZXIpKSB7XG4gICAgICBjb25zdCB0ZW1wTmFtZSA9IG5hbWU7XG4gICAgICBuYW1lID0gaWRlbnRpZmllcjtcbiAgICAgIGlkZW50aWZpZXIgPSB0ZW1wTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIFtpZGVudGlmaWVyLCBuYW1lXTtcbiAgfSxcbiAgbG9nUmVxdWVzdERhdGEgKHJlc3BvbnNlVHlwZSwgY2xhaW1OYW1lLCBjaGFubmVsTmFtZSwgY2xhaW1JZCkge1xuICAgIGxvZ2dlci5kZWJ1ZygncmVzcG9uc2VUeXBlID09PScsIHJlc3BvbnNlVHlwZSk7XG4gICAgbG9nZ2VyLmRlYnVnKCdjbGFpbSBuYW1lID09PSAnLCBjbGFpbU5hbWUpO1xuICAgIGxvZ2dlci5kZWJ1ZygnY2hhbm5lbCBuYW1lID09PScsIGNoYW5uZWxOYW1lKTtcbiAgICBsb2dnZXIuZGVidWcoJ2NsYWltIGlkID09PScsIGNsYWltSWQpO1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL3NlcnZlSGVscGVycy5qcyIsImNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3dpbnN0b24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFJFR0VYUF9JTlZBTElEX0NMQUlNICA6IC9bXkEtWmEtejAtOS1dL2csXG4gIFJFR0VYUF9JTlZBTElEX0NIQU5ORUw6IC9bXkEtWmEtejAtOS1AXS9nLFxuICBSRUdFWFBfQUREUkVTUyAgICAgICAgOiAvXmIoPz1bXjBPSWxdezMyLDMzfSlbMC05QS1aYS16XXszMiwzM30kLyxcbiAgQ0hBTk5FTF9DSEFSICAgICAgICAgIDogJ0AnLFxuICBwYXJzZUlkZW50aWZpZXIgICAgICAgOiBmdW5jdGlvbiAoaWRlbnRpZmllcikge1xuICAgIGxvZ2dlci5kZWJ1ZygncGFyc2luZyBpZGVudGlmaWVyOicsIGlkZW50aWZpZXIpO1xuICAgIGNvbnN0IGNvbXBvbmVudHNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAnKFteOiQjL10qKScgKyAvLyB2YWx1ZSAoc3RvcHMgYXQgdGhlIGZpcnN0IHNlcGFyYXRvciBvciBlbmQpXG4gICAgICAnKFs6JCNdPykoW14vXSopJyAvLyBtb2RpZmllciBzZXBhcmF0b3IsIG1vZGlmaWVyIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCB2YWx1ZSwgbW9kaWZpZXJTZXBlcmF0b3IsIG1vZGlmaWVyXSA9IGNvbXBvbmVudHNSZWdleFxuICAgICAgLmV4ZWMoaWRlbnRpZmllcilcbiAgICAgIC5tYXAobWF0Y2ggPT4gbWF0Y2ggfHwgbnVsbCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAke3Byb3RvfSwgJHt2YWx1ZX0sICR7bW9kaWZpZXJTZXBlcmF0b3J9LCAke21vZGlmaWVyfWApO1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHByb2Nlc3MgbmFtZVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlY2sgeW91ciB1cmwuICBObyBjaGFubmVsIG5hbWUgcHJvdmlkZWQgYmVmb3JlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cImApO1xuICAgIH1cbiAgICBjb25zdCBpc0NoYW5uZWwgPSB2YWx1ZS5zdGFydHNXaXRoKG1vZHVsZS5leHBvcnRzLkNIQU5ORUxfQ0hBUik7XG4gICAgY29uc3QgY2hhbm5lbE5hbWUgPSBpc0NoYW5uZWwgPyB2YWx1ZSA6IG51bGw7XG4gICAgbGV0IGNsYWltSWQ7XG4gICAgaWYgKGlzQ2hhbm5lbCkge1xuICAgICAgaWYgKCFjaGFubmVsTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNoYW5uZWwgbmFtZSBhZnRlciBALicpO1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZUJhZENoYXJzID0gKGNoYW5uZWxOYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DSEFOTkVMKTtcbiAgICAgIGlmIChuYW1lQmFkQ2hhcnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gY2hhbm5lbCBuYW1lOiAke25hbWVCYWRDaGFycy5qb2luKCcsICcpfS5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2xhaW1JZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgbGV0IGNoYW5uZWxDbGFpbUlkO1xuICAgIGlmIChtb2RpZmllclNlcGVyYXRvcikge1xuICAgICAgaWYgKCFtb2RpZmllcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1vZGlmaWVyIHByb3ZpZGVkIGFmdGVyIHNlcGFyYXRvciBcIiR7bW9kaWZpZXJTZXBlcmF0b3J9XCJgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yID09PSAnOicpIHtcbiAgICAgICAgY2hhbm5lbENsYWltSWQgPSBtb2RpZmllcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFwiJHttb2RpZmllclNlcGVyYXRvcn1cIiBtb2RpZmllciBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaXNDaGFubmVsLFxuICAgICAgY2hhbm5lbE5hbWUsXG4gICAgICBjaGFubmVsQ2xhaW1JZCxcbiAgICAgIGNsYWltSWQsXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VDbGFpbTogZnVuY3Rpb24gKGNsYWltKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdwYXJzaW5nIG5hbWU6JywgY2xhaW0pO1xuICAgIGNvbnN0IGNvbXBvbmVudHNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAnKFteOiQjLy5dKiknICsgLy8gbmFtZSAoc3RvcHMgYXQgdGhlIGZpcnN0IG1vZGlmaWVyKVxuICAgICAgJyhbOiQjLl0/KShbXi9dKiknIC8vIG1vZGlmaWVyIHNlcGFyYXRvciwgbW9kaWZpZXIgKHN0b3BzIGF0IHRoZSBmaXJzdCBwYXRoIHNlcGFyYXRvciBvciBlbmQpXG4gICAgKTtcbiAgICBjb25zdCBbcHJvdG8sIGNsYWltTmFtZSwgbW9kaWZpZXJTZXBlcmF0b3IsIG1vZGlmaWVyXSA9IGNvbXBvbmVudHNSZWdleFxuICAgICAgLmV4ZWMoY2xhaW0pXG4gICAgICAubWFwKG1hdGNoID0+IG1hdGNoIHx8IG51bGwpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtwcm90b30sICR7Y2xhaW1OYW1lfSwgJHttb2RpZmllclNlcGVyYXRvcn0sICR7bW9kaWZpZXJ9YCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcHJvY2VzcyBuYW1lXG4gICAgaWYgKCFjbGFpbU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY2xhaW0gbmFtZSBwcm92aWRlZCBiZWZvcmUgLicpO1xuICAgIH1cbiAgICBjb25zdCBuYW1lQmFkQ2hhcnMgPSAoY2xhaW1OYW1lKS5tYXRjaChtb2R1bGUuZXhwb3J0cy5SRUdFWFBfSU5WQUxJRF9DTEFJTSk7XG4gICAgaWYgKG5hbWVCYWRDaGFycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gY2xhaW0gbmFtZTogJHtuYW1lQmFkQ2hhcnMuam9pbignLCAnKX0uYCk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yKSB7XG4gICAgICBpZiAoIW1vZGlmaWVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZmlsZSBleHRlbnNpb24gcHJvdmlkZWQgYWZ0ZXIgc2VwYXJhdG9yICR7bW9kaWZpZXJTZXBlcmF0b3J9LmApO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVyU2VwZXJhdG9yICE9PSAnLicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHttb2RpZmllclNlcGVyYXRvcn0gbW9kaWZpZXIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY2xhaW0gbmFtZWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyByZXR1cm4gcmVzdWx0c1xuICAgIHJldHVybiB7XG4gICAgICBjbGFpbU5hbWUsXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VNb2RpZmllcjogZnVuY3Rpb24gKGNsYWltKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdwYXJzaW5nIG1vZGlmaWVyOicsIGNsYWltKTtcbiAgICBjb25zdCBjb21wb25lbnRzUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJyhbXjokIy8uXSopJyArIC8vIG5hbWUgKHN0b3BzIGF0IHRoZSBmaXJzdCBtb2RpZmllcilcbiAgICAgICcoWzokIy5dPykoW14vXSopJyAvLyBtb2RpZmllciBzZXBhcmF0b3IsIG1vZGlmaWVyIChzdG9wcyBhdCB0aGUgZmlyc3QgcGF0aCBzZXBhcmF0b3Igb3IgZW5kKVxuICAgICk7XG4gICAgY29uc3QgW3Byb3RvLCBjbGFpbU5hbWUsIG1vZGlmaWVyU2VwZXJhdG9yLCBtb2RpZmllcl0gPSBjb21wb25lbnRzUmVnZXhcbiAgICAgIC5leGVjKGNsYWltKVxuICAgICAgLm1hcChtYXRjaCA9PiBtYXRjaCB8fCBudWxsKTtcbiAgICBsb2dnZXIuZGVidWcoYCR7cHJvdG99LCAke2NsYWltTmFtZX0sICR7bW9kaWZpZXJTZXBlcmF0b3J9LCAke21vZGlmaWVyfWApO1xuICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIG1vZGlmaWVyXG4gICAgbGV0IGhhc0ZpbGVFeHRlbnNpb24gPSBmYWxzZTtcbiAgICBpZiAobW9kaWZpZXJTZXBlcmF0b3IpIHtcbiAgICAgIGhhc0ZpbGVFeHRlbnNpb24gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaGFzRmlsZUV4dGVuc2lvbixcbiAgICB9O1xuICB9LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2xicnlVcmkuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyVG9TdHJpbmcgfSBmcm9tICdyZWFjdC1kb20vc2VydmVyJztcbmltcG9ydCB7IGNyZWF0ZVN0b3JlLCBhcHBseU1pZGRsZXdhcmUgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgUmVkdWNlciBmcm9tICcuLi8uLi9jbGllbnQvcmVkdWNlcnMvaW5kZXgnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBTdGF0aWNSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBHQUxpc3RlbmVyIGZyb20gJy4uLy4uL2NsaWVudC9jb21wb25lbnRzL0dBTGlzdGVuZXIvaW5kZXgnO1xuaW1wb3J0IEFwcCBmcm9tICcuLi8uLi9jbGllbnQvYXBwJztcbmltcG9ydCByZW5kZXJGdWxsUGFnZSBmcm9tICcuL3JlbmRlckZ1bGxQYWdlJztcbmltcG9ydCBjcmVhdGVTYWdhTWlkZGxld2FyZSBmcm9tICdyZWR1eC1zYWdhJztcbmltcG9ydCB7IGNhbGwgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0IHsgaGFuZGxlU2hvd1BhZ2VVcmkgfSBmcm9tICcuLi8uLi9jbGllbnQvc2FnYXMvc2hvd191cmknO1xuaW1wb3J0IHsgb25IYW5kbGVTaG93UGFnZVVyaSB9IGZyb20gJy4uLy4uL2NsaWVudC9hY3Rpb25zL3Nob3cnO1xuXG5pbXBvcnQgSGVsbWV0IGZyb20gJ3JlYWN0LWhlbG1ldCc7XG5cbmNvbnN0IHJldHVyblNhZ2FXaXRoUGFyYW1zID0gKHNhZ2EsIHBhcmFtcykgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gKiAoKSB7XG4gICAgeWllbGQgY2FsbChzYWdhLCBwYXJhbXMpO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSAocmVxLCByZXMpID0+IHtcbiAgbGV0IGNvbnRleHQgPSB7fTtcblxuICAvLyBjcmVhdGUgYW5kIGFwcGx5IG1pZGRsZXdhcmVcbiAgY29uc3Qgc2FnYU1pZGRsZXdhcmUgPSBjcmVhdGVTYWdhTWlkZGxld2FyZSgpO1xuICBjb25zdCBtaWRkbGV3YXJlID0gYXBwbHlNaWRkbGV3YXJlKHNhZ2FNaWRkbGV3YXJlKTtcblxuICAvLyBjcmVhdGUgYSBuZXcgUmVkdXggc3RvcmUgaW5zdGFuY2VcbiAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShSZWR1Y2VyLCBtaWRkbGV3YXJlKTtcblxuICAvLyBjcmVhdGUgc2FnYVxuICBjb25zdCBhY3Rpb24gPSBvbkhhbmRsZVNob3dQYWdlVXJpKHJlcS5wYXJhbXMpO1xuICBjb25zdCBzYWdhID0gcmV0dXJuU2FnYVdpdGhQYXJhbXMoaGFuZGxlU2hvd1BhZ2VVcmksIGFjdGlvbik7XG5cbiAgLy8gcnVuIHRoZSBzYWdhIG1pZGRsZXdhcmVcbiAgc2FnYU1pZGRsZXdhcmVcbiAgICAucnVuKHNhZ2EpXG4gICAgLmRvbmVcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICAvLyByZW5kZXIgY29tcG9uZW50IHRvIGEgc3RyaW5nXG4gICAgICBjb25zdCBodG1sID0gcmVuZGVyVG9TdHJpbmcoXG4gICAgICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxuICAgICAgICAgIDxTdGF0aWNSb3V0ZXIgbG9jYXRpb249e3JlcS51cmx9IGNvbnRleHQ9e2NvbnRleHR9PlxuICAgICAgICAgICAgPEdBTGlzdGVuZXI+XG4gICAgICAgICAgICAgIDxBcHAgLz5cbiAgICAgICAgICAgIDwvR0FMaXN0ZW5lcj5cbiAgICAgICAgICA8L1N0YXRpY1JvdXRlcj5cbiAgICAgICAgPC9Qcm92aWRlcj5cbiAgICAgICk7XG5cbiAgICAgIC8vIGdldCBoZWFkIHRhZ3MgZnJvbSBoZWxtZXRcbiAgICAgIGNvbnN0IGhlbG1ldCA9IEhlbG1ldC5yZW5kZXJTdGF0aWMoKTtcblxuICAgICAgLy8gY2hlY2sgZm9yIGEgcmVkaXJlY3RcbiAgICAgIGlmIChjb250ZXh0LnVybCkge1xuICAgICAgICByZXR1cm4gcmVzLnJlZGlyZWN0KDMwMSwgY29udGV4dC51cmwpO1xuICAgICAgfVxuXG4gICAgICAvLyBnZXQgdGhlIGluaXRpYWwgc3RhdGUgZnJvbSBvdXIgUmVkdXggc3RvcmVcbiAgICAgIGNvbnN0IHByZWxvYWRlZFN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcblxuICAgICAgLy8gc2VuZCB0aGUgcmVuZGVyZWQgcGFnZSBiYWNrIHRvIHRoZSBjbGllbnRcbiAgICAgIHJlcy5zZW5kKHJlbmRlckZ1bGxQYWdlKGhlbG1ldCwgaHRtbCwgcHJlbG9hZGVkU3RhdGUpKTtcbiAgICB9KTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9oYW5kbGVTaG93UmVuZGVyLmpzeCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZHV4LXNhZ2FcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJyZWR1eC1zYWdhXCJcbi8vIG1vZHVsZSBpZCA9IDE1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBjYWxsLCBwdXQsIHRha2VMYXRlc3QgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnO1xuaW1wb3J0ICogYXMgYWN0aW9ucyBmcm9tICdjb25zdGFudHMvc2hvd19hY3Rpb25fdHlwZXMnO1xuaW1wb3J0IHsgb25SZXF1ZXN0RXJyb3IsIG9uTmV3Q2hhbm5lbFJlcXVlc3QsIG9uTmV3QXNzZXRSZXF1ZXN0IH0gZnJvbSAnYWN0aW9ucy9zaG93JztcbmltcG9ydCB7IG5ld0Fzc2V0UmVxdWVzdCB9IGZyb20gJ3NhZ2FzL3Nob3dfYXNzZXQnO1xuaW1wb3J0IHsgbmV3Q2hhbm5lbFJlcXVlc3QgfSBmcm9tICdzYWdhcy9zaG93X2NoYW5uZWwnO1xuaW1wb3J0IGxicnlVcmkgZnJvbSAndXRpbHMvbGJyeVVyaSc7XG5cbmZ1bmN0aW9uICogcGFyc2VBbmRVcGRhdGVJZGVudGlmaWVyQW5kQ2xhaW0gKG1vZGlmaWVyLCBjbGFpbSkge1xuICAvLyB0aGlzIGlzIGEgcmVxdWVzdCBmb3IgYW4gYXNzZXRcbiAgLy8gY2xhaW0gd2lsbCBiZSBhbiBhc3NldCBjbGFpbVxuICAvLyB0aGUgaWRlbnRpZmllciBjb3VsZCBiZSBhIGNoYW5uZWwgb3IgYSBjbGFpbSBpZFxuICBsZXQgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQsIGNsYWltSWQsIGNsYWltTmFtZSwgZXh0ZW5zaW9uO1xuICB0cnkge1xuICAgICh7IGlzQ2hhbm5lbCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxDbGFpbUlkLCBjbGFpbUlkIH0gPSBsYnJ5VXJpLnBhcnNlSWRlbnRpZmllcihtb2RpZmllcikpO1xuICAgICh7IGNsYWltTmFtZSwgZXh0ZW5zaW9uIH0gPSBsYnJ5VXJpLnBhcnNlQ2xhaW0oY2xhaW0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyB0cmlnZ2VyIGFuIG5ldyBhY3Rpb24gdG8gdXBkYXRlIHRoZSBzdG9yZVxuICBpZiAoaXNDaGFubmVsKSB7XG4gICAgcmV0dXJuIHlpZWxkIGNhbGwobmV3QXNzZXRSZXF1ZXN0LCBvbk5ld0Fzc2V0UmVxdWVzdChjbGFpbU5hbWUsIG51bGwsIGNoYW5uZWxOYW1lLCBjaGFubmVsQ2xhaW1JZCwgZXh0ZW5zaW9uKSk7XG4gIH07XG4gIHlpZWxkIGNhbGwobmV3QXNzZXRSZXF1ZXN0LCBvbk5ld0Fzc2V0UmVxdWVzdChjbGFpbU5hbWUsIGNsYWltSWQsIG51bGwsIG51bGwsIGV4dGVuc2lvbikpO1xufVxuZnVuY3Rpb24gKiBwYXJzZUFuZFVwZGF0ZUNsYWltT25seSAoY2xhaW0pIHtcbiAgLy8gdGhpcyBjb3VsZCBiZSBhIHJlcXVlc3QgZm9yIGFuIGFzc2V0IG9yIGEgY2hhbm5lbCBwYWdlXG4gIC8vIGNsYWltIGNvdWxkIGJlIGFuIGFzc2V0IGNsYWltIG9yIGEgY2hhbm5lbCBjbGFpbVxuICBsZXQgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQ7XG4gIHRyeSB7XG4gICAgKHsgaXNDaGFubmVsLCBjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQgfSA9IGxicnlVcmkucGFyc2VJZGVudGlmaWVyKGNsYWltKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gdHJpZ2dlciBhbiBuZXcgYWN0aW9uIHRvIHVwZGF0ZSB0aGUgc3RvcmVcbiAgLy8gcmV0dXJuIGVhcmx5IGlmIHRoaXMgcmVxdWVzdCBpcyBmb3IgYSBjaGFubmVsXG4gIGlmIChpc0NoYW5uZWwpIHtcbiAgICByZXR1cm4geWllbGQgY2FsbChuZXdDaGFubmVsUmVxdWVzdCwgb25OZXdDaGFubmVsUmVxdWVzdChjaGFubmVsTmFtZSwgY2hhbm5lbENsYWltSWQpKTtcbiAgfVxuICAvLyBpZiBub3QgZm9yIGEgY2hhbm5lbCwgcGFyc2UgdGhlIGNsYWltIHJlcXVlc3RcbiAgbGV0IGNsYWltTmFtZSwgZXh0ZW5zaW9uO1xuICB0cnkge1xuICAgICh7Y2xhaW1OYW1lLCBleHRlbnNpb259ID0gbGJyeVVyaS5wYXJzZUNsYWltKGNsYWltKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgeWllbGQgY2FsbChuZXdBc3NldFJlcXVlc3QsIG9uTmV3QXNzZXRSZXF1ZXN0KGNsYWltTmFtZSwgbnVsbCwgbnVsbCwgbnVsbCwgZXh0ZW5zaW9uKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiAqIGhhbmRsZVNob3dQYWdlVXJpIChhY3Rpb24pIHtcbiAgY29uc3QgeyBpZGVudGlmaWVyLCBjbGFpbSB9ID0gYWN0aW9uLmRhdGE7XG4gIGlmIChpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIHlpZWxkIGNhbGwocGFyc2VBbmRVcGRhdGVJZGVudGlmaWVyQW5kQ2xhaW0sIGlkZW50aWZpZXIsIGNsYWltKTtcbiAgfVxuICB5aWVsZCBjYWxsKHBhcnNlQW5kVXBkYXRlQ2xhaW1Pbmx5LCBjbGFpbSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaEhhbmRsZVNob3dQYWdlVXJpICgpIHtcbiAgeWllbGQgdGFrZUxhdGVzdChhY3Rpb25zLkhBTkRMRV9TSE9XX1VSSSwgaGFuZGxlU2hvd1BhZ2VVcmkpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9zYWdhcy9zaG93X3VyaS5qcyIsImltcG9ydCB7IGNhbGwsIHB1dCwgc2VsZWN0LCB0YWtlTGF0ZXN0IH0gZnJvbSAncmVkdXgtc2FnYS9lZmZlY3RzJztcbmltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3Nob3dfYWN0aW9uX3R5cGVzJztcbmltcG9ydCB7IGFkZFJlcXVlc3RUb1JlcXVlc3RMaXN0LCBvblJlcXVlc3RFcnJvciwgb25SZXF1ZXN0VXBkYXRlLCBhZGRBc3NldFRvQXNzZXRMaXN0IH0gZnJvbSAnYWN0aW9ucy9zaG93JztcbmltcG9ydCB7IGdldExvbmdDbGFpbUlkLCBnZXRTaG9ydElkLCBnZXRDbGFpbURhdGEgfSBmcm9tICdhcGkvYXNzZXRBcGknO1xuaW1wb3J0IHsgc2VsZWN0U2hvd1N0YXRlIH0gZnJvbSAnc2VsZWN0b3JzL3Nob3cnO1xuaW1wb3J0IHsgc2VsZWN0U2l0ZUhvc3QgfSBmcm9tICdzZWxlY3RvcnMvc2l0ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiAqIG5ld0Fzc2V0UmVxdWVzdCAoYWN0aW9uKSB7XG4gIGNvbnN0IHsgcmVxdWVzdFR5cGUsIHJlcXVlc3RJZCwgbmFtZSwgbW9kaWZpZXIgfSA9IGFjdGlvbi5kYXRhO1xuICAvLyBwdXQgYW4gYWN0aW9uIHRvIHVwZGF0ZSB0aGUgcmVxdWVzdCBpbiByZWR1eFxuICB5aWVsZCBwdXQob25SZXF1ZXN0VXBkYXRlKHJlcXVlc3RUeXBlLCByZXF1ZXN0SWQpKTtcbiAgLy8gaXMgdGhpcyBhbiBleGlzdGluZyByZXF1ZXN0P1xuICAvLyBJZiB0aGlzIHVyaSBpcyBpbiB0aGUgcmVxdWVzdCBsaXN0LCBpdCdzIGFscmVhZHkgYmVlbiBmZXRjaGVkXG4gIGNvbnN0IHN0YXRlID0geWllbGQgc2VsZWN0KHNlbGVjdFNob3dTdGF0ZSk7XG4gIGNvbnN0IGhvc3QgPSB5aWVsZCBzZWxlY3Qoc2VsZWN0U2l0ZUhvc3QpO1xuICBpZiAoc3RhdGUucmVxdWVzdExpc3RbcmVxdWVzdElkXSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGdldCBsb25nIGlkICYmIGFkZCByZXF1ZXN0IHRvIHJlcXVlc3QgbGlzdFxuICBsZXQgbG9uZ0lkO1xuICB0cnkge1xuICAgICh7ZGF0YTogbG9uZ0lkfSA9IHlpZWxkIGNhbGwoZ2V0TG9uZ0NsYWltSWQsIGhvc3QsIG5hbWUsIG1vZGlmaWVyKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgY29uc3QgYXNzZXRLZXkgPSBgYSMke25hbWV9IyR7bG9uZ0lkfWA7XG4gIHlpZWxkIHB1dChhZGRSZXF1ZXN0VG9SZXF1ZXN0TGlzdChyZXF1ZXN0SWQsIG51bGwsIGFzc2V0S2V5KSk7XG4gIC8vIGlzIHRoaXMgYW4gZXhpc3RpbmcgYXNzZXQ/XG4gIC8vIElmIHRoaXMgYXNzZXQgaXMgaW4gdGhlIGFzc2V0IGxpc3QsIGl0J3MgYWxyZWFkeSBiZWVuIGZldGNoZWRcbiAgaWYgKHN0YXRlLmFzc2V0TGlzdFthc3NldEtleV0pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBnZXQgc2hvcnQgSWRcbiAgbGV0IHNob3J0SWQ7XG4gIHRyeSB7XG4gICAgKHtkYXRhOiBzaG9ydElkfSA9IHlpZWxkIGNhbGwoZ2V0U2hvcnRJZCwgaG9zdCwgbmFtZSwgbG9uZ0lkKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gZ2V0IGFzc2V0IGNsYWltIGRhdGFcbiAgbGV0IGNsYWltRGF0YTtcbiAgdHJ5IHtcbiAgICAoe2RhdGE6IGNsYWltRGF0YX0gPSB5aWVsZCBjYWxsKGdldENsYWltRGF0YSwgaG9zdCwgbmFtZSwgbG9uZ0lkKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gYWRkIGFzc2V0IHRvIGFzc2V0IGxpc3RcbiAgeWllbGQgcHV0KGFkZEFzc2V0VG9Bc3NldExpc3QoYXNzZXRLZXksIG51bGwsIG5hbWUsIGxvbmdJZCwgc2hvcnRJZCwgY2xhaW1EYXRhKSk7XG4gIC8vIGNsZWFyIGFueSBlcnJvcnMgaW4gcmVxdWVzdCBlcnJvclxuICB5aWVsZCBwdXQob25SZXF1ZXN0RXJyb3IobnVsbCkpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uICogd2F0Y2hOZXdBc3NldFJlcXVlc3QgKCkge1xuICB5aWVsZCB0YWtlTGF0ZXN0KGFjdGlvbnMuQVNTRVRfUkVRVUVTVF9ORVcsIG5ld0Fzc2V0UmVxdWVzdCk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L3NhZ2FzL3Nob3dfYXNzZXQuanMiLCJpbXBvcnQgUmVxdWVzdCBmcm9tICd1dGlscy9yZXF1ZXN0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvbmdDbGFpbUlkIChob3N0LCBuYW1lLCBtb2RpZmllcikge1xuICBsZXQgYm9keSA9IHt9O1xuICAvLyBjcmVhdGUgcmVxdWVzdCBwYXJhbXNcbiAgaWYgKG1vZGlmaWVyKSB7XG4gICAgaWYgKG1vZGlmaWVyLmlkKSB7XG4gICAgICBib2R5WydjbGFpbUlkJ10gPSBtb2RpZmllci5pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgYm9keVsnY2hhbm5lbE5hbWUnXSA9IG1vZGlmaWVyLmNoYW5uZWwubmFtZTtcbiAgICAgIGJvZHlbJ2NoYW5uZWxDbGFpbUlkJ10gPSBtb2RpZmllci5jaGFubmVsLmlkO1xuICAgIH1cbiAgfVxuICBib2R5WydjbGFpbU5hbWUnXSA9IG5hbWU7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBtZXRob2QgOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keSAgIDogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gIH07XG4gIC8vIGNyZWF0ZSB1cmxcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NsYWltL2xvbmctaWRgO1xuICAvLyByZXR1cm4gdGhlIHJlcXVlc3QgcHJvbWlzZVxuICByZXR1cm4gUmVxdWVzdCh1cmwsIHBhcmFtcyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hvcnRJZCAoaG9zdCwgbmFtZSwgY2xhaW1JZCkge1xuICBjb25zdCB1cmwgPSBgJHtob3N0fS9hcGkvY2xhaW0vc2hvcnQtaWQvJHtjbGFpbUlkfS8ke25hbWV9YDtcbiAgcmV0dXJuIFJlcXVlc3QodXJsKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGFpbURhdGEgKGhvc3QsIG5hbWUsIGNsYWltSWQpIHtcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NsYWltL2RhdGEvJHtuYW1lfS8ke2NsYWltSWR9YDtcbiAgcmV0dXJuIFJlcXVlc3QodXJsKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvYXBpL2Fzc2V0QXBpLmpzIiwiaW1wb3J0IHtjYWxsLCBwdXQsIHNlbGVjdCwgdGFrZUxhdGVzdH0gZnJvbSAncmVkdXgtc2FnYS9lZmZlY3RzJztcbmltcG9ydCAqIGFzIGFjdGlvbnMgZnJvbSAnY29uc3RhbnRzL3Nob3dfYWN0aW9uX3R5cGVzJztcbmltcG9ydCB7IGFkZE5ld0NoYW5uZWxUb0NoYW5uZWxMaXN0LCBhZGRSZXF1ZXN0VG9SZXF1ZXN0TGlzdCwgb25SZXF1ZXN0RXJyb3IsIG9uUmVxdWVzdFVwZGF0ZSwgdXBkYXRlQ2hhbm5lbENsYWltcyB9IGZyb20gJ2FjdGlvbnMvc2hvdyc7XG5pbXBvcnQgeyBnZXRDaGFubmVsQ2xhaW1zLCBnZXRDaGFubmVsRGF0YSB9IGZyb20gJ2FwaS9jaGFubmVsQXBpJztcbmltcG9ydCB7IHNlbGVjdFNob3dTdGF0ZSB9IGZyb20gJ3NlbGVjdG9ycy9zaG93JztcbmltcG9ydCB7IHNlbGVjdFNpdGVIb3N0IH0gZnJvbSAnc2VsZWN0b3JzL3NpdGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gKiBuZXdDaGFubmVsUmVxdWVzdCAoYWN0aW9uKSB7XG4gIGNvbnN0IHsgcmVxdWVzdFR5cGUsIHJlcXVlc3RJZCwgY2hhbm5lbE5hbWUsIGNoYW5uZWxJZCB9ID0gYWN0aW9uLmRhdGE7XG4gIC8vIHB1dCBhbiBhY3Rpb24gdG8gdXBkYXRlIHRoZSByZXF1ZXN0IGluIHJlZHV4XG4gIHlpZWxkIHB1dChvblJlcXVlc3RVcGRhdGUocmVxdWVzdFR5cGUsIHJlcXVlc3RJZCkpO1xuICAvLyBpcyB0aGlzIGFuIGV4aXN0aW5nIHJlcXVlc3Q/XG4gIC8vIElmIHRoaXMgdXJpIGlzIGluIHRoZSByZXF1ZXN0IGxpc3QsIGl0J3MgYWxyZWFkeSBiZWVuIGZldGNoZWRcbiAgY29uc3Qgc3RhdGUgPSB5aWVsZCBzZWxlY3Qoc2VsZWN0U2hvd1N0YXRlKTtcbiAgY29uc3QgaG9zdCA9IHlpZWxkIHNlbGVjdChzZWxlY3RTaXRlSG9zdCk7XG4gIGlmIChzdGF0ZS5yZXF1ZXN0TGlzdFtyZXF1ZXN0SWRdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZ2V0IGNoYW5uZWwgbG9uZyBpZFxuICBsZXQgbG9uZ0lkLCBzaG9ydElkO1xuICB0cnkge1xuICAgICh7IGRhdGE6IHtsb25nQ2hhbm5lbENsYWltSWQ6IGxvbmdJZCwgc2hvcnRDaGFubmVsQ2xhaW1JZDogc2hvcnRJZH0gfSA9IHlpZWxkIGNhbGwoZ2V0Q2hhbm5lbERhdGEsIGhvc3QsIGNoYW5uZWxOYW1lLCBjaGFubmVsSWQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geWllbGQgcHV0KG9uUmVxdWVzdEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgfVxuICAvLyBzdG9yZSB0aGUgcmVxdWVzdCBpbiB0aGUgY2hhbm5lbCByZXF1ZXN0cyBsaXN0XG4gIGNvbnN0IGNoYW5uZWxLZXkgPSBgYyMke2NoYW5uZWxOYW1lfSMke2xvbmdJZH1gO1xuICB5aWVsZCBwdXQoYWRkUmVxdWVzdFRvUmVxdWVzdExpc3QocmVxdWVzdElkLCBudWxsLCBjaGFubmVsS2V5KSk7XG4gIC8vIGlzIHRoaXMgYW4gZXhpc3RpbmcgY2hhbm5lbD9cbiAgLy8gSWYgdGhpcyBjaGFubmVsIGlzIGluIHRoZSBjaGFubmVsIGxpc3QsIGl0J3MgYWxyZWFkeSBiZWVuIGZldGNoZWRcbiAgaWYgKHN0YXRlLmNoYW5uZWxMaXN0W2NoYW5uZWxLZXldKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZ2V0IGNoYW5uZWwgY2xhaW1zIGRhdGFcbiAgbGV0IGNsYWltc0RhdGE7XG4gIHRyeSB7XG4gICAgKHsgZGF0YTogY2xhaW1zRGF0YSB9ID0geWllbGQgY2FsbChnZXRDaGFubmVsQ2xhaW1zLCBob3N0LCBsb25nSWQsIGNoYW5uZWxOYW1lLCAxKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgLy8gc3RvcmUgdGhlIGNoYW5uZWwgZGF0YSBpbiB0aGUgY2hhbm5lbCBsaXN0XG4gIHlpZWxkIHB1dChhZGROZXdDaGFubmVsVG9DaGFubmVsTGlzdChjaGFubmVsS2V5LCBjaGFubmVsTmFtZSwgc2hvcnRJZCwgbG9uZ0lkLCBjbGFpbXNEYXRhKSk7XG4gIC8vIGNsZWFyIGFueSByZXF1ZXN0IGVycm9yc1xuICB5aWVsZCBwdXQob25SZXF1ZXN0RXJyb3IobnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaE5ld0NoYW5uZWxSZXF1ZXN0ICgpIHtcbiAgeWllbGQgdGFrZUxhdGVzdChhY3Rpb25zLkNIQU5ORUxfUkVRVUVTVF9ORVcsIG5ld0NoYW5uZWxSZXF1ZXN0KTtcbn07XG5cbmZ1bmN0aW9uICogZ2V0TmV3Q2xhaW1zQW5kVXBkYXRlQ2hhbm5lbCAoYWN0aW9uKSB7XG4gIGNvbnN0IHsgY2hhbm5lbEtleSwgbmFtZSwgbG9uZ0lkLCBwYWdlIH0gPSBhY3Rpb24uZGF0YTtcbiAgY29uc3QgaG9zdCA9IHlpZWxkIHNlbGVjdChzZWxlY3RTaXRlSG9zdCk7XG4gIGxldCBjbGFpbXNEYXRhO1xuICB0cnkge1xuICAgICh7IGRhdGE6IGNsYWltc0RhdGEgfSA9IHlpZWxkIGNhbGwoZ2V0Q2hhbm5lbENsYWltcywgaG9zdCwgbG9uZ0lkLCBuYW1lLCBwYWdlKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHlpZWxkIHB1dChvblJlcXVlc3RFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gIH1cbiAgeWllbGQgcHV0KHVwZGF0ZUNoYW5uZWxDbGFpbXMoY2hhbm5lbEtleSwgY2xhaW1zRGF0YSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gKiB3YXRjaFVwZGF0ZUNoYW5uZWxDbGFpbXMgKCkge1xuICB5aWVsZCB0YWtlTGF0ZXN0KGFjdGlvbnMuQ0hBTk5FTF9DTEFJTVNfVVBEQVRFX0FTWU5DLCBnZXROZXdDbGFpbXNBbmRVcGRhdGVDaGFubmVsKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9zYWdhcy9zaG93X2NoYW5uZWwuanMiLCJpbXBvcnQgUmVxdWVzdCBmcm9tICd1dGlscy9yZXF1ZXN0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5uZWxEYXRhIChob3N0LCBpZCwgbmFtZSkge1xuICBpZiAoIWlkKSBpZCA9ICdub25lJztcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NoYW5uZWwvZGF0YS8ke25hbWV9LyR7aWR9YDtcbiAgcmV0dXJuIFJlcXVlc3QodXJsKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVsQ2xhaW1zIChob3N0LCBsb25nSWQsIG5hbWUsIHBhZ2UpIHtcbiAgaWYgKCFwYWdlKSBwYWdlID0gMTtcbiAgY29uc3QgdXJsID0gYCR7aG9zdH0vYXBpL2NoYW5uZWwvY2xhaW1zLyR7bmFtZX0vJHtsb25nSWR9LyR7cGFnZX1gO1xuICByZXR1cm4gUmVxdWVzdCh1cmwpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9hcGkvY2hhbm5lbEFwaS5qcyIsImNvbnN0IGhhbmRsZVBhZ2VSZW5kZXIgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2hhbmRsZVBhZ2VSZW5kZXIuanN4Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwID0+IHtcbiAgLy8gYSBjYXRjaC1hbGwgcm91dGUgaWYgc29tZW9uZSB2aXNpdHMgYSBwYWdlIHRoYXQgZG9lcyBub3QgZXhpc3RcbiAgYXBwLnVzZSgnKicsIChyZXEsIHJlcykgPT4ge1xuICAgIC8vIHNlbmQgcmVzcG9uc2VcbiAgICBoYW5kbGVQYWdlUmVuZGVyKHJlcSwgcmVzKTtcbiAgfSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmVyL3JvdXRlcy9mYWxsYmFjay1yb3V0ZXMuanMiLCJjb25zdCB7IGxvZ0xldmVsIH0gPSByZXF1aXJlKCcuLi8uLi9jb25maWcvbG9nZ2VyQ29uZmlnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKHdpbnN0b24pID0+IHtcbiAgLy8gY29uZmlndXJlXG4gIHdpbnN0b24uY29uZmlndXJlKHtcbiAgICB0cmFuc3BvcnRzOiBbXG4gICAgICBuZXcgKHdpbnN0b24udHJhbnNwb3J0cy5Db25zb2xlKSh7XG4gICAgICAgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxvZ0xldmVsLFxuICAgICAgICB0aW1lc3RhbXAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgY29sb3JpemUgICAgICAgICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgcHJldHR5UHJpbnQgICAgICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgaGFuZGxlRXhjZXB0aW9ucyAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgaHVtYW5SZWFkYWJsZVVuaGFuZGxlZEV4Y2VwdGlvbjogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIF0sXG4gIH0pO1xuICAvLyB0ZXN0IGFsbCB0aGUgbG9nIGxldmVsc1xuICB3aW5zdG9uLmVycm9yKCdMZXZlbCAwJyk7XG4gIHdpbnN0b24ud2FybignTGV2ZWwgMScpO1xuICB3aW5zdG9uLmluZm8oJ0xldmVsIDInKTtcbiAgd2luc3Rvbi52ZXJib3NlKCdMZXZlbCAzJyk7XG4gIHdpbnN0b24uZGVidWcoJ0xldmVsIDQnKTtcbiAgd2luc3Rvbi5zaWxseSgnTGV2ZWwgNScpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZlci9oZWxwZXJzL2NvbmZpZ3VyZUxvZ2dlci5qcyIsImNvbnN0IGxvZ2dlckNvbmZpZyA9IHtcbiAgbG9nTGV2ZWw6ICdkZWJ1ZycsICAvLyBvcHRpb25zOiBzaWxseSwgZGVidWcsIHZlcmJvc2UsIGluZm9cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbG9nZ2VyQ29uZmlnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY29uZmlnL2xvZ2dlckNvbmZpZy5qcyIsImNvbnN0IHdpbnN0b25TbGFja1dlYkhvb2sgPSByZXF1aXJlKCd3aW5zdG9uLXNsYWNrLXdlYmhvb2snKS5TbGFja1dlYkhvb2s7XG5jb25zdCBzbGFja0NvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZy9zbGFja0NvbmZpZy5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICh3aW5zdG9uKSA9PiB7XG4gIGNvbnN0IHtzbGFja1dlYkhvb2ssIHNsYWNrRXJyb3JDaGFubmVsLCBzbGFja0luZm9DaGFubmVsfSA9IHNsYWNrQ29uZmlnO1xuICBpZiAoc2xhY2tXZWJIb29rKSB7XG4gICAgLy8gYWRkIGEgdHJhbnNwb3J0IGZvciBlcnJvcnMgdG8gc2xhY2tcbiAgICBpZiAoc2xhY2tFcnJvckNoYW5uZWwpIHtcbiAgICAgIHdpbnN0b24uYWRkKHdpbnN0b25TbGFja1dlYkhvb2ssIHtcbiAgICAgICAgbmFtZSAgICAgIDogJ3NsYWNrLWVycm9ycy10cmFuc3BvcnQnLFxuICAgICAgICBsZXZlbCAgICAgOiAnd2FybicsXG4gICAgICAgIHdlYmhvb2tVcmw6IHNsYWNrV2ViSG9vayxcbiAgICAgICAgY2hhbm5lbCAgIDogc2xhY2tFcnJvckNoYW5uZWwsXG4gICAgICAgIHVzZXJuYW1lICA6ICdzcGVlLmNoJyxcbiAgICAgICAgaWNvbkVtb2ppIDogJzpmYWNlX3dpdGhfaGVhZF9iYW5kYWdlOicsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGlmIChzbGFja0luZm9DaGFubmVsKSB7XG4gICAgICB3aW5zdG9uLmFkZCh3aW5zdG9uU2xhY2tXZWJIb29rLCB7XG4gICAgICAgIG5hbWUgICAgICA6ICdzbGFjay1pbmZvLXRyYW5zcG9ydCcsXG4gICAgICAgIGxldmVsICAgICA6ICdpbmZvJyxcbiAgICAgICAgd2ViaG9va1VybDogc2xhY2tXZWJIb29rLFxuICAgICAgICBjaGFubmVsICAgOiBzbGFja0luZm9DaGFubmVsLFxuICAgICAgICB1c2VybmFtZSAgOiAnc3BlZS5jaCcsXG4gICAgICAgIGljb25FbW9qaSA6ICc6bmVyZF9mYWNlOicsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8vIHNlbmQgdGVzdCBtZXNzYWdlXG4gICAgd2luc3Rvbi5lcnJvcignU2xhY2sgXCJlcnJvclwiIGxvZ2dpbmcgaXMgb25saW5lLicpO1xuICAgIHdpbnN0b24uaW5mbygnU2xhY2sgXCJpbmZvXCIgbG9nZ2luZyBpcyBvbmxpbmUuJyk7XG4gIH0gZWxzZSB7XG4gICAgd2luc3Rvbi53YXJuKCdTbGFjayBsb2dnaW5nIGlzIG5vdCBlbmFibGVkIGJlY2F1c2Ugbm8gc2xhY2tXZWJIb29rIGNvbmZpZyB2YXIgcHJvdmlkZWQuJyk7XG4gIH1cbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zZXJ2ZXIvaGVscGVycy9jb25maWd1cmVTbGFjay5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndpbnN0b24tc2xhY2std2ViaG9va1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIndpbnN0b24tc2xhY2std2ViaG9va1wiXG4vLyBtb2R1bGUgaWQgPSAxNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIG1hcCA9IHtcblx0XCIuL1wiOiA1MCxcblx0XCIuL0FjdGl2ZVN0YXR1c0JhclwiOiAyNCxcblx0XCIuL0FjdGl2ZVN0YXR1c0Jhci9cIjogMjQsXG5cdFwiLi9BY3RpdmVTdGF0dXNCYXIvaW5kZXhcIjogMjQsXG5cdFwiLi9BY3RpdmVTdGF0dXNCYXIvaW5kZXguanN4XCI6IDI0LFxuXHRcIi4vQXNzZXRQcmV2aWV3XCI6IDM0LFxuXHRcIi4vQXNzZXRQcmV2aWV3L1wiOiAzNCxcblx0XCIuL0Fzc2V0UHJldmlldy9pbmRleFwiOiAzNCxcblx0XCIuL0Fzc2V0UHJldmlldy9pbmRleC5qc1wiOiAzNCxcblx0XCIuL0Fzc2V0UHJldmlldy92aWV3XCI6IDc4LFxuXHRcIi4vQXNzZXRQcmV2aWV3L3ZpZXcuanN4XCI6IDc4LFxuXHRcIi4vRXhwYW5kaW5nVGV4dEFyZWFcIjogMzYsXG5cdFwiLi9FeHBhbmRpbmdUZXh0QXJlYS9cIjogMzYsXG5cdFwiLi9FeHBhbmRpbmdUZXh0QXJlYS9pbmRleFwiOiAzNixcblx0XCIuL0V4cGFuZGluZ1RleHRBcmVhL2luZGV4LmpzeFwiOiAzNixcblx0XCIuL0dBTGlzdGVuZXJcIjogMTMsXG5cdFwiLi9HQUxpc3RlbmVyL1wiOiAxMyxcblx0XCIuL0dBTGlzdGVuZXIvaW5kZXhcIjogMTMsXG5cdFwiLi9HQUxpc3RlbmVyL2luZGV4LmpzeFwiOiAxMyxcblx0XCIuL0luYWN0aXZlU3RhdHVzQmFyXCI6IDI1LFxuXHRcIi4vSW5hY3RpdmVTdGF0dXNCYXIvXCI6IDI1LFxuXHRcIi4vSW5hY3RpdmVTdGF0dXNCYXIvaW5kZXhcIjogMjUsXG5cdFwiLi9JbmFjdGl2ZVN0YXR1c0Jhci9pbmRleC5qc3hcIjogMjUsXG5cdFwiLi9Mb2dvXCI6IDIxLFxuXHRcIi4vTG9nby9cIjogMjEsXG5cdFwiLi9Mb2dvL2luZGV4XCI6IDIxLFxuXHRcIi4vTG9nby9pbmRleC5qc3hcIjogMjEsXG5cdFwiLi9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duXCI6IDIyLFxuXHRcIi4vTmF2QmFyQ2hhbm5lbE9wdGlvbnNEcm9wZG93bi9cIjogMjIsXG5cdFwiLi9OYXZCYXJDaGFubmVsT3B0aW9uc0Ryb3Bkb3duL2luZGV4XCI6IDIyLFxuXHRcIi4vTmF2QmFyQ2hhbm5lbE9wdGlvbnNEcm9wZG93bi9pbmRleC5qc3hcIjogMjIsXG5cdFwiLi9Qcm9ncmVzc0JhclwiOiAxMCxcblx0XCIuL1Byb2dyZXNzQmFyL1wiOiAxMCxcblx0XCIuL1Byb2dyZXNzQmFyL2luZGV4XCI6IDEwLFxuXHRcIi4vUHJvZ3Jlc3NCYXIvaW5kZXguanN4XCI6IDEwLFxuXHRcIi4vUHVibGlzaFByZXZpZXdcIjogMzcsXG5cdFwiLi9QdWJsaXNoUHJldmlldy9cIjogMzcsXG5cdFwiLi9QdWJsaXNoUHJldmlldy9pbmRleFwiOiAzNyxcblx0XCIuL1B1Ymxpc2hQcmV2aWV3L2luZGV4LmpzeFwiOiAzNyxcblx0XCIuL1B1Ymxpc2hVcmxNaWRkbGVEaXNwbGF5XCI6IDM4LFxuXHRcIi4vUHVibGlzaFVybE1pZGRsZURpc3BsYXkvXCI6IDM4LFxuXHRcIi4vUHVibGlzaFVybE1pZGRsZURpc3BsYXkvaW5kZXhcIjogMzgsXG5cdFwiLi9QdWJsaXNoVXJsTWlkZGxlRGlzcGxheS9pbmRleC5qc3hcIjogMzgsXG5cdFwiLi9TRU9cIjogNyxcblx0XCIuL1NFTy9cIjogNyxcblx0XCIuL1NFTy9pbmRleFwiOiA3LFxuXHRcIi4vU0VPL2luZGV4LmpzXCI6IDcsXG5cdFwiLi9TRU8vdmlld1wiOiA2Nixcblx0XCIuL1NFTy92aWV3LmpzeFwiOiA2Nixcblx0XCIuL2luZGV4XCI6IDUwLFxuXHRcIi4vaW5kZXguanNcIjogNTBcbn07XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18od2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkpO1xufTtcbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0dmFyIGlkID0gbWFwW3JlcV07XG5cdGlmKCEoaWQgKyAxKSkgLy8gY2hlY2sgZm9yIG51bWJlciBvciBzdHJpbmdcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInLlwiKTtcblx0cmV0dXJuIGlkO1xufTtcbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSAxNjg7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9jbGllbnQvY29tcG9uZW50cyBeXFwuXFwvLiokXG4vLyBtb2R1bGUgaWQgPSAxNjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIG1hcCA9IHtcblx0XCIuL1wiOiA1Mixcblx0XCIuL0Fzc2V0RGlzcGxheVwiOiAxNyxcblx0XCIuL0Fzc2V0RGlzcGxheS9cIjogMTcsXG5cdFwiLi9Bc3NldERpc3BsYXkvaW5kZXhcIjogMTcsXG5cdFwiLi9Bc3NldERpc3BsYXkvaW5kZXguanNcIjogMTcsXG5cdFwiLi9Bc3NldERpc3BsYXkvdmlld1wiOiA3Mixcblx0XCIuL0Fzc2V0RGlzcGxheS92aWV3LmpzeFwiOiA3Mixcblx0XCIuL0Fzc2V0SW5mb1wiOiAzMSxcblx0XCIuL0Fzc2V0SW5mby9cIjogMzEsXG5cdFwiLi9Bc3NldEluZm8vaW5kZXhcIjogMzEsXG5cdFwiLi9Bc3NldEluZm8vaW5kZXguanNcIjogMzEsXG5cdFwiLi9Bc3NldEluZm8vdmlld1wiOiA3NSxcblx0XCIuL0Fzc2V0SW5mby92aWV3LmpzeFwiOiA3NSxcblx0XCIuL0Fzc2V0VGl0bGVcIjogMzAsXG5cdFwiLi9Bc3NldFRpdGxlL1wiOiAzMCxcblx0XCIuL0Fzc2V0VGl0bGUvaW5kZXhcIjogMzAsXG5cdFwiLi9Bc3NldFRpdGxlL2luZGV4LmpzXCI6IDMwLFxuXHRcIi4vQXNzZXRUaXRsZS92aWV3XCI6IDc0LFxuXHRcIi4vQXNzZXRUaXRsZS92aWV3LmpzeFwiOiA3NCxcblx0XCIuL0NoYW5uZWxDbGFpbXNEaXNwbGF5XCI6IDMzLFxuXHRcIi4vQ2hhbm5lbENsYWltc0Rpc3BsYXkvXCI6IDMzLFxuXHRcIi4vQ2hhbm5lbENsYWltc0Rpc3BsYXkvaW5kZXhcIjogMzMsXG5cdFwiLi9DaGFubmVsQ2xhaW1zRGlzcGxheS9pbmRleC5qc1wiOiAzMyxcblx0XCIuL0NoYW5uZWxDbGFpbXNEaXNwbGF5L3ZpZXdcIjogNzcsXG5cdFwiLi9DaGFubmVsQ2xhaW1zRGlzcGxheS92aWV3LmpzeFwiOiA3Nyxcblx0XCIuL0NoYW5uZWxDcmVhdGVGb3JtXCI6IDE2LFxuXHRcIi4vQ2hhbm5lbENyZWF0ZUZvcm0vXCI6IDE2LFxuXHRcIi4vQ2hhbm5lbENyZWF0ZUZvcm0vaW5kZXhcIjogMTYsXG5cdFwiLi9DaGFubmVsQ3JlYXRlRm9ybS9pbmRleC5qc1wiOiAxNixcblx0XCIuL0NoYW5uZWxDcmVhdGVGb3JtL3ZpZXdcIjogNjksXG5cdFwiLi9DaGFubmVsQ3JlYXRlRm9ybS92aWV3LmpzeFwiOiA2OSxcblx0XCIuL0NoYW5uZWxMb2dpbkZvcm1cIjogMTUsXG5cdFwiLi9DaGFubmVsTG9naW5Gb3JtL1wiOiAxNSxcblx0XCIuL0NoYW5uZWxMb2dpbkZvcm0vaW5kZXhcIjogMTUsXG5cdFwiLi9DaGFubmVsTG9naW5Gb3JtL2luZGV4LmpzXCI6IDE1LFxuXHRcIi4vQ2hhbm5lbExvZ2luRm9ybS92aWV3XCI6IDY4LFxuXHRcIi4vQ2hhbm5lbExvZ2luRm9ybS92aWV3LmpzeFwiOiA2OCxcblx0XCIuL0NoYW5uZWxTZWxlY3RcIjogMzksXG5cdFwiLi9DaGFubmVsU2VsZWN0L1wiOiAzOSxcblx0XCIuL0NoYW5uZWxTZWxlY3QvaW5kZXhcIjogMzksXG5cdFwiLi9DaGFubmVsU2VsZWN0L2luZGV4LmpzXCI6IDM5LFxuXHRcIi4vQ2hhbm5lbFNlbGVjdC92aWV3XCI6IDgxLFxuXHRcIi4vQ2hhbm5lbFNlbGVjdC92aWV3LmpzeFwiOiA4MSxcblx0XCIuL0Ryb3B6b25lXCI6IDE4LFxuXHRcIi4vRHJvcHpvbmUvXCI6IDE4LFxuXHRcIi4vRHJvcHpvbmUvaW5kZXhcIjogMTgsXG5cdFwiLi9Ecm9wem9uZS9pbmRleC5qc1wiOiAxOCxcblx0XCIuL0Ryb3B6b25lL3ZpZXdcIjogODIsXG5cdFwiLi9Ecm9wem9uZS92aWV3LmpzeFwiOiA4Mixcblx0XCIuL0ZvdXJPaEZvdXJQYWdlXCI6IDM1LFxuXHRcIi4vRm91ck9oRm91clBhZ2UvXCI6IDM1LFxuXHRcIi4vRm91ck9oRm91clBhZ2UvaW5kZXhcIjogMzUsXG5cdFwiLi9Gb3VyT2hGb3VyUGFnZS9pbmRleC5qc3hcIjogMzUsXG5cdFwiLi9Gb3VyT2hGb3VyUGFnZS92aWV3XCI6IDc5LFxuXHRcIi4vRm91ck9oRm91clBhZ2Uvdmlldy5qc3hcIjogNzksXG5cdFwiLi9OYXZCYXJcIjogNSxcblx0XCIuL05hdkJhci9cIjogNSxcblx0XCIuL05hdkJhci9pbmRleFwiOiA1LFxuXHRcIi4vTmF2QmFyL2luZGV4LmpzXCI6IDUsXG5cdFwiLi9OYXZCYXIvdmlld1wiOiA2NSxcblx0XCIuL05hdkJhci92aWV3LmpzeFwiOiA2NSxcblx0XCIuL1B1Ymxpc2hEZXRhaWxzXCI6IDQwLFxuXHRcIi4vUHVibGlzaERldGFpbHMvXCI6IDQwLFxuXHRcIi4vUHVibGlzaERldGFpbHMvaW5kZXhcIjogNDAsXG5cdFwiLi9QdWJsaXNoRGV0YWlscy9pbmRleC5qc1wiOiA0MCxcblx0XCIuL1B1Ymxpc2hEZXRhaWxzL3ZpZXdcIjogODMsXG5cdFwiLi9QdWJsaXNoRGV0YWlscy92aWV3LmpzeFwiOiA4Myxcblx0XCIuL1B1Ymxpc2hEaXNhYmxlZE1lc3NhZ2VcIjogNDUsXG5cdFwiLi9QdWJsaXNoRGlzYWJsZWRNZXNzYWdlL1wiOiA0NSxcblx0XCIuL1B1Ymxpc2hEaXNhYmxlZE1lc3NhZ2UvaW5kZXhcIjogNDUsXG5cdFwiLi9QdWJsaXNoRGlzYWJsZWRNZXNzYWdlL2luZGV4LmpzXCI6IDQ1LFxuXHRcIi4vUHVibGlzaERpc2FibGVkTWVzc2FnZS92aWV3XCI6IDg4LFxuXHRcIi4vUHVibGlzaERpc2FibGVkTWVzc2FnZS92aWV3LmpzeFwiOiA4OCxcblx0XCIuL1B1Ymxpc2hNZXRhZGF0YUlucHV0c1wiOiA0NCxcblx0XCIuL1B1Ymxpc2hNZXRhZGF0YUlucHV0cy9cIjogNDQsXG5cdFwiLi9QdWJsaXNoTWV0YWRhdGFJbnB1dHMvaW5kZXhcIjogNDQsXG5cdFwiLi9QdWJsaXNoTWV0YWRhdGFJbnB1dHMvaW5kZXguanNcIjogNDQsXG5cdFwiLi9QdWJsaXNoTWV0YWRhdGFJbnB1dHMvdmlld1wiOiA4Nyxcblx0XCIuL1B1Ymxpc2hNZXRhZGF0YUlucHV0cy92aWV3LmpzeFwiOiA4Nyxcblx0XCIuL1B1Ymxpc2hTdGF0dXNcIjogNDYsXG5cdFwiLi9QdWJsaXNoU3RhdHVzL1wiOiA0Nixcblx0XCIuL1B1Ymxpc2hTdGF0dXMvaW5kZXhcIjogNDYsXG5cdFwiLi9QdWJsaXNoU3RhdHVzL2luZGV4LmpzXCI6IDQ2LFxuXHRcIi4vUHVibGlzaFN0YXR1cy92aWV3XCI6IDg5LFxuXHRcIi4vUHVibGlzaFN0YXR1cy92aWV3LmpzeFwiOiA4OSxcblx0XCIuL1B1Ymxpc2hUaHVtYm5haWxJbnB1dFwiOiA0Myxcblx0XCIuL1B1Ymxpc2hUaHVtYm5haWxJbnB1dC9cIjogNDMsXG5cdFwiLi9QdWJsaXNoVGh1bWJuYWlsSW5wdXQvaW5kZXhcIjogNDMsXG5cdFwiLi9QdWJsaXNoVGh1bWJuYWlsSW5wdXQvaW5kZXguanNcIjogNDMsXG5cdFwiLi9QdWJsaXNoVGh1bWJuYWlsSW5wdXQvdmlld1wiOiA4Nixcblx0XCIuL1B1Ymxpc2hUaHVtYm5haWxJbnB1dC92aWV3LmpzeFwiOiA4Nixcblx0XCIuL1B1Ymxpc2hUaXRsZUlucHV0XCI6IDQxLFxuXHRcIi4vUHVibGlzaFRpdGxlSW5wdXQvXCI6IDQxLFxuXHRcIi4vUHVibGlzaFRpdGxlSW5wdXQvaW5kZXhcIjogNDEsXG5cdFwiLi9QdWJsaXNoVGl0bGVJbnB1dC9pbmRleC5qc1wiOiA0MSxcblx0XCIuL1B1Ymxpc2hUaXRsZUlucHV0L3ZpZXdcIjogODQsXG5cdFwiLi9QdWJsaXNoVGl0bGVJbnB1dC92aWV3LmpzeFwiOiA4NCxcblx0XCIuL1B1Ymxpc2hUb29sXCI6IDQ3LFxuXHRcIi4vUHVibGlzaFRvb2wvXCI6IDQ3LFxuXHRcIi4vUHVibGlzaFRvb2wvaW5kZXhcIjogNDcsXG5cdFwiLi9QdWJsaXNoVG9vbC9pbmRleC5qc1wiOiA0Nyxcblx0XCIuL1B1Ymxpc2hUb29sL3ZpZXdcIjogOTAsXG5cdFwiLi9QdWJsaXNoVG9vbC92aWV3LmpzeFwiOiA5MCxcblx0XCIuL1B1Ymxpc2hVcmxJbnB1dFwiOiA0Mixcblx0XCIuL1B1Ymxpc2hVcmxJbnB1dC9cIjogNDIsXG5cdFwiLi9QdWJsaXNoVXJsSW5wdXQvaW5kZXhcIjogNDIsXG5cdFwiLi9QdWJsaXNoVXJsSW5wdXQvaW5kZXguanNcIjogNDIsXG5cdFwiLi9QdWJsaXNoVXJsSW5wdXQvdmlld1wiOiA4NSxcblx0XCIuL1B1Ymxpc2hVcmxJbnB1dC92aWV3LmpzeFwiOiA4NSxcblx0XCIuL1Nob3dBc3NldERldGFpbHNcIjogMjksXG5cdFwiLi9TaG93QXNzZXREZXRhaWxzL1wiOiAyOSxcblx0XCIuL1Nob3dBc3NldERldGFpbHMvaW5kZXhcIjogMjksXG5cdFwiLi9TaG93QXNzZXREZXRhaWxzL2luZGV4LmpzXCI6IDI5LFxuXHRcIi4vU2hvd0Fzc2V0RGV0YWlscy92aWV3XCI6IDczLFxuXHRcIi4vU2hvd0Fzc2V0RGV0YWlscy92aWV3LmpzeFwiOiA3Myxcblx0XCIuL1Nob3dBc3NldExpdGVcIjogMjcsXG5cdFwiLi9TaG93QXNzZXRMaXRlL1wiOiAyNyxcblx0XCIuL1Nob3dBc3NldExpdGUvaW5kZXhcIjogMjcsXG5cdFwiLi9TaG93QXNzZXRMaXRlL2luZGV4LmpzXCI6IDI3LFxuXHRcIi4vU2hvd0Fzc2V0TGl0ZS92aWV3XCI6IDcxLFxuXHRcIi4vU2hvd0Fzc2V0TGl0ZS92aWV3LmpzeFwiOiA3MSxcblx0XCIuL1Nob3dDaGFubmVsXCI6IDMyLFxuXHRcIi4vU2hvd0NoYW5uZWwvXCI6IDMyLFxuXHRcIi4vU2hvd0NoYW5uZWwvaW5kZXhcIjogMzIsXG5cdFwiLi9TaG93Q2hhbm5lbC9pbmRleC5qc1wiOiAzMixcblx0XCIuL1Nob3dDaGFubmVsL3ZpZXdcIjogNzYsXG5cdFwiLi9TaG93Q2hhbm5lbC92aWV3LmpzeFwiOiA3Nixcblx0XCIuL2luZGV4XCI6IDUyLFxuXHRcIi4vaW5kZXguanNcIjogNTJcbn07XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18od2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkpO1xufTtcbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0dmFyIGlkID0gbWFwW3JlcV07XG5cdGlmKCEoaWQgKyAxKSkgLy8gY2hlY2sgZm9yIG51bWJlciBvciBzdHJpbmdcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInLlwiKTtcblx0cmV0dXJuIGlkO1xufTtcbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSAxNjk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9jbGllbnQvY29udGFpbmVycyBeXFwuXFwvLiokXG4vLyBtb2R1bGUgaWQgPSAxNjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0IGNvbnN0IExPQURfU1RBUlQgPSAnTE9BRF9TVEFSVCc7XG5leHBvcnQgY29uc3QgTE9BRElORyA9ICdMT0FESU5HJztcbmV4cG9ydCBjb25zdCBQVUJMSVNISU5HID0gJ1BVQkxJU0hJTkcnO1xuZXhwb3J0IGNvbnN0IFNVQ0NFU1MgPSAnU1VDQ0VTUyc7XG5leHBvcnQgY29uc3QgRkFJTEVEID0gJ0ZBSUxFRCc7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvY29uc3RhbnRzL3B1Ymxpc2hfY2xhaW1fc3RhdGVzLmpzIiwidmFyIG1hcCA9IHtcblx0XCIuL1wiOiA1Myxcblx0XCIuL0Fib3V0UGFnZVwiOiAyMCxcblx0XCIuL0Fib3V0UGFnZS9cIjogMjAsXG5cdFwiLi9BYm91dFBhZ2UvaW5kZXhcIjogMjAsXG5cdFwiLi9BYm91dFBhZ2UvaW5kZXguanN4XCI6IDIwLFxuXHRcIi4vRXJyb3JQYWdlXCI6IDEyLFxuXHRcIi4vRXJyb3JQYWdlL1wiOiAxMixcblx0XCIuL0Vycm9yUGFnZS9pbmRleFwiOiAxMixcblx0XCIuL0Vycm9yUGFnZS9pbmRleC5qc3hcIjogMTIsXG5cdFwiLi9Ib21lUGFnZVwiOiA1NCxcblx0XCIuL0hvbWVQYWdlL1wiOiA1NCxcblx0XCIuL0hvbWVQYWdlL2luZGV4XCI6IDU0LFxuXHRcIi4vSG9tZVBhZ2UvaW5kZXguanN4XCI6IDU0LFxuXHRcIi4vTG9naW5QYWdlXCI6IDIzLFxuXHRcIi4vTG9naW5QYWdlL1wiOiAyMyxcblx0XCIuL0xvZ2luUGFnZS9pbmRleFwiOiAyMyxcblx0XCIuL0xvZ2luUGFnZS9pbmRleC5qc1wiOiAyMyxcblx0XCIuL0xvZ2luUGFnZS92aWV3XCI6IDY3LFxuXHRcIi4vTG9naW5QYWdlL3ZpZXcuanN4XCI6IDY3LFxuXHRcIi4vU2hvd1BhZ2VcIjogMjYsXG5cdFwiLi9TaG93UGFnZS9cIjogMjYsXG5cdFwiLi9TaG93UGFnZS9pbmRleFwiOiAyNixcblx0XCIuL1Nob3dQYWdlL2luZGV4LmpzXCI6IDI2LFxuXHRcIi4vU2hvd1BhZ2Uvdmlld1wiOiA3MCxcblx0XCIuL1Nob3dQYWdlL3ZpZXcuanN4XCI6IDcwLFxuXHRcIi4vaW5kZXhcIjogNTMsXG5cdFwiLi9pbmRleC5qc1wiOiA1M1xufTtcbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyh3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSk7XG59O1xuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHR2YXIgaWQgPSBtYXBbcmVxXTtcblx0aWYoIShpZCArIDEpKSAvLyBjaGVjayBmb3IgbnVtYmVyIG9yIHN0cmluZ1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIicuXCIpO1xuXHRyZXR1cm4gaWQ7XG59O1xud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IDE3MTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2NsaWVudC9wYWdlcyBeXFwuXFwvLiokXG4vLyBtb2R1bGUgaWQgPSAxNzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +module.exports = exports; diff --git a/index.js.map b/index.js.map deleted file mode 100644 index 78e768a6..00000000 --- a/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///index.js","webpack:///webpack/bootstrap ab248b8a96a96b3ce431","webpack:///external \"react\"","webpack:///external \"react-redux\"","webpack:///external \"winston\"","webpack:///./config/siteConfig.js","webpack:///external \"react-router-dom\"","webpack:///./client/containers/NavBar/index.js","webpack:///./client/actions/publish.js","webpack:///./client/components/SEO/index.js","webpack:///./client/utils/request.js","webpack:///./server/models/index.js","webpack:///./client/components/ProgressBar/index.jsx","webpack:///./client/actions/show.js","webpack:///./client/pages/ErrorPage/index.jsx","webpack:///./client/components/GAListener/index.jsx","webpack:///external \"prop-types\"","webpack:///./client/containers/ChannelLoginForm/index.js","webpack:///./client/containers/ChannelCreateForm/index.js","webpack:///./client/containers/AssetDisplay/index.js","webpack:///./client/containers/Dropzone/index.js","webpack:///./client/constants/show_action_types.js","webpack:///./client/pages/AboutPage/index.jsx","webpack:///./client/components/Logo/index.jsx","webpack:///./client/components/NavBarChannelOptionsDropdown/index.jsx","webpack:///./client/pages/LoginPage/index.js","webpack:///./client/components/ActiveStatusBar/index.jsx","webpack:///./client/components/InactiveStatusBar/index.jsx","webpack:///./client/pages/ShowPage/index.js","webpack:///./client/containers/ShowAssetLite/index.js","webpack:///./client/selectors/show.js","webpack:///./client/containers/ShowAssetDetails/index.js","webpack:///./client/containers/AssetTitle/index.js","webpack:///./client/containers/AssetInfo/index.js","webpack:///./client/containers/ShowChannel/index.js","webpack:///./client/containers/ChannelClaimsDisplay/index.js","webpack:///./client/components/AssetPreview/index.js","webpack:///./client/containers/FourOhFourPage/index.jsx","webpack:///./client/components/ExpandingTextArea/index.jsx","webpack:///./client/components/PublishPreview/index.jsx","webpack:///./client/components/PublishUrlMiddleDisplay/index.jsx","webpack:///./client/containers/ChannelSelect/index.js","webpack:///./client/containers/PublishDetails/index.js","webpack:///./client/containers/PublishTitleInput/index.js","webpack:///./client/containers/PublishUrlInput/index.js","webpack:///./client/containers/PublishThumbnailInput/index.js","webpack:///./client/containers/PublishMetadataInputs/index.js","webpack:///./client/containers/PublishDisabledMessage/index.js","webpack:///./client/containers/PublishStatus/index.js","webpack:///./client/containers/PublishTool/index.js","webpack:///external \"react-helmet\"","webpack:///external \"redux-saga/effects\"","webpack:///./client/components/index.js","webpack:///external \"path\"","webpack:///./client/containers/index.js","webpack:///./client/pages/index.js","webpack:///./client/pages/HomePage/index.jsx","webpack:///./server/helpers/lbryApi.js","webpack:///./server/helpers/googleAnalytics.js","webpack:///external \"redux\"","webpack:///./client/utils/dynamicImport.js","webpack:///./client/utils/canonicalLink.js","webpack:///./client/utils/file.js","webpack:///./client/utils/lbryUri.js","webpack:///./client/utils/metaTags.js","webpack:///./client/utils/pageTitle.js","webpack:///./client/actions/channel.js","webpack:///./client/containers/NavBar/view.jsx","webpack:///./client/components/SEO/view.jsx","webpack:///./client/pages/LoginPage/view.jsx","webpack:///./client/containers/ChannelLoginForm/view.jsx","webpack:///./client/containers/ChannelCreateForm/view.jsx","webpack:///./client/pages/ShowPage/view.jsx","webpack:///./client/containers/ShowAssetLite/view.jsx","webpack:///./client/containers/AssetDisplay/view.jsx","webpack:///./client/containers/ShowAssetDetails/view.jsx","webpack:///./client/containers/AssetTitle/view.jsx","webpack:///./client/containers/AssetInfo/view.jsx","webpack:///./client/containers/ShowChannel/view.jsx","webpack:///./client/containers/ChannelClaimsDisplay/view.jsx","webpack:///./client/components/AssetPreview/view.jsx","webpack:///./client/containers/FourOhFourPage/view.jsx","webpack:///./build/getFolderNames.js","webpack:///./client/containers/ChannelSelect/view.jsx","webpack:///./client/containers/Dropzone/view.jsx","webpack:///./client/containers/PublishDetails/view.jsx","webpack:///./client/containers/PublishTitleInput/view.jsx","webpack:///./client/containers/PublishUrlInput/view.jsx","webpack:///./client/containers/PublishThumbnailInput/view.jsx","webpack:///./client/containers/PublishMetadataInputs/view.jsx","webpack:///./client/containers/PublishDisabledMessage/view.jsx","webpack:///./client/containers/PublishStatus/view.jsx","webpack:///./client/containers/PublishTool/view.jsx","webpack:///external \"passport\"","webpack:///./config/mysqlConfig.js","webpack:///./config/slackConfig.js","webpack:///external \"passport-local\"","webpack:///external \"sequelize\"","webpack:///./server/helpers/sequelizeHelpers.js","webpack:///./server/helpers/publishHelpers.js","webpack:///external \"fs\"","webpack:///./server/helpers/errorHandlers.js","webpack:///./server/controllers/serveController.js","webpack:///./server/helpers/handlePageRender.jsx","webpack:///external \"react-dom/server\"","webpack:///./client/reducers/index.js","webpack:///./client/constants/publish_action_types.js","webpack:///./client/constants/publish_channel_select_states.js","webpack:///./client/constants/channel_action_types.js","webpack:///./client/constants/asset_display_states.js","webpack:///./client/app.js","webpack:///./client/utils ^.*$","webpack:///./client/utils/publish.js","webpack:///./client/utils/validate.js","webpack:///./client/constants/show_request_types.js","webpack:///./server/helpers/renderFullPage.js","webpack:///./client/selectors/site.js","webpack:///external \"babel-polyfill\"","webpack:///external \"whatwg-fetch\"","webpack:///./speech.js","webpack:///./server/server.js","webpack:///external \"express\"","webpack:///external \"body-parser\"","webpack:///external \"express-handlebars\"","webpack:///external \"handlebars\"","webpack:///external \"helmet\"","webpack:///./server/helpers/authHelpers.js","webpack:///external \"cookie-session\"","webpack:///external \"http\"","webpack:///./server/passport/local-signup.js","webpack:///external \"axios\"","webpack:///./config/lbryConfig.js","webpack:///external \"universal-analytics\"","webpack:///./server/models/certificate.js","webpack:///./server/models/channel.js","webpack:///./server/models/claim.js","webpack:///./server/models/file.js","webpack:///./server/models/request.js","webpack:///./server/models/user.js","webpack:///external \"bcrypt\"","webpack:///./server/passport/local-login.js","webpack:///./server/routes/auth-routes.js","webpack:///./server/routes/api-routes.js","webpack:///external \"connect-multiparty\"","webpack:///./server/controllers/publishController.js","webpack:///./server/auth/authentication.js","webpack:///./server/helpers/channelPagination.js","webpack:///./server/routes/page-routes.js","webpack:///./client/reducers/publish.js","webpack:///./client/reducers/channel.js","webpack:///./client/reducers/show.js","webpack:///./client/reducers/site.js","webpack:///external \"react-ga\"","webpack:///external \"cross-fetch/polyfill\"","webpack:///./server/routes/asset-routes.js","webpack:///./server/helpers/serveHelpers.js","webpack:///./server/helpers/lbryUri.js","webpack:///./server/helpers/handleShowRender.jsx","webpack:///external \"redux-saga\"","webpack:///./client/sagas/show_uri.js","webpack:///./client/sagas/show_asset.js","webpack:///./client/api/assetApi.js","webpack:///./client/sagas/show_channel.js","webpack:///./client/api/channelApi.js","webpack:///./server/routes/fallback-routes.js","webpack:///./server/helpers/configureLogger.js","webpack:///./config/loggerConfig.js","webpack:///./server/helpers/configureSlack.js","webpack:///external \"winston-slack-webhook\"","webpack:///./client/components ^\\.\\/.*$","webpack:///./client/containers ^\\.\\/.*$","webpack:///./client/constants/publish_claim_states.js","webpack:///./client/pages ^\\.\\/.*$"],"names":["module","exports","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","require","SiteConfig","_this","this","analytics","googleId","assetDefaults","description","thumbnail","title","auth","sessionKey","customComponents","components","containers","pages","details","host","port","twitter","publishing","additionalClaimAddresses","disabled","disabledMessage","primaryClaimAddress","thumbnailChannel","thumbnailChannelId","uploadDirectory","configure","config","console","log","value","_reactRedux","_channel","_publish","_view","_view2","obj","default","mapStateToProps","_ref","channel","site","channelName","loggedInChannel","channelShortId","shortId","channelLongId","longId","siteDescription","mapDispatchToProps","dispatch","onChannelLogin","updateLoggedInChannel","updateSelectedChannel","onChannelLogout","connect","selectFile","file","type","actions","FILE_SELECTED","data","clearFile","FILE_CLEAR","updateMetadata","METADATA_UPDATE","updateClaim","CLAIM_UPDATE","setPublishInChannel","SET_PUBLISH_IN_CHANNEL","updatePublishStatus","status","message","PUBLISH_STATUS_UPDATE","updateError","ERROR_UPDATE","SELECTED_CHANNEL_UPDATE","toggleMetadataInputs","showMetadataInputs","TOGGLE_METADATA_INPUTS","onNewThumbnail","THUMBNAIL_NEW","startPublish","history","PUBLISH_START","_publish_action_types","newObj","key","defaultDescription","defaultThumbnail","siteHost","siteTitle","siteTwitter","parseJSON","response","json","checkStatus","jsonResponse","error","Error","request","url","options","fetch","then","Promise","all","_ref2","_slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","length","err","Array","isArray","TypeError","Sequelize","logger","_require","database","username","password","db","sequelize","dialect","dialectOptions","decimalNumbers","logging","pool","max","min","idle","acquire","authenticate","info","catch","Certificate","Channel","Claim","File","Request","User","import","keys","forEach","modelName","associate","upsert","Model","values","condition","tableName","findOne","where","debug","update","create","_interopRequireDefault","_classCallCheck","instance","Constructor","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","constructor","writable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","descriptor","protoProps","staticProps","_react","_react2","_propTypes","_propTypes2","_ActiveStatusBar","_ActiveStatusBar2","_InactiveStatusBar","_InactiveStatusBar2","ProgressBar","_React$Component","getPrototypeOf","state","bars","index","incrementer","createBars","bind","startProgressBar","updateProgressBar","stopProgressBar","size","isActive","setState","updateInterval","setInterval","clearInterval","createElement","map","bar","Component","propTypes","number","isRequired","onHandleShowPageUri","params","HANDLE_SHOW_URI","onRequestError","REQUEST_ERROR","onNewChannelRequest","channelId","requestType","requestId","CHANNEL_REQUEST_NEW","onNewAssetRequest","id","extension","ASSET_REQUEST_NEW","modifier","onRequestUpdate","REQUEST_UPDATE","addRequestToRequestList","REQUEST_LIST_ADD","addAssetToAssetList","claimId","claimData","ASSET_ADD","addNewChannelToChannelList","claimsData","CHANNEL_ADD","onUpdateChannelClaims","channelKey","page","CHANNEL_CLAIMS_UPDATE_ASYNC","updateChannelClaims","channelListId","CHANNEL_CLAIMS_UPDATE_SUCCESS","fileRequested","FILE_REQUESTED","updateFileAvailability","FILE_AVAILABILITY_UPDATE","updateDisplayAssetError","DISPLAY_ASSET_ERROR","_show_action_types","_show_request_types","_NavBar","_NavBar2","ErrorPage","apply","arguments","className","string","_reactGa","_reactGa2","_reactRouterDom","initialize","GAListener","sendPageView","location","listen","set","pathname","pageview","children","withRouter","_show","_show2","show","displayAsset","asset","selectAsset","onFileRequest","publish","fileError","setFileError","_SEO","_SEO2","AboutPage","pageTitle","pageUri","href","Logo","version","x","y","height","viewBox","enableBackground","Link","to","transform","fontSize","fontFamily","fill","stroke","strokeWidth","strokeLinecap","NavBarChannelDropdown","handleSelection","defaultSelection","VIEW","LOGOUT","onChange","loggedInChannelName","ActiveStatusBar","InactiveStatusBar","requestList","assetList","assetKey","selectShowState","previousRequest","channelList","defaults","_ref$site","_objectWithoutProperties","indexOf","_extends","assign","source","ExpandingTextarea","_Component","_handleChange","adjustTextarea","event","_ref$target","el","style","scrollHeight","_this2","rest","ref","func","PublishPreview","imgSource","setPreviewImageSource","newProps","setPreviewImageSourceFromFile","previewReader","FileReader","readAsDataURL","onloadend","result","src","dimPreview","alt","bool","UrlMiddle","publishInChannel","selectedChannel","loggedInChannelShortId","channelError","onPublishInChannelChange","onChannelSelect","metadata","onMetadataChange","fileName","claim","urlError","onClaimChange","onUrlError","license","nsfw","onToggleMetadataInputs","Path","getSubDirectoryNames","thisFolder","resolve","__dirname","_PublishTool","_PublishTool2","HomePage","axios","_require$api","api","apiHost","apiPort","lbryApiUri","_require2","chooseGaLbrynetPublishLabel","sendGATimingEvent","handleLbrynetResponse","reject","JSON","stringify","publishClaim","publishParams","gaStartTime","Date","now","post","method","getClaim","uri","timeout","getClaimList","claimName","resolveUri","getDownloadDirectory","_ref3","download_directory","createChannel","channel_name","amount","createServeEventParams","headers","ip","originalUrl","eventCategory","eventAction","eventLabel","ipOverride","userAgentOverride","createPublishTimingEventParams","category","variable","label","startTime","endTime","userTimingCategory","userTimingVariableName","userTimingTime","userTimingLabel","sendGoogleAnalyticsEvent","visitorId","replace","ua","strictCidFormat","https","sendGoogleAnalyticsTiming","timing","sendGAServeEvent","channel_id","getDeepestChildValue","parent","childrenKeys","childKey","shift","child","_typeof","dynamicImport","filePath","folders","split","filter","folderName","component","createBasicCanonicalLink","createAssetCanonicalLink","certificateId","_asset$claimData","createChannelCanonicalLink","createCanonicalLink","validateFile","test","REGEXP_INVALID_CLAIM","REGEXP_INVALID_CHANNEL","REGEXP_ADDRESS","CHANNEL_CHAR","parseIdentifier","identifier","componentsRegex","RegExp","_componentsRegex$exec","exec","match","_componentsRegex$exec2","modifierSeperator","isChannel","startsWith","nameBadChars","join","channelClaimId","parseClaim","_componentsRegex$exec3","_componentsRegex$exec4","extensionSeperator","determineOgThumbnailContentType","substring","lastIndexOf","createBasicMetaTags","content","createChannelMetaTags","createAssetMetaTags","contentType","embedUrl","showUrl","fileExt","ogTitle","ogDescription","ogThumbnailContentType","ogThumbnail","metaTags","createMetaTags","createPageTitle","CHANNEL_UPDATE","_channel_action_types","_Logo","_Logo2","_NavBarChannelOptionsDropdown","_NavBarChannelOptionsDropdown2","_request","_request2","NavBar","checkForLoggedInUser","logoutUser","credentials","shortChannelId","_this3","selectedOptions","NavLink","activeClassName","exact","_reactHelmet","_reactHelmet2","_pageTitle","_metaTags","_canonicalLink","SEO","_props","_props2","canonicalLink","meta","link","rel","_ChannelLoginForm","_ChannelLoginForm2","_ChannelCreateForm","_ChannelCreateForm2","LoginPage","_defineProperty","ChannelLoginForm","handleInput","loginToChannel","preventDefault","body","Headers","Content-Type","success","htmlFor","placeholder","channelPassword","onClick","_ProgressBar","_ProgressBar2","ChannelCreateForm","handleChannelInput","input","cleanseChannelInput","updateIsChannelAvailable","channelWithAtSymbol","checkIsPasswordProvided","checkIsChannelAvailable","makePublishChannelRequest","_ErrorPage","_ErrorPage2","_ShowAssetLite","_ShowAssetLite2","_ShowAssetDetails","_ShowAssetDetails2","_ShowChannel","_ShowChannel2","ShowPage","nextProps","CHANNEL","ASSET_LITE","ASSET_DETAILS","_AssetDisplay","_AssetDisplay2","ShowLite","_asset_display_states","AssetDisplay","_props$asset$claimDat","_props$asset$claimDat2","controls","poster","_AssetTitle","_AssetTitle2","_AssetInfo","_AssetInfo2","ShowAssetDetails","AssetTitle","AssetInfo","copyToClipboard","elementToCopy","dataset","elementtocopy","document","getElementById","select","execCommand","_props$asset","hidden","readOnly","spellCheck","data-elementtocopy","download","_ChannelClaimsDisplay","_ChannelClaimsDisplay2","ShowChannel","_AssetPreview","_AssetPreview2","ChannelClaimsDisplay","showNextResultsPage","showPreviousResultsPage","currentPage","previousPage","parseInt","showNewPage","nextPage","_props$channel","_props$channel$claims","claims","totalPages","AssetPreview","_ref$claimData","directSourceLink","showUrlLink","FourOhForPage","lstatSync","readdirSync","root","fullPath","isDirectory","_publish_channel_select_states","states","ChannelSelect","toggleAnonymousPublish","selectedOption","checked","LOGIN","CREATE","_file","_PublishPreview","_PublishPreview2","Dropzone","dragOver","mouseOver","handleDrop","handleDragOver","handleDragEnd","handleDragEnter","handleDragLeave","handleMouseEnter","handleMouseLeave","handleClick","handleFileInput","chooseFile","dt","dataTransfer","items","kind","droppedFile","getAsFile","remove","clearData","click","fileList","files","accept","encType","onDrop","onDragOver","onDragEnd","onDragEnter","onDragLeave","onMouseEnter","onMouseLeave","_Dropzone","_Dropzone2","_PublishTitleInput","_PublishTitleInput2","_PublishUrlInput","_PublishUrlInput2","_PublishThumbnailInput","_PublishThumbnailInput2","_PublishMetadataInputs","_PublishMetadataInputs2","_ChannelSelect","_ChannelSelect2","PublishDetails","onPublishSubmit","PublishTitleInput","e","_PublishUrlMiddleDisplay","_PublishUrlMiddleDisplay2","PublishUrlInput","setClaimName","validateClaim","cleanseInput","fileNameWithoutEnding","cleanClaimName","dataURItoBlob","dataURI","byteString","atob","mimeString","ia","Uint8Array","charCodeAt","Blob","PublishThumbnailInput","videoSource","sliderMinRange","sliderMaxRange","sliderValue","handleVideoLoadedData","handleSliderChange","createThumbnail","setVideoSource","dataUri","blob","URL","createObjectURL","duration","totalMinutes","Math","floor","totalSeconds","currentTime","video","canvas","width","videoWidth","videoHeight","getContext","drawImage","dataUrl","toDataURL","snapshot","_state","preload","muted","display","playsInline","onLoadedData","onSeeked","_ExpandingTextArea","_ExpandingTextArea2","PublishMetadataInputs","toggleShowInputs","handleSelect","rows","maxLength","maxHeight","PublishDisabledMessage","_publish_claim_states","publishStates","PublishStatus","LOAD_START","LOADING","PUBLISHING","SUCCESS","FAILED","_PublishDetails","_PublishDetails2","_PublishStatus","_PublishStatus2","_PublishDisabledMessage","_PublishDisabledMessage2","PublishTool","MysqlConfig","SlackConfig","slackWebHook","slackErrorChannel","slackInfoChannel","returnShortId","claimsArray","claimIndex","shortIdLength","findIndex","element","possibleMatches","slice","fs","parsePublishApiRequestBody","parsePublishApiRequestFiles","path","validateFileTypeAndSize","fileType","thumbnailFileName","thumbnailFilePath","thumbnailFileType","createBasicPublishParams","trim","file_path","bid","author","language","claim_address","createThumbnailPublishParams","deleteTemporaryFile","unlink","addGetResultsToFileData","fileInfo","getResult","file_name","download_path","createFileData","outpoint","address","handleErrorResponse","res","useObjectPropertiesIfNoKeys","_module$exports$retur","returnErrorMessageAndStatus","_module$exports$retur2","createErrorResponsePayload","code","newErrorObject","getOwnPropertyNames","returnPaginatedChannelClaims","getClaimId","getClaimIdByChannel","getClaimIdByClaim","getLongClaimId","longClaimId","getLongChannelId","longChannelId","getClaimIdByLongChannelId","getChannelData","longChannelClaimId","getShortChannelIdFromLongChannelId","_ref4","shortChannelClaimId","getChannelClaims","getAllChannelClaims","_ref5","_ref6","channelClaimsArray","paginatedChannelViewData","getLocalFileRecord","dataValues","_server","_redux","_reducers","_reducers2","_GAListener","_GAListener2","_app","_app2","_renderFullPage","_renderFullPage2","req","context","store","createStore","html","renderToString","Provider","StaticRouter","helmet","renderStatic","redirect","preloadedState","getState","send","_publish2","_channel2","_site","_site2","combineReducers","LOCAL_CHECK","UNAVAILABLE","ERROR","AVAILABLE","_dynamicImport","_AboutPage","_AboutPage2","_LoginPage","_LoginPage2","_ShowPage","_ShowPage2","_FourOhFourPage","_FourOhFourPage2","App","Switch","Route","webpackContext","webpackContextResolve","./canonicalLink","./canonicalLink.js","./dynamicImport","./dynamicImport.js","./file","./file.js","./lbryUri","./lbryUri.js","./metaTags","./metaTags.js","./pageTitle","./pageTitle.js","./publish","./publish.js","./request","./request.js","./validate","./validate.js","createPublishMetadata","createPublishFormData","fd","FormData","append","createThumbnailUrl","validateChannelSelection","validatePublishParams","toString","selectSiteState","selectSiteHost","Server","Components","Containers","Pages","configureMysql","mysqlConfig","configureSite","siteConfig","PORT","configureSlack","slackConfig","createApp","app","express","enable","use","static","bodyParser","urlencoded","extended","verbose","passport","serializeUser","serializeSpeechUser","deserializeUser","deserializeSpeechUser","localSignupStrategy","localLoginStrategy","cookieSession","maxAge","session","hbs","expressHandlebars","defaultLayout","handlebars","Handlebars","engine","server","http","start","sync","user","PassportLocalStrategy","Strategy","lbryApi","usernameField","passwordField","userInfo","tx","userData","userName","channelData","claim_id","certificateData","newUser","newChannel","newCertificate","setChannel","setUser","lbryConfig","STRING","BOOLEAN","INTEGER","TEXT","DECIMAL","define","claimSequence","decodedClaim","depth","effectiveAmount","hasSignature","hex","nout","txid","validAtHeight","valueVersion","claimType","certificateVersion","keyType","publicKey","freezeTableName","belongsTo","foreignKey","allowNull","findAll","order","getLongChannelIdFromShortChannelId","$like","getLongChannelIdFromChannelName","validateLongChannelId","_this4","hasOne","determineFileExtensionFromContentType","determineThumbnail","storedThumbnail","prepareClaimData","licenseUrl","preview","metadataVersion","sourceType","sourceVersion","streamVersion","getShortClaimIdFromLongClaimId","raw","getLongClaimIdFromShortClaimId","getTopFreeClaimIdByClaimName","_this5","validateLongClaimId","_this6","resolveClaim","_this7","claimArray","defaultValue","trendingEligible","hasMany","getRecentClaims","limit","action","ipAddress","bcrypt","comparePassword","compare","changePassword","newPassword","genSalt","saltError","salt","hash","hashError","hook","returnUserAndChannelInfo","userInstance","getChannel","isMatch","logIn","logout","multipart","multipartMiddleware","uploadDir","claimNameIsAvailable","checkChannelAvailability","_require3","_require4","errorHandlers","_require5","_require6","authenticateUser","_require7","availableName","claimsList","resolveResult","fileData","_ref7","_ref8","_ref9","_ref10","_ref10$","completed","_ref11","_ref12","resolvedUri","_ref13","_parsePublishApiReque","_parsePublishApiReque2","_ref14","_ref15","_ref15$","thumbnailPublishParams","lbryTx","_ref16","_ref17","_ref18","claimInfo","_ref19","publishHelpers","_require$publishing","Op","publishResults","fileRecord","claimRecord","upsertCriteria","setClaim","setFile","claimAddresses","attributes","or","authenticateChannelCredentials","userPassword","channelFindParams","determineTotalPages","paginationPage","getPageFromQuery","extractPageFromClaims","determinePreviousPage","determineNextPage","totalResults","determineTotalClaims","pageNumber","claimStartIndex","claimEndIndex","totalClaims","fullPages","handlePageRender","render","layout","initialState","publishSubmit","googleAnalyticsId","_siteConfig$assetDefa","_siteConfig$details","determineResponseType","flipClaimNameAndIdForBackwardsCompatibility","logRequestData","getClaimIdAndServeAsset","lbryUri","handleShowRender","hasFileExtension","parseModifier","responseType","_lbryUri$parseIdentif","_flipClaimNameAndIdFo","_flipClaimNameAndIdFo2","clientAcceptsHtml","requestIsFromBrowser","clientWantsAsset","range","imageIsWanted","videoIsWanted","isValidClaimId","isValidShortId","isValidShortIdOrClaimId","serveAssetToClient","NO_FILE","sendFileOptions","X-Content-Type-Options","sendFile","fullClaimId","tempName","proto","_componentsRegex$exec5","_componentsRegex$exec6","_index","_index2","_index3","_index4","_reduxSaga","_reduxSaga2","_effects","_show_uri","returnSagaWithParams","saga","regeneratorRuntime","mark","_callee","wrap","_context","prev","stop","sagaMiddleware","middleware","applyMiddleware","run","parseAndUpdateIdentifierAndClaim","_lbryUri$parseClaim","_lbryUri2","t0","put","abrupt","sent","_show_asset","newAssetRequest","_marked","parseAndUpdateClaimOnly","_lbryUri$parseIdentif2","_lbryUri$parseClaim2","_context2","_show_channel","newChannelRequest","t1","_marked2","handleShowPageUri","_action$data","_context3","_marked3","watchHandleShowPageUri","_context4","takeLatest","_marked4","_lbryUri","_assetApi","getShortId","getClaimData","t2","watchNewAssetRequest","_ref$data","_channelApi","watchNewChannelRequest","getNewClaimsAndUpdateChannel","_action$data2","watchUpdateChannelClaims","logLevel","winston","transports","Console","level","timestamp","colorize","prettyPrint","handleExceptions","humanReadableUnhandledException","warn","silly","loggerConfig","winstonSlackWebHook","SlackWebHook","add","webhookUrl","iconEmoji","./","./ActiveStatusBar","./ActiveStatusBar/","./ActiveStatusBar/index","./ActiveStatusBar/index.jsx","./AssetPreview","./AssetPreview/","./AssetPreview/index","./AssetPreview/index.js","./AssetPreview/view","./AssetPreview/view.jsx","./ExpandingTextArea","./ExpandingTextArea/","./ExpandingTextArea/index","./ExpandingTextArea/index.jsx","./GAListener","./GAListener/","./GAListener/index","./GAListener/index.jsx","./InactiveStatusBar","./InactiveStatusBar/","./InactiveStatusBar/index","./InactiveStatusBar/index.jsx","./Logo","./Logo/","./Logo/index","./Logo/index.jsx","./NavBarChannelOptionsDropdown","./NavBarChannelOptionsDropdown/","./NavBarChannelOptionsDropdown/index","./NavBarChannelOptionsDropdown/index.jsx","./ProgressBar","./ProgressBar/","./ProgressBar/index","./ProgressBar/index.jsx","./PublishPreview","./PublishPreview/","./PublishPreview/index","./PublishPreview/index.jsx","./PublishUrlMiddleDisplay","./PublishUrlMiddleDisplay/","./PublishUrlMiddleDisplay/index","./PublishUrlMiddleDisplay/index.jsx","./SEO","./SEO/","./SEO/index","./SEO/index.js","./SEO/view","./SEO/view.jsx","./index","./index.js","./AssetDisplay","./AssetDisplay/","./AssetDisplay/index","./AssetDisplay/index.js","./AssetDisplay/view","./AssetDisplay/view.jsx","./AssetInfo","./AssetInfo/","./AssetInfo/index","./AssetInfo/index.js","./AssetInfo/view","./AssetInfo/view.jsx","./AssetTitle","./AssetTitle/","./AssetTitle/index","./AssetTitle/index.js","./AssetTitle/view","./AssetTitle/view.jsx","./ChannelClaimsDisplay","./ChannelClaimsDisplay/","./ChannelClaimsDisplay/index","./ChannelClaimsDisplay/index.js","./ChannelClaimsDisplay/view","./ChannelClaimsDisplay/view.jsx","./ChannelCreateForm","./ChannelCreateForm/","./ChannelCreateForm/index","./ChannelCreateForm/index.js","./ChannelCreateForm/view","./ChannelCreateForm/view.jsx","./ChannelLoginForm","./ChannelLoginForm/","./ChannelLoginForm/index","./ChannelLoginForm/index.js","./ChannelLoginForm/view","./ChannelLoginForm/view.jsx","./ChannelSelect","./ChannelSelect/","./ChannelSelect/index","./ChannelSelect/index.js","./ChannelSelect/view","./ChannelSelect/view.jsx","./Dropzone","./Dropzone/","./Dropzone/index","./Dropzone/index.js","./Dropzone/view","./Dropzone/view.jsx","./FourOhFourPage","./FourOhFourPage/","./FourOhFourPage/index","./FourOhFourPage/index.jsx","./FourOhFourPage/view","./FourOhFourPage/view.jsx","./NavBar","./NavBar/","./NavBar/index","./NavBar/index.js","./NavBar/view","./NavBar/view.jsx","./PublishDetails","./PublishDetails/","./PublishDetails/index","./PublishDetails/index.js","./PublishDetails/view","./PublishDetails/view.jsx","./PublishDisabledMessage","./PublishDisabledMessage/","./PublishDisabledMessage/index","./PublishDisabledMessage/index.js","./PublishDisabledMessage/view","./PublishDisabledMessage/view.jsx","./PublishMetadataInputs","./PublishMetadataInputs/","./PublishMetadataInputs/index","./PublishMetadataInputs/index.js","./PublishMetadataInputs/view","./PublishMetadataInputs/view.jsx","./PublishStatus","./PublishStatus/","./PublishStatus/index","./PublishStatus/index.js","./PublishStatus/view","./PublishStatus/view.jsx","./PublishThumbnailInput","./PublishThumbnailInput/","./PublishThumbnailInput/index","./PublishThumbnailInput/index.js","./PublishThumbnailInput/view","./PublishThumbnailInput/view.jsx","./PublishTitleInput","./PublishTitleInput/","./PublishTitleInput/index","./PublishTitleInput/index.js","./PublishTitleInput/view","./PublishTitleInput/view.jsx","./PublishTool","./PublishTool/","./PublishTool/index","./PublishTool/index.js","./PublishTool/view","./PublishTool/view.jsx","./PublishUrlInput","./PublishUrlInput/","./PublishUrlInput/index","./PublishUrlInput/index.js","./PublishUrlInput/view","./PublishUrlInput/view.jsx","./ShowAssetDetails","./ShowAssetDetails/","./ShowAssetDetails/index","./ShowAssetDetails/index.js","./ShowAssetDetails/view","./ShowAssetDetails/view.jsx","./ShowAssetLite","./ShowAssetLite/","./ShowAssetLite/index","./ShowAssetLite/index.js","./ShowAssetLite/view","./ShowAssetLite/view.jsx","./ShowChannel","./ShowChannel/","./ShowChannel/index","./ShowChannel/index.js","./ShowChannel/view","./ShowChannel/view.jsx","./AboutPage","./AboutPage/","./AboutPage/index","./AboutPage/index.jsx","./ErrorPage","./ErrorPage/","./ErrorPage/index","./ErrorPage/index.jsx","./HomePage","./HomePage/","./HomePage/index","./HomePage/index.jsx","./LoginPage","./LoginPage/","./LoginPage/index","./LoginPage/index.js","./LoginPage/view","./LoginPage/view.jsx","./ShowPage","./ShowPage/","./ShowPage/index","./ShowPage/index.js","./ShowPage/view","./ShowPage/view.jsx"],"mappings":"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","file":"index.js","sourcesContent":["module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \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/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\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.l = 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// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 115);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react\");\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-redux\");\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"winston\");\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction SiteConfig() {\n var _this = this;\n\n this.analytics = {\n googleId: 'default'\n };\n this.assetDefaults = {\n description: 'An asset published on Spee.ch',\n thumbnail: 'https://spee.ch/assets/img/video_thumb_default.png',\n title: 'Spee.ch'\n };\n this.auth = {\n sessionKey: 'default'\n };\n this.customComponents = {\n components: {},\n containers: {},\n pages: {}\n };\n this.details = {\n description: 'Open-source, decentralized image and video sharing.',\n host: 'default',\n port: 3000,\n title: 'Spee.ch',\n twitter: '@spee_ch'\n };\n this.publishing = {\n additionalClaimAddresses: [],\n disabled: false,\n disabledMessage: 'Please check back soon.',\n primaryClaimAddress: 'default',\n thumbnailChannel: 'default',\n thumbnailChannelId: 'default',\n uploadDirectory: '/home/lbry/Uploads'\n };\n this.configure = function (config) {\n if (!config) {\n return console.log('No site config received.');\n }\n var analytics = config.analytics,\n assetDefaults = config.assetDefaults,\n auth = config.auth,\n customComponents = config.customComponents,\n details = config.details,\n publishing = config.publishing;\n\n _this.analytics = analytics;\n _this.assetDefaults = assetDefaults;\n _this.auth = auth;\n _this.details = details;\n _this.publishing = publishing;\n _this.customComponents = customComponents;\n };\n};\n\nmodule.exports = new SiteConfig();\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-router-dom\");\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _channel = __webpack_require__(64);\n\nvar _publish = __webpack_require__(6);\n\nvar _view = __webpack_require__(65);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n site = _ref.site;\n\n return {\n channelName: channel.loggedInChannel.name,\n channelShortId: channel.loggedInChannel.shortId,\n channelLongId: channel.loggedInChannel.longId,\n siteDescription: site.description\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onChannelLogin: function onChannelLogin(name, shortId, longId) {\n dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId));\n dispatch((0, _publish.updateSelectedChannel)(name));\n },\n onChannelLogout: function onChannelLogout() {\n dispatch((0, _channel.updateLoggedInChannel)(null, null, null));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.selectFile = selectFile;\nexports.clearFile = clearFile;\nexports.updateMetadata = updateMetadata;\nexports.updateClaim = updateClaim;\nexports.setPublishInChannel = setPublishInChannel;\nexports.updatePublishStatus = updatePublishStatus;\nexports.updateError = updateError;\nexports.updateSelectedChannel = updateSelectedChannel;\nexports.toggleMetadataInputs = toggleMetadataInputs;\nexports.onNewThumbnail = onNewThumbnail;\nexports.startPublish = startPublish;\n\nvar _publish_action_types = __webpack_require__(104);\n\nvar actions = _interopRequireWildcard(_publish_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// export action creators\nfunction selectFile(file) {\n return {\n type: actions.FILE_SELECTED,\n data: file\n };\n};\n\nfunction clearFile() {\n return {\n type: actions.FILE_CLEAR\n };\n};\n\nfunction updateMetadata(name, value) {\n return {\n type: actions.METADATA_UPDATE,\n data: {\n name: name,\n value: value\n }\n };\n};\n\nfunction updateClaim(value) {\n return {\n type: actions.CLAIM_UPDATE,\n data: value\n };\n};\n\nfunction setPublishInChannel(channel) {\n return {\n type: actions.SET_PUBLISH_IN_CHANNEL,\n channel: channel\n };\n};\n\nfunction updatePublishStatus(status, message) {\n return {\n type: actions.PUBLISH_STATUS_UPDATE,\n data: {\n status: status,\n message: message\n }\n };\n};\n\nfunction updateError(name, value) {\n return {\n type: actions.ERROR_UPDATE,\n data: {\n name: name,\n value: value\n }\n };\n};\n\nfunction updateSelectedChannel(channelName) {\n return {\n type: actions.SELECTED_CHANNEL_UPDATE,\n data: channelName\n };\n};\n\nfunction toggleMetadataInputs(showMetadataInputs) {\n return {\n type: actions.TOGGLE_METADATA_INPUTS,\n data: showMetadataInputs\n };\n};\n\nfunction onNewThumbnail(file) {\n return {\n type: actions.THUMBNAIL_NEW,\n data: file\n };\n};\n\nfunction startPublish(history) {\n return {\n type: actions.PUBLISH_START,\n data: { history: history }\n };\n}\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(66);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var site = _ref.site;\n var defaultDescription = site.defaultDescription,\n defaultThumbnail = site.defaultThumbnail,\n siteDescription = site.description,\n siteHost = site.host,\n siteTitle = site.title,\n siteTwitter = site.twitter;\n\n return {\n defaultDescription: defaultDescription,\n defaultThumbnail: defaultThumbnail,\n siteDescription: siteDescription,\n siteHost: siteHost,\n siteTitle: siteTitle,\n siteTwitter: siteTwitter\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = request;\n\n__webpack_require__(152);\n\n/**\n * Parses the JSON returned by a network request\n *\n * @param {object} response A response from a network request\n *\n * @return {object} The parsed JSON from the request\n */\nfunction parseJSON(response) {\n if (response.status === 204 || response.status === 205) {\n return null;\n }\n return response.json();\n}\n\n/**\n * Parses the status returned by a network request\n *\n * @param {object} response A response from a network request\n * @param {object} response The parsed JSON from the network request\n *\n * @return {object | undefined} Returns object with status and statusText, or undefined\n */\nfunction checkStatus(response, jsonResponse) {\n if (response.status >= 200 && response.status < 300) {\n return jsonResponse;\n }\n var error = new Error(jsonResponse.message);\n error.response = response;\n throw error;\n}\n\n/**\n * Requests a URL, returning a promise\n *\n * @param {string} url The URL we want to request\n * @param {object} [options] The options we want to pass to \"fetch\"\n *\n * @return {object} The response data\n */\n\nfunction request(url, options) {\n return fetch(url, options).then(function (response) {\n return Promise.all([response, parseJSON(response)]);\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n response = _ref2[0],\n jsonResponse = _ref2[1];\n\n return checkStatus(response, jsonResponse);\n });\n}\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Sequelize = __webpack_require__(95);\nvar logger = __webpack_require__(2);\n\nconsole.log('exporting sequelize models');\n\nvar _require = __webpack_require__(92),\n database = _require.database,\n username = _require.username,\n password = _require.password;\n\nvar db = {};\n// set sequelize options\nvar sequelize = new Sequelize(database, username, password, {\n host: 'localhost',\n dialect: 'mysql',\n dialectOptions: { decimalNumbers: true }, // fix to ensure DECIMAL will not be stored as a string\n logging: false,\n pool: {\n max: 5,\n min: 0,\n idle: 10000,\n acquire: 10000\n }\n});\n\n// establish mysql connection\nsequelize.authenticate().then(function () {\n logger.info('Sequelize has established mysql connection successfully.');\n}).catch(function (err) {\n logger.error('Sequelize was unable to connect to the database:', err);\n});\n\n// manually add each model to the db object\nvar Certificate = __webpack_require__(132);\nvar Channel = __webpack_require__(133);\nvar Claim = __webpack_require__(134);\nvar File = __webpack_require__(135);\nvar Request = __webpack_require__(136);\nvar User = __webpack_require__(137);\ndb['Certificate'] = sequelize.import('Certificate', Certificate);\ndb['Channel'] = sequelize.import('Channel', Channel);\ndb['Claim'] = sequelize.import('Claim', Claim);\ndb['File'] = sequelize.import('File', File);\ndb['Request'] = sequelize.import('Request', Request);\ndb['User'] = sequelize.import('User', User);\n\n// run model.association for each model in the db object that has an association\nObject.keys(db).forEach(function (modelName) {\n if (db[modelName].associate) {\n logger.info('Associating model:', modelName);\n db[modelName].associate(db);\n }\n});\n\ndb.sequelize = sequelize;\ndb.Sequelize = Sequelize;\n\n// add an 'upsert' method to the db object\ndb.upsert = function (Model, values, condition, tableName) {\n return Model.findOne({\n where: condition\n }).then(function (obj) {\n if (obj) {\n // update\n logger.debug('updating record in db.' + tableName);\n return obj.update(values);\n } else {\n // insert\n logger.debug('creating record in db.' + tableName);\n return Model.create(values);\n }\n }).catch(function (error) {\n logger.error(tableName + '.upsert error', error);\n throw error;\n });\n};\n\nmodule.exports = db;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(14);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _ActiveStatusBar = __webpack_require__(24);\n\nvar _ActiveStatusBar2 = _interopRequireDefault(_ActiveStatusBar);\n\nvar _InactiveStatusBar = __webpack_require__(25);\n\nvar _InactiveStatusBar2 = _interopRequireDefault(_InactiveStatusBar);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ProgressBar = function (_React$Component) {\n _inherits(ProgressBar, _React$Component);\n\n function ProgressBar(props) {\n _classCallCheck(this, ProgressBar);\n\n var _this = _possibleConstructorReturn(this, (ProgressBar.__proto__ || Object.getPrototypeOf(ProgressBar)).call(this, props));\n\n _this.state = {\n bars: [],\n index: 0,\n incrementer: 1\n };\n _this.createBars = _this.createBars.bind(_this);\n _this.startProgressBar = _this.startProgressBar.bind(_this);\n _this.updateProgressBar = _this.updateProgressBar.bind(_this);\n _this.stopProgressBar = _this.stopProgressBar.bind(_this);\n return _this;\n }\n\n _createClass(ProgressBar, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.createBars();\n this.startProgressBar();\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n this.stopProgressBar();\n }\n }, {\n key: 'createBars',\n value: function createBars() {\n var bars = [];\n for (var i = 0; i <= this.props.size; i++) {\n bars.push({ isActive: false });\n }\n this.setState({ bars: bars });\n }\n }, {\n key: 'startProgressBar',\n value: function startProgressBar() {\n this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300);\n }\n }, {\n key: 'updateProgressBar',\n value: function updateProgressBar() {\n var index = this.state.index;\n var incrementer = this.state.incrementer;\n var bars = this.state.bars;\n // flip incrementer if necessary, to stay in bounds\n if (index < 0 || index > this.props.size) {\n incrementer = incrementer * -1;\n index += incrementer;\n }\n // update the indexed bar\n if (incrementer > 0) {\n bars[index].isActive = true;\n } else {\n bars[index].isActive = false;\n };\n // increment index\n index += incrementer;\n // update state\n this.setState({\n bars: bars,\n incrementer: incrementer,\n index: index\n });\n }\n }, {\n key: 'stopProgressBar',\n value: function stopProgressBar() {\n clearInterval(this.updateInterval);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n this.state.bars.map(function (bar, index) {\n return bar.isActive ? _react2.default.createElement(_ActiveStatusBar2.default, { key: index }) : _react2.default.createElement(_InactiveStatusBar2.default, { key: index });\n })\n );\n }\n }]);\n\n return ProgressBar;\n}(_react2.default.Component);\n\n;\n\nProgressBar.propTypes = {\n size: _propTypes2.default.number.isRequired\n};\n\nexports.default = ProgressBar;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.onHandleShowPageUri = onHandleShowPageUri;\nexports.onRequestError = onRequestError;\nexports.onNewChannelRequest = onNewChannelRequest;\nexports.onNewAssetRequest = onNewAssetRequest;\nexports.onRequestUpdate = onRequestUpdate;\nexports.addRequestToRequestList = addRequestToRequestList;\nexports.addAssetToAssetList = addAssetToAssetList;\nexports.addNewChannelToChannelList = addNewChannelToChannelList;\nexports.onUpdateChannelClaims = onUpdateChannelClaims;\nexports.updateChannelClaims = updateChannelClaims;\nexports.fileRequested = fileRequested;\nexports.updateFileAvailability = updateFileAvailability;\nexports.updateDisplayAssetError = updateDisplayAssetError;\n\nvar _show_action_types = __webpack_require__(19);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show_request_types = __webpack_require__(112);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// basic request parsing\nfunction onHandleShowPageUri(params) {\n return {\n type: actions.HANDLE_SHOW_URI,\n data: params\n };\n};\n\nfunction onRequestError(error) {\n return {\n type: actions.REQUEST_ERROR,\n data: error\n };\n};\n\nfunction onNewChannelRequest(channelName, channelId) {\n var requestType = _show_request_types.CHANNEL;\n var requestId = 'cr#' + channelName + '#' + channelId;\n return {\n type: actions.CHANNEL_REQUEST_NEW,\n data: { requestType: requestType, requestId: requestId, channelName: channelName, channelId: channelId }\n };\n};\n\nfunction onNewAssetRequest(name, id, channelName, channelId, extension) {\n var requestType = extension ? _show_request_types.ASSET_LITE : _show_request_types.ASSET_DETAILS;\n var requestId = 'ar#' + name + '#' + id + '#' + channelName + '#' + channelId;\n return {\n type: actions.ASSET_REQUEST_NEW,\n data: {\n requestType: requestType,\n requestId: requestId,\n name: name,\n modifier: {\n id: id,\n channel: {\n name: channelName,\n id: channelId\n }\n }\n }\n };\n};\n\nfunction onRequestUpdate(requestType, requestId) {\n return {\n type: actions.REQUEST_UPDATE,\n data: {\n requestType: requestType,\n requestId: requestId\n }\n };\n};\n\nfunction addRequestToRequestList(id, error, key) {\n return {\n type: actions.REQUEST_LIST_ADD,\n data: { id: id, error: error, key: key }\n };\n};\n\n// asset actions\n\nfunction addAssetToAssetList(id, error, name, claimId, shortId, claimData) {\n return {\n type: actions.ASSET_ADD,\n data: { id: id, error: error, name: name, claimId: claimId, shortId: shortId, claimData: claimData }\n };\n}\n\n// channel actions\n\nfunction addNewChannelToChannelList(id, name, shortId, longId, claimsData) {\n return {\n type: actions.CHANNEL_ADD,\n data: { id: id, name: name, shortId: shortId, longId: longId, claimsData: claimsData }\n };\n};\n\nfunction onUpdateChannelClaims(channelKey, name, longId, page) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC,\n data: { channelKey: channelKey, name: name, longId: longId, page: page }\n };\n};\n\nfunction updateChannelClaims(channelListId, claimsData) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS,\n data: { channelListId: channelListId, claimsData: claimsData }\n };\n};\n\n// display a file\n\nfunction fileRequested(name, claimId) {\n return {\n type: actions.FILE_REQUESTED,\n data: { name: name, claimId: claimId }\n };\n};\n\nfunction updateFileAvailability(status) {\n return {\n type: actions.FILE_AVAILABILITY_UPDATE,\n data: status\n };\n};\n\nfunction updateDisplayAssetError(error) {\n return {\n type: actions.DISPLAY_ASSET_ERROR,\n data: error\n };\n};\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(14);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _NavBar = __webpack_require__(5);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ErrorPage = function (_React$Component) {\n _inherits(ErrorPage, _React$Component);\n\n function ErrorPage() {\n _classCallCheck(this, ErrorPage);\n\n return _possibleConstructorReturn(this, (ErrorPage.__proto__ || Object.getPrototypeOf(ErrorPage)).apply(this, arguments));\n }\n\n _createClass(ErrorPage, [{\n key: 'render',\n value: function render() {\n var error = this.props.error;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'p',\n null,\n error\n )\n )\n );\n }\n }]);\n\n return ErrorPage;\n}(_react2.default.Component);\n\n;\n\nErrorPage.propTypes = {\n error: _propTypes2.default.string.isRequired\n};\n\nexports.default = ErrorPage;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactGa = __webpack_require__(151);\n\nvar _reactGa2 = _interopRequireDefault(_reactGa);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _require = __webpack_require__(3),\n googleId = _require.analytics.googleId;\n\n_reactGa2.default.initialize(googleId);\n\nvar GAListener = function (_React$Component) {\n _inherits(GAListener, _React$Component);\n\n function GAListener() {\n _classCallCheck(this, GAListener);\n\n return _possibleConstructorReturn(this, (GAListener.__proto__ || Object.getPrototypeOf(GAListener)).apply(this, arguments));\n }\n\n _createClass(GAListener, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.sendPageView(this.props.history.location);\n this.props.history.listen(this.sendPageView);\n }\n }, {\n key: 'sendPageView',\n value: function sendPageView(location) {\n _reactGa2.default.set({ page: location.pathname });\n _reactGa2.default.pageview(location.pathname);\n }\n }, {\n key: 'render',\n value: function render() {\n return this.props.children;\n }\n }]);\n\n return GAListener;\n}(_react2.default.Component);\n\nexports.default = (0, _reactRouterDom.withRouter)(GAListener);\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"prop-types\");\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _channel = __webpack_require__(64);\n\nvar _view = __webpack_require__(68);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _publish = __webpack_require__(6);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onChannelLogin: function onChannelLogin(name, shortId, longId) {\n dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId));\n dispatch((0, _publish.updateSelectedChannel)(name));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _channel = __webpack_require__(64);\n\nvar _view = __webpack_require__(69);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _publish = __webpack_require__(6);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onChannelLogin: function onChannelLogin(name, shortId, longId) {\n dispatch((0, _channel.updateLoggedInChannel)(name, shortId, longId));\n dispatch((0, _publish.updateSelectedChannel)(name));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(null, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(72);\n\nvar _view2 = _interopRequireDefault(_view);\n\nvar _show = __webpack_require__(11);\n\nvar _show2 = __webpack_require__(28);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var show = _ref.show;\n\n // select error and status\n var error = show.displayAsset.error;\n var status = show.displayAsset.status;\n // select asset\n var asset = (0, _show2.selectAsset)(show);\n // return props\n return {\n error: error,\n status: status,\n asset: asset\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onFileRequest: function onFileRequest(name, claimId) {\n dispatch((0, _show.fileRequested)(name, claimId));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(6);\n\nvar _view = __webpack_require__(82);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n file: publish.file,\n thumbnail: publish.thumbnail,\n fileError: publish.error.file\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n selectFile: function selectFile(file) {\n dispatch((0, _publish.selectFile)(file));\n },\n setFileError: function setFileError(value) {\n dispatch((0, _publish.clearFile)());\n dispatch((0, _publish.updateError)('file', value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// request actions\nvar HANDLE_SHOW_URI = exports.HANDLE_SHOW_URI = 'HANDLE_SHOW_URI';\nvar REQUEST_ERROR = exports.REQUEST_ERROR = 'REQUEST_ERROR';\nvar REQUEST_UPDATE = exports.REQUEST_UPDATE = 'REQUEST_UPDATE';\nvar ASSET_REQUEST_NEW = exports.ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW';\nvar CHANNEL_REQUEST_NEW = exports.CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW';\nvar REQUEST_LIST_ADD = exports.REQUEST_LIST_ADD = 'REQUEST_LIST_ADD';\n\n// asset actions\nvar ASSET_ADD = exports.ASSET_ADD = 'ASSET_ADD';\n\n// channel actions\nvar CHANNEL_ADD = exports.CHANNEL_ADD = 'CHANNEL_ADD';\n\nvar CHANNEL_CLAIMS_UPDATE_ASYNC = exports.CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC';\nvar CHANNEL_CLAIMS_UPDATE_SUCCESS = exports.CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS';\n\n// asset/file display actions\nvar FILE_REQUESTED = exports.FILE_REQUESTED = 'FILE_REQUESTED';\nvar FILE_AVAILABILITY_UPDATE = exports.FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE';\nvar DISPLAY_ASSET_ERROR = exports.DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR';\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _NavBar = __webpack_require__(5);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _SEO = __webpack_require__(7);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AboutPage = function (_React$Component) {\n _inherits(AboutPage, _React$Component);\n\n function AboutPage() {\n _classCallCheck(this, AboutPage);\n\n return _possibleConstructorReturn(this, (AboutPage.__proto__ || Object.getPrototypeOf(AboutPage)).apply(this, arguments));\n }\n\n _createClass(AboutPage, [{\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: 'About', pageUri: 'about' }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'p',\n { className: 'pull-quote' },\n 'Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.'\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://twitter.com/spee_ch' },\n 'TWITTER'\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch' },\n 'GITHUB'\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://discord.gg/YjYbwhS' },\n 'DISCORD CHANNEL'\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://github.com/lbryio/spee.ch/blob/master/README.md' },\n 'DOCUMENTATION'\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'p',\n null,\n 'Spee.ch is a media-hosting site that reads from and publishes content to the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://lbry.io' },\n 'LBRY'\n ),\n ' blockchain.'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://lbry.io/get' },\n 'LBRY'\n ),\n ' network. This means that your images are stored in multiple locations without a single point of failure.'\n ),\n _react2.default.createElement(\n 'h3',\n null,\n 'Contribute'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'If you have an idea for your own spee.ch-like site on top of LBRY, fork our ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch' },\n 'github repo'\n ),\n ' and go to town!'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'If you want to improve spee.ch, join our ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://discord.gg/YjYbwhS' },\n 'discord channel'\n ),\n ' or solve one of our ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://github.com/lbryio/spee.ch/issues' },\n 'github issues'\n ),\n '.'\n )\n )\n )\n )\n );\n }\n }]);\n\n return AboutPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = AboutPage;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Logo() {\n return _react2.default.createElement(\n 'svg',\n { version: '1.1', id: 'Layer_1', x: '0px', y: '0px', height: '24px', viewBox: '0 0 80 31', enableBackground: 'new 0 0 80 31', className: 'nav-bar-logo' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { to: '/' },\n _react2.default.createElement(\n 'title',\n null,\n 'Logo'\n ),\n _react2.default.createElement(\n 'desc',\n null,\n 'Spee.ch logo'\n ),\n _react2.default.createElement(\n 'g',\n { id: 'About' },\n _react2.default.createElement(\n 'g',\n { id: 'Publish-Form-V2-_x28_filled_x29_', transform: 'translate(-42.000000, -23.000000)' },\n _react2.default.createElement(\n 'g',\n { id: 'Group-17', transform: 'translate(42.000000, 22.000000)' },\n _react2.default.createElement(\n 'text',\n { transform: 'matrix(1 0 0 1 0 20)', fontSize: '25', fontFamily: 'Roboto' },\n 'Spee= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ExpandingTextarea = function (_Component) {\n _inherits(ExpandingTextarea, _Component);\n\n function ExpandingTextarea(props) {\n _classCallCheck(this, ExpandingTextarea);\n\n var _this = _possibleConstructorReturn(this, (ExpandingTextarea.__proto__ || Object.getPrototypeOf(ExpandingTextarea)).call(this, props));\n\n _this._handleChange = _this._handleChange.bind(_this);\n return _this;\n }\n\n _createClass(ExpandingTextarea, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.adjustTextarea({});\n }\n }, {\n key: '_handleChange',\n value: function _handleChange(event) {\n var onChange = this.props.onChange;\n\n if (onChange) onChange(event);\n this.adjustTextarea(event);\n }\n }, {\n key: 'adjustTextarea',\n value: function adjustTextarea(_ref) {\n var _ref$target = _ref.target,\n target = _ref$target === undefined ? this.el : _ref$target;\n\n target.style.height = 0;\n target.style.height = target.scrollHeight + 'px';\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var rest = _objectWithoutProperties(this.props, []);\n\n return _react2.default.createElement('textarea', _extends({}, rest, {\n ref: function ref(x) {\n return _this2.el = x;\n },\n onChange: this._handleChange\n }));\n }\n }]);\n\n return ExpandingTextarea;\n}(_react.Component);\n\nExpandingTextarea.propTypes = {\n onChange: _propTypes2.default.func\n};\n\nexports.default = ExpandingTextarea;\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(14);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishPreview = function (_React$Component) {\n _inherits(PublishPreview, _React$Component);\n\n function PublishPreview(props) {\n _classCallCheck(this, PublishPreview);\n\n var _this = _possibleConstructorReturn(this, (PublishPreview.__proto__ || Object.getPrototypeOf(PublishPreview)).call(this, props));\n\n _this.state = {\n imgSource: '',\n defaultThumbnail: '/assets/img/video_thumb_default.png'\n };\n return _this;\n }\n\n _createClass(PublishPreview, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.setPreviewImageSource(this.props.file);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(newProps) {\n if (newProps.file !== this.props.file) {\n this.setPreviewImageSource(newProps.file);\n }\n if (newProps.thumbnail !== this.props.thumbnail) {\n if (newProps.thumbnail) {\n this.setPreviewImageSourceFromFile(newProps.thumbnail);\n } else {\n this.setState({ imgSource: this.state.defaultThumbnail });\n }\n }\n }\n }, {\n key: 'setPreviewImageSourceFromFile',\n value: function setPreviewImageSourceFromFile(file) {\n var _this2 = this;\n\n var previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = function () {\n _this2.setState({ imgSource: previewReader.result });\n };\n }\n }, {\n key: 'setPreviewImageSource',\n value: function setPreviewImageSource(file) {\n if (file.type !== 'video/mp4') {\n this.setPreviewImageSourceFromFile(file);\n } else {\n if (this.props.thumbnail) {\n this.setPreviewImageSourceFromFile(this.props.thumbnail);\n }\n this.setState({ imgSource: this.state.defaultThumbnail });\n }\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement('img', {\n id: 'dropzone-preview',\n src: this.state.imgSource,\n className: this.props.dimPreview ? 'dim' : '',\n alt: 'publish preview'\n });\n }\n }]);\n\n return PublishPreview;\n}(_react2.default.Component);\n\n;\n\nPublishPreview.propTypes = {\n dimPreview: _propTypes2.default.bool.isRequired,\n file: _propTypes2.default.object.isRequired,\n thumbnail: _propTypes2.default.object\n};\n\nexports.default = PublishPreview;\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(14);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction UrlMiddle(_ref) {\n var publishInChannel = _ref.publishInChannel,\n selectedChannel = _ref.selectedChannel,\n loggedInChannelName = _ref.loggedInChannelName,\n loggedInChannelShortId = _ref.loggedInChannelShortId;\n\n if (publishInChannel) {\n if (selectedChannel === loggedInChannelName) {\n return _react2.default.createElement(\n 'span',\n { id: 'url-channel', className: 'url-text--secondary' },\n loggedInChannelName,\n ':',\n loggedInChannelShortId,\n ' /'\n );\n }\n return _react2.default.createElement(\n 'span',\n { id: 'url-channel-placeholder', className: 'url-text--secondary tooltip' },\n '@channel',\n _react2.default.createElement(\n 'span',\n {\n className: 'tooltip-text' },\n 'Select a channel below'\n ),\n ' /'\n );\n }\n return _react2.default.createElement(\n 'span',\n { id: 'url-no-channel-placeholder', className: 'url-text--secondary tooltip' },\n 'xyz',\n _react2.default.createElement(\n 'span',\n { className: 'tooltip-text' },\n 'This will be a random id'\n ),\n ' /'\n );\n}\n\nUrlMiddle.propTypes = {\n publishInChannel: _propTypes2.default.bool.isRequired,\n loggedInChannelName: _propTypes2.default.string,\n loggedInChannelShortId: _propTypes2.default.string\n};\n\nexports.default = UrlMiddle;\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(6);\n\nvar _view = __webpack_require__(81);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n publish = _ref.publish;\n\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n publishInChannel: publish.publishInChannel,\n selectedChannel: publish.selectedChannel,\n channelError: publish.error.channel\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onPublishInChannelChange: function onPublishInChannelChange(value) {\n dispatch((0, _publish.updateError)('channel', null));\n dispatch((0, _publish.setPublishInChannel)(value));\n },\n onChannelSelect: function onChannelSelect(value) {\n dispatch((0, _publish.updateError)('channel', null));\n dispatch((0, _publish.updateSelectedChannel)(value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(6);\n\nvar _view = __webpack_require__(83);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n publish = _ref.publish;\n\n return {\n file: publish.file\n };\n};\n\nvar mapDispatchToProps = {\n clearFile: _publish.clearFile,\n startPublish: _publish.startPublish\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(6);\n\nvar _view = __webpack_require__(84);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n title: publish.metadata.title\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onMetadataChange: function onMetadataChange(name, value) {\n dispatch((0, _publish.updateMetadata)(name, value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _publish = __webpack_require__(6);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(85);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var channel = _ref.channel,\n publish = _ref.publish;\n\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n loggedInChannelShortId: channel.loggedInChannel.shortId,\n fileName: publish.file.name,\n publishInChannel: publish.publishInChannel,\n selectedChannel: publish.selectedChannel,\n claim: publish.claim,\n urlError: publish.error.url\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onClaimChange: function onClaimChange(value) {\n dispatch((0, _publish.updateClaim)(value));\n dispatch((0, _publish.updateError)('publishSubmit', null));\n },\n onUrlError: function onUrlError(value) {\n dispatch((0, _publish.updateError)('url', value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(6);\n\nvar _view = __webpack_require__(86);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var file = _ref.publish.file;\n\n return {\n file: file\n };\n};\n\nvar mapDispatchToProps = {\n onNewThumbnail: _publish.onNewThumbnail\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(6);\n\nvar _view = __webpack_require__(87);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n showMetadataInputs: publish.showMetadataInputs,\n description: publish.metadata.description,\n license: publish.metadata.license,\n nsfw: publish.metadata.nsfw\n };\n};\n\nvar mapDispatchToProps = function mapDispatchToProps(dispatch) {\n return {\n onMetadataChange: function onMetadataChange(name, value) {\n dispatch((0, _publish.updateMetadata)(name, value));\n },\n onToggleMetadataInputs: function onToggleMetadataInputs(value) {\n dispatch((0, _publish.toggleMetadataInputs)(value));\n }\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(88);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n message: publish.disabledMessage\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _publish = __webpack_require__(6);\n\nvar _view = __webpack_require__(89);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n status: publish.status.status,\n message: publish.status.message\n };\n};\n\nvar mapDispatchToProps = {\n clearFile: _publish.clearFile\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_view2.default);\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _view = __webpack_require__(90);\n\nvar _view2 = _interopRequireDefault(_view);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mapStateToProps = function mapStateToProps(_ref) {\n var publish = _ref.publish;\n\n return {\n disabled: publish.disabled,\n file: publish.file,\n status: publish.status.status\n };\n};\n\nexports.default = (0, _reactRedux.connect)(mapStateToProps, null)(_view2.default);\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-helmet\");\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux-saga/effects\");\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Path = __webpack_require__(51);\n\nvar _require = __webpack_require__(80),\n getSubDirectoryNames = _require.getSubDirectoryNames;\n\nvar thisFolder = Path.resolve(__dirname, 'client/components/');\nvar modules = {};\n\ngetSubDirectoryNames(thisFolder).forEach(function (name) {\n modules[name] = __webpack_require__(168)(\"./\" + name).default;\n});\n\nmodule.exports = modules;\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"path\");\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Path = __webpack_require__(51);\n\nvar _require = __webpack_require__(80),\n getSubDirectoryNames = _require.getSubDirectoryNames;\n\nvar thisFolder = Path.resolve(__dirname, 'client/containers/');\n\nvar modules = {};\n\ngetSubDirectoryNames(thisFolder).forEach(function (name) {\n modules[name] = __webpack_require__(169)(\"./\" + name).default;\n});\n\nmodule.exports = modules;\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Path = __webpack_require__(51);\n\nvar _require = __webpack_require__(80),\n getSubDirectoryNames = _require.getSubDirectoryNames;\n\nvar thisFolder = Path.resolve(__dirname, 'client/pages/');\n\nvar modules = {};\n\ngetSubDirectoryNames(thisFolder).forEach(function (name) {\n modules[name] = __webpack_require__(171)(\"./\" + name).default;\n});\n\nmodule.exports = modules;\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(7);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(5);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _PublishTool = __webpack_require__(47);\n\nvar _PublishTool2 = _interopRequireDefault(_PublishTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar HomePage = function (_React$Component) {\n _inherits(HomePage, _React$Component);\n\n function HomePage() {\n _classCallCheck(this, HomePage);\n\n return _possibleConstructorReturn(this, (HomePage.__proto__ || Object.getPrototypeOf(HomePage)).apply(this, arguments));\n }\n\n _createClass(HomePage, [{\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column' },\n _react2.default.createElement(_SEO2.default, null),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded flex-container--column' },\n _react2.default.createElement(_PublishTool2.default, null)\n )\n );\n }\n }]);\n\n return HomePage;\n}(_react2.default.Component);\n\n;\n\nexports.default = HomePage;\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar axios = __webpack_require__(129);\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(130),\n _require$api = _require.api,\n apiHost = _require$api.apiHost,\n apiPort = _require$api.apiPort;\n\nvar lbryApiUri = 'http://' + apiHost + ':' + apiPort;\n\nvar _require2 = __webpack_require__(56),\n chooseGaLbrynetPublishLabel = _require2.chooseGaLbrynetPublishLabel,\n sendGATimingEvent = _require2.sendGATimingEvent;\n\nvar handleLbrynetResponse = function handleLbrynetResponse(_ref, resolve, reject) {\n var data = _ref.data;\n\n logger.debug('lbry api data:', data);\n if (data.result) {\n // check for an error\n if (data.result.error) {\n logger.debug('Lbrynet api error:', data.result.error);\n reject(new Error(data.result.error));\n return;\n };\n resolve(data.result);\n return;\n }\n // fallback in case it just timed out\n reject(JSON.stringify(data));\n};\n\nmodule.exports = {\n publishClaim: function publishClaim(publishParams) {\n logger.debug('lbryApi >> Publishing claim to \"' + publishParams.name + '\"');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'publish',\n params: publishParams\n }).then(function (response) {\n sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getClaim: function getClaim(uri) {\n logger.debug('lbryApi >> Getting Claim for \"' + uri + '\"');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'get',\n params: { uri: uri, timeout: 20 }\n }).then(function (response) {\n sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getClaimList: function getClaimList(claimName) {\n logger.debug('lbryApi >> Getting claim_list for \"' + claimName + '\"');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'claim_list',\n params: { name: claimName }\n }).then(function (response) {\n sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n resolveUri: function resolveUri(uri) {\n logger.debug('lbryApi >> Resolving URI for \"' + uri + '\"');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'resolve',\n params: { uri: uri }\n }).then(function (_ref2) {\n var data = _ref2.data;\n\n sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now());\n if (data.result[uri].error) {\n // check for errors\n reject(data.result[uri].error);\n } else {\n // if no errors, resolve\n resolve(data.result[uri]);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getDownloadDirectory: function getDownloadDirectory() {\n logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'settings_get'\n }).then(function (_ref3) {\n var data = _ref3.data;\n\n sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now());\n if (data.result) {\n resolve(data.result.download_directory);\n } else {\n return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.');\n }\n }).catch(function (error) {\n logger.error('Lbrynet Error:', error);\n resolve('/home/lbry/Downloads/');\n });\n });\n },\n createChannel: function createChannel(name) {\n logger.debug('lbryApi >> Creating channel for ' + name + '...');\n var gaStartTime = Date.now();\n return new Promise(function (resolve, reject) {\n axios.post(lbryApiUri, {\n method: 'channel_new',\n params: {\n channel_name: name,\n amount: 0.1\n }\n }).then(function (response) {\n sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n};\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar ua = __webpack_require__(131);\n\nvar _require = __webpack_require__(3),\n googleId = _require.analytics.googleId,\n title = _require.details.title;\n\nfunction createServeEventParams(headers, ip, originalUrl) {\n return {\n eventCategory: 'client requests',\n eventAction: 'serve request',\n eventLabel: originalUrl,\n ipOverride: ip,\n userAgentOverride: headers['user-agent']\n };\n};\n\nfunction createPublishTimingEventParams(category, variable, label, startTime, endTime) {\n var duration = endTime - startTime;\n return {\n userTimingCategory: category,\n userTimingVariableName: variable,\n userTimingTime: duration,\n userTimingLabel: label\n };\n};\n\nfunction sendGoogleAnalyticsEvent(ip, params) {\n var visitorId = ip.replace(/\\./g, '-');\n var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.event(params, function (err) {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n });\n};\n\nfunction sendGoogleAnalyticsTiming(visitorId, params) {\n var visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.timing(params, function (err) {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n logger.debug('Timing event successfully sent to google analytics');\n });\n};\n\nmodule.exports = {\n sendGAServeEvent: function sendGAServeEvent(headers, ip, originalUrl) {\n var params = createServeEventParams(headers, ip, originalUrl);\n sendGoogleAnalyticsEvent(ip, params);\n },\n sendGATimingEvent: function sendGATimingEvent(category, variable, label, startTime, endTime) {\n var params = createPublishTimingEventParams(category, variable, label, startTime, endTime);\n sendGoogleAnalyticsTiming(title, params);\n },\n chooseGaLbrynetPublishLabel: function chooseGaLbrynetPublishLabel(_ref) {\n var channelName = _ref.channel_name,\n channelId = _ref.channel_id;\n\n return channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM';\n }\n};\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux\");\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _require = __webpack_require__(3),\n customComponents = _require.customComponents;\n\nfunction getDeepestChildValue(parent, childrenKeys) {\n var childKey = childrenKeys.shift(); // .shift() retrieves the first element of array and removes it from array\n var child = parent[childKey];\n if (childrenKeys.length >= 1) {\n return getDeepestChildValue(child, childrenKeys);\n }\n return child;\n}\n\nvar dynamicImport = exports.dynamicImport = function dynamicImport(filePath) {\n // validate inputs\n if (!filePath) {\n throw new Error('no file path provided to dynamicImport()');\n }\n if (typeof filePath !== 'string') {\n console.log('dynamicImport > filePath:', filePath);\n console.log('dynamicImport > filePath type:', typeof filePath === 'undefined' ? 'undefined' : _typeof(filePath));\n throw new Error('file path provided to dynamicImport() must be a string');\n }\n if (!customComponents) {\n return __webpack_require__(109)(\"\" + filePath);\n }\n // split out the file folders // filter out any empty or white-space-only strings\n var folders = filePath.split('/').filter(function (folderName) {\n return folderName.replace(/\\s/g, '').length;\n });\n // check for the component corresponding to file path in the site config object\n // i.e. customComponents[folders[0]][folders[2][...][folders[n]]\n var component = getDeepestChildValue(customComponents, folders);\n if (component) {\n return component; // return custom component\n } else {\n return __webpack_require__(109)(\"\" + filePath);\n }\n};\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar createBasicCanonicalLink = function createBasicCanonicalLink(page, siteHost) {\n return siteHost + \"/\" + page;\n};\n\nvar createAssetCanonicalLink = function createAssetCanonicalLink(asset, siteHost) {\n var channelName = void 0,\n certificateId = void 0,\n name = void 0,\n claimId = void 0;\n if (asset.claimData) {\n var _asset$claimData = asset.claimData;\n channelName = _asset$claimData.channelName;\n certificateId = _asset$claimData.certificateId;\n name = _asset$claimData.name;\n claimId = _asset$claimData.claimId;\n };\n if (channelName) {\n return siteHost + \"/\" + channelName + \":\" + certificateId + \"/\" + name;\n };\n return siteHost + \"/\" + claimId + \"/\" + name;\n};\n\nvar createChannelCanonicalLink = function createChannelCanonicalLink(channel, siteHost) {\n var name = channel.name,\n longId = channel.longId;\n\n return siteHost + \"/\" + name + \":\" + longId;\n};\n\nvar createCanonicalLink = exports.createCanonicalLink = function createCanonicalLink(asset, channel, page, siteHost) {\n if (asset) {\n return createAssetCanonicalLink(asset, siteHost);\n }\n if (channel) {\n return createChannelCanonicalLink(channel, siteHost);\n }\n return createBasicCanonicalLink(page, siteHost);\n};\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n validateFile: function validateFile(file) {\n if (!file) {\n throw new Error('no file provided');\n }\n if (/'/.test(file.name)) {\n throw new Error('apostrophes are not allowed in the file name');\n }\n // validate size and type\n switch (file.type) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n if (file.size > 10000000) {\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n throw new Error('Sorry, GIFs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n }\n};\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nmodule.exports = {\n REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR: '@',\n parseIdentifier: function parseIdentifier(identifier) {\n var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec = componentsRegex // eslint-disable-line no-unused-vars\n .exec(identifier).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4),\n proto = _componentsRegex$exec2[0],\n value = _componentsRegex$exec2[1],\n modifierSeperator = _componentsRegex$exec2[2],\n modifier = _componentsRegex$exec2[3];\n\n // Validate and process name\n\n\n if (!value) {\n throw new Error('Check your URL. No channel name provided before \"' + modifierSeperator + '\"');\n }\n var isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n var channelName = isChannel ? value : null;\n var claimId = void 0;\n if (isChannel) {\n if (!channelName) {\n throw new Error('Check your URL. No channel name after \"@\".');\n }\n var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error('Check your URL. Invalid characters in channel name: \"' + nameBadChars.join(', ') + '\".');\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n var channelClaimId = void 0;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error('Check your URL. No modifier provided after separator \"' + modifierSeperator + '\"');\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error('Check your URL. The \"' + modifierSeperator + '\" modifier is not currently supported');\n }\n }\n return {\n isChannel: isChannel,\n channelName: channelName,\n channelClaimId: channelClaimId || null,\n claimId: claimId || null\n };\n },\n parseClaim: function parseClaim(name) {\n var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first extension)\n '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec3 = componentsRegex // eslint-disable-line no-unused-vars\n .exec(name).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4),\n proto = _componentsRegex$exec4[0],\n claimName = _componentsRegex$exec4[1],\n extensionSeperator = _componentsRegex$exec4[2],\n extension = _componentsRegex$exec4[3];\n\n // Validate and process name\n\n\n if (!claimName) {\n throw new Error('Check your URL. No claim name provided before \".\"');\n }\n var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error('Check your URL. Invalid characters in claim name: \"' + nameBadChars.join(', ') + '\".');\n }\n // Validate and process extension\n if (extensionSeperator) {\n if (!extension) {\n throw new Error('Check your URL. No file extension provided after separator \"' + extensionSeperator + '\".');\n }\n if (extensionSeperator !== '.') {\n throw new Error('Check your URL. The \"' + extensionSeperator + '\" separator is not supported in the claim name.');\n }\n }\n return {\n claimName: claimName,\n extension: extension || null\n };\n }\n};\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar determineOgThumbnailContentType = function determineOgThumbnailContentType(thumbnail) {\n if (thumbnail) {\n var fileExt = thumbnail.substring(thumbnail.lastIndexOf('.'));\n switch (fileExt) {\n case 'jpeg':\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'mp4':\n return 'video/mp4';\n default:\n return 'image/jpeg';\n }\n }\n return '';\n};\n\nvar createBasicMetaTags = function createBasicMetaTags(siteHost, siteDescription, siteTitle, siteTwitter) {\n return [{ property: 'og:title', content: siteTitle }, { property: 'og:url', content: siteHost }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: siteDescription }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }];\n};\n\nvar createChannelMetaTags = function createChannelMetaTags(siteTitle, siteHost, siteTwitter, channel) {\n var name = channel.name,\n longId = channel.longId;\n\n return [{ property: 'og:title', content: name + ' on ' + siteTitle }, { property: 'og:url', content: siteHost + '/' + name + ':' + longId }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: name + ', a channel on ' + siteTitle }, { property: 'twitter:site', content: siteTwitter }, { property: 'twitter:card', content: 'summary' }];\n};\n\nvar createAssetMetaTags = function createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail) {\n var claimData = asset.claimData;\n var contentType = claimData.contentType;\n\n var embedUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name;\n var showUrl = siteHost + '/' + claimData.claimId + '/' + claimData.name;\n var source = siteHost + '/' + claimData.claimId + '/' + claimData.name + '.' + claimData.fileExt;\n var ogTitle = claimData.title || claimData.name;\n var ogDescription = claimData.description || defaultDescription;\n var ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail);\n var ogThumbnail = claimData.thumbnail || defaultThumbnail;\n var metaTags = [{ property: 'og:title', content: ogTitle }, { property: 'og:url', content: showUrl }, { property: 'og:site_name', content: siteTitle }, { property: 'og:description', content: ogDescription }, { property: 'og:image:width', content: 600 }, { property: 'og:image:height', content: 315 }, { property: 'twitter:site', content: siteTwitter }];\n if (contentType === 'video/mp4' || contentType === 'video/webm') {\n metaTags.push({ property: 'og:video', content: source });\n metaTags.push({ property: 'og:video:secure_url', content: source });\n metaTags.push({ property: 'og:video:type', content: contentType });\n metaTags.push({ property: 'og:image', content: ogThumbnail });\n metaTags.push({ property: 'og:image:type', content: ogThumbnailContentType });\n metaTags.push({ property: 'og:type', content: 'video' });\n metaTags.push({ property: 'twitter:card', content: 'player' });\n metaTags.push({ property: 'twitter:player', content: embedUrl });\n metaTags.push({ property: 'twitter:player:width', content: 600 });\n metaTags.push({ property: 'twitter:text:player_width', content: 600 });\n metaTags.push({ property: 'twitter:player:height', content: 337 });\n metaTags.push({ property: 'twitter:player:stream', content: source });\n metaTags.push({ property: 'twitter:player:stream:content_type', content: contentType });\n } else {\n metaTags.push({ property: 'og:image', content: source });\n metaTags.push({ property: 'og:image:type', content: contentType });\n metaTags.push({ property: 'og:type', content: 'article' });\n metaTags.push({ property: 'twitter:card', content: 'summary_large_image' });\n }\n return metaTags;\n};\n\nvar createMetaTags = exports.createMetaTags = function createMetaTags(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail) {\n if (asset) {\n return createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail);\n };\n if (channel) {\n return createChannelMetaTags(siteHost, siteTitle, siteTwitter, channel);\n };\n return createBasicMetaTags(siteDescription, siteHost, siteTitle, siteTwitter);\n};\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar createPageTitle = exports.createPageTitle = function createPageTitle(siteTitle, pageTitle) {\n if (!pageTitle) {\n return \"\" + siteTitle;\n }\n return siteTitle + \" - \" + pageTitle;\n};\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.updateLoggedInChannel = updateLoggedInChannel;\n\nvar _channel_action_types = __webpack_require__(106);\n\nvar actions = _interopRequireWildcard(_channel_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// export action creators\n\nfunction updateLoggedInChannel(name, shortId, longId) {\n return {\n type: actions.CHANNEL_UPDATE,\n data: {\n name: name,\n shortId: shortId,\n longId: longId\n }\n };\n};\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _Logo = __webpack_require__(21);\n\nvar _Logo2 = _interopRequireDefault(_Logo);\n\nvar _NavBarChannelOptionsDropdown = __webpack_require__(22);\n\nvar _NavBarChannelOptionsDropdown2 = _interopRequireDefault(_NavBarChannelOptionsDropdown);\n\nvar _request = __webpack_require__(8);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar VIEW = 'VIEW';\nvar LOGOUT = 'LOGOUT';\n\nvar NavBar = function (_React$Component) {\n _inherits(NavBar, _React$Component);\n\n function NavBar(props) {\n _classCallCheck(this, NavBar);\n\n var _this = _possibleConstructorReturn(this, (NavBar.__proto__ || Object.getPrototypeOf(NavBar)).call(this, props));\n\n _this.checkForLoggedInUser = _this.checkForLoggedInUser.bind(_this);\n _this.logoutUser = _this.logoutUser.bind(_this);\n _this.handleSelection = _this.handleSelection.bind(_this);\n return _this;\n }\n\n _createClass(NavBar, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n // check to see if the user is already logged in\n this.checkForLoggedInUser();\n }\n }, {\n key: 'checkForLoggedInUser',\n value: function checkForLoggedInUser() {\n var _this2 = this;\n\n var params = { credentials: 'include' };\n (0, _request2.default)('/user', params).then(function (_ref) {\n var data = _ref.data;\n\n _this2.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId);\n }).catch(function (error) {\n console.log('/user error:', error.message);\n });\n }\n }, {\n key: 'logoutUser',\n value: function logoutUser() {\n var _this3 = this;\n\n var params = { credentials: 'include' };\n (0, _request2.default)('/logout', params).then(function () {\n _this3.props.onChannelLogout();\n }).catch(function (error) {\n console.log('/logout error', error.message);\n });\n }\n }, {\n key: 'handleSelection',\n value: function handleSelection(event) {\n var value = event.target.selectedOptions[0].value;\n switch (value) {\n case LOGOUT:\n this.logoutUser();\n break;\n case VIEW:\n // redirect to channel page\n this.props.history.push('/' + this.props.channelName + ':' + this.props.channelLongId);\n break;\n default:\n break;\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var siteDescription = this.props.siteDescription;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--wide nav-bar' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--short flex-container--row flex-container--space-between-center' },\n _react2.default.createElement(_Logo2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'nav-bar--center' },\n _react2.default.createElement(\n 'span',\n { className: 'nav-bar-tagline' },\n siteDescription\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'nav-bar--right' },\n _react2.default.createElement(\n _reactRouterDom.NavLink,\n { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/', exact: true },\n 'Publish'\n ),\n _react2.default.createElement(\n _reactRouterDom.NavLink,\n { className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/about' },\n 'About'\n ),\n this.props.channelName ? _react2.default.createElement(_NavBarChannelOptionsDropdown2.default, {\n channelName: this.props.channelName,\n handleSelection: this.handleSelection,\n defaultSelection: this.props.channelName,\n VIEW: VIEW,\n LOGOUT: LOGOUT\n }) : _react2.default.createElement(\n _reactRouterDom.NavLink,\n { id: 'nav-bar-login-link', className: 'nav-bar-link link--nav', activeClassName: 'link--nav-active', to: '/login' },\n 'Channel'\n )\n )\n )\n );\n }\n }]);\n\n return NavBar;\n}(_react2.default.Component);\n\nexports.default = (0, _reactRouterDom.withRouter)(NavBar);\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactHelmet = __webpack_require__(48);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nvar _propTypes = __webpack_require__(14);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _pageTitle = __webpack_require__(63);\n\nvar _metaTags = __webpack_require__(62);\n\nvar _canonicalLink = __webpack_require__(59);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SEO = function (_React$Component) {\n _inherits(SEO, _React$Component);\n\n function SEO() {\n _classCallCheck(this, SEO);\n\n return _possibleConstructorReturn(this, (SEO.__proto__ || Object.getPrototypeOf(SEO)).apply(this, arguments));\n }\n\n _createClass(SEO, [{\n key: 'render',\n value: function render() {\n // props from state\n var _props = this.props,\n defaultDescription = _props.defaultDescription,\n defaultThumbnail = _props.defaultThumbnail,\n siteDescription = _props.siteDescription,\n siteHost = _props.siteHost,\n siteTitle = _props.siteTitle,\n siteTwitter = _props.siteTwitter;\n // props from parent\n\n var _props2 = this.props,\n asset = _props2.asset,\n channel = _props2.channel,\n pageUri = _props2.pageUri;\n var pageTitle = this.props.pageTitle;\n // create page title, tags, and canonical link\n\n pageTitle = (0, _pageTitle.createPageTitle)(siteTitle, pageTitle);\n var metaTags = (0, _metaTags.createMetaTags)(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail);\n var canonicalLink = (0, _canonicalLink.createCanonicalLink)(asset, channel, pageUri, siteHost);\n // render results\n return _react2.default.createElement(_reactHelmet2.default, {\n title: pageTitle,\n meta: metaTags,\n link: [{ rel: 'canonical', href: canonicalLink }]\n });\n }\n }]);\n\n return SEO;\n}(_react2.default.Component);\n\n;\n\nSEO.propTypes = {\n pageTitle: _propTypes2.default.string,\n pageUri: _propTypes2.default.string,\n channel: _propTypes2.default.object,\n asset: _propTypes2.default.object\n};\n\nexports.default = SEO;\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _SEO = __webpack_require__(7);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(5);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ChannelLoginForm = __webpack_require__(15);\n\nvar _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm);\n\nvar _ChannelCreateForm = __webpack_require__(16);\n\nvar _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar LoginPage = function (_React$Component) {\n _inherits(LoginPage, _React$Component);\n\n function LoginPage() {\n _classCallCheck(this, LoginPage);\n\n return _possibleConstructorReturn(this, (LoginPage.__proto__ || Object.getPrototypeOf(LoginPage)).apply(this, arguments));\n }\n\n _createClass(LoginPage, [{\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(newProps) {\n // re-route the user to the homepage if the user is logged in\n if (newProps.loggedInChannelName !== this.props.loggedInChannelName) {\n this.props.history.push('/');\n }\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: 'Login', pageUri: 'login' }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'p',\n null,\n 'Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you\\'re ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: '/@catalonia2017:43dcf47163caa21d8404d9fe9b30f78ef3e146a8' },\n 'documenting important events'\n ),\n ', or making a public repository for ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: '/@catGifs' },\n 'cat gifs'\n ),\n ' (password: \\'1234\\'), try creating a channel for it!'\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'h3',\n { className: 'h3--no-bottom' },\n 'Log in to an existing channel:'\n ),\n _react2.default.createElement(_ChannelLoginForm2.default, null),\n _react2.default.createElement(\n 'h3',\n { className: 'h3--no-bottom' },\n 'Create a brand new channel:'\n ),\n _react2.default.createElement(_ChannelCreateForm2.default, null)\n )\n )\n )\n );\n }\n }]);\n\n return LoginPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _reactRouterDom.withRouter)(LoginPage);\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _request = __webpack_require__(8);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelLoginForm = function (_React$Component) {\n _inherits(ChannelLoginForm, _React$Component);\n\n function ChannelLoginForm(props) {\n _classCallCheck(this, ChannelLoginForm);\n\n var _this = _possibleConstructorReturn(this, (ChannelLoginForm.__proto__ || Object.getPrototypeOf(ChannelLoginForm)).call(this, props));\n\n _this.state = {\n error: null,\n name: '',\n password: ''\n };\n _this.handleInput = _this.handleInput.bind(_this);\n _this.loginToChannel = _this.loginToChannel.bind(_this);\n return _this;\n }\n\n _createClass(ChannelLoginForm, [{\n key: 'handleInput',\n value: function handleInput(event) {\n var name = event.target.name;\n var value = event.target.value;\n this.setState(_defineProperty({}, name, value));\n }\n }, {\n key: 'loginToChannel',\n value: function loginToChannel(event) {\n var _this2 = this;\n\n event.preventDefault();\n var params = {\n method: 'POST',\n body: JSON.stringify({ username: this.state.name, password: this.state.password }),\n headers: new Headers({\n 'Content-Type': 'application/json'\n }),\n credentials: 'include'\n };\n (0, _request2.default)('login', params).then(function (_ref) {\n var success = _ref.success,\n channelName = _ref.channelName,\n shortChannelId = _ref.shortChannelId,\n channelClaimId = _ref.channelClaimId,\n message = _ref.message;\n\n if (success) {\n _this2.props.onChannelLogin(channelName, shortChannelId, channelClaimId);\n } else {\n _this2.setState({ 'error': message });\n };\n }).catch(function (error) {\n if (error.message) {\n _this2.setState({ 'error': error.message });\n } else {\n _this2.setState({ 'error': error });\n }\n });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'form',\n { id: 'channel-login-form' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'channel-login-name-input' },\n 'Name:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary flex-container--row flex-container--left-bottom' },\n _react2.default.createElement(\n 'span',\n null,\n '@'\n ),\n _react2.default.createElement('input', { type: 'text', id: 'channel-login-name-input', className: 'input-text', name: 'name', placeholder: 'Your Channel Name', value: this.state.channelName, onChange: this.handleInput })\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'channel-login-password-input' },\n 'Password:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary' },\n _react2.default.createElement('input', { type: 'password', id: 'channel-login-password-input', name: 'password', className: 'input-text', placeholder: '', value: this.state.channelPassword, onChange: this.handleInput })\n )\n )\n ),\n this.state.error ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n this.state.error\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Enter the name and password for your channel'\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary', onClick: this.loginToChannel },\n 'Authenticate'\n )\n )\n );\n }\n }]);\n\n return ChannelLoginForm;\n}(_react2.default.Component);\n\nexports.default = ChannelLoginForm;\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(10);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _request = __webpack_require__(8);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelCreateForm = function (_React$Component) {\n _inherits(ChannelCreateForm, _React$Component);\n\n function ChannelCreateForm(props) {\n _classCallCheck(this, ChannelCreateForm);\n\n var _this = _possibleConstructorReturn(this, (ChannelCreateForm.__proto__ || Object.getPrototypeOf(ChannelCreateForm)).call(this, props));\n\n _this.state = {\n error: null,\n channel: '',\n password: '',\n status: null\n };\n _this.handleChannelInput = _this.handleChannelInput.bind(_this);\n _this.handleInput = _this.handleInput.bind(_this);\n _this.createChannel = _this.createChannel.bind(_this);\n return _this;\n }\n\n _createClass(ChannelCreateForm, [{\n key: 'cleanseChannelInput',\n value: function cleanseChannelInput(input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n }, {\n key: 'handleChannelInput',\n value: function handleChannelInput(event) {\n var value = event.target.value;\n value = this.cleanseChannelInput(value);\n this.setState({ channel: value });\n if (value) {\n this.updateIsChannelAvailable(value);\n } else {\n this.setState({ error: 'Please enter a channel name' });\n }\n }\n }, {\n key: 'handleInput',\n value: function handleInput(event) {\n var name = event.target.name;\n var value = event.target.value;\n this.setState(_defineProperty({}, name, value));\n }\n }, {\n key: 'updateIsChannelAvailable',\n value: function updateIsChannelAvailable(channel) {\n var _this2 = this;\n\n var channelWithAtSymbol = '@' + channel;\n (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol).then(function () {\n _this2.setState({ 'error': null });\n }).catch(function (error) {\n _this2.setState({ 'error': error.message });\n });\n }\n }, {\n key: 'checkIsChannelAvailable',\n value: function checkIsChannelAvailable(channel) {\n var channelWithAtSymbol = '@' + channel;\n return (0, _request2.default)('/api/channel/availability/' + channelWithAtSymbol);\n }\n }, {\n key: 'checkIsPasswordProvided',\n value: function checkIsPasswordProvided(password) {\n return new Promise(function (resolve, reject) {\n if (!password || password.length < 1) {\n return reject(new Error('Please provide a password'));\n }\n resolve();\n });\n }\n }, {\n key: 'makePublishChannelRequest',\n value: function makePublishChannelRequest(username, password) {\n var params = {\n method: 'POST',\n body: JSON.stringify({ username: username, password: password }),\n headers: new Headers({\n 'Content-Type': 'application/json'\n }),\n credentials: 'include'\n };\n return new Promise(function (resolve, reject) {\n (0, _request2.default)('/signup', params).then(function (result) {\n return resolve(result);\n }).catch(function (error) {\n reject(new Error('Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ' + error.message));\n });\n });\n }\n }, {\n key: 'createChannel',\n value: function createChannel(event) {\n var _this3 = this;\n\n event.preventDefault();\n this.checkIsPasswordProvided(this.state.password).then(function () {\n return _this3.checkIsChannelAvailable(_this3.state.channel);\n }).then(function () {\n _this3.setState({ status: 'We are publishing your new channel. Sit tight...' });\n return _this3.makePublishChannelRequest(_this3.state.channel, _this3.state.password);\n }).then(function (result) {\n _this3.setState({ status: null });\n _this3.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId);\n }).catch(function (error) {\n if (error.message) {\n _this3.setState({ 'error': error.message, status: null });\n } else {\n _this3.setState({ 'error': error, status: null });\n };\n });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n !this.state.status ? _react2.default.createElement(\n 'form',\n { id: 'publish-channel-form' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'new-channel-name' },\n 'Name:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary flex-container--row flex-container--left-bottom span--relative' },\n _react2.default.createElement(\n 'span',\n null,\n '@'\n ),\n _react2.default.createElement('input', { type: 'text', name: 'channel', id: 'new-channel-name', className: 'input-text', placeholder: 'exampleChannelName', value: this.state.channel, onChange: this.handleChannelInput }),\n this.state.channel && !this.state.error && _react2.default.createElement(\n 'span',\n { id: 'input-success-channel-name', className: 'info-message--success span--absolute' },\n '\\u2713'\n ),\n this.state.error && _react2.default.createElement(\n 'span',\n { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' },\n '\\u2716'\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide row--short' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--sml-10' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'new-channel-password' },\n 'Password:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--6 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary' },\n _react2.default.createElement('input', { type: 'password', name: 'password', id: 'new-channel-password', className: 'input-text', placeholder: '', value: this.state.password, onChange: this.handleInput })\n )\n )\n ),\n this.state.error ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n this.state.error\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Choose a name and password for your channel'\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary', onClick: this.createChannel },\n 'Create Channel'\n )\n )\n ) : _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n this.state.status\n ),\n _react2.default.createElement(_ProgressBar2.default, { size: 12 })\n )\n );\n }\n }]);\n\n return ChannelCreateForm;\n}(_react2.default.Component);\n\nexports.default = ChannelCreateForm;\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ErrorPage = __webpack_require__(12);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _ShowAssetLite = __webpack_require__(27);\n\nvar _ShowAssetLite2 = _interopRequireDefault(_ShowAssetLite);\n\nvar _ShowAssetDetails = __webpack_require__(29);\n\nvar _ShowAssetDetails2 = _interopRequireDefault(_ShowAssetDetails);\n\nvar _ShowChannel = __webpack_require__(32);\n\nvar _ShowChannel2 = _interopRequireDefault(_ShowChannel);\n\nvar _show_request_types = __webpack_require__(112);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowPage = function (_React$Component) {\n _inherits(ShowPage, _React$Component);\n\n function ShowPage() {\n _classCallCheck(this, ShowPage);\n\n return _possibleConstructorReturn(this, (ShowPage.__proto__ || Object.getPrototypeOf(ShowPage)).apply(this, arguments));\n }\n\n _createClass(ShowPage, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.props.onHandleShowPageUri(this.props.match.params);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n if (nextProps.match.params !== this.props.match.params) {\n this.props.onHandleShowPageUri(nextProps.match.params);\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n error = _props.error,\n requestType = _props.requestType;\n\n if (error) {\n return _react2.default.createElement(_ErrorPage2.default, { error: error });\n }\n switch (requestType) {\n case _show_request_types.CHANNEL:\n return _react2.default.createElement(_ShowChannel2.default, null);\n case _show_request_types.ASSET_LITE:\n return _react2.default.createElement(_ShowAssetLite2.default, null);\n case _show_request_types.ASSET_DETAILS:\n return _react2.default.createElement(_ShowAssetDetails2.default, null);\n default:\n return _react2.default.createElement(\n 'p',\n null,\n 'loading...'\n );\n }\n }\n }]);\n\n return ShowPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowPage;\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(7);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _AssetDisplay = __webpack_require__(17);\n\nvar _AssetDisplay2 = _interopRequireDefault(_AssetDisplay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowLite = function (_React$Component) {\n _inherits(ShowLite, _React$Component);\n\n function ShowLite() {\n _classCallCheck(this, ShowLite);\n\n return _possibleConstructorReturn(this, (ShowLite.__proto__ || Object.getPrototypeOf(ShowLite)).apply(this, arguments));\n }\n\n _createClass(ShowLite, [{\n key: 'render',\n value: function render() {\n var asset = this.props.asset;\n\n if (asset) {\n var _asset$claimData = asset.claimData,\n name = _asset$claimData.name,\n claimId = _asset$claimData.claimId;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column flex-container--center-center show-lite-container' },\n _react2.default.createElement(_SEO2.default, { pageTitle: name, asset: asset }),\n _react2.default.createElement(_AssetDisplay2.default, null),\n _react2.default.createElement(\n _reactRouterDom.Link,\n { id: 'asset-boilerpate', className: 'link--primary fine-print', to: '/' + claimId + '/' + name },\n 'hosted via Spee.ch'\n )\n );\n }\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded flex-container--column flex-container--center-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'loading asset data...'\n )\n );\n }\n }]);\n\n return ShowLite;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowLite;\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(10);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _asset_display_states = __webpack_require__(107);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AssetDisplay = function (_React$Component) {\n _inherits(AssetDisplay, _React$Component);\n\n function AssetDisplay() {\n _classCallCheck(this, AssetDisplay);\n\n return _possibleConstructorReturn(this, (AssetDisplay.__proto__ || Object.getPrototypeOf(AssetDisplay)).apply(this, arguments));\n }\n\n _createClass(AssetDisplay, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var _props$asset$claimDat = this.props.asset.claimData,\n name = _props$asset$claimDat.name,\n claimId = _props$asset$claimDat.claimId;\n\n this.props.onFileRequest(name, claimId);\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n status = _props.status,\n error = _props.error,\n _props$asset$claimDat2 = _props.asset.claimData,\n name = _props$asset$claimDat2.name,\n claimId = _props$asset$claimDat2.claimId,\n contentType = _props$asset$claimDat2.contentType,\n fileExt = _props$asset$claimDat2.fileExt,\n thumbnail = _props$asset$claimDat2.thumbnail;\n\n return _react2.default.createElement(\n 'div',\n { id: 'asset-display-component' },\n status === _asset_display_states.LOCAL_CHECK && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n null,\n 'Checking to see if Spee.ch has your asset locally...'\n )\n ),\n status === _asset_display_states.UNAVAILABLE && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n null,\n 'Sit tight, we\\'re searching the LBRY blockchain for your asset!'\n ),\n _react2.default.createElement(_ProgressBar2.default, { size: 12 }),\n _react2.default.createElement(\n 'p',\n null,\n 'Curious what magic is happening here? ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' },\n 'Learn more.'\n )\n )\n ),\n status === _asset_display_states.ERROR && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'p',\n null,\n 'Unfortunately, we couldn\\'t download your asset from LBRY. You can help us out by sharing the below error message in the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' },\n 'LBRY discord'\n ),\n '.'\n ),\n _react2.default.createElement(\n 'i',\n null,\n _react2.default.createElement(\n 'p',\n { id: 'error-message' },\n error\n )\n )\n ),\n status === _asset_display_states.AVAILABLE && function () {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n return _react2.default.createElement('img', {\n className: 'asset',\n src: '/' + claimId + '/' + name + '.' + fileExt,\n alt: name });\n case 'image/gif':\n return _react2.default.createElement('img', {\n className: 'asset',\n src: '/' + claimId + '/' + name + '.' + fileExt,\n alt: name\n });\n case 'video/mp4':\n return _react2.default.createElement(\n 'video',\n { className: 'asset video', controls: true, poster: thumbnail },\n _react2.default.createElement('source', {\n src: '/' + claimId + '/' + name + '.' + fileExt\n }),\n _react2.default.createElement(\n 'p',\n null,\n 'Your browser does not support the ',\n _react2.default.createElement(\n 'code',\n null,\n 'video'\n ),\n ' element.'\n )\n );\n default:\n return _react2.default.createElement(\n 'p',\n null,\n 'Unsupported file type'\n );\n }\n }()\n );\n }\n }]);\n\n return AssetDisplay;\n}(_react2.default.Component);\n\n;\n\nexports.default = AssetDisplay;\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(7);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _NavBar = __webpack_require__(5);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ErrorPage = __webpack_require__(12);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _AssetTitle = __webpack_require__(30);\n\nvar _AssetTitle2 = _interopRequireDefault(_AssetTitle);\n\nvar _AssetDisplay = __webpack_require__(17);\n\nvar _AssetDisplay2 = _interopRequireDefault(_AssetDisplay);\n\nvar _AssetInfo = __webpack_require__(31);\n\nvar _AssetInfo2 = _interopRequireDefault(_AssetInfo);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowAssetDetails = function (_React$Component) {\n _inherits(ShowAssetDetails, _React$Component);\n\n function ShowAssetDetails() {\n _classCallCheck(this, ShowAssetDetails);\n\n return _possibleConstructorReturn(this, (ShowAssetDetails.__proto__ || Object.getPrototypeOf(ShowAssetDetails)).apply(this, arguments));\n }\n\n _createClass(ShowAssetDetails, [{\n key: 'render',\n value: function render() {\n var asset = this.props.asset;\n\n if (asset) {\n var name = asset.claimData.name;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: name + ' - details', asset: asset }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(_AssetTitle2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded show-details-container' },\n _react2.default.createElement(_AssetDisplay2.default, null)\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(_AssetInfo2.default, null)\n )\n )\n )\n );\n };\n return _react2.default.createElement(_ErrorPage2.default, { error: 'loading asset data...' });\n }\n }]);\n\n return ShowAssetDetails;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowAssetDetails;\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AssetTitle = function AssetTitle(_ref) {\n var title = _ref.title;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'span',\n { className: 'text--large' },\n title\n )\n );\n};\n\nexports.default = AssetTitle;\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AssetInfo = function (_React$Component) {\n _inherits(AssetInfo, _React$Component);\n\n function AssetInfo(props) {\n _classCallCheck(this, AssetInfo);\n\n var _this = _possibleConstructorReturn(this, (AssetInfo.__proto__ || Object.getPrototypeOf(AssetInfo)).call(this, props));\n\n _this.copyToClipboard = _this.copyToClipboard.bind(_this);\n return _this;\n }\n\n _createClass(AssetInfo, [{\n key: 'copyToClipboard',\n value: function copyToClipboard(event) {\n var elementToCopy = event.target.dataset.elementtocopy;\n var element = document.getElementById(elementToCopy);\n element.select();\n try {\n document.execCommand('copy');\n } catch (err) {\n this.setState({ error: 'Oops, unable to copy' });\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _props$asset = this.props.asset,\n shortId = _props$asset.shortId,\n _props$asset$claimDat = _props$asset.claimData,\n channelName = _props$asset$claimDat.channelName,\n certificateId = _props$asset$claimDat.certificateId,\n description = _props$asset$claimDat.description,\n name = _props$asset$claimDat.name,\n claimId = _props$asset$claimDat.claimId,\n fileExt = _props$asset$claimDat.fileExt,\n contentType = _props$asset$claimDat.contentType,\n thumbnail = _props$asset$claimDat.thumbnail,\n host = _props$asset$claimDat.host;\n\n return _react2.default.createElement(\n 'div',\n null,\n channelName && _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Channel:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { to: '/' + channelName + ':' + certificateId },\n channelName\n )\n )\n )\n ),\n description && _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n description\n )\n ),\n _react2.default.createElement(\n 'div',\n { id: 'show-share-buttons' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Share:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'div',\n {\n className: 'row row--short row--wide flex-container--row flex-container--space-between-bottom flex-container--wrap' },\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://twitter.com/intent/tweet?text=' + host + '/' + shortId + '/' + name },\n 'twitter'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://www.facebook.com/sharer/sharer.php?u=' + host + '/' + shortId + '/' + name },\n 'facebook'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'http://tumblr.com/widgets/share/tool?canonicalUrl=' + host + '/' + shortId + '/' + name },\n 'tumblr'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://www.reddit.com/submit?url=' + host + '/' + shortId + '/' + name + '&title=' + name },\n 'reddit'\n )\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--wide row--no-top' },\n _react2.default.createElement(\n 'div',\n { id: 'show-short-link' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Link:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--short row--wide' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement(\n 'div',\n { className: 'input-error', id: 'input-error-copy-short-link', hidden: 'true' },\n 'error here'\n ),\n _react2.default.createElement('input', { type: 'text', id: 'short-link', className: 'input-disabled input-text--full-width', readOnly: true,\n spellCheck: 'false',\n value: host + '/' + shortId + '/' + name + '.' + fileExt,\n onClick: this.select })\n ),\n _react2.default.createElement('div', { className: 'column column--1' }),\n _react2.default.createElement(\n 'div',\n { className: 'column column--2' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary button--wide', 'data-elementtocopy': 'short-link',\n onClick: this.copyToClipboard },\n 'copy'\n )\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { id: 'show-embed-code' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--2 column--med-10' },\n _react2.default.createElement(\n 'span',\n { className: 'text' },\n 'Embed:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--8 column--med-10' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--short row--wide' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement(\n 'div',\n { className: 'input-error', id: 'input-error-copy-embed-text', hidden: 'true' },\n 'error here'\n ),\n contentType === 'video/mp4' ? _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true,\n onClick: this.select, spellCheck: 'false',\n value: '' }) : _react2.default.createElement('input', { type: 'text', id: 'embed-text', className: 'input-disabled input-text--full-width', readOnly: true,\n onClick: this.select, spellCheck: 'false',\n value: ''\n })\n ),\n _react2.default.createElement('div', { className: 'column column--1' }),\n _react2.default.createElement(\n 'div',\n { className: 'column column--2' },\n _react2.default.createElement(\n 'button',\n { className: 'button--primary button--wide', 'data-elementtocopy': 'embed-text',\n onClick: this.copyToClipboard },\n 'copy'\n )\n )\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'flex-container--row flex-container--space-between-bottom' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { className: 'link--primary', to: '/' + shortId + '/' + name + '.' + fileExt },\n _react2.default.createElement(\n 'span',\n {\n className: 'text' },\n 'Direct Link'\n )\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: host + '/' + claimId + '/' + name + '.' + fileExt, download: name },\n 'Download'\n ),\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://lbry.io/dmca' },\n 'Report'\n )\n )\n );\n }\n }]);\n\n return AssetInfo;\n}(_react2.default.Component);\n\n;\n\nexports.default = AssetInfo;\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _SEO = __webpack_require__(7);\n\nvar _SEO2 = _interopRequireDefault(_SEO);\n\nvar _ErrorPage = __webpack_require__(12);\n\nvar _ErrorPage2 = _interopRequireDefault(_ErrorPage);\n\nvar _NavBar = __webpack_require__(5);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _ChannelClaimsDisplay = __webpack_require__(33);\n\nvar _ChannelClaimsDisplay2 = _interopRequireDefault(_ChannelClaimsDisplay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShowChannel = function (_React$Component) {\n _inherits(ShowChannel, _React$Component);\n\n function ShowChannel() {\n _classCallCheck(this, ShowChannel);\n\n return _possibleConstructorReturn(this, (ShowChannel.__proto__ || Object.getPrototypeOf(ShowChannel)).apply(this, arguments));\n }\n\n _createClass(ShowChannel, [{\n key: 'render',\n value: function render() {\n var channel = this.props.channel;\n\n if (channel) {\n var name = channel.name,\n longId = channel.longId,\n shortId = channel.shortId;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_SEO2.default, { pageTitle: name, channel: channel }),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--tall row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(\n 'h2',\n null,\n 'channel name: ',\n name\n ),\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'full channel id: ',\n longId\n ),\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'short channel id: ',\n shortId\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(_ChannelClaimsDisplay2.default, null)\n )\n )\n );\n };\n return _react2.default.createElement(_ErrorPage2.default, { error: 'loading channel data...' });\n }\n }]);\n\n return ShowChannel;\n}(_react2.default.Component);\n\n;\n\nexports.default = ShowChannel;\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _AssetPreview = __webpack_require__(34);\n\nvar _AssetPreview2 = _interopRequireDefault(_AssetPreview);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelClaimsDisplay = function (_React$Component) {\n _inherits(ChannelClaimsDisplay, _React$Component);\n\n function ChannelClaimsDisplay(props) {\n _classCallCheck(this, ChannelClaimsDisplay);\n\n var _this = _possibleConstructorReturn(this, (ChannelClaimsDisplay.__proto__ || Object.getPrototypeOf(ChannelClaimsDisplay)).call(this, props));\n\n _this.showNextResultsPage = _this.showNextResultsPage.bind(_this);\n _this.showPreviousResultsPage = _this.showPreviousResultsPage.bind(_this);\n return _this;\n }\n\n _createClass(ChannelClaimsDisplay, [{\n key: 'showPreviousResultsPage',\n value: function showPreviousResultsPage() {\n var currentPage = this.props.channel.claimsData.currentPage;\n\n var previousPage = parseInt(currentPage) - 1;\n this.showNewPage(previousPage);\n }\n }, {\n key: 'showNextResultsPage',\n value: function showNextResultsPage() {\n var currentPage = this.props.channel.claimsData.currentPage;\n\n var nextPage = parseInt(currentPage) + 1;\n this.showNewPage(nextPage);\n }\n }, {\n key: 'showNewPage',\n value: function showNewPage(page) {\n var _props = this.props,\n channelKey = _props.channelKey,\n _props$channel = _props.channel,\n name = _props$channel.name,\n longId = _props$channel.longId;\n\n this.props.onUpdateChannelClaims(channelKey, name, longId, page);\n }\n }, {\n key: 'render',\n value: function render() {\n var _props$channel$claims = this.props.channel.claimsData,\n claims = _props$channel$claims.claims,\n currentPage = _props$channel$claims.currentPage,\n totalPages = _props$channel$claims.totalPages;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall' },\n claims.length > 0 ? _react2.default.createElement(\n 'div',\n null,\n claims.map(function (claim, index) {\n return _react2.default.createElement(_AssetPreview2.default, {\n claimData: claim,\n key: claim.name + '-' + index\n });\n }),\n _react2.default.createElement(\n 'div',\n null,\n currentPage > 1 && _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: this.showPreviousResultsPage },\n 'Previous Page'\n ),\n currentPage < totalPages && _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: this.showNextResultsPage },\n 'Next Page'\n )\n )\n ) : _react2.default.createElement(\n 'p',\n null,\n 'There are no claims in this channel'\n )\n );\n }\n }]);\n\n return ChannelClaimsDisplay;\n}(_react2.default.Component);\n\n;\n\nexports.default = ChannelClaimsDisplay;\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AssetPreview = function AssetPreview(_ref) {\n var defaultThumbnail = _ref.defaultThumbnail,\n _ref$claimData = _ref.claimData,\n name = _ref$claimData.name,\n claimId = _ref$claimData.claimId,\n fileExt = _ref$claimData.fileExt,\n contentType = _ref$claimData.contentType,\n thumbnail = _ref$claimData.thumbnail;\n\n var directSourceLink = claimId + '/' + name + '.' + fileExt;\n var showUrlLink = '/' + claimId + '/' + name;\n return _react2.default.createElement(\n 'div',\n { className: 'asset-holder' },\n _react2.default.createElement(\n _reactRouterDom.Link,\n { to: showUrlLink },\n function () {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n case 'image/gif':\n return _react2.default.createElement('img', {\n className: 'asset-preview',\n src: directSourceLink,\n alt: name\n });\n case 'video/mp4':\n return _react2.default.createElement('img', {\n className: 'asset-preview video',\n src: thumbnail || defaultThumbnail,\n alt: name\n });\n default:\n return _react2.default.createElement(\n 'p',\n null,\n 'unsupported file type'\n );\n }\n }()\n )\n );\n};\n\nexports.default = AssetPreview;\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _NavBar = __webpack_require__(5);\n\nvar _NavBar2 = _interopRequireDefault(_NavBar);\n\nvar _reactHelmet = __webpack_require__(48);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar FourOhForPage = function (_React$Component) {\n _inherits(FourOhForPage, _React$Component);\n\n function FourOhForPage() {\n _classCallCheck(this, FourOhForPage);\n\n return _possibleConstructorReturn(this, (FourOhForPage.__proto__ || Object.getPrototypeOf(FourOhForPage)).apply(this, arguments));\n }\n\n _createClass(FourOhForPage, [{\n key: 'render',\n value: function render() {\n var _props = this.props,\n title = _props.title,\n host = _props.host;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n _reactHelmet2.default,\n null,\n _react2.default.createElement(\n 'title',\n null,\n title,\n ' - 404'\n ),\n _react2.default.createElement('link', { rel: 'canonical', href: host + '/404' })\n ),\n _react2.default.createElement(_NavBar2.default, null),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(\n 'h2',\n null,\n '404'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'That page does not exist'\n )\n )\n );\n }\n }]);\n\n return FourOhForPage;\n}(_react2.default.Component);\n\n;\n\nexports.default = FourOhForPage;\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _require = __webpack_require__(98),\n lstatSync = _require.lstatSync,\n readdirSync = _require.readdirSync;\n\nvar _require2 = __webpack_require__(51),\n join = _require2.join;\n\nvar getSubDirectoryNames = exports.getSubDirectoryNames = function getSubDirectoryNames(root) {\n return readdirSync(root).filter(function (name) {\n var fullPath = join(root, name);\n return lstatSync(fullPath).isDirectory();\n });\n};\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ChannelLoginForm = __webpack_require__(15);\n\nvar _ChannelLoginForm2 = _interopRequireDefault(_ChannelLoginForm);\n\nvar _ChannelCreateForm = __webpack_require__(16);\n\nvar _ChannelCreateForm2 = _interopRequireDefault(_ChannelCreateForm);\n\nvar _publish_channel_select_states = __webpack_require__(105);\n\nvar states = _interopRequireWildcard(_publish_channel_select_states);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChannelSelect = function (_React$Component) {\n _inherits(ChannelSelect, _React$Component);\n\n function ChannelSelect(props) {\n _classCallCheck(this, ChannelSelect);\n\n var _this = _possibleConstructorReturn(this, (ChannelSelect.__proto__ || Object.getPrototypeOf(ChannelSelect)).call(this, props));\n\n _this.toggleAnonymousPublish = _this.toggleAnonymousPublish.bind(_this);\n _this.handleSelection = _this.handleSelection.bind(_this);\n return _this;\n }\n\n _createClass(ChannelSelect, [{\n key: 'toggleAnonymousPublish',\n value: function toggleAnonymousPublish(event) {\n var value = event.target.value;\n if (value === 'anonymous') {\n this.props.onPublishInChannelChange(false);\n } else {\n this.props.onPublishInChannelChange(true);\n }\n }\n }, {\n key: 'handleSelection',\n value: function handleSelection(event) {\n var selectedOption = event.target.selectedOptions[0].value;\n this.props.onChannelSelect(selectedOption);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'form',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--med-10' },\n _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'anonymous-radio', className: 'input-radio', value: 'anonymous', checked: !this.props.publishInChannel, onChange: this.toggleAnonymousPublish }),\n _react2.default.createElement(\n 'label',\n { className: 'label label--pointer', htmlFor: 'anonymous-radio' },\n 'Anonymous'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7 column--med-10' },\n _react2.default.createElement('input', { type: 'radio', name: 'anonymous-or-channel', id: 'channel-radio', className: 'input-radio', value: 'in a channel', checked: this.props.publishInChannel, onChange: this.toggleAnonymousPublish }),\n _react2.default.createElement(\n 'label',\n { className: 'label label--pointer', htmlFor: 'channel-radio' },\n 'In a channel'\n )\n ),\n this.props.channelError ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n this.props.channelError\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Publish anonymously or in a channel'\n )\n ),\n this.props.publishInChannel && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'column column--3' },\n _react2.default.createElement(\n 'label',\n { className: 'label', htmlFor: 'channel-name-select' },\n 'Channel:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement(\n 'select',\n { type: 'text', id: 'channel-name-select', className: 'select select--arrow', value: this.props.selectedChannel, onChange: this.handleSelection },\n this.props.loggedInChannelName && _react2.default.createElement(\n 'option',\n { value: this.props.loggedInChannelName, id: 'publish-channel-select-channel-option' },\n this.props.loggedInChannelName\n ),\n _react2.default.createElement(\n 'option',\n { value: states.LOGIN },\n 'Existing'\n ),\n _react2.default.createElement(\n 'option',\n { value: states.CREATE },\n 'New'\n )\n )\n ),\n this.props.selectedChannel === states.LOGIN && _react2.default.createElement(_ChannelLoginForm2.default, null),\n this.props.selectedChannel === states.CREATE && _react2.default.createElement(_ChannelCreateForm2.default, null)\n )\n );\n }\n }]);\n\n return ChannelSelect;\n}(_react2.default.Component);\n\nexports.default = ChannelSelect;\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _file = __webpack_require__(60);\n\nvar _PublishPreview = __webpack_require__(37);\n\nvar _PublishPreview2 = _interopRequireDefault(_PublishPreview);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Dropzone = function (_React$Component) {\n _inherits(Dropzone, _React$Component);\n\n function Dropzone(props) {\n _classCallCheck(this, Dropzone);\n\n var _this = _possibleConstructorReturn(this, (Dropzone.__proto__ || Object.getPrototypeOf(Dropzone)).call(this, props));\n\n _this.state = {\n dragOver: false,\n mouseOver: false,\n dimPreview: false\n };\n _this.handleDrop = _this.handleDrop.bind(_this);\n _this.handleDragOver = _this.handleDragOver.bind(_this);\n _this.handleDragEnd = _this.handleDragEnd.bind(_this);\n _this.handleDragEnter = _this.handleDragEnter.bind(_this);\n _this.handleDragLeave = _this.handleDragLeave.bind(_this);\n _this.handleMouseEnter = _this.handleMouseEnter.bind(_this);\n _this.handleMouseLeave = _this.handleMouseLeave.bind(_this);\n _this.handleClick = _this.handleClick.bind(_this);\n _this.handleFileInput = _this.handleFileInput.bind(_this);\n _this.chooseFile = _this.chooseFile.bind(_this);\n return _this;\n }\n\n _createClass(Dropzone, [{\n key: 'handleDrop',\n value: function handleDrop(event) {\n event.preventDefault();\n this.setState({ dragOver: false });\n // if dropped items aren't files, reject them\n var dt = event.dataTransfer;\n if (dt.items) {\n if (dt.items[0].kind === 'file') {\n var droppedFile = dt.items[0].getAsFile();\n this.chooseFile(droppedFile);\n }\n }\n }\n }, {\n key: 'handleDragOver',\n value: function handleDragOver(event) {\n event.preventDefault();\n }\n }, {\n key: 'handleDragEnd',\n value: function handleDragEnd(event) {\n var dt = event.dataTransfer;\n if (dt.items) {\n for (var i = 0; i < dt.items.length; i++) {\n dt.items.remove(i);\n }\n } else {\n event.dataTransfer.clearData();\n }\n }\n }, {\n key: 'handleDragEnter',\n value: function handleDragEnter() {\n this.setState({ dragOver: true, dimPreview: true });\n }\n }, {\n key: 'handleDragLeave',\n value: function handleDragLeave() {\n this.setState({ dragOver: false, dimPreview: false });\n }\n }, {\n key: 'handleMouseEnter',\n value: function handleMouseEnter() {\n this.setState({ mouseOver: true, dimPreview: true });\n }\n }, {\n key: 'handleMouseLeave',\n value: function handleMouseLeave() {\n this.setState({ mouseOver: false, dimPreview: false });\n }\n }, {\n key: 'handleClick',\n value: function handleClick(event) {\n event.preventDefault();\n document.getElementById('file_input').click();\n }\n }, {\n key: 'handleFileInput',\n value: function handleFileInput(event) {\n event.preventDefault();\n var fileList = event.target.files;\n this.chooseFile(fileList[0]);\n }\n }, {\n key: 'chooseFile',\n value: function chooseFile(file) {\n if (file) {\n try {\n (0, _file.validateFile)(file); // validate the file's name, type, and size\n } catch (error) {\n return this.props.setFileError(error.message);\n }\n // stage it so it will be ready when the publish button is clicked\n this.props.selectFile(file);\n }\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column' },\n _react2.default.createElement(\n 'form',\n null,\n _react2.default.createElement('input', { className: 'input-file', type: 'file', id: 'file_input', name: 'file_input', accept: 'video/*,image/*', onChange: this.handleFileInput, encType: 'multipart/form-data' })\n ),\n _react2.default.createElement(\n 'div',\n { id: 'preview-dropzone', className: 'row row--padded row--tall dropzone' + (this.state.dragOver ? ' dropzone--drag-over' : ''), onDrop: this.handleDrop, onDragOver: this.handleDragOver, onDragEnd: this.handleDragEnd, onDragEnter: this.handleDragEnter, onDragLeave: this.handleDragLeave, onMouseEnter: this.handleMouseEnter, onMouseLeave: this.handleMouseLeave, onClick: this.handleClick },\n this.props.file ? _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(_PublishPreview2.default, {\n dimPreview: this.state.dimPreview,\n file: this.props.file,\n thumbnail: this.props.thumbnail\n }),\n _react2.default.createElement(\n 'div',\n { id: 'dropzone-text-holder', className: 'flex-container--column flex-container--center-center' },\n this.state.dragOver ? _react2.default.createElement(\n 'div',\n { id: 'dropzone-dragover' },\n _react2.default.createElement(\n 'p',\n { className: 'blue' },\n 'Drop it.'\n )\n ) : null,\n this.state.mouseOver ? _react2.default.createElement(\n 'div',\n { id: 'dropzone-instructions' },\n _react2.default.createElement(\n 'p',\n { className: 'info-message-placeholder info-message--failure', id: 'input-error-file-selection' },\n this.props.fileError\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'Drag & drop image or video here to publish'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'OR'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'blue--underlined' },\n 'CHOOSE FILE'\n )\n ) : null\n )\n ) : _react2.default.createElement(\n 'div',\n { id: 'dropzone-text-holder', className: 'flex-container--column flex-container--center-center' },\n this.state.dragOver ? _react2.default.createElement(\n 'div',\n { id: 'dropzone-dragover' },\n _react2.default.createElement(\n 'p',\n { className: 'blue' },\n 'Drop it.'\n )\n ) : _react2.default.createElement(\n 'div',\n { id: 'dropzone-instructions' },\n _react2.default.createElement(\n 'p',\n { className: 'info-message-placeholder info-message--failure', id: 'input-error-file-selection' },\n this.props.fileError\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'Drag & drop image or video here to publish'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'OR'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'blue--underlined' },\n 'CHOOSE FILE'\n )\n )\n )\n )\n );\n }\n }]);\n\n return Dropzone;\n}(_react2.default.Component);\n\n;\n\nexports.default = Dropzone;\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _Dropzone = __webpack_require__(18);\n\nvar _Dropzone2 = _interopRequireDefault(_Dropzone);\n\nvar _PublishTitleInput = __webpack_require__(41);\n\nvar _PublishTitleInput2 = _interopRequireDefault(_PublishTitleInput);\n\nvar _PublishUrlInput = __webpack_require__(42);\n\nvar _PublishUrlInput2 = _interopRequireDefault(_PublishUrlInput);\n\nvar _PublishThumbnailInput = __webpack_require__(43);\n\nvar _PublishThumbnailInput2 = _interopRequireDefault(_PublishThumbnailInput);\n\nvar _PublishMetadataInputs = __webpack_require__(44);\n\nvar _PublishMetadataInputs2 = _interopRequireDefault(_PublishMetadataInputs);\n\nvar _ChannelSelect = __webpack_require__(39);\n\nvar _ChannelSelect2 = _interopRequireDefault(_ChannelSelect);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishDetails = function (_React$Component) {\n _inherits(PublishDetails, _React$Component);\n\n function PublishDetails(props) {\n _classCallCheck(this, PublishDetails);\n\n var _this = _possibleConstructorReturn(this, (PublishDetails.__proto__ || Object.getPrototypeOf(PublishDetails)).call(this, props));\n\n _this.onPublishSubmit = _this.onPublishSubmit.bind(_this);\n return _this;\n }\n\n _createClass(PublishDetails, [{\n key: 'onPublishSubmit',\n value: function onPublishSubmit() {\n this.props.startPublish(this.props.history);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { className: 'row row--no-bottom' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--10' },\n _react2.default.createElement(_PublishTitleInput2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded' },\n _react2.default.createElement(_Dropzone2.default, null)\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--5 column--sml-10 align-content-top' },\n _react2.default.createElement(\n 'div',\n { id: 'publish-active-area', className: 'row row--padded' },\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--wide' },\n _react2.default.createElement(_PublishUrlInput2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--wide' },\n _react2.default.createElement(_ChannelSelect2.default, null)\n ),\n this.props.file.type === 'video/mp4' && _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--wide ' },\n _react2.default.createElement(_PublishThumbnailInput2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-top row--no-bottom row--wide' },\n _react2.default.createElement(_PublishMetadataInputs2.default, null)\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--wide align-content-center' },\n _react2.default.createElement(\n 'button',\n { id: 'publish-submit', className: 'button--primary button--large', onClick: this.onPublishSubmit },\n 'Publish'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--padded row--no-bottom align-content-center' },\n _react2.default.createElement(\n 'button',\n { className: 'button--cancel', onClick: this.props.clearFile },\n 'Cancel'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--short align-content-center' },\n _react2.default.createElement(\n 'p',\n { className: 'fine-print' },\n 'By clicking \\'Publish\\', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: 'https://lbry.io/learn' },\n 'Read more.'\n )\n )\n )\n )\n )\n );\n }\n }]);\n\n return PublishDetails;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _reactRouterDom.withRouter)(PublishDetails);\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishTitleInput = function (_React$Component) {\n _inherits(PublishTitleInput, _React$Component);\n\n function PublishTitleInput(props) {\n _classCallCheck(this, PublishTitleInput);\n\n var _this = _possibleConstructorReturn(this, (PublishTitleInput.__proto__ || Object.getPrototypeOf(PublishTitleInput)).call(this, props));\n\n _this.handleInput = _this.handleInput.bind(_this);\n return _this;\n }\n\n _createClass(PublishTitleInput, [{\n key: 'handleInput',\n value: function handleInput(e) {\n var name = e.target.name;\n var value = e.target.value;\n this.props.onMetadataChange(name, value);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement('input', { type: 'text', id: 'publish-title', className: 'input-text text--large input-text--full-width', name: 'title', placeholder: 'Give your post a title...', onChange: this.handleInput, value: this.props.title });\n }\n }]);\n\n return PublishTitleInput;\n}(_react2.default.Component);\n\nexports.default = PublishTitleInput;\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _request = __webpack_require__(8);\n\nvar _request2 = _interopRequireDefault(_request);\n\nvar _PublishUrlMiddleDisplay = __webpack_require__(38);\n\nvar _PublishUrlMiddleDisplay2 = _interopRequireDefault(_PublishUrlMiddleDisplay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishUrlInput = function (_React$Component) {\n _inherits(PublishUrlInput, _React$Component);\n\n function PublishUrlInput(props) {\n _classCallCheck(this, PublishUrlInput);\n\n var _this = _possibleConstructorReturn(this, (PublishUrlInput.__proto__ || Object.getPrototypeOf(PublishUrlInput)).call(this, props));\n\n _this.handleInput = _this.handleInput.bind(_this);\n return _this;\n }\n\n _createClass(PublishUrlInput, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var _props = this.props,\n claim = _props.claim,\n fileName = _props.fileName;\n\n if (!claim) {\n this.setClaimName(fileName);\n }\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(_ref) {\n var claim = _ref.claim,\n fileName = _ref.fileName;\n\n // if a new file was chosen, update the claim name\n if (fileName !== this.props.fileName) {\n return this.setClaimName(fileName);\n }\n // if the claim has updated, check its availability\n if (claim !== this.props.claim) {\n this.validateClaim(claim);\n }\n }\n }, {\n key: 'handleInput',\n value: function handleInput(event) {\n var value = event.target.value;\n value = this.cleanseInput(value);\n // update the state\n this.props.onClaimChange(value);\n }\n }, {\n key: 'cleanseInput',\n value: function cleanseInput(input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n }, {\n key: 'setClaimName',\n value: function setClaimName(fileName) {\n var fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));\n var cleanClaimName = this.cleanseInput(fileNameWithoutEnding);\n this.props.onClaimChange(cleanClaimName);\n }\n }, {\n key: 'validateClaim',\n value: function validateClaim(claim) {\n var _this2 = this;\n\n if (!claim) {\n return this.props.onUrlError('Enter a url above');\n }\n (0, _request2.default)('/api/claim/availability/' + claim).then(function () {\n _this2.props.onUrlError(null);\n }).catch(function (error) {\n _this2.props.onUrlError(error.message);\n });\n }\n }, {\n key: 'render',\n value: function render() {\n var _props2 = this.props,\n claim = _props2.claim,\n loggedInChannelName = _props2.loggedInChannelName,\n loggedInChannelShortId = _props2.loggedInChannelShortId,\n publishInChannel = _props2.publishInChannel,\n selectedChannel = _props2.selectedChannel,\n urlError = _props2.urlError;\n\n return _react2.default.createElement(\n 'div',\n { className: 'column column--10 column--sml-10' },\n _react2.default.createElement(\n 'div',\n { className: 'input-text--primary span--relative' },\n _react2.default.createElement(\n 'span',\n { className: 'url-text--secondary' },\n 'spee.ch / '\n ),\n _react2.default.createElement(_PublishUrlMiddleDisplay2.default, {\n publishInChannel: publishInChannel,\n selectedChannel: selectedChannel,\n loggedInChannelName: loggedInChannelName,\n loggedInChannelShortId: loggedInChannelShortId\n }),\n _react2.default.createElement('input', { type: 'text', id: 'claim-name-input', className: 'input-text', name: 'claim', placeholder: 'your-url-here', onChange: this.handleInput, value: claim }),\n claim && !urlError && _react2.default.createElement(\n 'span',\n { id: 'input-success-claim-name', className: 'info-message--success span--absolute' },\n '\\u2713'\n ),\n urlError && _react2.default.createElement(\n 'span',\n { id: 'input-success-channel-name', className: 'info-message--failure span--absolute' },\n '\\u2716'\n )\n ),\n _react2.default.createElement(\n 'div',\n null,\n urlError ? _react2.default.createElement(\n 'p',\n { id: 'input-error-claim-name', className: 'info-message--failure' },\n urlError\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Choose a custom url'\n )\n )\n );\n }\n }]);\n\n return PublishUrlInput;\n}(_react2.default.Component);\n\nexports.default = PublishUrlInput;\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction dataURItoBlob(dataURI) {\n // convert base64/URLEncoded data component to raw binary data held in a string\n var byteString = atob(dataURI.split(',')[1]);\n // separate out the mime component\n var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n // write the bytes of the string to a typed array\n var ia = new Uint8Array(byteString.length);\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new Blob([ia], { type: mimeString });\n}\n\nvar PublishThumbnailInput = function (_React$Component) {\n _inherits(PublishThumbnailInput, _React$Component);\n\n function PublishThumbnailInput(props) {\n _classCallCheck(this, PublishThumbnailInput);\n\n var _this = _possibleConstructorReturn(this, (PublishThumbnailInput.__proto__ || Object.getPrototypeOf(PublishThumbnailInput)).call(this, props));\n\n _this.state = {\n videoSource: null,\n error: null,\n sliderMinRange: 1,\n sliderMaxRange: null,\n sliderValue: null\n };\n _this.handleVideoLoadedData = _this.handleVideoLoadedData.bind(_this);\n _this.handleSliderChange = _this.handleSliderChange.bind(_this);\n _this.createThumbnail = _this.createThumbnail.bind(_this);\n return _this;\n }\n\n _createClass(PublishThumbnailInput, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var file = this.props.file;\n\n this.setVideoSource(file);\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n // if file changes\n if (nextProps.file && nextProps.file !== this.props.file) {\n var file = nextProps.file;\n\n this.setVideoSource(file);\n };\n }\n }, {\n key: 'setVideoSource',\n value: function setVideoSource(file) {\n var _this2 = this;\n\n var previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = function () {\n var dataUri = previewReader.result;\n var blob = dataURItoBlob(dataUri);\n var videoSource = URL.createObjectURL(blob);\n _this2.setState({ videoSource: videoSource });\n };\n }\n }, {\n key: 'handleVideoLoadedData',\n value: function handleVideoLoadedData(event) {\n var duration = event.target.duration;\n var totalMinutes = Math.floor(duration / 60);\n var totalSeconds = Math.floor(duration % 60);\n // set the slider\n this.setState({\n sliderMaxRange: duration * 100,\n sliderValue: duration * 100 / 2,\n totalMinutes: totalMinutes,\n totalSeconds: totalSeconds\n });\n // update the current time of the video\n var video = document.getElementById('video-thumb-player');\n video.currentTime = duration / 2;\n }\n }, {\n key: 'handleSliderChange',\n value: function handleSliderChange(event) {\n var value = parseInt(event.target.value);\n // update the slider value\n this.setState({\n sliderValue: value\n });\n // update the current time of the video\n var video = document.getElementById('video-thumb-player');\n video.currentTime = value / 100;\n }\n }, {\n key: 'createThumbnail',\n value: function createThumbnail() {\n // take a snapshot\n var video = document.getElementById('video-thumb-player');\n var canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n var dataUrl = canvas.toDataURL();\n var blob = dataURItoBlob(dataUrl);\n var snapshot = new File([blob], 'thumbnail.png', {\n type: 'image/png'\n });\n // set the thumbnail in redux store\n if (snapshot) {\n this.props.onNewThumbnail(snapshot);\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _state = this.state,\n error = _state.error,\n videoSource = _state.videoSource,\n sliderMinRange = _state.sliderMinRange,\n sliderMaxRange = _state.sliderMaxRange,\n sliderValue = _state.sliderValue,\n totalMinutes = _state.totalMinutes,\n totalSeconds = _state.totalSeconds;\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'label',\n { className: 'label' },\n 'Thumbnail:'\n ),\n _react2.default.createElement('video', {\n id: 'video-thumb-player',\n preload: 'metadata',\n muted: true,\n style: { display: 'none' },\n playsInline: true,\n onLoadedData: this.handleVideoLoadedData,\n src: videoSource,\n onSeeked: this.createThumbnail\n }),\n sliderValue ? _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'flex-container--row flex-container--space-between-center', style: { width: '100%' } },\n _react2.default.createElement(\n 'span',\n { className: 'info-message' },\n '0\\'00\"'\n ),\n _react2.default.createElement(\n 'span',\n { className: 'info-message' },\n totalMinutes,\n '\\'',\n totalSeconds,\n '\"'\n )\n ),\n _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement('input', {\n type: 'range',\n min: sliderMinRange,\n max: sliderMaxRange,\n value: sliderValue,\n className: 'slider',\n onChange: this.handleSliderChange\n })\n )\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'loading... '\n ),\n error ? _react2.default.createElement(\n 'p',\n { className: 'info-message--failure' },\n error\n ) : _react2.default.createElement(\n 'p',\n { className: 'info-message' },\n 'Use slider to set thumbnail'\n )\n );\n }\n }]);\n\n return PublishThumbnailInput;\n}(_react2.default.Component);\n\nexports.default = PublishThumbnailInput;\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ExpandingTextArea = __webpack_require__(36);\n\nvar _ExpandingTextArea2 = _interopRequireDefault(_ExpandingTextArea);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishMetadataInputs = function (_React$Component) {\n _inherits(PublishMetadataInputs, _React$Component);\n\n function PublishMetadataInputs(props) {\n _classCallCheck(this, PublishMetadataInputs);\n\n var _this = _possibleConstructorReturn(this, (PublishMetadataInputs.__proto__ || Object.getPrototypeOf(PublishMetadataInputs)).call(this, props));\n\n _this.toggleShowInputs = _this.toggleShowInputs.bind(_this);\n _this.handleInput = _this.handleInput.bind(_this);\n _this.handleSelect = _this.handleSelect.bind(_this);\n return _this;\n }\n\n _createClass(PublishMetadataInputs, [{\n key: 'toggleShowInputs',\n value: function toggleShowInputs() {\n this.props.onToggleMetadataInputs(!this.props.showMetadataInputs);\n }\n }, {\n key: 'handleInput',\n value: function handleInput(event) {\n var target = event.target;\n var value = target.type === 'checkbox' ? target.checked : target.value;\n var name = target.name;\n this.props.onMetadataChange(name, value);\n }\n }, {\n key: 'handleSelect',\n value: function handleSelect(event) {\n var name = event.target.name;\n var selectedOption = event.target.selectedOptions[0].value;\n this.props.onMetadataChange(name, selectedOption);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(\n 'div',\n { id: 'publish-details', className: 'row row--padded row--no-top row--wide' },\n this.props.showMetadataInputs && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'row row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--med-10 align-content-top' },\n _react2.default.createElement(\n 'label',\n { htmlFor: 'publish-license', className: 'label' },\n 'Description:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7 column--sml-10' },\n _react2.default.createElement(_ExpandingTextArea2.default, {\n id: 'publish-description',\n className: 'textarea textarea--primary textarea--full-width',\n rows: 1,\n maxLength: 2000,\n style: { maxHeight: 200 },\n name: 'description',\n placeholder: 'Optional description',\n value: this.props.description,\n onChange: this.handleInput })\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3 column--med-10' },\n _react2.default.createElement(\n 'label',\n { htmlFor: 'publish-license', className: 'label' },\n 'License:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7 column--sml-10' },\n _react2.default.createElement(\n 'select',\n { type: 'text', name: 'license', id: 'publish-license', className: 'select select--primary', onChange: this.handleSelect },\n _react2.default.createElement(\n 'option',\n { value: ' ' },\n 'Unspecified'\n ),\n _react2.default.createElement(\n 'option',\n { value: 'Public Domain' },\n 'Public Domain'\n ),\n _react2.default.createElement(\n 'option',\n { value: 'Creative Commons' },\n 'Creative Commons'\n )\n )\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row row--no-top' },\n _react2.default.createElement(\n 'div',\n { className: 'column column--3' },\n _react2.default.createElement(\n 'label',\n { htmlFor: 'publish-nsfw', className: 'label' },\n 'Mature:'\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'column column--7' },\n _react2.default.createElement('input', { className: 'input-checkbox', type: 'checkbox', id: 'publish-nsfw', name: 'nsfw', value: this.props.nsfw, onChange: this.handleInput })\n )\n )\n ),\n _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: this.toggleShowInputs },\n this.props.showMetadataInputs ? 'less' : 'more'\n )\n );\n }\n }]);\n\n return PublishMetadataInputs;\n}(_react2.default.Component);\n\nexports.default = PublishMetadataInputs;\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishDisabledMessage = function (_React$Component) {\n _inherits(PublishDisabledMessage, _React$Component);\n\n function PublishDisabledMessage() {\n _classCallCheck(this, PublishDisabledMessage);\n\n return _possibleConstructorReturn(this, (PublishDisabledMessage.__proto__ || Object.getPrototypeOf(PublishDisabledMessage)).apply(this, arguments));\n }\n\n _createClass(PublishDisabledMessage, [{\n key: 'render',\n value: function render() {\n var message = this.props.message;\n console.log('this.props.message:', message);\n return _react2.default.createElement(\n 'div',\n { className: 'row dropzone--disabled row--tall flex-container--column flex-container--center-center' },\n _react2.default.createElement(\n 'p',\n { className: 'text--disabled' },\n 'Publishing is currently disabled.'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'text--disabled' },\n message\n )\n );\n }\n }]);\n\n return PublishDisabledMessage;\n}(_react2.default.Component);\n\nexports.default = PublishDisabledMessage;\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ProgressBar = __webpack_require__(10);\n\nvar _ProgressBar2 = _interopRequireDefault(_ProgressBar);\n\nvar _publish_claim_states = __webpack_require__(170);\n\nvar publishStates = _interopRequireWildcard(_publish_claim_states);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishStatus = function (_React$Component) {\n _inherits(PublishStatus, _React$Component);\n\n function PublishStatus() {\n _classCallCheck(this, PublishStatus);\n\n return _possibleConstructorReturn(this, (PublishStatus.__proto__ || Object.getPrototypeOf(PublishStatus)).apply(this, arguments));\n }\n\n _createClass(PublishStatus, [{\n key: 'render',\n value: function render() {\n var _props = this.props,\n status = _props.status,\n message = _props.message,\n clearFile = _props.clearFile;\n\n return _react2.default.createElement(\n 'div',\n { className: 'row row--tall flex-container--column flex-container--center-center' },\n status === publishStates.LOAD_START && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'File is loading to server'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'blue' },\n '0%'\n )\n ),\n status === publishStates.LOADING && _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'File is loading to server'\n ),\n _react2.default.createElement(\n 'p',\n { className: 'blue' },\n message\n )\n )\n ),\n status === publishStates.PUBLISHING && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'Upload complete. Your file is now being published on the blockchain...'\n ),\n _react2.default.createElement(_ProgressBar2.default, { size: 12 }),\n _react2.default.createElement(\n 'p',\n null,\n 'Curious what magic is happening here? ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: 'blank', href: 'https://lbry.io/faq/what-is-lbry' },\n 'Learn more.'\n )\n )\n ),\n status === publishStates.SUCCESS && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'Your publish is complete! You are being redirected to it now.'\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'If you are not automatically redirected, ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', target: '_blank', href: message },\n 'click here.'\n )\n )\n ),\n status === publishStates.FAILED && _react2.default.createElement(\n 'div',\n { className: 'row align-content-center' },\n _react2.default.createElement(\n 'p',\n null,\n 'Something went wrong...'\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(\n 'strong',\n null,\n message\n )\n ),\n _react2.default.createElement(\n 'p',\n null,\n 'For help, post the above error text in the #speech channel on the ',\n _react2.default.createElement(\n 'a',\n { className: 'link--primary', href: 'https://discord.gg/YjYbwhS', target: '_blank' },\n 'lbry discord'\n )\n ),\n _react2.default.createElement(\n 'button',\n { className: 'button--secondary', onClick: clearFile },\n 'Reset'\n )\n )\n );\n }\n }]);\n\n return PublishStatus;\n}(_react2.default.Component);\n\n;\n\nexports.default = PublishStatus;\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _Dropzone = __webpack_require__(18);\n\nvar _Dropzone2 = _interopRequireDefault(_Dropzone);\n\nvar _PublishDetails = __webpack_require__(40);\n\nvar _PublishDetails2 = _interopRequireDefault(_PublishDetails);\n\nvar _PublishStatus = __webpack_require__(46);\n\nvar _PublishStatus2 = _interopRequireDefault(_PublishStatus);\n\nvar _PublishDisabledMessage = __webpack_require__(45);\n\nvar _PublishDisabledMessage2 = _interopRequireDefault(_PublishDisabledMessage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PublishTool = function (_React$Component) {\n _inherits(PublishTool, _React$Component);\n\n function PublishTool() {\n _classCallCheck(this, PublishTool);\n\n return _possibleConstructorReturn(this, (PublishTool.__proto__ || Object.getPrototypeOf(PublishTool)).apply(this, arguments));\n }\n\n _createClass(PublishTool, [{\n key: 'render',\n value: function render() {\n if (this.props.disabled) {\n console.log('publish is disabled');\n return _react2.default.createElement(_PublishDisabledMessage2.default, null);\n } else {\n console.log('publish is not disabled');\n if (this.props.file) {\n if (this.props.status) {\n return _react2.default.createElement(_PublishStatus2.default, null);\n } else {\n return _react2.default.createElement(_PublishDetails2.default, null);\n }\n }\n return _react2.default.createElement(_Dropzone2.default, null);\n }\n }\n }]);\n\n return PublishTool;\n}(_react2.default.Component);\n\n;\n\nexports.default = PublishTool;\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"passport\");\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction MysqlConfig() {\n var _this = this;\n\n this.database = 'default';\n this.username = 'default';\n this.password = 'default';\n this.configure = function (config) {\n if (!config) {\n return console.log('No MySQL config received.');\n }\n var database = config.database,\n username = config.username,\n password = config.password;\n\n _this.database = database;\n _this.username = username;\n _this.password = password;\n };\n};\n\nmodule.exports = new MysqlConfig();\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction SlackConfig() {\n var _this = this;\n\n this.slackWebHook = 'default';\n this.slackErrorChannel = 'default';\n this.slackInfoChannel = 'default';\n this.configure = function (config) {\n if (!config) {\n return console.log('No slack config received.');\n }\n var slackWebHook = config.slackWebHook,\n slackErrorChannel = config.slackErrorChannel,\n slackInfoChannel = config.slackInfoChannel;\n\n _this.slackWebHook = slackWebHook;\n _this.slackErrorChannel = slackErrorChannel;\n _this.slackInfoChannel = slackInfoChannel;\n };\n};\n\nmodule.exports = new SlackConfig();\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"passport-local\");\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"sequelize\");\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n returnShortId: function returnShortId(claimsArray, longId) {\n var claimIndex = void 0;\n var shortId = longId.substring(0, 1); // default short id is the first letter\n var shortIdLength = 0;\n // find the index of this claim id\n claimIndex = claimsArray.findIndex(function (element) {\n return element.claimId === longId;\n });\n if (claimIndex < 0) {\n throw new Error('claim id not found in claims list');\n }\n // get an array of all claims with lower height\n var possibleMatches = claimsArray.slice(0, claimIndex);\n // remove certificates with the same prefixes until none are left.\n while (possibleMatches.length > 0) {\n shortIdLength += 1;\n shortId = longId.substring(0, shortIdLength);\n possibleMatches = possibleMatches.filter(function (element) {\n return element.claimId && element.claimId.substring(0, shortIdLength) === shortId;\n });\n }\n return shortId;\n }\n};\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar fs = __webpack_require__(98);\n\nvar _require = __webpack_require__(3),\n details = _require.details,\n publishing = _require.publishing;\n\nmodule.exports = {\n parsePublishApiRequestBody: function parsePublishApiRequestBody(_ref) {\n var name = _ref.name,\n nsfw = _ref.nsfw,\n license = _ref.license,\n title = _ref.title,\n description = _ref.description,\n thumbnail = _ref.thumbnail;\n\n // validate name\n if (!name) {\n throw new Error('no name field found in request');\n }\n var invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name);\n if (invalidNameCharacters) {\n throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and \"-\"');\n }\n // optional parameters\n nsfw = nsfw === 'true';\n license = license || null;\n title = title || null;\n description = description || null;\n thumbnail = thumbnail || null;\n // return results\n return {\n name: name,\n nsfw: nsfw,\n license: license,\n title: title,\n description: description,\n thumbnail: thumbnail\n };\n },\n parsePublishApiRequestFiles: function parsePublishApiRequestFiles(_ref2) {\n var file = _ref2.file,\n thumbnail = _ref2.thumbnail;\n\n // make sure a file was provided\n if (!file) {\n throw new Error('no file with key of [file] found in request');\n }\n if (!file.path) {\n throw new Error('no file path found');\n }\n if (!file.type) {\n throw new Error('no file type found');\n }\n if (!file.size) {\n throw new Error('no file type found');\n }\n // validate the file name\n if (/'/.test(file.name)) {\n throw new Error('apostrophes are not allowed in the file name');\n }\n // validate the file\n module.exports.validateFileTypeAndSize(file);\n // return results\n return {\n fileName: file.name,\n filePath: file.path,\n fileType: file.type,\n thumbnailFileName: thumbnail ? thumbnail.name : null,\n thumbnailFilePath: thumbnail ? thumbnail.path : null,\n thumbnailFileType: thumbnail ? thumbnail.type : null\n };\n },\n validateFileTypeAndSize: function validateFileTypeAndSize(file) {\n // check file type and size\n switch (file.type) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n if (file.size > 10000000) {\n logger.debug('publish > file validation > .jpeg/.jpg/.png was too big');\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .gif was too big');\n throw new Error('Sorry, .gifs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .mp4 was too big');\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n logger.debug('publish > file validation > unrecognized file type');\n throw new Error('The ' + file.type + ' content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n return file;\n },\n createBasicPublishParams: function createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail) {\n logger.debug('Creating Publish Parameters');\n // provide defaults for title\n if (title === null || title.trim() === '') {\n title = name;\n }\n // provide default for description\n if (description === null || description.trim() === '') {\n description = '';\n }\n // provide default for license\n if (license === null || license.trim() === '') {\n license = ' '; // default to empty string\n }\n // create the publish params\n var publishParams = {\n name: name,\n file_path: filePath,\n bid: 0.01,\n metadata: {\n description: description,\n title: title,\n author: details.title,\n language: 'en',\n license: license,\n nsfw: nsfw\n },\n claim_address: publishing.primaryClaimAddress\n };\n // add thumbnail to channel if video\n if (thumbnail) {\n publishParams['metadata']['thumbnail'] = thumbnail;\n }\n return publishParams;\n },\n createThumbnailPublishParams: function createThumbnailPublishParams(thumbnailFilePath, claimName, license, nsfw) {\n if (!thumbnailFilePath) {\n return;\n }\n logger.debug('Creating Thumbnail Publish Parameters');\n // create the publish params\n return {\n name: claimName + '-thumb',\n file_path: thumbnailFilePath,\n bid: 0.01,\n metadata: {\n title: claimName + ' thumbnail',\n description: 'a thumbnail for ' + claimName,\n author: details.title,\n language: 'en',\n license: license,\n nsfw: nsfw\n },\n claim_address: publishing.primaryClaimAddress,\n channel_name: publishing.thumbnailChannel,\n channel_id: publishing.thumbnailChannelId\n };\n },\n deleteTemporaryFile: function deleteTemporaryFile(filePath) {\n fs.unlink(filePath, function (err) {\n if (err) {\n logger.error('error deleting temporary file ' + filePath);\n throw err;\n }\n logger.debug('successfully deleted ' + filePath);\n });\n },\n addGetResultsToFileData: function addGetResultsToFileData(fileInfo, getResult) {\n fileInfo.fileName = getResult.file_name;\n fileInfo.filePath = getResult.download_path;\n return fileInfo;\n },\n createFileData: function createFileData(_ref3) {\n var name = _ref3.name,\n claimId = _ref3.claimId,\n outpoint = _ref3.outpoint,\n height = _ref3.height,\n address = _ref3.address,\n nsfw = _ref3.nsfw,\n contentType = _ref3.contentType;\n\n return {\n name: name,\n claimId: claimId,\n outpoint: outpoint,\n height: height,\n address: address,\n fileName: '',\n filePath: '',\n fileType: contentType,\n nsfw: nsfw\n };\n }\n};\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"fs\");\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n handleErrorResponse: function handleErrorResponse(originalUrl, ip, error, res) {\n logger.error('Error on ' + originalUrl, module.exports.useObjectPropertiesIfNoKeys(error));\n\n var _module$exports$retur = module.exports.returnErrorMessageAndStatus(error),\n _module$exports$retur2 = _slicedToArray(_module$exports$retur, 2),\n status = _module$exports$retur2[0],\n message = _module$exports$retur2[1];\n\n res.status(status).json(module.exports.createErrorResponsePayload(status, message));\n },\n returnErrorMessageAndStatus: function returnErrorMessageAndStatus(error) {\n var status = void 0,\n message = void 0;\n // check for daemon being turned off\n if (error.code === 'ECONNREFUSED') {\n status = 503;\n message = 'Connection refused. The daemon may not be running.';\n // fallback for everything else\n } else {\n status = 400;\n if (error.message) {\n message = error.message;\n } else {\n message = error;\n };\n };\n return [status, message];\n },\n useObjectPropertiesIfNoKeys: function useObjectPropertiesIfNoKeys(err) {\n if (Object.keys(err).length === 0) {\n var newErrorObject = {};\n Object.getOwnPropertyNames(err).forEach(function (key) {\n newErrorObject[key] = err[key];\n });\n return newErrorObject;\n }\n return err;\n },\n createErrorResponsePayload: function createErrorResponsePayload(status, message) {\n return {\n status: status,\n success: false,\n message: message\n };\n }\n};\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar db = __webpack_require__(9);\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(145),\n returnPaginatedChannelClaims = _require.returnPaginatedChannelClaims;\n\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\nvar NO_FILE = 'NO_FILE';\n\nmodule.exports = {\n getClaimId: function getClaimId(channelName, channelClaimId, name, claimId) {\n if (channelName) {\n return module.exports.getClaimIdByChannel(channelName, channelClaimId, name);\n } else {\n return module.exports.getClaimIdByClaim(name, claimId);\n }\n },\n getClaimIdByClaim: function getClaimIdByClaim(claimName, claimId) {\n logger.debug('getClaimIdByClaim(' + claimName + ', ' + claimId + ')');\n return new Promise(function (resolve, reject) {\n db.Claim.getLongClaimId(claimName, claimId).then(function (longClaimId) {\n if (!longClaimId) {\n resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getClaimIdByChannel: function getClaimIdByChannel(channelName, channelClaimId, claimName) {\n logger.debug('getClaimIdByChannel(' + channelName + ', ' + channelClaimId + ', ' + claimName + ')');\n return new Promise(function (resolve, reject) {\n db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id\n .then(function (longChannelId) {\n if (!longChannelId) {\n return [null, null];\n }\n return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n longChannelId = _ref2[0],\n longClaimId = _ref2[1];\n\n if (!longChannelId) {\n return resolve(NO_CHANNEL);\n }\n if (!longClaimId) {\n return resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getChannelData: function getChannelData(channelName, channelClaimId, page) {\n return new Promise(function (resolve, reject) {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]);\n }).then(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n longChannelClaimId = _ref4[0],\n shortChannelClaimId = _ref4[1];\n\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. return all the channel information\n resolve({\n channelName: channelName,\n longChannelClaimId: longChannelClaimId,\n shortChannelClaimId: shortChannelClaimId\n });\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getChannelClaims: function getChannelClaims(channelName, channelClaimId, page) {\n return new Promise(function (resolve, reject) {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId).then(function (longChannelClaimId) {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]);\n }).then(function (_ref5) {\n var _ref6 = _slicedToArray(_ref5, 2),\n longChannelClaimId = _ref6[0],\n channelClaimsArray = _ref6[1];\n\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. format the data for the view, including pagination\n var paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page);\n // 4. return all the channel information and contents\n resolve(paginatedChannelViewData);\n }).catch(function (error) {\n reject(error);\n });\n });\n },\n getLocalFileRecord: function getLocalFileRecord(claimId, name) {\n return db.File.findOne({ where: { claimId: claimId, name: name } }).then(function (file) {\n if (!file) {\n return NO_FILE;\n }\n return file.dataValues;\n });\n }\n};\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _server = __webpack_require__(102);\n\nvar _redux = __webpack_require__(57);\n\nvar _reducers = __webpack_require__(103);\n\nvar _reducers2 = _interopRequireDefault(_reducers);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _GAListener = __webpack_require__(13);\n\nvar _GAListener2 = _interopRequireDefault(_GAListener);\n\nvar _app = __webpack_require__(108);\n\nvar _app2 = _interopRequireDefault(_app);\n\nvar _renderFullPage = __webpack_require__(113);\n\nvar _renderFullPage2 = _interopRequireDefault(_renderFullPage);\n\nvar _reactHelmet = __webpack_require__(48);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = function (req, res) {\n var context = {};\n\n // create a new Redux store instance\n var store = (0, _redux.createStore)(_reducers2.default);\n\n // render component to a string\n var html = (0, _server.renderToString)(_react2.default.createElement(\n _reactRedux.Provider,\n { store: store },\n _react2.default.createElement(\n _reactRouterDom.StaticRouter,\n { location: req.url, context: context },\n _react2.default.createElement(\n _GAListener2.default,\n null,\n _react2.default.createElement(_app2.default, null)\n )\n )\n ));\n\n // get head tags from helmet\n var helmet = _reactHelmet2.default.renderStatic();\n\n // check for a redirect\n if (context.url) {\n // Somewhere a `` was rendered\n return res.redirect(301, context.url);\n } else {}\n // we're good, send the response\n\n\n // get the initial state from our Redux store\n var preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send((0, _renderFullPage2.default)(helmet, html, preloadedState));\n};\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-dom/server\");\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _redux = __webpack_require__(57);\n\nvar _publish = __webpack_require__(147);\n\nvar _publish2 = _interopRequireDefault(_publish);\n\nvar _channel = __webpack_require__(148);\n\nvar _channel2 = _interopRequireDefault(_channel);\n\nvar _show = __webpack_require__(149);\n\nvar _show2 = _interopRequireDefault(_show);\n\nvar _site = __webpack_require__(150);\n\nvar _site2 = _interopRequireDefault(_site);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = (0, _redux.combineReducers)({\n channel: _channel2.default,\n publish: _publish2.default,\n show: _show2.default,\n site: _site2.default\n});\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar FILE_SELECTED = exports.FILE_SELECTED = 'FILE_SELECTED';\nvar FILE_CLEAR = exports.FILE_CLEAR = 'FILE_CLEAR';\nvar METADATA_UPDATE = exports.METADATA_UPDATE = 'METADATA_UPDATE';\nvar CLAIM_UPDATE = exports.CLAIM_UPDATE = 'CLAIM_UPDATE';\nvar SET_PUBLISH_IN_CHANNEL = exports.SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL';\nvar PUBLISH_STATUS_UPDATE = exports.PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE';\nvar ERROR_UPDATE = exports.ERROR_UPDATE = 'ERROR_UPDATE';\nvar SELECTED_CHANNEL_UPDATE = exports.SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE';\nvar TOGGLE_METADATA_INPUTS = exports.TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS';\nvar THUMBNAIL_NEW = exports.THUMBNAIL_NEW = 'THUMBNAIL_NEW';\nvar PUBLISH_START = exports.PUBLISH_START = 'PUBLISH_START';\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar LOGIN = exports.LOGIN = 'Existing';\nvar CREATE = exports.CREATE = 'New';\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar CHANNEL_UPDATE = exports.CHANNEL_UPDATE = 'CHANNEL_UPDATE';\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar LOCAL_CHECK = exports.LOCAL_CHECK = 'LOCAL_CHECK';\nvar UNAVAILABLE = exports.UNAVAILABLE = 'UNAVAILABLE';\nvar ERROR = exports.ERROR = 'ERROR';\nvar AVAILABLE = exports.AVAILABLE = 'AVAILABLE';\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _dynamicImport = __webpack_require__(58);\n\nvar _AboutPage = __webpack_require__(20);\n\nvar _AboutPage2 = _interopRequireDefault(_AboutPage);\n\nvar _LoginPage = __webpack_require__(23);\n\nvar _LoginPage2 = _interopRequireDefault(_LoginPage);\n\nvar _ShowPage = __webpack_require__(26);\n\nvar _ShowPage2 = _interopRequireDefault(_ShowPage);\n\nvar _FourOhFourPage = __webpack_require__(35);\n\nvar _FourOhFourPage2 = _interopRequireDefault(_FourOhFourPage);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar HomePage = (0, _dynamicImport.dynamicImport)('pages/HomePage'); // or use the provided local homepage\n\nvar App = function App() {\n return _react2.default.createElement(\n _reactRouterDom.Switch,\n null,\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/', component: HomePage }),\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/about', component: _AboutPage2.default }),\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/login', component: _LoginPage2.default }),\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:identifier/:claim', component: _ShowPage2.default }),\n _react2.default.createElement(_reactRouterDom.Route, { exact: true, path: '/:claim', component: _ShowPage2.default }),\n _react2.default.createElement(_reactRouterDom.Route, { component: _FourOhFourPage2.default })\n );\n};\n\nexports.default = App;\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./canonicalLink\": 59,\n\t\"./canonicalLink.js\": 59,\n\t\"./dynamicImport\": 58,\n\t\"./dynamicImport.js\": 58,\n\t\"./file\": 60,\n\t\"./file.js\": 60,\n\t\"./lbryUri\": 61,\n\t\"./lbryUri.js\": 61,\n\t\"./metaTags\": 62,\n\t\"./metaTags.js\": 62,\n\t\"./pageTitle\": 63,\n\t\"./pageTitle.js\": 63,\n\t\"./publish\": 110,\n\t\"./publish.js\": 110,\n\t\"./request\": 8,\n\t\"./request.js\": 8,\n\t\"./validate\": 111,\n\t\"./validate.js\": 111\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 109;\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar createPublishMetadata = exports.createPublishMetadata = function createPublishMetadata(claim, _ref, _ref2, publishInChannel, selectedChannel) {\n var type = _ref.type;\n var title = _ref2.title,\n description = _ref2.description,\n license = _ref2.license,\n nsfw = _ref2.nsfw;\n\n var metadata = {\n name: claim,\n title: title,\n description: description,\n license: license,\n nsfw: nsfw,\n type: type\n };\n if (publishInChannel) {\n metadata['channelName'] = selectedChannel;\n }\n return metadata;\n};\n\nvar createPublishFormData = exports.createPublishFormData = function createPublishFormData(file, thumbnail, metadata) {\n var fd = new FormData();\n // append file\n fd.append('file', file);\n // append thumbnail\n if (thumbnail) {\n fd.append('thumbnail', thumbnail);\n }\n // append metadata\n for (var key in metadata) {\n if (metadata.hasOwnProperty(key)) {\n fd.append(key, metadata[key]);\n }\n }\n return fd;\n};\n\nvar createThumbnailUrl = exports.createThumbnailUrl = function createThumbnailUrl(channel, channelId, claim, host) {\n return host + '/' + channel + ':' + channelId + '/' + claim + '-thumb.png';\n};\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar validateChannelSelection = exports.validateChannelSelection = function validateChannelSelection(publishInChannel, selectedChannel, loggedInChannel) {\n if (publishInChannel && selectedChannel !== loggedInChannel.name) {\n throw new Error('Log in to a channel or select Anonymous');\n }\n};\n\nvar validatePublishParams = exports.validatePublishParams = function validatePublishParams(file, claim, urlError) {\n if (!file) {\n throw new Error('Please choose a file');\n }\n if (!claim) {\n throw new Error('Please enter a URL');\n }\n if (urlError) {\n throw new Error('Fix the url');\n }\n};\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar CHANNEL = exports.CHANNEL = 'CHANNEL';\nvar ASSET_LITE = exports.ASSET_LITE = 'ASSET_LITE';\nvar ASSET_DETAILS = exports.ASSET_DETAILS = 'ASSET_DETAILS';\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (helmet, html, preloadedState) {\n // take the html and preloadedState and return the full page\n return '\\n \\n \\n \\n \\n \\n \\n \\n ' + helmet.title.toString() + '\\n ' + helmet.meta.toString() + '\\n ' + helmet.link.toString() + '\\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n
' + html + '
\\n
\\n \\n \\n \\n \\n ';\n};\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar selectSiteState = exports.selectSiteState = function selectSiteState(state) {\n return state.site;\n};\n\nvar selectSiteHost = exports.selectSiteHost = function selectSiteHost(state) {\n return state.site.host;\n};\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(116);\n__webpack_require__(117);\nmodule.exports = __webpack_require__(118);\n\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"babel-polyfill\");\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"whatwg-fetch\");\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Server = __webpack_require__(119);\nvar Components = __webpack_require__(50);\nvar Containers = __webpack_require__(52);\nvar Pages = __webpack_require__(53);\n\nvar _exports = {\n Server: Server,\n Components: Components,\n Containers: Containers,\n Pages: Pages\n};\n\nmodule.exports = _exports;\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// app dependencies\nvar express = __webpack_require__(120);\nvar bodyParser = __webpack_require__(121);\nvar expressHandlebars = __webpack_require__(122);\nvar Handlebars = __webpack_require__(123);\nvar helmet = __webpack_require__(124);\nvar passport = __webpack_require__(91);\n\nvar _require = __webpack_require__(125),\n serializeSpeechUser = _require.serializeSpeechUser,\n deserializeSpeechUser = _require.deserializeSpeechUser;\n\nvar cookieSession = __webpack_require__(126);\nvar http = __webpack_require__(127);\n// logging dependencies\nvar logger = __webpack_require__(2);\n\nfunction Server() {\n var _this = this;\n\n this.configureMysql = function (mysqlConfig) {\n __webpack_require__(92).configure(mysqlConfig);\n };\n this.configureSite = function (siteConfig) {\n __webpack_require__(3).configure(siteConfig);\n _this.sessionKey = siteConfig.auth.sessionKey;\n _this.PORT = siteConfig.details.port;\n };\n this.configureSlack = function (slackConfig) {\n __webpack_require__(93).configure(slackConfig);\n };\n this.createApp = function () {\n // create an Express application\n var app = express();\n\n // trust the proxy to get ip address for us\n app.enable('trust proxy');\n\n // add middleware\n app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties\n app.use(express.static(__dirname + '/public')); // 'express.static' to serve static files from public directory\n app.use(bodyParser.json()); // 'body parser' for parsing application/json\n app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded\n app.use(function (req, res, next) {\n // custom logging middleware to log all incoming http requests\n logger.verbose('Request on ' + req.originalUrl + ' from ' + req.ip);\n next();\n });\n\n // configure passport\n passport.serializeUser(serializeSpeechUser);\n passport.deserializeUser(deserializeSpeechUser);\n var localSignupStrategy = __webpack_require__(128);\n var localLoginStrategy = __webpack_require__(139);\n passport.use('local-signup', localSignupStrategy);\n passport.use('local-login', localLoginStrategy);\n // initialize passport\n app.use(cookieSession({\n name: 'session',\n keys: [_this.sessionKey],\n maxAge: 24 * 60 * 60 * 1000 // i.e. 24 hours\n }));\n app.use(passport.initialize());\n app.use(passport.session());\n\n // configure handlebars & register it with express app\n var hbs = expressHandlebars.create({\n defaultLayout: 'embed',\n handlebars: Handlebars\n });\n app.engine('handlebars', hbs.engine);\n app.set('view engine', 'handlebars');\n\n // set the routes on the app\n __webpack_require__(140)(app);\n __webpack_require__(141)(app);\n __webpack_require__(146)(app);\n __webpack_require__(153)(app);\n __webpack_require__(163)(app);\n\n _this.app = app;\n };\n this.initialize = function () {\n __webpack_require__(164)(logger);\n __webpack_require__(166)(logger);\n _this.createApp();\n _this.server = http.Server(_this.app);\n };\n this.start = function () {\n var db = __webpack_require__(9);\n // sync sequelize\n db.sequelize.sync()\n // start the server\n .then(function () {\n _this.server.listen(_this.PORT, function () {\n logger.info('Server is listening on PORT ' + _this.PORT);\n });\n }).catch(function (error) {\n logger.error('Startup Error:', error);\n });\n };\n};\n\nmodule.exports = Server;\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"express\");\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"body-parser\");\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"express-handlebars\");\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"handlebars\");\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"helmet\");\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n serializeSpeechUser: function serializeSpeechUser(user, done) {\n // returns user data to be serialized into session\n logger.debug('serializing user');\n done(null, user);\n },\n deserializeSpeechUser: function deserializeSpeechUser(user, done) {\n // deserializes session and populates additional info to req.user\n logger.debug('deserializing user');\n done(null, user);\n }\n};\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"cookie-session\");\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"http\");\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar PassportLocalStrategy = __webpack_require__(94).Strategy;\nvar lbryApi = __webpack_require__(55);\nvar logger = __webpack_require__(2);\nvar db = __webpack_require__(9);\n\nmodule.exports = new PassportLocalStrategy({\n usernameField: 'username',\n passwordField: 'password'\n}, function (username, password, done) {\n logger.verbose('new channel signup request. user: ' + username + ' pass: ' + password + ' .');\n var userInfo = {};\n // server-side validaton of inputs (username, password)\n\n // create the channel and retrieve the metadata\n return lbryApi.createChannel('@' + username).then(function (tx) {\n // create user record\n var userData = {\n userName: username,\n password: password\n };\n logger.verbose('userData >', userData);\n // create user record\n var channelData = {\n channelName: '@' + username,\n channelClaimId: tx.claim_id\n };\n logger.verbose('channelData >', channelData);\n // create certificate record\n var certificateData = {\n claimId: tx.claim_id,\n name: '@' + username\n // address,\n };\n logger.verbose('certificateData >', certificateData);\n // save user and certificate to db\n return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]);\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 3),\n newUser = _ref2[0],\n newChannel = _ref2[1],\n newCertificate = _ref2[2];\n\n logger.verbose('user and certificate successfully created');\n // store the relevant newUser info to be passed back for req.User\n userInfo['id'] = newUser.id;\n userInfo['userName'] = newUser.userName;\n userInfo['channelName'] = newChannel.channelName;\n userInfo['channelClaimId'] = newChannel.channelClaimId;\n // associate the instances\n return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]);\n }).then(function () {\n logger.verbose('user and certificate successfully associated');\n return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName);\n }).then(function (shortChannelId) {\n userInfo['shortChannelId'] = shortChannelId;\n return done(null, userInfo);\n }).catch(function (error) {\n logger.error('signup error', error);\n return done(error);\n });\n});\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"axios\");\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar lbryConfig = {\n api: {\n apiHost: 'localhost',\n apiPort: '5279'\n }\n};\n\nmodule.exports = lbryConfig;\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"universal-analytics\");\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(96),\n returnShortId = _require.returnShortId;\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n INTEGER = _ref.INTEGER,\n TEXT = _ref.TEXT,\n DECIMAL = _ref.DECIMAL;\n\n var Certificate = sequelize.define('Certificate', {\n address: {\n type: STRING,\n default: null\n },\n amount: {\n type: DECIMAL(19, 8),\n default: null\n },\n claimId: {\n type: STRING,\n default: null\n },\n claimSequence: {\n type: INTEGER,\n default: null\n },\n decodedClaim: {\n type: BOOLEAN,\n default: null\n },\n depth: {\n type: INTEGER,\n default: null\n },\n effectiveAmount: {\n type: DECIMAL(19, 8),\n default: null\n },\n hasSignature: {\n type: BOOLEAN,\n default: null\n },\n height: {\n type: INTEGER,\n default: null\n },\n hex: {\n type: TEXT('long'),\n default: null\n },\n name: {\n type: STRING,\n default: null\n },\n nout: {\n type: INTEGER,\n default: null\n },\n txid: {\n type: STRING,\n default: null\n },\n validAtHeight: {\n type: INTEGER,\n default: null\n },\n outpoint: {\n type: STRING,\n default: null\n },\n valueVersion: {\n type: STRING,\n default: null\n },\n claimType: {\n type: STRING,\n default: null\n },\n certificateVersion: {\n type: STRING,\n default: null\n },\n keyType: {\n type: STRING,\n default: null\n },\n publicKey: {\n type: TEXT('long'),\n default: null\n }\n }, {\n freezeTableName: true\n });\n\n Certificate.associate = function (db) {\n Certificate.belongsTo(db.Channel, {\n foreignKey: {\n allowNull: true\n }\n });\n };\n\n Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) {\n var _this = this;\n\n logger.debug('getShortChannelIdFromLongChannelId ' + channelName + ':' + longChannelId);\n return new Promise(function (resolve, reject) {\n _this.findAll({\n where: { name: channelName },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n throw new Error('No channel(s) found with that channel name');\n default:\n return resolve(returnShortId(result, longChannelId));\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) {\n var _this2 = this;\n\n logger.debug('getLongChannelIdFromShortChannelId(' + channelName + ', ' + channelClaimId + ')');\n return new Promise(function (resolve, reject) {\n _this2.findAll({\n where: {\n name: channelName,\n claimId: {\n $like: channelClaimId + '%'\n }\n },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n // note results must be sorted\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromChannelName = function (channelName) {\n var _this3 = this;\n\n logger.debug('getLongChannelIdFromChannelName(' + channelName + ')');\n return new Promise(function (resolve, reject) {\n _this3.findAll({\n where: { name: channelName },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.validateLongChannelId = function (name, claimId) {\n var _this4 = this;\n\n logger.debug('validateLongChannelId(' + name + ', ' + claimId + ')');\n return new Promise(function (resolve, reject) {\n _this4.findOne({\n where: { name: name, claimId: claimId }\n }).then(function (result) {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelId = function (channelName, channelClaimId) {\n logger.debug('getLongChannelId(' + channelName + ', ' + channelClaimId + ')');\n if (channelClaimId && channelClaimId.length === 40) {\n // if a full channel id is provided\n return this.validateLongChannelId(channelName, channelClaimId);\n } else if (channelClaimId && channelClaimId.length < 40) {\n // if a short channel id is provided\n return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId);\n } else {\n return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided\n }\n };\n\n return Certificate;\n};\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING;\n\n var Channel = sequelize.define('Channel', {\n channelName: {\n type: STRING,\n allowNull: false\n },\n channelClaimId: {\n type: STRING,\n allowNull: false\n }\n }, {\n freezeTableName: true\n });\n\n Channel.associate = function (db) {\n Channel.belongsTo(db.User);\n Channel.hasOne(db.Certificate);\n };\n\n return Channel;\n};\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(96),\n returnShortId = _require.returnShortId;\n\nvar _require2 = __webpack_require__(3),\n defaultThumbnail = _require2.assetDefaults.thumbnail,\n host = _require2.details.host;\n\nfunction determineFileExtensionFromContentType(contentType) {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n return 'jpeg';\n case 'image/png':\n return 'png';\n case 'image/gif':\n return 'gif';\n case 'video/mp4':\n return 'mp4';\n default:\n logger.debug('setting unknown file type as file extension jpeg');\n return 'jpeg';\n }\n};\n\nfunction determineThumbnail(storedThumbnail, defaultThumbnail) {\n if (storedThumbnail === '') {\n return defaultThumbnail;\n }\n return storedThumbnail;\n};\n\nfunction prepareClaimData(claim) {\n // logger.debug('preparing claim data based on resolved data:', claim);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['host'] = host;\n return claim;\n};\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n INTEGER = _ref.INTEGER,\n TEXT = _ref.TEXT,\n DECIMAL = _ref.DECIMAL;\n\n var Claim = sequelize.define('Claim', {\n address: {\n type: STRING,\n default: null\n },\n amount: {\n type: DECIMAL(19, 8),\n default: null\n },\n claimId: {\n type: STRING,\n default: null\n },\n claimSequence: {\n type: INTEGER,\n default: null\n },\n decodedClaim: {\n type: BOOLEAN,\n default: null\n },\n depth: {\n type: INTEGER,\n default: null\n },\n effectiveAmount: {\n type: DECIMAL(19, 8),\n default: null\n },\n hasSignature: {\n type: BOOLEAN,\n default: null\n },\n height: {\n type: INTEGER,\n default: null\n },\n hex: {\n type: TEXT('long'),\n default: null\n },\n name: {\n type: STRING,\n default: null\n },\n nout: {\n type: INTEGER,\n default: null\n },\n txid: {\n type: STRING,\n default: null\n },\n validAtHeight: {\n type: INTEGER,\n default: null\n },\n outpoint: {\n type: STRING,\n default: null\n },\n claimType: {\n type: STRING,\n default: null\n },\n certificateId: {\n type: STRING,\n default: null\n },\n author: {\n type: STRING,\n default: null\n },\n description: {\n type: TEXT('long'),\n default: null\n },\n language: {\n type: STRING,\n default: null\n },\n license: {\n type: STRING,\n default: null\n },\n licenseUrl: {\n type: STRING,\n default: null\n },\n nsfw: {\n type: BOOLEAN,\n default: null\n },\n preview: {\n type: STRING,\n default: null\n },\n thumbnail: {\n type: STRING,\n default: null\n },\n title: {\n type: STRING,\n default: null\n },\n metadataVersion: {\n type: STRING,\n default: null\n },\n contentType: {\n type: STRING,\n default: null\n },\n source: {\n type: STRING,\n default: null\n },\n sourceType: {\n type: STRING,\n default: null\n },\n sourceVersion: {\n type: STRING,\n default: null\n },\n streamVersion: {\n type: STRING,\n default: null\n },\n valueVersion: {\n type: STRING,\n default: null\n },\n channelName: {\n type: STRING,\n allowNull: true,\n default: null\n }\n }, {\n freezeTableName: true\n });\n\n Claim.associate = function (db) {\n Claim.belongsTo(db.File, {\n foreignKey: {\n allowNull: true\n }\n });\n };\n\n Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) {\n var _this = this;\n\n logger.debug('Claim.getShortClaimIdFromLongClaimId for ' + claimName + '#' + claimId);\n return new Promise(function (resolve, reject) {\n _this.findAll({\n where: { name: claimName },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n throw new Error('No claim(s) found with that claim name');\n default:\n resolve(returnShortId(result, claimId));\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getAllChannelClaims = function (channelClaimId) {\n var _this2 = this;\n\n logger.debug('Claim.getAllChannelClaims for ' + channelClaimId);\n return new Promise(function (resolve, reject) {\n _this2.findAll({\n where: { certificateId: channelClaimId },\n order: [['height', 'ASC']],\n raw: true // returns an array of only data, not an array of instances\n }).then(function (channelClaimsArray) {\n // logger.debug('channelclaimsarray length:', channelClaimsArray.length);\n switch (channelClaimsArray.length) {\n case 0:\n return resolve(null);\n default:\n channelClaimsArray.forEach(function (claim) {\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n return claim;\n });\n return resolve(channelClaimsArray);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) {\n var _this3 = this;\n\n logger.debug('finding claim id for claim ' + claimName + ' from channel ' + channelClaimId);\n return new Promise(function (resolve, reject) {\n _this3.findAll({\n where: { name: claimName, certificateId: channelClaimId },\n order: [['id', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(result[0].claimId);\n default:\n logger.error(result.length + ' records found for \"' + claimName + '\" in channel \"' + channelClaimId + '\"');\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimIdFromShortClaimId = function (name, shortId) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4.findAll({\n where: {\n name: name,\n claimId: {\n $like: shortId + '%'\n } },\n order: [['height', 'ASC']]\n }).then(function (result) {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n // note results must be sorted\n return resolve(result[0].claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getTopFreeClaimIdByClaimName = function (name) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _this5.findAll({\n where: { name: name },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']] // note: maybe height and effective amount need to switch?\n }).then(function (result) {\n logger.debug('length of result', result.length);\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].dataValues.claimId);\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.validateLongClaimId = function (name, claimId) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n _this6.findOne({\n where: { name: name, claimId: claimId }\n }).then(function (result) {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimId = function (claimName, claimId) {\n logger.debug('getLongClaimId(' + claimName + ', ' + claimId + ')');\n if (claimId && claimId.length === 40) {\n // if a full claim id is provided\n return this.validateLongClaimId(claimName, claimId);\n } else if (claimId && claimId.length < 40) {\n return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided\n } else {\n return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided\n }\n };\n\n Claim.resolveClaim = function (name, claimId) {\n var _this7 = this;\n\n logger.debug('Claim.resolveClaim: ' + name + ' ' + claimId);\n return new Promise(function (resolve, reject) {\n _this7.findAll({\n where: { name: name, claimId: claimId }\n }).then(function (claimArray) {\n switch (claimArray.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(prepareClaimData(claimArray[0].dataValues));\n default:\n logger.error('more than one record matches ' + name + '#' + claimId + ' in db.Claim');\n return resolve(prepareClaimData(claimArray[0].dataValues));\n }\n }).catch(function (error) {\n reject(error);\n });\n });\n };\n\n return Claim;\n};\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n INTEGER = _ref.INTEGER;\n\n var File = sequelize.define('File', {\n name: {\n type: STRING,\n allowNull: false\n },\n claimId: {\n type: STRING,\n allowNull: false\n },\n address: {\n type: STRING,\n allowNull: false\n },\n outpoint: {\n type: STRING,\n allowNull: false\n },\n height: {\n type: INTEGER,\n allowNull: false,\n default: 0\n },\n fileName: {\n type: STRING,\n allowNull: false\n },\n filePath: {\n type: STRING,\n allowNull: false\n },\n fileType: {\n type: STRING\n },\n nsfw: {\n type: BOOLEAN,\n allowNull: false,\n defaultValue: false\n },\n trendingEligible: {\n type: BOOLEAN,\n allowNull: false,\n defaultValue: true\n }\n }, {\n freezeTableName: true\n });\n\n File.associate = function (db) {\n File.hasMany(db.Request);\n File.hasOne(db.Claim);\n };\n\n File.getRecentClaims = function () {\n return this.findAll({\n where: { nsfw: false, trendingEligible: true },\n order: [['createdAt', 'DESC']],\n limit: 25\n });\n };\n\n return File;\n};\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING,\n BOOLEAN = _ref.BOOLEAN,\n TEXT = _ref.TEXT;\n\n var Request = sequelize.define('Request', {\n action: {\n type: STRING,\n allowNull: false\n },\n url: {\n type: STRING,\n allowNull: false\n },\n ipAddress: {\n type: STRING,\n allowNull: true\n },\n result: {\n type: TEXT('long'),\n allowNull: true,\n default: null\n }\n }, {\n freezeTableName: true\n });\n\n Request.associate = function (db) {\n Request.belongsTo(db.File, {\n foreignKey: {\n allowNull: true\n }\n });\n };\n\n return Request;\n};\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar bcrypt = __webpack_require__(138);\nvar logger = __webpack_require__(2);\n\nmodule.exports = function (sequelize, _ref) {\n var STRING = _ref.STRING;\n\n var User = sequelize.define('User', {\n userName: {\n type: STRING,\n allowNull: false\n },\n password: {\n type: STRING,\n allowNull: false\n }\n }, {\n freezeTableName: true\n });\n\n User.associate = function (db) {\n User.hasOne(db.Channel);\n };\n\n User.prototype.comparePassword = function (password) {\n return bcrypt.compare(password, this.password);\n };\n\n User.prototype.changePassword = function (newPassword) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n // generate a salt string to use for hashing\n bcrypt.genSalt(function (saltError, salt) {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(newPassword, salt, function (hashError, hash) {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the current password with the new hash\n _this.update({ password: hash }).then(function () {\n resolve();\n }).catch(function (error) {\n reject(error);\n });\n });\n });\n });\n };\n\n // pre-save hook method to hash the user's password before the user's info is saved to the db.\n User.hook('beforeCreate', function (user, options) {\n logger.debug('User.beforeCreate hook...');\n return new Promise(function (resolve, reject) {\n // generate a salt string to use for hashing\n bcrypt.genSalt(function (saltError, salt) {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(user.password, salt, function (hashError, hash) {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the password string with the hash password value\n user.password = hash;\n resolve();\n });\n });\n });\n });\n\n return User;\n};\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"bcrypt\");\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar PassportLocalStrategy = __webpack_require__(94).Strategy;\nvar logger = __webpack_require__(2);\nvar db = __webpack_require__(9);\n\nvar returnUserAndChannelInfo = function returnUserAndChannelInfo(userInstance) {\n return new Promise(function (resolve, reject) {\n var userInfo = {};\n userInfo['id'] = userInstance.id;\n userInfo['userName'] = userInstance.userName;\n userInstance.getChannel().then(function (_ref) {\n var channelName = _ref.channelName,\n channelClaimId = _ref.channelClaimId;\n\n userInfo['channelName'] = channelName;\n userInfo['channelClaimId'] = channelClaimId;\n return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName);\n }).then(function (shortChannelId) {\n userInfo['shortChannelId'] = shortChannelId;\n resolve(userInfo);\n }).catch(function (error) {\n reject(error);\n });\n });\n};\n\nmodule.exports = new PassportLocalStrategy({\n usernameField: 'username',\n passwordField: 'password'\n}, function (username, password, done) {\n return db.User.findOne({\n where: { userName: username }\n }).then(function (user) {\n if (!user) {\n logger.debug('no user found');\n return done(null, false, { message: 'Incorrect username or password' });\n }\n return user.comparePassword(password).then(function (isMatch) {\n if (!isMatch) {\n logger.debug('incorrect password');\n return done(null, false, { message: 'Incorrect username or password' });\n }\n logger.debug('Password was a match, returning User');\n return returnUserAndChannelInfo(user).then(function (userInfo) {\n return done(null, userInfo);\n }).catch(function (error) {\n return error;\n });\n }).catch(function (error) {\n return error;\n });\n }).catch(function (error) {\n return done(error);\n });\n});\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\nvar passport = __webpack_require__(91);\n\nmodule.exports = function (app) {\n // route for sign up\n app.post('/signup', passport.authenticate('local-signup'), function (req, res) {\n logger.verbose('successful signup for ' + req.user.channelName);\n res.status(200).json({\n success: true,\n channelName: req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId\n });\n });\n // route for log in\n app.post('/login', function (req, res, next) {\n passport.authenticate('local-login', function (err, user, info) {\n if (err) {\n return next(err);\n }\n if (!user) {\n return res.status(400).json({\n success: false,\n message: info.message\n });\n }\n logger.debug('successful login');\n req.logIn(user, function (err) {\n if (err) {\n return next(err);\n }\n return res.status(200).json({\n success: true,\n channelName: req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId\n });\n });\n })(req, res, next);\n });\n // route to log out\n app.get('/logout', function (req, res) {\n req.logout();\n res.status(200).json({ success: true, message: 'you successfully logged out' });\n });\n // see if user is authenticated, and return credentials if so\n app.get('/user', function (req, res) {\n if (req.user) {\n res.status(200).json({ success: true, data: req.user });\n } else {\n res.status(401).json({ success: false, message: 'user is not logged in' });\n }\n });\n};\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\nvar multipart = __webpack_require__(142);\n\nvar _require = __webpack_require__(3),\n uploadDirectory = _require.publishing.uploadDirectory,\n host = _require.details.host;\n\nvar multipartMiddleware = multipart({ uploadDir: uploadDirectory });\nvar db = __webpack_require__(9);\n\nvar _require2 = __webpack_require__(143),\n claimNameIsAvailable = _require2.claimNameIsAvailable,\n checkChannelAvailability = _require2.checkChannelAvailability,\n publish = _require2.publish;\n\nvar _require3 = __webpack_require__(55),\n getClaimList = _require3.getClaimList,\n resolveUri = _require3.resolveUri,\n getClaim = _require3.getClaim;\n\nvar _require4 = __webpack_require__(97),\n addGetResultsToFileData = _require4.addGetResultsToFileData,\n createBasicPublishParams = _require4.createBasicPublishParams,\n createThumbnailPublishParams = _require4.createThumbnailPublishParams,\n parsePublishApiRequestBody = _require4.parsePublishApiRequestBody,\n parsePublishApiRequestFiles = _require4.parsePublishApiRequestFiles,\n createFileData = _require4.createFileData;\n\nvar errorHandlers = __webpack_require__(99);\n\nvar _require5 = __webpack_require__(56),\n sendGATimingEvent = _require5.sendGATimingEvent;\n\nvar _require6 = __webpack_require__(144),\n authenticateUser = _require6.authenticateUser;\n\nvar _require7 = __webpack_require__(100),\n getChannelData = _require7.getChannelData,\n getChannelClaims = _require7.getChannelClaims,\n getClaimId = _require7.getClaimId;\n\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\n\nmodule.exports = function (app) {\n // route to check whether site has published to a channel\n app.get('/api/channel/availability/:name', function (_ref, res) {\n var ip = _ref.ip,\n originalUrl = _ref.originalUrl,\n name = _ref.params.name;\n\n var gaStartTime = Date.now();\n checkChannelAvailability(name).then(function (availableName) {\n res.status(200).json(availableName);\n sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now());\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short channel id from long channel Id\n app.get('/api/channel/short-id/:longId/:name', function (_ref2, res) {\n var ip = _ref2.ip,\n originalUrl = _ref2.originalUrl,\n params = _ref2.params;\n\n db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name).then(function (shortId) {\n res.status(200).json(shortId);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/data/:channelName/:channelClaimId', function (_ref3, res) {\n var ip = _ref3.ip,\n originalUrl = _ref3.originalUrl,\n body = _ref3.body,\n params = _ref3.params;\n\n var channelName = params.channelName;\n var channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n getChannelData(channelName, channelClaimId, 0).then(function (data) {\n if (data === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'No matching channel was found' });\n }\n res.status(200).json({ success: true, data: data });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/claims/:channelName/:channelClaimId/:page', function (_ref4, res) {\n var ip = _ref4.ip,\n originalUrl = _ref4.originalUrl,\n body = _ref4.body,\n params = _ref4.params;\n\n var channelName = params.channelName;\n var channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n var page = params.page;\n getChannelClaims(channelName, channelClaimId, page).then(function (data) {\n if (data === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'No matching channel was found' });\n }\n res.status(200).json({ success: true, data: data });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a claim_list request on the daemon\n app.get('/api/claim/list/:name', function (_ref5, res) {\n var ip = _ref5.ip,\n originalUrl = _ref5.originalUrl,\n params = _ref5.params;\n\n getClaimList(params.name).then(function (claimsList) {\n res.status(200).json(claimsList);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get an asset\n app.get('/api/claim/get/:name/:claimId', function (_ref6, res) {\n var ip = _ref6.ip,\n originalUrl = _ref6.originalUrl,\n params = _ref6.params;\n\n var name = params.name;\n var claimId = params.claimId;\n // resolve the claim\n db.Claim.resolveClaim(name, claimId).then(function (resolveResult) {\n // make sure a claim actually exists at that uri\n if (!resolveResult) {\n throw new Error('No matching uri found in Claim table');\n }\n var fileData = createFileData(resolveResult);\n // get the claim\n return Promise.all([fileData, getClaim(name + '#' + claimId)]);\n }).then(function (_ref7) {\n var _ref8 = _slicedToArray(_ref7, 2),\n fileData = _ref8[0],\n getResult = _ref8[1];\n\n fileData = addGetResultsToFileData(fileData, getResult);\n return Promise.all([db.upsert(db.File, fileData, { name: name, claimId: claimId }, 'File'), getResult]);\n }).then(function (_ref9) {\n var _ref10 = _slicedToArray(_ref9, 2),\n fileRecord = _ref10[0],\n _ref10$ = _ref10[1],\n message = _ref10$.message,\n completed = _ref10$.completed;\n\n res.status(200).json({ success: true, message: message, completed: completed });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to check whether this site published to a claim\n app.get('/api/claim/availability/:name', function (_ref11, res) {\n var ip = _ref11.ip,\n originalUrl = _ref11.originalUrl,\n name = _ref11.params.name;\n\n var gaStartTime = Date.now();\n claimNameIsAvailable(name).then(function (result) {\n res.status(200).json(result);\n sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now());\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a resolve request on the daemon\n app.get('/api/claim/resolve/:name/:claimId', function (_ref12, res) {\n var headers = _ref12.headers,\n ip = _ref12.ip,\n originalUrl = _ref12.originalUrl,\n params = _ref12.params;\n\n resolveUri(params.name + '#' + params.claimId).then(function (resolvedUri) {\n res.status(200).json(resolvedUri);\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a publish request on the daemon\n app.post('/api/claim/publish', multipartMiddleware, function (_ref13, res) {\n var body = _ref13.body,\n files = _ref13.files,\n headers = _ref13.headers,\n ip = _ref13.ip,\n originalUrl = _ref13.originalUrl,\n user = _ref13.user;\n\n // define variables\n var channelName = void 0,\n channelId = void 0,\n channelPassword = void 0,\n description = void 0,\n fileName = void 0,\n filePath = void 0,\n fileType = void 0,\n gaStartTime = void 0,\n license = void 0,\n name = void 0,\n nsfw = void 0,\n thumbnail = void 0,\n thumbnailFileName = void 0,\n thumbnailFilePath = void 0,\n thumbnailFileType = void 0,\n title = void 0;\n // record the start time of the request\n gaStartTime = Date.now();\n // validate the body and files of the request\n try {\n var _parsePublishApiReque = parsePublishApiRequestBody(body);\n // validateApiPublishRequest(body, files);\n\n\n name = _parsePublishApiReque.name;\n nsfw = _parsePublishApiReque.nsfw;\n license = _parsePublishApiReque.license;\n title = _parsePublishApiReque.title;\n description = _parsePublishApiReque.description;\n thumbnail = _parsePublishApiReque.thumbnail;\n\n var _parsePublishApiReque2 = parsePublishApiRequestFiles(files);\n\n fileName = _parsePublishApiReque2.fileName;\n filePath = _parsePublishApiReque2.filePath;\n fileType = _parsePublishApiReque2.fileType;\n thumbnailFileName = _parsePublishApiReque2.thumbnailFileName;\n thumbnailFilePath = _parsePublishApiReque2.thumbnailFilePath;\n thumbnailFileType = _parsePublishApiReque2.thumbnailFileType;\n channelName = body.channelName;\n channelId = body.channelId;\n channelPassword = body.channelPassword;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n // check channel authorization\n Promise.all([authenticateUser(channelName, channelId, channelPassword, user), claimNameIsAvailable(name), createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail), createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw)]).then(function (_ref14) {\n var _ref15 = _slicedToArray(_ref14, 4),\n _ref15$ = _ref15[0],\n channelName = _ref15$.channelName,\n channelClaimId = _ref15$.channelClaimId,\n validatedClaimName = _ref15[1],\n publishParams = _ref15[2],\n thumbnailPublishParams = _ref15[3];\n\n // add channel details to the publish params\n if (channelName && channelClaimId) {\n publishParams['channel_name'] = channelName;\n publishParams['channel_id'] = channelClaimId;\n }\n // publish the thumbnail\n if (thumbnailPublishParams) {\n publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType);\n }\n // publish the asset\n return publish(publishParams, fileName, fileType);\n }).then(function (result) {\n res.status(200).json({\n success: true,\n message: 'publish completed successfully',\n data: {\n name: name,\n claimId: result.claim_id,\n url: host + '/' + result.claim_id + '/' + name,\n lbryTx: result\n }\n });\n // record the publish end time and send to google analytics\n sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now());\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short claim id from long claim Id\n app.get('/api/claim/short-id/:longId/:name', function (_ref16, res) {\n var ip = _ref16.ip,\n originalUrl = _ref16.originalUrl,\n body = _ref16.body,\n params = _ref16.params;\n\n db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name).then(function (shortId) {\n res.status(200).json({ success: true, data: shortId });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.post('/api/claim/long-id', function (_ref17, res) {\n var ip = _ref17.ip,\n originalUrl = _ref17.originalUrl,\n body = _ref17.body,\n params = _ref17.params;\n\n logger.debug('body:', body);\n var channelName = body.channelName;\n var channelClaimId = body.channelClaimId;\n var claimName = body.claimName;\n var claimId = body.claimId;\n getClaimId(channelName, channelClaimId, claimName, claimId).then(function (result) {\n if (result === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'No matching channel could be found' });\n }\n if (result === NO_CLAIM) {\n return res.status(404).json({ success: false, message: 'No matching claim id could be found' });\n }\n res.status(200).json({ success: true, data: result });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/claim/data/:claimName/:claimId', function (_ref18, res) {\n var ip = _ref18.ip,\n originalUrl = _ref18.originalUrl,\n body = _ref18.body,\n params = _ref18.params;\n\n var claimName = params.claimName;\n var claimId = params.claimId;\n if (claimId === 'none') claimId = null;\n db.Claim.resolveClaim(claimName, claimId).then(function (claimInfo) {\n if (!claimInfo) {\n return res.status(404).json({ success: false, message: 'No claim could be found' });\n }\n res.status(200).json({ success: true, data: claimInfo });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to see if asset is available locally\n app.get('/api/file/availability/:name/:claimId', function (_ref19, res) {\n var ip = _ref19.ip,\n originalUrl = _ref19.originalUrl,\n params = _ref19.params;\n\n var name = params.name;\n var claimId = params.claimId;\n db.File.findOne({ where: { name: name, claimId: claimId } }).then(function (result) {\n if (result) {\n return res.status(200).json({ success: true, data: true });\n }\n res.status(200).json({ success: true, data: false });\n }).catch(function (error) {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n};\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"connect-multiparty\");\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar logger = __webpack_require__(2);\nvar db = __webpack_require__(9);\nvar lbryApi = __webpack_require__(55);\nvar publishHelpers = __webpack_require__(97);\n\nvar _require = __webpack_require__(3),\n _require$publishing = _require.publishing,\n primaryClaimAddress = _require$publishing.primaryClaimAddress,\n additionalClaimAddresses = _require$publishing.additionalClaimAddresses;\n\nvar Sequelize = __webpack_require__(95);\nvar Op = Sequelize.Op;\n\nmodule.exports = {\n publish: function publish(publishParams, fileName, fileType) {\n return new Promise(function (resolve, reject) {\n var publishResults = void 0,\n certificateId = void 0,\n channelName = void 0;\n // publish the file\n return lbryApi.publishClaim(publishParams).then(function (tx) {\n logger.info('Successfully published ' + publishParams.name + ' ' + fileName, tx);\n publishResults = tx;\n // get the channel information\n if (publishParams.channel_name) {\n logger.debug('this claim was published in channel: ' + publishParams.channel_name);\n return db.Channel.findOne({ where: { channelName: publishParams.channel_name } });\n } else {\n logger.debug('this claim was not published in a channel');\n return null;\n }\n }).then(function (channel) {\n // set channel information\n certificateId = null;\n channelName = null;\n if (channel) {\n certificateId = channel.channelClaimId;\n channelName = channel.channelName;\n }\n logger.debug('certificateId: ' + certificateId);\n }).then(function () {\n // create the File record\n var fileRecord = {\n name: publishParams.name,\n claimId: publishResults.claim_id,\n title: publishParams.metadata.title,\n description: publishParams.metadata.description,\n address: publishParams.claim_address,\n outpoint: publishResults.txid + ':' + publishResults.nout,\n height: 0,\n fileName: fileName,\n filePath: publishParams.file_path,\n fileType: fileType,\n nsfw: publishParams.metadata.nsfw\n };\n // create the Claim record\n var claimRecord = {\n name: publishParams.name,\n claimId: publishResults.claim_id,\n title: publishParams.metadata.title,\n description: publishParams.metadata.description,\n address: publishParams.claim_address,\n thumbnail: publishParams.metadata.thumbnail,\n outpoint: publishResults.txid + ':' + publishResults.nout,\n height: 0,\n contentType: fileType,\n nsfw: publishParams.metadata.nsfw,\n amount: publishParams.bid,\n certificateId: certificateId,\n channelName: channelName\n };\n // upsert criteria\n var upsertCriteria = {\n name: publishParams.name,\n claimId: publishResults.claim_id\n };\n // upsert the records\n return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]);\n }).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n file = _ref2[0],\n claim = _ref2[1];\n\n logger.debug('File and Claim records successfully created');\n return Promise.all([file.setClaim(claim), claim.setFile(file)]);\n }).then(function () {\n logger.debug('File and Claim records successfully associated');\n resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim;\n }).catch(function (error) {\n logger.error('PUBLISH ERROR', error);\n publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file\n reject(error);\n });\n });\n },\n claimNameIsAvailable: function claimNameIsAvailable(name) {\n var claimAddresses = additionalClaimAddresses || [];\n claimAddresses.push(primaryClaimAddress);\n // find any records where the name is used\n return db.Claim.findAll({\n attributes: ['address'],\n where: {\n name: name,\n address: _defineProperty({}, Op.or, claimAddresses)\n }\n }).then(function (result) {\n if (result.length >= 1) {\n throw new Error('That claim is already in use');\n };\n return name;\n }).catch(function (error) {\n throw error;\n });\n },\n checkChannelAvailability: function checkChannelAvailability(name) {\n return db.Channel.findAll({\n where: { channelName: name }\n }).then(function (result) {\n if (result.length >= 1) {\n throw new Error('That channel has already been claimed');\n }\n return name;\n }).catch(function (error) {\n throw error;\n });\n }\n};\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar db = __webpack_require__(9);\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n authenticateUser: function authenticateUser(channelName, channelId, channelPassword, user) {\n // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided\n if (!channelName && !channelId) {\n return {\n channelName: null,\n channelClaimId: null\n };\n }\n // case: channelName or channel Id are provided with user token\n if (user) {\n if (channelName && channelName !== user.channelName) {\n throw new Error('the provided channel name does not match user credentials');\n }\n if (channelId && channelId !== user.channelClaimId) {\n throw new Error('the provided channel id does not match user credentials');\n }\n return {\n channelName: user.channelName,\n channelClaimId: user.channelClaimId\n };\n }\n // case: channelName or channel Id are provided with password instead of user token\n if (!channelPassword) throw new Error('no channel password provided');\n return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword);\n },\n authenticateChannelCredentials: function authenticateChannelCredentials(channelName, channelId, userPassword) {\n return new Promise(function (resolve, reject) {\n // hoisted variables\n var channelData = void 0;\n // build the params for finding the channel\n var channelFindParams = {};\n if (channelName) channelFindParams['channelName'] = channelName;\n if (channelId) channelFindParams['channelClaimId'] = channelId;\n // find the channel\n db.Channel.findOne({\n where: channelFindParams\n }).then(function (channel) {\n if (!channel) {\n logger.debug('no channel found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n channelData = channel.get();\n logger.debug('channel data:', channelData);\n return db.User.findOne({\n where: { userName: channelData.channelName.substring(1) }\n });\n }).then(function (user) {\n if (!user) {\n logger.debug('no user found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n return user.comparePassword(userPassword);\n }).then(function (isMatch) {\n if (!isMatch) {\n logger.debug('incorrect password');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n logger.debug('...password was a match...');\n resolve(channelData);\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n};\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar CLAIMS_PER_PAGE = 12;\n\nmodule.exports = {\n returnPaginatedChannelClaims: function returnPaginatedChannelClaims(channelName, longChannelClaimId, claims, page) {\n var totalPages = module.exports.determineTotalPages(claims);\n var paginationPage = module.exports.getPageFromQuery(page);\n var viewData = {\n channelName: channelName,\n longChannelClaimId: longChannelClaimId,\n claims: module.exports.extractPageFromClaims(claims, paginationPage),\n previousPage: module.exports.determinePreviousPage(paginationPage),\n currentPage: paginationPage,\n nextPage: module.exports.determineNextPage(totalPages, paginationPage),\n totalPages: totalPages,\n totalResults: module.exports.determineTotalClaims(claims)\n };\n return viewData;\n },\n getPageFromQuery: function getPageFromQuery(page) {\n if (page) {\n return parseInt(page);\n }\n return 1;\n },\n extractPageFromClaims: function extractPageFromClaims(claims, pageNumber) {\n if (!claims) {\n return []; // if no claims, return this default\n }\n // logger.debug('claims is array?', Array.isArray(claims));\n // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));\n var claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;\n var claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE;\n var pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);\n return pageOfClaims;\n },\n determineTotalPages: function determineTotalPages(claims) {\n if (!claims) {\n return 0;\n } else {\n var totalClaims = claims.length;\n if (totalClaims < CLAIMS_PER_PAGE) {\n return 1;\n }\n var fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);\n var remainder = totalClaims % CLAIMS_PER_PAGE;\n if (remainder === 0) {\n return fullPages;\n }\n return fullPages + 1;\n }\n },\n determinePreviousPage: function determinePreviousPage(currentPage) {\n if (currentPage === 1) {\n return null;\n }\n return currentPage - 1;\n },\n determineNextPage: function determineNextPage(totalPages, currentPage) {\n if (currentPage === totalPages) {\n return null;\n }\n return currentPage + 1;\n },\n determineTotalClaims: function determineTotalClaims(claims) {\n if (!claims) {\n return 0;\n }\n return claims.length;\n }\n};\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _require = __webpack_require__(3),\n host = _require.details;\n\nvar handlePageRender = __webpack_require__(101);\n\nmodule.exports = function (app) {\n // route for the home page\n app.get('/', function (req, res) {\n handlePageRender(req, res);\n });\n // route to display login page\n app.get('/login', function (req, res) {\n handlePageRender(req, res);\n });\n // route to show 'about' page\n app.get('/about', function (req, res) {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/trending', function (req, res) {\n res.status(301).redirect('/popular');\n });\n app.get('/popular', function (req, res) {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/new', function (req, res) {\n handlePageRender(req, res);\n });\n // route to send embedable video player (for twitter)\n app.get('/embed/:claimId/:name', function (_ref, res) {\n var params = _ref.params;\n\n var claimId = params.claimId;\n var name = params.name;\n // get and render the content\n res.status(200).render('embed', { layout: 'embed', host: host, claimId: claimId, name: name });\n });\n};\n\n/***/ }),\n/* 147 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n case actions.FILE_SELECTED:\n return Object.assign({}, initialState, { // note: clears to initial state\n file: action.data\n });\n case actions.FILE_CLEAR:\n return initialState;\n case actions.METADATA_UPDATE:\n return Object.assign({}, state, {\n metadata: Object.assign({}, state.metadata, _defineProperty({}, action.data.name, action.data.value))\n });\n case actions.CLAIM_UPDATE:\n return Object.assign({}, state, {\n claim: action.data\n });\n case actions.SET_PUBLISH_IN_CHANNEL:\n return Object.assign({}, state, {\n publishInChannel: action.channel\n });\n case actions.PUBLISH_STATUS_UPDATE:\n return Object.assign({}, state, {\n status: action.data\n });\n case actions.ERROR_UPDATE:\n return Object.assign({}, state, {\n error: Object.assign({}, state.error, _defineProperty({}, action.data.name, action.data.value))\n });\n case actions.SELECTED_CHANNEL_UPDATE:\n return Object.assign({}, state, {\n selectedChannel: action.data\n });\n case actions.TOGGLE_METADATA_INPUTS:\n return Object.assign({}, state, {\n showMetadataInputs: action.data\n });\n case actions.THUMBNAIL_NEW:\n return Object.assign({}, state, {\n thumbnail: action.data\n });\n default:\n return state;\n }\n};\n\nvar _publish_action_types = __webpack_require__(104);\n\nvar actions = _interopRequireWildcard(_publish_action_types);\n\nvar _publish_channel_select_states = __webpack_require__(105);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _require = __webpack_require__(3),\n publishing = _require.publishing;\n\nvar initialState = {\n disabled: publishing.disabled,\n disabledMessage: publishing.disabledMessage,\n publishInChannel: false,\n selectedChannel: _publish_channel_select_states.LOGIN,\n showMetadataInputs: false,\n status: {\n status: null,\n message: null\n },\n error: {\n file: null,\n url: null,\n channel: null,\n publishSubmit: null\n },\n file: null,\n claim: '',\n metadata: {\n title: '',\n description: '',\n license: '',\n nsfw: false\n },\n thumbnail: null\n};\n\n/***/ }),\n/* 148 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n case actions.CHANNEL_UPDATE:\n return Object.assign({}, state, {\n loggedInChannel: action.data\n });\n default:\n return state;\n }\n};\n\nvar _channel_action_types = __webpack_require__(106);\n\nvar actions = _interopRequireWildcard(_channel_action_types);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar initialState = {\n loggedInChannel: {\n name: null,\n shortId: null,\n longId: null\n }\n};\n\n/***/ }),\n/* 149 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n // handle request\n case actions.REQUEST_ERROR:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n error: action.data\n })\n });\n case actions.REQUEST_UPDATE:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n type: action.data.requestType,\n id: action.data.requestId\n })\n });\n // store requests\n case actions.REQUEST_LIST_ADD:\n return Object.assign({}, state, {\n requestList: Object.assign({}, state.requestList, _defineProperty({}, action.data.id, {\n error: action.data.error,\n key: action.data.key\n }))\n });\n // asset data\n case actions.ASSET_ADD:\n return Object.assign({}, state, {\n assetList: Object.assign({}, state.assetList, _defineProperty({}, action.data.id, {\n error: action.data.error,\n name: action.data.name,\n claimId: action.data.claimId,\n shortId: action.data.shortId,\n claimData: action.data.claimData\n }))\n });\n // channel data\n case actions.CHANNEL_ADD:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.id, {\n name: action.data.name,\n longId: action.data.longId,\n shortId: action.data.shortId,\n claimsData: action.data.claimsData\n }))\n });\n case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, _defineProperty({}, action.data.channelListId, Object.assign({}, state.channelList[action.data.channelListId], {\n claimsData: action.data.claimsData\n })))\n });\n // display an asset\n case actions.FILE_AVAILABILITY_UPDATE:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n status: action.data\n })\n });\n case actions.DISPLAY_ASSET_ERROR:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n error: action.data,\n status: _asset_display_states.ERROR\n })\n });\n default:\n return state;\n }\n};\n\nvar _show_action_types = __webpack_require__(19);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _asset_display_states = __webpack_require__(107);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar initialState = {\n request: {\n error: null,\n type: null,\n id: null\n },\n requestList: {},\n channelList: {},\n assetList: {},\n displayAsset: {\n error: null,\n status: _asset_display_states.LOCAL_CHECK\n }\n};\n\n/***/ }),\n/* 150 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments[1];\n\n switch (action.type) {\n default:\n return state;\n }\n};\n\nvar siteConfig = __webpack_require__(3);\n\nvar googleAnalyticsId = siteConfig.analytics.googleId,\n _siteConfig$assetDefa = siteConfig.assetDefaults,\n defaultThumbnail = _siteConfig$assetDefa.thumbnail,\n defaultDescription = _siteConfig$assetDefa.description,\n _siteConfig$details = siteConfig.details,\n description = _siteConfig$details.description,\n host = _siteConfig$details.host,\n title = _siteConfig$details.title,\n twitter = _siteConfig$details.twitter;\n\n\nvar initialState = {\n description: description,\n googleAnalyticsId: googleAnalyticsId,\n host: host,\n title: title,\n twitter: twitter,\n defaultDescription: defaultDescription,\n defaultThumbnail: defaultThumbnail\n};\n\n/***/ }),\n/* 151 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"react-ga\");\n\n/***/ }),\n/* 152 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"cross-fetch/polyfill\");\n\n/***/ }),\n/* 153 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _require = __webpack_require__(56),\n sendGAServeEvent = _require.sendGAServeEvent;\n\nvar _require2 = __webpack_require__(154),\n determineResponseType = _require2.determineResponseType,\n flipClaimNameAndIdForBackwardsCompatibility = _require2.flipClaimNameAndIdForBackwardsCompatibility,\n logRequestData = _require2.logRequestData,\n getClaimIdAndServeAsset = _require2.getClaimIdAndServeAsset;\n\nvar lbryUri = __webpack_require__(155);\nvar handleShowRender = __webpack_require__(156);\nvar SERVE = 'SERVE';\n\nmodule.exports = function (app) {\n // route to serve a specific asset using the channel or claim id\n app.get('/:identifier/:claim', function (req, res) {\n var headers = req.headers,\n ip = req.ip,\n originalUrl = req.originalUrl,\n params = req.params;\n // decide if this is a show request\n\n var hasFileExtension = void 0;\n try {\n var _lbryUri$parseModifie = lbryUri.parseModifier(params.claim);\n\n hasFileExtension = _lbryUri$parseModifie.hasFileExtension;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n var responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n var claimName = void 0;\n try {\n var _lbryUri$parseClaim = lbryUri.parseClaim(params.claim);\n\n claimName = _lbryUri$parseClaim.claimName;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n // parse the identifier\n var isChannel = void 0,\n channelName = void 0,\n channelClaimId = void 0,\n claimId = void 0;\n try {\n var _lbryUri$parseIdentif = lbryUri.parseIdentifier(params.identifier);\n\n isChannel = _lbryUri$parseIdentif.isChannel;\n channelName = _lbryUri$parseIdentif.channelName;\n channelClaimId = _lbryUri$parseIdentif.channelClaimId;\n claimId = _lbryUri$parseIdentif.claimId;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n if (!isChannel) {\n var _flipClaimNameAndIdFo = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName);\n\n var _flipClaimNameAndIdFo2 = _slicedToArray(_flipClaimNameAndIdFo, 2);\n\n claimId = _flipClaimNameAndIdFo2[0];\n claimName = _flipClaimNameAndIdFo2[1];\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, channelName, claimId);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res);\n });\n // route to serve the winning asset at a claim or a channel page\n app.get('/:claim', function (req, res) {\n var headers = req.headers,\n ip = req.ip,\n originalUrl = req.originalUrl,\n params = req.params;\n // decide if this is a show request\n\n var hasFileExtension = void 0;\n try {\n var _lbryUri$parseModifie2 = lbryUri.parseModifier(params.claim);\n\n hasFileExtension = _lbryUri$parseModifie2.hasFileExtension;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n var responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n var claimName = void 0;\n try {\n var _lbryUri$parseClaim2 = lbryUri.parseClaim(params.claim);\n\n claimName = _lbryUri$parseClaim2.claimName;\n } catch (error) {\n return res.status(400).json({ success: false, message: error.message });\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, null, null);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res);\n });\n};\n\n/***/ }),\n/* 154 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar logger = __webpack_require__(2);\n\nvar _require = __webpack_require__(100),\n getClaimId = _require.getClaimId,\n getLocalFileRecord = _require.getLocalFileRecord;\n\nvar _require2 = __webpack_require__(99),\n handleErrorResponse = _require2.handleErrorResponse;\n\nvar SERVE = 'SERVE';\nvar SHOW = 'SHOW';\nvar NO_FILE = 'NO_FILE';\nvar NO_CHANNEL = 'NO_CHANNEL';\nvar NO_CLAIM = 'NO_CLAIM';\n\nfunction clientAcceptsHtml(_ref) {\n var accept = _ref.accept;\n\n return accept && accept.match(/text\\/html/);\n};\n\nfunction requestIsFromBrowser(headers) {\n return headers['user-agent'] && headers['user-agent'].match(/Mozilla/);\n};\n\nfunction clientWantsAsset(_ref2) {\n var accept = _ref2.accept,\n range = _ref2.range;\n\n var imageIsWanted = accept && accept.match(/image\\/.*/) && !accept.match(/text\\/html/) && !accept.match(/text\\/\\*/);\n var videoIsWanted = accept && range;\n return imageIsWanted || videoIsWanted;\n};\n\nfunction isValidClaimId(claimId) {\n return claimId.length === 40 && !/[^A-Za-z0-9]/g.test(claimId);\n};\n\nfunction isValidShortId(claimId) {\n return claimId.length === 1; // it should really evaluate the short url itself\n};\n\nfunction isValidShortIdOrClaimId(input) {\n return isValidClaimId(input) || isValidShortId(input);\n};\n\nfunction serveAssetToClient(claimId, name, res) {\n return getLocalFileRecord(claimId, name).then(function (fileRecord) {\n // check that a local record was found\n if (fileRecord === NO_FILE) {\n return res.status(307).redirect('/api/claim/get/' + name + '/' + claimId);\n }\n // serve the file\n var filePath = fileRecord.filePath,\n fileType = fileRecord.fileType;\n\n logger.verbose('serving file: ' + filePath);\n var sendFileOptions = {\n headers: {\n 'X-Content-Type-Options': 'nosniff',\n 'Content-Type': fileType || 'image/jpeg'\n }\n };\n res.status(200).sendFile(filePath, sendFileOptions);\n }).catch(function (error) {\n throw error;\n });\n};\n\nmodule.exports = {\n getClaimIdAndServeAsset: function getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) {\n // get the claim Id and then serve the asset\n getClaimId(channelName, channelClaimId, claimName, claimId).then(function (fullClaimId) {\n if (fullClaimId === NO_CLAIM) {\n return res.status(404).json({ success: false, message: 'no claim id could be found' });\n } else if (fullClaimId === NO_CHANNEL) {\n return res.status(404).json({ success: false, message: 'no channel id could be found' });\n }\n serveAssetToClient(fullClaimId, claimName, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success');\n }).catch(function (error) {\n handleErrorResponse(originalUrl, ip, error, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail');\n });\n },\n determineResponseType: function determineResponseType(hasFileExtension, headers) {\n var responseType = void 0;\n if (hasFileExtension) {\n responseType = SERVE; // assume a serve request if file extension is present\n if (clientAcceptsHtml(headers)) {\n // if the request comes from a browser, change it to a show request\n responseType = SHOW;\n }\n } else {\n responseType = SHOW;\n if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) {\n // this is in case someone embeds a show url\n logger.debug('Show request came from browser but wants an image/video. Changing response to serve...');\n responseType = SERVE;\n }\n }\n return responseType;\n },\n flipClaimNameAndIdForBackwardsCompatibility: function flipClaimNameAndIdForBackwardsCompatibility(identifier, name) {\n // this is a patch for backwards compatability with '/name/claim_id' url format\n if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) {\n var tempName = name;\n name = identifier;\n identifier = tempName;\n }\n return [identifier, name];\n },\n logRequestData: function logRequestData(responseType, claimName, channelName, claimId) {\n logger.debug('responseType ===', responseType);\n logger.debug('claim name === ', claimName);\n logger.debug('channel name ===', channelName);\n logger.debug('claim id ===', claimId);\n }\n};\n\n/***/ }),\n/* 155 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar logger = __webpack_require__(2);\n\nmodule.exports = {\n REGEXP_INVALID_CLAIM: /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS: /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR: '@',\n parseIdentifier: function parseIdentifier(identifier) {\n logger.debug('parsing identifier:', identifier);\n var componentsRegex = new RegExp('([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec = componentsRegex.exec(identifier).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec2 = _slicedToArray(_componentsRegex$exec, 4),\n proto = _componentsRegex$exec2[0],\n value = _componentsRegex$exec2[1],\n modifierSeperator = _componentsRegex$exec2[2],\n modifier = _componentsRegex$exec2[3];\n\n logger.debug(proto + ', ' + value + ', ' + modifierSeperator + ', ' + modifier);\n\n // Validate and process name\n if (!value) {\n throw new Error('Check your url. No channel name provided before \"' + modifierSeperator + '\"');\n }\n var isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n var channelName = isChannel ? value : null;\n var claimId = void 0;\n if (isChannel) {\n if (!channelName) {\n throw new Error('No channel name after @.');\n }\n var nameBadChars = channelName.match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error('Invalid characters in channel name: ' + nameBadChars.join(', ') + '.');\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n var channelClaimId = void 0;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error('No modifier provided after separator \"' + modifierSeperator + '\"');\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error('The \"' + modifierSeperator + '\" modifier is not currently supported');\n }\n }\n return {\n isChannel: isChannel,\n channelName: channelName,\n channelClaimId: channelClaimId,\n claimId: claimId\n };\n },\n parseClaim: function parseClaim(claim) {\n logger.debug('parsing name:', claim);\n var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec3 = componentsRegex.exec(claim).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec4 = _slicedToArray(_componentsRegex$exec3, 4),\n proto = _componentsRegex$exec4[0],\n claimName = _componentsRegex$exec4[1],\n modifierSeperator = _componentsRegex$exec4[2],\n modifier = _componentsRegex$exec4[3];\n\n logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier);\n\n // Validate and process name\n if (!claimName) {\n throw new Error('No claim name provided before .');\n }\n var nameBadChars = claimName.match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error('Invalid characters in claim name: ' + nameBadChars.join(', ') + '.');\n }\n // Validate and process modifier\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error('No file extension provided after separator ' + modifierSeperator + '.');\n }\n if (modifierSeperator !== '.') {\n throw new Error('The ' + modifierSeperator + ' modifier is not supported in the claim name');\n }\n }\n // return results\n return {\n claimName: claimName\n };\n },\n parseModifier: function parseModifier(claim) {\n logger.debug('parsing modifier:', claim);\n var componentsRegex = new RegExp('([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n\n var _componentsRegex$exec5 = componentsRegex.exec(claim).map(function (match) {\n return match || null;\n }),\n _componentsRegex$exec6 = _slicedToArray(_componentsRegex$exec5, 4),\n proto = _componentsRegex$exec6[0],\n claimName = _componentsRegex$exec6[1],\n modifierSeperator = _componentsRegex$exec6[2],\n modifier = _componentsRegex$exec6[3];\n\n logger.debug(proto + ', ' + claimName + ', ' + modifierSeperator + ', ' + modifier);\n // Validate and process modifier\n var hasFileExtension = false;\n if (modifierSeperator) {\n hasFileExtension = true;\n }\n return {\n hasFileExtension: hasFileExtension\n };\n }\n};\n\n/***/ }),\n/* 156 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _server = __webpack_require__(102);\n\nvar _redux = __webpack_require__(57);\n\nvar _index = __webpack_require__(103);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _reactRedux = __webpack_require__(1);\n\nvar _reactRouterDom = __webpack_require__(4);\n\nvar _index3 = __webpack_require__(13);\n\nvar _index4 = _interopRequireDefault(_index3);\n\nvar _app = __webpack_require__(108);\n\nvar _app2 = _interopRequireDefault(_app);\n\nvar _renderFullPage = __webpack_require__(113);\n\nvar _renderFullPage2 = _interopRequireDefault(_renderFullPage);\n\nvar _reduxSaga = __webpack_require__(157);\n\nvar _reduxSaga2 = _interopRequireDefault(_reduxSaga);\n\nvar _effects = __webpack_require__(49);\n\nvar _show_uri = __webpack_require__(158);\n\nvar _show = __webpack_require__(11);\n\nvar _reactHelmet = __webpack_require__(48);\n\nvar _reactHelmet2 = _interopRequireDefault(_reactHelmet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar returnSagaWithParams = function returnSagaWithParams(saga, params) {\n return (/*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return (0, _effects.call)(saga, params);\n\n case 2:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n })\n );\n};\n\nmodule.exports = function (req, res) {\n var context = {};\n\n // create and apply middleware\n var sagaMiddleware = (0, _reduxSaga2.default)();\n var middleware = (0, _redux.applyMiddleware)(sagaMiddleware);\n\n // create a new Redux store instance\n var store = (0, _redux.createStore)(_index2.default, middleware);\n\n // create saga\n var action = (0, _show.onHandleShowPageUri)(req.params);\n var saga = returnSagaWithParams(_show_uri.handleShowPageUri, action);\n\n // run the saga middleware\n sagaMiddleware.run(saga).done.then(function () {\n // render component to a string\n var html = (0, _server.renderToString)(_react2.default.createElement(\n _reactRedux.Provider,\n { store: store },\n _react2.default.createElement(\n _reactRouterDom.StaticRouter,\n { location: req.url, context: context },\n _react2.default.createElement(\n _index4.default,\n null,\n _react2.default.createElement(_app2.default, null)\n )\n )\n ));\n\n // get head tags from helmet\n var helmet = _reactHelmet2.default.renderStatic();\n\n // check for a redirect\n if (context.url) {\n return res.redirect(301, context.url);\n }\n\n // get the initial state from our Redux store\n var preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send((0, _renderFullPage2.default)(helmet, html, preloadedState));\n });\n};\n\n/***/ }),\n/* 157 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"redux-saga\");\n\n/***/ }),\n/* 158 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.handleShowPageUri = handleShowPageUri;\nexports.watchHandleShowPageUri = watchHandleShowPageUri;\n\nvar _effects = __webpack_require__(49);\n\nvar _show_action_types = __webpack_require__(19);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(11);\n\nvar _show_asset = __webpack_require__(159);\n\nvar _show_channel = __webpack_require__(161);\n\nvar _lbryUri = __webpack_require__(61);\n\nvar _lbryUri2 = _interopRequireDefault(_lbryUri);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateIdentifierAndClaim),\n _marked2 = /*#__PURE__*/regeneratorRuntime.mark(parseAndUpdateClaimOnly),\n _marked3 = /*#__PURE__*/regeneratorRuntime.mark(handleShowPageUri),\n _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchHandleShowPageUri);\n\nfunction parseAndUpdateIdentifierAndClaim(modifier, claim) {\n var isChannel, channelName, channelClaimId, claimId, claimName, extension, _lbryUri$parseIdentif, _lbryUri$parseClaim;\n\n return regeneratorRuntime.wrap(function parseAndUpdateIdentifierAndClaim$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // this is a request for an asset\n // claim will be an asset claim\n // the identifier could be a channel or a claim id\n isChannel = void 0, channelName = void 0, channelClaimId = void 0, claimId = void 0, claimName = void 0, extension = void 0;\n _context.prev = 1;\n _lbryUri$parseIdentif = _lbryUri2.default.parseIdentifier(modifier);\n isChannel = _lbryUri$parseIdentif.isChannel;\n channelName = _lbryUri$parseIdentif.channelName;\n channelClaimId = _lbryUri$parseIdentif.channelClaimId;\n claimId = _lbryUri$parseIdentif.claimId;\n _lbryUri$parseClaim = _lbryUri2.default.parseClaim(claim);\n claimName = _lbryUri$parseClaim.claimName;\n extension = _lbryUri$parseClaim.extension;\n _context.next = 17;\n break;\n\n case 12:\n _context.prev = 12;\n _context.t0 = _context['catch'](1);\n _context.next = 16;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n case 16:\n return _context.abrupt('return', _context.sent);\n\n case 17:\n if (!isChannel) {\n _context.next = 21;\n break;\n }\n\n _context.next = 20;\n return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, channelName, channelClaimId, extension));\n\n case 20:\n return _context.abrupt('return', _context.sent);\n\n case 21:\n ;\n _context.next = 24;\n return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, claimId, null, null, extension));\n\n case 24:\n case 'end':\n return _context.stop();\n }\n }\n }, _marked, this, [[1, 12]]);\n}\nfunction parseAndUpdateClaimOnly(claim) {\n var isChannel, channelName, channelClaimId, _lbryUri$parseIdentif2, claimName, extension, _lbryUri$parseClaim2;\n\n return regeneratorRuntime.wrap(function parseAndUpdateClaimOnly$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n // this could be a request for an asset or a channel page\n // claim could be an asset claim or a channel claim\n isChannel = void 0, channelName = void 0, channelClaimId = void 0;\n _context2.prev = 1;\n _lbryUri$parseIdentif2 = _lbryUri2.default.parseIdentifier(claim);\n isChannel = _lbryUri$parseIdentif2.isChannel;\n channelName = _lbryUri$parseIdentif2.channelName;\n channelClaimId = _lbryUri$parseIdentif2.channelClaimId;\n _context2.next = 13;\n break;\n\n case 8:\n _context2.prev = 8;\n _context2.t0 = _context2['catch'](1);\n _context2.next = 12;\n return (0, _effects.put)((0, _show.onRequestError)(_context2.t0.message));\n\n case 12:\n return _context2.abrupt('return', _context2.sent);\n\n case 13:\n if (!isChannel) {\n _context2.next = 17;\n break;\n }\n\n _context2.next = 16;\n return (0, _effects.call)(_show_channel.newChannelRequest, (0, _show.onNewChannelRequest)(channelName, channelClaimId));\n\n case 16:\n return _context2.abrupt('return', _context2.sent);\n\n case 17:\n // if not for a channel, parse the claim request\n claimName = void 0, extension = void 0;\n _context2.prev = 18;\n _lbryUri$parseClaim2 = _lbryUri2.default.parseClaim(claim);\n claimName = _lbryUri$parseClaim2.claimName;\n extension = _lbryUri$parseClaim2.extension;\n _context2.next = 29;\n break;\n\n case 24:\n _context2.prev = 24;\n _context2.t1 = _context2['catch'](18);\n _context2.next = 28;\n return (0, _effects.put)((0, _show.onRequestError)(_context2.t1.message));\n\n case 28:\n return _context2.abrupt('return', _context2.sent);\n\n case 29:\n _context2.next = 31;\n return (0, _effects.call)(_show_asset.newAssetRequest, (0, _show.onNewAssetRequest)(claimName, null, null, null, extension));\n\n case 31:\n case 'end':\n return _context2.stop();\n }\n }\n }, _marked2, this, [[1, 8], [18, 24]]);\n}\n\nfunction handleShowPageUri(action) {\n var _action$data, identifier, claim;\n\n return regeneratorRuntime.wrap(function handleShowPageUri$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _action$data = action.data, identifier = _action$data.identifier, claim = _action$data.claim;\n\n if (!identifier) {\n _context3.next = 5;\n break;\n }\n\n _context3.next = 4;\n return (0, _effects.call)(parseAndUpdateIdentifierAndClaim, identifier, claim);\n\n case 4:\n return _context3.abrupt('return', _context3.sent);\n\n case 5:\n _context3.next = 7;\n return (0, _effects.call)(parseAndUpdateClaimOnly, claim);\n\n case 7:\n case 'end':\n return _context3.stop();\n }\n }\n }, _marked3, this);\n};\n\nfunction watchHandleShowPageUri() {\n return regeneratorRuntime.wrap(function watchHandleShowPageUri$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.next = 2;\n return (0, _effects.takeLatest)(actions.HANDLE_SHOW_URI, handleShowPageUri);\n\n case 2:\n case 'end':\n return _context4.stop();\n }\n }\n }, _marked4, this);\n};\n\n/***/ }),\n/* 159 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.newAssetRequest = newAssetRequest;\nexports.watchNewAssetRequest = watchNewAssetRequest;\n\nvar _effects = __webpack_require__(49);\n\nvar _show_action_types = __webpack_require__(19);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(11);\n\nvar _assetApi = __webpack_require__(160);\n\nvar _show2 = __webpack_require__(28);\n\nvar _site = __webpack_require__(114);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(newAssetRequest),\n _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewAssetRequest);\n\nfunction newAssetRequest(action) {\n var _action$data, requestType, requestId, name, modifier, state, host, longId, _ref, assetKey, shortId, _ref2, claimData, _ref3;\n\n return regeneratorRuntime.wrap(function newAssetRequest$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, name = _action$data.name, modifier = _action$data.modifier;\n // put an action to update the request in redux\n\n _context.next = 3;\n return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId));\n\n case 3:\n _context.next = 5;\n return (0, _effects.select)(_show2.selectShowState);\n\n case 5:\n state = _context.sent;\n _context.next = 8;\n return (0, _effects.select)(_site.selectSiteHost);\n\n case 8:\n host = _context.sent;\n\n if (!state.requestList[requestId]) {\n _context.next = 11;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 11:\n // get long id && add request to request list\n longId = void 0;\n _context.prev = 12;\n _context.next = 15;\n return (0, _effects.call)(_assetApi.getLongClaimId, host, name, modifier);\n\n case 15:\n _ref = _context.sent;\n longId = _ref.data;\n _context.next = 24;\n break;\n\n case 19:\n _context.prev = 19;\n _context.t0 = _context['catch'](12);\n _context.next = 23;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n case 23:\n return _context.abrupt('return', _context.sent);\n\n case 24:\n assetKey = 'a#' + name + '#' + longId;\n _context.next = 27;\n return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, assetKey));\n\n case 27:\n if (!state.assetList[assetKey]) {\n _context.next = 29;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 29:\n // get short Id\n shortId = void 0;\n _context.prev = 30;\n _context.next = 33;\n return (0, _effects.call)(_assetApi.getShortId, host, name, longId);\n\n case 33:\n _ref2 = _context.sent;\n shortId = _ref2.data;\n _context.next = 42;\n break;\n\n case 37:\n _context.prev = 37;\n _context.t1 = _context['catch'](30);\n _context.next = 41;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message));\n\n case 41:\n return _context.abrupt('return', _context.sent);\n\n case 42:\n // get asset claim data\n claimData = void 0;\n _context.prev = 43;\n _context.next = 46;\n return (0, _effects.call)(_assetApi.getClaimData, host, name, longId);\n\n case 46:\n _ref3 = _context.sent;\n claimData = _ref3.data;\n _context.next = 55;\n break;\n\n case 50:\n _context.prev = 50;\n _context.t2 = _context['catch'](43);\n _context.next = 54;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t2.message));\n\n case 54:\n return _context.abrupt('return', _context.sent);\n\n case 55:\n _context.next = 57;\n return (0, _effects.put)((0, _show.addAssetToAssetList)(assetKey, null, name, longId, shortId, claimData));\n\n case 57:\n _context.next = 59;\n return (0, _effects.put)((0, _show.onRequestError)(null));\n\n case 59:\n case 'end':\n return _context.stop();\n }\n }\n }, _marked, this, [[12, 19], [30, 37], [43, 50]]);\n};\n\nfunction watchNewAssetRequest() {\n return regeneratorRuntime.wrap(function watchNewAssetRequest$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return (0, _effects.takeLatest)(actions.ASSET_REQUEST_NEW, newAssetRequest);\n\n case 2:\n case 'end':\n return _context2.stop();\n }\n }\n }, _marked2, this);\n};\n\n/***/ }),\n/* 160 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getLongClaimId = getLongClaimId;\nexports.getShortId = getShortId;\nexports.getClaimData = getClaimData;\n\nvar _request = __webpack_require__(8);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getLongClaimId(host, name, modifier) {\n var body = {};\n // create request params\n if (modifier) {\n if (modifier.id) {\n body['claimId'] = modifier.id;\n } else {\n body['channelName'] = modifier.channel.name;\n body['channelClaimId'] = modifier.channel.id;\n }\n }\n body['claimName'] = name;\n var params = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body)\n };\n // create url\n var url = host + '/api/claim/long-id';\n // return the request promise\n return (0, _request2.default)(url, params);\n};\n\nfunction getShortId(host, name, claimId) {\n var url = host + '/api/claim/short-id/' + claimId + '/' + name;\n return (0, _request2.default)(url);\n};\n\nfunction getClaimData(host, name, claimId) {\n var url = host + '/api/claim/data/' + name + '/' + claimId;\n return (0, _request2.default)(url);\n};\n\n/***/ }),\n/* 161 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.newChannelRequest = newChannelRequest;\nexports.watchNewChannelRequest = watchNewChannelRequest;\nexports.watchUpdateChannelClaims = watchUpdateChannelClaims;\n\nvar _effects = __webpack_require__(49);\n\nvar _show_action_types = __webpack_require__(19);\n\nvar actions = _interopRequireWildcard(_show_action_types);\n\nvar _show = __webpack_require__(11);\n\nvar _channelApi = __webpack_require__(162);\n\nvar _show2 = __webpack_require__(28);\n\nvar _site = __webpack_require__(114);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar _marked = /*#__PURE__*/regeneratorRuntime.mark(newChannelRequest),\n _marked2 = /*#__PURE__*/regeneratorRuntime.mark(watchNewChannelRequest),\n _marked3 = /*#__PURE__*/regeneratorRuntime.mark(getNewClaimsAndUpdateChannel),\n _marked4 = /*#__PURE__*/regeneratorRuntime.mark(watchUpdateChannelClaims);\n\nfunction newChannelRequest(action) {\n var _action$data, requestType, requestId, channelName, channelId, state, host, longId, shortId, _ref, _ref$data, channelKey, claimsData, _ref2;\n\n return regeneratorRuntime.wrap(function newChannelRequest$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _action$data = action.data, requestType = _action$data.requestType, requestId = _action$data.requestId, channelName = _action$data.channelName, channelId = _action$data.channelId;\n // put an action to update the request in redux\n\n _context.next = 3;\n return (0, _effects.put)((0, _show.onRequestUpdate)(requestType, requestId));\n\n case 3:\n _context.next = 5;\n return (0, _effects.select)(_show2.selectShowState);\n\n case 5:\n state = _context.sent;\n _context.next = 8;\n return (0, _effects.select)(_site.selectSiteHost);\n\n case 8:\n host = _context.sent;\n\n if (!state.requestList[requestId]) {\n _context.next = 11;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 11:\n // get channel long id\n longId = void 0, shortId = void 0;\n _context.prev = 12;\n _context.next = 15;\n return (0, _effects.call)(_channelApi.getChannelData, host, channelName, channelId);\n\n case 15:\n _ref = _context.sent;\n _ref$data = _ref.data;\n longId = _ref$data.longChannelClaimId;\n shortId = _ref$data.shortChannelClaimId;\n _context.next = 26;\n break;\n\n case 21:\n _context.prev = 21;\n _context.t0 = _context['catch'](12);\n _context.next = 25;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t0.message));\n\n case 25:\n return _context.abrupt('return', _context.sent);\n\n case 26:\n // store the request in the channel requests list\n channelKey = 'c#' + channelName + '#' + longId;\n _context.next = 29;\n return (0, _effects.put)((0, _show.addRequestToRequestList)(requestId, null, channelKey));\n\n case 29:\n if (!state.channelList[channelKey]) {\n _context.next = 31;\n break;\n }\n\n return _context.abrupt('return', null);\n\n case 31:\n // get channel claims data\n claimsData = void 0;\n _context.prev = 32;\n _context.next = 35;\n return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, channelName, 1);\n\n case 35:\n _ref2 = _context.sent;\n claimsData = _ref2.data;\n _context.next = 44;\n break;\n\n case 39:\n _context.prev = 39;\n _context.t1 = _context['catch'](32);\n _context.next = 43;\n return (0, _effects.put)((0, _show.onRequestError)(_context.t1.message));\n\n case 43:\n return _context.abrupt('return', _context.sent);\n\n case 44:\n _context.next = 46;\n return (0, _effects.put)((0, _show.addNewChannelToChannelList)(channelKey, channelName, shortId, longId, claimsData));\n\n case 46:\n _context.next = 48;\n return (0, _effects.put)((0, _show.onRequestError)(null));\n\n case 48:\n case 'end':\n return _context.stop();\n }\n }\n }, _marked, this, [[12, 21], [32, 39]]);\n}\n\nfunction watchNewChannelRequest() {\n return regeneratorRuntime.wrap(function watchNewChannelRequest$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return (0, _effects.takeLatest)(actions.CHANNEL_REQUEST_NEW, newChannelRequest);\n\n case 2:\n case 'end':\n return _context2.stop();\n }\n }\n }, _marked2, this);\n};\n\nfunction getNewClaimsAndUpdateChannel(action) {\n var _action$data2, channelKey, name, longId, page, host, claimsData, _ref3;\n\n return regeneratorRuntime.wrap(function getNewClaimsAndUpdateChannel$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _action$data2 = action.data, channelKey = _action$data2.channelKey, name = _action$data2.name, longId = _action$data2.longId, page = _action$data2.page;\n _context3.next = 3;\n return (0, _effects.select)(_site.selectSiteHost);\n\n case 3:\n host = _context3.sent;\n claimsData = void 0;\n _context3.prev = 5;\n _context3.next = 8;\n return (0, _effects.call)(_channelApi.getChannelClaims, host, longId, name, page);\n\n case 8:\n _ref3 = _context3.sent;\n claimsData = _ref3.data;\n _context3.next = 17;\n break;\n\n case 12:\n _context3.prev = 12;\n _context3.t0 = _context3['catch'](5);\n _context3.next = 16;\n return (0, _effects.put)((0, _show.onRequestError)(_context3.t0.message));\n\n case 16:\n return _context3.abrupt('return', _context3.sent);\n\n case 17:\n _context3.next = 19;\n return (0, _effects.put)((0, _show.updateChannelClaims)(channelKey, claimsData));\n\n case 19:\n case 'end':\n return _context3.stop();\n }\n }\n }, _marked3, this, [[5, 12]]);\n}\n\nfunction watchUpdateChannelClaims() {\n return regeneratorRuntime.wrap(function watchUpdateChannelClaims$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.next = 2;\n return (0, _effects.takeLatest)(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel);\n\n case 2:\n case 'end':\n return _context4.stop();\n }\n }\n }, _marked4, this);\n}\n\n/***/ }),\n/* 162 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getChannelData = getChannelData;\nexports.getChannelClaims = getChannelClaims;\n\nvar _request = __webpack_require__(8);\n\nvar _request2 = _interopRequireDefault(_request);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getChannelData(host, id, name) {\n if (!id) id = 'none';\n var url = host + '/api/channel/data/' + name + '/' + id;\n return (0, _request2.default)(url);\n};\n\nfunction getChannelClaims(host, longId, name, page) {\n if (!page) page = 1;\n var url = host + '/api/channel/claims/' + name + '/' + longId + '/' + page;\n return (0, _request2.default)(url);\n};\n\n/***/ }),\n/* 163 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar handlePageRender = __webpack_require__(101);\n\nmodule.exports = function (app) {\n // a catch-all route if someone visits a page that does not exist\n app.use('*', function (req, res) {\n // send response\n handlePageRender(req, res);\n });\n};\n\n/***/ }),\n/* 164 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _require = __webpack_require__(165),\n logLevel = _require.logLevel;\n\nmodule.exports = function (winston) {\n // configure\n winston.configure({\n transports: [new winston.transports.Console({\n level: logLevel,\n timestamp: false,\n colorize: true,\n prettyPrint: true,\n handleExceptions: true,\n humanReadableUnhandledException: true\n })]\n });\n // test all the log levels\n winston.error('Level 0');\n winston.warn('Level 1');\n winston.info('Level 2');\n winston.verbose('Level 3');\n winston.debug('Level 4');\n winston.silly('Level 5');\n};\n\n/***/ }),\n/* 165 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar loggerConfig = {\n logLevel: 'debug' // options: silly, debug, verbose, info\n};\n\nmodule.exports = loggerConfig;\n\n/***/ }),\n/* 166 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar winstonSlackWebHook = __webpack_require__(167).SlackWebHook;\nvar slackConfig = __webpack_require__(93);\n\nmodule.exports = function (winston) {\n var slackWebHook = slackConfig.slackWebHook,\n slackErrorChannel = slackConfig.slackErrorChannel,\n slackInfoChannel = slackConfig.slackInfoChannel;\n\n if (slackWebHook) {\n // add a transport for errors to slack\n if (slackErrorChannel) {\n winston.add(winstonSlackWebHook, {\n name: 'slack-errors-transport',\n level: 'warn',\n webhookUrl: slackWebHook,\n channel: slackErrorChannel,\n username: 'spee.ch',\n iconEmoji: ':face_with_head_bandage:'\n });\n };\n if (slackInfoChannel) {\n winston.add(winstonSlackWebHook, {\n name: 'slack-info-transport',\n level: 'info',\n webhookUrl: slackWebHook,\n channel: slackInfoChannel,\n username: 'spee.ch',\n iconEmoji: ':nerd_face:'\n });\n };\n // send test message\n winston.error('Slack \"error\" logging is online.');\n winston.info('Slack \"info\" logging is online.');\n } else {\n winston.warn('Slack logging is not enabled because no slackWebHook config var provided.');\n }\n};\n\n/***/ }),\n/* 167 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"winston-slack-webhook\");\n\n/***/ }),\n/* 168 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./\": 50,\n\t\"./ActiveStatusBar\": 24,\n\t\"./ActiveStatusBar/\": 24,\n\t\"./ActiveStatusBar/index\": 24,\n\t\"./ActiveStatusBar/index.jsx\": 24,\n\t\"./AssetPreview\": 34,\n\t\"./AssetPreview/\": 34,\n\t\"./AssetPreview/index\": 34,\n\t\"./AssetPreview/index.js\": 34,\n\t\"./AssetPreview/view\": 78,\n\t\"./AssetPreview/view.jsx\": 78,\n\t\"./ExpandingTextArea\": 36,\n\t\"./ExpandingTextArea/\": 36,\n\t\"./ExpandingTextArea/index\": 36,\n\t\"./ExpandingTextArea/index.jsx\": 36,\n\t\"./GAListener\": 13,\n\t\"./GAListener/\": 13,\n\t\"./GAListener/index\": 13,\n\t\"./GAListener/index.jsx\": 13,\n\t\"./InactiveStatusBar\": 25,\n\t\"./InactiveStatusBar/\": 25,\n\t\"./InactiveStatusBar/index\": 25,\n\t\"./InactiveStatusBar/index.jsx\": 25,\n\t\"./Logo\": 21,\n\t\"./Logo/\": 21,\n\t\"./Logo/index\": 21,\n\t\"./Logo/index.jsx\": 21,\n\t\"./NavBarChannelOptionsDropdown\": 22,\n\t\"./NavBarChannelOptionsDropdown/\": 22,\n\t\"./NavBarChannelOptionsDropdown/index\": 22,\n\t\"./NavBarChannelOptionsDropdown/index.jsx\": 22,\n\t\"./ProgressBar\": 10,\n\t\"./ProgressBar/\": 10,\n\t\"./ProgressBar/index\": 10,\n\t\"./ProgressBar/index.jsx\": 10,\n\t\"./PublishPreview\": 37,\n\t\"./PublishPreview/\": 37,\n\t\"./PublishPreview/index\": 37,\n\t\"./PublishPreview/index.jsx\": 37,\n\t\"./PublishUrlMiddleDisplay\": 38,\n\t\"./PublishUrlMiddleDisplay/\": 38,\n\t\"./PublishUrlMiddleDisplay/index\": 38,\n\t\"./PublishUrlMiddleDisplay/index.jsx\": 38,\n\t\"./SEO\": 7,\n\t\"./SEO/\": 7,\n\t\"./SEO/index\": 7,\n\t\"./SEO/index.js\": 7,\n\t\"./SEO/view\": 66,\n\t\"./SEO/view.jsx\": 66,\n\t\"./index\": 50,\n\t\"./index.js\": 50\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 168;\n\n/***/ }),\n/* 169 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./\": 52,\n\t\"./AssetDisplay\": 17,\n\t\"./AssetDisplay/\": 17,\n\t\"./AssetDisplay/index\": 17,\n\t\"./AssetDisplay/index.js\": 17,\n\t\"./AssetDisplay/view\": 72,\n\t\"./AssetDisplay/view.jsx\": 72,\n\t\"./AssetInfo\": 31,\n\t\"./AssetInfo/\": 31,\n\t\"./AssetInfo/index\": 31,\n\t\"./AssetInfo/index.js\": 31,\n\t\"./AssetInfo/view\": 75,\n\t\"./AssetInfo/view.jsx\": 75,\n\t\"./AssetTitle\": 30,\n\t\"./AssetTitle/\": 30,\n\t\"./AssetTitle/index\": 30,\n\t\"./AssetTitle/index.js\": 30,\n\t\"./AssetTitle/view\": 74,\n\t\"./AssetTitle/view.jsx\": 74,\n\t\"./ChannelClaimsDisplay\": 33,\n\t\"./ChannelClaimsDisplay/\": 33,\n\t\"./ChannelClaimsDisplay/index\": 33,\n\t\"./ChannelClaimsDisplay/index.js\": 33,\n\t\"./ChannelClaimsDisplay/view\": 77,\n\t\"./ChannelClaimsDisplay/view.jsx\": 77,\n\t\"./ChannelCreateForm\": 16,\n\t\"./ChannelCreateForm/\": 16,\n\t\"./ChannelCreateForm/index\": 16,\n\t\"./ChannelCreateForm/index.js\": 16,\n\t\"./ChannelCreateForm/view\": 69,\n\t\"./ChannelCreateForm/view.jsx\": 69,\n\t\"./ChannelLoginForm\": 15,\n\t\"./ChannelLoginForm/\": 15,\n\t\"./ChannelLoginForm/index\": 15,\n\t\"./ChannelLoginForm/index.js\": 15,\n\t\"./ChannelLoginForm/view\": 68,\n\t\"./ChannelLoginForm/view.jsx\": 68,\n\t\"./ChannelSelect\": 39,\n\t\"./ChannelSelect/\": 39,\n\t\"./ChannelSelect/index\": 39,\n\t\"./ChannelSelect/index.js\": 39,\n\t\"./ChannelSelect/view\": 81,\n\t\"./ChannelSelect/view.jsx\": 81,\n\t\"./Dropzone\": 18,\n\t\"./Dropzone/\": 18,\n\t\"./Dropzone/index\": 18,\n\t\"./Dropzone/index.js\": 18,\n\t\"./Dropzone/view\": 82,\n\t\"./Dropzone/view.jsx\": 82,\n\t\"./FourOhFourPage\": 35,\n\t\"./FourOhFourPage/\": 35,\n\t\"./FourOhFourPage/index\": 35,\n\t\"./FourOhFourPage/index.jsx\": 35,\n\t\"./FourOhFourPage/view\": 79,\n\t\"./FourOhFourPage/view.jsx\": 79,\n\t\"./NavBar\": 5,\n\t\"./NavBar/\": 5,\n\t\"./NavBar/index\": 5,\n\t\"./NavBar/index.js\": 5,\n\t\"./NavBar/view\": 65,\n\t\"./NavBar/view.jsx\": 65,\n\t\"./PublishDetails\": 40,\n\t\"./PublishDetails/\": 40,\n\t\"./PublishDetails/index\": 40,\n\t\"./PublishDetails/index.js\": 40,\n\t\"./PublishDetails/view\": 83,\n\t\"./PublishDetails/view.jsx\": 83,\n\t\"./PublishDisabledMessage\": 45,\n\t\"./PublishDisabledMessage/\": 45,\n\t\"./PublishDisabledMessage/index\": 45,\n\t\"./PublishDisabledMessage/index.js\": 45,\n\t\"./PublishDisabledMessage/view\": 88,\n\t\"./PublishDisabledMessage/view.jsx\": 88,\n\t\"./PublishMetadataInputs\": 44,\n\t\"./PublishMetadataInputs/\": 44,\n\t\"./PublishMetadataInputs/index\": 44,\n\t\"./PublishMetadataInputs/index.js\": 44,\n\t\"./PublishMetadataInputs/view\": 87,\n\t\"./PublishMetadataInputs/view.jsx\": 87,\n\t\"./PublishStatus\": 46,\n\t\"./PublishStatus/\": 46,\n\t\"./PublishStatus/index\": 46,\n\t\"./PublishStatus/index.js\": 46,\n\t\"./PublishStatus/view\": 89,\n\t\"./PublishStatus/view.jsx\": 89,\n\t\"./PublishThumbnailInput\": 43,\n\t\"./PublishThumbnailInput/\": 43,\n\t\"./PublishThumbnailInput/index\": 43,\n\t\"./PublishThumbnailInput/index.js\": 43,\n\t\"./PublishThumbnailInput/view\": 86,\n\t\"./PublishThumbnailInput/view.jsx\": 86,\n\t\"./PublishTitleInput\": 41,\n\t\"./PublishTitleInput/\": 41,\n\t\"./PublishTitleInput/index\": 41,\n\t\"./PublishTitleInput/index.js\": 41,\n\t\"./PublishTitleInput/view\": 84,\n\t\"./PublishTitleInput/view.jsx\": 84,\n\t\"./PublishTool\": 47,\n\t\"./PublishTool/\": 47,\n\t\"./PublishTool/index\": 47,\n\t\"./PublishTool/index.js\": 47,\n\t\"./PublishTool/view\": 90,\n\t\"./PublishTool/view.jsx\": 90,\n\t\"./PublishUrlInput\": 42,\n\t\"./PublishUrlInput/\": 42,\n\t\"./PublishUrlInput/index\": 42,\n\t\"./PublishUrlInput/index.js\": 42,\n\t\"./PublishUrlInput/view\": 85,\n\t\"./PublishUrlInput/view.jsx\": 85,\n\t\"./ShowAssetDetails\": 29,\n\t\"./ShowAssetDetails/\": 29,\n\t\"./ShowAssetDetails/index\": 29,\n\t\"./ShowAssetDetails/index.js\": 29,\n\t\"./ShowAssetDetails/view\": 73,\n\t\"./ShowAssetDetails/view.jsx\": 73,\n\t\"./ShowAssetLite\": 27,\n\t\"./ShowAssetLite/\": 27,\n\t\"./ShowAssetLite/index\": 27,\n\t\"./ShowAssetLite/index.js\": 27,\n\t\"./ShowAssetLite/view\": 71,\n\t\"./ShowAssetLite/view.jsx\": 71,\n\t\"./ShowChannel\": 32,\n\t\"./ShowChannel/\": 32,\n\t\"./ShowChannel/index\": 32,\n\t\"./ShowChannel/index.js\": 32,\n\t\"./ShowChannel/view\": 76,\n\t\"./ShowChannel/view.jsx\": 76,\n\t\"./index\": 52,\n\t\"./index.js\": 52\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 169;\n\n/***/ }),\n/* 170 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar LOAD_START = exports.LOAD_START = 'LOAD_START';\nvar LOADING = exports.LOADING = 'LOADING';\nvar PUBLISHING = exports.PUBLISHING = 'PUBLISHING';\nvar SUCCESS = exports.SUCCESS = 'SUCCESS';\nvar FAILED = exports.FAILED = 'FAILED';\n\n/***/ }),\n/* 171 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./\": 53,\n\t\"./AboutPage\": 20,\n\t\"./AboutPage/\": 20,\n\t\"./AboutPage/index\": 20,\n\t\"./AboutPage/index.jsx\": 20,\n\t\"./ErrorPage\": 12,\n\t\"./ErrorPage/\": 12,\n\t\"./ErrorPage/index\": 12,\n\t\"./ErrorPage/index.jsx\": 12,\n\t\"./HomePage\": 54,\n\t\"./HomePage/\": 54,\n\t\"./HomePage/index\": 54,\n\t\"./HomePage/index.jsx\": 54,\n\t\"./LoginPage\": 23,\n\t\"./LoginPage/\": 23,\n\t\"./LoginPage/index\": 23,\n\t\"./LoginPage/index.js\": 23,\n\t\"./LoginPage/view\": 67,\n\t\"./LoginPage/view.jsx\": 67,\n\t\"./ShowPage\": 26,\n\t\"./ShowPage/\": 26,\n\t\"./ShowPage/index\": 26,\n\t\"./ShowPage/index.js\": 26,\n\t\"./ShowPage/view\": 70,\n\t\"./ShowPage/view.jsx\": 70,\n\t\"./index\": 53,\n\t\"./index.js\": 53\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 171;\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// index.js"," \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 \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\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.l = 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// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 115);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ab248b8a96a96b3ce431","module.exports = require(\"react\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react\"\n// module id = 0\n// module chunks = 0","module.exports = require(\"react-redux\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-redux\"\n// module id = 1\n// module chunks = 0","module.exports = require(\"winston\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"winston\"\n// module id = 2\n// module chunks = 0","function SiteConfig () {\n this.analytics = {\n googleId: 'default',\n };\n this.assetDefaults = {\n description: 'An asset published on Spee.ch',\n thumbnail : 'https://spee.ch/assets/img/video_thumb_default.png',\n title : 'Spee.ch',\n };\n this.auth = {\n sessionKey: 'default',\n };\n this.customComponents = {\n components: {},\n containers: {},\n pages : {},\n };\n this.details = {\n description: 'Open-source, decentralized image and video sharing.',\n host : 'default',\n port : 3000,\n title : 'Spee.ch',\n twitter : '@spee_ch',\n };\n this.publishing = {\n additionalClaimAddresses: [],\n disabled : false,\n disabledMessage : 'Please check back soon.',\n primaryClaimAddress : 'default',\n thumbnailChannel : 'default',\n thumbnailChannelId : 'default',\n uploadDirectory : '/home/lbry/Uploads',\n };\n this.configure = (config) => {\n if (!config) {\n return console.log('No site config received.');\n }\n const { analytics, assetDefaults, auth, customComponents, details, publishing } = config;\n this.analytics = analytics;\n this.assetDefaults = assetDefaults;\n this.auth = auth;\n this.details = details;\n this.publishing = publishing;\n this.customComponents = customComponents;\n };\n};\n\nmodule.exports = new SiteConfig();\n\n\n\n// WEBPACK FOOTER //\n// ./config/siteConfig.js","module.exports = require(\"react-router-dom\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-router-dom\"\n// module id = 4\n// module chunks = 0","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport {updateSelectedChannel} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, site }) => {\n return {\n channelName : channel.loggedInChannel.name,\n channelShortId: channel.loggedInChannel.shortId,\n channelLongId : channel.loggedInChannel.longId,\n siteDescription: site.description,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onChannelLogin: (name, shortId, longId) => {\n dispatch(updateLoggedInChannel(name, shortId, longId));\n dispatch(updateSelectedChannel(name));\n },\n onChannelLogout: () => {\n dispatch(updateLoggedInChannel(null, null, null));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/NavBar/index.js","import * as actions from 'constants/publish_action_types';\n\n// export action creators\nexport function selectFile (file) {\n return {\n type: actions.FILE_SELECTED,\n data: file,\n };\n};\n\nexport function clearFile () {\n return {\n type: actions.FILE_CLEAR,\n };\n};\n\nexport function updateMetadata (name, value) {\n return {\n type: actions.METADATA_UPDATE,\n data: {\n name,\n value,\n },\n };\n};\n\nexport function updateClaim (value) {\n return {\n type: actions.CLAIM_UPDATE,\n data: value,\n };\n};\n\nexport function setPublishInChannel (channel) {\n return {\n type: actions.SET_PUBLISH_IN_CHANNEL,\n channel,\n };\n};\n\nexport function updatePublishStatus (status, message) {\n return {\n type: actions.PUBLISH_STATUS_UPDATE,\n data: {\n status,\n message,\n },\n };\n};\n\nexport function updateError (name, value) {\n return {\n type: actions.ERROR_UPDATE,\n data: {\n name,\n value,\n },\n };\n};\n\nexport function updateSelectedChannel (channelName) {\n return {\n type: actions.SELECTED_CHANNEL_UPDATE,\n data: channelName,\n };\n};\n\nexport function toggleMetadataInputs (showMetadataInputs) {\n return {\n type: actions.TOGGLE_METADATA_INPUTS,\n data: showMetadataInputs,\n };\n};\n\nexport function onNewThumbnail (file) {\n return {\n type: actions.THUMBNAIL_NEW,\n data: file,\n };\n};\n\nexport function startPublish (history) {\n return {\n type: actions.PUBLISH_START,\n data: { history },\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./client/actions/publish.js","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ site }) => {\n const { defaultDescription, defaultThumbnail, description: siteDescription, host: siteHost, title: siteTitle, twitter: siteTwitter } = site;\n return {\n defaultDescription,\n defaultThumbnail,\n siteDescription,\n siteHost,\n siteTitle,\n siteTwitter,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/SEO/index.js","import 'cross-fetch/polyfill';\n\n/**\n * Parses the JSON returned by a network request\n *\n * @param {object} response A response from a network request\n *\n * @return {object} The parsed JSON from the request\n */\nfunction parseJSON (response) {\n if (response.status === 204 || response.status === 205) {\n return null;\n }\n return response.json();\n}\n\n/**\n * Parses the status returned by a network request\n *\n * @param {object} response A response from a network request\n * @param {object} response The parsed JSON from the network request\n *\n * @return {object | undefined} Returns object with status and statusText, or undefined\n */\nfunction checkStatus (response, jsonResponse) {\n if (response.status >= 200 && response.status < 300) {\n return jsonResponse;\n }\n const error = new Error(jsonResponse.message);\n error.response = response;\n throw error;\n}\n\n/**\n * Requests a URL, returning a promise\n *\n * @param {string} url The URL we want to request\n * @param {object} [options] The options we want to pass to \"fetch\"\n *\n * @return {object} The response data\n */\n\nexport default function request (url, options) {\n return fetch(url, options)\n .then(response => {\n return Promise.all([response, parseJSON(response)]);\n })\n .then(([response, jsonResponse]) => {\n return checkStatus(response, jsonResponse);\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./client/utils/request.js","const Sequelize = require('sequelize');\nconst logger = require('winston');\n\nconsole.log('exporting sequelize models');\nconst { database, username, password } = require('../../config/mysqlConfig');\nconst db = {};\n// set sequelize options\nconst sequelize = new Sequelize(database, username, password, {\n host : 'localhost',\n dialect : 'mysql',\n dialectOptions: {decimalNumbers: true}, // fix to ensure DECIMAL will not be stored as a string\n logging : false,\n pool : {\n max : 5,\n min : 0,\n idle : 10000,\n acquire: 10000,\n },\n});\n\n// establish mysql connection\nsequelize\n .authenticate()\n .then(() => {\n logger.info('Sequelize has established mysql connection successfully.');\n })\n .catch(err => {\n logger.error('Sequelize was unable to connect to the database:', err);\n });\n\n// manually add each model to the db object\nconst Certificate = require('./certificate.js');\nconst Channel = require('./channel.js');\nconst Claim = require('./claim.js');\nconst File = require('./file.js');\nconst Request = require('./request.js');\nconst User = require('./user.js');\ndb['Certificate'] = sequelize.import('Certificate', Certificate);\ndb['Channel'] = sequelize.import('Channel', Channel);\ndb['Claim'] = sequelize.import('Claim', Claim);\ndb['File'] = sequelize.import('File', File);\ndb['Request'] = sequelize.import('Request', Request);\ndb['User'] = sequelize.import('User', User);\n\n// run model.association for each model in the db object that has an association\nObject.keys(db).forEach(modelName => {\n if (db[modelName].associate) {\n logger.info('Associating model:', modelName);\n db[modelName].associate(db);\n }\n});\n\ndb.sequelize = sequelize;\ndb.Sequelize = Sequelize;\n\n// add an 'upsert' method to the db object\ndb.upsert = (Model, values, condition, tableName) => {\n return Model\n .findOne({\n where: condition,\n })\n .then(obj => {\n if (obj) { // update\n logger.debug(`updating record in db.${tableName}`);\n return obj.update(values);\n } else { // insert\n logger.debug(`creating record in db.${tableName}`);\n return Model.create(values);\n }\n })\n .catch(function (error) {\n logger.error(`${tableName}.upsert error`, error);\n throw error;\n });\n};\n\nmodule.exports = db;\n\n\n\n// WEBPACK FOOTER //\n// ./server/models/index.js","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ActiveStatusBar from 'components/ActiveStatusBar';\nimport InactiveStatusBar from 'components/InactiveStatusBar';\n\nclass ProgressBar extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n bars : [],\n index : 0,\n incrementer: 1,\n };\n this.createBars = this.createBars.bind(this);\n this.startProgressBar = this.startProgressBar.bind(this);\n this.updateProgressBar = this.updateProgressBar.bind(this);\n this.stopProgressBar = this.stopProgressBar.bind(this);\n }\n componentDidMount () {\n this.createBars();\n this.startProgressBar();\n }\n componentWillUnmount () {\n this.stopProgressBar();\n }\n createBars () {\n const bars = [];\n for (let i = 0; i <= this.props.size; i++) {\n bars.push({isActive: false});\n }\n this.setState({ bars });\n }\n startProgressBar () {\n this.updateInterval = setInterval(this.updateProgressBar.bind(this), 300);\n };\n updateProgressBar () {\n let index = this.state.index;\n let incrementer = this.state.incrementer;\n let bars = this.state.bars;\n // flip incrementer if necessary, to stay in bounds\n if ((index < 0) || (index > this.props.size)) {\n incrementer = incrementer * -1;\n index += incrementer;\n }\n // update the indexed bar\n if (incrementer > 0) {\n bars[index].isActive = true;\n } else {\n bars[index].isActive = false;\n };\n // increment index\n index += incrementer;\n // update state\n this.setState({\n bars,\n incrementer,\n index,\n });\n };\n stopProgressBar () {\n clearInterval(this.updateInterval);\n };\n render () {\n return (\n
\n {this.state.bars.map((bar, index) => bar.isActive ? : )}\n
\n );\n }\n};\n\nProgressBar.propTypes = {\n size: PropTypes.number.isRequired,\n};\n\nexport default ProgressBar;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/ProgressBar/index.jsx","import * as actions from 'constants/show_action_types';\n\nimport { CHANNEL, ASSET_LITE, ASSET_DETAILS } from 'constants/show_request_types';\n\n// basic request parsing\nexport function onHandleShowPageUri (params) {\n return {\n type: actions.HANDLE_SHOW_URI,\n data: params,\n };\n};\n\nexport function onRequestError (error) {\n return {\n type: actions.REQUEST_ERROR,\n data: error,\n };\n};\n\nexport function onNewChannelRequest (channelName, channelId) {\n const requestType = CHANNEL;\n const requestId = `cr#${channelName}#${channelId}`;\n return {\n type: actions.CHANNEL_REQUEST_NEW,\n data: { requestType, requestId, channelName, channelId },\n };\n};\n\nexport function onNewAssetRequest (name, id, channelName, channelId, extension) {\n const requestType = extension ? ASSET_LITE : ASSET_DETAILS;\n const requestId = `ar#${name}#${id}#${channelName}#${channelId}`;\n return {\n type: actions.ASSET_REQUEST_NEW,\n data: {\n requestType,\n requestId,\n name,\n modifier: {\n id,\n channel: {\n name: channelName,\n id : channelId,\n },\n },\n },\n };\n};\n\nexport function onRequestUpdate (requestType, requestId) {\n return {\n type: actions.REQUEST_UPDATE,\n data: {\n requestType,\n requestId,\n },\n };\n};\n\nexport function addRequestToRequestList (id, error, key) {\n return {\n type: actions.REQUEST_LIST_ADD,\n data: { id, error, key },\n };\n};\n\n// asset actions\n\nexport function addAssetToAssetList (id, error, name, claimId, shortId, claimData) {\n return {\n type: actions.ASSET_ADD,\n data: { id, error, name, claimId, shortId, claimData },\n };\n}\n\n// channel actions\n\nexport function addNewChannelToChannelList (id, name, shortId, longId, claimsData) {\n return {\n type: actions.CHANNEL_ADD,\n data: { id, name, shortId, longId, claimsData },\n };\n};\n\nexport function onUpdateChannelClaims (channelKey, name, longId, page) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_ASYNC,\n data: {channelKey, name, longId, page},\n };\n};\n\nexport function updateChannelClaims (channelListId, claimsData) {\n return {\n type: actions.CHANNEL_CLAIMS_UPDATE_SUCCESS,\n data: {channelListId, claimsData},\n };\n};\n\n// display a file\n\nexport function fileRequested (name, claimId) {\n return {\n type: actions.FILE_REQUESTED,\n data: { name, claimId },\n };\n};\n\nexport function updateFileAvailability (status) {\n return {\n type: actions.FILE_AVAILABILITY_UPDATE,\n data: status,\n };\n};\n\nexport function updateDisplayAssetError (error) {\n return {\n type: actions.DISPLAY_ASSET_ERROR,\n data: error,\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/actions/show.js","import React from 'react';\nimport PropTypes from 'prop-types';\nimport NavBar from 'containers/NavBar';\n\nclass ErrorPage extends React.Component {\n render () {\n const { error } = this.props;\n return (\n
\n \n
\n

{error}

\n
\n
\n );\n }\n};\n\nErrorPage.propTypes = {\n error: PropTypes.string.isRequired,\n};\n\nexport default ErrorPage;\n\n\n\n// WEBPACK FOOTER //\n// ./client/pages/ErrorPage/index.jsx","import React from 'react';\nimport GoogleAnalytics from 'react-ga';\nimport { withRouter } from 'react-router-dom';\nconst { analytics: { googleId } } = require('../../../config/siteConfig.js');\n\nGoogleAnalytics.initialize(googleId);\n\nclass GAListener extends React.Component {\n componentDidMount () {\n this.sendPageView(this.props.history.location);\n this.props.history.listen(this.sendPageView);\n }\n\n sendPageView (location) {\n GoogleAnalytics.set({ page: location.pathname });\n GoogleAnalytics.pageview(location.pathname);\n }\n\n render () {\n return this.props.children;\n }\n}\n\nexport default withRouter(GAListener);\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/GAListener/index.jsx","module.exports = require(\"prop-types\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"prop-types\"\n// module id = 14\n// module chunks = 0","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from '../../actions/publish';\n\nconst mapDispatchToProps = dispatch => {\n return {\n onChannelLogin: (name, shortId, longId) => {\n dispatch(updateLoggedInChannel(name, shortId, longId));\n dispatch(updateSelectedChannel(name));\n },\n };\n};\n\nexport default connect(null, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ChannelLoginForm/index.js","import { connect } from 'react-redux';\nimport { updateLoggedInChannel } from 'actions/channel';\nimport View from './view';\nimport {updateSelectedChannel} from 'actions/publish';\n\nconst mapDispatchToProps = dispatch => {\n return {\n onChannelLogin: (name, shortId, longId) => {\n dispatch(updateLoggedInChannel(name, shortId, longId));\n dispatch(updateSelectedChannel(name));\n },\n };\n};\n\nexport default connect(null, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ChannelCreateForm/index.js","import { connect } from 'react-redux';\nimport View from './view';\nimport { fileRequested } from 'actions/show';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n // select error and status\n const error = show.displayAsset.error;\n const status = show.displayAsset.status;\n // select asset\n const asset = selectAsset(show);\n // return props\n return {\n error,\n status,\n asset,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onFileRequest: (name, claimId) => {\n dispatch(fileRequested(name, claimId));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/AssetDisplay/index.js","import { connect } from 'react-redux';\nimport { selectFile, updateError, clearFile } from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n file : publish.file,\n thumbnail: publish.thumbnail,\n fileError: publish.error.file,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n selectFile: (file) => {\n dispatch(selectFile(file));\n },\n setFileError: (value) => {\n dispatch(clearFile());\n dispatch(updateError('file', value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/Dropzone/index.js","// request actions\nexport const HANDLE_SHOW_URI = 'HANDLE_SHOW_URI';\nexport const REQUEST_ERROR = 'REQUEST_ERROR';\nexport const REQUEST_UPDATE = 'REQUEST_UPDATE';\nexport const ASSET_REQUEST_NEW = 'ASSET_REQUEST_NEW';\nexport const CHANNEL_REQUEST_NEW = 'CHANNEL_REQUEST_NEW';\nexport const REQUEST_LIST_ADD = 'REQUEST_LIST_ADD';\n\n// asset actions\nexport const ASSET_ADD = `ASSET_ADD`;\n\n// channel actions\nexport const CHANNEL_ADD = 'CHANNEL_ADD';\n\nexport const CHANNEL_CLAIMS_UPDATE_ASYNC = 'CHANNEL_CLAIMS_UPDATE_ASYNC';\nexport const CHANNEL_CLAIMS_UPDATE_SUCCESS = 'CHANNEL_CLAIMS_UPDATE_SUCCESS';\n\n// asset/file display actions\nexport const FILE_REQUESTED = 'FILE_REQUESTED';\nexport const FILE_AVAILABILITY_UPDATE = 'FILE_AVAILABILITY_UPDATE';\nexport const DISPLAY_ASSET_ERROR = 'DISPLAY_ASSET_ERROR';\n\n\n\n// WEBPACK FOOTER //\n// ./client/constants/show_action_types.js","import React from 'react';\nimport NavBar from 'containers/NavBar';\nimport SEO from 'components/SEO';\n\nclass AboutPage extends React.Component {\n render () {\n return (\n
\n \n \n
\n
\n
\n

Spee.ch is an open-source project. Please contribute to the existing site, or fork it and make your own.

\n

TWITTER

\n

GITHUB

\n

DISCORD CHANNEL

\n

DOCUMENTATION

\n
\n
\n
\n

Spee.ch is a media-hosting site that reads from and publishes content to the LBRY blockchain.

\n

Spee.ch is a hosting service, but with the added benefit that it stores your content on a decentralized network of computers -- the LBRY network. This means that your images are stored in multiple locations without a single point of failure.

\n

Contribute

\n

If you have an idea for your own spee.ch-like site on top of LBRY, fork our github repo and go to town!

\n

If you want to improve spee.ch, join our discord channel or solve one of our github issues.

\n
\n
\n
\n
\n );\n }\n};\n\nexport default AboutPage;\n\n\n\n// WEBPACK FOOTER //\n// ./client/pages/AboutPage/index.jsx","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nfunction Logo () {\n return (\n \n \n Logo\n Spee.ch logo\n \n \n \n Spee<h\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Logo;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/Logo/index.jsx","import React from 'react';\n\nfunction NavBarChannelDropdown ({ channelName, handleSelection, defaultSelection, VIEW, LOGOUT }) {\n return (\n \n );\n};\n\nexport default NavBarChannelDropdown;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/NavBarChannelOptionsDropdown/index.jsx","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ channel }) => {\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/pages/LoginPage/index.js","import React from 'react';\n\nconst ActiveStatusBar = () => {\n return | ;\n};\n\nexport default ActiveStatusBar;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/ActiveStatusBar/index.jsx","import React from 'react';\n\nconst InactiveStatusBar = () => {\n return | ;\n};\n\nexport default InactiveStatusBar;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/InactiveStatusBar/index.jsx","import { connect } from 'react-redux';\nimport { onHandleShowPageUri } from 'actions/show';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n return {\n error : show.request.error,\n requestType: show.request.type,\n };\n};\n\nconst mapDispatchToProps = {\n onHandleShowPageUri,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/pages/ShowPage/index.js","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select request info\n const requestId = show.request.id;\n // select asset info\n let asset;\n const request = show.requestList[requestId] || null;\n const assetList = show.assetList;\n if (request && assetList) {\n const assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ShowAssetLite/index.js","export const selectAsset = (show) => {\n const request = show.requestList[show.request.id];\n const assetKey = request.key;\n return show.assetList[assetKey];\n};\n\nexport const selectShowState = (state) => {\n return state.show;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/selectors/show.js","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select request info\n const requestId = show.request.id;\n // select asset info\n let asset;\n const request = show.requestList[requestId] || null;\n const assetList = show.assetList;\n if (request && assetList) {\n const assetKey = request.key; // note: just store this in the request\n asset = assetList[assetKey] || null;\n };\n // return props\n return {\n asset,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ShowAssetDetails/index.js","import { connect } from 'react-redux';\nimport View from './view';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n const { claimData: { title } } = selectAsset(show);\n return {\n title,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/AssetTitle/index.js","import { connect } from 'react-redux';\nimport View from './view';\nimport { selectAsset } from 'selectors/show';\n\nconst mapStateToProps = ({ show }) => {\n // select asset\n const asset = selectAsset(show);\n // return props\n return {\n asset,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/AssetInfo/index.js","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select request info\n const requestId = show.request.id;\n // select request\n const previousRequest = show.requestList[requestId] || null;\n // select channel\n let channel;\n if (previousRequest) {\n const channelKey = previousRequest.key;\n channel = show.channelList[channelKey] || null;\n }\n return {\n channel,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ShowChannel/index.js","import { connect } from 'react-redux';\nimport { onUpdateChannelClaims } from 'actions/show';\nimport View from './view';\n\nconst mapStateToProps = ({ show }) => {\n // select channel key\n const request = show.requestList[show.request.id];\n const channelKey = request.key;\n // select channel claims\n const channel = show.channelList[channelKey] || null;\n // return props\n return {\n channelKey,\n channel,\n };\n};\n\nconst mapDispatchToProps = {\n onUpdateChannelClaims,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ChannelClaimsDisplay/index.js","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({site: {defaults: { defaultThumbnail }}}) => {\n return {\n defaultThumbnail,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/AssetPreview/index.js","import { connect } from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ site: { host, title } }) => {\n return {\n host,\n title,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/FourOhFourPage/index.jsx","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nclass ExpandingTextarea extends Component {\n constructor (props) {\n super(props);\n this._handleChange = this._handleChange.bind(this);\n }\n componentDidMount () {\n this.adjustTextarea({});\n }\n _handleChange (event) {\n const { onChange } = this.props;\n if (onChange) onChange(event);\n this.adjustTextarea(event);\n }\n adjustTextarea ({ target = this.el }) {\n target.style.height = 0;\n target.style.height = `${target.scrollHeight}px`;\n }\n render () {\n const { ...rest } = this.props;\n return (\n this.el = x}\n onChange={this._handleChange}\n />\n );\n }\n}\n\nExpandingTextarea.propTypes = {\n onChange: PropTypes.func,\n};\n\nexport default ExpandingTextarea;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/ExpandingTextArea/index.jsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass PublishPreview extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n imgSource : '',\n defaultThumbnail: '/assets/img/video_thumb_default.png',\n };\n }\n componentDidMount () {\n this.setPreviewImageSource(this.props.file);\n }\n componentWillReceiveProps (newProps) {\n if (newProps.file !== this.props.file) {\n this.setPreviewImageSource(newProps.file);\n }\n if (newProps.thumbnail !== this.props.thumbnail) {\n if (newProps.thumbnail) {\n this.setPreviewImageSourceFromFile(newProps.thumbnail);\n } else {\n this.setState({imgSource: this.state.defaultThumbnail});\n }\n }\n }\n setPreviewImageSourceFromFile (file) {\n const previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = () => {\n this.setState({imgSource: previewReader.result});\n };\n }\n setPreviewImageSource (file) {\n if (file.type !== 'video/mp4') {\n this.setPreviewImageSourceFromFile(file);\n } else {\n if (this.props.thumbnail) {\n this.setPreviewImageSourceFromFile(this.props.thumbnail);\n }\n this.setState({imgSource: this.state.defaultThumbnail});\n }\n }\n render () {\n return (\n \n );\n }\n};\n\nPublishPreview.propTypes = {\n dimPreview: PropTypes.bool.isRequired,\n file : PropTypes.object.isRequired,\n thumbnail : PropTypes.object,\n};\n\nexport default PublishPreview;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/PublishPreview/index.jsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nfunction UrlMiddle ({publishInChannel, selectedChannel, loggedInChannelName, loggedInChannelShortId}) {\n if (publishInChannel) {\n if (selectedChannel === loggedInChannelName) {\n return {loggedInChannelName}:{loggedInChannelShortId} /;\n }\n return @channelSelect a channel below /;\n }\n return (\n xyzThis will be a random id /\n );\n}\n\nUrlMiddle.propTypes = {\n publishInChannel : PropTypes.bool.isRequired,\n loggedInChannelName : PropTypes.string,\n loggedInChannelShortId: PropTypes.string,\n};\n\nexport default UrlMiddle;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/PublishUrlMiddleDisplay/index.jsx","import {connect} from 'react-redux';\nimport {setPublishInChannel, updateSelectedChannel, updateError} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n return {\n loggedInChannelName: channel.loggedInChannel.name,\n publishInChannel : publish.publishInChannel,\n selectedChannel : publish.selectedChannel,\n channelError : publish.error.channel,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onPublishInChannelChange: (value) => {\n dispatch(updateError('channel', null));\n dispatch(setPublishInChannel(value));\n },\n onChannelSelect: (value) => {\n dispatch(updateError('channel', null));\n dispatch(updateSelectedChannel(value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ChannelSelect/index.js","import {connect} from 'react-redux';\nimport {clearFile, startPublish} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n return {\n file: publish.file,\n };\n};\n\nconst mapDispatchToProps = {\n clearFile,\n startPublish,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishDetails/index.js","import {connect} from 'react-redux';\nimport {updateMetadata} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n title: publish.metadata.title,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onMetadataChange: (name, value) => {\n dispatch(updateMetadata(name, value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishTitleInput/index.js","import {updateClaim, updateError} from 'actions/publish';\nimport {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ channel, publish }) => {\n return {\n loggedInChannelName : channel.loggedInChannel.name,\n loggedInChannelShortId: channel.loggedInChannel.shortId,\n fileName : publish.file.name,\n publishInChannel : publish.publishInChannel,\n selectedChannel : publish.selectedChannel,\n claim : publish.claim,\n urlError : publish.error.url,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onClaimChange: (value) => {\n dispatch(updateClaim(value));\n dispatch(updateError('publishSubmit', null));\n },\n onUrlError: (value) => {\n dispatch(updateError('url', value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishUrlInput/index.js","import { connect } from 'react-redux';\nimport { onNewThumbnail } from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish: { file } }) => {\n return {\n file,\n };\n};\n\nconst mapDispatchToProps = {\n onNewThumbnail,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishThumbnailInput/index.js","import {connect} from 'react-redux';\nimport {updateMetadata, toggleMetadataInputs} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n showMetadataInputs: publish.showMetadataInputs,\n description : publish.metadata.description,\n license : publish.metadata.license,\n nsfw : publish.metadata.nsfw,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n onMetadataChange: (name, value) => {\n dispatch(updateMetadata(name, value));\n },\n onToggleMetadataInputs: (value) => {\n dispatch(toggleMetadataInputs(value));\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishMetadataInputs/index.js","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n message: publish.disabledMessage,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishDisabledMessage/index.js","import {connect} from 'react-redux';\nimport {clearFile} from 'actions/publish';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n status : publish.status.status,\n message: publish.status.message,\n };\n};\n\nconst mapDispatchToProps = {\n clearFile,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishStatus/index.js","import {connect} from 'react-redux';\nimport View from './view';\n\nconst mapStateToProps = ({ publish }) => {\n return {\n disabled: publish.disabled,\n file : publish.file,\n status : publish.status.status,\n };\n};\n\nexport default connect(mapStateToProps, null)(View);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishTool/index.js","module.exports = require(\"react-helmet\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-helmet\"\n// module id = 48\n// module chunks = 0","module.exports = require(\"redux-saga/effects\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux-saga/effects\"\n// module id = 49\n// module chunks = 0","const Path = require('path');\nconst { getSubDirectoryNames } = require('build/getFolderNames.js');\n\nconst thisFolder = Path.resolve(__dirname, 'client/components/');\nlet modules = {};\n\ngetSubDirectoryNames(thisFolder)\n .forEach((name) => {\n modules[name] = require(`./${name}`).default;\n });\n\nmodule.exports = modules;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/index.js","module.exports = require(\"path\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"path\"\n// module id = 51\n// module chunks = 0","const Path = require('path');\nconst { getSubDirectoryNames } = require('build/getFolderNames.js');\nconst thisFolder = Path.resolve(__dirname, 'client/containers/');\n\nlet modules = {};\n\ngetSubDirectoryNames(thisFolder)\n .forEach((name) => {\n modules[name] = require(`./${name}`).default;\n });\n\nmodule.exports = modules;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/index.js","const Path = require('path');\nconst { getSubDirectoryNames } = require('build/getFolderNames.js');\nconst thisFolder = Path.resolve(__dirname, 'client/pages/');\n\nlet modules = {};\n\ngetSubDirectoryNames(thisFolder)\n .forEach((name) => {\n modules[name] = require(`./${name}`).default;\n });\n\nmodule.exports = modules;\n\n\n\n// WEBPACK FOOTER //\n// ./client/pages/index.js","import React from 'react';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport PublishTool from 'containers/PublishTool';\n\nclass HomePage extends React.Component {\n render () {\n return (\n
\n \n \n
\n \n
\n
\n );\n }\n};\n\nexport default HomePage;\n\n\n\n// WEBPACK FOOTER //\n// ./client/pages/HomePage/index.jsx","const axios = require('axios');\nconst logger = require('winston');\nconst { api: { apiHost, apiPort } } = require('../../config/lbryConfig.js');\nconst lbryApiUri = 'http://' + apiHost + ':' + apiPort;\nconst { chooseGaLbrynetPublishLabel, sendGATimingEvent } = require('./googleAnalytics.js');\n\nconst handleLbrynetResponse = ({ data }, resolve, reject) => {\n logger.debug('lbry api data:', data);\n if (data.result) {\n // check for an error\n if (data.result.error) {\n logger.debug('Lbrynet api error:', data.result.error);\n reject(new Error(data.result.error));\n return;\n };\n resolve(data.result);\n return;\n }\n // fallback in case it just timed out\n reject(JSON.stringify(data));\n};\n\nmodule.exports = {\n publishClaim (publishParams) {\n logger.debug(`lbryApi >> Publishing claim to \"${publishParams.name}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'publish',\n params: publishParams,\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'publish', chooseGaLbrynetPublishLabel(publishParams), gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getClaim (uri) {\n logger.debug(`lbryApi >> Getting Claim for \"${uri}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'get',\n params: { uri, timeout: 20 },\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'getClaim', 'GET', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getClaimList (claimName) {\n logger.debug(`lbryApi >> Getting claim_list for \"${claimName}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'claim_list',\n params: { name: claimName },\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'getClaimList', 'CLAIM_LIST', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n resolveUri (uri) {\n logger.debug(`lbryApi >> Resolving URI for \"${uri}\"`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'resolve',\n params: { uri },\n })\n .then(({ data }) => {\n sendGATimingEvent('lbrynet', 'resolveUri', 'RESOLVE', gaStartTime, Date.now());\n if (data.result[uri].error) { // check for errors\n reject(data.result[uri].error);\n } else { // if no errors, resolve\n resolve(data.result[uri]);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getDownloadDirectory () {\n logger.debug('lbryApi >> Retrieving the download directory path from lbry daemon...');\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'settings_get',\n })\n .then(({ data }) => {\n sendGATimingEvent('lbrynet', 'getDownloadDirectory', 'SETTINGS_GET', gaStartTime, Date.now());\n if (data.result) {\n resolve(data.result.download_directory);\n } else {\n return new Error('Successfully connected to lbry daemon, but unable to retrieve the download directory.');\n }\n })\n .catch(error => {\n logger.error('Lbrynet Error:', error);\n resolve('/home/lbry/Downloads/');\n });\n });\n },\n createChannel (name) {\n logger.debug(`lbryApi >> Creating channel for ${name}...`);\n const gaStartTime = Date.now();\n return new Promise((resolve, reject) => {\n axios\n .post(lbryApiUri, {\n method: 'channel_new',\n params: {\n channel_name: name,\n amount : 0.1,\n },\n })\n .then(response => {\n sendGATimingEvent('lbrynet', 'createChannel', 'CHANNEL_NEW', gaStartTime, Date.now());\n handleLbrynetResponse(response, resolve, reject);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/lbryApi.js","const logger = require('winston');\nconst ua = require('universal-analytics');\nconst { analytics : { googleId }, details: { title } } = require('../../config/siteConfig.js');\n\nfunction createServeEventParams (headers, ip, originalUrl) {\n return {\n eventCategory : 'client requests',\n eventAction : 'serve request',\n eventLabel : originalUrl,\n ipOverride : ip,\n userAgentOverride: headers['user-agent'],\n };\n};\n\nfunction createPublishTimingEventParams (category, variable, label, startTime, endTime) {\n const duration = endTime - startTime;\n return {\n userTimingCategory : category,\n userTimingVariableName: variable,\n userTimingTime : duration,\n userTimingLabel : label,\n };\n};\n\nfunction sendGoogleAnalyticsEvent (ip, params) {\n const visitorId = ip.replace(/\\./g, '-');\n const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.event(params, (err) => {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n });\n};\n\nfunction sendGoogleAnalyticsTiming (visitorId, params) {\n const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });\n visitor.timing(params, (err) => {\n if (err) {\n logger.error('Google Analytics Event Error >>', err);\n }\n logger.debug(`Timing event successfully sent to google analytics`);\n });\n};\n\nmodule.exports = {\n sendGAServeEvent (headers, ip, originalUrl) {\n const params = createServeEventParams(headers, ip, originalUrl);\n sendGoogleAnalyticsEvent(ip, params);\n },\n sendGATimingEvent (category, variable, label, startTime, endTime) {\n const params = createPublishTimingEventParams(category, variable, label, startTime, endTime);\n sendGoogleAnalyticsTiming(title, params);\n },\n chooseGaLbrynetPublishLabel ({ channel_name: channelName, channel_id: channelId }) {\n return (channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM');\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/googleAnalytics.js","module.exports = require(\"redux\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux\"\n// module id = 57\n// module chunks = 0","const { customComponents } = require('../../config/siteConfig.js');\n\nfunction getDeepestChildValue (parent, childrenKeys) {\n let childKey = childrenKeys.shift(); // .shift() retrieves the first element of array and removes it from array\n let child = parent[childKey];\n if (childrenKeys.length >= 1) {\n return getDeepestChildValue(child, childrenKeys);\n }\n return child;\n}\n\nexport const dynamicImport = (filePath) => {\n // validate inputs\n if (!filePath) {\n throw new Error('no file path provided to dynamicImport()');\n }\n if (typeof filePath !== 'string') {\n console.log('dynamicImport > filePath:', filePath);\n console.log('dynamicImport > filePath type:', typeof filePath);\n throw new Error('file path provided to dynamicImport() must be a string');\n }\n if (!customComponents) {\n return require(`${filePath}`);\n }\n // split out the file folders // filter out any empty or white-space-only strings\n const folders = filePath.split('/').filter(folderName => folderName.replace(/\\s/g, '').length);\n // check for the component corresponding to file path in the site config object\n // i.e. customComponents[folders[0]][folders[2][...][folders[n]]\n const component = getDeepestChildValue(customComponents, folders);\n if (component) {\n return component; // return custom component\n } else {\n return require(`${filePath}`);\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/utils/dynamicImport.js","const createBasicCanonicalLink = (page, siteHost) => {\n return `${siteHost}/${page}`;\n};\n\nconst createAssetCanonicalLink = (asset, siteHost) => {\n let channelName, certificateId, name, claimId;\n if (asset.claimData) {\n ({ channelName, certificateId, name, claimId } = asset.claimData);\n };\n if (channelName) {\n return `${siteHost}/${channelName}:${certificateId}/${name}`;\n };\n return `${siteHost}/${claimId}/${name}`;\n};\n\nconst createChannelCanonicalLink = (channel, siteHost) => {\n const { name, longId } = channel;\n return `${siteHost}/${name}:${longId}`;\n};\n\nexport const createCanonicalLink = (asset, channel, page, siteHost) => {\n if (asset) {\n return createAssetCanonicalLink(asset, siteHost);\n }\n if (channel) {\n return createChannelCanonicalLink(channel, siteHost);\n }\n return createBasicCanonicalLink(page, siteHost);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/utils/canonicalLink.js","module.exports = {\n validateFile (file) {\n if (!file) {\n throw new Error('no file provided');\n }\n if (/'/.test(file.name)) {\n throw new Error('apostrophes are not allowed in the file name');\n }\n // validate size and type\n switch (file.type) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n if (file.size > 10000000) {\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n throw new Error('Sorry, GIFs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/utils/file.js","module.exports = {\n REGEXP_INVALID_CLAIM : /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS : /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR : '@',\n parseIdentifier : function (identifier) {\n const componentsRegex = new RegExp(\n '([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, value, modifierSeperator, modifier] = componentsRegex // eslint-disable-line no-unused-vars\n .exec(identifier)\n .map(match => match || null);\n\n // Validate and process name\n if (!value) {\n throw new Error(`Check your URL. No channel name provided before \"${modifierSeperator}\"`);\n }\n const isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n const channelName = isChannel ? value : null;\n let claimId;\n if (isChannel) {\n if (!channelName) {\n throw new Error('Check your URL. No channel name after \"@\".');\n }\n const nameBadChars = (channelName).match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error(`Check your URL. Invalid characters in channel name: \"${nameBadChars.join(', ')}\".`);\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n let channelClaimId;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error(`Check your URL. No modifier provided after separator \"${modifierSeperator}\"`);\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error(`Check your URL. The \"${modifierSeperator}\" modifier is not currently supported`);\n }\n }\n return {\n isChannel,\n channelName,\n channelClaimId: channelClaimId || null,\n claimId : claimId || null,\n };\n },\n parseClaim: function (name) {\n const componentsRegex = new RegExp(\n '([^:$#/.]*)' + // name (stops at the first extension)\n '([:$#.]?)([^/]*)' // extension separator, extension (stops at the first path separator or end)\n );\n const [proto, claimName, extensionSeperator, extension] = componentsRegex // eslint-disable-line no-unused-vars\n .exec(name)\n .map(match => match || null);\n\n // Validate and process name\n if (!claimName) {\n throw new Error('Check your URL. No claim name provided before \".\"');\n }\n const nameBadChars = (claimName).match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error(`Check your URL. Invalid characters in claim name: \"${nameBadChars.join(', ')}\".`);\n }\n // Validate and process extension\n if (extensionSeperator) {\n if (!extension) {\n throw new Error(`Check your URL. No file extension provided after separator \"${extensionSeperator}\".`);\n }\n if (extensionSeperator !== '.') {\n throw new Error(`Check your URL. The \"${extensionSeperator}\" separator is not supported in the claim name.`);\n }\n }\n return {\n claimName,\n extension: extension || null,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/utils/lbryUri.js","const determineOgThumbnailContentType = (thumbnail) => {\n if (thumbnail) {\n const fileExt = thumbnail.substring(thumbnail.lastIndexOf('.'));\n switch (fileExt) {\n case 'jpeg':\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'mp4':\n return 'video/mp4';\n default:\n return 'image/jpeg';\n }\n }\n return '';\n};\n\nconst createBasicMetaTags = (siteHost, siteDescription, siteTitle, siteTwitter) => {\n return [\n {property: 'og:title', content: siteTitle},\n {property: 'og:url', content: siteHost},\n {property: 'og:site_name', content: siteTitle},\n {property: 'og:description', content: siteDescription},\n {property: 'twitter:site', content: siteTwitter},\n {property: 'twitter:card', content: 'summary'},\n ];\n};\n\nconst createChannelMetaTags = (siteTitle, siteHost, siteTwitter, channel) => {\n const { name, longId } = channel;\n return [\n {property: 'og:title', content: `${name} on ${siteTitle}`},\n {property: 'og:url', content: `${siteHost}/${name}:${longId}`},\n {property: 'og:site_name', content: siteTitle},\n {property: 'og:description', content: `${name}, a channel on ${siteTitle}`},\n {property: 'twitter:site', content: siteTwitter},\n {property: 'twitter:card', content: 'summary'},\n ];\n};\n\nconst createAssetMetaTags = (siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail) => {\n const { claimData } = asset;\n const { contentType } = claimData;\n const embedUrl = `${siteHost}/${claimData.claimId}/${claimData.name}`;\n const showUrl = `${siteHost}/${claimData.claimId}/${claimData.name}`;\n const source = `${siteHost}/${claimData.claimId}/${claimData.name}.${claimData.fileExt}`;\n const ogTitle = claimData.title || claimData.name;\n const ogDescription = claimData.description || defaultDescription;\n const ogThumbnailContentType = determineOgThumbnailContentType(claimData.thumbnail);\n const ogThumbnail = claimData.thumbnail || defaultThumbnail;\n const metaTags = [\n {property: 'og:title', content: ogTitle},\n {property: 'og:url', content: showUrl},\n {property: 'og:site_name', content: siteTitle},\n {property: 'og:description', content: ogDescription},\n {property: 'og:image:width', content: 600},\n {property: 'og:image:height', content: 315},\n {property: 'twitter:site', content: siteTwitter},\n ];\n if (contentType === 'video/mp4' || contentType === 'video/webm') {\n metaTags.push({property: 'og:video', content: source});\n metaTags.push({property: 'og:video:secure_url', content: source});\n metaTags.push({property: 'og:video:type', content: contentType});\n metaTags.push({property: 'og:image', content: ogThumbnail});\n metaTags.push({property: 'og:image:type', content: ogThumbnailContentType});\n metaTags.push({property: 'og:type', content: 'video'});\n metaTags.push({property: 'twitter:card', content: 'player'});\n metaTags.push({property: 'twitter:player', content: embedUrl});\n metaTags.push({property: 'twitter:player:width', content: 600});\n metaTags.push({property: 'twitter:text:player_width', content: 600});\n metaTags.push({property: 'twitter:player:height', content: 337});\n metaTags.push({property: 'twitter:player:stream', content: source});\n metaTags.push({property: 'twitter:player:stream:content_type', content: contentType});\n } else {\n metaTags.push({property: 'og:image', content: source});\n metaTags.push({property: 'og:image:type', content: contentType});\n metaTags.push({property: 'og:type', content: 'article'});\n metaTags.push({property: 'twitter:card', content: 'summary_large_image'});\n }\n return metaTags;\n};\n\nexport const createMetaTags = (siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail) => {\n if (asset) {\n return createAssetMetaTags(siteHost, siteTitle, siteTwitter, asset, defaultDescription, defaultThumbnail);\n };\n if (channel) {\n return createChannelMetaTags(siteHost, siteTitle, siteTwitter, channel);\n };\n return createBasicMetaTags(siteDescription, siteHost, siteTitle, siteTwitter);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/utils/metaTags.js","export const createPageTitle = (siteTitle, pageTitle) => {\n if (!pageTitle) {\n return `${siteTitle}`;\n }\n return `${siteTitle} - ${pageTitle}`;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/utils/pageTitle.js","import * as actions from 'constants/channel_action_types';\n\n// export action creators\n\nexport function updateLoggedInChannel (name, shortId, longId) {\n return {\n type: actions.CHANNEL_UPDATE,\n data: {\n name,\n shortId,\n longId,\n },\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/actions/channel.js","import React from 'react';\nimport { NavLink, withRouter } from 'react-router-dom';\nimport Logo from 'components/Logo';\nimport NavBarChannelDropdown from 'components/NavBarChannelOptionsDropdown';\nimport request from 'utils/request';\n\nconst VIEW = 'VIEW';\nconst LOGOUT = 'LOGOUT';\n\nclass NavBar extends React.Component {\n constructor (props) {\n super(props);\n this.checkForLoggedInUser = this.checkForLoggedInUser.bind(this);\n this.logoutUser = this.logoutUser.bind(this);\n this.handleSelection = this.handleSelection.bind(this);\n }\n componentDidMount () {\n // check to see if the user is already logged in\n this.checkForLoggedInUser();\n }\n checkForLoggedInUser () {\n const params = {credentials: 'include'};\n request('/user', params)\n .then(({ data }) => {\n this.props.onChannelLogin(data.channelName, data.shortChannelId, data.channelClaimId);\n })\n .catch(error => {\n console.log('/user error:', error.message);\n });\n }\n logoutUser () {\n const params = {credentials: 'include'};\n request('/logout', params)\n .then(() => {\n this.props.onChannelLogout();\n })\n .catch(error => {\n console.log('/logout error', error.message);\n });\n }\n handleSelection (event) {\n const value = event.target.selectedOptions[0].value;\n switch (value) {\n case LOGOUT:\n this.logoutUser();\n break;\n case VIEW:\n // redirect to channel page\n this.props.history.push(`/${this.props.channelName}:${this.props.channelLongId}`);\n break;\n default:\n break;\n }\n }\n render () {\n const { siteDescription } = this.props;\n return (\n
\n
\n \n
\n {siteDescription}\n
\n
\n Publish\n About\n { this.props.channelName ? (\n \n ) : (\n Channel\n )}\n
\n
\n
\n );\n }\n}\n\nexport default withRouter(NavBar);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/NavBar/view.jsx","import React from 'react';\nimport Helmet from 'react-helmet';\nimport PropTypes from 'prop-types';\n\nimport { createPageTitle } from 'utils/pageTitle';\nimport { createMetaTags } from 'utils/metaTags';\nimport { createCanonicalLink } from 'utils/canonicalLink';\n\nclass SEO extends React.Component {\n render () {\n // props from state\n const { defaultDescription, defaultThumbnail, siteDescription, siteHost, siteTitle, siteTwitter } = this.props;\n // props from parent\n const { asset, channel, pageUri } = this.props;\n let { pageTitle } = this.props;\n // create page title, tags, and canonical link\n pageTitle = createPageTitle(siteTitle, pageTitle);\n const metaTags = createMetaTags(siteDescription, siteHost, siteTitle, siteTwitter, asset, channel, defaultDescription, defaultThumbnail);\n const canonicalLink = createCanonicalLink(asset, channel, pageUri, siteHost);\n // render results\n return (\n \n );\n }\n};\n\nSEO.propTypes = {\n pageTitle: PropTypes.string,\n pageUri : PropTypes.string,\n channel : PropTypes.object,\n asset : PropTypes.object,\n};\n\nexport default SEO;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/SEO/view.jsx","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport ChannelLoginForm from 'containers/ChannelLoginForm';\nimport ChannelCreateForm from 'containers/ChannelCreateForm';\n\nclass LoginPage extends React.Component {\n componentWillReceiveProps (newProps) {\n // re-route the user to the homepage if the user is logged in\n if (newProps.loggedInChannelName !== this.props.loggedInChannelName) {\n this.props.history.push(`/`);\n }\n }\n render () {\n return (\n
\n \n \n
\n
\n
\n

Channels allow you to publish and group content under an identity. You can create a channel for yourself, or share one with like-minded friends. You can create 1 channel, or 100, so whether you're documenting important events, or making a public repository for cat gifs (password: '1234'), try creating a channel for it!

\n
\n
\n
\n

Log in to an existing channel:

\n \n

Create a brand new channel:

\n \n
\n
\n
\n
\n );\n }\n};\n\nexport default withRouter(LoginPage);\n\n\n\n// WEBPACK FOOTER //\n// ./client/pages/LoginPage/view.jsx","import React from 'react';\nimport request from 'utils/request';\n\nclass ChannelLoginForm extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n error : null,\n name : '',\n password: '',\n };\n this.handleInput = this.handleInput.bind(this);\n this.loginToChannel = this.loginToChannel.bind(this);\n }\n handleInput (event) {\n const name = event.target.name;\n const value = event.target.value;\n this.setState({[name]: value});\n }\n loginToChannel (event) {\n event.preventDefault();\n const params = {\n method : 'POST',\n body : JSON.stringify({username: this.state.name, password: this.state.password}),\n headers: new Headers({\n 'Content-Type': 'application/json',\n }),\n credentials: 'include',\n };\n request('login', params)\n .then(({success, channelName, shortChannelId, channelClaimId, message}) => {\n if (success) {\n this.props.onChannelLogin(channelName, shortChannelId, channelClaimId);\n } else {\n this.setState({'error': message});\n };\n })\n .catch(error => {\n if (error.message) {\n this.setState({'error': error.message});\n } else {\n this.setState({'error': error});\n }\n });\n }\n render () {\n return (\n
\n
\n
\n \n
\n
\n @\n \n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n { this.state.error ? (\n

{this.state.error}

\n ) : (\n

Enter the name and password for your channel

\n )}\n
\n \n
\n
\n );\n }\n}\n\nexport default ChannelLoginForm;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ChannelLoginForm/view.jsx","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport request from 'utils/request';\n\nclass ChannelCreateForm extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n error : null,\n channel : '',\n password: '',\n status : null,\n };\n this.handleChannelInput = this.handleChannelInput.bind(this);\n this.handleInput = this.handleInput.bind(this);\n this.createChannel = this.createChannel.bind(this);\n }\n cleanseChannelInput (input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n handleChannelInput (event) {\n let value = event.target.value;\n value = this.cleanseChannelInput(value);\n this.setState({channel: value});\n if (value) {\n this.updateIsChannelAvailable(value);\n } else {\n this.setState({error: 'Please enter a channel name'});\n }\n }\n handleInput (event) {\n const name = event.target.name;\n const value = event.target.value;\n this.setState({[name]: value});\n }\n updateIsChannelAvailable (channel) {\n const channelWithAtSymbol = `@${channel}`;\n request(`/api/channel/availability/${channelWithAtSymbol}`)\n .then(() => {\n this.setState({'error': null});\n })\n .catch((error) => {\n this.setState({'error': error.message});\n });\n }\n checkIsChannelAvailable (channel) {\n const channelWithAtSymbol = `@${channel}`;\n return request(`/api/channel/availability/${channelWithAtSymbol}`);\n }\n checkIsPasswordProvided (password) {\n return new Promise((resolve, reject) => {\n if (!password || password.length < 1) {\n return reject(new Error('Please provide a password'));\n }\n resolve();\n });\n }\n makePublishChannelRequest (username, password) {\n const params = {\n method : 'POST',\n body : JSON.stringify({username, password}),\n headers: new Headers({\n 'Content-Type': 'application/json',\n }),\n credentials: 'include',\n };\n return new Promise((resolve, reject) => {\n request('/signup', params)\n .then(result => {\n return resolve(result);\n })\n .catch(error => {\n reject(new Error(`Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ${error.message}`));\n });\n });\n }\n createChannel (event) {\n event.preventDefault();\n this.checkIsPasswordProvided(this.state.password)\n .then(() => {\n return this.checkIsChannelAvailable(this.state.channel);\n })\n .then(() => {\n this.setState({status: 'We are publishing your new channel. Sit tight...'});\n return this.makePublishChannelRequest(this.state.channel, this.state.password);\n })\n .then(result => {\n this.setState({status: null});\n this.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId);\n })\n .catch((error) => {\n if (error.message) {\n this.setState({'error': error.message, status: null});\n } else {\n this.setState({'error': error, status: null});\n };\n });\n }\n render () {\n return (\n
\n { !this.state.status ? (\n
\n
\n
\n \n
\n
\n @\n \n { (this.state.channel && !this.state.error) && {'\\u2713'} }\n { this.state.error && {'\\u2716'} }\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n {this.state.error ? (\n

{this.state.error}

\n ) : (\n

Choose a name and password for your channel

\n )}\n
\n \n
\n
\n ) : (\n
\n

{this.state.status}

\n \n
\n )}\n
\n );\n }\n}\n\nexport default ChannelCreateForm;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ChannelCreateForm/view.jsx","import React from 'react';\nimport ErrorPage from 'pages/ErrorPage';\nimport ShowAssetLite from 'containers/ShowAssetLite';\nimport ShowAssetDetails from 'containers/ShowAssetDetails';\nimport ShowChannel from 'containers/ShowChannel';\n\nimport { CHANNEL, ASSET_LITE, ASSET_DETAILS } from 'constants/show_request_types';\n\nclass ShowPage extends React.Component {\n componentDidMount () {\n this.props.onHandleShowPageUri(this.props.match.params);\n }\n componentWillReceiveProps (nextProps) {\n if (nextProps.match.params !== this.props.match.params) {\n this.props.onHandleShowPageUri(nextProps.match.params);\n }\n }\n render () {\n const { error, requestType } = this.props;\n if (error) {\n return (\n \n );\n }\n switch (requestType) {\n case CHANNEL:\n return ;\n case ASSET_LITE:\n return ;\n case ASSET_DETAILS:\n return ;\n default:\n return

loading...

;\n }\n }\n};\n\nexport default ShowPage;\n\n\n\n// WEBPACK FOOTER //\n// ./client/pages/ShowPage/view.jsx","import React from 'react';\nimport SEO from 'components/SEO';\nimport { Link } from 'react-router-dom';\nimport AssetDisplay from 'containers/AssetDisplay';\n\nclass ShowLite extends React.Component {\n render () {\n const { asset } = this.props;\n if (asset) {\n const { name, claimId } = asset.claimData;\n return (\n
\n \n \n hosted\n via Spee.ch\n
\n );\n }\n return (\n
\n

loading asset data...

\n
\n );\n }\n};\n\nexport default ShowLite;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ShowAssetLite/view.jsx","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport { LOCAL_CHECK, UNAVAILABLE, ERROR, AVAILABLE } from 'constants/asset_display_states';\n\nclass AssetDisplay extends React.Component {\n componentDidMount () {\n const { asset: { claimData: { name, claimId } } } = this.props;\n this.props.onFileRequest(name, claimId);\n }\n render () {\n const { status, error, asset: { claimData: { name, claimId, contentType, fileExt, thumbnail } } } = this.props;\n return (\n
\n {(status === LOCAL_CHECK) &&\n
\n

Checking to see if Spee.ch has your asset locally...

\n
\n }\n {(status === UNAVAILABLE) &&\n
\n

Sit tight, we're searching the LBRY blockchain for your asset!

\n \n

Curious what magic is happening here? Learn more.

\n
\n }\n {(status === ERROR) &&\n
\n

Unfortunately, we couldn't download your asset from LBRY. You can help us out by sharing the below error message in the LBRY discord.

\n

{error}

\n
\n }\n {(status === AVAILABLE) &&\n (() => {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n return (\n \n );\n case 'image/gif':\n return (\n \n );\n case 'video/mp4':\n return (\n \n );\n default:\n return (\n

Unsupported file type

\n );\n }\n })()\n }\n
\n );\n }\n};\n\nexport default AssetDisplay;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/AssetDisplay/view.jsx","import React from 'react';\nimport SEO from 'components/SEO';\nimport NavBar from 'containers/NavBar';\nimport ErrorPage from 'pages/ErrorPage';\nimport AssetTitle from 'containers/AssetTitle';\nimport AssetDisplay from 'containers/AssetDisplay';\nimport AssetInfo from 'containers/AssetInfo';\n\nclass ShowAssetDetails extends React.Component {\n render () {\n const { asset } = this.props;\n if (asset) {\n const { claimData: { name } } = asset;\n return (\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n );\n };\n return (\n \n );\n }\n};\n\nexport default ShowAssetDetails;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ShowAssetDetails/view.jsx","import React from 'react';\n\nconst AssetTitle = ({ title }) => {\n return (\n
\n {title}\n
\n );\n};\n\nexport default AssetTitle;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/AssetTitle/view.jsx","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nclass AssetInfo extends React.Component {\n constructor (props) {\n super(props);\n this.copyToClipboard = this.copyToClipboard.bind(this);\n }\n copyToClipboard (event) {\n var elementToCopy = event.target.dataset.elementtocopy;\n var element = document.getElementById(elementToCopy);\n element.select();\n try {\n document.execCommand('copy');\n } catch (err) {\n this.setState({error: 'Oops, unable to copy'});\n }\n }\n render () {\n const { asset: { shortId, claimData : { channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } } = this.props;\n return (\n
\n {channelName &&\n
\n
\n Channel:\n
\n
\n {channelName}\n
\n
\n }\n\n {description &&\n
\n {description}\n
\n }\n\n
\n
\n
\n Share:\n
\n
\n \n twitter\n facebook\n tumblr\n reddit\n
\n
\n
\n
\n\n
\n \n );\n }\n};\n\nexport default AssetInfo;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/AssetInfo/view.jsx","import React from 'react';\nimport SEO from 'components/SEO';\nimport ErrorPage from 'pages/ErrorPage';\nimport NavBar from 'containers/NavBar';\nimport ChannelClaimsDisplay from 'containers/ChannelClaimsDisplay';\n\nclass ShowChannel extends React.Component {\n render () {\n const { channel } = this.props;\n if (channel) {\n const { name, longId, shortId } = channel;\n return (\n
\n \n \n
\n
\n

channel name: {name}

\n

full channel id: {longId}

\n

short channel id: {shortId}

\n
\n
\n \n
\n
\n
\n );\n };\n return (\n \n );\n }\n};\n\nexport default ShowChannel;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ShowChannel/view.jsx","import React from 'react';\nimport AssetPreview from 'components/AssetPreview';\n\nclass ChannelClaimsDisplay extends React.Component {\n constructor (props) {\n super(props);\n this.showNextResultsPage = this.showNextResultsPage.bind(this);\n this.showPreviousResultsPage = this.showPreviousResultsPage.bind(this);\n }\n showPreviousResultsPage () {\n const { channel: { claimsData: { currentPage } } } = this.props;\n const previousPage = parseInt(currentPage) - 1;\n this.showNewPage(previousPage);\n }\n showNextResultsPage () {\n const { channel: { claimsData: { currentPage } } } = this.props;\n const nextPage = parseInt(currentPage) + 1;\n this.showNewPage(nextPage);\n }\n showNewPage (page) {\n const { channelKey, channel: { name, longId } } = this.props;\n this.props.onUpdateChannelClaims(channelKey, name, longId, page);\n }\n render () {\n const { channel: { claimsData: { claims, currentPage, totalPages } } } = this.props;\n return (\n
\n {(claims.length > 0) ? (\n
\n {claims.map((claim, index) => )}\n
\n {(currentPage > 1) &&\n \n }\n {(currentPage < totalPages) &&\n \n }\n
\n
\n ) : (\n

There are no claims in this channel

\n )}\n
\n );\n }\n};\n\nexport default ChannelClaimsDisplay;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ChannelClaimsDisplay/view.jsx","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nconst AssetPreview = ({ defaultThumbnail, claimData: { name, claimId, fileExt, contentType, thumbnail } }) => {\n const directSourceLink = `${claimId}/${name}.${fileExt}`;\n const showUrlLink = `/${claimId}/${name}`;\n return (\n
\n \n {(() => {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n case 'image/gif':\n return (\n \n );\n case 'video/mp4':\n return (\n \n );\n default:\n return (\n

unsupported file type

\n );\n }\n })()}\n \n
\n );\n};\n\nexport default AssetPreview;\n\n\n\n// WEBPACK FOOTER //\n// ./client/components/AssetPreview/view.jsx","import React from 'react';\nimport NavBar from 'containers/NavBar';\nimport Helmet from 'react-helmet';\n\nclass FourOhForPage extends React.Component {\n render () {\n const {title, host} = this.props;\n return (\n
\n \n {title} - 404\n \n \n \n
\n

404

\n

That page does not exist

\n
\n
\n );\n }\n};\n\nexport default FourOhForPage;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/FourOhFourPage/view.jsx","const { lstatSync, readdirSync } = require('fs');\nconst { join } = require('path');\n\nexport const getSubDirectoryNames = (root) => {\n return readdirSync(root)\n .filter(name => {\n const fullPath = join(root, name);\n return lstatSync(fullPath).isDirectory();\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./build/getFolderNames.js","import React from 'react';\nimport ChannelLoginForm from 'containers/ChannelLoginForm';\nimport ChannelCreateForm from 'containers/ChannelCreateForm';\nimport * as states from 'constants/publish_channel_select_states';\n\nclass ChannelSelect extends React.Component {\n constructor (props) {\n super(props);\n this.toggleAnonymousPublish = this.toggleAnonymousPublish.bind(this);\n this.handleSelection = this.handleSelection.bind(this);\n }\n toggleAnonymousPublish (event) {\n const value = event.target.value;\n if (value === 'anonymous') {\n this.props.onPublishInChannelChange(false);\n } else {\n this.props.onPublishInChannelChange(true);\n }\n }\n handleSelection (event) {\n const selectedOption = event.target.selectedOptions[0].value;\n this.props.onChannelSelect(selectedOption);\n }\n render () {\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n { this.props.channelError ? (\n

{this.props.channelError}

\n ) : (\n

Publish anonymously or in a channel

\n )}\n
\n { this.props.publishInChannel && (\n
\n
\n \n
\n \n
\n { (this.props.selectedChannel === states.LOGIN) && }\n { (this.props.selectedChannel === states.CREATE) && }\n
\n )}\n
\n );\n }\n}\n\nexport default ChannelSelect;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/ChannelSelect/view.jsx","import React from 'react';\nimport { validateFile } from 'utils/file';\nimport PublishPreview from 'components/PublishPreview';\n\nclass Dropzone extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n dragOver : false,\n mouseOver : false,\n dimPreview: false,\n };\n this.handleDrop = this.handleDrop.bind(this);\n this.handleDragOver = this.handleDragOver.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n this.handleDragEnter = this.handleDragEnter.bind(this);\n this.handleDragLeave = this.handleDragLeave.bind(this);\n this.handleMouseEnter = this.handleMouseEnter.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleFileInput = this.handleFileInput.bind(this);\n this.chooseFile = this.chooseFile.bind(this);\n }\n handleDrop (event) {\n event.preventDefault();\n this.setState({dragOver: false});\n // if dropped items aren't files, reject them\n const dt = event.dataTransfer;\n if (dt.items) {\n if (dt.items[0].kind === 'file') {\n const droppedFile = dt.items[0].getAsFile();\n this.chooseFile(droppedFile);\n }\n }\n }\n handleDragOver (event) {\n event.preventDefault();\n }\n handleDragEnd (event) {\n var dt = event.dataTransfer;\n if (dt.items) {\n for (var i = 0; i < dt.items.length; i++) {\n dt.items.remove(i);\n }\n } else {\n event.dataTransfer.clearData();\n }\n }\n handleDragEnter () {\n this.setState({dragOver: true, dimPreview: true});\n }\n handleDragLeave () {\n this.setState({dragOver: false, dimPreview: false});\n }\n handleMouseEnter () {\n this.setState({mouseOver: true, dimPreview: true});\n }\n handleMouseLeave () {\n this.setState({mouseOver: false, dimPreview: false});\n }\n handleClick (event) {\n event.preventDefault();\n document.getElementById('file_input').click();\n }\n handleFileInput (event) {\n event.preventDefault();\n const fileList = event.target.files;\n this.chooseFile(fileList[0]);\n }\n chooseFile (file) {\n if (file) {\n try {\n validateFile(file); // validate the file's name, type, and size\n } catch (error) {\n return this.props.setFileError(error.message);\n }\n // stage it so it will be ready when the publish button is clicked\n this.props.selectFile(file);\n }\n }\n render () {\n return (\n
\n
\n \n
\n
\n {this.props.file ? (\n
\n \n
\n { this.state.dragOver ? (\n
\n

Drop it.

\n
\n ) : (\n null\n )}\n { this.state.mouseOver ? (\n
\n

{this.props.fileError}

\n

Drag & drop image or video here to publish

\n

OR

\n

CHOOSE FILE

\n
\n ) : (\n null\n )}\n
\n
\n ) : (\n
\n { this.state.dragOver ? (\n
\n

Drop it.

\n
\n ) : (\n
\n

{this.props.fileError}

\n

Drag & drop image or video here to publish

\n

OR

\n

CHOOSE FILE

\n
\n )}\n
\n )}\n
\n
\n );\n }\n};\n\nexport default Dropzone;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/Dropzone/view.jsx","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport Dropzone from 'containers/Dropzone';\nimport PublishTitleInput from 'containers/PublishTitleInput';\nimport PublishUrlInput from 'containers/PublishUrlInput';\nimport PublishThumbnailInput from 'containers/PublishThumbnailInput';\nimport PublishMetadataInputs from 'containers/PublishMetadataInputs';\nimport ChannelSelect from 'containers/ChannelSelect';\n\nclass PublishDetails extends React.Component {\n constructor (props) {\n super(props)\n this.onPublishSubmit = this.onPublishSubmit.bind(this);\n }\n onPublishSubmit () {\n this.props.startPublish(this.props.history);\n }\n render () {\n return (\n
\n
\n \n
\n {/* left column */}\n
\n
\n \n
\n
\n {/* right column */}\n
\n
\n
\n \n
\n
\n \n
\n { (this.props.file.type === 'video/mp4') && (\n
\n \n
\n )}\n
\n \n
\n
\n \n
\n
\n \n
\n
\n

By clicking 'Publish', you affirm that you have the rights to publish this content to the LBRY network, and that you understand the properties of publishing it to a decentralized, user-controlled network. Read more.

\n
\n
\n
\n
\n );\n }\n};\n\nexport default withRouter(PublishDetails);\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishDetails/view.jsx","import React from 'react';\n\nclass PublishTitleInput extends React.Component {\n constructor (props) {\n super(props);\n this.handleInput = this.handleInput.bind(this);\n }\n handleInput (e) {\n const name = e.target.name;\n const value = e.target.value;\n this.props.onMetadataChange(name, value);\n }\n render () {\n return (\n \n );\n }\n}\n\nexport default PublishTitleInput;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishTitleInput/view.jsx","import React from 'react';\nimport request from 'utils/request';\nimport UrlMiddle from 'components/PublishUrlMiddleDisplay';\n\nclass PublishUrlInput extends React.Component {\n constructor (props) {\n super(props);\n this.handleInput = this.handleInput.bind(this);\n }\n componentDidMount () {\n const { claim, fileName } = this.props;\n if (!claim) {\n this.setClaimName(fileName);\n }\n }\n componentWillReceiveProps ({ claim, fileName }) {\n // if a new file was chosen, update the claim name\n if (fileName !== this.props.fileName) {\n return this.setClaimName(fileName);\n }\n // if the claim has updated, check its availability\n if (claim !== this.props.claim) {\n this.validateClaim(claim);\n }\n }\n handleInput (event) {\n let value = event.target.value;\n value = this.cleanseInput(value);\n // update the state\n this.props.onClaimChange(value);\n }\n cleanseInput (input) {\n input = input.replace(/\\s+/g, '-'); // replace spaces with dashes\n input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-'\n return input;\n }\n setClaimName (fileName) {\n const fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));\n const cleanClaimName = this.cleanseInput(fileNameWithoutEnding);\n this.props.onClaimChange(cleanClaimName);\n }\n validateClaim (claim) {\n if (!claim) {\n return this.props.onUrlError('Enter a url above');\n }\n request(`/api/claim/availability/${claim}`)\n .then(() => {\n this.props.onUrlError(null);\n })\n .catch((error) => {\n this.props.onUrlError(error.message);\n });\n }\n render () {\n const { claim, loggedInChannelName, loggedInChannelShortId, publishInChannel, selectedChannel, urlError } = this.props;\n return (\n
\n
\n spee.ch / \n \n \n { (claim && !urlError) && {'\\u2713'} }\n { urlError && {'\\u2716'} }\n
\n
\n { urlError ? (\n

{urlError}

\n ) : (\n

Choose a custom url

\n )}\n
\n
\n );\n }\n}\n\nexport default PublishUrlInput;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishUrlInput/view.jsx","import React from 'react';\n\nfunction dataURItoBlob(dataURI) {\n // convert base64/URLEncoded data component to raw binary data held in a string\n let byteString = atob(dataURI.split(',')[1]);\n // separate out the mime component\n let mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n // write the bytes of the string to a typed array\n let ia = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new Blob([ia], {type: mimeString});\n}\n\nclass PublishThumbnailInput extends React.Component {\n constructor (props) {\n super(props);\n this.state = {\n videoSource : null,\n error : null,\n sliderMinRange: 1,\n sliderMaxRange: null,\n sliderValue : null,\n };\n this.handleVideoLoadedData = this.handleVideoLoadedData.bind(this);\n this.handleSliderChange = this.handleSliderChange.bind(this);\n this.createThumbnail = this.createThumbnail.bind(this);\n }\n componentDidMount () {\n const { file } = this.props;\n this.setVideoSource(file);\n }\n componentWillReceiveProps (nextProps) {\n // if file changes\n if (nextProps.file && nextProps.file !== this.props.file) {\n const { file } = nextProps;\n this.setVideoSource(file);\n };\n }\n setVideoSource (file) {\n const previewReader = new FileReader();\n previewReader.readAsDataURL(file);\n previewReader.onloadend = () => {\n const dataUri = previewReader.result;\n const blob = dataURItoBlob(dataUri);\n const videoSource = URL.createObjectURL(blob);\n this.setState({ videoSource });\n };\n }\n handleVideoLoadedData (event) {\n const duration = event.target.duration;\n const totalMinutes = Math.floor(duration / 60);\n const totalSeconds = Math.floor(duration % 60);\n // set the slider\n this.setState({\n sliderMaxRange: duration * 100,\n sliderValue : duration * 100 / 2,\n totalMinutes,\n totalSeconds,\n });\n // update the current time of the video\n let video = document.getElementById('video-thumb-player');\n video.currentTime = duration / 2;\n }\n handleSliderChange (event) {\n const value = parseInt(event.target.value);\n // update the slider value\n this.setState({\n sliderValue: value,\n });\n // update the current time of the video\n let video = document.getElementById('video-thumb-player');\n video.currentTime = value / 100;\n }\n createThumbnail () {\n // take a snapshot\n let video = document.getElementById('video-thumb-player');\n let canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n const dataUrl = canvas.toDataURL();\n const blob = dataURItoBlob(dataUrl);\n const snapshot = new File([blob], `thumbnail.png`, {\n type: 'image/png',\n });\n // set the thumbnail in redux store\n if (snapshot) {\n this.props.onNewThumbnail(snapshot);\n }\n }\n render () {\n const { error, videoSource, sliderMinRange, sliderMaxRange, sliderValue, totalMinutes, totalSeconds } = this.state;\n return (\n
\n \n \n {\n sliderValue ? (\n
\n
\n 0'00\"\n {totalMinutes}'{totalSeconds}\"\n
\n
\n \n
\n
\n ) : (\n

loading...

\n )\n }\n { error ? (\n

{error}

\n ) : (\n

Use slider to set thumbnail

\n )}\n
\n );\n }\n}\n\nexport default PublishThumbnailInput;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishThumbnailInput/view.jsx","import React from 'react';\nimport ExpandingTextArea from 'components/ExpandingTextArea';\n\nclass PublishMetadataInputs extends React.Component {\n constructor (props) {\n super(props);\n this.toggleShowInputs = this.toggleShowInputs.bind(this);\n this.handleInput = this.handleInput.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n }\n toggleShowInputs () {\n this.props.onToggleMetadataInputs(!this.props.showMetadataInputs);\n }\n handleInput (event) {\n const target = event.target;\n const value = target.type === 'checkbox' ? target.checked : target.value;\n const name = target.name;\n this.props.onMetadataChange(name, value);\n }\n handleSelect (event) {\n const name = event.target.name;\n const selectedOption = event.target.selectedOptions[0].value;\n this.props.onMetadataChange(name, selectedOption);\n }\n render () {\n return (\n
\n {this.props.showMetadataInputs && (\n
\n
\n
\n \n
\n \n
\n
\n\n
\n
\n \n
\n \n
\n
\n\n
\n
\n \n
\n \n
\n
\n
\n )}\n \n
\n );\n }\n}\n\nexport default PublishMetadataInputs;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishMetadataInputs/view.jsx","import React from 'react';\n\nclass PublishDisabledMessage extends React.Component {\n render () {\n const message = this.props.message;\n console.log('this.props.message:', message);\n return (\n
\n

Publishing is currently disabled.

\n

{message}

\n
\n );\n }\n}\n\nexport default PublishDisabledMessage;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishDisabledMessage/view.jsx","import React from 'react';\nimport ProgressBar from 'components/ProgressBar';\nimport * as publishStates from 'constants/publish_claim_states';\n\nclass PublishStatus extends React.Component {\n render () {\n const { status, message, clearFile } = this.props;\n return (\n
\n {status === publishStates.LOAD_START &&\n
\n

File is loading to server

\n

0%

\n
\n }\n {status === publishStates.LOADING &&\n
\n
\n

File is loading to server

\n

{message}

\n
\n
\n }\n {status === publishStates.PUBLISHING &&\n
\n

Upload complete. Your file is now being published on the blockchain...

\n \n

Curious what magic is happening here? Learn more.

\n
\n }\n {status === publishStates.SUCCESS &&\n
\n

Your publish is complete! You are being redirected to it now.

\n

If you are not automatically redirected, click here.

\n
\n }\n {status === publishStates.FAILED &&\n
\n

Something went wrong...

\n

{message}

\n

For help, post the above error text in the #speech channel on the lbry discord

\n \n
\n }\n
\n );\n }\n};\n\nexport default PublishStatus;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishStatus/view.jsx","import React from 'react';\nimport Dropzone from 'containers/Dropzone';\nimport PublishDetails from 'containers/PublishDetails';\nimport PublishStatus from 'containers/PublishStatus';\nimport PublishDisabledMessage from 'containers/PublishDisabledMessage';\n\nclass PublishTool extends React.Component {\n render () {\n if (this.props.disabled) {\n console.log('publish is disabled');\n return (\n \n );\n } else {\n console.log('publish is not disabled');\n if (this.props.file) {\n if (this.props.status) {\n return (\n \n );\n } else {\n return ;\n }\n }\n return ;\n }\n }\n};\n\nexport default PublishTool;\n\n\n\n// WEBPACK FOOTER //\n// ./client/containers/PublishTool/view.jsx","module.exports = require(\"passport\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"passport\"\n// module id = 91\n// module chunks = 0","function MysqlConfig () {\n this.database = 'default';\n this.username = 'default';\n this.password = 'default';\n this.configure = (config) => {\n if (!config) {\n return console.log('No MySQL config received.');\n }\n const {database, username, password} = config;\n this.database = database;\n this.username = username;\n this.password = password;\n };\n};\n\nmodule.exports = new MysqlConfig();\n\n\n\n// WEBPACK FOOTER //\n// ./config/mysqlConfig.js","function SlackConfig () {\n this.slackWebHook = 'default';\n this.slackErrorChannel = 'default';\n this.slackInfoChannel = 'default';\n this.configure = (config) => {\n if (!config) {\n return console.log('No slack config received.');\n }\n const {slackWebHook, slackErrorChannel, slackInfoChannel} = config;\n this.slackWebHook = slackWebHook;\n this.slackErrorChannel = slackErrorChannel;\n this.slackInfoChannel = slackInfoChannel;\n };\n};\n\nmodule.exports = new SlackConfig();\n\n\n\n// WEBPACK FOOTER //\n// ./config/slackConfig.js","module.exports = require(\"passport-local\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"passport-local\"\n// module id = 94\n// module chunks = 0","module.exports = require(\"sequelize\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"sequelize\"\n// module id = 95\n// module chunks = 0","module.exports = {\n returnShortId: function (claimsArray, longId) {\n let claimIndex;\n let shortId = longId.substring(0, 1); // default short id is the first letter\n let shortIdLength = 0;\n // find the index of this claim id\n claimIndex = claimsArray.findIndex(element => {\n return element.claimId === longId;\n });\n if (claimIndex < 0) {\n throw new Error('claim id not found in claims list');\n }\n // get an array of all claims with lower height\n let possibleMatches = claimsArray.slice(0, claimIndex);\n // remove certificates with the same prefixes until none are left.\n while (possibleMatches.length > 0) {\n shortIdLength += 1;\n shortId = longId.substring(0, shortIdLength);\n possibleMatches = possibleMatches.filter(element => {\n return (element.claimId && (element.claimId.substring(0, shortIdLength) === shortId));\n });\n }\n return shortId;\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/sequelizeHelpers.js","const logger = require('winston');\nconst fs = require('fs');\n\nconst { details, publishing } = require('../../config/siteConfig.js');\n\nmodule.exports = {\n parsePublishApiRequestBody ({name, nsfw, license, title, description, thumbnail}) {\n // validate name\n if (!name) {\n throw new Error('no name field found in request');\n }\n const invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name);\n if (invalidNameCharacters) {\n throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and \"-\"');\n }\n // optional parameters\n nsfw = (nsfw === 'true');\n license = license || null;\n title = title || null;\n description = description || null;\n thumbnail = thumbnail || null;\n // return results\n return {\n name,\n nsfw,\n license,\n title,\n description,\n thumbnail,\n };\n },\n parsePublishApiRequestFiles ({file, thumbnail}) {\n // make sure a file was provided\n if (!file) {\n throw new Error('no file with key of [file] found in request');\n }\n if (!file.path) {\n throw new Error('no file path found');\n }\n if (!file.type) {\n throw new Error('no file type found');\n }\n if (!file.size) {\n throw new Error('no file type found');\n }\n // validate the file name\n if (/'/.test(file.name)) {\n throw new Error('apostrophes are not allowed in the file name');\n }\n // validate the file\n module.exports.validateFileTypeAndSize(file);\n // return results\n return {\n fileName : file.name,\n filePath : file.path,\n fileType : file.type,\n thumbnailFileName: (thumbnail ? thumbnail.name : null),\n thumbnailFilePath: (thumbnail ? thumbnail.path : null),\n thumbnailFileType: (thumbnail ? thumbnail.type : null),\n };\n },\n validateFileTypeAndSize (file) {\n // check file type and size\n switch (file.type) {\n case 'image/jpeg':\n case 'image/jpg':\n case 'image/png':\n if (file.size > 10000000) {\n logger.debug('publish > file validation > .jpeg/.jpg/.png was too big');\n throw new Error('Sorry, images are limited to 10 megabytes.');\n }\n break;\n case 'image/gif':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .gif was too big');\n throw new Error('Sorry, .gifs are limited to 50 megabytes.');\n }\n break;\n case 'video/mp4':\n if (file.size > 50000000) {\n logger.debug('publish > file validation > .mp4 was too big');\n throw new Error('Sorry, videos are limited to 50 megabytes.');\n }\n break;\n default:\n logger.debug('publish > file validation > unrecognized file type');\n throw new Error('The ' + file.type + ' content type is not supported. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.');\n }\n return file;\n },\n createBasicPublishParams (filePath, name, title, description, license, nsfw, thumbnail) {\n logger.debug(`Creating Publish Parameters`);\n // provide defaults for title\n if (title === null || title.trim() === '') {\n title = name;\n }\n // provide default for description\n if (description === null || description.trim() === '') {\n description = '';\n }\n // provide default for license\n if (license === null || license.trim() === '') {\n license = ' '; // default to empty string\n }\n // create the publish params\n const publishParams = {\n name,\n file_path: filePath,\n bid : 0.01,\n metadata : {\n description,\n title,\n author : details.title,\n language: 'en',\n license,\n nsfw,\n },\n claim_address: publishing.primaryClaimAddress,\n };\n // add thumbnail to channel if video\n if (thumbnail) {\n publishParams['metadata']['thumbnail'] = thumbnail;\n }\n return publishParams;\n },\n createThumbnailPublishParams (thumbnailFilePath, claimName, license, nsfw) {\n if (!thumbnailFilePath) {\n return;\n }\n logger.debug(`Creating Thumbnail Publish Parameters`);\n // create the publish params\n return {\n name : `${claimName}-thumb`,\n file_path: thumbnailFilePath,\n bid : 0.01,\n metadata : {\n title : `${claimName} thumbnail`,\n description: `a thumbnail for ${claimName}`,\n author : details.title,\n language : 'en',\n license,\n nsfw,\n },\n claim_address: publishing.primaryClaimAddress,\n channel_name : publishing.thumbnailChannel,\n channel_id : publishing.thumbnailChannelId,\n };\n },\n deleteTemporaryFile (filePath) {\n fs.unlink(filePath, err => {\n if (err) {\n logger.error(`error deleting temporary file ${filePath}`);\n throw err;\n }\n logger.debug(`successfully deleted ${filePath}`);\n });\n },\n addGetResultsToFileData (fileInfo, getResult) {\n fileInfo.fileName = getResult.file_name;\n fileInfo.filePath = getResult.download_path;\n return fileInfo;\n },\n createFileData ({ name, claimId, outpoint, height, address, nsfw, contentType }) {\n return {\n name,\n claimId,\n outpoint,\n height,\n address,\n fileName: '',\n filePath: '',\n fileType: contentType,\n nsfw,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/publishHelpers.js","module.exports = require(\"fs\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"fs\"\n// module id = 98\n// module chunks = 0","const logger = require('winston');\n\nmodule.exports = {\n handleErrorResponse: function (originalUrl, ip, error, res) {\n logger.error(`Error on ${originalUrl}`, module.exports.useObjectPropertiesIfNoKeys(error));\n const [status, message] = module.exports.returnErrorMessageAndStatus(error);\n res\n .status(status)\n .json(module.exports.createErrorResponsePayload(status, message));\n },\n returnErrorMessageAndStatus: function (error) {\n let status, message;\n // check for daemon being turned off\n if (error.code === 'ECONNREFUSED') {\n status = 503;\n message = 'Connection refused. The daemon may not be running.';\n // fallback for everything else\n } else {\n status = 400;\n if (error.message) {\n message = error.message;\n } else {\n message = error;\n };\n };\n return [status, message];\n },\n useObjectPropertiesIfNoKeys: function (err) {\n if (Object.keys(err).length === 0) {\n let newErrorObject = {};\n Object.getOwnPropertyNames(err).forEach((key) => {\n newErrorObject[key] = err[key];\n });\n return newErrorObject;\n }\n return err;\n },\n createErrorResponsePayload (status, message) {\n return {\n status,\n success: false,\n message,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/errorHandlers.js","const db = require('../models/index');\nconst logger = require('winston');\nconst { returnPaginatedChannelClaims } = require('../helpers/channelPagination.js');\n\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\nconst NO_FILE = 'NO_FILE';\n\nmodule.exports = {\n getClaimId (channelName, channelClaimId, name, claimId) {\n if (channelName) {\n return module.exports.getClaimIdByChannel(channelName, channelClaimId, name);\n } else {\n return module.exports.getClaimIdByClaim(name, claimId);\n }\n },\n getClaimIdByClaim (claimName, claimId) {\n logger.debug(`getClaimIdByClaim(${claimName}, ${claimId})`);\n return new Promise((resolve, reject) => {\n db.Claim.getLongClaimId(claimName, claimId)\n .then(longClaimId => {\n if (!longClaimId) {\n resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getClaimIdByChannel (channelName, channelClaimId, claimName) {\n logger.debug(`getClaimIdByChannel(${channelName}, ${channelClaimId}, ${claimName})`);\n return new Promise((resolve, reject) => {\n db.Certificate.getLongChannelId(channelName, channelClaimId) // 1. get the long channel id\n .then(longChannelId => {\n if (!longChannelId) {\n return [null, null];\n }\n return Promise.all([longChannelId, db.Claim.getClaimIdByLongChannelId(longChannelId, claimName)]); // 2. get the long claim id\n })\n .then(([longChannelId, longClaimId]) => {\n if (!longChannelId) {\n return resolve(NO_CHANNEL);\n }\n if (!longClaimId) {\n return resolve(NO_CLAIM);\n }\n resolve(longClaimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getChannelData (channelName, channelClaimId, page) {\n return new Promise((resolve, reject) => {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId)\n .then(longChannelClaimId => {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Certificate.getShortChannelIdFromLongChannelId(longChannelClaimId, channelName)]);\n })\n .then(([longChannelClaimId, shortChannelClaimId]) => {\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. return all the channel information\n resolve({\n channelName,\n longChannelClaimId,\n shortChannelClaimId,\n });\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getChannelClaims (channelName, channelClaimId, page) {\n return new Promise((resolve, reject) => {\n // 1. get the long channel Id (make sure channel exists)\n db.Certificate.getLongChannelId(channelName, channelClaimId)\n .then(longChannelClaimId => {\n if (!longChannelClaimId) {\n return [null, null, null];\n }\n // 2. get the short ID and all claims for that channel\n return Promise.all([longChannelClaimId, db.Claim.getAllChannelClaims(longChannelClaimId)]);\n })\n .then(([longChannelClaimId, channelClaimsArray]) => {\n if (!longChannelClaimId) {\n return resolve(NO_CHANNEL);\n }\n // 3. format the data for the view, including pagination\n let paginatedChannelViewData = returnPaginatedChannelClaims(channelName, longChannelClaimId, channelClaimsArray, page);\n // 4. return all the channel information and contents\n resolve(paginatedChannelViewData);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n getLocalFileRecord (claimId, name) {\n return db.File.findOne({where: {claimId, name}})\n .then(file => {\n if (!file) {\n return NO_FILE;\n }\n return file.dataValues;\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/controllers/serveController.js","import React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { createStore } from 'redux';\nimport Reducer from 'client/reducers';\nimport { Provider } from 'react-redux';\nimport { StaticRouter } from 'react-router-dom';\nimport GAListener from 'client/components/GAListener/';\nimport App from 'client/app';\nimport renderFullPage from './renderFullPage.js';\nimport Helmet from 'react-helmet';\n\nmodule.exports = (req, res) => {\n let context = {};\n\n // create a new Redux store instance\n const store = createStore(Reducer);\n\n // render component to a string\n const html = renderToString(\n \n \n \n \n \n \n \n );\n\n // get head tags from helmet\n const helmet = Helmet.renderStatic();\n\n // check for a redirect\n if (context.url) {\n // Somewhere a `` was rendered\n return res.redirect(301, context.url);\n } else {\n // we're good, send the response\n }\n\n // get the initial state from our Redux store\n const preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send(renderFullPage(helmet, html, preloadedState));\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/handlePageRender.jsx","module.exports = require(\"react-dom/server\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-dom/server\"\n// module id = 102\n// module chunks = 0","import { combineReducers } from 'redux';\nimport PublishReducer from 'reducers/publish';\nimport ChannelReducer from 'reducers/channel';\nimport ShowReducer from 'reducers/show';\nimport SiteReducer from 'reducers/site';\n\nexport default combineReducers({\n channel: ChannelReducer,\n publish: PublishReducer,\n show : ShowReducer,\n site : SiteReducer,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./client/reducers/index.js","export const FILE_SELECTED = 'FILE_SELECTED';\nexport const FILE_CLEAR = 'FILE_CLEAR';\nexport const METADATA_UPDATE = 'METADATA_UPDATE';\nexport const CLAIM_UPDATE = 'CLAIM_UPDATE';\nexport const SET_PUBLISH_IN_CHANNEL = 'SET_PUBLISH_IN_CHANNEL';\nexport const PUBLISH_STATUS_UPDATE = 'PUBLISH_STATUS_UPDATE';\nexport const ERROR_UPDATE = 'ERROR_UPDATE';\nexport const SELECTED_CHANNEL_UPDATE = 'SELECTED_CHANNEL_UPDATE';\nexport const TOGGLE_METADATA_INPUTS = 'TOGGLE_METADATA_INPUTS';\nexport const THUMBNAIL_NEW = 'THUMBNAIL_NEW';\nexport const PUBLISH_START = 'PUBLISH_START';\n\n\n\n// WEBPACK FOOTER //\n// ./client/constants/publish_action_types.js","export const LOGIN = 'Existing';\nexport const CREATE = 'New';\n\n\n\n// WEBPACK FOOTER //\n// ./client/constants/publish_channel_select_states.js","export const CHANNEL_UPDATE = 'CHANNEL_UPDATE';\n\n\n\n// WEBPACK FOOTER //\n// ./client/constants/channel_action_types.js","export const LOCAL_CHECK = 'LOCAL_CHECK';\nexport const UNAVAILABLE = 'UNAVAILABLE';\nexport const ERROR = 'ERROR';\nexport const AVAILABLE = 'AVAILABLE';\n\n\n\n// WEBPACK FOOTER //\n// ./client/constants/asset_display_states.js","import React from 'react';\nimport { Route, Switch } from 'react-router-dom';\nimport { dynamicImport } from 'utils/dynamicImport';\nimport AboutPage from 'pages/AboutPage';\nimport LoginPage from 'pages/LoginPage';\nimport ShowPage from 'pages/ShowPage';\nimport FourOhFourPage from 'containers/FourOhFourPage';\nconst HomePage = dynamicImport('pages/HomePage'); // or use the provided local homepage\n\nconst App = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n\n\n\n// WEBPACK FOOTER //\n// ./client/app.js","var map = {\n\t\"./canonicalLink\": 59,\n\t\"./canonicalLink.js\": 59,\n\t\"./dynamicImport\": 58,\n\t\"./dynamicImport.js\": 58,\n\t\"./file\": 60,\n\t\"./file.js\": 60,\n\t\"./lbryUri\": 61,\n\t\"./lbryUri.js\": 61,\n\t\"./metaTags\": 62,\n\t\"./metaTags.js\": 62,\n\t\"./pageTitle\": 63,\n\t\"./pageTitle.js\": 63,\n\t\"./publish\": 110,\n\t\"./publish.js\": 110,\n\t\"./request\": 8,\n\t\"./request.js\": 8,\n\t\"./validate\": 111,\n\t\"./validate.js\": 111\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 109;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./client/utils ^.*$\n// module id = 109\n// module chunks = 0","export const createPublishMetadata = (claim, { type }, { title, description, license, nsfw }, publishInChannel, selectedChannel) => {\n let metadata = {\n name: claim,\n title,\n description,\n license,\n nsfw,\n type,\n };\n if (publishInChannel) {\n metadata['channelName'] = selectedChannel;\n }\n return metadata;\n};\n\nexport const createPublishFormData = (file, thumbnail, metadata) => {\n let fd = new FormData();\n // append file\n fd.append('file', file);\n // append thumbnail\n if (thumbnail) {\n fd.append('thumbnail', thumbnail);\n }\n // append metadata\n for (let key in metadata) {\n if (metadata.hasOwnProperty(key)) {\n fd.append(key, metadata[key]);\n }\n }\n return fd;\n};\n\nexport const createThumbnailUrl = (channel, channelId, claim, host) => {\n return `${host}/${channel}:${channelId}/${claim}-thumb.png`;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/utils/publish.js","export const validateChannelSelection = (publishInChannel, selectedChannel, loggedInChannel) => {\n if (publishInChannel && (selectedChannel !== loggedInChannel.name)) {\n throw new Error('Log in to a channel or select Anonymous');\n }\n};\n\nexport const validatePublishParams = (file, claim, urlError) => {\n if (!file) {\n throw new Error('Please choose a file');\n }\n if (!claim) {\n throw new Error('Please enter a URL');\n }\n if (urlError) {\n throw new Error('Fix the url');\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/utils/validate.js","export const CHANNEL = 'CHANNEL';\nexport const ASSET_LITE = 'ASSET_LITE';\nexport const ASSET_DETAILS = 'ASSET_DETAILS';\n\n\n\n// WEBPACK FOOTER //\n// ./client/constants/show_request_types.js","module.exports = (helmet, html, preloadedState) => {\n // take the html and preloadedState and return the full page\n return `\n \n \n \n \n \n \n \n ${helmet.title.toString()}\n ${helmet.meta.toString()}\n ${helmet.link.toString()}\n \n \n \n \n \n \n \n \n
\n
${html}
\n
\n \n \n \n \n `;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/renderFullPage.js","export const selectSiteState = (state) => {\n return state.site;\n};\n\nexport const selectSiteHost = (state) => {\n return state.site.host;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/selectors/site.js","module.exports = require(\"babel-polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"babel-polyfill\"\n// module id = 116\n// module chunks = 0","module.exports = require(\"whatwg-fetch\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"whatwg-fetch\"\n// module id = 117\n// module chunks = 0","const Server = require('./server/server.js');\nconst Components = require('./client/components');\nconst Containers = require('./client/containers');\nconst Pages = require('./client/pages');\n\nconst exports = {\n Server,\n Components,\n Containers,\n Pages,\n};\n\nmodule.exports = exports;\n\n\n\n// WEBPACK FOOTER //\n// ./speech.js","// app dependencies\nconst express = require('express');\nconst bodyParser = require('body-parser');\nconst expressHandlebars = require('express-handlebars');\nconst Handlebars = require('handlebars');\nconst helmet = require('helmet');\nconst passport = require('passport');\nconst { serializeSpeechUser, deserializeSpeechUser } = require('./helpers/authHelpers.js');\nconst cookieSession = require('cookie-session');\nconst http = require('http');\n// logging dependencies\nconst logger = require('winston');\n\nfunction Server () {\n this.configureMysql = (mysqlConfig) => {\n require('../config/mysqlConfig.js').configure(mysqlConfig);\n };\n this.configureSite = (siteConfig) => {\n require('../config/siteConfig.js').configure(siteConfig);\n this.sessionKey = siteConfig.auth.sessionKey;\n this.PORT = siteConfig.details.port;\n };\n this.configureSlack = (slackConfig) => {\n require('../config/slackConfig.js').configure(slackConfig);\n };\n this.createApp = () => {\n // create an Express application\n const app = express();\n\n // trust the proxy to get ip address for us\n app.enable('trust proxy');\n\n // add middleware\n app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties\n app.use(express.static(`${__dirname}/public`)); // 'express.static' to serve static files from public directory\n app.use(bodyParser.json()); // 'body parser' for parsing application/json\n app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded\n app.use((req, res, next) => { // custom logging middleware to log all incoming http requests\n logger.verbose(`Request on ${req.originalUrl} from ${req.ip}`);\n next();\n });\n\n // configure passport\n passport.serializeUser(serializeSpeechUser);\n passport.deserializeUser(deserializeSpeechUser);\n const localSignupStrategy = require('./passport/local-signup.js');\n const localLoginStrategy = require('./passport/local-login.js');\n passport.use('local-signup', localSignupStrategy);\n passport.use('local-login', localLoginStrategy);\n // initialize passport\n app.use(cookieSession({\n name : 'session',\n keys : [this.sessionKey],\n maxAge: 24 * 60 * 60 * 1000, // i.e. 24 hours\n }));\n app.use(passport.initialize());\n app.use(passport.session());\n\n // configure handlebars & register it with express app\n const hbs = expressHandlebars.create({\n defaultLayout: 'embed',\n handlebars : Handlebars,\n });\n app.engine('handlebars', hbs.engine);\n app.set('view engine', 'handlebars');\n\n // set the routes on the app\n require('./routes/auth-routes.js')(app);\n require('./routes/api-routes.js')(app);\n require('./routes/page-routes.js')(app);\n require('./routes/asset-routes.js')(app);\n require('./routes/fallback-routes.js')(app);\n\n this.app = app;\n };\n this.initialize = () => {\n require('./helpers/configureLogger.js')(logger);\n require('./helpers/configureSlack.js')(logger);\n this.createApp();\n this.server = http.Server(this.app);\n };\n this.start = () => {\n const db = require('./models/index');\n // sync sequelize\n db.sequelize.sync()\n // start the server\n .then(() => {\n this.server.listen(this.PORT, () => {\n logger.info(`Server is listening on PORT ${this.PORT}`);\n });\n })\n .catch((error) => {\n logger.error(`Startup Error:`, error);\n });\n };\n};\n\nmodule.exports = Server;\n\n\n\n// WEBPACK FOOTER //\n// ./server/server.js","module.exports = require(\"express\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"express\"\n// module id = 120\n// module chunks = 0","module.exports = require(\"body-parser\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"body-parser\"\n// module id = 121\n// module chunks = 0","module.exports = require(\"express-handlebars\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"express-handlebars\"\n// module id = 122\n// module chunks = 0","module.exports = require(\"handlebars\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"handlebars\"\n// module id = 123\n// module chunks = 0","module.exports = require(\"helmet\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"helmet\"\n// module id = 124\n// module chunks = 0","const logger = require('winston');\n\nmodule.exports = {\n serializeSpeechUser (user, done) { // returns user data to be serialized into session\n logger.debug('serializing user');\n done(null, user);\n },\n deserializeSpeechUser (user, done) { // deserializes session and populates additional info to req.user\n logger.debug('deserializing user');\n done(null, user);\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/authHelpers.js","module.exports = require(\"cookie-session\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"cookie-session\"\n// module id = 126\n// module chunks = 0","module.exports = require(\"http\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"http\"\n// module id = 127\n// module chunks = 0","const PassportLocalStrategy = require('passport-local').Strategy;\nconst lbryApi = require('../helpers/lbryApi.js');\nconst logger = require('winston');\nconst db = require('../models');\n\nmodule.exports = new PassportLocalStrategy(\n {\n usernameField: 'username',\n passwordField: 'password',\n },\n (username, password, done) => {\n logger.verbose(`new channel signup request. user: ${username} pass: ${password} .`);\n let userInfo = {};\n // server-side validaton of inputs (username, password)\n\n // create the channel and retrieve the metadata\n return lbryApi.createChannel(`@${username}`)\n .then(tx => {\n // create user record\n const userData = {\n userName: username,\n password: password,\n };\n logger.verbose('userData >', userData);\n // create user record\n const channelData = {\n channelName : `@${username}`,\n channelClaimId: tx.claim_id,\n };\n logger.verbose('channelData >', channelData);\n // create certificate record\n const certificateData = {\n claimId: tx.claim_id,\n name : `@${username}`,\n // address,\n };\n logger.verbose('certificateData >', certificateData);\n // save user and certificate to db\n return Promise.all([db.User.create(userData), db.Channel.create(channelData), db.Certificate.create(certificateData)]);\n })\n .then(([newUser, newChannel, newCertificate]) => {\n logger.verbose('user and certificate successfully created');\n // store the relevant newUser info to be passed back for req.User\n userInfo['id'] = newUser.id;\n userInfo['userName'] = newUser.userName;\n userInfo['channelName'] = newChannel.channelName;\n userInfo['channelClaimId'] = newChannel.channelClaimId;\n // associate the instances\n return Promise.all([newCertificate.setChannel(newChannel), newChannel.setUser(newUser)]);\n })\n .then(() => {\n logger.verbose('user and certificate successfully associated');\n return db.Certificate.getShortChannelIdFromLongChannelId(userInfo.channelClaimId, userInfo.channelName);\n })\n .then(shortChannelId => {\n userInfo['shortChannelId'] = shortChannelId;\n return done(null, userInfo);\n })\n .catch(error => {\n logger.error('signup error', error);\n return done(error);\n });\n }\n);\n\n\n\n// WEBPACK FOOTER //\n// ./server/passport/local-signup.js","module.exports = require(\"axios\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"axios\"\n// module id = 129\n// module chunks = 0","const lbryConfig = {\n api: {\n apiHost: 'localhost',\n apiPort: '5279',\n },\n};\n\nmodule.exports = lbryConfig;\n\n\n\n// WEBPACK FOOTER //\n// ./config/lbryConfig.js","module.exports = require(\"universal-analytics\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"universal-analytics\"\n// module id = 131\n// module chunks = 0","const logger = require('winston');\nconst { returnShortId } = require('../helpers/sequelizeHelpers.js');\n\nmodule.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {\n const Certificate = sequelize.define(\n 'Certificate',\n {\n address: {\n type : STRING,\n default: null,\n },\n amount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n claimId: {\n type : STRING,\n default: null,\n },\n claimSequence: {\n type : INTEGER,\n default: null,\n },\n decodedClaim: {\n type : BOOLEAN,\n default: null,\n },\n depth: {\n type : INTEGER,\n default: null,\n },\n effectiveAmount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n hasSignature: {\n type : BOOLEAN,\n default: null,\n },\n height: {\n type : INTEGER,\n default: null,\n },\n hex: {\n type : TEXT('long'),\n default: null,\n },\n name: {\n type : STRING,\n default: null,\n },\n nout: {\n type : INTEGER,\n default: null,\n },\n txid: {\n type : STRING,\n default: null,\n },\n validAtHeight: {\n type : INTEGER,\n default: null,\n },\n outpoint: {\n type : STRING,\n default: null,\n },\n valueVersion: {\n type : STRING,\n default: null,\n },\n claimType: {\n type : STRING,\n default: null,\n },\n certificateVersion: {\n type : STRING,\n default: null,\n },\n keyType: {\n type : STRING,\n default: null,\n },\n publicKey: {\n type : TEXT('long'),\n default: null,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Certificate.associate = db => {\n Certificate.belongsTo(db.Channel, {\n foreignKey: {\n allowNull: true,\n },\n });\n };\n\n Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) {\n logger.debug(`getShortChannelIdFromLongChannelId ${channelName}:${longChannelId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: {name: channelName},\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n throw new Error('No channel(s) found with that channel name');\n default:\n return resolve(returnShortId(result, longChannelId));\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelClaimId) {\n logger.debug(`getLongChannelIdFromShortChannelId(${channelName}, ${channelClaimId})`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: {\n name : channelName,\n claimId: {\n $like: `${channelClaimId}%`,\n },\n },\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n default: // note results must be sorted\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelIdFromChannelName = function (channelName) {\n logger.debug(`getLongChannelIdFromChannelName(${channelName})`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name: channelName },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.validateLongChannelId = function (name, claimId) {\n logger.debug(`validateLongChannelId(${name}, ${claimId})`);\n return new Promise((resolve, reject) => {\n this.findOne({\n where: {name, claimId},\n })\n .then(result => {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Certificate.getLongChannelId = function (channelName, channelClaimId) {\n logger.debug(`getLongChannelId(${channelName}, ${channelClaimId})`);\n if (channelClaimId && (channelClaimId.length === 40)) { // if a full channel id is provided\n return this.validateLongChannelId(channelName, channelClaimId);\n } else if (channelClaimId && channelClaimId.length < 40) { // if a short channel id is provided\n return this.getLongChannelIdFromShortChannelId(channelName, channelClaimId);\n } else {\n return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided\n }\n };\n\n return Certificate;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/models/certificate.js","module.exports = (sequelize, { STRING }) => {\n const Channel = sequelize.define(\n 'Channel',\n {\n channelName: {\n type : STRING,\n allowNull: false,\n },\n channelClaimId: {\n type : STRING,\n allowNull: false,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Channel.associate = db => {\n Channel.belongsTo(db.User);\n Channel.hasOne(db.Certificate);\n };\n\n return Channel;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/models/channel.js","const logger = require('winston');\nconst { returnShortId } = require('../helpers/sequelizeHelpers.js');\nconst { assetDefaults: { thumbnail: defaultThumbnail }, details: { host } } = require('../../config/siteConfig.js');\n\nfunction determineFileExtensionFromContentType (contentType) {\n switch (contentType) {\n case 'image/jpeg':\n case 'image/jpg':\n return 'jpeg';\n case 'image/png':\n return 'png';\n case 'image/gif':\n return 'gif';\n case 'video/mp4':\n return 'mp4';\n default:\n logger.debug('setting unknown file type as file extension jpeg');\n return 'jpeg';\n }\n};\n\nfunction determineThumbnail (storedThumbnail, defaultThumbnail) {\n if (storedThumbnail === '') {\n return defaultThumbnail;\n }\n return storedThumbnail;\n};\n\nfunction prepareClaimData (claim) {\n // logger.debug('preparing claim data based on resolved data:', claim);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['host'] = host;\n return claim;\n};\n\nmodule.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {\n const Claim = sequelize.define(\n 'Claim',\n {\n address: {\n type : STRING,\n default: null,\n },\n amount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n claimId: {\n type : STRING,\n default: null,\n },\n claimSequence: {\n type : INTEGER,\n default: null,\n },\n decodedClaim: {\n type : BOOLEAN,\n default: null,\n },\n depth: {\n type : INTEGER,\n default: null,\n },\n effectiveAmount: {\n type : DECIMAL(19, 8),\n default: null,\n },\n hasSignature: {\n type : BOOLEAN,\n default: null,\n },\n height: {\n type : INTEGER,\n default: null,\n },\n hex: {\n type : TEXT('long'),\n default: null,\n },\n name: {\n type : STRING,\n default: null,\n },\n nout: {\n type : INTEGER,\n default: null,\n },\n txid: {\n type : STRING,\n default: null,\n },\n validAtHeight: {\n type : INTEGER,\n default: null,\n },\n outpoint: {\n type : STRING,\n default: null,\n },\n claimType: {\n type : STRING,\n default: null,\n },\n certificateId: {\n type : STRING,\n default: null,\n },\n author: {\n type : STRING,\n default: null,\n },\n description: {\n type : TEXT('long'),\n default: null,\n },\n language: {\n type : STRING,\n default: null,\n },\n license: {\n type : STRING,\n default: null,\n },\n licenseUrl: {\n type : STRING,\n default: null,\n },\n nsfw: {\n type : BOOLEAN,\n default: null,\n },\n preview: {\n type : STRING,\n default: null,\n },\n thumbnail: {\n type : STRING,\n default: null,\n },\n title: {\n type : STRING,\n default: null,\n },\n metadataVersion: {\n type : STRING,\n default: null,\n },\n contentType: {\n type : STRING,\n default: null,\n },\n source: {\n type : STRING,\n default: null,\n },\n sourceType: {\n type : STRING,\n default: null,\n },\n sourceVersion: {\n type : STRING,\n default: null,\n },\n streamVersion: {\n type : STRING,\n default: null,\n },\n valueVersion: {\n type : STRING,\n default: null,\n },\n channelName: {\n type : STRING,\n allowNull: true,\n default : null,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Claim.associate = db => {\n Claim.belongsTo(db.File, {\n foreignKey: {\n allowNull: true,\n },\n });\n };\n\n Claim.getShortClaimIdFromLongClaimId = function (claimId, claimName) {\n logger.debug(`Claim.getShortClaimIdFromLongClaimId for ${claimName}#${claimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name: claimName },\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n throw new Error('No claim(s) found with that claim name');\n default:\n resolve(returnShortId(result, claimId));\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getAllChannelClaims = function (channelClaimId) {\n logger.debug(`Claim.getAllChannelClaims for ${channelClaimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { certificateId: channelClaimId },\n order: [['height', 'ASC']],\n raw : true, // returns an array of only data, not an array of instances\n })\n .then(channelClaimsArray => {\n // logger.debug('channelclaimsarray length:', channelClaimsArray.length);\n switch (channelClaimsArray.length) {\n case 0:\n return resolve(null);\n default:\n channelClaimsArray.forEach(claim => {\n claim['fileExt'] = determineFileExtensionFromContentType(claim.contentType);\n claim['thumbnail'] = determineThumbnail(claim.thumbnail, defaultThumbnail);\n return claim;\n });\n return resolve(channelClaimsArray);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getClaimIdByLongChannelId = function (channelClaimId, claimName) {\n logger.debug(`finding claim id for claim ${claimName} from channel ${channelClaimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name: claimName, certificateId: channelClaimId },\n order: [['id', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(result[0].claimId);\n default:\n logger.error(`${result.length} records found for \"${claimName}\" in channel \"${channelClaimId}\"`);\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimIdFromShortClaimId = function (name, shortId) {\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: {\n name,\n claimId: {\n $like: `${shortId}%`,\n }},\n order: [['height', 'ASC']],\n })\n .then(result => {\n switch (result.length) {\n case 0:\n return resolve(null);\n default: // note results must be sorted\n return resolve(result[0].claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getTopFreeClaimIdByClaimName = function (name) {\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name },\n order: [['effectiveAmount', 'DESC'], ['height', 'ASC']], // note: maybe height and effective amount need to switch?\n })\n .then(result => {\n logger.debug('length of result', result.length);\n switch (result.length) {\n case 0:\n return resolve(null);\n default:\n return resolve(result[0].dataValues.claimId);\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.validateLongClaimId = function (name, claimId) {\n return new Promise((resolve, reject) => {\n this.findOne({\n where: {name, claimId},\n })\n .then(result => {\n if (!result) {\n return resolve(null);\n };\n resolve(claimId);\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n Claim.getLongClaimId = function (claimName, claimId) {\n logger.debug(`getLongClaimId(${claimName}, ${claimId})`);\n if (claimId && (claimId.length === 40)) { // if a full claim id is provided\n return this.validateLongClaimId(claimName, claimId);\n } else if (claimId && claimId.length < 40) {\n return this.getLongClaimIdFromShortClaimId(claimName, claimId); // if a short claim id is provided\n } else {\n return this.getTopFreeClaimIdByClaimName(claimName); // if no claim id is provided\n }\n };\n\n Claim.resolveClaim = function (name, claimId) {\n logger.debug(`Claim.resolveClaim: ${name} ${claimId}`);\n return new Promise((resolve, reject) => {\n this\n .findAll({\n where: { name, claimId },\n })\n .then(claimArray => {\n switch (claimArray.length) {\n case 0:\n return resolve(null);\n case 1:\n return resolve(prepareClaimData(claimArray[0].dataValues));\n default:\n logger.error(`more than one record matches ${name}#${claimId} in db.Claim`);\n return resolve(prepareClaimData(claimArray[0].dataValues));\n }\n })\n .catch(error => {\n reject(error);\n });\n });\n };\n\n return Claim;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/models/claim.js","module.exports = (sequelize, { STRING, BOOLEAN, INTEGER }) => {\n const File = sequelize.define(\n 'File',\n {\n name: {\n type : STRING,\n allowNull: false,\n },\n claimId: {\n type : STRING,\n allowNull: false,\n },\n address: {\n type : STRING,\n allowNull: false,\n },\n outpoint: {\n type : STRING,\n allowNull: false,\n },\n height: {\n type : INTEGER,\n allowNull: false,\n default : 0,\n },\n fileName: {\n type : STRING,\n allowNull: false,\n },\n filePath: {\n type : STRING,\n allowNull: false,\n },\n fileType: {\n type: STRING,\n },\n nsfw: {\n type : BOOLEAN,\n allowNull : false,\n defaultValue: false,\n },\n trendingEligible: {\n type : BOOLEAN,\n allowNull : false,\n defaultValue: true,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n File.associate = db => {\n File.hasMany(db.Request);\n File.hasOne(db.Claim);\n };\n\n File.getRecentClaims = function () {\n return this.findAll({\n where: { nsfw: false, trendingEligible: true },\n order: [['createdAt', 'DESC']],\n limit: 25,\n });\n };\n\n return File;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/models/file.js","module.exports = (sequelize, { STRING, BOOLEAN, TEXT }) => {\n const Request = sequelize.define(\n 'Request',\n {\n action: {\n type : STRING,\n allowNull: false,\n },\n url: {\n type : STRING,\n allowNull: false,\n },\n ipAddress: {\n type : STRING,\n allowNull: true,\n },\n result: {\n type : TEXT('long'),\n allowNull: true,\n default : null,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n Request.associate = db => {\n Request.belongsTo(db.File, {\n foreignKey: {\n allowNull: true,\n },\n });\n };\n\n return Request;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/models/request.js","'use strict';\nconst bcrypt = require('bcrypt');\nconst logger = require('winston');\n\nmodule.exports = (sequelize, { STRING }) => {\n const User = sequelize.define(\n 'User',\n {\n userName: {\n type : STRING,\n allowNull: false,\n },\n password: {\n type : STRING,\n allowNull: false,\n },\n },\n {\n freezeTableName: true,\n }\n );\n\n User.associate = db => {\n User.hasOne(db.Channel);\n };\n\n User.prototype.comparePassword = function (password) {\n return bcrypt.compare(password, this.password);\n };\n\n User.prototype.changePassword = function (newPassword) {\n return new Promise((resolve, reject) => {\n // generate a salt string to use for hashing\n bcrypt.genSalt((saltError, salt) => {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(newPassword, salt, (hashError, hash) => {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the current password with the new hash\n this\n .update({password: hash})\n .then(() => {\n resolve();\n })\n .catch(error => {\n reject(error);\n });\n });\n });\n });\n };\n\n // pre-save hook method to hash the user's password before the user's info is saved to the db.\n User.hook('beforeCreate', (user, options) => {\n logger.debug('User.beforeCreate hook...');\n return new Promise((resolve, reject) => {\n // generate a salt string to use for hashing\n bcrypt.genSalt((saltError, salt) => {\n if (saltError) {\n logger.error('salt error', saltError);\n reject(saltError);\n return;\n }\n // generate a hashed version of the user's password\n bcrypt.hash(user.password, salt, (hashError, hash) => {\n // if there is an error with the hash generation return the error\n if (hashError) {\n logger.error('hash error', hashError);\n reject(hashError);\n return;\n }\n // replace the password string with the hash password value\n user.password = hash;\n resolve();\n });\n });\n });\n });\n\n return User;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/models/user.js","module.exports = require(\"bcrypt\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"bcrypt\"\n// module id = 138\n// module chunks = 0","const PassportLocalStrategy = require('passport-local').Strategy;\nconst logger = require('winston');\nconst db = require('../models/index');\n\nconst returnUserAndChannelInfo = (userInstance) => {\n return new Promise((resolve, reject) => {\n let userInfo = {};\n userInfo['id'] = userInstance.id;\n userInfo['userName'] = userInstance.userName;\n userInstance\n .getChannel()\n .then(({channelName, channelClaimId}) => {\n userInfo['channelName'] = channelName;\n userInfo['channelClaimId'] = channelClaimId;\n return db.Certificate.getShortChannelIdFromLongChannelId(channelClaimId, channelName);\n })\n .then(shortChannelId => {\n userInfo['shortChannelId'] = shortChannelId;\n resolve(userInfo);\n })\n .catch(error => {\n reject(error);\n });\n });\n};\n\nmodule.exports = new PassportLocalStrategy(\n {\n usernameField: 'username',\n passwordField: 'password',\n },\n (username, password, done) => {\n return db.User\n .findOne({\n where: {userName: username},\n })\n .then(user => {\n if (!user) {\n logger.debug('no user found');\n return done(null, false, {message: 'Incorrect username or password'});\n }\n return user.comparePassword(password)\n .then(isMatch => {\n if (!isMatch) {\n logger.debug('incorrect password');\n return done(null, false, {message: 'Incorrect username or password'});\n }\n logger.debug('Password was a match, returning User');\n return returnUserAndChannelInfo(user)\n .then(userInfo => {\n return done(null, userInfo);\n })\n .catch(error => {\n return error;\n });\n })\n .catch(error => {\n return error;\n });\n })\n .catch(error => {\n return done(error);\n });\n },\n);\n\n\n\n// WEBPACK FOOTER //\n// ./server/passport/local-login.js","const logger = require('winston');\nconst passport = require('passport');\n\nmodule.exports = (app) => {\n // route for sign up\n app.post('/signup', passport.authenticate('local-signup'), (req, res) => {\n logger.verbose(`successful signup for ${req.user.channelName}`);\n res.status(200).json({\n success : true,\n channelName : req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId,\n });\n });\n // route for log in\n app.post('/login', (req, res, next) => {\n passport.authenticate('local-login', (err, user, info) => {\n if (err) {\n return next(err);\n }\n if (!user) {\n return res.status(400).json({\n success: false,\n message: info.message,\n });\n }\n logger.debug('successful login');\n req.logIn(user, (err) => {\n if (err) {\n return next(err);\n }\n return res.status(200).json({\n success : true,\n channelName : req.user.channelName,\n channelClaimId: req.user.channelClaimId,\n shortChannelId: req.user.shortChannelId,\n });\n });\n })(req, res, next);\n });\n // route to log out\n app.get('/logout', (req, res) => {\n req.logout();\n res.status(200).json({success: true, message: 'you successfully logged out'});\n });\n // see if user is authenticated, and return credentials if so\n app.get('/user', (req, res) => {\n if (req.user) {\n res.status(200).json({success: true, data: req.user});\n } else {\n res.status(401).json({success: false, message: 'user is not logged in'});\n }\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/routes/auth-routes.js","const logger = require('winston');\nconst multipart = require('connect-multiparty');\nconst { publishing: { uploadDirectory }, details: { host } } = require('../../config/siteConfig.js');\nconst multipartMiddleware = multipart({uploadDir: uploadDirectory});\nconst db = require('../models/index');\nconst { claimNameIsAvailable, checkChannelAvailability, publish } = require('../controllers/publishController.js');\nconst { getClaimList, resolveUri, getClaim } = require('../helpers/lbryApi.js');\nconst { addGetResultsToFileData, createBasicPublishParams, createThumbnailPublishParams, parsePublishApiRequestBody, parsePublishApiRequestFiles, createFileData } = require('../helpers/publishHelpers.js');\nconst errorHandlers = require('../helpers/errorHandlers.js');\nconst { sendGATimingEvent } = require('../helpers/googleAnalytics.js');\nconst { authenticateUser } = require('../auth/authentication.js');\nconst { getChannelData, getChannelClaims, getClaimId } = require('../controllers/serveController.js');\n\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\n\nmodule.exports = (app) => {\n // route to check whether site has published to a channel\n app.get('/api/channel/availability/:name', ({ ip, originalUrl, params: { name } }, res) => {\n const gaStartTime = Date.now();\n checkChannelAvailability(name)\n .then(availableName => {\n res.status(200).json(availableName);\n sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now());\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short channel id from long channel Id\n app.get('/api/channel/short-id/:longId/:name', ({ ip, originalUrl, params }, res) => {\n db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name)\n .then(shortId => {\n res.status(200).json(shortId);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/data/:channelName/:channelClaimId', ({ ip, originalUrl, body, params }, res) => {\n const channelName = params.channelName;\n let channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n getChannelData(channelName, channelClaimId, 0)\n .then(data => {\n if (data === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'No matching channel was found'});\n }\n res.status(200).json({success: true, data});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/channel/claims/:channelName/:channelClaimId/:page', ({ ip, originalUrl, body, params }, res) => {\n const channelName = params.channelName;\n let channelClaimId = params.channelClaimId;\n if (channelClaimId === 'none') channelClaimId = null;\n const page = params.page;\n getChannelClaims(channelName, channelClaimId, page)\n .then(data => {\n if (data === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'No matching channel was found'});\n }\n res.status(200).json({success: true, data});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a claim_list request on the daemon\n app.get('/api/claim/list/:name', ({ ip, originalUrl, params }, res) => {\n getClaimList(params.name)\n .then(claimsList => {\n res.status(200).json(claimsList);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get an asset\n app.get('/api/claim/get/:name/:claimId', ({ ip, originalUrl, params }, res) => {\n const name = params.name;\n const claimId = params.claimId;\n // resolve the claim\n db.Claim.resolveClaim(name, claimId)\n .then(resolveResult => {\n // make sure a claim actually exists at that uri\n if (!resolveResult) {\n throw new Error('No matching uri found in Claim table');\n }\n let fileData = createFileData(resolveResult);\n // get the claim\n return Promise.all([fileData, getClaim(`${name}#${claimId}`)]);\n })\n .then(([ fileData, getResult ]) => {\n fileData = addGetResultsToFileData(fileData, getResult);\n return Promise.all([db.upsert(db.File, fileData, {name, claimId}, 'File'), getResult]);\n })\n .then(([ fileRecord, {message, completed} ]) => {\n res.status(200).json({ success: true, message, completed });\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to check whether this site published to a claim\n app.get('/api/claim/availability/:name', ({ ip, originalUrl, params: { name } }, res) => {\n const gaStartTime = Date.now();\n claimNameIsAvailable(name)\n .then(result => {\n res.status(200).json(result);\n sendGATimingEvent('end-to-end', 'claim name availability', name, gaStartTime, Date.now());\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a resolve request on the daemon\n app.get('/api/claim/resolve/:name/:claimId', ({ headers, ip, originalUrl, params }, res) => {\n resolveUri(`${params.name}#${params.claimId}`)\n .then(resolvedUri => {\n res.status(200).json(resolvedUri);\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to run a publish request on the daemon\n app.post('/api/claim/publish', multipartMiddleware, ({ body, files, headers, ip, originalUrl, user }, res) => {\n // define variables\n let channelName, channelId, channelPassword, description, fileName, filePath, fileType, gaStartTime, license, name, nsfw, thumbnail, thumbnailFileName, thumbnailFilePath, thumbnailFileType, title;\n // record the start time of the request\n gaStartTime = Date.now();\n // validate the body and files of the request\n try {\n // validateApiPublishRequest(body, files);\n ({name, nsfw, license, title, description, thumbnail} = parsePublishApiRequestBody(body));\n ({fileName, filePath, fileType, thumbnailFileName, thumbnailFilePath, thumbnailFileType} = parsePublishApiRequestFiles(files));\n ({channelName, channelId, channelPassword} = body);\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n // check channel authorization\n Promise.all([\n authenticateUser(channelName, channelId, channelPassword, user),\n claimNameIsAvailable(name),\n createBasicPublishParams(filePath, name, title, description, license, nsfw, thumbnail),\n createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw),\n ])\n .then(([{channelName, channelClaimId}, validatedClaimName, publishParams, thumbnailPublishParams]) => {\n // add channel details to the publish params\n if (channelName && channelClaimId) {\n publishParams['channel_name'] = channelName;\n publishParams['channel_id'] = channelClaimId;\n }\n // publish the thumbnail\n if (thumbnailPublishParams) {\n publish(thumbnailPublishParams, thumbnailFileName, thumbnailFileType);\n }\n // publish the asset\n return publish(publishParams, fileName, fileType);\n })\n .then(result => {\n res.status(200).json({\n success: true,\n message: 'publish completed successfully',\n data : {\n name,\n claimId: result.claim_id,\n url : `${host}/${result.claim_id}/${name}`,\n lbryTx : result,\n },\n });\n // record the publish end time and send to google analytics\n sendGATimingEvent('end-to-end', 'publish', fileType, gaStartTime, Date.now());\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to get a short claim id from long claim Id\n app.get('/api/claim/short-id/:longId/:name', ({ ip, originalUrl, body, params }, res) => {\n db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name)\n .then(shortId => {\n res.status(200).json({success: true, data: shortId});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.post('/api/claim/long-id', ({ ip, originalUrl, body, params }, res) => {\n logger.debug('body:', body);\n const channelName = body.channelName;\n const channelClaimId = body.channelClaimId;\n const claimName = body.claimName;\n const claimId = body.claimId;\n getClaimId(channelName, channelClaimId, claimName, claimId)\n .then(result => {\n if (result === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'No matching channel could be found'});\n }\n if (result === NO_CLAIM) {\n return res.status(404).json({success: false, message: 'No matching claim id could be found'});\n }\n res.status(200).json({success: true, data: result});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n app.get('/api/claim/data/:claimName/:claimId', ({ ip, originalUrl, body, params }, res) => {\n const claimName = params.claimName;\n let claimId = params.claimId;\n if (claimId === 'none') claimId = null;\n db.Claim.resolveClaim(claimName, claimId)\n .then(claimInfo => {\n if (!claimInfo) {\n return res.status(404).json({success: false, message: 'No claim could be found'});\n }\n res.status(200).json({success: true, data: claimInfo});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n // route to see if asset is available locally\n app.get('/api/file/availability/:name/:claimId', ({ ip, originalUrl, params }, res) => {\n const name = params.name;\n const claimId = params.claimId;\n db.File.findOne({where: {name, claimId}})\n .then(result => {\n if (result) {\n return res.status(200).json({success: true, data: true});\n }\n res.status(200).json({success: true, data: false});\n })\n .catch(error => {\n errorHandlers.handleErrorResponse(originalUrl, ip, error, res);\n });\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/routes/api-routes.js","module.exports = require(\"connect-multiparty\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"connect-multiparty\"\n// module id = 142\n// module chunks = 0","const logger = require('winston');\nconst db = require('../models/index');\nconst lbryApi = require('../helpers/lbryApi.js');\nconst publishHelpers = require('../helpers/publishHelpers.js');\nconst { publishing: { primaryClaimAddress, additionalClaimAddresses } } = require('../../config/siteConfig.js');\nconst Sequelize = require('sequelize');\nconst Op = Sequelize.Op;\n\nmodule.exports = {\n publish (publishParams, fileName, fileType) {\n return new Promise((resolve, reject) => {\n let publishResults, certificateId, channelName;\n // publish the file\n return lbryApi.publishClaim(publishParams)\n .then(tx => {\n logger.info(`Successfully published ${publishParams.name} ${fileName}`, tx);\n publishResults = tx;\n // get the channel information\n if (publishParams.channel_name) {\n logger.debug(`this claim was published in channel: ${publishParams.channel_name}`);\n return db.Channel.findOne({where: {channelName: publishParams.channel_name}});\n } else {\n logger.debug('this claim was not published in a channel');\n return null;\n }\n })\n .then(channel => {\n // set channel information\n certificateId = null;\n channelName = null;\n if (channel) {\n certificateId = channel.channelClaimId;\n channelName = channel.channelName;\n }\n logger.debug(`certificateId: ${certificateId}`);\n })\n .then(() => {\n // create the File record\n const fileRecord = {\n name : publishParams.name,\n claimId : publishResults.claim_id,\n title : publishParams.metadata.title,\n description: publishParams.metadata.description,\n address : publishParams.claim_address,\n outpoint : `${publishResults.txid}:${publishResults.nout}`,\n height : 0,\n fileName,\n filePath : publishParams.file_path,\n fileType,\n nsfw : publishParams.metadata.nsfw,\n };\n // create the Claim record\n const claimRecord = {\n name : publishParams.name,\n claimId : publishResults.claim_id,\n title : publishParams.metadata.title,\n description: publishParams.metadata.description,\n address : publishParams.claim_address,\n thumbnail : publishParams.metadata.thumbnail,\n outpoint : `${publishResults.txid}:${publishResults.nout}`,\n height : 0,\n contentType: fileType,\n nsfw : publishParams.metadata.nsfw,\n amount : publishParams.bid,\n certificateId,\n channelName,\n };\n // upsert criteria\n const upsertCriteria = {\n name : publishParams.name,\n claimId: publishResults.claim_id,\n };\n // upsert the records\n return Promise.all([db.upsert(db.File, fileRecord, upsertCriteria, 'File'), db.upsert(db.Claim, claimRecord, upsertCriteria, 'Claim')]);\n })\n .then(([file, claim]) => {\n logger.debug('File and Claim records successfully created');\n return Promise.all([file.setClaim(claim), claim.setFile(file)]);\n })\n .then(() => {\n logger.debug('File and Claim records successfully associated');\n resolve(publishResults); // resolve the promise with the result from lbryApi.publishClaim;\n })\n .catch(error => {\n logger.error('PUBLISH ERROR', error);\n publishHelpers.deleteTemporaryFile(publishParams.file_path); // delete the local file\n reject(error);\n });\n });\n },\n claimNameIsAvailable (name) {\n const claimAddresses = additionalClaimAddresses || [];\n claimAddresses.push(primaryClaimAddress);\n // find any records where the name is used\n return db.Claim\n .findAll({\n attributes: ['address'],\n where : {\n name,\n address: {\n [Op.or]: claimAddresses,\n },\n },\n })\n .then(result => {\n if (result.length >= 1) {\n throw new Error('That claim is already in use');\n };\n return name;\n })\n .catch(error => {\n throw error;\n });\n },\n checkChannelAvailability (name) {\n return db.Channel\n .findAll({\n where: { channelName: name },\n })\n .then(result => {\n if (result.length >= 1) {\n throw new Error('That channel has already been claimed');\n }\n return name;\n })\n .catch(error => {\n throw error;\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/controllers/publishController.js","const db = require('../models');\nconst logger = require('winston');\n\nmodule.exports = {\n authenticateUser (channelName, channelId, channelPassword, user) {\n // case: no channelName or channel Id are provided (anonymous), regardless of whether user token is provided\n if (!channelName && !channelId) {\n return {\n channelName : null,\n channelClaimId: null,\n };\n }\n // case: channelName or channel Id are provided with user token\n if (user) {\n if (channelName && channelName !== user.channelName) {\n throw new Error('the provided channel name does not match user credentials');\n }\n if (channelId && channelId !== user.channelClaimId) {\n throw new Error('the provided channel id does not match user credentials');\n }\n return {\n channelName : user.channelName,\n channelClaimId: user.channelClaimId,\n };\n }\n // case: channelName or channel Id are provided with password instead of user token\n if (!channelPassword) throw new Error('no channel password provided');\n return module.exports.authenticateChannelCredentials(channelName, channelId, channelPassword);\n },\n authenticateChannelCredentials (channelName, channelId, userPassword) {\n return new Promise((resolve, reject) => {\n // hoisted variables\n let channelData;\n // build the params for finding the channel\n let channelFindParams = {};\n if (channelName) channelFindParams['channelName'] = channelName;\n if (channelId) channelFindParams['channelClaimId'] = channelId;\n // find the channel\n db.Channel\n .findOne({\n where: channelFindParams,\n })\n .then(channel => {\n if (!channel) {\n logger.debug('no channel found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n channelData = channel.get();\n logger.debug('channel data:', channelData);\n return db.User.findOne({\n where: { userName: channelData.channelName.substring(1) },\n });\n })\n .then(user => {\n if (!user) {\n logger.debug('no user found');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n return user.comparePassword(userPassword);\n })\n .then(isMatch => {\n if (!isMatch) {\n logger.debug('incorrect password');\n throw new Error('Authentication failed, you do not have access to that channel');\n }\n logger.debug('...password was a match...');\n resolve(channelData);\n })\n .catch(error => {\n reject(error);\n });\n });\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/auth/authentication.js","const CLAIMS_PER_PAGE = 12;\n\nmodule.exports = {\n returnPaginatedChannelClaims (channelName, longChannelClaimId, claims, page) {\n const totalPages = module.exports.determineTotalPages(claims);\n const paginationPage = module.exports.getPageFromQuery(page);\n const viewData = {\n channelName : channelName,\n longChannelClaimId: longChannelClaimId,\n claims : module.exports.extractPageFromClaims(claims, paginationPage),\n previousPage : module.exports.determinePreviousPage(paginationPage),\n currentPage : paginationPage,\n nextPage : module.exports.determineNextPage(totalPages, paginationPage),\n totalPages : totalPages,\n totalResults : module.exports.determineTotalClaims(claims),\n };\n return viewData;\n },\n getPageFromQuery (page) {\n if (page) {\n return parseInt(page);\n }\n return 1;\n },\n extractPageFromClaims (claims, pageNumber) {\n if (!claims) {\n return []; // if no claims, return this default\n }\n // logger.debug('claims is array?', Array.isArray(claims));\n // logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));\n const claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;\n const claimEndIndex = claimStartIndex + CLAIMS_PER_PAGE;\n const pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);\n return pageOfClaims;\n },\n determineTotalPages (claims) {\n if (!claims) {\n return 0;\n } else {\n const totalClaims = claims.length;\n if (totalClaims < CLAIMS_PER_PAGE) {\n return 1;\n }\n const fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);\n const remainder = totalClaims % CLAIMS_PER_PAGE;\n if (remainder === 0) {\n return fullPages;\n }\n return fullPages + 1;\n }\n },\n determinePreviousPage (currentPage) {\n if (currentPage === 1) {\n return null;\n }\n return currentPage - 1;\n },\n determineNextPage (totalPages, currentPage) {\n if (currentPage === totalPages) {\n return null;\n }\n return currentPage + 1;\n },\n determineTotalClaims (claims) {\n if (!claims) {\n return 0;\n }\n return claims.length;\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/channelPagination.js","const { details: host } = require('../../config/siteConfig.js');\nconst handlePageRender = require('../helpers/handlePageRender.jsx');\n\nmodule.exports = (app) => {\n // route for the home page\n app.get('/', (req, res) => {\n handlePageRender(req, res);\n });\n // route to display login page\n app.get('/login', (req, res) => {\n handlePageRender(req, res);\n });\n // route to show 'about' page\n app.get('/about', (req, res) => {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/trending', (req, res) => {\n res.status(301).redirect('/popular');\n });\n app.get('/popular', (req, res) => {\n handlePageRender(req, res);\n });\n // route to display a list of the trending images\n app.get('/new', (req, res) => {\n handlePageRender(req, res);\n });\n // route to send embedable video player (for twitter)\n app.get('/embed/:claimId/:name', ({ params }, res) => {\n const claimId = params.claimId;\n const name = params.name;\n // get and render the content\n res.status(200).render('embed', { layout: 'embed', host, claimId, name });\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/routes/page-routes.js","import * as actions from 'constants/publish_action_types';\nimport { LOGIN } from 'constants/publish_channel_select_states';\nconst { publishing } = require('../../config/siteConfig.js');\n\nconst initialState = {\n disabled : publishing.disabled,\n disabledMessage : publishing.disabledMessage,\n publishInChannel : false,\n selectedChannel : LOGIN,\n showMetadataInputs: false,\n status : {\n status : null,\n message: null,\n },\n error: {\n file : null,\n url : null,\n channel : null,\n publishSubmit: null,\n },\n file : null,\n claim : '',\n metadata: {\n title : '',\n description: '',\n license : '',\n nsfw : false,\n },\n thumbnail: null,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case actions.FILE_SELECTED:\n return Object.assign({}, initialState, { // note: clears to initial state\n file: action.data,\n });\n case actions.FILE_CLEAR:\n return initialState;\n case actions.METADATA_UPDATE:\n return Object.assign({}, state, {\n metadata: Object.assign({}, state.metadata, {\n [action.data.name]: action.data.value,\n }),\n });\n case actions.CLAIM_UPDATE:\n return Object.assign({}, state, {\n claim: action.data,\n });\n case actions.SET_PUBLISH_IN_CHANNEL:\n return Object.assign({}, state, {\n publishInChannel: action.channel,\n });\n case actions.PUBLISH_STATUS_UPDATE:\n return Object.assign({}, state, {\n status: action.data,\n });\n case actions.ERROR_UPDATE:\n return Object.assign({}, state, {\n error: Object.assign({}, state.error, {\n [action.data.name]: action.data.value,\n }),\n });\n case actions.SELECTED_CHANNEL_UPDATE:\n return Object.assign({}, state, {\n selectedChannel: action.data,\n });\n case actions.TOGGLE_METADATA_INPUTS:\n return Object.assign({}, state, {\n showMetadataInputs: action.data,\n });\n case actions.THUMBNAIL_NEW:\n return Object.assign({}, state, {\n thumbnail: action.data,\n });\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./client/reducers/publish.js","import * as actions from 'constants/channel_action_types';\n\nconst initialState = {\n loggedInChannel: {\n name : null,\n shortId: null,\n longId : null,\n },\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case actions.CHANNEL_UPDATE:\n return Object.assign({}, state, {\n loggedInChannel: action.data,\n });\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./client/reducers/channel.js","import * as actions from 'constants/show_action_types';\nimport { LOCAL_CHECK, ERROR } from 'constants/asset_display_states';\n\nconst initialState = {\n request: {\n error: null,\n type : null,\n id : null,\n },\n requestList : {},\n channelList : {},\n assetList : {},\n displayAsset: {\n error : null,\n status: LOCAL_CHECK,\n },\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n // handle request\n case actions.REQUEST_ERROR:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n error: action.data,\n }),\n });\n case actions.REQUEST_UPDATE:\n return Object.assign({}, state, {\n request: Object.assign({}, state.request, {\n type: action.data.requestType,\n id : action.data.requestId,\n }),\n });\n // store requests\n case actions.REQUEST_LIST_ADD:\n return Object.assign({}, state, {\n requestList: Object.assign({}, state.requestList, {\n [action.data.id]: {\n error: action.data.error,\n key : action.data.key,\n },\n }),\n });\n // asset data\n case actions.ASSET_ADD:\n return Object.assign({}, state, {\n assetList: Object.assign({}, state.assetList, {\n [action.data.id]: {\n error : action.data.error,\n name : action.data.name,\n claimId : action.data.claimId,\n shortId : action.data.shortId,\n claimData: action.data.claimData,\n },\n }),\n });\n // channel data\n case actions.CHANNEL_ADD:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, {\n [action.data.id]: {\n name : action.data.name,\n longId : action.data.longId,\n shortId : action.data.shortId,\n claimsData: action.data.claimsData,\n },\n }),\n });\n case actions.CHANNEL_CLAIMS_UPDATE_SUCCESS:\n return Object.assign({}, state, {\n channelList: Object.assign({}, state.channelList, {\n [action.data.channelListId]: Object.assign({}, state.channelList[action.data.channelListId], {\n claimsData: action.data.claimsData,\n }),\n }),\n });\n // display an asset\n case actions.FILE_AVAILABILITY_UPDATE:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n status: action.data,\n }),\n });\n case actions.DISPLAY_ASSET_ERROR:\n return Object.assign({}, state, {\n displayAsset: Object.assign({}, state.displayAsset, {\n error : action.data,\n status: ERROR,\n }),\n });\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./client/reducers/show.js","const siteConfig = require('../../config/siteConfig.js');\n\nconst {\n analytics: {\n googleId: googleAnalyticsId,\n },\n assetDefaults: {\n thumbnail: defaultThumbnail,\n description: defaultDescription,\n },\n details: {\n description,\n host,\n title,\n twitter,\n },\n} = siteConfig;\n\nconst initialState = {\n description,\n googleAnalyticsId,\n host,\n title,\n twitter,\n defaultDescription,\n defaultThumbnail,\n};\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n default:\n return state;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./client/reducers/site.js","module.exports = require(\"react-ga\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"react-ga\"\n// module id = 151\n// module chunks = 0","module.exports = require(\"cross-fetch/polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"cross-fetch/polyfill\"\n// module id = 152\n// module chunks = 0","const { sendGAServeEvent } = require('../helpers/googleAnalytics');\nconst { determineResponseType, flipClaimNameAndIdForBackwardsCompatibility, logRequestData, getClaimIdAndServeAsset } = require('../helpers/serveHelpers.js');\nconst lbryUri = require('../helpers/lbryUri.js');\nconst handleShowRender = require('../helpers/handleShowRender.jsx');\nconst SERVE = 'SERVE';\n\nmodule.exports = (app) => {\n // route to serve a specific asset using the channel or claim id\n app.get('/:identifier/:claim', (req, res) => {\n const { headers, ip, originalUrl, params } = req;\n // decide if this is a show request\n let hasFileExtension;\n try {\n ({ hasFileExtension } = lbryUri.parseModifier(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n let responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n let claimName;\n try {\n ({ claimName } = lbryUri.parseClaim(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n // parse the identifier\n let isChannel, channelName, channelClaimId, claimId;\n try {\n ({ isChannel, channelName, channelClaimId, claimId } = lbryUri.parseIdentifier(params.identifier));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n if (!isChannel) {\n [claimId, claimName] = flipClaimNameAndIdForBackwardsCompatibility(claimId, claimName);\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, channelName, claimId);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(channelName, channelClaimId, claimName, claimId, originalUrl, ip, res);\n });\n // route to serve the winning asset at a claim or a channel page\n app.get('/:claim', (req, res) => {\n const { headers, ip, originalUrl, params } = req;\n // decide if this is a show request\n let hasFileExtension;\n try {\n ({ hasFileExtension } = lbryUri.parseModifier(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n let responseType = determineResponseType(hasFileExtension, headers);\n if (responseType !== SERVE) {\n return handleShowRender(req, res);\n }\n // handle serve request\n // send google analytics\n sendGAServeEvent(headers, ip, originalUrl);\n // parse the claim\n let claimName;\n try {\n ({claimName} = lbryUri.parseClaim(params.claim));\n } catch (error) {\n return res.status(400).json({success: false, message: error.message});\n }\n // log the request data for debugging\n logRequestData(responseType, claimName, null, null);\n // get the claim Id and then serve the asset\n getClaimIdAndServeAsset(null, null, claimName, null, originalUrl, ip, res);\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/routes/asset-routes.js","const logger = require('winston');\nconst { getClaimId, getLocalFileRecord } = require('../controllers/serveController.js');\nconst { handleErrorResponse } = require('./errorHandlers.js');\n\nconst SERVE = 'SERVE';\nconst SHOW = 'SHOW';\nconst NO_FILE = 'NO_FILE';\nconst NO_CHANNEL = 'NO_CHANNEL';\nconst NO_CLAIM = 'NO_CLAIM';\n\nfunction clientAcceptsHtml ({accept}) {\n return accept && accept.match(/text\\/html/);\n};\n\nfunction requestIsFromBrowser (headers) {\n return headers['user-agent'] && headers['user-agent'].match(/Mozilla/);\n};\n\nfunction clientWantsAsset ({accept, range}) {\n const imageIsWanted = accept && accept.match(/image\\/.*/) && !accept.match(/text\\/html/) && !accept.match(/text\\/\\*/);\n const videoIsWanted = accept && range;\n return imageIsWanted || videoIsWanted;\n};\n\nfunction isValidClaimId (claimId) {\n return ((claimId.length === 40) && !/[^A-Za-z0-9]/g.test(claimId));\n};\n\nfunction isValidShortId (claimId) {\n return claimId.length === 1; // it should really evaluate the short url itself\n};\n\nfunction isValidShortIdOrClaimId (input) {\n return (isValidClaimId(input) || isValidShortId(input));\n};\n\nfunction serveAssetToClient (claimId, name, res) {\n return getLocalFileRecord(claimId, name)\n .then(fileRecord => {\n // check that a local record was found\n if (fileRecord === NO_FILE) {\n return res.status(307).redirect(`/api/claim/get/${name}/${claimId}`);\n }\n // serve the file\n const {filePath, fileType} = fileRecord;\n logger.verbose(`serving file: ${filePath}`);\n const sendFileOptions = {\n headers: {\n 'X-Content-Type-Options': 'nosniff',\n 'Content-Type' : fileType || 'image/jpeg',\n },\n };\n res.status(200).sendFile(filePath, sendFileOptions);\n })\n .catch(error => {\n throw error;\n });\n};\n\nmodule.exports = {\n getClaimIdAndServeAsset (channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) {\n // get the claim Id and then serve the asset\n getClaimId(channelName, channelClaimId, claimName, claimId)\n .then(fullClaimId => {\n if (fullClaimId === NO_CLAIM) {\n return res.status(404).json({success: false, message: 'no claim id could be found'});\n } else if (fullClaimId === NO_CHANNEL) {\n return res.status(404).json({success: false, message: 'no channel id could be found'});\n }\n serveAssetToClient(fullClaimId, claimName, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'success');\n })\n .catch(error => {\n handleErrorResponse(originalUrl, ip, error, res);\n // postToStats(responseType, originalUrl, ip, claimName, fullClaimId, 'fail');\n });\n },\n determineResponseType (hasFileExtension, headers) {\n let responseType;\n if (hasFileExtension) {\n responseType = SERVE; // assume a serve request if file extension is present\n if (clientAcceptsHtml(headers)) { // if the request comes from a browser, change it to a show request\n responseType = SHOW;\n }\n } else {\n responseType = SHOW;\n if (clientWantsAsset(headers) && requestIsFromBrowser(headers)) { // this is in case someone embeds a show url\n logger.debug('Show request came from browser but wants an image/video. Changing response to serve...');\n responseType = SERVE;\n }\n }\n return responseType;\n },\n flipClaimNameAndIdForBackwardsCompatibility (identifier, name) {\n // this is a patch for backwards compatability with '/name/claim_id' url format\n if (isValidShortIdOrClaimId(name) && !isValidShortIdOrClaimId(identifier)) {\n const tempName = name;\n name = identifier;\n identifier = tempName;\n }\n return [identifier, name];\n },\n logRequestData (responseType, claimName, channelName, claimId) {\n logger.debug('responseType ===', responseType);\n logger.debug('claim name === ', claimName);\n logger.debug('channel name ===', channelName);\n logger.debug('claim id ===', claimId);\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/serveHelpers.js","const logger = require('winston');\n\nmodule.exports = {\n REGEXP_INVALID_CLAIM : /[^A-Za-z0-9-]/g,\n REGEXP_INVALID_CHANNEL: /[^A-Za-z0-9-@]/g,\n REGEXP_ADDRESS : /^b(?=[^0OIl]{32,33})[0-9A-Za-z]{32,33}$/,\n CHANNEL_CHAR : '@',\n parseIdentifier : function (identifier) {\n logger.debug('parsing identifier:', identifier);\n const componentsRegex = new RegExp(\n '([^:$#/]*)' + // value (stops at the first separator or end)\n '([:$#]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, value, modifierSeperator, modifier] = componentsRegex\n .exec(identifier)\n .map(match => match || null);\n logger.debug(`${proto}, ${value}, ${modifierSeperator}, ${modifier}`);\n\n // Validate and process name\n if (!value) {\n throw new Error(`Check your url. No channel name provided before \"${modifierSeperator}\"`);\n }\n const isChannel = value.startsWith(module.exports.CHANNEL_CHAR);\n const channelName = isChannel ? value : null;\n let claimId;\n if (isChannel) {\n if (!channelName) {\n throw new Error('No channel name after @.');\n }\n const nameBadChars = (channelName).match(module.exports.REGEXP_INVALID_CHANNEL);\n if (nameBadChars) {\n throw new Error(`Invalid characters in channel name: ${nameBadChars.join(', ')}.`);\n }\n } else {\n claimId = value;\n }\n\n // Validate and process modifier\n let channelClaimId;\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error(`No modifier provided after separator \"${modifierSeperator}\"`);\n }\n\n if (modifierSeperator === ':') {\n channelClaimId = modifier;\n } else {\n throw new Error(`The \"${modifierSeperator}\" modifier is not currently supported`);\n }\n }\n return {\n isChannel,\n channelName,\n channelClaimId,\n claimId,\n };\n },\n parseClaim: function (claim) {\n logger.debug('parsing name:', claim);\n const componentsRegex = new RegExp(\n '([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, claimName, modifierSeperator, modifier] = componentsRegex\n .exec(claim)\n .map(match => match || null);\n logger.debug(`${proto}, ${claimName}, ${modifierSeperator}, ${modifier}`);\n\n // Validate and process name\n if (!claimName) {\n throw new Error('No claim name provided before .');\n }\n const nameBadChars = (claimName).match(module.exports.REGEXP_INVALID_CLAIM);\n if (nameBadChars) {\n throw new Error(`Invalid characters in claim name: ${nameBadChars.join(', ')}.`);\n }\n // Validate and process modifier\n if (modifierSeperator) {\n if (!modifier) {\n throw new Error(`No file extension provided after separator ${modifierSeperator}.`);\n }\n if (modifierSeperator !== '.') {\n throw new Error(`The ${modifierSeperator} modifier is not supported in the claim name`);\n }\n }\n // return results\n return {\n claimName,\n };\n },\n parseModifier: function (claim) {\n logger.debug('parsing modifier:', claim);\n const componentsRegex = new RegExp(\n '([^:$#/.]*)' + // name (stops at the first modifier)\n '([:$#.]?)([^/]*)' // modifier separator, modifier (stops at the first path separator or end)\n );\n const [proto, claimName, modifierSeperator, modifier] = componentsRegex\n .exec(claim)\n .map(match => match || null);\n logger.debug(`${proto}, ${claimName}, ${modifierSeperator}, ${modifier}`);\n // Validate and process modifier\n let hasFileExtension = false;\n if (modifierSeperator) {\n hasFileExtension = true;\n }\n return {\n hasFileExtension,\n };\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/lbryUri.js","import React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { createStore, applyMiddleware } from 'redux';\nimport Reducer from '../../client/reducers/index';\nimport { Provider } from 'react-redux';\nimport { StaticRouter } from 'react-router-dom';\nimport GAListener from '../../client/components/GAListener/index';\nimport App from '../../client/app';\nimport renderFullPage from './renderFullPage';\nimport createSagaMiddleware from 'redux-saga';\nimport { call } from 'redux-saga/effects';\nimport { handleShowPageUri } from '../../client/sagas/show_uri';\nimport { onHandleShowPageUri } from '../../client/actions/show';\n\nimport Helmet from 'react-helmet';\n\nconst returnSagaWithParams = (saga, params) => {\n return function * () {\n yield call(saga, params);\n };\n};\n\nmodule.exports = (req, res) => {\n let context = {};\n\n // create and apply middleware\n const sagaMiddleware = createSagaMiddleware();\n const middleware = applyMiddleware(sagaMiddleware);\n\n // create a new Redux store instance\n const store = createStore(Reducer, middleware);\n\n // create saga\n const action = onHandleShowPageUri(req.params);\n const saga = returnSagaWithParams(handleShowPageUri, action);\n\n // run the saga middleware\n sagaMiddleware\n .run(saga)\n .done\n .then(() => {\n // render component to a string\n const html = renderToString(\n \n \n \n \n \n \n \n );\n\n // get head tags from helmet\n const helmet = Helmet.renderStatic();\n\n // check for a redirect\n if (context.url) {\n return res.redirect(301, context.url);\n }\n\n // get the initial state from our Redux store\n const preloadedState = store.getState();\n\n // send the rendered page back to the client\n res.send(renderFullPage(helmet, html, preloadedState));\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/handleShowRender.jsx","module.exports = require(\"redux-saga\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redux-saga\"\n// module id = 157\n// module chunks = 0","import { call, put, takeLatest } from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { onRequestError, onNewChannelRequest, onNewAssetRequest } from 'actions/show';\nimport { newAssetRequest } from 'sagas/show_asset';\nimport { newChannelRequest } from 'sagas/show_channel';\nimport lbryUri from 'utils/lbryUri';\n\nfunction * parseAndUpdateIdentifierAndClaim (modifier, claim) {\n // this is a request for an asset\n // claim will be an asset claim\n // the identifier could be a channel or a claim id\n let isChannel, channelName, channelClaimId, claimId, claimName, extension;\n try {\n ({ isChannel, channelName, channelClaimId, claimId } = lbryUri.parseIdentifier(modifier));\n ({ claimName, extension } = lbryUri.parseClaim(claim));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // trigger an new action to update the store\n if (isChannel) {\n return yield call(newAssetRequest, onNewAssetRequest(claimName, null, channelName, channelClaimId, extension));\n };\n yield call(newAssetRequest, onNewAssetRequest(claimName, claimId, null, null, extension));\n}\nfunction * parseAndUpdateClaimOnly (claim) {\n // this could be a request for an asset or a channel page\n // claim could be an asset claim or a channel claim\n let isChannel, channelName, channelClaimId;\n try {\n ({ isChannel, channelName, channelClaimId } = lbryUri.parseIdentifier(claim));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // trigger an new action to update the store\n // return early if this request is for a channel\n if (isChannel) {\n return yield call(newChannelRequest, onNewChannelRequest(channelName, channelClaimId));\n }\n // if not for a channel, parse the claim request\n let claimName, extension;\n try {\n ({claimName, extension} = lbryUri.parseClaim(claim));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n yield call(newAssetRequest, onNewAssetRequest(claimName, null, null, null, extension));\n}\n\nexport function * handleShowPageUri (action) {\n const { identifier, claim } = action.data;\n if (identifier) {\n return yield call(parseAndUpdateIdentifierAndClaim, identifier, claim);\n }\n yield call(parseAndUpdateClaimOnly, claim);\n};\n\nexport function * watchHandleShowPageUri () {\n yield takeLatest(actions.HANDLE_SHOW_URI, handleShowPageUri);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/sagas/show_uri.js","import { call, put, select, takeLatest } from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { addRequestToRequestList, onRequestError, onRequestUpdate, addAssetToAssetList } from 'actions/show';\nimport { getLongClaimId, getShortId, getClaimData } from 'api/assetApi';\nimport { selectShowState } from 'selectors/show';\nimport { selectSiteHost } from 'selectors/site';\n\nexport function * newAssetRequest (action) {\n const { requestType, requestId, name, modifier } = action.data;\n // put an action to update the request in redux\n yield put(onRequestUpdate(requestType, requestId));\n // is this an existing request?\n // If this uri is in the request list, it's already been fetched\n const state = yield select(selectShowState);\n const host = yield select(selectSiteHost);\n if (state.requestList[requestId]) {\n return null;\n }\n // get long id && add request to request list\n let longId;\n try {\n ({data: longId} = yield call(getLongClaimId, host, name, modifier));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n const assetKey = `a#${name}#${longId}`;\n yield put(addRequestToRequestList(requestId, null, assetKey));\n // is this an existing asset?\n // If this asset is in the asset list, it's already been fetched\n if (state.assetList[assetKey]) {\n return null;\n }\n // get short Id\n let shortId;\n try {\n ({data: shortId} = yield call(getShortId, host, name, longId));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // get asset claim data\n let claimData;\n try {\n ({data: claimData} = yield call(getClaimData, host, name, longId));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // add asset to asset list\n yield put(addAssetToAssetList(assetKey, null, name, longId, shortId, claimData));\n // clear any errors in request error\n yield put(onRequestError(null));\n};\n\nexport function * watchNewAssetRequest () {\n yield takeLatest(actions.ASSET_REQUEST_NEW, newAssetRequest);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/sagas/show_asset.js","import Request from 'utils/request';\n\nexport function getLongClaimId (host, name, modifier) {\n let body = {};\n // create request params\n if (modifier) {\n if (modifier.id) {\n body['claimId'] = modifier.id;\n } else {\n body['channelName'] = modifier.channel.name;\n body['channelClaimId'] = modifier.channel.id;\n }\n }\n body['claimName'] = name;\n const params = {\n method : 'POST',\n headers: { 'Content-Type': 'application/json' },\n body : JSON.stringify(body),\n };\n // create url\n const url = `${host}/api/claim/long-id`;\n // return the request promise\n return Request(url, params);\n};\n\nexport function getShortId (host, name, claimId) {\n const url = `${host}/api/claim/short-id/${claimId}/${name}`;\n return Request(url);\n};\n\nexport function getClaimData (host, name, claimId) {\n const url = `${host}/api/claim/data/${name}/${claimId}`;\n return Request(url);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/api/assetApi.js","import {call, put, select, takeLatest} from 'redux-saga/effects';\nimport * as actions from 'constants/show_action_types';\nimport { addNewChannelToChannelList, addRequestToRequestList, onRequestError, onRequestUpdate, updateChannelClaims } from 'actions/show';\nimport { getChannelClaims, getChannelData } from 'api/channelApi';\nimport { selectShowState } from 'selectors/show';\nimport { selectSiteHost } from 'selectors/site';\n\nexport function * newChannelRequest (action) {\n const { requestType, requestId, channelName, channelId } = action.data;\n // put an action to update the request in redux\n yield put(onRequestUpdate(requestType, requestId));\n // is this an existing request?\n // If this uri is in the request list, it's already been fetched\n const state = yield select(selectShowState);\n const host = yield select(selectSiteHost);\n if (state.requestList[requestId]) {\n return null;\n }\n // get channel long id\n let longId, shortId;\n try {\n ({ data: {longChannelClaimId: longId, shortChannelClaimId: shortId} } = yield call(getChannelData, host, channelName, channelId));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // store the request in the channel requests list\n const channelKey = `c#${channelName}#${longId}`;\n yield put(addRequestToRequestList(requestId, null, channelKey));\n // is this an existing channel?\n // If this channel is in the channel list, it's already been fetched\n if (state.channelList[channelKey]) {\n return null;\n }\n // get channel claims data\n let claimsData;\n try {\n ({ data: claimsData } = yield call(getChannelClaims, host, longId, channelName, 1));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n // store the channel data in the channel list\n yield put(addNewChannelToChannelList(channelKey, channelName, shortId, longId, claimsData));\n // clear any request errors\n yield put(onRequestError(null));\n}\n\nexport function * watchNewChannelRequest () {\n yield takeLatest(actions.CHANNEL_REQUEST_NEW, newChannelRequest);\n};\n\nfunction * getNewClaimsAndUpdateChannel (action) {\n const { channelKey, name, longId, page } = action.data;\n const host = yield select(selectSiteHost);\n let claimsData;\n try {\n ({ data: claimsData } = yield call(getChannelClaims, host, longId, name, page));\n } catch (error) {\n return yield put(onRequestError(error.message));\n }\n yield put(updateChannelClaims(channelKey, claimsData));\n}\n\nexport function * watchUpdateChannelClaims () {\n yield takeLatest(actions.CHANNEL_CLAIMS_UPDATE_ASYNC, getNewClaimsAndUpdateChannel);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./client/sagas/show_channel.js","import Request from 'utils/request';\n\nexport function getChannelData (host, id, name) {\n if (!id) id = 'none';\n const url = `${host}/api/channel/data/${name}/${id}`;\n return Request(url);\n};\n\nexport function getChannelClaims (host, longId, name, page) {\n if (!page) page = 1;\n const url = `${host}/api/channel/claims/${name}/${longId}/${page}`;\n return Request(url);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./client/api/channelApi.js","const handlePageRender = require('../helpers/handlePageRender.jsx');\n\nmodule.exports = app => {\n // a catch-all route if someone visits a page that does not exist\n app.use('*', (req, res) => {\n // send response\n handlePageRender(req, res);\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/routes/fallback-routes.js","const { logLevel } = require('../../config/loggerConfig');\n\nmodule.exports = (winston) => {\n // configure\n winston.configure({\n transports: [\n new (winston.transports.Console)({\n level : logLevel,\n timestamp : false,\n colorize : true,\n prettyPrint : true,\n handleExceptions : true,\n humanReadableUnhandledException: true,\n }),\n ],\n });\n // test all the log levels\n winston.error('Level 0');\n winston.warn('Level 1');\n winston.info('Level 2');\n winston.verbose('Level 3');\n winston.debug('Level 4');\n winston.silly('Level 5');\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/configureLogger.js","const loggerConfig = {\n logLevel: 'debug', // options: silly, debug, verbose, info\n};\n\nmodule.exports = loggerConfig;\n\n\n\n// WEBPACK FOOTER //\n// ./config/loggerConfig.js","const winstonSlackWebHook = require('winston-slack-webhook').SlackWebHook;\nconst slackConfig = require('../../config/slackConfig.js');\n\nmodule.exports = (winston) => {\n const {slackWebHook, slackErrorChannel, slackInfoChannel} = slackConfig;\n if (slackWebHook) {\n // add a transport for errors to slack\n if (slackErrorChannel) {\n winston.add(winstonSlackWebHook, {\n name : 'slack-errors-transport',\n level : 'warn',\n webhookUrl: slackWebHook,\n channel : slackErrorChannel,\n username : 'spee.ch',\n iconEmoji : ':face_with_head_bandage:',\n });\n };\n if (slackInfoChannel) {\n winston.add(winstonSlackWebHook, {\n name : 'slack-info-transport',\n level : 'info',\n webhookUrl: slackWebHook,\n channel : slackInfoChannel,\n username : 'spee.ch',\n iconEmoji : ':nerd_face:',\n });\n };\n // send test message\n winston.error('Slack \"error\" logging is online.');\n winston.info('Slack \"info\" logging is online.');\n } else {\n winston.warn('Slack logging is not enabled because no slackWebHook config var provided.');\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./server/helpers/configureSlack.js","module.exports = require(\"winston-slack-webhook\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"winston-slack-webhook\"\n// module id = 167\n// module chunks = 0","var map = {\n\t\"./\": 50,\n\t\"./ActiveStatusBar\": 24,\n\t\"./ActiveStatusBar/\": 24,\n\t\"./ActiveStatusBar/index\": 24,\n\t\"./ActiveStatusBar/index.jsx\": 24,\n\t\"./AssetPreview\": 34,\n\t\"./AssetPreview/\": 34,\n\t\"./AssetPreview/index\": 34,\n\t\"./AssetPreview/index.js\": 34,\n\t\"./AssetPreview/view\": 78,\n\t\"./AssetPreview/view.jsx\": 78,\n\t\"./ExpandingTextArea\": 36,\n\t\"./ExpandingTextArea/\": 36,\n\t\"./ExpandingTextArea/index\": 36,\n\t\"./ExpandingTextArea/index.jsx\": 36,\n\t\"./GAListener\": 13,\n\t\"./GAListener/\": 13,\n\t\"./GAListener/index\": 13,\n\t\"./GAListener/index.jsx\": 13,\n\t\"./InactiveStatusBar\": 25,\n\t\"./InactiveStatusBar/\": 25,\n\t\"./InactiveStatusBar/index\": 25,\n\t\"./InactiveStatusBar/index.jsx\": 25,\n\t\"./Logo\": 21,\n\t\"./Logo/\": 21,\n\t\"./Logo/index\": 21,\n\t\"./Logo/index.jsx\": 21,\n\t\"./NavBarChannelOptionsDropdown\": 22,\n\t\"./NavBarChannelOptionsDropdown/\": 22,\n\t\"./NavBarChannelOptionsDropdown/index\": 22,\n\t\"./NavBarChannelOptionsDropdown/index.jsx\": 22,\n\t\"./ProgressBar\": 10,\n\t\"./ProgressBar/\": 10,\n\t\"./ProgressBar/index\": 10,\n\t\"./ProgressBar/index.jsx\": 10,\n\t\"./PublishPreview\": 37,\n\t\"./PublishPreview/\": 37,\n\t\"./PublishPreview/index\": 37,\n\t\"./PublishPreview/index.jsx\": 37,\n\t\"./PublishUrlMiddleDisplay\": 38,\n\t\"./PublishUrlMiddleDisplay/\": 38,\n\t\"./PublishUrlMiddleDisplay/index\": 38,\n\t\"./PublishUrlMiddleDisplay/index.jsx\": 38,\n\t\"./SEO\": 7,\n\t\"./SEO/\": 7,\n\t\"./SEO/index\": 7,\n\t\"./SEO/index.js\": 7,\n\t\"./SEO/view\": 66,\n\t\"./SEO/view.jsx\": 66,\n\t\"./index\": 50,\n\t\"./index.js\": 50\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 168;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./client/components ^\\.\\/.*$\n// module id = 168\n// module chunks = 0","var map = {\n\t\"./\": 52,\n\t\"./AssetDisplay\": 17,\n\t\"./AssetDisplay/\": 17,\n\t\"./AssetDisplay/index\": 17,\n\t\"./AssetDisplay/index.js\": 17,\n\t\"./AssetDisplay/view\": 72,\n\t\"./AssetDisplay/view.jsx\": 72,\n\t\"./AssetInfo\": 31,\n\t\"./AssetInfo/\": 31,\n\t\"./AssetInfo/index\": 31,\n\t\"./AssetInfo/index.js\": 31,\n\t\"./AssetInfo/view\": 75,\n\t\"./AssetInfo/view.jsx\": 75,\n\t\"./AssetTitle\": 30,\n\t\"./AssetTitle/\": 30,\n\t\"./AssetTitle/index\": 30,\n\t\"./AssetTitle/index.js\": 30,\n\t\"./AssetTitle/view\": 74,\n\t\"./AssetTitle/view.jsx\": 74,\n\t\"./ChannelClaimsDisplay\": 33,\n\t\"./ChannelClaimsDisplay/\": 33,\n\t\"./ChannelClaimsDisplay/index\": 33,\n\t\"./ChannelClaimsDisplay/index.js\": 33,\n\t\"./ChannelClaimsDisplay/view\": 77,\n\t\"./ChannelClaimsDisplay/view.jsx\": 77,\n\t\"./ChannelCreateForm\": 16,\n\t\"./ChannelCreateForm/\": 16,\n\t\"./ChannelCreateForm/index\": 16,\n\t\"./ChannelCreateForm/index.js\": 16,\n\t\"./ChannelCreateForm/view\": 69,\n\t\"./ChannelCreateForm/view.jsx\": 69,\n\t\"./ChannelLoginForm\": 15,\n\t\"./ChannelLoginForm/\": 15,\n\t\"./ChannelLoginForm/index\": 15,\n\t\"./ChannelLoginForm/index.js\": 15,\n\t\"./ChannelLoginForm/view\": 68,\n\t\"./ChannelLoginForm/view.jsx\": 68,\n\t\"./ChannelSelect\": 39,\n\t\"./ChannelSelect/\": 39,\n\t\"./ChannelSelect/index\": 39,\n\t\"./ChannelSelect/index.js\": 39,\n\t\"./ChannelSelect/view\": 81,\n\t\"./ChannelSelect/view.jsx\": 81,\n\t\"./Dropzone\": 18,\n\t\"./Dropzone/\": 18,\n\t\"./Dropzone/index\": 18,\n\t\"./Dropzone/index.js\": 18,\n\t\"./Dropzone/view\": 82,\n\t\"./Dropzone/view.jsx\": 82,\n\t\"./FourOhFourPage\": 35,\n\t\"./FourOhFourPage/\": 35,\n\t\"./FourOhFourPage/index\": 35,\n\t\"./FourOhFourPage/index.jsx\": 35,\n\t\"./FourOhFourPage/view\": 79,\n\t\"./FourOhFourPage/view.jsx\": 79,\n\t\"./NavBar\": 5,\n\t\"./NavBar/\": 5,\n\t\"./NavBar/index\": 5,\n\t\"./NavBar/index.js\": 5,\n\t\"./NavBar/view\": 65,\n\t\"./NavBar/view.jsx\": 65,\n\t\"./PublishDetails\": 40,\n\t\"./PublishDetails/\": 40,\n\t\"./PublishDetails/index\": 40,\n\t\"./PublishDetails/index.js\": 40,\n\t\"./PublishDetails/view\": 83,\n\t\"./PublishDetails/view.jsx\": 83,\n\t\"./PublishDisabledMessage\": 45,\n\t\"./PublishDisabledMessage/\": 45,\n\t\"./PublishDisabledMessage/index\": 45,\n\t\"./PublishDisabledMessage/index.js\": 45,\n\t\"./PublishDisabledMessage/view\": 88,\n\t\"./PublishDisabledMessage/view.jsx\": 88,\n\t\"./PublishMetadataInputs\": 44,\n\t\"./PublishMetadataInputs/\": 44,\n\t\"./PublishMetadataInputs/index\": 44,\n\t\"./PublishMetadataInputs/index.js\": 44,\n\t\"./PublishMetadataInputs/view\": 87,\n\t\"./PublishMetadataInputs/view.jsx\": 87,\n\t\"./PublishStatus\": 46,\n\t\"./PublishStatus/\": 46,\n\t\"./PublishStatus/index\": 46,\n\t\"./PublishStatus/index.js\": 46,\n\t\"./PublishStatus/view\": 89,\n\t\"./PublishStatus/view.jsx\": 89,\n\t\"./PublishThumbnailInput\": 43,\n\t\"./PublishThumbnailInput/\": 43,\n\t\"./PublishThumbnailInput/index\": 43,\n\t\"./PublishThumbnailInput/index.js\": 43,\n\t\"./PublishThumbnailInput/view\": 86,\n\t\"./PublishThumbnailInput/view.jsx\": 86,\n\t\"./PublishTitleInput\": 41,\n\t\"./PublishTitleInput/\": 41,\n\t\"./PublishTitleInput/index\": 41,\n\t\"./PublishTitleInput/index.js\": 41,\n\t\"./PublishTitleInput/view\": 84,\n\t\"./PublishTitleInput/view.jsx\": 84,\n\t\"./PublishTool\": 47,\n\t\"./PublishTool/\": 47,\n\t\"./PublishTool/index\": 47,\n\t\"./PublishTool/index.js\": 47,\n\t\"./PublishTool/view\": 90,\n\t\"./PublishTool/view.jsx\": 90,\n\t\"./PublishUrlInput\": 42,\n\t\"./PublishUrlInput/\": 42,\n\t\"./PublishUrlInput/index\": 42,\n\t\"./PublishUrlInput/index.js\": 42,\n\t\"./PublishUrlInput/view\": 85,\n\t\"./PublishUrlInput/view.jsx\": 85,\n\t\"./ShowAssetDetails\": 29,\n\t\"./ShowAssetDetails/\": 29,\n\t\"./ShowAssetDetails/index\": 29,\n\t\"./ShowAssetDetails/index.js\": 29,\n\t\"./ShowAssetDetails/view\": 73,\n\t\"./ShowAssetDetails/view.jsx\": 73,\n\t\"./ShowAssetLite\": 27,\n\t\"./ShowAssetLite/\": 27,\n\t\"./ShowAssetLite/index\": 27,\n\t\"./ShowAssetLite/index.js\": 27,\n\t\"./ShowAssetLite/view\": 71,\n\t\"./ShowAssetLite/view.jsx\": 71,\n\t\"./ShowChannel\": 32,\n\t\"./ShowChannel/\": 32,\n\t\"./ShowChannel/index\": 32,\n\t\"./ShowChannel/index.js\": 32,\n\t\"./ShowChannel/view\": 76,\n\t\"./ShowChannel/view.jsx\": 76,\n\t\"./index\": 52,\n\t\"./index.js\": 52\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 169;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./client/containers ^\\.\\/.*$\n// module id = 169\n// module chunks = 0","export const LOAD_START = 'LOAD_START';\nexport const LOADING = 'LOADING';\nexport const PUBLISHING = 'PUBLISHING';\nexport const SUCCESS = 'SUCCESS';\nexport const FAILED = 'FAILED';\n\n\n\n// WEBPACK FOOTER //\n// ./client/constants/publish_claim_states.js","var map = {\n\t\"./\": 53,\n\t\"./AboutPage\": 20,\n\t\"./AboutPage/\": 20,\n\t\"./AboutPage/index\": 20,\n\t\"./AboutPage/index.jsx\": 20,\n\t\"./ErrorPage\": 12,\n\t\"./ErrorPage/\": 12,\n\t\"./ErrorPage/index\": 12,\n\t\"./ErrorPage/index.jsx\": 12,\n\t\"./HomePage\": 54,\n\t\"./HomePage/\": 54,\n\t\"./HomePage/index\": 54,\n\t\"./HomePage/index.jsx\": 54,\n\t\"./LoginPage\": 23,\n\t\"./LoginPage/\": 23,\n\t\"./LoginPage/index\": 23,\n\t\"./LoginPage/index.js\": 23,\n\t\"./LoginPage/view\": 67,\n\t\"./LoginPage/view.jsx\": 67,\n\t\"./ShowPage\": 26,\n\t\"./ShowPage/\": 26,\n\t\"./ShowPage/index\": 26,\n\t\"./ShowPage/index.js\": 26,\n\t\"./ShowPage/view\": 70,\n\t\"./ShowPage/view.jsx\": 70,\n\t\"./index\": 53,\n\t\"./index.js\": 53\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 171;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./client/pages ^\\.\\/.*$\n// module id = 171\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/server/controllers/publishController.js b/server/controllers/publishController.js index 149293ca..1d133b37 100644 --- a/server/controllers/publishController.js +++ b/server/controllers/publishController.js @@ -1,5 +1,5 @@ const logger = require('winston'); -const db = require('../models/index'); +const db = require('../models'); const lbryApi = require('../helpers/lbryApi.js'); const publishHelpers = require('../helpers/publishHelpers.js'); const { publishing: { primaryClaimAddress, additionalClaimAddresses } } = require('../../config/siteConfig.js'); diff --git a/server/helpers/authHelpers.js b/server/helpers/authHelpers.js deleted file mode 100644 index 109c03c6..00000000 --- a/server/helpers/authHelpers.js +++ /dev/null @@ -1,12 +0,0 @@ -const logger = require('winston'); - -module.exports = { - serializeSpeechUser (user, done) { // returns user data to be serialized into session - logger.debug('serializing user'); - done(null, user); - }, - deserializeSpeechUser (user, done) { // deserializes session and populates additional info to req.user - logger.debug('deserializing user'); - done(null, user); - }, -}; diff --git a/server/helpers/configureLogger.js b/server/helpers/configureLogger.js deleted file mode 100644 index 8b8776fa..00000000 --- a/server/helpers/configureLogger.js +++ /dev/null @@ -1,24 +0,0 @@ -const { logLevel } = require('../../config/loggerConfig'); - -module.exports = (winston) => { - // configure - winston.configure({ - transports: [ - new (winston.transports.Console)({ - level : logLevel, - timestamp : false, - colorize : true, - prettyPrint : true, - handleExceptions : true, - humanReadableUnhandledException: true, - }), - ], - }); - // test all the log levels - winston.error('Level 0'); - winston.warn('Level 1'); - winston.info('Level 2'); - winston.verbose('Level 3'); - winston.debug('Level 4'); - winston.silly('Level 5'); -}; diff --git a/server/helpers/configureSlack.js b/server/helpers/configureSlack.js deleted file mode 100644 index c7353f41..00000000 --- a/server/helpers/configureSlack.js +++ /dev/null @@ -1,34 +0,0 @@ -const winstonSlackWebHook = require('winston-slack-webhook').SlackWebHook; -const slackConfig = require('../../config/slackConfig.js'); - -module.exports = (winston) => { - const {slackWebHook, slackErrorChannel, slackInfoChannel} = slackConfig; - if (slackWebHook) { - // add a transport for errors to slack - if (slackErrorChannel) { - winston.add(winstonSlackWebHook, { - name : 'slack-errors-transport', - level : 'warn', - webhookUrl: slackWebHook, - channel : slackErrorChannel, - username : 'spee.ch', - iconEmoji : ':face_with_head_bandage:', - }); - }; - if (slackInfoChannel) { - winston.add(winstonSlackWebHook, { - name : 'slack-info-transport', - level : 'info', - webhookUrl: slackWebHook, - channel : slackInfoChannel, - username : 'spee.ch', - iconEmoji : ':nerd_face:', - }); - }; - // send test message - winston.error('Slack "error" logging is online.'); - winston.info('Slack "info" logging is online.'); - } else { - winston.warn('Slack logging is not enabled because no slackWebHook config var provided.'); - } -}; diff --git a/server/models/index.js b/server/models/index.js index c3ea52fa..ad1e06bb 100644 --- a/server/models/index.js +++ b/server/models/index.js @@ -1,8 +1,9 @@ const Sequelize = require('sequelize'); const logger = require('winston'); -console.log('exporting sequelize models'); +logger.info('exporting sequelize models'); const { database, username, password } = require('../../config/mysqlConfig'); + const db = {}; // set sequelize options const sequelize = new Sequelize(database, username, password, { diff --git a/server/routes/api-routes.js b/server/routes/apiRoutes.js similarity index 84% rename from server/routes/api-routes.js rename to server/routes/apiRoutes.js index d2ec536c..e3bd359c 100644 --- a/server/routes/api-routes.js +++ b/server/routes/apiRoutes.js @@ -1,8 +1,6 @@ const logger = require('winston'); -const multipart = require('connect-multiparty'); -const { publishing: { uploadDirectory }, details: { host } } = require('../../config/siteConfig.js'); -const multipartMiddleware = multipart({uploadDir: uploadDirectory}); -const db = require('../models/index'); +const { details: { host } } = require('../../config/siteConfig.js'); +const db = require('../models'); const { claimNameIsAvailable, checkChannelAvailability, publish } = require('../controllers/publishController.js'); const { getClaimList, resolveUri, getClaim } = require('../helpers/lbryApi.js'); const { addGetResultsToFileData, createBasicPublishParams, createThumbnailPublishParams, parsePublishApiRequestBody, parsePublishApiRequestFiles, createFileData } = require('../helpers/publishHelpers.js'); @@ -14,9 +12,9 @@ const { getChannelData, getChannelClaims, getClaimId } = require('../controllers const NO_CHANNEL = 'NO_CHANNEL'; const NO_CLAIM = 'NO_CLAIM'; -module.exports = (app) => { +module.exports = { // route to check whether site has published to a channel - app.get('/api/channel/availability/:name', ({ ip, originalUrl, params: { name } }, res) => { + channelAvailabilityRoute ({ ip, originalUrl, params: { name } }, res) { const gaStartTime = Date.now(); checkChannelAvailability(name) .then(availableName => { @@ -26,9 +24,9 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); + }, // route to get a short channel id from long channel Id - app.get('/api/channel/short-id/:longId/:name', ({ ip, originalUrl, params }, res) => { + channelShortIdRoute ({ ip, originalUrl, params }, res) { db.Certificate.getShortChannelIdFromLongChannelId(params.longId, params.name) .then(shortId => { res.status(200).json(shortId); @@ -36,8 +34,8 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); - app.get('/api/channel/data/:channelName/:channelClaimId', ({ ip, originalUrl, body, params }, res) => { + }, + channelDataRoute ({ ip, originalUrl, body, params }, res) { const channelName = params.channelName; let channelClaimId = params.channelClaimId; if (channelClaimId === 'none') channelClaimId = null; @@ -51,8 +49,8 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); - app.get('/api/channel/claims/:channelName/:channelClaimId/:page', ({ ip, originalUrl, body, params }, res) => { + }, + channelClaimsRoute ({ ip, originalUrl, body, params }, res) { const channelName = params.channelName; let channelClaimId = params.channelClaimId; if (channelClaimId === 'none') channelClaimId = null; @@ -67,9 +65,9 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); + }, // route to run a claim_list request on the daemon - app.get('/api/claim/list/:name', ({ ip, originalUrl, params }, res) => { + claimListRoute ({ ip, originalUrl, params }, res) { getClaimList(params.name) .then(claimsList => { res.status(200).json(claimsList); @@ -77,9 +75,9 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); + }, // route to get an asset - app.get('/api/claim/get/:name/:claimId', ({ ip, originalUrl, params }, res) => { + claimGetRoute ({ ip, originalUrl, params }, res) { const name = params.name; const claimId = params.claimId; // resolve the claim @@ -103,9 +101,9 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); + }, // route to check whether this site published to a claim - app.get('/api/claim/availability/:name', ({ ip, originalUrl, params: { name } }, res) => { + claimAvailabilityRoute ({ ip, originalUrl, params: { name } }, res) { const gaStartTime = Date.now(); claimNameIsAvailable(name) .then(result => { @@ -115,9 +113,9 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); + }, // route to run a resolve request on the daemon - app.get('/api/claim/resolve/:name/:claimId', ({ headers, ip, originalUrl, params }, res) => { + claimResolveRoute ({ headers, ip, originalUrl, params }, res) { resolveUri(`${params.name}#${params.claimId}`) .then(resolvedUri => { res.status(200).json(resolvedUri); @@ -125,9 +123,9 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); + }, // route to run a publish request on the daemon - app.post('/api/claim/publish', multipartMiddleware, ({ body, files, headers, ip, originalUrl, user }, res) => { + claimPublishRoute ({ body, files, headers, ip, originalUrl, user }, res) { // define variables let channelName, channelId, channelPassword, description, fileName, filePath, fileType, gaStartTime, license, name, nsfw, thumbnail, thumbnailFileName, thumbnailFilePath, thumbnailFileType, title; // record the start time of the request @@ -178,9 +176,9 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); + }, // route to get a short claim id from long claim Id - app.get('/api/claim/short-id/:longId/:name', ({ ip, originalUrl, body, params }, res) => { + claimShortIdRoute ({ ip, originalUrl, body, params }, res) { db.Claim.getShortClaimIdFromLongClaimId(params.longId, params.name) .then(shortId => { res.status(200).json({success: true, data: shortId}); @@ -188,8 +186,8 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); - app.post('/api/claim/long-id', ({ ip, originalUrl, body, params }, res) => { + }, + claimLongIdRoute ({ ip, originalUrl, body, params }, res) { logger.debug('body:', body); const channelName = body.channelName; const channelClaimId = body.channelClaimId; @@ -208,8 +206,8 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); - app.get('/api/claim/data/:claimName/:claimId', ({ ip, originalUrl, body, params }, res) => { + }, + claimDataRoute ({ ip, originalUrl, body, params }, res) { const claimName = params.claimName; let claimId = params.claimId; if (claimId === 'none') claimId = null; @@ -223,9 +221,9 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); + }, // route to see if asset is available locally - app.get('/api/file/availability/:name/:claimId', ({ ip, originalUrl, params }, res) => { + fileAvailabilityRoute ({ ip, originalUrl, params }, res) { const name = params.name; const claimId = params.claimId; db.File.findOne({where: {name, claimId}}) @@ -238,5 +236,5 @@ module.exports = (app) => { .catch(error => { errorHandlers.handleErrorResponse(originalUrl, ip, error, res); }); - }); + }, }; diff --git a/server/server.js b/server/server.js deleted file mode 100644 index a2f19e86..00000000 --- a/server/server.js +++ /dev/null @@ -1,98 +0,0 @@ -// app dependencies -const express = require('express'); -const bodyParser = require('body-parser'); -const expressHandlebars = require('express-handlebars'); -const Handlebars = require('handlebars'); -const helmet = require('helmet'); -const passport = require('passport'); -const { serializeSpeechUser, deserializeSpeechUser } = require('./helpers/authHelpers.js'); -const cookieSession = require('cookie-session'); -const http = require('http'); -// logging dependencies -const logger = require('winston'); - -function Server () { - this.configureMysql = (mysqlConfig) => { - require('../config/mysqlConfig.js').configure(mysqlConfig); - }; - this.configureSite = (siteConfig) => { - require('../config/siteConfig.js').configure(siteConfig); - this.sessionKey = siteConfig.auth.sessionKey; - this.PORT = siteConfig.details.port; - }; - this.configureSlack = (slackConfig) => { - require('../config/slackConfig.js').configure(slackConfig); - }; - this.createApp = () => { - // create an Express application - const app = express(); - - // trust the proxy to get ip address for us - app.enable('trust proxy'); - - // add middleware - app.use(helmet()); // set HTTP headers to protect against well-known web vulnerabilties - app.use(express.static(`${__dirname}/public`)); // 'express.static' to serve static files from public directory - app.use(bodyParser.json()); // 'body parser' for parsing application/json - app.use(bodyParser.urlencoded({ extended: true })); // 'body parser' for parsing application/x-www-form-urlencoded - app.use((req, res, next) => { // custom logging middleware to log all incoming http requests - logger.verbose(`Request on ${req.originalUrl} from ${req.ip}`); - next(); - }); - - // configure passport - passport.serializeUser(serializeSpeechUser); - passport.deserializeUser(deserializeSpeechUser); - const localSignupStrategy = require('./passport/local-signup.js'); - const localLoginStrategy = require('./passport/local-login.js'); - passport.use('local-signup', localSignupStrategy); - passport.use('local-login', localLoginStrategy); - // initialize passport - app.use(cookieSession({ - name : 'session', - keys : [this.sessionKey], - maxAge: 24 * 60 * 60 * 1000, // i.e. 24 hours - })); - app.use(passport.initialize()); - app.use(passport.session()); - - // configure handlebars & register it with express app - const hbs = expressHandlebars.create({ - defaultLayout: 'embed', - handlebars : Handlebars, - }); - app.engine('handlebars', hbs.engine); - app.set('view engine', 'handlebars'); - - // set the routes on the app - require('./routes/auth-routes.js')(app); - require('./routes/api-routes.js')(app); - require('./routes/page-routes.js')(app); - require('./routes/asset-routes.js')(app); - require('./routes/fallback-routes.js')(app); - - this.app = app; - }; - this.initialize = () => { - require('./helpers/configureLogger.js')(logger); - require('./helpers/configureSlack.js')(logger); - this.createApp(); - this.server = http.Server(this.app); - }; - this.start = () => { - const db = require('./models/index'); - // sync sequelize - db.sequelize.sync() - // start the server - .then(() => { - this.server.listen(this.PORT, () => { - logger.info(`Server is listening on PORT ${this.PORT}`); - }); - }) - .catch((error) => { - logger.error(`Startup Error:`, error); - }); - }; -}; - -module.exports = Server; diff --git a/speech.js b/speech.js index e01d2dec..be547faa 100644 --- a/speech.js +++ b/speech.js @@ -1,13 +1,25 @@ -const Server = require('./server/server.js'); -const Components = require('./client/components'); -const Containers = require('./client/containers'); -const Pages = require('./client/pages'); +// const Server = require('./server/server.js'); +// const Components = require('./client/components'); +// const Containers = require('./client/containers'); +// const Pages = require('./client/pages'); +const apiRoutes = require('./server/routes/apiRoutes.js'); +const logger = require('./config/loggerConfig.js'); +const mysql = require('./config/mysqlConfig.js'); +const slack = require('./config/slackConfig.js'); +const database = require('./server/models'); const exports = { - Server, - Components, - Containers, - Pages, + // Server, + // Components, + // Containers, + // Pages, + apiRoutes, + config: { + logger, + mysql, + slack, + }, + database, }; module.exports = exports; diff --git a/webpack.client.common.js b/webpack.client.common.js deleted file mode 100644 index a8447be0..00000000 --- a/webpack.client.common.js +++ /dev/null @@ -1,32 +0,0 @@ -const Path = require('path'); -const REACT_ROOT = Path.resolve(__dirname, 'client/'); - -module.exports = { - target: 'web', - entry : ['babel-polyfill', 'whatwg-fetch', './client/client.js'], - output: { - path : Path.join(__dirname, 'public/bundle/'), - publicPath: 'public/bundle/', - filename : 'bundle.js', - }, - module: { - loaders: [ - { - test : /.jsx?$/, - loader : 'babel-loader', - exclude: /node_modules/, - query : { - presets: ['es2015', 'react', 'stage-2'], - }, - }, - ], - }, - resolve: { - modules: [ - REACT_ROOT, - 'node_modules', - __dirname, - ], - extensions: ['.js', '.jsx', '.scss'], - }, -}; diff --git a/webpack.config.js b/webpack.config.js index 7295cd13..eb82bd64 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,7 +1,5 @@ const packageBaseConfig = require('./webpack.package.common.js'); -const clientBaseConfig = require('./webpack.client.common.js'); module.exports = [ packageBaseConfig, - clientBaseConfig, ]; diff --git a/webpack.dev.js b/webpack.dev.js index 807a42ac..da8955ac 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -1,5 +1,4 @@ const packageBaseConfig = require('./webpack.package.common.js'); -const clientBaseConfig = require('./webpack.client.common.js'); const merge = require('webpack-merge'); const devBuildConfig = { @@ -9,5 +8,4 @@ const devBuildConfig = { module.exports = [ merge(packageBaseConfig, devBuildConfig), - merge(clientBaseConfig, devBuildConfig), ]; diff --git a/webpack.prod.js b/webpack.prod.js index aa824d5c..26754168 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -2,7 +2,6 @@ const webpack = require('webpack'); const merge = require('webpack-merge'); const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); const packageBaseConfig = require('./webpack.package.common.js'); -const clientBaseConfig = require('./webpack.client.common.js'); const productionBuildConfig = { devtool: 'source-map', @@ -18,5 +17,4 @@ const productionBuildConfig = { module.exports = [ merge(packageBaseConfig, productionBuildConfig), - merge(clientBaseConfig, productionBuildConfig), ];